From 319289ca670cfb9e03978e2440be48d9add694d7 Mon Sep 17 00:00:00 2001 From: Alula <6276139+alula@users.noreply.github.com> Date: Wed, 24 Feb 2021 09:28:47 +0100 Subject: [PATCH] new android port --- Cargo.toml | 44 +- app/.gitignore | 233 ++ app/app/.gitignore | 1 + app/app/build.gradle | 99 + app/app/proguard-rules.pro | 21 + app/app/src/main/AndroidManifest.xml | 39 + app/app/src/main/cpp/CMakeLists.txt | 53 + app/app/src/main/cpp/dummy.cpp | 2 + app/app/src/main/ic_launcher-playstore.png | Bin 0 -> 49191 bytes .../DoukutsuDocumentsProvider.java | 279 +++ .../io/github/doukutsu_rs/MainActivity.java | 76 + .../drawable-v24/ic_launcher_foreground.xml | 30 + .../res/drawable/ic_launcher_background.xml | 170 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5266 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 3602 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5266 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3321 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2079 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3321 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 7023 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 5138 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7023 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 11058 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 11005 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11058 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 15977 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 19264 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15977 bytes app/app/src/main/res/values-v27/themes.xml | 8 + app/app/src/main/res/values/colors.xml | 10 + .../res/values/ic_launcher_background.xml | 4 + app/app/src/main/res/values/strings.xml | 4 + app/app/src/main/res/values/themes.xml | 6 + app/build.gradle | 28 + app/gradle.properties | 17 + app/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes app/gradle/wrapper/gradle-wrapper.properties | 6 + app/gradlew | 172 ++ app/gradlew.bat | 84 + app/settings.gradle | 2 + build.rs | 28 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 ++ gradlew.bat | 84 + src/builtin/shaders/basic-110.frag.glsl | 8 + src/builtin/shaders/basic_150.vert.glsl | 27 - src/builtin/shaders/basic_es100.frag.glsl | 13 - src/builtin/shaders/basic_es100.vert.glsl | 26 - src/builtin/shaders/basic_es300.vert.glsl | 27 - src/builtin_fs.rs | 8 +- src/components/hud.rs | 91 +- src/framework/backend.rs | 24 +- src/framework/backend_null.rs | 7 +- src/framework/backend_opengl.rs | 1121 ++++++++++ src/framework/backend_sdl2.rs | 6 - src/framework/backend_sokol.rs | 358 +++ src/framework/context.rs | 4 +- src/framework/gl.rs | 1965 +++++++++++++++++ src/framework/graphics.rs | 14 +- src/framework/keyboard.rs | 1 + src/framework/mod.rs | 10 +- src/input/touch_controls.rs | 98 +- src/input/touch_player_controller.rs | 166 +- src/lib.rs | 190 +- src/scene/loading_scene.rs | 3 + src/scene/title_scene.rs | 8 +- src/scripting/doukutsu.d.ts | 58 +- src/scripting/doukutsu.rs | 18 +- src/shared_game_state.rs | 4 + src/sound/mod.rs | 20 + src/text_script.rs | 2 +- 74 files changed, 5527 insertions(+), 438 deletions(-) create mode 100644 app/.gitignore create mode 100644 app/app/.gitignore create mode 100644 app/app/build.gradle create mode 100644 app/app/proguard-rules.pro create mode 100644 app/app/src/main/AndroidManifest.xml create mode 100644 app/app/src/main/cpp/CMakeLists.txt create mode 100644 app/app/src/main/cpp/dummy.cpp create mode 100644 app/app/src/main/ic_launcher-playstore.png create mode 100644 app/app/src/main/java/io/github/doukutsu_rs/DoukutsuDocumentsProvider.java create mode 100644 app/app/src/main/java/io/github/doukutsu_rs/MainActivity.java create mode 100644 app/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 app/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 app/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 app/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 app/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 app/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/app/src/main/res/values-v27/themes.xml create mode 100644 app/app/src/main/res/values/colors.xml create mode 100644 app/app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/app/src/main/res/values/strings.xml create mode 100644 app/app/src/main/res/values/themes.xml create mode 100644 app/build.gradle create mode 100644 app/gradle.properties create mode 100644 app/gradle/wrapper/gradle-wrapper.jar create mode 100644 app/gradle/wrapper/gradle-wrapper.properties create mode 100755 app/gradlew create mode 100644 app/gradlew.bat create mode 100644 app/settings.gradle create mode 100644 build.rs create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 src/builtin/shaders/basic-110.frag.glsl delete mode 100644 src/builtin/shaders/basic_150.vert.glsl delete mode 100644 src/builtin/shaders/basic_es100.frag.glsl delete mode 100644 src/builtin/shaders/basic_es100.vert.glsl delete mode 100644 src/builtin/shaders/basic_es300.vert.glsl create mode 100644 src/framework/backend_opengl.rs create mode 100644 src/framework/backend_sokol.rs create mode 100644 src/framework/gl.rs diff --git a/Cargo.toml b/Cargo.toml index d040482..a21b83f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,27 +4,8 @@ edition = "2018" name = "doukutsu-rs" version = "0.1.0" -#[lib] -#crate-type = ["lib", "cdylib"] - -[package.metadata.android] -android_version = 29 -target_sdk_version = 28 -min_sdk_version = 26 -build_targets = ["aarch64-linux-android"] -package_name = "io.github.doukutsu_rs.android" -apk_label = "doukutsu-rs" -opengles_version = [3, 1] -fullscreen = true -orientation = "sensorLandscape" -permission = [ - { name = "android.permission.READ_EXTERNAL_STORAGE" }, - { name = "android.permission.WRITE_EXTERNAL_STORAGE" } -] -application_metadatas = [ - { name = "android:hardwareAccelerated", value = "true" }, - { name = "android:requestLegacyExternalStorage", value = "true" } -] +[lib] +crate-type = ["lib", "cdylib"] [profile.release] lto = 'thin' @@ -43,20 +24,22 @@ opt-level = 1 default = ["scripting", "backend-sdl", "ogg-playback"] ogg-playback = ["lewton"] backend-sdl = ["sdl2"] -backend-gfx = ["winit", "imgui-gfx-renderer", "imgui-winit-support"] +#backend-sokol = ["sokol"] +backend-glutin = ["winit", "glutin"] scripting = ["lua-ffi"] editor = [] [dependencies] +#cpal = { path = "./3rdparty/cpal" } +#glutin = { path = "./3rdparty/glutin/glutin", optional = true } bitvec = "0.20" byteorder = "1.4" case_insensitive_hashmap = "1.0.0" chrono = "0.4" -cpal = "0.13" +cpal = { git = "https://github.com/doukutsu-rs/cpal.git", rev = "e027550be0b93b7e2912c7de28a4944a7d04e070" } directories = "3" +glutin = { git = "https://github.com/doukutsu-rs/glutin.git", rev = "a34ee3c99b3c999b638ca2bae53cf96df2b94c04", optional = true } imgui = "0.7.0" -imgui-gfx-renderer = { version = "0.7.0", optional = true } -imgui-winit-support = { version = "0.7.0", default-features = false, features = ["winit-24"], optional = true } image = { version = "0.23", default-features = false, features = ["png", "bmp"] } itertools = "0.10" lazy_static = "1.4.0" @@ -69,6 +52,7 @@ num-traits = "0.2.12" paste = "1.0.0" pretty_env_logger = "0.4.0" sdl2 = { version = "0.34", optional = true, features = ["unsafe_textures", "bundled", "static-link"] } +#sokol = { git = "https://github.com/doukutsu-rs/sokol-rs.git", rev = "", optional = true } serde = { version = "1", features = ["derive"] } serde_derive = "1" serde_yaml = "0.8" @@ -77,12 +61,16 @@ strum_macros = "0.20" # remove and replace when drain_filter is in stable vec_mut_scan = "0.4" webbrowser = "0.5.5" -winit = { version = "0.24", features = ["serde"], optional = true } +winit = { version = "0.24", optional = true } + +#[build-dependencies] +#gl_generator = { version = "0.14.0", optional = true } [target.'cfg(target_os = "windows")'.dependencies] winapi = { version = "0.3", features = ["winuser"] } [target.'cfg(target_os = "android")'.dependencies] -ndk = "0.3" -ndk-glue = "0.3" +ndk = "0.2" +ndk-glue = "0.2" +ndk-sys = "0.2" jni = "0.19" diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..bd3a20d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,233 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/androidstudio,gradle,android +# Edit at https://www.toptal.com/developers/gitignore?templates=androidstudio,gradle,android + +### Android ### +# Built application files +*.apk +*.aar +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + +### Android Patch ### +gen-external-apklibs +output.json + +# Replacement of .externalNativeBuild directories introduced +# with Android Studio 3.5. + +### Gradle ### +.gradle + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +# gradle/wrapper/gradle-wrapper.properties + +### Gradle Patch ### +**/build/ + +### AndroidStudio ### +# Covers files to be ignored for android development using Android Studio. + +# Built application files + +# Files for the ART/Dalvik VM + +# Java class files + +# Generated files + +# Gradle files + +# Signing files +.signing/ + +# Local configuration file (sdk path, etc) + +# Proguard folder generated by Eclipse + +# Log Files + +# Android Studio +/*/build/ +/*/local.properties +/*/out +/*/*/build +/*/*/production +*.ipr +*~ +*.swp + +# Keystore files +*.jks +*.keystore + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Android Patch + +# External native build folder generated in Android Studio 2.2 and later + +# NDK +obj/ +*.so + +# IntelliJ IDEA +*.iws +/out/ + +# User-specific configurations +.idea/caches/ +.idea/libraries/ +.idea/shelf/ +.idea/.name +.idea/compiler.xml +.idea/copyright/profiles_settings.xml +.idea/encodings.xml +.idea/misc.xml +.idea/scopes/scope_settings.xml +.idea/vcs.xml +.idea/jsLibraryMappings.xml +.idea/datasources.xml +.idea/dataSources.ids +.idea/sqlDataSources.xml +.idea/dynamic.xml +.idea/uiDesigner.xml +.idea/jarRepositories.xml + +# OS-specific files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Legacy Eclipse project files +.classpath +.project +.cproject +.settings/ + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.war +*.ear + +# virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml) +hs_err_pid* + +## Plugin-specific files: + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Mongo Explorer plugin +.idea/mongoSettings.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### AndroidStudio Patch ### + +!/gradle/wrapper/gradle-wrapper.jar + +# End of https://www.toptal.com/developers/gitignore/api/androidstudio,gradle,android diff --git a/app/app/.gitignore b/app/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/app/build.gradle b/app/app/build.gradle new file mode 100644 index 0000000..cd13dd5 --- /dev/null +++ b/app/app/build.gradle @@ -0,0 +1,99 @@ +plugins { + id 'com.android.application' + id 'com.github.willir.rust.cargo-ndk-android' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + //ndkVersion "21.3.6528147" + + defaultConfig { + applicationId "io.github.doukutsu_rs" + minSdkVersion 24 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + ndk { + abiFilters 'x86', 'arm64-v8a' + } + + externalNativeBuild { + cmake { + arguments "-DANDROID_STL=c++_shared" + } + } + + def documentsAuthorityValue = applicationId + ".documents" + + manifestPlaceholders = + [documentsAuthority: documentsAuthorityValue] + + buildConfigField "String", + "DOCUMENTS_AUTHORITY", + "\"${documentsAuthorityValue}\"" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + buildFeatures { + viewBinding true + } + + externalNativeBuild { + cmake { + path "src/main/cpp/CMakeLists.txt" + } + } +} + +dependencies { + implementation 'com.android.support:support-annotations:28.0.0' +} + +println("cargo target: ${project.buildDir.getAbsolutePath()}/rust-target") + +cargoNdk { + targets = [ + "x86", + "arm64" + ] + librariesNames = ["libdoukutsu_rs.so"] + //targetDirectory = "${project.buildDir.getAbsolutePath()}/rust-target" + module = "../" + extraCargoEnv = ["ANDROID_NDK_HOME": android.ndkDirectory] + extraCargoBuildArguments = ["--no-default-features", "--features", "backend-glutin ogg-playback scripting"] + verbose = true + + buildTypes { + release { + buildType = "release" + } + debug { + buildType = "debug" + } + } +} + +tasks.whenTaskAdded { task -> + if (task.name == 'javaPreCompileDebug') { + task.dependsOn 'buildCargoNdkDebug' + } + + if (task.name == 'javaPreCompileRelease') { + task.dependsOn 'buildCargoNdkRelease' + } +} diff --git a/app/app/proguard-rules.pro b/app/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# 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 + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/app/src/main/AndroidManifest.xml b/app/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..0621a0c --- /dev/null +++ b/app/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/app/src/main/cpp/CMakeLists.txt b/app/app/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..3ac7e5b --- /dev/null +++ b/app/app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,53 @@ +# Sets the minimum version of CMake required to build your native library. +# This ensures that a certain set of CMake features is available to +# your build. + +cmake_minimum_required(VERSION 3.10) + +# Copy shared STL files to Android Studio output directory so they can be +# packaged in the APK. +# Usage: +# +# find_package(ndk-stl REQUIRED) +# +# or +# +# find_package(ndk-stl REQUIRED PATHS ".") + +if(NOT ${ANDROID_STL} MATCHES "_shared") + return() +endif() + +function(configure_shared_stl lib_path so_base) + message("Configuring STL ${so_base} for ${ANDROID_ABI}") + configure_file( + "${ANDROID_NDK}/sources/cxx-stl/${lib_path}/libs/${ANDROID_ABI}/lib${so_base}.so" + "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${so_base}.so" + COPYONLY) +endfunction() + +if("${ANDROID_STL}" STREQUAL "libstdc++") + # The default minimal system C++ runtime library. +elseif("${ANDROID_STL}" STREQUAL "gabi++_shared") + # The GAbi++ runtime (shared). + message(FATAL_ERROR "gabi++_shared was not configured by ndk-stl package") +elseif("${ANDROID_STL}" STREQUAL "stlport_shared") + # The STLport runtime (shared). + configure_shared_stl("stlport" "stlport_shared") +elseif("${ANDROID_STL}" STREQUAL "gnustl_shared") + # The GNU STL (shared). + configure_shared_stl("gnu-libstdc++/4.9" "gnustl_shared") +elseif("${ANDROID_STL}" STREQUAL "c++_shared") + # The LLVM libc++ runtime (static). + configure_shared_stl("llvm-libc++" "c++_shared") +else() + message(FATAL_ERROR "STL configuration ANDROID_STL=${ANDROID_STL} is not supported") +endif() + +# Specifies a library name, specifies whether the library is STATIC or +# SHARED, and provides relative paths to the source code. You can +# define multiple libraries by adding multiple add_library() commands, +# and CMake builds them for you. When you build your app, Gradle +# automatically packages shared libraries with your APK. + +#add_library(dummy SHARED dummy.cpp) diff --git a/app/app/src/main/cpp/dummy.cpp b/app/app/src/main/cpp/dummy.cpp new file mode 100644 index 0000000..b1e9dbb --- /dev/null +++ b/app/app/src/main/cpp/dummy.cpp @@ -0,0 +1,2 @@ +void drs_dummy_export() { +} diff --git a/app/app/src/main/ic_launcher-playstore.png b/app/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..c320b1c40906260747734227e2485e7b869c1391 GIT binary patch literal 49191 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 Build.VERSION_CODES.P) { + WindowInsets insets = getWindow().getDecorView().getRootWindowInsets(); + + if (insets != null) { + android.view.DisplayCutout cutout = insets.getDisplayCutout(); + + if (cutout != null) { + this.displayInsets[0] = cutout.getSafeInsetLeft(); + this.displayInsets[1] = cutout.getSafeInsetTop(); + this.displayInsets[2] = cutout.getSafeInsetRight(); + this.displayInsets[3] = cutout.getSafeInsetBottom(); + } + } + } + } +} diff --git a/app/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/app/src/main/res/drawable/ic_launcher_background.xml b/app/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..19daeedc6d19b1039dce36719f54bf691e68c716 GIT binary patch literal 5266 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 Y0i}n0I-u07zyJUM07*qoM6N<$f*Jh?`2YX_ literal 0 HcmV?d00001 diff --git a/app/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ce12427894fae86aea4b746aeac5a925f5a61f GIT binary patch literal 3602 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 C)7`rO literal 0 HcmV?d00001 diff --git a/app/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..19daeedc6d19b1039dce36719f54bf691e68c716 GIT binary patch literal 5266 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 Y0i}n0I-u07zyJUM07*qoM6N<$f*Jh?`2YX_ literal 0 HcmV?d00001 diff --git a/app/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c4f5d9c8cbd4ccffe50919f635786afdf885900a GIT binary patch literal 3321 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 N002ovPDHLkV1oZ$Vv_&> literal 0 HcmV?d00001 diff --git a/app/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4cea2adbada551be7b3602f9560ff802ef2cba61 GIT binary patch literal 5138 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 N002ovPDHLkV1oZ$Vv_&> literal 0 HcmV?d00001 diff --git a/app/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..65c0161011706598fdfa5aa8975036064214ddc4 GIT binary patch literal 11058 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 literal 0 HcmV?d00001 diff --git a/app/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d46ef1e3935886ccc4b6900c54558894465612 GIT binary patch literal 11005 zcmdtI_g7O})HaG93nEHDDG`wqK#(FxXaWMq03t|{-a!*O1P%hBgn&mWp^JcY(4Z8l zp@beR0S;Y?v`}6_Isq{u5n{r(Iq&$!9rq8ozub(Gu}3o2-fOMB=6vRy&odJqni^c- zy28c5!EwRxzMcgK#|gdTFXtKHAJeo zJv^!Xmz1T8i(t64-tCvrzgHlZ6~?RPTIdkQCVMg()7j2YM=xTob-8}E_1)iWn%W@e zv-hf9+8Hj*7l9T1|NQev%Hq!MkD(*V_s=|F{TphowqKV~RcIukcE`7;VZX08>MJA~ z^>g+4utqo);<@rpkdSr(Q%EpW*H9c8S31p6Sr9Z?*f8)dKB_4!9 z0R8WD?Vaxp-K)<>WLyN6UNq!KSocucsu;Zym&TftBV4DZOOzUtiex$L_6r)4vPQqf zzq2s<9x~k&Qtay-zClQ=3Gj35!2l286PFcly3y8RcIfsqNMgNHp011K@O^27wSn8* zcgdgkWP0V(zXmp%Fk+!@*j(CXJ+JFc4RQ^#ZG=8bcqpd#ROP<9yLOd;1;P;`iAxIU6IiC%oi1Y`^VL*gr|h1uYw6YQG`U+OEh#ZO*$#}^?P+uD z5Up9j#dgv*L7vNOz$(&Y9xMzwS#{S6D^pfuu{B$|@Jhc$cwVs&c_dD} zKstYJ^Ze8ld95j&JUeBYYwe?2Qd!@nOm4vVE!NA|P92ZDA|d}i?B&lG)tZ2@fWMBm zRZLy;A*%4ClT}J>Hi@kI287+?&1p{FNBriO8Cpj(Qlgp!g`&d^gyV47qFPeTFRe19 zgQDB^qBf;%>5npJo1Tp_=YKFT6Fibh2egdJ+~-lul_wu-Jkp819Z8yS9Fn*DE^Cx=?Kg8#jLvEfU&UEY*(H5IH_&XAYb@|I=&;D(i|f#bw>j!6�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 NP~TLq2KMOL{{dtMcduQOUTBSv;C|#;{?NuW- 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 literal 0 HcmV?d00001 diff --git a/app/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..deaddf6d791001bb63add1aba4021b13a9f79fe5 GIT binary patch literal 15977 zcmZvDWmFsQ6YeGicZcE*#oZwkFJ3`PaBYiI+=3K$DJ}(C=nuEzR@{pem*7rtm&^a2 z`|+NWP4>g?Waiyx=bf2nCPG_N85ipX761UaswxU^o_{<3cVM7Bf4^C@Lk9pEK2-&| zcb>+FM(Ca-J$Fh^FI$-jI^aYMvagVlD(H%Z9Iq6-2?^qte}rf=(|~?Wyvo4PuVlh{ ziSat&r6NcN^5fT(Y2eLRv!tt}WV4S4L#idx0PiJ*_fQ}W2Xa~Hf|pVa$Te%n9)C`@~~XFObl8HW?nlx z;qVZ&i`{c9Bz{-+2;QLo{O%=YxN4)0yXNW0UvZ8Az1*bRF{YDWyBb7qCNsxW8|Sb( zL@rk)f8cOOtsv@)<;(RnPrYswSG8zW&5=9-eQ#kz9M_-rMovlM##B|2(rkyw@Q~Ve zJ?6sYdp?;9A?|h&)mWo(T-#anjibM&s#|A>tpbDPr`z_|<%yRfC{ zc@Qt0xEokunVx0VGe|9&oMh8)O(^Dh;n1^xwN$w5>DCjpmxiyiGFdI(^oJU!C1|r+ zYX(RCc}*bdY~P>+E1`g8)y4D(k&#cOR8)e>W4)?^Qq>A*&{3E^CM!#oWIZ2J04 zSucaN0`YsndlN|Ld8p$z45tMfRYz1FGz(}er9E>m*5f!6uUd79pzK$Y@1pKbujWVm zCPucHgqL@gJ+T_xf6#ofmtXj#IX}WM{#jLLIo5xse=7prJho@ zLl;qTsi-KgYHZYDd<^hkTOo8PDNh(>v{RruySy|ErdDS>u~=@PEgkm%xqNTfV1Qw_ znYq`O4XwjyF?v!mEEpL%`YLPXEO2={<2{jinxx_z5SPn>C?|B>&i#9NFLPZcC&E0A zEEFxEK3rWPalpu}O?1qn%YkIV)(>NS;67&VarXnksNc$SIk^V0_CmyUA!b)&2?Rqk9=$wTmAtR zj`HD*D$R|&-kU%AhL66>TG8)Box!@)c2Uhf(R1-XPmBy2DsJ~TA^Y_k& zN~UBT#>I-_ZduXj2wB}%E%lF<37#m5EGBpwf4>Rj@jrBBE~DY3R%>#Kob2UrL}`Xb zT+QZ&Fl##Wuo+jVQ5`XRcoE${wuuIpbvCJ*6Y)L?*+1?oJHDe*Q5kz#s2QX66HU>uiNI^-F7O z?tSC4+2bXTDsi5N3T#gFGpM~;_xvRlB3cBj4fh*kET)X%AG~(w3mcUQh&N~nolg78 z?@RFPLslL(#(roUD>wxY8@oR)ZlpcL1rf{efo)^{TR9p#fxrC^e}j0x%CvP@psH)J@>? z9Fol>r?ok;pD;i@g_jN}isfi4P0k{g^Ari7sl&_{hG z|ILSM7x@h#I|d*Ol|aQ&?n|G?E3YtN0+ot?{9lJFzXNOkDAx^jN*?LoZa?wi!x9?S zTL<_T(|yZ$nc5kFB&B|53W#=}${V$Yx6_K0*{FQZK3~e?f)8F9tV$YcZIETiPB3$usK{hQiw1|zk4{kSRuW#EaZcao*EKp_vG?1krHMnwT&PtA=8}W+d zHyJdN2>(9J)3i6SCbdri=>R$MEW_}mCl-I|V|?B!E@%HC$rCt04LeIqfwrJhAK#jX zJsCeoN3P(-QLuJ=#-roG9;fAe5b>P}MV$yAekS*~9V;YcCFaJ_qleXKd+c~V;~u^M zJ_hD!2=*onfM4X~5lH&l#eHlAQC^EN`dQ#*&>SaEVg#nLZlF9kw}q)n)}(<`;$+X& z{q!!iwEeY+U7KaZ1>J+@&$yK}h>5Hg%7!)5m>7q*7~(eS?XNb*NXR4O6E%r1_#+rSD+u3uAj z;ZMJx^xTK8G+QGJ&h@m9@Stgs^a`BX5Ew1nJV?F=UhGztZRLt{!KWwpjp!2>#41pK~XIO5GttDb+^f zb!t2=QS0p_Uv?Yi>V3=RQXHA#mu!@wUId44Bw<=#(mX92P};bCY$q@Kdfz&ZD!|!g zlvgV%L?{O7;DQJ4_#%;uKc^lPikyJ5awo$)i zNG(L(uOgA)D_~}|Go(Lb#pTFl;V#vf#SYN{7;h9o;oUPZ`j`X8lb&U|J3BTwiJLzn z#cI31p}|kBga7eA(go(D+hJp`M*pBoeT&$*+kOIWxcck;MHOQ`t9ZkN*=s}bdKp>( z`AS4=>M94mmd z&4|v9U#!Lln~HBkl2zH0=Aw&Tc)pFx?5pymy6U2j5u&h5%X$Rr^B4knF^gp81Vf!* zg;{L?$fXLGtW0px*mbfeBoJJAIx6mNmzd)}CS_=X3Sf$#bU%y^S{35(Zjb)HHz?n) z(U64HDx`FI(W)MLXQ4~9e5cp~oB!T^ORGB%`fgN%iB-f%{-_?R^;9h? zmbxz3Z8xxIv|2E|6{pr%wKUo)o97YuPE?UO`_f=PB1U1_+qp5zz{t8!utd#7iIa_% zZXr|TBN>!gRwmN`(Da|oF{uViRQ2Ccc(-0xJ1ia+1z0Jl zRDn;2UJ&&I|f@e`2;kfe+BTn|#gtoUyfQ;`up+Skv771{LiKmC`{VZ*=Y%*+;_ zavC;1(|M{P@t<`O$V$-T*)FA}932$D8!e4CAQ&d^86Y;p14lK^7VHmVF2D#Rz872B zF#=y*YxH3B76tD9nvLO5F`q5e2BfUTNqQ*eLENwPnsuaVl4HD{@l(>UzUN77mHCK) zi|2}tizkwwbXHd;%5-IS&@?k8B>*`~#xTW}>ft7}DeB^Nc-ACrIFQ(r$u7g9M&|e5 zg1^tGhc6u+7kwwuZCFM|ew;Q9)BaUDXFZt)hO{z<(BO_hVVrJtx7p1tx!Y3zzp>^QsE>3gy1`0ck z$t4997TUxCx<)KxVUB__Z+5~^G(Hu@hkYJ#ieFyc6Z3Wr{A-uHgSR_~(Y|g4_d3f= zpsGJjTN{+U8Tb$1o$~)m@45?N?WPf%wCV_oL~L~gs?|6sgkvI}@^y_n+C^S=I!a-y zRKJJ>a)$DNMKAZ6Y=NUc*-eWa>pX=`FF3(z^tQyD!@M!lNga2xsjNwOS9 zUX3|1yv5;a(==Q^@KrC1(VbXxut`0Ho`|tV!FBuUDA}3(XlgS*`V;6KsNW&lA{U3) zIW6d)l^{qgXq8__vR>O^3thR!(hGuoC>oVCPR+;}nj^axxHh7n(dL3`jG(#@n0#?e zQ?sbWV;sM*>aKPt2E@XDOeC2|`_>^VYkwkazct8lbu_Sf_s|g=Aam_E(COhk{va{b zdLVWgwmt9k2AfQdS(20O1E|g3f?NgEAm(@SQQ*towhp4WFL<@TU!~{a<6nBI0N80A zcO;PLXsLEQv|108fByiy2LvK$TAQZ|hIkU~2rcD?>k5EM8QV=30qe{9m5|VBUU0d< zs5h(gmCf3s1^#x(9ZGk3n^I`BjCzyXf>}fn?F#h8v~h1GY*zQg_Tp=yyFS;iw;Z8c z{6a+w*LG-00v9DC3`-K_Ob^ZNTE=Y;|*uf*}Vbq#{x8%EY4I{SxbbVJ5F)>7N)a0W;UBA5KTj0+W_UJsBTVi4 z1_i2%^IiYVr;Q6cYBV?a2&Q_**~7nb`J@l<5?Z(5*^L=#p;?NNMY`yF%b^`DCAh)s zY+lX_)AwDW33qD08!bYDSCTZ(0?l1ntGes7_jYyIqtlaA)ER z-;X9ish(YA*xy)Q4NBGJ#j7BWXh++W zYU9v1vF4YoVS+lq{ofR&jHj_piwm~5?SK6)N}_-_%8S2zjzh#q922OdZjyQsTn(AO zNb`MHsTAANx`%Q%yN_*@5S0MhWEs{UK^_A9p!7_}26Ar@0&S{+v`B1H-6m_S=HSar%#8)X* zvfdxI4iRD>)_d8tzsAQFz8_*JwBKL-iQy<4SxQT#CKH*4>hU>z0(`oh1%p^e&=T-g*GZ)w79poXE@%f-bmVf0Z8>G;R48{X-iBQ1&6ng| zegjITV#(?`J_ovEtEywc&8w>k9@OZIJrJjr(wP9N&mK>7JF|YI9B-R~S%TEW*_6wO zxCh3Yqdu&enqqjdc{dh_lKEJBK>pUA0H=pD3j-%i=rm#s8*IP*6#cyl`ETl+KB8-4 zcWmP_*(A)QwrYLjzJm@Z4reuHyes`X=d>7YYUhhz{b?VFe8idE+R-8l$a=li;=Bwd zSMl8wepZl&-GN|}T{jFb>-dNh!L#nvyADKu7x_Gm!=wF-pj6%2r6=^9-QRzlq{Dz{nI=y1Vyj8HjoI%H2mHzp3(U#BPns@myE?~ z#r{#XRmqyx<&iqT<=s|~j8DPuW-+Sw18^);0Za0JGmrp1a6$U=R*%J40`VHS`32-d zCa@WOy9CLggm86VCI4na0FM6WIc~_cUoumm5QEhpbws28S$v|C{=990`D<72PzuzW zZ~ej>Z$lr2?ZgdF`)xq^hX@zwt>rFvF;9tnFpvcA#Z^Kb5Hb=yA)@{ zLmBM3_sh)dV@|Hp6y_&nZtMON5|T~|JxtV!&y7kg@QmN|rpEuJB$IRc((A5Hc!Qf* zAudySZ|Z<2FYM^dHM=)~4xdiw@}4^EGX9J^mw9{eU1j$-!bzOI&F!=KF(N*`-8HklztE5n-k149~b*mOlvdGEa_mwnS(Z=Sg0>7w(KgIS@^Y-Ljwxftb;1E3%AzGTUsPKt^d`S5LeKpr zSfwdP5@IUnZ`w))j>r70Xz9@=$muFm1I}|8&NMgWjOfsV5F}lbQ_A@5cfR`iIt7v{ zC`2*{iNA`#n+&o@DyJRQ03$vlHxtM@Xh3O%AC5Lh2E`V5|1<(YFl=Zoz#3T2ivcWS z(Z*6rf9^Yx!2KiNxfzXt;1O}isDGR5^%SMi^s@!bUylJ#GDa6!M&1Jec8uyaD>Tx?gZpHnBkO-Y5rBcUIKSPqM@B(Lmu4awE#K#n;r{Yf-tpwWra* z7h)Km+<5_b$M!k~qk;(fr<2OQSy38~$3_JxbqWL#%XmiXCLeKw!_xvHqqEu;h_Zdy zs2qyJ=Y^Y+)|KP**TO1(CoZMDh<7}Nq~|e?LUbpqVys9>SS*_AqV>hc zm0;#!O7|IQ#?`NO*alwTy2;4cfQaxOCNFPnbpQuxawk#OK&(ruGxvh)sdK7ERUnI< zF;Hxg6t1K%E*d#_;OQc+gHb7P>TCrPlgu#(sfUl%`>|kHgH;@_7KcR;0M1F{C-j2h7Jt=kgxV!0ApxrElUAuuPO_lYA~Cl<24CByZ(zuJ5+Lb+zH| zaQAj-7bNd*@s|Sx(&&AA!0?*&^~;BU|E(*ua7$Q#ZKq4)*1&EDqV3kO(~FfBE7}fH z0Ukg)0s8F6S##Kd!+OSu7{Rvk--_XP*^SVApma}IANa`A!3ODI{nOif(D=9bB3=n0 z@VEe8oPN6`B@X#3;rm+ux#%eC6$Sj{meS}Ql`)Ord06IK)D{HwOAGWhcKHk}$F}y1 z))}UmBe9wK2k2rytfdmm#z(bBbWeTL2=60Q<;31aL=`+czU$bWg`2KB{p>%%B7czN zjuc93)0fo>NqxEewNav2fEt5R`{_u9+Y7f6?Ehi>`*$rf#!}P6zNVBY&6fMtdW^ic zNK2wOJd5x!{YO)S?bb{&EM|Fz4M(P=#)_C$iy+2Po1cvP`N&a2l9o7CC=CXcIf3Vm^euop4zpLS|bJdK%iEK9JaR$0vwwwN|ucb%8N>hl%u( zUjb5RmH)}hgw|A_`nQG;4{Z>E7IP$?#CAnIQH|rN^y?iwb(}Js7p&euwCfDShLt)h z!?~BzQ9D3(+~6^cjto<4f_CCy)A5H@{COsfEuMH-94z&>)+1L`hnsXhyRQ*&a?qpC z+wOhsUS#YV7Sv^iE7<|IR0o7V)&61Et|~_{c6^cRtMTAyn%M`+A&2Lf(tpD`6HvyZ znZV$c(d$^G=SKUh$6LXT(qzfUHhN+hB)iL zheBR?q;f9+#OR9q!bozmn%h%VM+(eH%@%cI1NU*F2PJ!*Yzx5&f=ZZzLlP;W&-(tVw{pY&Qvkt}J;Qdo80tZZB z_vr6mZS_zFyoP|w>NCT4*iK8AynQaAqKE^z;@Uw|5IZd z?M*%7c#M@LVb+^b?ny8O@&TOIcC9yIb3T9ZoF7y!B$-NmKW^O|n(2vCi;bHT)TF?y zcB4PQp(O-r07h}Ee8bKq?k6g7EA+T0%f(K2lb#mwe79H1uakaii|jLwa5`}NqSJN+6~tvHv{MMl4k>Ll+) zU=17gc&gna8K+vr#Vx}ZT|N{Ca!5dxJK~kjLyyAG>|yS4D0G%miUEjMXRc`BCemXq zaWzYu+0>*o<|#7D%OU}CLA{I(W(g))<(J2kae>X0*^qTrN-S=}-&{&Tkvhrg7q^bN zo<8&k9H9R0FQ|=0?pKnH(JkCeMX1N7c-YXJ;1;X)B+&Xw&x<@4goBe4pAvkL7QFc^ z<46C{qwT??Y6WfN<)v81Tkzkcx5x}Jrs5I--MehLdksx&dNyw0>WRr%QmzT#;6Xxc zs3B^67za1-v@jYXt>3BxjHtEpU6wgK_d-0)i{tG`AE3NxABU*b`diCT(w>yD+{P_i zHvD3IDRYjKE^RGfKq_pgC^SSlLB`EOC3}(yIR|2&EA?`<< z%OR#F#T5#4682}il^?W(AvVY_kZ?8@f>8YT4Nj|TU+x0KQHz#!A*OG!4+u1{8+Iz#Bo(U%D_hF#5YkSkYJZbo@jsJ<(*DEnurr4b+f^QN!d3M7JyMiF!ZS zB$sS<7;HV+hyh!wm?0desCuP_L0g?n*8cpOMkF?4U!CVT08*4M)AVNMg)E&KuHU1t z4Vc@xAUr_&Y&C|$XZkH3R75rz)Bq6uIBGWWYYZ0sgr1657K3iahmy4lq_NRrtdJAE z!Df>CVdxQSN0#k*(_*xgcR&PJ@y-U)Q2)v!@pg@v5)eUdrVC1P9jFr!(|-$+3zv!@ zvFWGb``ftCkvlg)kIuJJ!d&m@X(a)OPZpzRXU8}LX}?q1_>(JBx9?P(0$ls>NOJ&l zPpSW7x$uG{!z=91swF!6t*G60pNS$DLAib_Uk$+b+I4H9rtoRDzW!~jE}%zggPeWZ zR*gVmKTYMK!2(I~ah*n~?#ZKHQsLDR0b$CJv62*~lI?$|~NqH`4eZ7}tp+VA_B zG@GUh=FT4riHJ9c%%&!W6Xz$Cp)28V;7fbL9v1gZAdU?qBL7Fru@t?_8je?Q526GQMAyu^JWWj~^{0L5PuB?s9PuSkq!* zlO#kh59VE{bLEb(O&3Vvvkg9ZlDvHCDeMLX1_n~#^~fGc3wb@_BTs^d*pibd`29q^ z${jOUjH%-?Ki|{zaSrjm@MmId*?v9I)&orZ)FFR+elQ)}&5Tc9HGuLF4@diq`NH+x z8dSi(6CmOb$U~W=UYMuO@5)F<=nh1;vdu6grt~|E8T((Wn|ukKDi)qah&WBz&xc39#$jdB<2TI=_<8g9 zM`z)-x@)T9m-m+KMvLW-DokC@;u#{e&{*0<8*#&E-}#LB*t0jIDcft}nOTxg{+}k) z<(oGst~c}!j3+K{ihm)jwN?I2AYQK9{qzZ7?sKwDV6-9?Wv_jmG%xrqM?5lkVFY*Z zbpsJp`Xvw#2_aJLiD1QovNo&xa!wULXM^YaVYN1xB%prFR7_rYt|Tw988Ju&`E>Kk zPG#v9VZHjt3h`+9>3Wij!+}6?l?Xosb@KkZPK|p@ZzDfr~QBa;wM5f! z!T;1vod-OJbj+>FKkdQfovKd6)K;*I;^$Xfl|S;8oE!s&(5sw7!3vwHQ|zZrGET%d zpqn-&_>k(hX&JS8Z?jBcwH&alSFSOV+JJ7YBH z=PNYcb!znL#5Fyy3Tsa!2}h7=1D9e?1SWdBwmFD5z?4=+rB#ls#cPCUd`L6tLtPoF zcDt9L07qRl3oElOYw-HZ1oDEwL9Q7-`j^pPGGVb&q9>qr(v|_bbOlYH4qYDv{|%Ln ziPNT)Z5;752I~&zsxyXp)O2sm9ribLD_NFe_Okt^A0G(AJ=`-WZhcBC&MtKG>=tw4 zt5j!~u;9NQAp+5h2bujRR!ZOp&!6aS2wotJ_iQHBuYSzvv?0TUxCq`2`)}K0D8A0VLA|RQ1Rrx zP(D<+)RTCjr=i;Q9m^CR=t)fgSLdqn9v%d82m$<{n7*Vq&RlW;6dsaF{wN1D&6=iA zDA<$%><*l5PX~?;vU6U85GP*x1}S6zujwmX*#4W{!K*>)USffR7Wp2Iy~N^`;AII$ zW^5=cmbcyv*lFp`5CpbO{|E{vgOcT(JvS;?f%>tZaKHqmP~8u}@|~99G4ZbSS`3ZX z)bf*DuUt!?$WV}pxVUvFM9q1c+GF_y7yEMvtw& zvt%F|LS7$Jo{CX`T^Pm)%%Pg+DwhpPfY{d`RrLmrcTFCaN|%b|5HM3yJ}CkmKX2cy znfER@5w8MoPB*c?FQh1`ul%NcJ9%$%8%=KJ*a5aJ6iV!;!A3;G);y|z08&hV7vu1~ zXYbh?*MDGJt)>Vvz|$Za6tb%Gk96<@=(#!{{e`Y&kJt$}%c8Yi>^$8bjOeViMSUss z>GIV+$60_>k$SAx>I;T{s6-L@9+Zn!0OP9V>4|qOjF)7r8>j@P`vlu%>~nX(&J5v4 z1RjA3gqBt~c_wEyC+6A8lCs$4s;vRv(A!;z!W2@Th&Vs&b)E|0@5^3h>)CKgm&ouX z`7V`!%^g6NK~4=s9j;@sOzk;Ry-vyZx05=;+qpC=zr@N8CMz9hcqU3CF4&Veg+9*a z9xOFZI#Hi^l7DU2N%;yc^|Ggp@ZV)2QvALppJGocKQLvWrDGzS+$2fT&v8sik)$7^ zz=jm9{mkl21$#k$MzcHn8E^TDShscqMgKBdN5zSEC`_g-kpi1!B)45`3-u)lmwxHi zY?}0nVp+?En;P>JMaR8S_7Mia`(tm;jcE6uy}+*Oc*z3ut(QP>Q`ymE>gs0Gmls-p zUP)5zpd$9NsFFXZJzcxdEv-)_$voq_ ze`JZ)?q>(_dYL8}uaL8AlLUAhF$6q9J*g>f2HaOn)EBXipGbH{%b<7L1-I&chu5-B zUt2in$++Q*cPM=@j1DR%Tck(mzF-aH)W5COD{LF%2xsx4vw!XQqsjeb>48Aikjg` z9pC|VbDpX0*7x=uF&Uxp7+`B|ju!!%ss3NBg4 zA<;qSG)yRSn4|tPBW^vz<}kE!B2@y(D?7hWIj6fiN{{@PSr77{2s~?iW8h!s`z#!JNs;ULT6Ya^`^n89FfX5OQ5jHZbd7NE-K|5 z(Mr?7%(6N|QV)&j#3Rb%1zv`HRl8d9pyMf)z>R!cH2jocd@a1tYAEEP9&$nfJ(x2} zg8e4Db$NND0Nm5mSQL0996w^Opec8d4yK27(DX7aG|RZG6}%c0h>#kDqzgpoq~~wt zMbP=hKDk6{G`SCH?tk5g;4^@yHl026x)uo}JkQj1~jQgt?d}=qgvKMD;oj zQ()yn%nE9QgKu-pO|Q~wJDTT%vB`P9ccc6m43W8g({1C!H*QvxH#^72e!2eR?I>-; zIht)(UhjU=5?v$B#>43qWgURwePUi>-1Qa@4K>vf;=mW%fke0I#^kLa0*J^#Cj9^P zqVxo>V!bbe-JSG>Df*tEdy7ckD{VPYJB!MZ89vbn7+CH{@E{Hq_0l4OT~PzXh`0F8jML^ zLXdUrS>J_XGe0*Rn%_wN6WHm=mor(W!S2xWT>GK>(AVboTj`G2vDzlc(Wp*SMhNyr{OC4p24d&PmdaTb-SF) z#?QW$WZ8fS!$M7dqi}3H)Mj){SFuC0mQ*eWnUj&&uw%q&eAbZ~m1yb3p~MA$;MQrl z{r7sv-j${~e1TpzwB3Z_Y}#P?ti~s9RnsX@%iYWV@BYj57#y>}N%>OpVx9d2%`u$x z(_MVq;@N+CHGU^qTmWU;8hBuaCCT7%dCs4(8ddw7XyMP5UNxd)@}GW6<>ER8#*)|f z!aLFxfj(nmhzll}BUV8|)BX~v&+#uvIYqsF5!Y8&rk-5x7by#K;uZ&XjOuQIzRJL@ zv2pNYMxC+A!A;p<1Q;RM^5ss1_S3F7*T(>ruV`h?aZ#k4!HN!>bFJGOSGR<89!X+S zksJ=2CN}JYsFO%x4o20Q60kpbxS0KKfSg@Es^9&^h|&_zRPLs4mP z@B&lP3R|e8V8*aQUN__`7OE5B)ZUbh|3QEHf&&JzwE-Eqek*x+S3MW}kw#8ednh7z zWC(V9$Q*=N;9P0_ucgWNcq3-_uzA><^ormrap~>R*|zuT8FLgIy_ex?Nw0X&?`o+i z{5hv_=4}vk-_ccWwB<+}wXpR_;SdKWF>l^y~Pq9_;qHhR3Hnw=3g_3gVRh96$KC-_{hr9HiI%FXp-^OZ&riHznD15imaa!4%ug|tH~WEnYZOrX!-96TweR1-v(qq-ApGutR!A7 z`>)@YroT0|dGwD-WJ&P}MW1uVcjk50a_!OH&Suqt`1VrlzdFY2{~Lsgl1#`Lo~Kg+ zdbo`XxFRr44Vx)9^_E^nnTF<|$1j0QDuMDmOem`~@*+i#bHey(J7Db5H`(saoXMck zcYIYwx*5NtwNn}kL;HyIo6!35D(xwyvFwczGY`1U9V06L7*AyrnO4keKw4oO;+QTQ z@TlB`qhIZPea`D(`u_VVnS|To9MsOkj0I@R&Vl9-w^hYe8xEJzw1K& zE>2JW7SjQuBA>|9pF8<{h?lY(6&qI*RP^Gx0XA6}O@ovyovcFJ{5`+H#cjS{?F?PW z^K=Oz2}#H}Z3`;oDm?BS@odiRKyGKZB7H0Y13ZZLSA)XTi+AhO@ciYPR-!HZjPr4% zXA=g#o&}dg0a@pqIv)Z%PN6Ai6wD_}CwGJ_3SgG3cVzgyqJQDDQLBpmF;kZD{FY*E zg9rbJ@F+!WVx8@YhE?dri}*fN{g*>V`C;tT1qwS6e?Cc#f8Woua>S2Y^u@(rS?~Gp zKa54mxs89h1A-Duer_st}~* zv}){>ihdP-clVe;i_a|112^c=7YO~w_Xk?m>GvL+1pALhpm6bI<@+acZ#=cR=l-MV zfXYhE8>E0J*DD84(PB<*Y+&ulBan#B|FIW;<xH%BzYQ% zeTpxgtIXwswVkXC2%0>JwCp3sv#zhmxb!*c>4C1ygOvQ0*C@34B|)} z@^^?+Th%0=g@bT5jRe0mKqSw0Bo3RLOLjHK=Tvkm+ytIa52MlaJ=!kdw({s(*sy!o-Qnt-n(E-Hq}UFoi2E%x$OgatvJ0~l^SFEce9x}^ z<0LuO_}47iT;X;UPd-mt z|0%}nJ#CERy}Z`#zDio@9Y`TS^fAVFUAuWjM!xQVRho{NKa-iZx}g5l3hkO#Utgh- za=h^Z9m>hRg%BRkrsP5O!?%*1wAl06Y0gQ^@&U_yZ*Xzazp;Tw$k}G5wouC(sl3NH zF=g*^>|JsEpWDk>CSf_}uO0D4(Yw-ZQEE}=A@=KRZE?(;3>|Sj4Z=zSe1Tm{Og%3* zbizSFa3M6gsju`{eG+9Lxov_(qqVOH>*_^SA>oafPUM+LcR z+-DLWADOIyU_;pxKcR?M9T=hM?>n%RuG{G`>T%MpJugK$cND0V83uub9w*74+6I}Dy*l|( zBB%o-*P;Rr!j=h^1jX{dN@(|{V}mVT_H9YGsCfQAiSf@ikox#M6>IWnSnJA>ps@NP z7)?*n{RPM&#`_>WZ~-g+rcMMpIf@)he>g2gcgR=_EhShE#t?M1NIh|d)p=q#71*TB zw%5z=#6?Zq*DH>IIca7ci|J(vj?&D~CoQim+$Av>M1Xj}ag+`84PQH6@imar)537h zo9LOmO$h{<<6ggsu60Uq%IhOz@DHoL#`UL4R4&7I%Xgqg>HEX)Y?p!wfRSAi#A%4aJp%o;P7|jiUso?Zn8vQSS|`gt1fa)PbDoc*FiT%Z%do zU2`hN0--O)8XMz^kZz$|eJH#tQfJYmH6XCghgM(0g6m2(4JQ#*d-dstu%?x^{+Ag>_rN@u)mvd}*hBBxJEX@JI)!jdTt zb<#nTRbpOhEp%uY58XYF&8@#?laOg zer}DvY`>?CeZBWut@(#Q2Idc{(0H|k0RItkNxy=aca8|h>sCs}p>5iky}(k@aCr_6 z@X5k>x0t?#TeUYO$?7fMAL~Kq@LS7K4Xxw4GZ}K>ayBO#^i&* zxvg{``X`N1o5kQY3mgZ>;rJ6^jPrEfp{tf>qs?k5MEK%1s?f=4Jq^ysnOfp$(aUcm z^7<7n65BXS_xPR~&&eUfp~GGOQ_I%~l#uiIi$5AifaY(ltV;LYXx)6`kYms;diQ*{ zRoMGrFVIX@jHm`jJogD-u%q~uyY~-xR$~`HhB^_g;i}`^UIt0`cr3_P-J=9zqYR{;jILfEi~&C zn1h4wVn42m!3G_pWf@c}PuX0*F?n=&9RCdfsp{MU%uu%H!_`j>L!(G;^s%Uclkwcg5P^D!z zTVS=|5nR3p&hV#8WI5a^tFp|fC>~ef8vp&@MeG>Y`15#Jif?Q>>v(Fix-8_Q`={&k zrc#jS350_87gp_XCGmpxFvky9>_mrhFQ22Q`AD24kZ9VV1A-jiIj$WIxz_dm=l3kc zTfNvuOwels(Uz5_MbNQ`J00iwt;}#;(V}O``GMWmDiURDce+gVgVK58fJZM*v{7%U zPqpn;ORCqZ?@da2toH?PcPvoD7(I9MUG;YRW@>MQ&tu(4jix%IJKNt+6C>}iE#ZA| zCU$MJW@jt1e^iKJ6};`2uZ#JCehznLz}Xd&tr4LEv{-mUapWvgflc_jD{Qm_tw@#% z?SzQ86vKNIBr%N63}W8Ql@V6W&S0v0+)FHpgTqhAqlH>6Ng+iL%Dg>ndL#V0G2!l* zMeXYvp^%vf?yGi z8#SL9kL0iSwHt8uX;wSbXeJ!5*Ra=FKrO|{KZ@tXx%6XuaNF@kyg@K)o6gU~tbTI0 zbcUb1AvH!pC5>o^bX5e~edyQ8Le%iU=2gsjb$mdMAF4!r5_M*U$#5&E*xl3I-0}6f z!{VMw_v7fXrv=?6gOTi7H3@+>#43zFU(uFG^* zA2pKHXp%K2?kWE6^20!ece)}}>|I|5{j<)&V^YUB3IP?m*)C2`jA59IIs`bf_zr8;@==&!1LbOtxC$8c+z6bioUBPuB zdY(Kq^|h%c-Sf}aA(@kGw;nzxlC9uYOx#bMKAd|1ic{~lz+z3ouU$1a3RZoo(9Y_o>=+F$jnh&J36eJWA!-#Yr-cR zvujGgALPJESt@Z`amP`d^VTAvqgk7SbVPU7rW&0Y6Wl_XyV5kQbh#z1d*xJmj^(7P z@?@TMpJaXA9zV&DuEoW1|4JQon!BFUz*pAtj~sa$SF|bp(s_mWEkc$06WGwi;MQz7 zZ10kC^qvqD)qCXSC zbgS1VZDDD&NbKsILjfB+lo&q=bMoT-M}=R}>}B|=%L;oE*n`J7WP}-of~verO3618 zjLwy}V^)GYylbg3BuLESHdGq#6vyXVewgymQ|giUalOH!QQtT(2<+a7@DuFrKcI=UxtUNoKe?ya?2X0OrSP=p3ECo~o?gmfWx z9S|2E8xgN1!o0$NQJ9}^nzYHKdcLDH3{2Nn$KdAFX1G&9ZeNGg-^PR&7>&j(g(_Wke9GTICI&c}HTp(n-$D@`-52iMIu=gU=V2U0f`Pu+{La>^#G?@ES#jT#+|_=se}MdsYM^)f$uSf-uw%#cd3>^PJ1nx)t+fW6Yhzpsuf zgAr~I`rfOzY-UA7g!j~-7RI6+1N@df{;ZJLztneEx^;v38OObda1beTpi!k8nui+WgDuB9 zI-qxxccMcA-kAh>P0F>byaGK%$VfA~5u4p`ggPsT-NTa0DBWFaA|Q>67s(6+))qb# z(cVPSpP@yV^mXk#PK`AdL)hIn&^qPCqm*S#YHu?&0fMsSlf}(l9Mhv^GG+J_yKg`r z{|&FfVRY>fm+zx@yf*6B0`8A7X2*G*=#_=h z&p*pdu@`@17kS4lFXrmnFzimx)_Q0L_R9VbKXBsALW5H=eDx0k&+)mX82oYaV=Zyxa=>bQz)w~s_Oe0j zr1I8P4-7$jku3=5{rLT*xkjm+LvOvn7eI)5vxmKhS!^vAc)MwZ$8X~BU}Y#=l2JIS zzA-TMZ11=SGMFis^M9^~G?pzW$l)jo1c4W$-zRJ zi^@c_X;MiRkA1~UpEM77@IVugzThIT|4!UR9LI^DHYdjue;?CRfi9#E$g0ai)`}~U zTjRj@NZC|6N~dQ{HU{H$m)|bwy~UlM=T&q{b!OM5&J&-I5;$?nM>t={OEJA}%8;K5 zUW5n!8THpC1EGBiUE7Hj0_2HcoFiIbGqLR3$(pFeWXn?*d`YZy$|!zSeFN3^83L!4#!Ld z>8Cb$5-ic15#2%4g)O?joU{a)*i~DRZ|H};c4K}Hj$!9V}X_*Zp2a*EZ4UuXH zQ`FXKpZo9hccg`|+HGhCc1oWV^S{3#J*ZbrfAYALm3}TI_O(&R@=2`zP+j@m6`Fx` zU-1$X(@bKmgaS_W?*{xkftt6Dx6&Qw{(=WPU3PJjr|(vQ24|BN{JT(6Z@i0)@lCe`NB zxqRy@LsT6nyr-4H2smtfnHY`v0wcpiEKP)O$!lt;+$;n?yQje357h?>Ln%-pg%pN0{!V_o^tgc!b>sl2y?OurbGrOG9ak;+$Z<(E7 z(H@XvF1Wwrs)brNpx|&i@2o&P;d^EDGkW7w#fQ8B9y`d=slyUgcVrecYaYpvmqNK|WWb;H1RZ)Hx>x-eF};{oU9)Li~h4)n*$^)J5N&|f-WU3Qof(4jVW zToZZr-o6md@H@Zqw~R6}aVBcA9@XX~q`72Uce|_|T(CJ=eP~&`o~!KCQHwt5h|2iF z>JUOz3!h^o={5eDQupoTXZQTOO1Yi_2X~c&l!+LhB)37Y3Up5$4Uu_+(NO!T@mZvN z{z$^HM!w7hR1Oo!Z_9?85b?4}*Tz&^(K=sJ=2v2KCK*x_FWeNExCbXwq5Fn7FxM=v znSW9HK$&;my;jNbRN^b84lpCOe;B5<_Ow55>0bf8GS(yUnol82t}?GYO~h~$jB`YR z(%jZEkk;b+15;S1%2p^t(o7WJ$5%K%yEh3GZ@@`?!7RkoPNVUgZ0nN?Qe8^r)q!)$ z9cOuUT3)WGG}Ll6{wt4~)|E%^D5jrveIK72Ez4|5et+V^6#hsboEAa=_B`i@Yh|*w zYKmXSO6~k%s|6oFKg+BeN#0+7K4d{IXC^u<1e9lf=g3*mx!uG4d9$E8t{*ep`Soty zlyg6?)t`%-=F?7U>Oy;m@DJs&eY#?7TYWZ~?_J_K4EWPAqZMf+mX?oQTOJ5+sUEDvuZDjaJCnbh{iVg~=bQuB18Z;U#KBQs2>sSP;;R(ys?6ImUhy$6SQ%`8 zvkj@t5f?_QUEF<`OX09VEJTBmDve0bo9ZE*VoRCJt z-FCv2pJwJ5_`>0{5C*k!iyGD-d4@}8ru+J1)wc2^K-YiN6An4ceZ4Rd#u>aogbgqg z#mc)lR(a^H)#wbUmPUT*?>5&CRfQ}PYHrS#k)sZtg;58qe^-|*6H!P;PA#u=?9y?&2)lK{54hS$xurV0ehnDCyz*6eC z1y(2Uancf_1zE}gvAjAi{?p<7Ln*h<`1YJiXG(Uv!Jz2fUcUN}2%=u;S>~6|!9T9g z1=T8G3*+ZgFT66yeZ1iFn&*M?CFlOLjglmW0;gzVFOU*DaJU(JoDpyc-JSxL} zt?T{V>d}xKHYg8naksu35Hl4O$#}6Vm-C!R>>^NXP7b;SBl=e15>w$!+$-zKf~1!~ zhV`@NNr6%K4q<*z|!(6(jFONZ% z6_;bn?5A9qTN2Y?A}1j;mV3eP?%$74#OLF258vT5$#CHnxg1+e&rZpPoHM%#b33`V ziU}ZvI>iZFNCf+2{qq)w!xUieN1@RJ%JzA}4ypGZ5*21ziH6SgmzIXsd zdD#5T+x-)6zu4Whmde?^a*e4t63qBCzsDc48xHGM$PQX<+8p*be6x20B-z+yLa&18 z?rlf}Pfq3Y<@dIkx_U_VqFaC2JvonJg?}g})q|F1qK~gJ-fJyCs`dOI zv6t+N#j)#Jg@IkZ7nT?aPh;zQO1ArzX1ZASqIeewOSM>;eJtYhv9M`v7~zuKOSidK zlj@T4tcN;d*}k^xUh`llTCC>q=frp$`}i=?db$rM4Ix=$ z`NBxFr?XG2Y&&Na26e!V>N=}~wga`EFetv$uQRJu`uogLi6v**a7hdXUPf1cVa&kMh2iG^>6E@m- zIoSk3LO;dR?Nj7g?~T3;S6S89%E#_z4sQ7h0YUAH;sJT-=Z-eA24O=6oMJ1 zaxFZ|c0vQ{jB>{n^s9JS=w*S*MeGg#bLQxaxbcaH`)J~|@lv7@H|0j2<2I84q>r>cT~$mOJDd*6wUc^03me&Mg-{2g9^ly3aC}j_9SGQL11?zUD_~7^pcxiXPc!>%)_K$Gf*c-L?%z6b-Ii0aN zF$gQ@{a#s;mEuw~p9FVH$}vq*fTvjsM^%m7Y1(PG?*$Z!|dF7JmA_cFq=2zatci@P zR)Hoz^#NP~)U8_(OXlKgLKMMpG_CKqic5~#uRmEs<1w@> zGb`=lB{QS?o_vdB#GT*KTR&`EGetk_D;aX2eH|!s+|Bx{A86J*xmtT- z-y^BQ3sQJ{qR4PONsEaqP`Z@=%;lXGPnGyDMY9p5jyr+dZ09NL0@>HE4zXqOhcqGB zk1fMir5Y@hiD1aGjS`6cNF^?Ywq?rtGPs*z%G#)+Q+DsGTsJ*Ak`y&w%2jTktY9?@ zaXiU|3%N^`w#A$ky2tvRxxFT5hHE}SHOlHpN#teY_htb9O4f%J?xcp=Hv2$|qknsi zg!Z1c+t@CRH6|&{Rc}2xzuYvoLKYz4e8W+(P|}{gh(=FqT`8?DZcN||XT67cSsmM* zR8cI-5wG>?1Q?}M_ODUkqj>)=&%W@NUmUQ8qBXNs_vt>;D|_>o#xrg;uzD^n=pIMBa4o;;Ov^fRCM+E!v{~+K&Frk&LRvK(>_m7`9f329N zsQLgdJjZ-`|2~>-9?{S?q>TE2la^YQG!{8c`JMGamgj6wPGMW&NDsrtSHa{a2o|Mu z84kT0cSNI&G~7fH_q;IBys_(iC+WAhi*}2>>1m)%_YdIBc$#DRL-^OvpMcb$yB{Te zN0`kDFlq~c67W$g1HvebwF0_p@M&$5#z4hfwTrlhaWMf&X%VZzZ)VurolNyy*m*Gt zi<`#)Iq%;!EjU9H-InB>PjTc~<{+{Ywnl=&`Oh0?6xECWp)_5`mPQ9xhSlE5GcR!W za+RbeEKOiSi8`40Qm#^|YzdSJH@RE{!_MiUwy(ejlrMAWsl7R%ih793lh6>t!6(OW zbYJ=t)N`w3QZP_(*+9X0MK}08Hp(z=I)p?+*qn4tMG}3%Q%)vD{?pCLU-)xpqPZIT zBlj~ku>dZ|Jm2HlL-`!i%<}kRzavZHp7P(kz)p7s*de0b4`WTgk+Dz@TA_S|3%CSX zXg*4Khg8bpcP2NrSjZ@}Kd3{#iucz+&|%j5dim}QSfK?>t+0P9aWaIvUInaeMNOy> znZi~3@_bkzY6c-~;Z}ei+jG{#N4pTIdIp@S%(e@s1=z)hGVGORxJO8F3gP9kS2#EZ zuelzuZbJdZYZQl?fK^Rid{k}@hR;!8qZE7lKy&zPQ%gl>Osnf+nu0Gl4;sb9C6=b@ zO?5-dMe0`|BB}_cX3dJRcBNGdd=*IY0F$}Aduc(x^4!lqTpY7F%ODsGs@S|r56 zNsN%nHbln!I1D`WS^F&AZCTg(fpEXI#ME;YQ51e${+>(ie+{Ck$&{h`K|^Lr@yAJq zba->z&lF)pv#Nj*5b8|KZnyiyZT;3vSoKHAHV&>56$>A z;AgV)>8>>6y--+}Nek-FUaGRlOw%vyEpih*$2hjT&;4}RTG}6jDvSI^gi(=>K_Q+lvPG zM{Xy(<0$nhw=l&+9nHVlei1u8n@w3~ZCAZO{d0E`;dfQQrRV(%SIg%HyBD`?7Yk!N z!!xr{>Mb5}Beys~|7EEsHz&XiKS7aWt%Cgm&9jZ(6(SqN7YRPX0~dsQw=be?imx68 z+S=>1%&H4Pu=H0^I}MweQ&Eco;RZa<mPv9^%~{2Vf(CpSC5 z4lL32ysD}Vr&})HWHSb2(FyP)*}tXb67_AR@&qgUnyPZrx}(ifnYfQT4&B-j)B45R z2S1JK6#81Tle>*bCfqdnXTt$SNSZzXd+kS8KQ%DQb-<}ygpD)e`7`A>z@#t@Ijw*O z`_~n$v7D9$#ZXcZN%eHc(%Lb zZ|42@`<(S5inlf?mcLfG%KjpQ`{C3Xp(zWJnM|{V%z|8Y%57DMG*iwQLgLd1LglqJ z+NILnc^zRH3svj?cbf9eoaZO6jg|2t#$xDlIf@+3^u+Z7q+8NNFfC9;O!sxd(pE#p zt^f6&62>gc;!F|E%)thZkD7-!~%=+cchQLJbtE`S==bNp`yFy=GbPsrJ4 zgv5aYk>?x&YZ{4;q(3)g^5Bz!eXF4J?9Z}s1qG07tXGR09O03=R}fs3fWpQB@Nm$D z|0S$l!4q@3%RkOb4eAE(bj>bHJDv39Y|1~=qGDLa>5`Eh)6(|p$Xd!|7Jsfp1JG=? z09%sgY9+AE15>Jh26(ErV<(x)#zlk*bta%DA2#uW`ipcAbO*!Mh#swu8<^}7yFppm zrm>)@7)=KEOl(?eDo-52E`c1%m3-!xyaP43<#i!uYDQm(?7hCzd?ln(&xnKPBA^Al(klmdMZ zchZmJzr*yuk_#JVuxM5+K4h1qM;}08F|jv_*bRQaqc}Kh4SytL9nZPGz@vp6tQT4F zP>%3qkExWVN=0`8_t!z#5MYM|5=|2n?gNdpDF@>S2L5-H}pwDV^ zS27D-fA9CMPn+>n1&x#(7J3lGA+djy>)g9H$5kzoN*o={)}|sUAU0ze1V_nK{R74# zT4r1LC+?5}_S5=93Y;plPA+#1l0GDm_%BxsY9RrN7?5KX;0uuB7LZ(XqYq?^EpBSR z&N=<=AMoqUz4rGGYAy$7y}&ohh{Gq4Y%lntm&IrQ5unjeTtg)~&7c^xQMv#A+LTeh#z~DvlpX`RCCTTsZW^YjZqQV!6v7lJ{+z3Y0u#gv?7&R#e#ln z`?oq|+Nw;1Ms8Y(MvB(_)R)~)SFYuV)jVoA3m%VtcayV@>wKll0r`QGy2J!E8`FjS5Gu6u*gKdUC& zSc@fQ&%qE(Ocmt>n6yDCUL(9_x((=u|Ll+uCeS!IR6UVEOFg$RavAwMYT?s5Id!pe z;&!$vj3z)ZYO62S9Un7}n_|!j0EoI{wbNZO!3Ub^uE=5iX;_%;&G4*U>?>B+DTwG| z=6STYki{Zrm1Z4V90uFFBNmW5ujNCdP;nY`ks*W z2;l4t#XWn$!5wyL0k7@xOf~}JG zQuaj_Q6O@@taMDbfy$k^s8AAQb|Xji^+z8M7tjnd1|6n&V^g@Y>Nud<-AR}yf~sQm znOs?gNKYp?HFQ`NlA~r_U*q0yuFsz%AqcUHd}Sbd>>R}Hj6-_USPW1UGd-DmjEiSrGp86vB-n2&I`u$Y%MkS&VQ!tI5NMIy??`rd zv!ZMPl_oF5AmS%)KZ;hj>ihI!3@Axdb*a(&mKKpp1R4 zhT6*H?c|`EP;5o99;!ZG0ub1S>{MyrZ=~g86$F_{y48y-2vnN9GUWe_5o{>(Gvui#)ZE zv2$=Ra(K8A`F};0Qisv|VQ60nLIAYS=c@7z_Laie8iuhA`JLB5ah+X)s=MSTqAD2q zqYTQa!vl{Eq&qtKpQF!h1;C-8b^3vRU&m(}J?81ljxl)My^f)1%>IdVR&v{31sr|| ztP(D_geMb09ilucqM9yOil044Xt@lZ)qE9|8FMvGqT)wE9y|(*-|Ji|)?3*@xLzrx zpToNI>O}mvP~f9+YEXTp>8v5MqOee=v9VyRu<56EbWzl2P1g2wDRypGc$eZwXZ)OXUygY&9*M?w8w_hilpZn)!PW; zNjmSQDftxk)9_1C1{u&1f-yTYJ23W-f-rd{S3PR8hQc&v4-w$x1)sKc(m2J5)_fJ- z%?!lO6OXSD`G{Ha5tCwZKUn#;u~vS2UndRbv)lGMzHH3!0u;A;iKe*UzWh9}j`wP$ z)?ZIBh{EaCjjq>j`hi|s3SLn)@3!ZH>Gj77vs8QxpJhx&V};{7Ue|{(7m(XAYhl5* za@{2vpb+_i2YWO5*_ge=HSHUO)9{%_Be`tyZJO-VOa)b%1NW%t1o-%Gin0ZQdZ0h$ z4KFAnE|@m$@o}%Lm*2IGB#^HyfqaGJpO|ha;&(pf{6(y=#qU|}g9+?Pm%tIx45U7G z)pBAWY=~_C2Sq2s0Uv&G?LZZJd)KxmCt>ofH1`9^NDB7QC>~yUTJMy(`;}5ks{#Es zXMTP59cI>LT-A$DlY|-}E}fLE69zjF9jT9ZgfZ^gq>6KZ@m{>*g0nuO<9n`LCu5pF zC&lS_pu+28%U{Gj6?M*hIo^3S_L>ZN;c;cd-k+-sF5m9L)*@?MnV_o4A=l!gh@TRT zJK~-{!tz-TABG`|TgQK-?01IaZ;5H(&v53ilAPZS<7CeHf|d0etN(Ge%)h>qCum)d zxYM*Qcn)a1ays2Tj#dWef-UNq#{kvjki3DraH*DUhMUHzavJb1+-pwu5|{lXUzX?% zZ&)eB^E;31*%lcBZ5>*QXPFC7hTk_`Dg7c|;+|pm?N^TR>N70erkW}QY~tb*MX)xR znqYHEI|~x-Rh&@4;j*^&_?nHypyAQLDBdijxiyap{%fcN~=+X#|q-92}=teJfl zw!Yz^oF0+D$$<+`;K8C-ZQcYvDfNNA-@pHP0Ikg;an}pz#;h%`CZtu0j1USBIy&hj zdRM0{=HKb-0a7N8o31>nw%wB!GVgQW%Jv<9>&5GM;oR zSAwcQmltU&R`Uw%?=qFVPgH!nQmCs4UV6Z~YO>s8`5nax6a00g;8K1Q|9Md*w&~-f zHt0ITtB@aLG%k>{D|nHqsA6;SLW9UY{y6y3vehaiO#Y zuRXT6ynLUoJ{>;OLSmK;cAEj#@F!%iiB z&-a1QXC3Tp{}b}MG!?eB5N1l-7Q{T9}4lGR3gC7)?B{MMA7kG7-5DDJiBqW2hA>(8Td zbXW5x_sorwLm-9_`6v=h(inT@4e9<)=&QhUJ?kZKXk(-yKMFhtSnfjM)%v4IQ^V?8hM>KdX1IWnc*I;IlpZr;8uDvyCaS2{7mD(lFAFL*A>I{;cu z%0n9KWG4UwkYGNxUgmI<)$Uy&F7!8)fQ5(`49R4VxSjg6i#;Ar5}LJ=ZTl#=m$`_B zP)!I)2=@i6o8;WRYRH|zV~bsdqgF(3 z(QeM?Ex+Vd4^BKJsTAtSXlc~vyqDAn74G-G6TYm$?^2}*kmGyAF`C@2$waQrffeZkl%V?ZJI$)2)PUZz{b;n zy;b$$`uV>E8CIFgl#34>Vcm?~(c$hp&}S=~x1w^~J{d@UlDV>Yr;Sd3dn;WoqWvLT z)g|fdh-Qo@E63sJvS>CfoU=Gf5i?r@rU&51x_AddA8B8A#vNX&h>hk-Nxg7 zCag;f^f|Syr_ffutd#K$X$`lR$Ckq+JXJw!z?%DP_^Lmv37;kt56tQT6`>n<+y$WF z!UMHuu;{(Z()-(6IR@%3oND-RdJ{d(P3tWM6z7o-6Zhmn-m_BEfT9C|z0Fn5E+MIj zUB>&F%!JZqp|?8U0&b2eb-c28w>fCF%f~bdD2+u`d;i!hh(}FK!)w5$iwP71K#uTR zoPFg2-4B3drvJhZJ*Zyt{!D_5RhQCbzr6eW)loR1cA~%^d;J}^F)u8AdB7A)iBN3W z0r>8SncbHBj9EGI)8^Wln{pYcRA@VssUx4s2;NQd=kZ2-4NX(g!~6+-k#^k` zeSE!Sq4~XQ<4=}fJS*=bU7^)RuZ3UQ)xS!uH zen_~*1gK;uY|6K;=MLvWcA9|7Vf$WMLN zxJHR1n!XbY;e9git5q{jrpVT_i)uoIfhmW8absHr;lZbV&C@$g6BPs8al4&71fp1t zj>q4;w`@}{^ZHxCFqELGEqvJZ_v9EkKd?kKP)5q0?qgyNGW9=7O zGyWcMbTwhD>J0cPl<%a*Q-3?0Yc+bHwIsudF{J@C*Zs8n`TQLn=?*(j*WnASeZ_JJGF6 zb~WJ~W_Ggn%znu}=$R*1?#bnIj+;oY{YL?`kk6b6`h+ZcKZ|ZCT%$;asJ6`dyLIYr zWmx=ucPk9MmgSr0;)zM)Ln*{vn_j?$rFt+eiPA0(>v$f zwq{$3s{ZR6HFj70;(WL?=kSokTq7>W_MoTHgfa(5fR2o5Y?ddQ-p5NydQgAuDNC}( zx3x$x>OvIou}0qjOM4t%8xPI)1t(q26HkQC>M%X#^0x%%TisfME8|jw=^@IDXs0qh zP)sE>O!_bO)b!Rq`Q%%h_H#nf_W2A_f`7b+CnSczDz+u5leGRaKd8HNM@YlxTZ(0_ z0@~K}!q~PmhK$FS=0nA6Zgtsd7Jh`R`L97u@j+M=cF`Jc1yD+=>u0(csWCRN8K=AC z#{K9a35fltwa-@HZ*8!;z(zpJX7v&*EqKYOXz5gX78y}e-w`orx(4Ui4`7M2+*XP2 zV)J!D)DY#7(aDC$cH8pKedO#fAC<{=1pPE5pz{cW_Q$lf!r-RSJj9-0k#q>k0H zpHIt3x)$@5`P{%okC4m@)o84>WmkZxdc<%HVIGK?b)P9fGGi;+SZRMLIcnm?eB(B{ z^JZ$Ulw!TE=f3?$!aoL+=~;2lrD#YYe>R;ydv&IHcP9M9e=R#u z$Ge2V)oiVrnLx>qV{oVBaaW?xbg6~REM4u;#GRuHTT{)Re@9CsU5oh263*|_5``A_ zxtAlf|Fa-A4BS_ZmQ&eE4_nxEj;;2WPP+eho~7ySUdLVTf;^$-qIlUS6%(qp+E~Z{ zV`kT=W+{5Hd%byhZFtM=?@r!UitKPqkQ8g_0P~x#uw5pra4>{z{w#{=srf z-KXrM^_8tv@Lby3C12oDBBgR9e?5dbNKH(F*W{f0=z|BkYA@qDoQNNNC|~!L3oKvm z`6!Q9Unqvg70${kC9eGbu2ni>x(Ya$VfxsPvme=NBoXihPJhQV)P5^p*8L!4hL>~V zq^+uFKJJ1L13m@sUVE*uuvN4gLR8d5yHmF#)#6#)3%7{7(-qWxPN9SIe}-@zdBoe<@yx8#8~zH!Y$!f=`Q>tGhQ z*Ex06QBszU!bnK=z6J(M6kTp8@c$YJnFRskL#F?y@}9jz0hJ=c*PX*_wRdF4n<(7p zKuENNG&|M@yB;i46z8fA-RBZ@^I-TEcy7(`8h+@m7zM~$mZSiy7z`Govj}1-9>xq} zU)TUMMJP39L`=`Vq-s`x$(FZ`3q5Ikxf^cSkL>A~p|EJhw zU=H#vdg}Pz`}LWzz1_GyYO{YwP0nfOuU|j6g+6YMB@&oW?1b!IFJ>vD7&NP52+fgK z*(9+`mC_vhwj+?yb*M{Na9Qj^2bE(cp@f$3xg{8J+Nc8v)`bZoD z1{)$;DP1eEj(xDqhMw*Bl%M%B?DGGfzszaH?X)}K_9)xrr3-iHKvu(TS`5Yj@1P3I z#6c?;wxYv|l0w?%D7ybrJ6B-Z@X2rfUvACZBGppa)O}3ZMkA-E%B%BK1 zZol^j-s}L{sHTNC_id#}An!5DvqfcUmTC0XhfaLWJNAgdXw;n z_WMcKegi_e=l`~k8)SnEKlH5#F_1XES?oV|*wj0nYP0K}3ttpSZd9khsPzbDOpDil z$1&ERN=M6mUEWL5lYB1RyTGcRETHD<1YrPoj{q=#rW1*b4GJJd7X|&jH7=^$g!sR$ ztk|}!gu8sf3^`{tBUYzZG;#w@+un$IO?4Q|$j2W7P7K-Vg-4h!RWfIH`q-ZD2FJS} zOvG*#sbeX(O?MgxD&ts`d?zSn40(_k+lGV@7jC~(8yBAME85sr{VG?TnO#sk*+^`P zTUU(T9p7QMZPd-KhBww4jRhwyN*Z(4e=c)8^7*4WP;%5{K{cXY3YjoK4X%RbKRoae zxx*h_jEdFV^$ynC!-PME#C@p%W}=O|J*M}{Nd^3NdAHTK3IuZee3ae~iz5c!=M z6g`1!OR*v~w-e}sHGG{-0Cuaa=h)v{EU{B?S^lrDM6IO8cV5)uEn0h8J)&cD=lr3M z$Mqz0Sk;3D%2?NOxcYgz@rMvt+2RN`wGo&_E)gr|r02{K5IZj$Liguw!a4-|*^IzP zwoYCVB%x9JMGMx}trGZO3R7}ZO*dA~fEgGy_|ef;yyb&C9nbftsOpQS zxwS~IUhg66NksrhX|{}QlFAj>?t~vY{wJHg07rvXD;Ga7-O$a!vuH@AmIfOuo$!Ex z!v2zG0v;8tZO^+91F=mUbpXh)*J`SGZ~3G1gLgB;DLPxL0->I36^KuApWD zSY4WEi9)d$KB9jRh+N=v>`CR04N$!kbKZ2%Q%+SIXAp*HT!$aW&2_*)TPt)G7;L81&bgliJLYWc1n(3?ns`Y8az_DE-xK2Z z)`Q0xXW$bHsd^7+T+m9{OsXs3h|jT*M{2f1Yc@iEZrT3apN6>3@Zq;>J5LNI)^6jB zJyhe!NLQ@L`_71f*KEAY0D8x$Wow*ORG$}2iwYOlV7rrH$e(YZ5UlUR~P2SFV z?)=0TywZ?&1Kdd#GKM@Z&omaaF5vFxxT!FG_%lV^?BR>rO{!z|PkiAC?1@qu&_sJ9f9&l9(&drlOAGwX_Wm5a zs$o7;;RVcMURf5Ftk4pP8splOZXme`#21{5mBxJ&Ut0&;DhrfO5#hBr6S_M?%cF%; zfYUjrif|ahlW}Bz#A`k;9f|_Ci6G{syYt3d+Ja@$pJ}bcOvXgHgsul^rw4O4ZJX(n z3FNogrwYdC9x3U3F98l5C(r@6F}V5m96@yB9NRKMzPfCJu+Aig{c6hY%;3+hu-&vu z*8oC(lfb;xwv9${*fYY;SoGC1%?&*^qv)9Qs_0)j8bvDkjiK%D!zoE7`kl2n%GJ(L zg}H8BBY-7H7^)yqOh*8hRRGj_-0g=Ew1?757t2UTH14usYJ%&>B_E8xnaLoHW;8ZVr9uTVvo&(!^wUAJYpPs6o&=Tw2n>d3T(duTT&gQ z3_ET{ig`AqaIF7s@;IQma1AxVf@NeCum5dSK7O96^AirV6fGAz3gEDpETr>X8}%ah1c!l7Vgt-?_gY+5Jl1fy-i4VtOi6M>KUX83;Cl9Gx@@dqDVy-O!amg-JtaQIy?qiz{Ey7Z3bgDsr7oQy3g%BR2*(@2p$aQ`&;5^cQDs_k zh)+f)2FHVU0RF8gKrV{?s1n)HsN7=SjN}7*2YX(@Ggsy#gTSyZ*5FB1Ajf6YmBg?Waiyx=bf2nCPG_N85ipX761UaswxU^o_{<3cVM7Bf4^C@Lk9pEK2-&| zcb>+FM(Ca-J$Fh^FI$-jI^aYMvagVlD(H%Z9Iq6-2?^qte}rf=(|~?Wyvo4PuVlh{ ziSat&r6NcN^5fT(Y2eLRv!tt}WV4S4L#idx0PiJ*_fQ}W2Xa~Hf|pVa$Te%n9)C`@~~XFObl8HW?nlx z;qVZ&i`{c9Bz{-+2;QLo{O%=YxN4)0yXNW0UvZ8Az1*bRF{YDWyBb7qCNsxW8|Sb( zL@rk)f8cOOtsv@)<;(RnPrYswSG8zW&5=9-eQ#kz9M_-rMovlM##B|2(rkyw@Q~Ve zJ?6sYdp?;9A?|h&)mWo(T-#anjibM&s#|A>tpbDPr`z_|<%yRfC{ zc@Qt0xEokunVx0VGe|9&oMh8)O(^Dh;n1^xwN$w5>DCjpmxiyiGFdI(^oJU!C1|r+ zYX(RCc}*bdY~P>+E1`g8)y4D(k&#cOR8)e>W4)?^Qq>A*&{3E^CM!#oWIZ2J04 zSucaN0`YsndlN|Ld8p$z45tMfRYz1FGz(}er9E>m*5f!6uUd79pzK$Y@1pKbujWVm zCPucHgqL@gJ+T_xf6#ofmtXj#IX}WM{#jLLIo5xse=7prJho@ zLl;qTsi-KgYHZYDd<^hkTOo8PDNh(>v{RruySy|ErdDS>u~=@PEgkm%xqNTfV1Qw_ znYq`O4XwjyF?v!mEEpL%`YLPXEO2={<2{jinxx_z5SPn>C?|B>&i#9NFLPZcC&E0A zEEFxEK3rWPalpu}O?1qn%YkIV)(>NS;67&VarXnksNc$SIk^V0_CmyUA!b)&2?Rqk9=$wTmAtR zj`HD*D$R|&-kU%AhL66>TG8)Box!@)c2Uhf(R1-XPmBy2DsJ~TA^Y_k& zN~UBT#>I-_ZduXj2wB}%E%lF<37#m5EGBpwf4>Rj@jrBBE~DY3R%>#Kob2UrL}`Xb zT+QZ&Fl##Wuo+jVQ5`XRcoE${wuuIpbvCJ*6Y)L?*+1?oJHDe*Q5kz#s2QX66HU>uiNI^-F7O z?tSC4+2bXTDsi5N3T#gFGpM~;_xvRlB3cBj4fh*kET)X%AG~(w3mcUQh&N~nolg78 z?@RFPLslL(#(roUD>wxY8@oR)ZlpcL1rf{efo)^{TR9p#fxrC^e}j0x%CvP@psH)J@>? z9Fol>r?ok;pD;i@g_jN}isfi4P0k{g^Ari7sl&_{hG z|ILSM7x@h#I|d*Ol|aQ&?n|G?E3YtN0+ot?{9lJFzXNOkDAx^jN*?LoZa?wi!x9?S zTL<_T(|yZ$nc5kFB&B|53W#=}${V$Yx6_K0*{FQZK3~e?f)8F9tV$YcZIETiPB3$usK{hQiw1|zk4{kSRuW#EaZcao*EKp_vG?1krHMnwT&PtA=8}W+d zHyJdN2>(9J)3i6SCbdri=>R$MEW_}mCl-I|V|?B!E@%HC$rCt04LeIqfwrJhAK#jX zJsCeoN3P(-QLuJ=#-roG9;fAe5b>P}MV$yAekS*~9V;YcCFaJ_qleXKd+c~V;~u^M zJ_hD!2=*onfM4X~5lH&l#eHlAQC^EN`dQ#*&>SaEVg#nLZlF9kw}q)n)}(<`;$+X& z{q!!iwEeY+U7KaZ1>J+@&$yK}h>5Hg%7!)5m>7q*7~(eS?XNb*NXR4O6E%r1_#+rSD+u3uAj z;ZMJx^xTK8G+QGJ&h@m9@Stgs^a`BX5Ew1nJV?F=UhGztZRLt{!KWwpjp!2>#41pK~XIO5GttDb+^f zb!t2=QS0p_Uv?Yi>V3=RQXHA#mu!@wUId44Bw<=#(mX92P};bCY$q@Kdfz&ZD!|!g zlvgV%L?{O7;DQJ4_#%;uKc^lPikyJ5awo$)i zNG(L(uOgA)D_~}|Go(Lb#pTFl;V#vf#SYN{7;h9o;oUPZ`j`X8lb&U|J3BTwiJLzn z#cI31p}|kBga7eA(go(D+hJp`M*pBoeT&$*+kOIWxcck;MHOQ`t9ZkN*=s}bdKp>( z`AS4=>M94mmd z&4|v9U#!Lln~HBkl2zH0=Aw&Tc)pFx?5pymy6U2j5u&h5%X$Rr^B4knF^gp81Vf!* zg;{L?$fXLGtW0px*mbfeBoJJAIx6mNmzd)}CS_=X3Sf$#bU%y^S{35(Zjb)HHz?n) z(U64HDx`FI(W)MLXQ4~9e5cp~oB!T^ORGB%`fgN%iB-f%{-_?R^;9h? zmbxz3Z8xxIv|2E|6{pr%wKUo)o97YuPE?UO`_f=PB1U1_+qp5zz{t8!utd#7iIa_% zZXr|TBN>!gRwmN`(Da|oF{uViRQ2Ccc(-0xJ1ia+1z0Jl zRDn;2UJ&&I|f@e`2;kfe+BTn|#gtoUyfQ;`up+Skv771{LiKmC`{VZ*=Y%*+;_ zavC;1(|M{P@t<`O$V$-T*)FA}932$D8!e4CAQ&d^86Y;p14lK^7VHmVF2D#Rz872B zF#=y*YxH3B76tD9nvLO5F`q5e2BfUTNqQ*eLENwPnsuaVl4HD{@l(>UzUN77mHCK) zi|2}tizkwwbXHd;%5-IS&@?k8B>*`~#xTW}>ft7}DeB^Nc-ACrIFQ(r$u7g9M&|e5 zg1^tGhc6u+7kwwuZCFM|ew;Q9)BaUDXFZt)hO{z<(BO_hVVrJtx7p1tx!Y3zzp>^QsE>3gy1`0ck z$t4997TUxCx<)KxVUB__Z+5~^G(Hu@hkYJ#ieFyc6Z3Wr{A-uHgSR_~(Y|g4_d3f= zpsGJjTN{+U8Tb$1o$~)m@45?N?WPf%wCV_oL~L~gs?|6sgkvI}@^y_n+C^S=I!a-y zRKJJ>a)$DNMKAZ6Y=NUc*-eWa>pX=`FF3(z^tQyD!@M!lNga2xsjNwOS9 zUX3|1yv5;a(==Q^@KrC1(VbXxut`0Ho`|tV!FBuUDA}3(XlgS*`V;6KsNW&lA{U3) zIW6d)l^{qgXq8__vR>O^3thR!(hGuoC>oVCPR+;}nj^axxHh7n(dL3`jG(#@n0#?e zQ?sbWV;sM*>aKPt2E@XDOeC2|`_>^VYkwkazct8lbu_Sf_s|g=Aam_E(COhk{va{b zdLVWgwmt9k2AfQdS(20O1E|g3f?NgEAm(@SQQ*towhp4WFL<@TU!~{a<6nBI0N80A zcO;PLXsLEQv|108fByiy2LvK$TAQZ|hIkU~2rcD?>k5EM8QV=30qe{9m5|VBUU0d< zs5h(gmCf3s1^#x(9ZGk3n^I`BjCzyXf>}fn?F#h8v~h1GY*zQg_Tp=yyFS;iw;Z8c z{6a+w*LG-00v9DC3`-K_Ob^ZNTE=Y;|*uf*}Vbq#{x8%EY4I{SxbbVJ5F)>7N)a0W;UBA5KTj0+W_UJsBTVi4 z1_i2%^IiYVr;Q6cYBV?a2&Q_**~7nb`J@l<5?Z(5*^L=#p;?NNMY`yF%b^`DCAh)s zY+lX_)AwDW33qD08!bYDSCTZ(0?l1ntGes7_jYyIqtlaA)ER z-;X9ish(YA*xy)Q4NBGJ#j7BWXh++W zYU9v1vF4YoVS+lq{ofR&jHj_piwm~5?SK6)N}_-_%8S2zjzh#q922OdZjyQsTn(AO zNb`MHsTAANx`%Q%yN_*@5S0MhWEs{UK^_A9p!7_}26Ar@0&S{+v`B1H-6m_S=HSar%#8)X* zvfdxI4iRD>)_d8tzsAQFz8_*JwBKL-iQy<4SxQT#CKH*4>hU>z0(`oh1%p^e&=T-g*GZ)w79poXE@%f-bmVf0Z8>G;R48{X-iBQ1&6ng| zegjITV#(?`J_ovEtEywc&8w>k9@OZIJrJjr(wP9N&mK>7JF|YI9B-R~S%TEW*_6wO zxCh3Yqdu&enqqjdc{dh_lKEJBK>pUA0H=pD3j-%i=rm#s8*IP*6#cyl`ETl+KB8-4 zcWmP_*(A)QwrYLjzJm@Z4reuHyes`X=d>7YYUhhz{b?VFe8idE+R-8l$a=li;=Bwd zSMl8wepZl&-GN|}T{jFb>-dNh!L#nvyADKu7x_Gm!=wF-pj6%2r6=^9-QRzlq{Dz{nI=y1Vyj8HjoI%H2mHzp3(U#BPns@myE?~ z#r{#XRmqyx<&iqT<=s|~j8DPuW-+Sw18^);0Za0JGmrp1a6$U=R*%J40`VHS`32-d zCa@WOy9CLggm86VCI4na0FM6WIc~_cUoumm5QEhpbws28S$v|C{=990`D<72PzuzW zZ~ej>Z$lr2?ZgdF`)xq^hX@zwt>rFvF;9tnFpvcA#Z^Kb5Hb=yA)@{ zLmBM3_sh)dV@|Hp6y_&nZtMON5|T~|JxtV!&y7kg@QmN|rpEuJB$IRc((A5Hc!Qf* zAudySZ|Z<2FYM^dHM=)~4xdiw@}4^EGX9J^mw9{eU1j$-!bzOI&F!=KF(N*`-8HklztE5n-k149~b*mOlvdGEa_mwnS(Z=Sg0>7w(KgIS@^Y-Ljwxftb;1E3%AzGTUsPKt^d`S5LeKpr zSfwdP5@IUnZ`w))j>r70Xz9@=$muFm1I}|8&NMgWjOfsV5F}lbQ_A@5cfR`iIt7v{ zC`2*{iNA`#n+&o@DyJRQ03$vlHxtM@Xh3O%AC5Lh2E`V5|1<(YFl=Zoz#3T2ivcWS z(Z*6rf9^Yx!2KiNxfzXt;1O}isDGR5^%SMi^s@!bUylJ#GDa6!M&1Jec8uyaD>Tx?gZpHnBkO-Y5rBcUIKSPqM@B(Lmu4awE#K#n;r{Yf-tpwWra* z7h)Km+<5_b$M!k~qk;(fr<2OQSy38~$3_JxbqWL#%XmiXCLeKw!_xvHqqEu;h_Zdy zs2qyJ=Y^Y+)|KP**TO1(CoZMDh<7}Nq~|e?LUbpqVys9>SS*_AqV>hc zm0;#!O7|IQ#?`NO*alwTy2;4cfQaxOCNFPnbpQuxawk#OK&(ruGxvh)sdK7ERUnI< zF;Hxg6t1K%E*d#_;OQc+gHb7P>TCrPlgu#(sfUl%`>|kHgH;@_7KcR;0M1F{C-j2h7Jt=kgxV!0ApxrElUAuuPO_lYA~Cl<24CByZ(zuJ5+Lb+zH| zaQAj-7bNd*@s|Sx(&&AA!0?*&^~;BU|E(*ua7$Q#ZKq4)*1&EDqV3kO(~FfBE7}fH z0Ukg)0s8F6S##Kd!+OSu7{Rvk--_XP*^SVApma}IANa`A!3ODI{nOif(D=9bB3=n0 z@VEe8oPN6`B@X#3;rm+ux#%eC6$Sj{meS}Ql`)Ord06IK)D{HwOAGWhcKHk}$F}y1 z))}UmBe9wK2k2rytfdmm#z(bBbWeTL2=60Q<;31aL=`+czU$bWg`2KB{p>%%B7czN zjuc93)0fo>NqxEewNav2fEt5R`{_u9+Y7f6?Ehi>`*$rf#!}P6zNVBY&6fMtdW^ic zNK2wOJd5x!{YO)S?bb{&EM|Fz4M(P=#)_C$iy+2Po1cvP`N&a2l9o7CC=CXcIf3Vm^euop4zpLS|bJdK%iEK9JaR$0vwwwN|ucb%8N>hl%u( zUjb5RmH)}hgw|A_`nQG;4{Z>E7IP$?#CAnIQH|rN^y?iwb(}Js7p&euwCfDShLt)h z!?~BzQ9D3(+~6^cjto<4f_CCy)A5H@{COsfEuMH-94z&>)+1L`hnsXhyRQ*&a?qpC z+wOhsUS#YV7Sv^iE7<|IR0o7V)&61Et|~_{c6^cRtMTAyn%M`+A&2Lf(tpD`6HvyZ znZV$c(d$^G=SKUh$6LXT(qzfUHhN+hB)iL zheBR?q;f9+#OR9q!bozmn%h%VM+(eH%@%cI1NU*F2PJ!*Yzx5&f=ZZzLlP;W&-(tVw{pY&Qvkt}J;Qdo80tZZB z_vr6mZS_zFyoP|w>NCT4*iK8AynQaAqKE^z;@Uw|5IZd z?M*%7c#M@LVb+^b?ny8O@&TOIcC9yIb3T9ZoF7y!B$-NmKW^O|n(2vCi;bHT)TF?y zcB4PQp(O-r07h}Ee8bKq?k6g7EA+T0%f(K2lb#mwe79H1uakaii|jLwa5`}NqSJN+6~tvHv{MMl4k>Ll+) zU=17gc&gna8K+vr#Vx}ZT|N{Ca!5dxJK~kjLyyAG>|yS4D0G%miUEjMXRc`BCemXq zaWzYu+0>*o<|#7D%OU}CLA{I(W(g))<(J2kae>X0*^qTrN-S=}-&{&Tkvhrg7q^bN zo<8&k9H9R0FQ|=0?pKnH(JkCeMX1N7c-YXJ;1;X)B+&Xw&x<@4goBe4pAvkL7QFc^ z<46C{qwT??Y6WfN<)v81Tkzkcx5x}Jrs5I--MehLdksx&dNyw0>WRr%QmzT#;6Xxc zs3B^67za1-v@jYXt>3BxjHtEpU6wgK_d-0)i{tG`AE3NxABU*b`diCT(w>yD+{P_i zHvD3IDRYjKE^RGfKq_pgC^SSlLB`EOC3}(yIR|2&EA?`<< z%OR#F#T5#4682}il^?W(AvVY_kZ?8@f>8YT4Nj|TU+x0KQHz#!A*OG!4+u1{8+Iz#Bo(U%D_hF#5YkSkYJZbo@jsJ<(*DEnurr4b+f^QN!d3M7JyMiF!ZS zB$sS<7;HV+hyh!wm?0desCuP_L0g?n*8cpOMkF?4U!CVT08*4M)AVNMg)E&KuHU1t z4Vc@xAUr_&Y&C|$XZkH3R75rz)Bq6uIBGWWYYZ0sgr1657K3iahmy4lq_NRrtdJAE z!Df>CVdxQSN0#k*(_*xgcR&PJ@y-U)Q2)v!@pg@v5)eUdrVC1P9jFr!(|-$+3zv!@ zvFWGb``ftCkvlg)kIuJJ!d&m@X(a)OPZpzRXU8}LX}?q1_>(JBx9?P(0$ls>NOJ&l zPpSW7x$uG{!z=91swF!6t*G60pNS$DLAib_Uk$+b+I4H9rtoRDzW!~jE}%zggPeWZ zR*gVmKTYMK!2(I~ah*n~?#ZKHQsLDR0b$CJv62*~lI?$|~NqH`4eZ7}tp+VA_B zG@GUh=FT4riHJ9c%%&!W6Xz$Cp)28V;7fbL9v1gZAdU?qBL7Fru@t?_8je?Q526GQMAyu^JWWj~^{0L5PuB?s9PuSkq!* zlO#kh59VE{bLEb(O&3Vvvkg9ZlDvHCDeMLX1_n~#^~fGc3wb@_BTs^d*pibd`29q^ z${jOUjH%-?Ki|{zaSrjm@MmId*?v9I)&orZ)FFR+elQ)}&5Tc9HGuLF4@diq`NH+x z8dSi(6CmOb$U~W=UYMuO@5)F<=nh1;vdu6grt~|E8T((Wn|ukKDi)qah&WBz&xc39#$jdB<2TI=_<8g9 zM`z)-x@)T9m-m+KMvLW-DokC@;u#{e&{*0<8*#&E-}#LB*t0jIDcft}nOTxg{+}k) z<(oGst~c}!j3+K{ihm)jwN?I2AYQK9{qzZ7?sKwDV6-9?Wv_jmG%xrqM?5lkVFY*Z zbpsJp`Xvw#2_aJLiD1QovNo&xa!wULXM^YaVYN1xB%prFR7_rYt|Tw988Ju&`E>Kk zPG#v9VZHjt3h`+9>3Wij!+}6?l?Xosb@KkZPK|p@ZzDfr~QBa;wM5f! z!T;1vod-OJbj+>FKkdQfovKd6)K;*I;^$Xfl|S;8oE!s&(5sw7!3vwHQ|zZrGET%d zpqn-&_>k(hX&JS8Z?jBcwH&alSFSOV+JJ7YBH z=PNYcb!znL#5Fyy3Tsa!2}h7=1D9e?1SWdBwmFD5z?4=+rB#ls#cPCUd`L6tLtPoF zcDt9L07qRl3oElOYw-HZ1oDEwL9Q7-`j^pPGGVb&q9>qr(v|_bbOlYH4qYDv{|%Ln ziPNT)Z5;752I~&zsxyXp)O2sm9ribLD_NFe_Okt^A0G(AJ=`-WZhcBC&MtKG>=tw4 zt5j!~u;9NQAp+5h2bujRR!ZOp&!6aS2wotJ_iQHBuYSzvv?0TUxCq`2`)}K0D8A0VLA|RQ1Rrx zP(D<+)RTCjr=i;Q9m^CR=t)fgSLdqn9v%d82m$<{n7*Vq&RlW;6dsaF{wN1D&6=iA zDA<$%><*l5PX~?;vU6U85GP*x1}S6zujwmX*#4W{!K*>)USffR7Wp2Iy~N^`;AII$ zW^5=cmbcyv*lFp`5CpbO{|E{vgOcT(JvS;?f%>tZaKHqmP~8u}@|~99G4ZbSS`3ZX z)bf*DuUt!?$WV}pxVUvFM9q1c+GF_y7yEMvtw& zvt%F|LS7$Jo{CX`T^Pm)%%Pg+DwhpPfY{d`RrLmrcTFCaN|%b|5HM3yJ}CkmKX2cy znfER@5w8MoPB*c?FQh1`ul%NcJ9%$%8%=KJ*a5aJ6iV!;!A3;G);y|z08&hV7vu1~ zXYbh?*MDGJt)>Vvz|$Za6tb%Gk96<@=(#!{{e`Y&kJt$}%c8Yi>^$8bjOeViMSUss z>GIV+$60_>k$SAx>I;T{s6-L@9+Zn!0OP9V>4|qOjF)7r8>j@P`vlu%>~nX(&J5v4 z1RjA3gqBt~c_wEyC+6A8lCs$4s;vRv(A!;z!W2@Th&Vs&b)E|0@5^3h>)CKgm&ouX z`7V`!%^g6NK~4=s9j;@sOzk;Ry-vyZx05=;+qpC=zr@N8CMz9hcqU3CF4&Veg+9*a z9xOFZI#Hi^l7DU2N%;yc^|Ggp@ZV)2QvALppJGocKQLvWrDGzS+$2fT&v8sik)$7^ zz=jm9{mkl21$#k$MzcHn8E^TDShscqMgKBdN5zSEC`_g-kpi1!B)45`3-u)lmwxHi zY?}0nVp+?En;P>JMaR8S_7Mia`(tm;jcE6uy}+*Oc*z3ut(QP>Q`ymE>gs0Gmls-p zUP)5zpd$9NsFFXZJzcxdEv-)_$voq_ ze`JZ)?q>(_dYL8}uaL8AlLUAhF$6q9J*g>f2HaOn)EBXipGbH{%b<7L1-I&chu5-B zUt2in$++Q*cPM=@j1DR%Tck(mzF-aH)W5COD{LF%2xsx4vw!XQqsjeb>48Aikjg` z9pC|VbDpX0*7x=uF&Uxp7+`B|ju!!%ss3NBg4 zA<;qSG)yRSn4|tPBW^vz<}kE!B2@y(D?7hWIj6fiN{{@PSr77{2s~?iW8h!s`z#!JNs;ULT6Ya^`^n89FfX5OQ5jHZbd7NE-K|5 z(Mr?7%(6N|QV)&j#3Rb%1zv`HRl8d9pyMf)z>R!cH2jocd@a1tYAEEP9&$nfJ(x2} zg8e4Db$NND0Nm5mSQL0996w^Opec8d4yK27(DX7aG|RZG6}%c0h>#kDqzgpoq~~wt zMbP=hKDk6{G`SCH?tk5g;4^@yHl026x)uo}JkQj1~jQgt?d}=qgvKMD;oj zQ()yn%nE9QgKu-pO|Q~wJDTT%vB`P9ccc6m43W8g({1C!H*QvxH#^72e!2eR?I>-; zIht)(UhjU=5?v$B#>43qWgURwePUi>-1Qa@4K>vf;=mW%fke0I#^kLa0*J^#Cj9^P zqVxo>V!bbe-JSG>Df*tEdy7ckD{VPYJB!MZ89vbn7+CH{@E{Hq_0l4OT~PzXh`0F8jML^ zLXdUrS>J_XGe0*Rn%_wN6WHm=mor(W!S2xWT>GK>(AVboTj`G2vDzlc(Wp*SMhNyr{OC4p24d&PmdaTb-SF) z#?QW$WZ8fS!$M7dqi}3H)Mj){SFuC0mQ*eWnUj&&uw%q&eAbZ~m1yb3p~MA$;MQrl z{r7sv-j${~e1TpzwB3Z_Y}#P?ti~s9RnsX@%iYWV@BYj57#y>}N%>OpVx9d2%`u$x z(_MVq;@N+CHGU^qTmWU;8hBuaCCT7%dCs4(8ddw7XyMP5UNxd)@}GW6<>ER8#*)|f z!aLFxfj(nmhzll}BUV8|)BX~v&+#uvIYqsF5!Y8&rk-5x7by#K;uZ&XjOuQIzRJL@ zv2pNYMxC+A!A;p<1Q;RM^5ss1_S3F7*T(>ruV`h?aZ#k4!HN!>bFJGOSGR<89!X+S zksJ=2CN}JYsFO%x4o20Q60kpbxS0KKfSg@Es^9&^h|&_zRPLs4mP z@B&lP3R|e8V8*aQUN__`7OE5B)ZUbh|3QEHf&&JzwE-Eqek*x+S3MW}kw#8ednh7z zWC(V9$Q*=N;9P0_ucgWNcq3-_uzA><^ormrap~>R*|zuT8FLgIy_ex?Nw0X&?`o+i z{5hv_=4}vk-_ccWwB<+}wXpR_;SdKWF>l^y~Pq9_;qHhR3Hnw=3g_3gVRh96$KC-_{hr9HiI%FXp-^OZ&riHznD15imaa!4%ug|tH~WEnYZOrX!-96TweR1-v(qq-ApGutR!A7 z`>)@YroT0|dGwD-WJ&P}MW1uVcjk50a_!OH&Suqt`1VrlzdFY2{~Lsgl1#`Lo~Kg+ zdbo`XxFRr44Vx)9^_E^nnTF<|$1j0QDuMDmOem`~@*+i#bHey(J7Db5H`(saoXMck zcYIYwx*5NtwNn}kL;HyIo6!35D(xwyvFwczGY`1U9V06L7*AyrnO4keKw4oO;+QTQ z@TlB`qhIZPea`D(`u_VVnS|To9MsOkj0I@R&Vl9-w^hYe8xEJzw1K& zE>2JW7SjQuBA>|9pF8<{h?lY(6&qI*RP^Gx0XA6}O@ovyovcFJ{5`+H#cjS{?F?PW z^K=Oz2}#H}Z3`;oDm?BS@odiRKyGKZB7H0Y13ZZLSA)XTi+AhO@ciYPR-!HZjPr4% zXA=g#o&}dg0a@pqIv)Z%PN6Ai6wD_}CwGJ_3SgG3cVzgyqJQDDQLBpmF;kZD{FY*E zg9rbJ@F+!WVx8@YhE?dri}*fN{g*>V`C;tT1qwS6e?Cc#f8Woua>S2Y^u@(rS?~Gp zKa54mxs89h1A-Duer_st}~* zv}){>ihdP-clVe;i_a|112^c=7YO~w_Xk?m>GvL+1pALhpm6bI<@+acZ#=cR=l-MV zfXYhE8>E0J*DD84(PB<*Y+&ulBan#B|FIW;<xH%BzYQ% zeTpxgtIXwswVkXC2%0>JwCp3sv#zhmxb!*c>4C1ygOvQ0*C@34B|)} z@^^?+Th%0=g@bT5jRe0mKqSw0Bo3RLOLjHK=Tvkm+ytIa52MlaJ=!kdw({s(*sy!o-Qnt-n(E-Hq}UFoi2E%x$OgatvJ0~l^SFEce9x}^ z<0LuO_}47iT;X;UPd-mt z|0%}nJ#CERy}Z`#zDio@9Y`TS^fAVFUAuWjM!xQVRho{NKa-iZx}g5l3hkO#Utgh- za=h^Z9m>hRg%BRkrsP5O!?%*1wAl06Y0gQ^@&U_yZ*Xzazp;Tw$k}G5wouC(sl3NH zF=g*^>|JsEpWDk>CSf_}uO0D4(Yw-ZQEE}=A@=KRZE?(;3>|Sj4Z=zSe1Tm{Og%3* zbizSFa3M6gsju`{eG+9Lxov_(qqVOH>*_^SA>oafPUM+LcR z+-DLWADOIyU_;pxKcR?M9T=hM?>n%RuG{G`>T%MpJugK$cND0V83uub9w*74+6I}Dy*l|( zBB%o-*P;Rr!j=h^1jX{dN@(|{V}mVT_H9YGsCfQAiSf@ikox#M6>IWnSnJA>ps@NP z7)?*n{RPM&#`_>WZ~-g+rcMMpIf@)he>g2gcgR=_EhShE#t?M1NIh|d)p=q#71*TB zw%5z=#6?Zq*DH>IIca7ci|J(vj?&D~CoQim+$Av>M1Xj}ag+`84PQH6@imar)537h zo9LOmO$h{<<6ggsu60Uq%IhOz@DHoL#`UL4R4&7I%Xgqg>HEX)Y?p!wfRSAi#A%4aJp%o;P7|jiUso?Zn8vQSS|`gt1fa)PbDoc*FiT%Z%do zU2`hN0--O)8XMz^kZz$|eJH#tQfJYmH6XCghgM( + + + \ No newline at end of file diff --git a/app/app/src/main/res/values/colors.xml b/app/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /dev/null +++ b/app/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/app/src/main/res/values/ic_launcher_background.xml b/app/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..15079f8 --- /dev/null +++ b/app/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #8DA5F8 + \ No newline at end of file diff --git a/app/app/src/main/res/values/strings.xml b/app/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..69fc23f --- /dev/null +++ b/app/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + doukutsu-rs + doukutsu-rs game data + diff --git a/app/app/src/main/res/values/themes.xml b/app/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..c10477f --- /dev/null +++ b/app/app/src/main/res/values/themes.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..a92b8a5 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,28 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + jcenter() + maven { + url "https://plugins.gradle.org/m2/" + } + } + dependencies { + classpath "com.android.tools.build:gradle:4.0.2" + classpath "gradle.plugin.com.github.willir.rust:plugin:0.3.4" + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/app/gradle.properties b/app/gradle.properties new file mode 100644 index 0000000..c09e1e3 --- /dev/null +++ b/app/gradle.properties @@ -0,0 +1,17 @@ +# 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=-Xmx2048m -Dfile.encoding=UTF-8 +# 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 diff --git a/app/gradle/wrapper/gradle-wrapper.jar b/app/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f6b961fd5a86aa5fbfe90f707c3138408be7c718 GIT binary patch literal 54329 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

<5G2M1WZP5 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 F{|7XC?P&l2 literal 0 HcmV?d00001 diff --git a/app/gradle/wrapper/gradle-wrapper.properties b/app/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..bb9bece --- /dev/null +++ b/app/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Feb 17 23:16:31 CET 2021 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/app/gradlew b/app/gradlew new file mode 100755 index 0000000..cccdd3d --- /dev/null +++ b/app/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/app/gradlew.bat b/app/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/app/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/app/settings.gradle b/app/settings.gradle new file mode 100644 index 0000000..8a4ed28 --- /dev/null +++ b/app/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = "doukutsu-rs" +include ':app' diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..96a3ac1 --- /dev/null +++ b/build.rs @@ -0,0 +1,28 @@ +use std::env; +use std::fs::File; +use std::path::PathBuf; + +// #[cfg(feature = "generate-gl")] +// use gl_generator::{Api, Fallbacks, Profile, Registry}; + +fn main() { + // let dest = PathBuf::from(&env::var("OUT_DIR").unwrap()); + let target = env::var("TARGET").unwrap_or_else(|e| panic!(e)); + let is_android = cfg!(target_os = "android") || (cfg!(target_os = "linux") && target.contains("android")); // hack + + println!("cargo:rerun-if-changed=build.rs"); + // + // #[cfg(feature = "generate-gl")] + // { + // let mut file = File::create(&dest.join("gl_bindings.rs")).unwrap(); + // + // Registry::new(Api::Gles2, (3, 0), Profile::Core, Fallbacks::All, []) + // .write_bindings(gl_generator::StructGenerator, &mut file) + // .unwrap(); + // } + + if is_android { + println!("cargo:rustc-link-lib=dylib=GLESv2"); + println!("cargo:rustc-link-lib=dylib=EGL"); + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f6b961fd5a86aa5fbfe90f707c3138408be7c718 GIT binary patch literal 54329 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

<5G2M1WZP5 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 F{|7XC?P&l2 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..0c3290c --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Feb 18 11:02:22 CET 2021 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/builtin/shaders/basic-110.frag.glsl b/src/builtin/shaders/basic-110.frag.glsl new file mode 100644 index 0000000..876c917 --- /dev/null +++ b/src/builtin/shaders/basic-110.frag.glsl @@ -0,0 +1,8 @@ +#version 330 + +varying vec4 color; +varying vec4 frag_color; + +void main() { + frag_color = color; +} diff --git a/src/builtin/shaders/basic_150.vert.glsl b/src/builtin/shaders/basic_150.vert.glsl deleted file mode 100644 index f40b974..0000000 --- a/src/builtin/shaders/basic_150.vert.glsl +++ /dev/null @@ -1,27 +0,0 @@ -#version 150 core - -in vec2 a_Pos; -in vec2 a_Uv; - -in vec4 a_Src; -in vec4 a_TCol1; -in vec4 a_TCol2; -in vec4 a_TCol3; -in vec4 a_TCol4; -in vec4 a_Color; - -layout (std140) uniform Globals { - mat4 u_MVP; -}; - -out vec2 v_Uv; -out vec4 v_Color; - -void main() { - v_Uv = a_Uv * a_Src.zw + a_Src.xy; - v_Color = a_Color; - mat4 instance_transform = mat4(a_TCol1, a_TCol2, a_TCol3, a_TCol4); - vec4 position = instance_transform * vec4(a_Pos, 0.0, 1.0); - - gl_Position = u_MVP * position; -} diff --git a/src/builtin/shaders/basic_es100.frag.glsl b/src/builtin/shaders/basic_es100.frag.glsl deleted file mode 100644 index 16b511e..0000000 --- a/src/builtin/shaders/basic_es100.frag.glsl +++ /dev/null @@ -1,13 +0,0 @@ -#version 300 es - -uniform mediump sampler2D t_Texture; -varying mediump vec2 v_Uv; -varying mediump vec4 v_Color; - -//uniform mediump mat4 u_MVP; - -mediump vec4 Target0; - -void main() { - gl_FragColor = texture2D(t_Texture, v_Uv) * v_Color; -} diff --git a/src/builtin/shaders/basic_es100.vert.glsl b/src/builtin/shaders/basic_es100.vert.glsl deleted file mode 100644 index 143770d..0000000 --- a/src/builtin/shaders/basic_es100.vert.glsl +++ /dev/null @@ -1,26 +0,0 @@ -#version 300 es - -attribute mediump vec2 a_Pos; -attribute mediump vec2 a_Uv; -attribute mediump vec4 a_VertColor; - -attribute mediump vec4 a_Src; -attribute mediump vec4 a_TCol1; -attribute mediump vec4 a_TCol2; -attribute mediump vec4 a_TCol3; -attribute mediump vec4 a_TCol4; -attribute mediump vec4 a_Color; - -uniform mediump mat4 u_MVP; - -varying mediump vec2 v_Uv; -varying mediump vec4 v_Color; - -void main() { - v_Uv = a_Uv * a_Src.zw + a_Src.xy; - v_Color = a_Color * a_VertColor; - mat4 instance_transform = mat4(a_TCol1, a_TCol2, a_TCol3, a_TCol4); - vec4 position = instance_transform * vec4(a_Pos, 0.0, 1.0); - - gl_Position = u_MVP * position; -} diff --git a/src/builtin/shaders/basic_es300.vert.glsl b/src/builtin/shaders/basic_es300.vert.glsl deleted file mode 100644 index 5cefa11..0000000 --- a/src/builtin/shaders/basic_es300.vert.glsl +++ /dev/null @@ -1,27 +0,0 @@ -#version 300 es - -in vec2 a_Pos; -in vec2 a_Uv; - -in vec4 a_Src; -in vec4 a_TCol1; -in vec4 a_TCol2; -in vec4 a_TCol3; -in vec4 a_TCol4; -in vec4 a_Color; - -layout (std140) uniform Globals { - mat4 u_MVP; -}; - -out vec2 v_Uv; -out vec4 v_Color; - -void main() { - v_Uv = a_Uv * a_Src.zw + a_Src.xy; - v_Color = a_Color; - mat4 instance_transform = mat4(a_TCol1, a_TCol2, a_TCol3, a_TCol4); - vec4 position = instance_transform * vec4(a_Pos, 0.0, 1.0); - - gl_Position = u_MVP * position; -} diff --git a/src/builtin_fs.rs b/src/builtin_fs.rs index da7adc2..98165c2 100644 --- a/src/builtin_fs.rs +++ b/src/builtin_fs.rs @@ -113,10 +113,10 @@ impl BuiltinFS { FSNode::File("organya-wavetable-doukutsu.bin", include_bytes!("builtin/organya-wavetable-doukutsu.bin")), FSNode::File("touch.png", include_bytes!("builtin/touch.png")), FSNode::Directory("shaders", vec![ - FSNode::File("basic_150.vert.glsl", include_bytes!("builtin/shaders/basic_150.vert.glsl")), - FSNode::File("water_150.frag.glsl", include_bytes!("builtin/shaders/water_150.frag.glsl")), - FSNode::File("basic_es300.vert.glsl", include_bytes!("builtin/shaders/basic_es300.vert.glsl")), - FSNode::File("water_es300.frag.glsl", include_bytes!("builtin/shaders/water_es300.frag.glsl")), + // FSNode::File("basic_150.vert.glsl", include_bytes!("builtin/shaders/basic_150.vert.glsl")), + // FSNode::File("water_150.frag.glsl", include_bytes!("builtin/shaders/water_150.frag.glsl")), + // FSNode::File("basic_es300.vert.glsl", include_bytes!("builtin/shaders/basic_es300.vert.glsl")), + // FSNode::File("water_es300.frag.glsl", include_bytes!("builtin/shaders/water_es300.frag.glsl")), ]), FSNode::Directory("lightmap", vec![ FSNode::File("spot.png", include_bytes!("builtin/lightmap/spot.png")), diff --git a/src/components/hud.rs b/src/components/hud.rs index 1957c48..05430a3 100644 --- a/src/components/hud.rs +++ b/src/components/hud.rs @@ -1,10 +1,10 @@ -use crate::framework::context::Context; -use crate::framework::error::GameResult; - use crate::common::Rect; -use crate::components::draw_common::{Alignment, draw_number}; +use crate::components::draw_common::{draw_number, Alignment}; use crate::entity::GameEntity; use crate::frame::Frame; +use crate::framework::context::Context; +use crate::framework::error::GameResult; +use crate::framework::graphics::screen_insets_scaled; use crate::inventory::Inventory; use crate::player::Player; use crate::shared_game_state::SharedGameState; @@ -78,11 +78,7 @@ impl GameEntity<(&Player, &mut Inventory)> for HUD { self.current_level = inventory.get_current_level() as usize; for (a, slot) in self.weapon_types.iter_mut().enumerate() { - *slot = if let Some(weapon) = inventory.get_weapon(a) { - weapon.wtype as u8 - } else { - 0 - }; + *slot = if let Some(weapon) = inventory.get_weapon(a) { weapon.wtype as u8 } else { 0 }; } // update health bar @@ -163,13 +159,19 @@ impl GameEntity<(&Player, &mut Inventory)> for HUD { return Ok(()); } + let (left, top, right, bottom) = screen_insets_scaled(ctx, state.scale); + // none let weap_x = self.weapon_x_pos as f32; let batch = state.texture_set.get_or_load_batch(ctx, &state.constants, "TextBox")?; let (bar_offset, num_offset, weapon_offset) = match self.alignment { - Alignment::Left => (0.0, 0.0, 0.0), - Alignment::Right => (state.canvas_size.0 - 112.0, state.canvas_size.0 - 48.0, state.canvas_size.0 - 40.0), + Alignment::Left => (left, left, left), + Alignment::Right => ( + state.canvas_size.0 - 112.0 - right, + state.canvas_size.0 - 48.0 - right, + state.canvas_size.0 - 40.0 - right, + ), }; let air_offset = if self.has_player2 { 50.0 * match self.alignment { @@ -181,31 +183,24 @@ impl GameEntity<(&Player, &mut Inventory)> for HUD { }; if self.max_ammo == 0 { - batch.add_rect(bar_offset + weap_x + 48.0, 16.0, - &Rect::new_size(80, 48, 16, 8)); - batch.add_rect(bar_offset + weap_x + 48.0, 24.0, - &Rect::new_size(80, 48, 16, 8)); + batch.add_rect(bar_offset + weap_x + 48.0, 16.0 + top, &Rect::new_size(80, 48, 16, 8)); + batch.add_rect(bar_offset + weap_x + 48.0, 24.0 + top, &Rect::new_size(80, 48, 16, 8)); } // per - batch.add_rect(bar_offset + weap_x + 32.0, 24.0, - &Rect::new_size(72, 48, 8, 8)); + batch.add_rect(bar_offset + weap_x + 32.0, 24.0 + top, &Rect::new_size(72, 48, 8, 8)); // lv - batch.add_rect(num_offset + weap_x, 32.0, - &Rect::new_size(80, 80, 16, 8)); + batch.add_rect(num_offset + weap_x, 32.0 + top, &Rect::new_size(80, 80, 16, 8)); // xp box - batch.add_rect(bar_offset + weap_x + 24.0, 32.0, - &Rect::new_size(0, 72, 40, 8)); + batch.add_rect(bar_offset + weap_x + 24.0, 32.0 + top, &Rect::new_size(0, 72, 40, 8)); if self.max_level { - batch.add_rect(bar_offset + weap_x + 24.0, 32.0, - &Rect::new_size(40, 72, 40, 8)); + batch.add_rect(bar_offset + weap_x + 24.0, 32.0 + top, &Rect::new_size(40, 72, 40, 8)); } else if self.max_xp > 0 { // xp bar let bar_width = (self.xp as f32 / self.max_xp as f32 * 40.0) as u16; - batch.add_rect(bar_offset + weap_x + 24.0, 32.0, - &Rect::new_size(0, 80, bar_width, 8)); + batch.add_rect(bar_offset + weap_x + 24.0, 32.0 + top, &Rect::new_size(0, 80, bar_width, 8)); } if self.max_life != 0 { @@ -213,28 +208,23 @@ impl GameEntity<(&Player, &mut Inventory)> for HUD { let bar_width = (self.life as f32 / self.max_life as f32 * 39.0) as u16; // heart/hp number box - batch.add_rect(num_offset + 16.0, 40.0, - &Rect::new_size(0, 40, 24, 8)); + batch.add_rect(num_offset + 16.0, 40.0 + top, &Rect::new_size(0, 40, 24, 8)); // life box - batch.add_rect(bar_offset + 40.0, 40.0, - &Rect::new_size(24, 40, 40, 8)); + batch.add_rect(bar_offset + 40.0, 40.0 + top, &Rect::new_size(24, 40, 40, 8)); // yellow bar - batch.add_rect(bar_offset + 40.0, 40.0, - &Rect::new_size(0, 32, yellow_bar_width, 8)); + batch.add_rect(bar_offset + 40.0, 40.0 + top, &Rect::new_size(0, 32, yellow_bar_width, 8)); // life - batch.add_rect(bar_offset + 40.0, 40.0, - &Rect::new_size(0, 24, bar_width, 8)); + batch.add_rect(bar_offset + 40.0, 40.0 + top, &Rect::new_size(0, 24, bar_width, 8)); } if self.air_counter > 0 { - let rect = if self.air % 30 > 10 { - Rect::new_size(112, 72, 32, 8) - } else { - Rect::new_size(112, 80, 32, 8) - }; + let rect = if self.air % 30 > 10 { Rect::new_size(112, 72, 32, 8) } else { Rect::new_size(112, 80, 32, 8) }; - batch.add_rect((state.canvas_size.0 / 2.0).floor() - 40.0 + air_offset, - (state.canvas_size.1 / 2.0).floor(), &rect); + batch.add_rect( + left + ((state.canvas_size.0 - left - right) / 2.0).floor() - 40.0 + air_offset, + top + ((state.canvas_size.1 - top - bottom) / 2.0).floor(), + &rect, + ); } batch.draw(ctx)?; @@ -267,7 +257,7 @@ impl GameEntity<(&Player, &mut Inventory)> for HUD { if wtype != 0 { rect.left = wtype as u16 * 16; rect.right = rect.left + 16; - batch.add_rect(pos_x + weapon_offset, 16.0, &rect); + batch.add_rect(pos_x + weapon_offset, 16.0 + top, &rect); } } } @@ -275,17 +265,22 @@ impl GameEntity<(&Player, &mut Inventory)> for HUD { batch.draw(ctx)?; if self.air_counter > 0 && self.air_counter % 6 < 4 { - draw_number((state.canvas_size.0 / 2.0).floor() + 8.0 + air_offset, - (state.canvas_size.1 / 2.0).floor(), - (self.air / 10) as usize, Alignment::Left, state, ctx)?; + draw_number( + left + ((state.canvas_size.0 - left - right) / 2.0).floor() + 8.0 + air_offset, + top + ((state.canvas_size.1 - top - bottom) / 2.0).floor(), + (self.air / 10) as usize, + Alignment::Left, + state, + ctx, + )?; } if self.max_ammo != 0 { - draw_number(num_offset + weap_x + 64.0, 16.0, self.ammo as usize, Alignment::Right, state, ctx)?; - draw_number(num_offset + weap_x + 64.0, 24.0, self.max_ammo as usize, Alignment::Right, state, ctx)?; + draw_number(num_offset + weap_x + 64.0, 16.0 + top, self.ammo as usize, Alignment::Right, state, ctx)?; + draw_number(num_offset + weap_x + 64.0, 24.0 + top, self.max_ammo as usize, Alignment::Right, state, ctx)?; } - draw_number(num_offset + weap_x + 24.0, 32.0, self.current_level, Alignment::Right, state, ctx)?; - draw_number(num_offset + 40.0, 40.0, self.life_bar as usize, Alignment::Right, state, ctx)?; + draw_number(num_offset + weap_x + 24.0, 32.0 + top, self.current_level, Alignment::Right, state, ctx)?; + draw_number(num_offset + 40.0, 40.0 + top, self.life_bar as usize, Alignment::Right, state, ctx)?; Ok(()) } diff --git a/src/framework/backend.rs b/src/framework/backend.rs index 510e9a1..2359db8 100644 --- a/src/framework/backend.rs +++ b/src/framework/backend.rs @@ -21,6 +21,10 @@ pub trait BackendRenderer { fn present(&mut self) -> GameResult; + fn prepare_draw(&mut self, width: f32, height: f32) -> GameResult { + Ok(()) + } + fn create_texture_mutable(&mut self, width: u16, height: u16) -> GameResult>; fn create_texture(&mut self, width: u16, height: u16, data: &[u8]) -> GameResult>; @@ -36,8 +40,6 @@ pub trait BackendRenderer { fn imgui(&self) -> GameResult<&mut imgui::Context>; fn render_imgui(&mut self, draw_data: &DrawData) -> GameResult; - - fn prepare_frame(&self, ui: &imgui::Ui) -> GameResult; } pub trait BackendTexture { @@ -51,10 +53,20 @@ pub trait BackendTexture { } pub fn init_backend() -> GameResult> { - #[cfg(feature = "backend_sdl")] - { - return crate::framework::backend_sdl2::SDL2Backend::new() - } + #[cfg(all(feature = "backend-glutin"))] + { + return crate::framework::backend_opengl::GlutinBackend::new(); + } + + #[cfg(feature = "backend-sokol")] + { + return crate::framework::backend_sokol::SokolBackend::new(); + } + + #[cfg(feature = "backend-sdl")] + { + return crate::framework::backend_sdl2::SDL2Backend::new(); + } log::warn!("No backend compiled in, using null backend instead."); crate::framework::backend_null::NullBackend::new() diff --git a/src/framework/backend_null.rs b/src/framework/backend_null.rs index 320406c..4cfbce5 100644 --- a/src/framework/backend_null.rs +++ b/src/framework/backend_null.rs @@ -29,6 +29,9 @@ impl BackendEventLoop for NullEventLoop { fn run(&mut self, game: &mut Game, ctx: &mut Context) { let state_ref = unsafe { &mut *game.state.get() }; + ctx.screen_size = (640.0, 480.0); + state_ref.handle_resize(ctx).unwrap(); + loop { game.update(ctx).unwrap(); if state_ref.shutdown { @@ -118,8 +121,4 @@ impl BackendRenderer for NullRenderer { fn render_imgui(&mut self, draw_data: &DrawData) -> GameResult { Ok(()) } - - fn prepare_frame<'ui>(&self, ui: &Ui<'ui>) -> GameResult { - Ok(()) - } } diff --git a/src/framework/backend_opengl.rs b/src/framework/backend_opengl.rs new file mode 100644 index 0000000..9e904bb --- /dev/null +++ b/src/framework/backend_opengl.rs @@ -0,0 +1,1121 @@ +use std::cell::{RefCell, UnsafeCell}; +use std::ffi::CStr; +use std::mem; +use std::rc::Rc; +use std::sync::Arc; + +use glutin::event::{Event, TouchPhase, WindowEvent}; +use glutin::event_loop::{ControlFlow, EventLoop}; +use glutin::window::WindowBuilder; +use glutin::{Api, ContextBuilder, GlProfile, GlRequest, PossiblyCurrent, WindowedContext}; +use imgui::{DrawCmd, DrawCmdParams, DrawData, DrawIdx, DrawVert}; +use jni::sys::jintArray; + +use gl::types::*; + +use crate::common::{Color, Rect}; +use crate::framework::backend::{Backend, BackendEventLoop, BackendRenderer, BackendTexture, SpriteBatchCommand}; +use crate::framework::context::Context; +use crate::framework::error::GameError::RenderError; +use crate::framework::error::{GameError, GameResult}; +use crate::framework::gl; +use crate::framework::graphics::BlendMode; +use crate::input::touch_controls::TouchPoint; +use crate::{Game, GAME_SUSPENDED}; + +pub struct GlutinBackend; + +impl GlutinBackend { + pub fn new() -> GameResult> { + Ok(Box::new(GlutinBackend)) + } +} + +impl Backend for GlutinBackend { + fn create_event_loop(&self) -> GameResult> { + #[cfg(target_os = "android")] + loop { + match ndk_glue::native_window().as_ref() { + Some(_) => { + log::info!("NativeWindow Found: {:?}", ndk_glue::native_window()); + break; + } + None => (), + } + } + + Ok(Box::new(GlutinEventLoop { refs: Rc::new(UnsafeCell::new(None)) })) + } +} + +pub struct GlutinEventLoop { + refs: Rc>>>, +} + +impl GlutinEventLoop { + fn get_context(&self, event_loop: &EventLoop<()>) -> &mut WindowedContext { + let mut refs = unsafe { &mut *self.refs.get() }; + + if refs.is_none() { + let window = WindowBuilder::new(); + let windowed_context = ContextBuilder::new() + .with_gl(GlRequest::Specific(Api::OpenGlEs, (2, 0))) + .with_gl_profile(GlProfile::Core) + .with_gl_debug_flag(false) + .with_pixel_format(24, 8) + .with_vsync(true) + .build_windowed(window, event_loop) + .unwrap(); + + let windowed_context = unsafe { windowed_context.make_current().unwrap() }; + + #[cfg(target_os = "android")] + if let Some(nwin) = ndk_glue::native_window().as_ref() { + unsafe { + windowed_context.surface_created(nwin.ptr().as_ptr() as *mut std::ffi::c_void); + } + } + + refs.replace(windowed_context); + } + + refs.as_mut().unwrap() + } +} + +#[cfg(target_os = "android")] +fn request_android_redraw() { + match ndk_glue::native_window().as_ref() { + Some(native_window) => { + let a_native_window: *mut ndk_sys::ANativeWindow = native_window.ptr().as_ptr(); + let a_native_activity: *mut ndk_sys::ANativeActivity = ndk_glue::native_activity().ptr().as_ptr(); + unsafe { + match (*(*a_native_activity).callbacks).onNativeWindowRedrawNeeded { + Some(callback) => callback(a_native_activity, a_native_window), + None => (), + }; + }; + } + None => (), + } +} + +#[cfg(target_os = "android")] +fn get_insets() -> GameResult<(f32, f32, f32, f32)> { + unsafe { + let vm_ptr = ndk_glue::native_activity().vm(); + let vm = unsafe { jni::JavaVM::from_raw(vm_ptr) }?; + let vm_env = vm.attach_current_thread()?; + + //let class = vm_env.find_class("io/github/doukutsu_rs/MainActivity")?; + let class = vm_env.new_global_ref(ndk_glue::native_activity().activity())?; + let field = vm_env.get_field(class.as_obj(), "displayInsets", "[I")?.to_jni().l as jni::sys::jintArray; + + let mut elements = [0; 4]; + vm_env.get_int_array_region(field, 0, &mut elements)?; + + Ok((elements[0] as f32, elements[1] as f32, elements[2] as f32, elements[3] as f32)) + } +} + +impl BackendEventLoop for GlutinEventLoop { + fn run(&mut self, game: &mut Game, ctx: &mut Context) { + let event_loop = EventLoop::new(); + let state_ref = unsafe { &mut *game.state.get() }; + let window: &'static mut WindowedContext = + unsafe { std::mem::transmute(self.get_context(&event_loop)) }; + + { + let size = window.window().inner_size(); + ctx.screen_size = (size.width.max(1) as f32, size.height.max(1) as f32); + state_ref.handle_resize(ctx).unwrap(); + } + + // it won't ever return + let (game, ctx): (&'static mut Game, &'static mut Context) = + unsafe { (std::mem::transmute(game), std::mem::transmute(ctx)) }; + + event_loop.run(move |event, _, control_flow| { + *control_flow = ControlFlow::Wait; + + match event { + Event::WindowEvent { event: WindowEvent::CloseRequested, window_id } + if window_id == window.window().id() => + { + state_ref.shutdown(); + } + Event::Resumed => { + println!("resumed!"); + { + let mut mutex = GAME_SUSPENDED.lock().unwrap(); + *mutex = false; + } + + #[cfg(target_os = "android")] + if let Some(nwin) = ndk_glue::native_window().as_ref() { + state_ref.graphics_reset(); + unsafe { + window.surface_created(nwin.ptr().as_ptr() as *mut std::ffi::c_void); + request_android_redraw(); + } + } + } + Event::Suspended => { + println!("suspended!"); + { + let mut mutex = GAME_SUSPENDED.lock().unwrap(); + *mutex = true; + } + + #[cfg(target_os = "android")] + unsafe { + window.surface_destroyed(); + } + } + Event::WindowEvent { event: WindowEvent::Resized(size), window_id } + if window_id == window.window().id() => + { + if let Some(renderer) = ctx.renderer.as_ref() { + if let Ok(imgui) = renderer.imgui() { + imgui.io_mut().display_size = [size.width as f32, size.height as f32]; + } + + ctx.screen_size = (size.width as f32, size.height as f32); + state_ref.handle_resize(ctx).unwrap(); + } + } + Event::WindowEvent { event: WindowEvent::Touch(touch), window_id } + if window_id == window.window().id() => + { + let mut controls = &mut state_ref.touch_controls; + let scale = state_ref.scale as f64; + + match touch.phase { + TouchPhase::Started | TouchPhase::Moved => { + if let Some(point) = controls.points.iter_mut().find(|p| p.id == touch.id) { + point.last_position = point.position; + point.position = (touch.location.x / scale, touch.location.y / scale); + } else { + controls.touch_id_counter = controls.touch_id_counter.wrapping_add(1); + + let point = TouchPoint { + id: touch.id, + touch_id: controls.touch_id_counter, + position: (touch.location.x / scale, touch.location.y / scale), + last_position: (0.0, 0.0), + }; + controls.points.push(point); + + if touch.phase == TouchPhase::Started { + controls.clicks.push(point); + } + } + } + TouchPhase::Ended | TouchPhase::Cancelled => { + controls.points.retain(|p| p.id != touch.id); + controls.clicks.retain(|p| p.id != touch.id); + } + } + } + Event::RedrawRequested(id) if id == window.window().id() => { + { + let mutex = GAME_SUSPENDED.lock().unwrap(); + if *mutex { + return; + } + } + + #[cfg(not(target_os = "android"))] + { + if let Err(err) = game.draw(ctx) { + log::error!("Failed to draw frame: {}", err); + } + + window.window().request_redraw(); + } + + #[cfg(target_os = "android")] + request_android_redraw(); + } + Event::MainEventsCleared => { + if state_ref.shutdown { + log::info!("Shutting down..."); + *control_flow = ControlFlow::Exit; + return; + } + + { + let mutex = GAME_SUSPENDED.lock().unwrap(); + if *mutex { + return; + } + } + + game.update(ctx).unwrap(); + + #[cfg(target_os = "android")] + { + match get_insets() { + Ok(insets) => { + ctx.screen_insets = insets; + } + Err(e) => { + log::error!("Failed to update insets: {}", e); + } + } + + if let Err(err) = game.draw(ctx) { + log::error!("Failed to draw frame: {}", err); + } + } + + if state_ref.next_scene.is_some() { + mem::swap(&mut game.scene, &mut state_ref.next_scene); + state_ref.next_scene = None; + game.scene.as_mut().unwrap().init(state_ref, ctx).unwrap(); + game.loops = 0; + state_ref.frame_time = 0.0; + } + } + _ => (), + } + }); + } + + fn new_renderer(&self) -> GameResult> { + let mut imgui = imgui::Context::create(); + imgui.io_mut().display_size = [640.0, 480.0]; + + Ok(Box::new(GlutinRenderer { + refs: self.refs.clone(), + imgui: UnsafeCell::new(imgui), + imgui_data: ImguiData::new(), + context_active: Arc::new(RefCell::new(true)), + })) + } +} + +pub struct GlutinTexture { + width: u16, + height: u16, + texture_id: u32, + locs: Locs, + vbo: GLuint, + vertices: Vec, + context_active: Arc>, +} + +#[repr(C)] +#[derive(Copy, Clone)] +struct VertexData { + position: (f32, f32), + uv: (f32, f32), + color: (u8, u8, u8, u8), +} + +impl BackendTexture for GlutinTexture { + fn dimensions(&self) -> (u16, u16) { + (self.width, self.height) + } + + fn add(&mut self, command: SpriteBatchCommand) { + let (tex_scale_x, tex_scale_y) = (1.0 / self.width as f32, 1.0 / self.height as f32); + + match command { + SpriteBatchCommand::DrawRect(src, dest) => { + let vertices = [ + VertexData { + position: (dest.left, dest.bottom), + uv: (src.left * tex_scale_x, src.bottom * tex_scale_y), + color: (255, 255, 255, 255), + }, + VertexData { + position: (dest.left, dest.top), + uv: (src.left * tex_scale_x, src.top * tex_scale_y), + color: (255, 255, 255, 255), + }, + VertexData { + position: (dest.right, dest.top), + uv: (src.right * tex_scale_x, src.top * tex_scale_y), + color: (255, 255, 255, 255), + }, + VertexData { + position: (dest.left, dest.bottom), + uv: (src.left * tex_scale_x, src.bottom * tex_scale_y), + color: (255, 255, 255, 255), + }, + VertexData { + position: (dest.right, dest.top), + uv: (src.right * tex_scale_x, src.top * tex_scale_y), + color: (255, 255, 255, 255), + }, + VertexData { + position: (dest.right, dest.bottom), + uv: (src.right * tex_scale_x, src.bottom * tex_scale_y), + color: (255, 255, 255, 255), + }, + ]; + self.vertices.extend_from_slice(&vertices); + } + SpriteBatchCommand::DrawRectFlip(mut src, dest, flip_x, flip_y) => { + if flip_x { + std::mem::swap(&mut src.left, &mut src.right); + } + + if flip_y { + std::mem::swap(&mut src.top, &mut src.bottom); + } + + let vertices = [ + VertexData { + position: (dest.left, dest.bottom), + uv: (src.left * tex_scale_x, src.bottom * tex_scale_y), + color: (255, 255, 255, 255), + }, + VertexData { + position: (dest.left, dest.top), + uv: (src.left * tex_scale_x, src.top * tex_scale_y), + color: (255, 255, 255, 255), + }, + VertexData { + position: (dest.right, dest.top), + uv: (src.right * tex_scale_x, src.top * tex_scale_y), + color: (255, 255, 255, 255), + }, + VertexData { + position: (dest.left, dest.bottom), + uv: (src.left * tex_scale_x, src.bottom * tex_scale_y), + color: (255, 255, 255, 255), + }, + VertexData { + position: (dest.right, dest.top), + uv: (src.right * tex_scale_x, src.top * tex_scale_y), + color: (255, 255, 255, 255), + }, + VertexData { + position: (dest.right, dest.bottom), + uv: (src.right * tex_scale_x, src.bottom * tex_scale_y), + color: (255, 255, 255, 255), + }, + ]; + self.vertices.extend_from_slice(&vertices); + } + SpriteBatchCommand::DrawRectTinted(src, dest, color) => { + let color = color.to_rgba(); + let vertices = [ + VertexData { + position: (dest.left, dest.bottom), + uv: (src.left * tex_scale_x, src.bottom * tex_scale_y), + color, + }, + VertexData { + position: (dest.left, dest.top), + uv: (src.left * tex_scale_x, src.top * tex_scale_y), + color, + }, + VertexData { + position: (dest.right, dest.top), + uv: (src.right * tex_scale_x, src.top * tex_scale_y), + color, + }, + VertexData { + position: (dest.left, dest.bottom), + uv: (src.left * tex_scale_x, src.bottom * tex_scale_y), + color, + }, + VertexData { + position: (dest.right, dest.top), + uv: (src.right * tex_scale_x, src.top * tex_scale_y), + color, + }, + VertexData { + position: (dest.right, dest.bottom), + uv: (src.right * tex_scale_x, src.bottom * tex_scale_y), + color, + }, + ]; + self.vertices.extend_from_slice(&vertices); + } + } + } + + fn clear(&mut self) { + self.vertices.clear(); + } + + fn draw(&mut self) -> GameResult { + unsafe { + if let Some(gl) = GL_PROC.as_ref() { + if self.texture_id == 0 { + return Ok(()); + } + + if gl.gl.BindSampler.is_loaded() { + gl.gl.BindSampler(0, 0); + } + + gl.gl.Enable(gl::TEXTURE_2D); + gl.gl.Enable(gl::BLEND); + gl.gl.Disable(gl::DEPTH_TEST); + + gl.gl.BindTexture(gl::TEXTURE_2D, self.texture_id); + gl.gl.BindBuffer(gl::ARRAY_BUFFER, self.vbo); + gl.gl.EnableVertexAttribArray(self.locs.position); + gl.gl.EnableVertexAttribArray(self.locs.uv); + gl.gl.EnableVertexAttribArray(self.locs.color); + + gl.gl.VertexAttribPointer( + self.locs.position, + 2, + gl::FLOAT, + gl::FALSE, + mem::size_of::() as _, + field_offset::(|v| &v.position) as _, + ); + + gl.gl.VertexAttribPointer( + self.locs.uv, + 2, + gl::FLOAT, + gl::FALSE, + mem::size_of::() as _, + field_offset::(|v| &v.uv) as _, + ); + + gl.gl.VertexAttribPointer( + self.locs.color, + 4, + gl::UNSIGNED_BYTE, + gl::TRUE, + mem::size_of::() as _, + field_offset::(|v| &v.color) as _, + ); + + gl.gl.BindBuffer(gl::ARRAY_BUFFER, self.vbo); + gl.gl.BufferData( + gl::ARRAY_BUFFER, + (self.vertices.len() * mem::size_of::()) as _, + self.vertices.as_ptr() as _, + gl::STREAM_DRAW, + ); + + gl.gl.DrawArrays(gl::TRIANGLES, 0, self.vertices.len() as _); + + gl.gl.BindTexture(gl::TEXTURE_2D, 0); + gl.gl.BindBuffer(gl::ARRAY_BUFFER, 0); + + Ok(()) + } else { + Err(RenderError("No OpenGL context available!".to_string())) + } + } + } +} + +impl Drop for GlutinTexture { + fn drop(&mut self) { + if *self.context_active.as_ref().borrow() { + unsafe { + if let Some(gl) = GL_PROC.as_ref() { + let texture_id = &self.texture_id; + gl.gl.DeleteTextures(1, texture_id as *const _); + } + } + } + } +} + +fn check_shader_compile_status(shader: u32, gl: &Gl) -> bool { + unsafe { + let mut status: GLint = 0; + gl.gl.GetShaderiv(shader, gl::COMPILE_STATUS, (&mut status) as *mut _); + + if status == (gl::FALSE as GLint) { + let mut max_length: GLint = 0; + let mut msg_length: GLsizei = 0; + gl.gl.GetShaderiv(shader, gl::INFO_LOG_LENGTH, (&mut max_length) as *mut _); + + let mut data: Vec = vec![0; max_length as usize]; + gl.gl.GetShaderInfoLog( + shader, + max_length as GLsizei, + (&mut msg_length) as *mut _, + data.as_mut_ptr() as *mut _, + ); + + let data = String::from_utf8_lossy(&data); + log::error!("Failed to compile shader {}: {}", shader, data); + + return false; + } + } + + true +} + +const IMGUI_SHADER_VERT: &str = r" +#version 100 + +precision mediump float; + +uniform mat4 ProjMtx; +attribute vec2 Position; +attribute vec2 UV; +attribute vec4 Color; +varying vec2 Frag_UV; +varying vec4 Frag_Color; + +void main() +{ + Frag_UV = UV; + Frag_Color = Color; + gl_Position = ProjMtx * vec4(Position.xy, 0.0, 1.0); +} + +"; + +const IMGUI_SHADER_FRAG: &str = r" +#version 100 + +precision mediump float; + +uniform sampler2D Texture; +varying vec2 Frag_UV; +varying vec4 Frag_Color; + +void main() +{ + gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st); +} + +"; + +#[derive(Copy, Clone)] +struct Locs { + texture: GLint, + proj_mtx: GLint, + position: GLuint, + uv: GLuint, + color: GLuint, +} + +struct ImguiData { + initialized: bool, + program: GLuint, + locs: Locs, + vbo: GLuint, + ebo: GLuint, + font_texture: GLuint, + font_tex_size: (f32, f32), +} + +impl ImguiData { + fn new() -> Self { + ImguiData { + initialized: false, + program: 0, + locs: Locs { texture: 0, proj_mtx: 0, position: 0, uv: 0, color: 0 }, + vbo: 0, + ebo: 0, + font_texture: 0, + font_tex_size: (1.0, 1.0), + } + } + + fn init(&mut self, imgui: &mut imgui::Context, gl: &Gl) { + self.initialized = true; + + let vert_sources = [IMGUI_SHADER_VERT.as_ptr() as *const GLchar]; + let frag_sources = [IMGUI_SHADER_FRAG.as_ptr() as *const GLchar]; + let vert_sources_len = [IMGUI_SHADER_VERT.len() as GLint - 1]; + let frag_sources_len = [IMGUI_SHADER_FRAG.len() as GLint - 1]; + + unsafe { + self.program = gl.gl.CreateProgram(); + let vert_shader = gl.gl.CreateShader(gl::VERTEX_SHADER); + let frag_shader = gl.gl.CreateShader(gl::FRAGMENT_SHADER); + gl.gl.ShaderSource(vert_shader, 1, vert_sources.as_ptr(), vert_sources_len.as_ptr()); + gl.gl.ShaderSource(frag_shader, 1, frag_sources.as_ptr(), frag_sources_len.as_ptr()); + gl.gl.CompileShader(vert_shader); + + gl.gl.CompileShader(frag_shader); + gl.gl.AttachShader(self.program, vert_shader); + gl.gl.AttachShader(self.program, frag_shader); + gl.gl.LinkProgram(self.program); + + if !check_shader_compile_status(vert_shader, gl) { + gl.gl.DeleteShader(vert_shader); + } + + if !check_shader_compile_status(frag_shader, gl) { + gl.gl.DeleteShader(frag_shader); + } + + self.locs = Locs { + texture: gl.gl.GetUniformLocation(self.program, b"Texture\0".as_ptr() as _), + proj_mtx: gl.gl.GetUniformLocation(self.program, b"ProjMtx\0".as_ptr() as _), + position: gl.gl.GetAttribLocation(self.program, b"Position\0".as_ptr() as _) as _, + uv: gl.gl.GetAttribLocation(self.program, b"UV\0".as_ptr() as _) as _, + color: gl.gl.GetAttribLocation(self.program, b"Color\0".as_ptr() as _) as _, + }; + + self.vbo = return_param(|x| gl.gl.GenBuffers(1, x)); + self.ebo = return_param(|x| gl.gl.GenBuffers(1, x)); + + let mut current_texture = 0; + gl.gl.GetIntegerv(gl::TEXTURE_BINDING_2D, &mut current_texture); + + self.font_texture = return_param(|x| gl.gl.GenTextures(1, x)); + gl.gl.BindTexture(gl::TEXTURE_2D, self.font_texture); + gl.gl.TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::LINEAR as _); + gl.gl.TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::LINEAR as _); + //gl.gl.PixelStorei(gl::UNPACK_ROW_LENGTH, 0); + + { + let mut atlas = imgui.fonts(); + + let texture = atlas.build_rgba32_texture(); + self.font_tex_size = (texture.width as _, texture.height as _); + + gl.gl.TexImage2D( + gl::TEXTURE_2D, + 0, + gl::RGBA as _, + texture.width as _, + texture.height as _, + 0, + gl::RGBA, + gl::UNSIGNED_BYTE, + texture.data.as_ptr() as _, + ); + + atlas.tex_id = (self.font_texture as usize).into(); + } + + gl.gl.BindTexture(gl::TEXTURE_2D, current_texture as _); + } + } +} + +pub struct GlutinRenderer { + refs: Rc>>>, + imgui: UnsafeCell, + imgui_data: ImguiData, + context_active: Arc>, +} + +pub struct Gl { + pub gl: gl::Gles2, +} + +static mut GL_PROC: Option = None; + +pub fn load_gl(gl_context: &glutin::Context) -> &'static Gl { + unsafe { + if let Some(gl) = GL_PROC.as_ref() { + return gl; + } + + let gl = gl::Gles2::load_with(|ptr| gl_context.get_proc_address(ptr) as *const _); + + let version = unsafe { + let data = CStr::from_ptr(gl.GetString(gl::VERSION) as *const _).to_bytes().to_vec(); + String::from_utf8(data).unwrap() + }; + + log::info!("OpenGL version {}", version); + + GL_PROC = Some(Gl { gl }); + GL_PROC.as_ref().unwrap() + } +} + +impl GlutinRenderer { + fn get_context(&mut self) -> Option<(&mut WindowedContext, &'static Gl)> { + let (refs, imgui) = unsafe { ((&mut *self.refs.get()).as_mut(), &mut *self.imgui.get()) }; + + refs.map(|context| { + let gl = load_gl(context); + + if !self.imgui_data.initialized { + self.imgui_data.init(imgui, gl); + } + + (context, gl) + }) + } +} + +fn field_offset FnOnce(&'a T) -> &'a U>(f: F) -> usize { + unsafe { + let instance = mem::zeroed::(); + + let offset = { + let field: &U = f(&instance); + field as *const U as usize - &instance as *const T as usize + }; + + mem::forget(instance); + + offset + } +} + +fn return_param(f: F) -> T +where + F: FnOnce(&mut T), +{ + let mut val = unsafe { mem::zeroed() }; + f(&mut val); + val +} + +impl BackendRenderer for GlutinRenderer { + fn clear(&mut self, color: Color) { + if let Some((_, gl)) = self.get_context() { + unsafe { + gl.gl.ClearColor(color.r, color.g, color.b, color.a); + gl.gl.Clear(gl::COLOR_BUFFER_BIT); + } + } + } + + fn present(&mut self) -> GameResult { + { + let mutex = GAME_SUSPENDED.lock().unwrap(); + if *mutex { + return Ok(()); + } + } + + if let Some((context, gl)) = self.get_context() { + unsafe { + gl.gl.Finish(); + } + + context.swap_buffers().map_err(|e| RenderError(e.to_string()))?; + } + + Ok(()) + } + + fn prepare_draw(&mut self, width: f32, height: f32) -> GameResult { + if let Some((_, gl)) = self.get_context() { + unsafe { + gl.gl.ActiveTexture(gl::TEXTURE0); + gl.gl.BlendEquation(gl::FUNC_ADD); + gl.gl.BlendFunc(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA); + + gl.gl.Viewport(0, 0, width as _, height as _); + + let matrix = [ + [2.0 / width, 0.0, 0.0, 0.0], + [0.0, 2.0 / -height, 0.0, 0.0], + [0.0, 0.0, -1.0, 0.0], + [-1.0, 1.0, 0.0, 1.0], + ]; + + gl.gl.BindBuffer(gl::ARRAY_BUFFER, 0); + gl.gl.BindBuffer(gl::ELEMENT_ARRAY_BUFFER, 0); + gl.gl.UseProgram(self.imgui_data.program); + gl.gl.Uniform1i(self.imgui_data.locs.texture, 0); + gl.gl.UniformMatrix4fv(self.imgui_data.locs.proj_mtx, 1, gl::FALSE, matrix.as_ptr() as _); + } + + Ok(()) + } else { + Err(RenderError("No OpenGL context available!".to_string())) + } + } + + fn create_texture_mutable(&mut self, width: u16, height: u16) -> GameResult> { + Ok(Box::new(GlutinTexture { + texture_id: 0, + width, + height, + vertices: Vec::new(), + locs: self.imgui_data.locs, + vbo: self.imgui_data.vbo, + context_active: self.context_active.clone(), + })) + } + + fn create_texture(&mut self, width: u16, height: u16, data: &[u8]) -> GameResult> { + if let Some((_, gl)) = self.get_context() { + unsafe { + let current_texture_id = return_param(|x| gl.gl.GetIntegerv(gl::TEXTURE_BINDING_2D, x)) as u32; + let texture_id = return_param(|x| gl.gl.GenTextures(1, x)); + gl.gl.BindTexture(gl::TEXTURE_2D, texture_id); + gl.gl.TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::NEAREST as _); + gl.gl.TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::NEAREST as _); + + gl.gl.TexImage2D( + gl::TEXTURE_2D, + 0, + gl::RGBA as _, + width as _, + height as _, + 0, + gl::RGBA, + gl::UNSIGNED_BYTE, + data.as_ptr() as _, + ); + + gl.gl.BindTexture(gl::TEXTURE_2D, current_texture_id); + + Ok(Box::new(GlutinTexture { + texture_id, + width, + height, + vertices: Vec::new(), + locs: self.imgui_data.locs, + vbo: self.imgui_data.vbo, + context_active: self.context_active.clone(), + })) + } + } else { + Err(RenderError("No OpenGL context available!".to_string())) + } + } + + fn set_blend_mode(&mut self, blend: BlendMode) -> GameResult { + if let Some((_, gl)) = self.get_context() { + match blend { + BlendMode::Add => unsafe { + gl.gl.BlendEquation(gl::FUNC_ADD); + gl.gl.BlendFunc(gl::ONE, gl::ONE); + }, + BlendMode::Alpha => unsafe { + gl.gl.BlendEquation(gl::FUNC_ADD); + gl.gl.BlendFunc(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA); + }, + BlendMode::Multiply => unsafe { + gl.gl.BlendEquation(gl::FUNC_ADD); + gl.gl.BlendFuncSeparate(gl::ZERO, gl::SRC_COLOR, gl::ZERO, gl::SRC_ALPHA); + }, + } + + Ok(()) + } else { + Err(RenderError("No OpenGL context available!".to_string())) + } + } + + fn set_render_target(&mut self, texture: Option<&Box>) -> GameResult { + Ok(()) + } + + fn draw_rect(&mut self, rect: Rect, color: Color) -> GameResult { + unsafe { + if let Some(gl) = GL_PROC.as_ref() { + let color = color.to_rgba(); + let mut uv = self.imgui_data.font_tex_size; + uv.0 = 0.0 / uv.0; + uv.1 = 0.0 / uv.1; + + let vertices = [ + VertexData { position: (rect.left as _, rect.bottom as _), uv, color }, + VertexData { position: (rect.left as _, rect.top as _), uv, color }, + VertexData { position: (rect.right as _, rect.top as _), uv, color }, + VertexData { position: (rect.left as _, rect.bottom as _), uv, color }, + VertexData { position: (rect.right as _, rect.top as _), uv, color }, + VertexData { position: (rect.right as _, rect.bottom as _), uv, color }, + ]; + + if gl.gl.BindSampler.is_loaded() { + gl.gl.BindSampler(0, 0); + } + + gl.gl.BindBuffer(gl::ARRAY_BUFFER, self.imgui_data.vbo); + gl.gl.EnableVertexAttribArray(self.imgui_data.locs.position); + gl.gl.EnableVertexAttribArray(self.imgui_data.locs.uv); + gl.gl.EnableVertexAttribArray(self.imgui_data.locs.color); + + gl.gl.VertexAttribPointer( + self.imgui_data.locs.position, + 2, + gl::FLOAT, + gl::FALSE, + mem::size_of::() as _, + field_offset::(|v| &v.position) as _, + ); + + gl.gl.VertexAttribPointer( + self.imgui_data.locs.uv, + 2, + gl::FLOAT, + gl::FALSE, + mem::size_of::() as _, + field_offset::(|v| &v.uv) as _, + ); + + gl.gl.VertexAttribPointer( + self.imgui_data.locs.color, + 4, + gl::UNSIGNED_BYTE, + gl::TRUE, + mem::size_of::() as _, + field_offset::(|v| &v.color) as _, + ); + + gl.gl.BindTexture(gl::TEXTURE_2D, self.imgui_data.font_texture); + gl.gl.BindBuffer(gl::ARRAY_BUFFER, self.imgui_data.vbo); + gl.gl.BufferData( + gl::ARRAY_BUFFER, + (vertices.len() * mem::size_of::()) as _, + vertices.as_ptr() as _, + gl::STREAM_DRAW, + ); + + gl.gl.DrawArrays(gl::TRIANGLES, 0, vertices.len() as _); + + gl.gl.BindTexture(gl::TEXTURE_2D, 0); + gl.gl.BindBuffer(gl::ARRAY_BUFFER, 0); + + Ok(()) + } else { + Err(RenderError("No OpenGL context available!".to_string())) + } + } + } + + fn draw_outline_rect(&mut self, rect: Rect, line_width: usize, color: Color) -> GameResult { + Ok(()) + } + + fn imgui(&self) -> GameResult<&mut imgui::Context> { + unsafe { Ok(&mut *self.imgui.get()) } + } + + fn render_imgui(&mut self, draw_data: &DrawData) -> GameResult { + // https://github.com/michaelfairley/rust-imgui-opengl-renderer + if let Some((_, gl)) = self.get_context() { + unsafe { + gl.gl.ActiveTexture(gl::TEXTURE0); + gl.gl.Enable(gl::BLEND); + gl.gl.BlendEquation(gl::FUNC_ADD); + gl.gl.BlendFunc(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA); + gl.gl.Disable(gl::CULL_FACE); + gl.gl.Disable(gl::DEPTH_TEST); + gl.gl.Enable(gl::SCISSOR_TEST); + + let imgui = self.imgui()?; + let [width, height] = imgui.io().display_size; + let [scale_w, scale_h] = imgui.io().display_framebuffer_scale; + + let fb_width = width * scale_w; + let fb_height = height * scale_h; + + gl.gl.Viewport(0, 0, fb_width as _, fb_height as _); + let matrix = [ + [2.0 / width as f32, 0.0, 0.0, 0.0], + [0.0, 2.0 / -(height as f32), 0.0, 0.0], + [0.0, 0.0, -1.0, 0.0], + [-1.0, 1.0, 0.0, 1.0], + ]; + gl.gl.UseProgram(self.imgui_data.program); + gl.gl.Uniform1i(self.imgui_data.locs.texture, 0); + gl.gl.UniformMatrix4fv(self.imgui_data.locs.proj_mtx, 1, gl::FALSE, matrix.as_ptr() as _); + + if gl.gl.BindSampler.is_loaded() { + gl.gl.BindSampler(0, 0); + } + + // let vao = return_param(|x| gl.gl.GenVertexArrays(1, x)); + //gl.gl.BindVertexArray(vao); + gl.gl.BindBuffer(gl::ARRAY_BUFFER, self.imgui_data.vbo); + gl.gl.EnableVertexAttribArray(self.imgui_data.locs.position); + gl.gl.EnableVertexAttribArray(self.imgui_data.locs.uv); + gl.gl.EnableVertexAttribArray(self.imgui_data.locs.color); + + gl.gl.VertexAttribPointer( + self.imgui_data.locs.position, + 2, + gl::FLOAT, + gl::FALSE, + mem::size_of::() as _, + field_offset::(|v| &v.pos) as _, + ); + + gl.gl.VertexAttribPointer( + self.imgui_data.locs.uv, + 2, + gl::FLOAT, + gl::FALSE, + mem::size_of::() as _, + field_offset::(|v| &v.uv) as _, + ); + + gl.gl.VertexAttribPointer( + self.imgui_data.locs.color, + 4, + gl::UNSIGNED_BYTE, + gl::TRUE, + mem::size_of::() as _, + field_offset::(|v| &v.col) as _, + ); + + for draw_list in draw_data.draw_lists() { + let vtx_buffer = draw_list.vtx_buffer(); + let idx_buffer = draw_list.idx_buffer(); + + gl.gl.BindBuffer(gl::ARRAY_BUFFER, self.imgui_data.vbo); + gl.gl.BufferData( + gl::ARRAY_BUFFER, + (vtx_buffer.len() * mem::size_of::()) as _, + vtx_buffer.as_ptr() as _, + gl::STREAM_DRAW, + ); + + gl.gl.BindBuffer(gl::ELEMENT_ARRAY_BUFFER, self.imgui_data.ebo); + gl.gl.BufferData( + gl::ELEMENT_ARRAY_BUFFER, + (idx_buffer.len() * mem::size_of::()) as _, + idx_buffer.as_ptr() as _, + gl::STREAM_DRAW, + ); + + for cmd in draw_list.commands() { + match cmd { + DrawCmd::Elements { + count, + cmd_params: DrawCmdParams { clip_rect: [x, y, z, w], texture_id, idx_offset, .. }, + } => { + gl.gl.BindTexture(gl::TEXTURE_2D, texture_id.id() as _); + + gl.gl.Scissor( + (x * scale_w) as GLint, + (fb_height - w * scale_h) as GLint, + ((z - x) * scale_w) as GLint, + ((w - y) * scale_h) as GLint, + ); + + let idx_size = + if mem::size_of::() == 2 { gl::UNSIGNED_SHORT } else { gl::UNSIGNED_INT }; + + gl.gl.DrawElements( + gl::TRIANGLES, + count as _, + idx_size, + (idx_offset * mem::size_of::()) as _, + ); + } + DrawCmd::ResetRenderState => {} + DrawCmd::RawCallback { .. } => {} + } + } + } + + //gl.gl.DeleteVertexArrays(1, &vao); + } + } + + Ok(()) + } +} + +impl Drop for GlutinRenderer { + fn drop(&mut self) { + *self.context_active.as_ref().borrow_mut() = false; + } +} diff --git a/src/framework/backend_sdl2.rs b/src/framework/backend_sdl2.rs index 4ec5f71..9ed2cad 100644 --- a/src/framework/backend_sdl2.rs +++ b/src/framework/backend_sdl2.rs @@ -564,14 +564,8 @@ impl BackendRenderer for SDL2Renderer { Ok(()) } - - fn prepare_frame<'ui>(&self, _ui: &Ui<'ui>) -> GameResult { - Ok(()) - } } -impl SDL2Renderer {} - struct SDL2Texture { refs: Rc>, texture: Option, diff --git a/src/framework/backend_sokol.rs b/src/framework/backend_sokol.rs new file mode 100644 index 0000000..3590c16 --- /dev/null +++ b/src/framework/backend_sokol.rs @@ -0,0 +1,358 @@ +use std::cell::RefCell; +use std::mem; +use std::ops::DerefMut; +use std::time::Duration; + +use imgui::{DrawData, Ui}; +use ndk::input_queue::InputQueue; +use sokol::app::{SApp, SAppDesc, SAppEvent, SAppEventType, SAppKeycode}; +use sokol::gfx::{sg_isvalid, sg_query_backend, sg_shutdown}; + +use crate::common::{Color, Rect}; +use crate::framework::backend::{Backend, BackendEventLoop, BackendRenderer, BackendTexture, SpriteBatchCommand}; +use crate::framework::context::Context; +use crate::framework::error::GameResult; +use crate::framework::graphics::BlendMode; +use crate::framework::keyboard::ScanCode; +use crate::Game; + +pub struct SokolBackend; + +impl SokolBackend { + pub fn new() -> GameResult> { + Ok(Box::new(SokolBackend)) + } +} + +impl Backend for SokolBackend { + fn create_event_loop(&self) -> GameResult> { + Ok(Box::new(SokolEventLoop)) + } +} + +pub struct SokolEventLoop; + +#[cfg(target_os = "android")] +extern "C" { + fn sapp_android_on_create( + activity: *mut ndk_sys::ANativeActivity, + window: *mut ndk_sys::ANativeWindow, + input_queue: *mut ndk_sys::AInputQueue, + ); +} + +impl BackendEventLoop for SokolEventLoop { + fn run(&mut self, game: &mut Game, ctx: &mut Context) { + #[cfg(target_os = "android")] + unsafe { + let activity = ndk_glue::native_activity().ptr().as_ptr(); + let window = match ndk_glue::native_window().as_ref() { + None => std::ptr::null_mut(), + Some(p) => p.ptr().as_ptr(), + }; + let input_queue = match ndk_glue::input_queue().as_ref() { + None => std::ptr::null_mut(), + Some(p) => p.ptr().as_ptr(), + }; + + println!("activity = {:?} window = {:?} input_queue = {:?}", activity, window, input_queue); + + sapp_android_on_create(activity, window, input_queue); + } + + struct Callbacks<'a, 'b> { + ctx: &'a mut Context, + game: &'b mut Game, + }; + + impl<'a, 'b> SApp for Callbacks<'a, 'b> { + fn sapp_init(&mut self) { + let state_ref = unsafe { &mut *self.game.state.get() }; + + self.ctx.screen_size = (640.0, 480.0); + state_ref.handle_resize(self.ctx).unwrap(); + } + + fn sapp_frame(&mut self) { + let state_ref = unsafe { &mut *self.game.state.get() }; + + self.game.update(self.ctx).unwrap(); + + // todo: not really supported on iOS/consoles + if state_ref.shutdown { + log::info!("Shutting down..."); + std::process::exit(0); + return; + } + + if state_ref.next_scene.is_some() { + mem::swap(&mut self.game.scene, &mut state_ref.next_scene); + state_ref.next_scene = None; + self.game.scene.as_mut().unwrap().init(state_ref, self.ctx).unwrap(); + self.game.loops = 0; + state_ref.frame_time = 0.0; + } + + self.game.draw(self.ctx).unwrap(); + } + + fn sapp_cleanup(&mut self) { + if sg_isvalid() { + sg_shutdown(); + } + } + + fn sapp_event(&mut self, event: SAppEvent) { + let state_ref = unsafe { &mut *self.game.state.get() }; + println!("event: {:?}", event.event_type); + + match event.event_type { + SAppEventType::Invalid => {} + SAppEventType::KeyDown => { + if let Some(drs_scan) = conv_scancode(event.key_code) { + state_ref.process_debug_keys(drs_scan); + self.ctx.keyboard_context.set_key(drs_scan, true); + } + } + SAppEventType::KeyUp => { + if let Some(drs_scan) = conv_scancode(event.key_code) { + self.ctx.keyboard_context.set_key(drs_scan, false); + } + } + SAppEventType::Char => {} + SAppEventType::MouseDown => {} + SAppEventType::MouseUp => {} + SAppEventType::MouseScroll => {} + SAppEventType::MouseMove => {} + SAppEventType::MouseEnter => {} + SAppEventType::MouseLeave => {} + SAppEventType::TouchesBegan => {} + SAppEventType::TouchesMoved => {} + SAppEventType::TouchesEnded => {} + SAppEventType::TouchesCancelled => {} + SAppEventType::Resized => {} + SAppEventType::Iconified => {} + SAppEventType::Restored => {} + SAppEventType::Suspended => {} + SAppEventType::Resumed => {} + SAppEventType::UpdateCursor => {} + SAppEventType::QuitRequested => { + state_ref.shutdown(); + } + } + } + } + + sokol::app::sapp_run( + Callbacks { ctx: unsafe { std::mem::transmute(ctx) }, game: unsafe { std::mem::transmute(game) } }, + SAppDesc { + width: 640, + height: 480, + window_title: "doukutsu-rs".to_string(), + ios_keyboard_resizes_canvas: false, + ..Default::default() + }, + ); + + loop { + std::thread::sleep(Duration::from_millis(10)) + } + } + + fn new_renderer(&self) -> GameResult> { + let mut imgui = imgui::Context::create(); + imgui.io_mut().display_size = [640.0, 480.0]; + imgui.fonts().build_alpha8_texture(); + + log::info!("Using Sokol backend: {:?}", sg_query_backend()); + + Ok(Box::new(SokolRenderer(RefCell::new(imgui)))) + } +} + +pub struct NullTexture(u16, u16); + +impl BackendTexture for NullTexture { + fn dimensions(&self) -> (u16, u16) { + (self.0, self.1) + } + + fn add(&mut self, command: SpriteBatchCommand) {} + + fn clear(&mut self) {} + + fn draw(&mut self) -> GameResult<()> { + Ok(()) + } +} + +pub struct SokolRenderer(RefCell); + +impl BackendRenderer for SokolRenderer { + fn clear(&mut self, color: Color) {} + + fn present(&mut self) -> GameResult { + Ok(()) + } + + fn create_texture_mutable(&mut self, width: u16, height: u16) -> GameResult> { + Ok(Box::new(NullTexture(width, height))) + } + + fn create_texture(&mut self, width: u16, height: u16, data: &[u8]) -> GameResult> { + Ok(Box::new(NullTexture(width, height))) + } + + fn set_blend_mode(&mut self, blend: BlendMode) -> GameResult { + Ok(()) + } + + fn set_render_target(&mut self, texture: Option<&Box>) -> GameResult { + Ok(()) + } + + fn draw_rect(&mut self, rect: Rect, color: Color) -> GameResult { + Ok(()) + } + + fn draw_outline_rect(&mut self, rect: Rect, line_width: usize, color: Color) -> GameResult { + Ok(()) + } + + fn imgui(&self) -> GameResult<&mut imgui::Context> { + unsafe { Ok(&mut *self.0.as_ptr()) } + } + + fn render_imgui(&mut self, draw_data: &DrawData) -> GameResult { + Ok(()) + } + + fn prepare_frame<'ui>(&self, ui: &Ui<'ui>) -> GameResult { + Ok(()) + } +} + +fn conv_scancode(code: SAppKeycode) -> Option { + match code { + SAppKeycode::KeySpace => Some(ScanCode::Space), + SAppKeycode::KeyApostrophe => Some(ScanCode::Apostrophe), + SAppKeycode::KeyComma => Some(ScanCode::Comma), + SAppKeycode::KeyMinus => Some(ScanCode::Minus), + SAppKeycode::KeyPeriod => Some(ScanCode::Period), + SAppKeycode::KeySlash => Some(ScanCode::Slash), + SAppKeycode::Key0 => Some(ScanCode::Key0), + SAppKeycode::Key1 => Some(ScanCode::Key1), + SAppKeycode::Key2 => Some(ScanCode::Key2), + SAppKeycode::Key3 => Some(ScanCode::Key3), + SAppKeycode::Key4 => Some(ScanCode::Key4), + SAppKeycode::Key5 => Some(ScanCode::Key5), + SAppKeycode::Key6 => Some(ScanCode::Key6), + SAppKeycode::Key7 => Some(ScanCode::Key7), + SAppKeycode::Key8 => Some(ScanCode::Key8), + SAppKeycode::Key9 => Some(ScanCode::Key9), + SAppKeycode::KeySemicolon => Some(ScanCode::Semicolon), + SAppKeycode::KeyEqual => Some(ScanCode::Equals), + SAppKeycode::KeyA => Some(ScanCode::A), + SAppKeycode::KeyB => Some(ScanCode::B), + SAppKeycode::KeyC => Some(ScanCode::C), + SAppKeycode::KeyD => Some(ScanCode::D), + SAppKeycode::KeyE => Some(ScanCode::E), + SAppKeycode::KeyF => Some(ScanCode::F), + SAppKeycode::KeyG => Some(ScanCode::G), + SAppKeycode::KeyH => Some(ScanCode::H), + SAppKeycode::KeyI => Some(ScanCode::I), + SAppKeycode::KeyJ => Some(ScanCode::J), + SAppKeycode::KeyK => Some(ScanCode::K), + SAppKeycode::KeyL => Some(ScanCode::L), + SAppKeycode::KeyM => Some(ScanCode::M), + SAppKeycode::KeyN => Some(ScanCode::N), + SAppKeycode::KeyO => Some(ScanCode::O), + SAppKeycode::KeyP => Some(ScanCode::P), + SAppKeycode::KeyQ => Some(ScanCode::Q), + SAppKeycode::KeyR => Some(ScanCode::R), + SAppKeycode::KeyS => Some(ScanCode::S), + SAppKeycode::KeyT => Some(ScanCode::T), + SAppKeycode::KeyU => Some(ScanCode::U), + SAppKeycode::KeyV => Some(ScanCode::V), + SAppKeycode::KeyW => Some(ScanCode::W), + SAppKeycode::KeyX => Some(ScanCode::X), + SAppKeycode::KeyY => Some(ScanCode::Y), + SAppKeycode::KeyZ => Some(ScanCode::Z), + SAppKeycode::KeyLeftBracket => Some(ScanCode::LBracket), + SAppKeycode::KeyBackslash => Some(ScanCode::Backslash), + SAppKeycode::KeyRightBracket => Some(ScanCode::RBracket), + SAppKeycode::KeyGraveAccent => Some(ScanCode::Grave), + SAppKeycode::KeyWorld1 => Some(ScanCode::AbntC1), + SAppKeycode::KeyWorld2 => Some(ScanCode::AbntC2), + SAppKeycode::KeyEscape => Some(ScanCode::Escape), + SAppKeycode::KeyEnter => Some(ScanCode::Return), + SAppKeycode::KeyTab => Some(ScanCode::Tab), + SAppKeycode::KeyBackspace => Some(ScanCode::Backspace), + SAppKeycode::KeyInsert => Some(ScanCode::Insert), + SAppKeycode::KeyDelete => Some(ScanCode::Delete), + SAppKeycode::KeyRight => Some(ScanCode::Right), + SAppKeycode::KeyLeft => Some(ScanCode::Left), + SAppKeycode::KeyDown => Some(ScanCode::Down), + SAppKeycode::KeyUp => Some(ScanCode::Up), + SAppKeycode::KeyPageUp => Some(ScanCode::PageUp), + SAppKeycode::KeyPageDown => Some(ScanCode::PageDown), + SAppKeycode::KeyHome => Some(ScanCode::Home), + SAppKeycode::KeyEnd => Some(ScanCode::End), + SAppKeycode::KeyCapsLock => Some(ScanCode::Capslock), + SAppKeycode::KeyScrollLock => Some(ScanCode::Scrolllock), + SAppKeycode::KeyNumLock => Some(ScanCode::Numlock), + SAppKeycode::KeyPrintScreen => Some(ScanCode::Sysrq), + SAppKeycode::KeyPause => Some(ScanCode::Pause), + SAppKeycode::KeyF1 => Some(ScanCode::F1), + SAppKeycode::KeyF2 => Some(ScanCode::F2), + SAppKeycode::KeyF3 => Some(ScanCode::F3), + SAppKeycode::KeyF4 => Some(ScanCode::F4), + SAppKeycode::KeyF5 => Some(ScanCode::F5), + SAppKeycode::KeyF6 => Some(ScanCode::F6), + SAppKeycode::KeyF7 => Some(ScanCode::F7), + SAppKeycode::KeyF8 => Some(ScanCode::F8), + SAppKeycode::KeyF9 => Some(ScanCode::F9), + SAppKeycode::KeyF10 => Some(ScanCode::F10), + SAppKeycode::KeyF11 => Some(ScanCode::F11), + SAppKeycode::KeyF12 => Some(ScanCode::F12), + SAppKeycode::KeyF13 => Some(ScanCode::F13), + SAppKeycode::KeyF14 => Some(ScanCode::F14), + SAppKeycode::KeyF15 => Some(ScanCode::F15), + SAppKeycode::KeyF16 => Some(ScanCode::F16), + SAppKeycode::KeyF17 => Some(ScanCode::F17), + SAppKeycode::KeyF18 => Some(ScanCode::F18), + SAppKeycode::KeyF19 => Some(ScanCode::F19), + SAppKeycode::KeyF20 => Some(ScanCode::F20), + SAppKeycode::KeyF21 => Some(ScanCode::F21), + SAppKeycode::KeyF22 => Some(ScanCode::F22), + SAppKeycode::KeyF23 => Some(ScanCode::F23), + SAppKeycode::KeyF24 => Some(ScanCode::F24), + SAppKeycode::KeyKP0 => Some(ScanCode::Numpad0), + SAppKeycode::KeyKP1 => Some(ScanCode::Numpad1), + SAppKeycode::KeyKP2 => Some(ScanCode::Numpad2), + SAppKeycode::KeyKP3 => Some(ScanCode::Numpad3), + SAppKeycode::KeyKP4 => Some(ScanCode::Numpad4), + SAppKeycode::KeyKP5 => Some(ScanCode::Numpad5), + SAppKeycode::KeyKP6 => Some(ScanCode::Numpad6), + SAppKeycode::KeyKP7 => Some(ScanCode::Numpad7), + SAppKeycode::KeyKP8 => Some(ScanCode::Numpad8), + SAppKeycode::KeyKP9 => Some(ScanCode::Numpad9), + SAppKeycode::KeyKPDecimal => Some(ScanCode::NumpadDecimal), + SAppKeycode::KeyKPDivide => Some(ScanCode::NumpadDivide), + SAppKeycode::KeyKPMultiply => Some(ScanCode::NumpadMultiply), + SAppKeycode::KeyKPSubtract => Some(ScanCode::NumpadSubtract), + SAppKeycode::KeyKPAdd => Some(ScanCode::NumpadAdd), + SAppKeycode::KeyKPEnter => Some(ScanCode::NumpadEnter), + SAppKeycode::KeyKPEqual => Some(ScanCode::NumpadEquals), + SAppKeycode::KeyLeftShift => Some(ScanCode::LShift), + SAppKeycode::KeyLeftControl => Some(ScanCode::LControl), + SAppKeycode::KeyLeftAlt => Some(ScanCode::LAlt), + SAppKeycode::KeyLeftSuper => Some(ScanCode::LWin), + SAppKeycode::KeyRightShift => Some(ScanCode::RShift), + SAppKeycode::KeyRightControl => Some(ScanCode::RControl), + SAppKeycode::KeyRightAlt => Some(ScanCode::RAlt), + SAppKeycode::KeyRightSuper => Some(ScanCode::RWin), + SAppKeycode::KeyMenu => Some(ScanCode::Menu), + _ => None, + } +} diff --git a/src/framework/context.rs b/src/framework/context.rs index 3a2688d..158d4fd 100644 --- a/src/framework/context.rs +++ b/src/framework/context.rs @@ -1,14 +1,15 @@ use crate::framework::backend::{init_backend, BackendRenderer}; use crate::framework::error::GameResult; use crate::framework::filesystem::Filesystem; -use crate::Game; use crate::framework::keyboard::KeyboardContext; +use crate::Game; pub struct Context { pub(crate) filesystem: Filesystem, pub(crate) renderer: Option>, pub(crate) keyboard_context: KeyboardContext, pub(crate) screen_size: (f32, f32), + pub(crate) screen_insets: (f32, f32, f32, f32), } impl Context { @@ -18,6 +19,7 @@ impl Context { renderer: None, keyboard_context: KeyboardContext::new(), screen_size: (320.0, 240.0), + screen_insets: (0.0, 0.0, 0.0, 0.0), } } diff --git a/src/framework/gl.rs b/src/framework/gl.rs new file mode 100644 index 0000000..56f6e20 --- /dev/null +++ b/src/framework/gl.rs @@ -0,0 +1,1965 @@ + + mod __gl_imports { + pub use std::mem; + pub use std::marker::Send; + pub use std::os::raw; + } + + + pub mod types { + #![allow(non_camel_case_types, non_snake_case, dead_code, missing_copy_implementations)] + +// Common types from OpenGL 1.1 +pub type GLenum = super::__gl_imports::raw::c_uint; +pub type GLboolean = super::__gl_imports::raw::c_uchar; +pub type GLbitfield = super::__gl_imports::raw::c_uint; +pub type GLvoid = super::__gl_imports::raw::c_void; +pub type GLbyte = super::__gl_imports::raw::c_char; +pub type GLshort = super::__gl_imports::raw::c_short; +pub type GLint = super::__gl_imports::raw::c_int; +pub type GLclampx = super::__gl_imports::raw::c_int; +pub type GLubyte = super::__gl_imports::raw::c_uchar; +pub type GLushort = super::__gl_imports::raw::c_ushort; +pub type GLuint = super::__gl_imports::raw::c_uint; +pub type GLsizei = super::__gl_imports::raw::c_int; +pub type GLfloat = super::__gl_imports::raw::c_float; +pub type GLclampf = super::__gl_imports::raw::c_float; +pub type GLdouble = super::__gl_imports::raw::c_double; +pub type GLclampd = super::__gl_imports::raw::c_double; +pub type GLeglImageOES = *const super::__gl_imports::raw::c_void; +pub type GLchar = super::__gl_imports::raw::c_char; +pub type GLcharARB = super::__gl_imports::raw::c_char; + +#[cfg(target_os = "macos")] +pub type GLhandleARB = *const super::__gl_imports::raw::c_void; +#[cfg(not(target_os = "macos"))] +pub type GLhandleARB = super::__gl_imports::raw::c_uint; + +pub type GLhalfARB = super::__gl_imports::raw::c_ushort; +pub type GLhalf = super::__gl_imports::raw::c_ushort; + +// Must be 32 bits +pub type GLfixed = GLint; + +pub type GLintptr = isize; +pub type GLsizeiptr = isize; +pub type GLint64 = i64; +pub type GLuint64 = u64; +pub type GLintptrARB = isize; +pub type GLsizeiptrARB = isize; +pub type GLint64EXT = i64; +pub type GLuint64EXT = u64; + +pub enum __GLsync {} +pub type GLsync = *const __GLsync; + +// compatible with OpenCL cl_context +pub enum _cl_context {} +pub enum _cl_event {} + +pub type GLDEBUGPROC = Option; +pub type GLDEBUGPROCARB = Option; +pub type GLDEBUGPROCKHR = Option; + +// GLES 1 types +// "pub type GLclampx = i32;", + +// GLES 1/2 types (tagged for GLES 1) +// "pub type GLbyte = i8;", +// "pub type GLubyte = u8;", +// "pub type GLfloat = GLfloat;", +// "pub type GLclampf = GLfloat;", +// "pub type GLfixed = i32;", +// "pub type GLint64 = i64;", +// "pub type GLuint64 = u64;", +// "pub type GLintptr = intptr_t;", +// "pub type GLsizeiptr = ssize_t;", + +// GLES 1/2 types (tagged for GLES 2 - attribute syntax is limited) +// "pub type GLbyte = i8;", +// "pub type GLubyte = u8;", +// "pub type GLfloat = GLfloat;", +// "pub type GLclampf = GLfloat;", +// "pub type GLfixed = i32;", +// "pub type GLint64 = i64;", +// "pub type GLuint64 = u64;", +// "pub type GLint64EXT = i64;", +// "pub type GLuint64EXT = u64;", +// "pub type GLintptr = intptr_t;", +// "pub type GLsizeiptr = ssize_t;", + +// GLES 2 types (none currently) + +// Vendor extension types +pub type GLDEBUGPROCAMD = Option; +pub type GLhalfNV = super::__gl_imports::raw::c_ushort; +pub type GLvdpauSurfaceNV = GLintptr; + +} +#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_ATTRIBUTES: types::GLenum = 0x8B89; +#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_ATTRIBUTE_MAX_LENGTH: types::GLenum = 0x8B8A; +#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_TEXTURE: types::GLenum = 0x84E0; +#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_UNIFORMS: types::GLenum = 0x8B86; +#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_UNIFORM_BLOCKS: types::GLenum = 0x8A36; +#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: types::GLenum = 0x8A35; +#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_UNIFORM_MAX_LENGTH: types::GLenum = 0x8B87; +#[allow(dead_code, non_upper_case_globals)] pub const ALIASED_LINE_WIDTH_RANGE: types::GLenum = 0x846E; +#[allow(dead_code, non_upper_case_globals)] pub const ALIASED_POINT_SIZE_RANGE: types::GLenum = 0x846D; +#[allow(dead_code, non_upper_case_globals)] pub const ALPHA: types::GLenum = 0x1906; +#[allow(dead_code, non_upper_case_globals)] pub const ALPHA_BITS: types::GLenum = 0x0D55; +#[allow(dead_code, non_upper_case_globals)] pub const ALREADY_SIGNALED: types::GLenum = 0x911A; +#[allow(dead_code, non_upper_case_globals)] pub const ALWAYS: types::GLenum = 0x0207; +#[allow(dead_code, non_upper_case_globals)] pub const ANY_SAMPLES_PASSED: types::GLenum = 0x8C2F; +#[allow(dead_code, non_upper_case_globals)] pub const ANY_SAMPLES_PASSED_CONSERVATIVE: types::GLenum = 0x8D6A; +#[allow(dead_code, non_upper_case_globals)] pub const ARRAY_BUFFER: types::GLenum = 0x8892; +#[allow(dead_code, non_upper_case_globals)] pub const ARRAY_BUFFER_BINDING: types::GLenum = 0x8894; +#[allow(dead_code, non_upper_case_globals)] pub const ATTACHED_SHADERS: types::GLenum = 0x8B85; +#[allow(dead_code, non_upper_case_globals)] pub const BACK: types::GLenum = 0x0405; +#[allow(dead_code, non_upper_case_globals)] pub const BLEND: types::GLenum = 0x0BE2; +#[allow(dead_code, non_upper_case_globals)] pub const BLEND_COLOR: types::GLenum = 0x8005; +#[allow(dead_code, non_upper_case_globals)] pub const BLEND_DST_ALPHA: types::GLenum = 0x80CA; +#[allow(dead_code, non_upper_case_globals)] pub const BLEND_DST_RGB: types::GLenum = 0x80C8; +#[allow(dead_code, non_upper_case_globals)] pub const BLEND_EQUATION: types::GLenum = 0x8009; +#[allow(dead_code, non_upper_case_globals)] pub const BLEND_EQUATION_ALPHA: types::GLenum = 0x883D; +#[allow(dead_code, non_upper_case_globals)] pub const BLEND_EQUATION_RGB: types::GLenum = 0x8009; +#[allow(dead_code, non_upper_case_globals)] pub const BLEND_SRC_ALPHA: types::GLenum = 0x80CB; +#[allow(dead_code, non_upper_case_globals)] pub const BLEND_SRC_RGB: types::GLenum = 0x80C9; +#[allow(dead_code, non_upper_case_globals)] pub const BLUE: types::GLenum = 0x1905; +#[allow(dead_code, non_upper_case_globals)] pub const BLUE_BITS: types::GLenum = 0x0D54; +#[allow(dead_code, non_upper_case_globals)] pub const BOOL: types::GLenum = 0x8B56; +#[allow(dead_code, non_upper_case_globals)] pub const BOOL_VEC2: types::GLenum = 0x8B57; +#[allow(dead_code, non_upper_case_globals)] pub const BOOL_VEC3: types::GLenum = 0x8B58; +#[allow(dead_code, non_upper_case_globals)] pub const BOOL_VEC4: types::GLenum = 0x8B59; +#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_ACCESS_FLAGS: types::GLenum = 0x911F; +#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_MAPPED: types::GLenum = 0x88BC; +#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_MAP_LENGTH: types::GLenum = 0x9120; +#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_MAP_OFFSET: types::GLenum = 0x9121; +#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_MAP_POINTER: types::GLenum = 0x88BD; +#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_SIZE: types::GLenum = 0x8764; +#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_USAGE: types::GLenum = 0x8765; +#[allow(dead_code, non_upper_case_globals)] pub const BYTE: types::GLenum = 0x1400; +#[allow(dead_code, non_upper_case_globals)] pub const CCW: types::GLenum = 0x0901; +#[allow(dead_code, non_upper_case_globals)] pub const CLAMP_TO_EDGE: types::GLenum = 0x812F; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR: types::GLenum = 0x1800; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT0: types::GLenum = 0x8CE0; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT1: types::GLenum = 0x8CE1; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT10: types::GLenum = 0x8CEA; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT11: types::GLenum = 0x8CEB; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT12: types::GLenum = 0x8CEC; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT13: types::GLenum = 0x8CED; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT14: types::GLenum = 0x8CEE; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT15: types::GLenum = 0x8CEF; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT16: types::GLenum = 0x8CF0; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT17: types::GLenum = 0x8CF1; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT18: types::GLenum = 0x8CF2; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT19: types::GLenum = 0x8CF3; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT2: types::GLenum = 0x8CE2; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT20: types::GLenum = 0x8CF4; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT21: types::GLenum = 0x8CF5; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT22: types::GLenum = 0x8CF6; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT23: types::GLenum = 0x8CF7; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT24: types::GLenum = 0x8CF8; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT25: types::GLenum = 0x8CF9; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT26: types::GLenum = 0x8CFA; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT27: types::GLenum = 0x8CFB; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT28: types::GLenum = 0x8CFC; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT29: types::GLenum = 0x8CFD; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT3: types::GLenum = 0x8CE3; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT30: types::GLenum = 0x8CFE; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT31: types::GLenum = 0x8CFF; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT4: types::GLenum = 0x8CE4; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT5: types::GLenum = 0x8CE5; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT6: types::GLenum = 0x8CE6; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT7: types::GLenum = 0x8CE7; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT8: types::GLenum = 0x8CE8; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT9: types::GLenum = 0x8CE9; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_BUFFER_BIT: types::GLenum = 0x00004000; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_CLEAR_VALUE: types::GLenum = 0x0C22; +#[allow(dead_code, non_upper_case_globals)] pub const COLOR_WRITEMASK: types::GLenum = 0x0C23; +#[allow(dead_code, non_upper_case_globals)] pub const COMPARE_REF_TO_TEXTURE: types::GLenum = 0x884E; +#[allow(dead_code, non_upper_case_globals)] pub const COMPILE_STATUS: types::GLenum = 0x8B81; +#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_R11_EAC: types::GLenum = 0x9270; +#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_RG11_EAC: types::GLenum = 0x9272; +#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_RGB8_ETC2: types::GLenum = 0x9274; +#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: types::GLenum = 0x9276; +#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_RGBA8_ETC2_EAC: types::GLenum = 0x9278; +#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_SIGNED_R11_EAC: types::GLenum = 0x9271; +#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_SIGNED_RG11_EAC: types::GLenum = 0x9273; +#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: types::GLenum = 0x9279; +#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_SRGB8_ETC2: types::GLenum = 0x9275; +#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: types::GLenum = 0x9277; +#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_TEXTURE_FORMATS: types::GLenum = 0x86A3; +#[allow(dead_code, non_upper_case_globals)] pub const CONDITION_SATISFIED: types::GLenum = 0x911C; +#[allow(dead_code, non_upper_case_globals)] pub const CONSTANT_ALPHA: types::GLenum = 0x8003; +#[allow(dead_code, non_upper_case_globals)] pub const CONSTANT_COLOR: types::GLenum = 0x8001; +#[allow(dead_code, non_upper_case_globals)] pub const COPY_READ_BUFFER: types::GLenum = 0x8F36; +#[allow(dead_code, non_upper_case_globals)] pub const COPY_READ_BUFFER_BINDING: types::GLenum = 0x8F36; +#[allow(dead_code, non_upper_case_globals)] pub const COPY_WRITE_BUFFER: types::GLenum = 0x8F37; +#[allow(dead_code, non_upper_case_globals)] pub const COPY_WRITE_BUFFER_BINDING: types::GLenum = 0x8F37; +#[allow(dead_code, non_upper_case_globals)] pub const CULL_FACE: types::GLenum = 0x0B44; +#[allow(dead_code, non_upper_case_globals)] pub const CULL_FACE_MODE: types::GLenum = 0x0B45; +#[allow(dead_code, non_upper_case_globals)] pub const CURRENT_PROGRAM: types::GLenum = 0x8B8D; +#[allow(dead_code, non_upper_case_globals)] pub const CURRENT_QUERY: types::GLenum = 0x8865; +#[allow(dead_code, non_upper_case_globals)] pub const CURRENT_VERTEX_ATTRIB: types::GLenum = 0x8626; +#[allow(dead_code, non_upper_case_globals)] pub const CW: types::GLenum = 0x0900; +#[allow(dead_code, non_upper_case_globals)] pub const DECR: types::GLenum = 0x1E03; +#[allow(dead_code, non_upper_case_globals)] pub const DECR_WRAP: types::GLenum = 0x8508; +#[allow(dead_code, non_upper_case_globals)] pub const DELETE_STATUS: types::GLenum = 0x8B80; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH: types::GLenum = 0x1801; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH24_STENCIL8: types::GLenum = 0x88F0; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH32F_STENCIL8: types::GLenum = 0x8CAD; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_ATTACHMENT: types::GLenum = 0x8D00; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_BITS: types::GLenum = 0x0D56; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_BUFFER_BIT: types::GLenum = 0x00000100; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_CLEAR_VALUE: types::GLenum = 0x0B73; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_COMPONENT: types::GLenum = 0x1902; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_COMPONENT16: types::GLenum = 0x81A5; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_COMPONENT24: types::GLenum = 0x81A6; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_COMPONENT32F: types::GLenum = 0x8CAC; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_FUNC: types::GLenum = 0x0B74; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_RANGE: types::GLenum = 0x0B70; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_STENCIL: types::GLenum = 0x84F9; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_STENCIL_ATTACHMENT: types::GLenum = 0x821A; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_TEST: types::GLenum = 0x0B71; +#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_WRITEMASK: types::GLenum = 0x0B72; +#[allow(dead_code, non_upper_case_globals)] pub const DITHER: types::GLenum = 0x0BD0; +#[allow(dead_code, non_upper_case_globals)] pub const DONT_CARE: types::GLenum = 0x1100; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER0: types::GLenum = 0x8825; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER1: types::GLenum = 0x8826; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER10: types::GLenum = 0x882F; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER11: types::GLenum = 0x8830; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER12: types::GLenum = 0x8831; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER13: types::GLenum = 0x8832; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER14: types::GLenum = 0x8833; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER15: types::GLenum = 0x8834; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER2: types::GLenum = 0x8827; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER3: types::GLenum = 0x8828; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER4: types::GLenum = 0x8829; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER5: types::GLenum = 0x882A; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER6: types::GLenum = 0x882B; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER7: types::GLenum = 0x882C; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER8: types::GLenum = 0x882D; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER9: types::GLenum = 0x882E; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_FRAMEBUFFER: types::GLenum = 0x8CA9; +#[allow(dead_code, non_upper_case_globals)] pub const DRAW_FRAMEBUFFER_BINDING: types::GLenum = 0x8CA6; +#[allow(dead_code, non_upper_case_globals)] pub const DST_ALPHA: types::GLenum = 0x0304; +#[allow(dead_code, non_upper_case_globals)] pub const DST_COLOR: types::GLenum = 0x0306; +#[allow(dead_code, non_upper_case_globals)] pub const DYNAMIC_COPY: types::GLenum = 0x88EA; +#[allow(dead_code, non_upper_case_globals)] pub const DYNAMIC_DRAW: types::GLenum = 0x88E8; +#[allow(dead_code, non_upper_case_globals)] pub const DYNAMIC_READ: types::GLenum = 0x88E9; +#[allow(dead_code, non_upper_case_globals)] pub const ELEMENT_ARRAY_BUFFER: types::GLenum = 0x8893; +#[allow(dead_code, non_upper_case_globals)] pub const ELEMENT_ARRAY_BUFFER_BINDING: types::GLenum = 0x8895; +#[allow(dead_code, non_upper_case_globals)] pub const EQUAL: types::GLenum = 0x0202; +#[allow(dead_code, non_upper_case_globals)] pub const EXTENSIONS: types::GLenum = 0x1F03; +#[allow(dead_code, non_upper_case_globals)] pub const FALSE: types::GLboolean = 0; +#[allow(dead_code, non_upper_case_globals)] pub const FASTEST: types::GLenum = 0x1101; +#[allow(dead_code, non_upper_case_globals)] pub const FIXED: types::GLenum = 0x140C; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT: types::GLenum = 0x1406; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_32_UNSIGNED_INT_24_8_REV: types::GLenum = 0x8DAD; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT2: types::GLenum = 0x8B5A; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT2x3: types::GLenum = 0x8B65; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT2x4: types::GLenum = 0x8B66; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT3: types::GLenum = 0x8B5B; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT3x2: types::GLenum = 0x8B67; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT3x4: types::GLenum = 0x8B68; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT4: types::GLenum = 0x8B5C; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT4x2: types::GLenum = 0x8B69; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT4x3: types::GLenum = 0x8B6A; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_VEC2: types::GLenum = 0x8B50; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_VEC3: types::GLenum = 0x8B51; +#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_VEC4: types::GLenum = 0x8B52; +#[allow(dead_code, non_upper_case_globals)] pub const FRAGMENT_SHADER: types::GLenum = 0x8B30; +#[allow(dead_code, non_upper_case_globals)] pub const FRAGMENT_SHADER_DERIVATIVE_HINT: types::GLenum = 0x8B8B; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER: types::GLenum = 0x8D40; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: types::GLenum = 0x8215; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: types::GLenum = 0x8214; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: types::GLenum = 0x8210; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: types::GLenum = 0x8211; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: types::GLenum = 0x8216; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: types::GLenum = 0x8213; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: types::GLenum = 0x8CD1; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: types::GLenum = 0x8CD0; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_RED_SIZE: types::GLenum = 0x8212; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: types::GLenum = 0x8217; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: types::GLenum = 0x8CD3; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: types::GLenum = 0x8CD4; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: types::GLenum = 0x8CD2; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_BINDING: types::GLenum = 0x8CA6; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_COMPLETE: types::GLenum = 0x8CD5; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_DEFAULT: types::GLenum = 0x8218; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_INCOMPLETE_ATTACHMENT: types::GLenum = 0x8CD6; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_INCOMPLETE_DIMENSIONS: types::GLenum = 0x8CD9; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: types::GLenum = 0x8CD7; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: types::GLenum = 0x8D56; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_UNDEFINED: types::GLenum = 0x8219; +#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_UNSUPPORTED: types::GLenum = 0x8CDD; +#[allow(dead_code, non_upper_case_globals)] pub const FRONT: types::GLenum = 0x0404; +#[allow(dead_code, non_upper_case_globals)] pub const FRONT_AND_BACK: types::GLenum = 0x0408; +#[allow(dead_code, non_upper_case_globals)] pub const FRONT_FACE: types::GLenum = 0x0B46; +#[allow(dead_code, non_upper_case_globals)] pub const FUNC_ADD: types::GLenum = 0x8006; +#[allow(dead_code, non_upper_case_globals)] pub const FUNC_REVERSE_SUBTRACT: types::GLenum = 0x800B; +#[allow(dead_code, non_upper_case_globals)] pub const FUNC_SUBTRACT: types::GLenum = 0x800A; +#[allow(dead_code, non_upper_case_globals)] pub const GENERATE_MIPMAP_HINT: types::GLenum = 0x8192; +#[allow(dead_code, non_upper_case_globals)] pub const GEQUAL: types::GLenum = 0x0206; +#[allow(dead_code, non_upper_case_globals)] pub const GREATER: types::GLenum = 0x0204; +#[allow(dead_code, non_upper_case_globals)] pub const GREEN: types::GLenum = 0x1904; +#[allow(dead_code, non_upper_case_globals)] pub const GREEN_BITS: types::GLenum = 0x0D53; +#[allow(dead_code, non_upper_case_globals)] pub const HALF_FLOAT: types::GLenum = 0x140B; +#[allow(dead_code, non_upper_case_globals)] pub const HIGH_FLOAT: types::GLenum = 0x8DF2; +#[allow(dead_code, non_upper_case_globals)] pub const HIGH_INT: types::GLenum = 0x8DF5; +#[allow(dead_code, non_upper_case_globals)] pub const IMPLEMENTATION_COLOR_READ_FORMAT: types::GLenum = 0x8B9B; +#[allow(dead_code, non_upper_case_globals)] pub const IMPLEMENTATION_COLOR_READ_TYPE: types::GLenum = 0x8B9A; +#[allow(dead_code, non_upper_case_globals)] pub const INCR: types::GLenum = 0x1E02; +#[allow(dead_code, non_upper_case_globals)] pub const INCR_WRAP: types::GLenum = 0x8507; +#[allow(dead_code, non_upper_case_globals)] pub const INFO_LOG_LENGTH: types::GLenum = 0x8B84; +#[allow(dead_code, non_upper_case_globals)] pub const INT: types::GLenum = 0x1404; +#[allow(dead_code, non_upper_case_globals)] pub const INTERLEAVED_ATTRIBS: types::GLenum = 0x8C8C; +#[allow(dead_code, non_upper_case_globals)] pub const INT_2_10_10_10_REV: types::GLenum = 0x8D9F; +#[allow(dead_code, non_upper_case_globals)] pub const INT_SAMPLER_2D: types::GLenum = 0x8DCA; +#[allow(dead_code, non_upper_case_globals)] pub const INT_SAMPLER_2D_ARRAY: types::GLenum = 0x8DCF; +#[allow(dead_code, non_upper_case_globals)] pub const INT_SAMPLER_3D: types::GLenum = 0x8DCB; +#[allow(dead_code, non_upper_case_globals)] pub const INT_SAMPLER_CUBE: types::GLenum = 0x8DCC; +#[allow(dead_code, non_upper_case_globals)] pub const INT_VEC2: types::GLenum = 0x8B53; +#[allow(dead_code, non_upper_case_globals)] pub const INT_VEC3: types::GLenum = 0x8B54; +#[allow(dead_code, non_upper_case_globals)] pub const INT_VEC4: types::GLenum = 0x8B55; +#[allow(dead_code, non_upper_case_globals)] pub const INVALID_ENUM: types::GLenum = 0x0500; +#[allow(dead_code, non_upper_case_globals)] pub const INVALID_FRAMEBUFFER_OPERATION: types::GLenum = 0x0506; +#[allow(dead_code, non_upper_case_globals)] pub const INVALID_INDEX: types::GLuint = 0xFFFFFFFF; +#[allow(dead_code, non_upper_case_globals)] pub const INVALID_OPERATION: types::GLenum = 0x0502; +#[allow(dead_code, non_upper_case_globals)] pub const INVALID_VALUE: types::GLenum = 0x0501; +#[allow(dead_code, non_upper_case_globals)] pub const INVERT: types::GLenum = 0x150A; +#[allow(dead_code, non_upper_case_globals)] pub const KEEP: types::GLenum = 0x1E00; +#[allow(dead_code, non_upper_case_globals)] pub const LEQUAL: types::GLenum = 0x0203; +#[allow(dead_code, non_upper_case_globals)] pub const LESS: types::GLenum = 0x0201; +#[allow(dead_code, non_upper_case_globals)] pub const LINEAR: types::GLenum = 0x2601; +#[allow(dead_code, non_upper_case_globals)] pub const LINEAR_MIPMAP_LINEAR: types::GLenum = 0x2703; +#[allow(dead_code, non_upper_case_globals)] pub const LINEAR_MIPMAP_NEAREST: types::GLenum = 0x2701; +#[allow(dead_code, non_upper_case_globals)] pub const LINES: types::GLenum = 0x0001; +#[allow(dead_code, non_upper_case_globals)] pub const LINE_LOOP: types::GLenum = 0x0002; +#[allow(dead_code, non_upper_case_globals)] pub const LINE_STRIP: types::GLenum = 0x0003; +#[allow(dead_code, non_upper_case_globals)] pub const LINE_WIDTH: types::GLenum = 0x0B21; +#[allow(dead_code, non_upper_case_globals)] pub const LINK_STATUS: types::GLenum = 0x8B82; +#[allow(dead_code, non_upper_case_globals)] pub const LOW_FLOAT: types::GLenum = 0x8DF0; +#[allow(dead_code, non_upper_case_globals)] pub const LOW_INT: types::GLenum = 0x8DF3; +#[allow(dead_code, non_upper_case_globals)] pub const LUMINANCE: types::GLenum = 0x1909; +#[allow(dead_code, non_upper_case_globals)] pub const LUMINANCE_ALPHA: types::GLenum = 0x190A; +#[allow(dead_code, non_upper_case_globals)] pub const MAJOR_VERSION: types::GLenum = 0x821B; +#[allow(dead_code, non_upper_case_globals)] pub const MAP_FLUSH_EXPLICIT_BIT: types::GLenum = 0x0010; +#[allow(dead_code, non_upper_case_globals)] pub const MAP_INVALIDATE_BUFFER_BIT: types::GLenum = 0x0008; +#[allow(dead_code, non_upper_case_globals)] pub const MAP_INVALIDATE_RANGE_BIT: types::GLenum = 0x0004; +#[allow(dead_code, non_upper_case_globals)] pub const MAP_READ_BIT: types::GLenum = 0x0001; +#[allow(dead_code, non_upper_case_globals)] pub const MAP_UNSYNCHRONIZED_BIT: types::GLenum = 0x0020; +#[allow(dead_code, non_upper_case_globals)] pub const MAP_WRITE_BIT: types::GLenum = 0x0002; +#[allow(dead_code, non_upper_case_globals)] pub const MAX: types::GLenum = 0x8008; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_3D_TEXTURE_SIZE: types::GLenum = 0x8073; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_ARRAY_TEXTURE_LAYERS: types::GLenum = 0x88FF; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_COLOR_ATTACHMENTS: types::GLenum = 0x8CDF; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: types::GLenum = 0x8A33; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_COMBINED_TEXTURE_IMAGE_UNITS: types::GLenum = 0x8B4D; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_COMBINED_UNIFORM_BLOCKS: types::GLenum = 0x8A2E; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: types::GLenum = 0x8A31; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_CUBE_MAP_TEXTURE_SIZE: types::GLenum = 0x851C; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_DRAW_BUFFERS: types::GLenum = 0x8824; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_ELEMENTS_INDICES: types::GLenum = 0x80E9; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_ELEMENTS_VERTICES: types::GLenum = 0x80E8; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_ELEMENT_INDEX: types::GLenum = 0x8D6B; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_FRAGMENT_INPUT_COMPONENTS: types::GLenum = 0x9125; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_FRAGMENT_UNIFORM_BLOCKS: types::GLenum = 0x8A2D; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_FRAGMENT_UNIFORM_COMPONENTS: types::GLenum = 0x8B49; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_FRAGMENT_UNIFORM_VECTORS: types::GLenum = 0x8DFD; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_PROGRAM_TEXEL_OFFSET: types::GLenum = 0x8905; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_RENDERBUFFER_SIZE: types::GLenum = 0x84E8; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_SAMPLES: types::GLenum = 0x8D57; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_SERVER_WAIT_TIMEOUT: types::GLenum = 0x9111; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_TEXTURE_IMAGE_UNITS: types::GLenum = 0x8872; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_TEXTURE_LOD_BIAS: types::GLenum = 0x84FD; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_TEXTURE_SIZE: types::GLenum = 0x0D33; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: types::GLenum = 0x8C8A; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: types::GLenum = 0x8C8B; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: types::GLenum = 0x8C80; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_UNIFORM_BLOCK_SIZE: types::GLenum = 0x8A30; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_UNIFORM_BUFFER_BINDINGS: types::GLenum = 0x8A2F; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_VARYING_COMPONENTS: types::GLenum = 0x8B4B; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_VARYING_VECTORS: types::GLenum = 0x8DFC; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_ATTRIBS: types::GLenum = 0x8869; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_OUTPUT_COMPONENTS: types::GLenum = 0x9122; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_TEXTURE_IMAGE_UNITS: types::GLenum = 0x8B4C; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_UNIFORM_BLOCKS: types::GLenum = 0x8A2B; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_UNIFORM_COMPONENTS: types::GLenum = 0x8B4A; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_UNIFORM_VECTORS: types::GLenum = 0x8DFB; +#[allow(dead_code, non_upper_case_globals)] pub const MAX_VIEWPORT_DIMS: types::GLenum = 0x0D3A; +#[allow(dead_code, non_upper_case_globals)] pub const MEDIUM_FLOAT: types::GLenum = 0x8DF1; +#[allow(dead_code, non_upper_case_globals)] pub const MEDIUM_INT: types::GLenum = 0x8DF4; +#[allow(dead_code, non_upper_case_globals)] pub const MIN: types::GLenum = 0x8007; +#[allow(dead_code, non_upper_case_globals)] pub const MINOR_VERSION: types::GLenum = 0x821C; +#[allow(dead_code, non_upper_case_globals)] pub const MIN_PROGRAM_TEXEL_OFFSET: types::GLenum = 0x8904; +#[allow(dead_code, non_upper_case_globals)] pub const MIRRORED_REPEAT: types::GLenum = 0x8370; +#[allow(dead_code, non_upper_case_globals)] pub const NEAREST: types::GLenum = 0x2600; +#[allow(dead_code, non_upper_case_globals)] pub const NEAREST_MIPMAP_LINEAR: types::GLenum = 0x2702; +#[allow(dead_code, non_upper_case_globals)] pub const NEAREST_MIPMAP_NEAREST: types::GLenum = 0x2700; +#[allow(dead_code, non_upper_case_globals)] pub const NEVER: types::GLenum = 0x0200; +#[allow(dead_code, non_upper_case_globals)] pub const NICEST: types::GLenum = 0x1102; +#[allow(dead_code, non_upper_case_globals)] pub const NONE: types::GLenum = 0; +#[allow(dead_code, non_upper_case_globals)] pub const NOTEQUAL: types::GLenum = 0x0205; +#[allow(dead_code, non_upper_case_globals)] pub const NO_ERROR: types::GLenum = 0; +#[allow(dead_code, non_upper_case_globals)] pub const NUM_COMPRESSED_TEXTURE_FORMATS: types::GLenum = 0x86A2; +#[allow(dead_code, non_upper_case_globals)] pub const NUM_EXTENSIONS: types::GLenum = 0x821D; +#[allow(dead_code, non_upper_case_globals)] pub const NUM_PROGRAM_BINARY_FORMATS: types::GLenum = 0x87FE; +#[allow(dead_code, non_upper_case_globals)] pub const NUM_SAMPLE_COUNTS: types::GLenum = 0x9380; +#[allow(dead_code, non_upper_case_globals)] pub const NUM_SHADER_BINARY_FORMATS: types::GLenum = 0x8DF9; +#[allow(dead_code, non_upper_case_globals)] pub const OBJECT_TYPE: types::GLenum = 0x9112; +#[allow(dead_code, non_upper_case_globals)] pub const ONE: types::GLenum = 1; +#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_CONSTANT_ALPHA: types::GLenum = 0x8004; +#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_CONSTANT_COLOR: types::GLenum = 0x8002; +#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_DST_ALPHA: types::GLenum = 0x0305; +#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_DST_COLOR: types::GLenum = 0x0307; +#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_SRC_ALPHA: types::GLenum = 0x0303; +#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_SRC_COLOR: types::GLenum = 0x0301; +#[allow(dead_code, non_upper_case_globals)] pub const OUT_OF_MEMORY: types::GLenum = 0x0505; +#[allow(dead_code, non_upper_case_globals)] pub const PACK_ALIGNMENT: types::GLenum = 0x0D05; +#[allow(dead_code, non_upper_case_globals)] pub const PACK_ROW_LENGTH: types::GLenum = 0x0D02; +#[allow(dead_code, non_upper_case_globals)] pub const PACK_SKIP_PIXELS: types::GLenum = 0x0D04; +#[allow(dead_code, non_upper_case_globals)] pub const PACK_SKIP_ROWS: types::GLenum = 0x0D03; +#[allow(dead_code, non_upper_case_globals)] pub const PIXEL_PACK_BUFFER: types::GLenum = 0x88EB; +#[allow(dead_code, non_upper_case_globals)] pub const PIXEL_PACK_BUFFER_BINDING: types::GLenum = 0x88ED; +#[allow(dead_code, non_upper_case_globals)] pub const PIXEL_UNPACK_BUFFER: types::GLenum = 0x88EC; +#[allow(dead_code, non_upper_case_globals)] pub const PIXEL_UNPACK_BUFFER_BINDING: types::GLenum = 0x88EF; +#[allow(dead_code, non_upper_case_globals)] pub const POINTS: types::GLenum = 0x0000; +#[allow(dead_code, non_upper_case_globals)] pub const POLYGON_OFFSET_FACTOR: types::GLenum = 0x8038; +#[allow(dead_code, non_upper_case_globals)] pub const POLYGON_OFFSET_FILL: types::GLenum = 0x8037; +#[allow(dead_code, non_upper_case_globals)] pub const POLYGON_OFFSET_UNITS: types::GLenum = 0x2A00; +#[allow(dead_code, non_upper_case_globals)] pub const PRIMITIVE_RESTART_FIXED_INDEX: types::GLenum = 0x8D69; +#[allow(dead_code, non_upper_case_globals)] pub const PROGRAM_BINARY_FORMATS: types::GLenum = 0x87FF; +#[allow(dead_code, non_upper_case_globals)] pub const PROGRAM_BINARY_LENGTH: types::GLenum = 0x8741; +#[allow(dead_code, non_upper_case_globals)] pub const PROGRAM_BINARY_RETRIEVABLE_HINT: types::GLenum = 0x8257; +#[allow(dead_code, non_upper_case_globals)] pub const QUERY_RESULT: types::GLenum = 0x8866; +#[allow(dead_code, non_upper_case_globals)] pub const QUERY_RESULT_AVAILABLE: types::GLenum = 0x8867; +#[allow(dead_code, non_upper_case_globals)] pub const R11F_G11F_B10F: types::GLenum = 0x8C3A; +#[allow(dead_code, non_upper_case_globals)] pub const R16F: types::GLenum = 0x822D; +#[allow(dead_code, non_upper_case_globals)] pub const R16I: types::GLenum = 0x8233; +#[allow(dead_code, non_upper_case_globals)] pub const R16UI: types::GLenum = 0x8234; +#[allow(dead_code, non_upper_case_globals)] pub const R32F: types::GLenum = 0x822E; +#[allow(dead_code, non_upper_case_globals)] pub const R32I: types::GLenum = 0x8235; +#[allow(dead_code, non_upper_case_globals)] pub const R32UI: types::GLenum = 0x8236; +#[allow(dead_code, non_upper_case_globals)] pub const R8: types::GLenum = 0x8229; +#[allow(dead_code, non_upper_case_globals)] pub const R8I: types::GLenum = 0x8231; +#[allow(dead_code, non_upper_case_globals)] pub const R8UI: types::GLenum = 0x8232; +#[allow(dead_code, non_upper_case_globals)] pub const R8_SNORM: types::GLenum = 0x8F94; +#[allow(dead_code, non_upper_case_globals)] pub const RASTERIZER_DISCARD: types::GLenum = 0x8C89; +#[allow(dead_code, non_upper_case_globals)] pub const READ_BUFFER: types::GLenum = 0x0C02; +#[allow(dead_code, non_upper_case_globals)] pub const READ_FRAMEBUFFER: types::GLenum = 0x8CA8; +#[allow(dead_code, non_upper_case_globals)] pub const READ_FRAMEBUFFER_BINDING: types::GLenum = 0x8CAA; +#[allow(dead_code, non_upper_case_globals)] pub const RED: types::GLenum = 0x1903; +#[allow(dead_code, non_upper_case_globals)] pub const RED_BITS: types::GLenum = 0x0D52; +#[allow(dead_code, non_upper_case_globals)] pub const RED_INTEGER: types::GLenum = 0x8D94; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER: types::GLenum = 0x8D41; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_ALPHA_SIZE: types::GLenum = 0x8D53; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_BINDING: types::GLenum = 0x8CA7; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_BLUE_SIZE: types::GLenum = 0x8D52; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_DEPTH_SIZE: types::GLenum = 0x8D54; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_GREEN_SIZE: types::GLenum = 0x8D51; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_HEIGHT: types::GLenum = 0x8D43; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_INTERNAL_FORMAT: types::GLenum = 0x8D44; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_RED_SIZE: types::GLenum = 0x8D50; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_SAMPLES: types::GLenum = 0x8CAB; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_STENCIL_SIZE: types::GLenum = 0x8D55; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_WIDTH: types::GLenum = 0x8D42; +#[allow(dead_code, non_upper_case_globals)] pub const RENDERER: types::GLenum = 0x1F01; +#[allow(dead_code, non_upper_case_globals)] pub const REPEAT: types::GLenum = 0x2901; +#[allow(dead_code, non_upper_case_globals)] pub const REPLACE: types::GLenum = 0x1E01; +#[allow(dead_code, non_upper_case_globals)] pub const RG: types::GLenum = 0x8227; +#[allow(dead_code, non_upper_case_globals)] pub const RG16F: types::GLenum = 0x822F; +#[allow(dead_code, non_upper_case_globals)] pub const RG16I: types::GLenum = 0x8239; +#[allow(dead_code, non_upper_case_globals)] pub const RG16UI: types::GLenum = 0x823A; +#[allow(dead_code, non_upper_case_globals)] pub const RG32F: types::GLenum = 0x8230; +#[allow(dead_code, non_upper_case_globals)] pub const RG32I: types::GLenum = 0x823B; +#[allow(dead_code, non_upper_case_globals)] pub const RG32UI: types::GLenum = 0x823C; +#[allow(dead_code, non_upper_case_globals)] pub const RG8: types::GLenum = 0x822B; +#[allow(dead_code, non_upper_case_globals)] pub const RG8I: types::GLenum = 0x8237; +#[allow(dead_code, non_upper_case_globals)] pub const RG8UI: types::GLenum = 0x8238; +#[allow(dead_code, non_upper_case_globals)] pub const RG8_SNORM: types::GLenum = 0x8F95; +#[allow(dead_code, non_upper_case_globals)] pub const RGB: types::GLenum = 0x1907; +#[allow(dead_code, non_upper_case_globals)] pub const RGB10_A2: types::GLenum = 0x8059; +#[allow(dead_code, non_upper_case_globals)] pub const RGB10_A2UI: types::GLenum = 0x906F; +#[allow(dead_code, non_upper_case_globals)] pub const RGB16F: types::GLenum = 0x881B; +#[allow(dead_code, non_upper_case_globals)] pub const RGB16I: types::GLenum = 0x8D89; +#[allow(dead_code, non_upper_case_globals)] pub const RGB16UI: types::GLenum = 0x8D77; +#[allow(dead_code, non_upper_case_globals)] pub const RGB32F: types::GLenum = 0x8815; +#[allow(dead_code, non_upper_case_globals)] pub const RGB32I: types::GLenum = 0x8D83; +#[allow(dead_code, non_upper_case_globals)] pub const RGB32UI: types::GLenum = 0x8D71; +#[allow(dead_code, non_upper_case_globals)] pub const RGB565: types::GLenum = 0x8D62; +#[allow(dead_code, non_upper_case_globals)] pub const RGB5_A1: types::GLenum = 0x8057; +#[allow(dead_code, non_upper_case_globals)] pub const RGB8: types::GLenum = 0x8051; +#[allow(dead_code, non_upper_case_globals)] pub const RGB8I: types::GLenum = 0x8D8F; +#[allow(dead_code, non_upper_case_globals)] pub const RGB8UI: types::GLenum = 0x8D7D; +#[allow(dead_code, non_upper_case_globals)] pub const RGB8_SNORM: types::GLenum = 0x8F96; +#[allow(dead_code, non_upper_case_globals)] pub const RGB9_E5: types::GLenum = 0x8C3D; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA: types::GLenum = 0x1908; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA16F: types::GLenum = 0x881A; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA16I: types::GLenum = 0x8D88; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA16UI: types::GLenum = 0x8D76; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA32F: types::GLenum = 0x8814; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA32I: types::GLenum = 0x8D82; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA32UI: types::GLenum = 0x8D70; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA4: types::GLenum = 0x8056; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA8: types::GLenum = 0x8058; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA8I: types::GLenum = 0x8D8E; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA8UI: types::GLenum = 0x8D7C; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA8_SNORM: types::GLenum = 0x8F97; +#[allow(dead_code, non_upper_case_globals)] pub const RGBA_INTEGER: types::GLenum = 0x8D99; +#[allow(dead_code, non_upper_case_globals)] pub const RGB_INTEGER: types::GLenum = 0x8D98; +#[allow(dead_code, non_upper_case_globals)] pub const RG_INTEGER: types::GLenum = 0x8228; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_2D: types::GLenum = 0x8B5E; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_2D_ARRAY: types::GLenum = 0x8DC1; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_2D_ARRAY_SHADOW: types::GLenum = 0x8DC4; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_2D_SHADOW: types::GLenum = 0x8B62; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_3D: types::GLenum = 0x8B5F; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_BINDING: types::GLenum = 0x8919; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_CUBE: types::GLenum = 0x8B60; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_CUBE_SHADOW: types::GLenum = 0x8DC5; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLES: types::GLenum = 0x80A9; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLE_ALPHA_TO_COVERAGE: types::GLenum = 0x809E; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLE_BUFFERS: types::GLenum = 0x80A8; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLE_COVERAGE: types::GLenum = 0x80A0; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLE_COVERAGE_INVERT: types::GLenum = 0x80AB; +#[allow(dead_code, non_upper_case_globals)] pub const SAMPLE_COVERAGE_VALUE: types::GLenum = 0x80AA; +#[allow(dead_code, non_upper_case_globals)] pub const SCISSOR_BOX: types::GLenum = 0x0C10; +#[allow(dead_code, non_upper_case_globals)] pub const SCISSOR_TEST: types::GLenum = 0x0C11; +#[allow(dead_code, non_upper_case_globals)] pub const SEPARATE_ATTRIBS: types::GLenum = 0x8C8D; +#[allow(dead_code, non_upper_case_globals)] pub const SHADER_BINARY_FORMATS: types::GLenum = 0x8DF8; +#[allow(dead_code, non_upper_case_globals)] pub const SHADER_COMPILER: types::GLenum = 0x8DFA; +#[allow(dead_code, non_upper_case_globals)] pub const SHADER_SOURCE_LENGTH: types::GLenum = 0x8B88; +#[allow(dead_code, non_upper_case_globals)] pub const SHADER_TYPE: types::GLenum = 0x8B4F; +#[allow(dead_code, non_upper_case_globals)] pub const SHADING_LANGUAGE_VERSION: types::GLenum = 0x8B8C; +#[allow(dead_code, non_upper_case_globals)] pub const SHORT: types::GLenum = 0x1402; +#[allow(dead_code, non_upper_case_globals)] pub const SIGNALED: types::GLenum = 0x9119; +#[allow(dead_code, non_upper_case_globals)] pub const SIGNED_NORMALIZED: types::GLenum = 0x8F9C; +#[allow(dead_code, non_upper_case_globals)] pub const SRC_ALPHA: types::GLenum = 0x0302; +#[allow(dead_code, non_upper_case_globals)] pub const SRC_ALPHA_SATURATE: types::GLenum = 0x0308; +#[allow(dead_code, non_upper_case_globals)] pub const SRC_COLOR: types::GLenum = 0x0300; +#[allow(dead_code, non_upper_case_globals)] pub const SRGB: types::GLenum = 0x8C40; +#[allow(dead_code, non_upper_case_globals)] pub const SRGB8: types::GLenum = 0x8C41; +#[allow(dead_code, non_upper_case_globals)] pub const SRGB8_ALPHA8: types::GLenum = 0x8C43; +#[allow(dead_code, non_upper_case_globals)] pub const STATIC_COPY: types::GLenum = 0x88E6; +#[allow(dead_code, non_upper_case_globals)] pub const STATIC_DRAW: types::GLenum = 0x88E4; +#[allow(dead_code, non_upper_case_globals)] pub const STATIC_READ: types::GLenum = 0x88E5; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL: types::GLenum = 0x1802; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_ATTACHMENT: types::GLenum = 0x8D20; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_FAIL: types::GLenum = 0x8801; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_FUNC: types::GLenum = 0x8800; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_PASS_DEPTH_FAIL: types::GLenum = 0x8802; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_PASS_DEPTH_PASS: types::GLenum = 0x8803; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_REF: types::GLenum = 0x8CA3; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_VALUE_MASK: types::GLenum = 0x8CA4; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_WRITEMASK: types::GLenum = 0x8CA5; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BITS: types::GLenum = 0x0D57; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BUFFER_BIT: types::GLenum = 0x00000400; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_CLEAR_VALUE: types::GLenum = 0x0B91; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_FAIL: types::GLenum = 0x0B94; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_FUNC: types::GLenum = 0x0B92; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_INDEX8: types::GLenum = 0x8D48; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_PASS_DEPTH_FAIL: types::GLenum = 0x0B95; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_PASS_DEPTH_PASS: types::GLenum = 0x0B96; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_REF: types::GLenum = 0x0B97; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_TEST: types::GLenum = 0x0B90; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_VALUE_MASK: types::GLenum = 0x0B93; +#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_WRITEMASK: types::GLenum = 0x0B98; +#[allow(dead_code, non_upper_case_globals)] pub const STREAM_COPY: types::GLenum = 0x88E2; +#[allow(dead_code, non_upper_case_globals)] pub const STREAM_DRAW: types::GLenum = 0x88E0; +#[allow(dead_code, non_upper_case_globals)] pub const STREAM_READ: types::GLenum = 0x88E1; +#[allow(dead_code, non_upper_case_globals)] pub const SUBPIXEL_BITS: types::GLenum = 0x0D50; +#[allow(dead_code, non_upper_case_globals)] pub const SYNC_CONDITION: types::GLenum = 0x9113; +#[allow(dead_code, non_upper_case_globals)] pub const SYNC_FENCE: types::GLenum = 0x9116; +#[allow(dead_code, non_upper_case_globals)] pub const SYNC_FLAGS: types::GLenum = 0x9115; +#[allow(dead_code, non_upper_case_globals)] pub const SYNC_FLUSH_COMMANDS_BIT: types::GLenum = 0x00000001; +#[allow(dead_code, non_upper_case_globals)] pub const SYNC_GPU_COMMANDS_COMPLETE: types::GLenum = 0x9117; +#[allow(dead_code, non_upper_case_globals)] pub const SYNC_STATUS: types::GLenum = 0x9114; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE: types::GLenum = 0x1702; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE0: types::GLenum = 0x84C0; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE1: types::GLenum = 0x84C1; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE10: types::GLenum = 0x84CA; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE11: types::GLenum = 0x84CB; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE12: types::GLenum = 0x84CC; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE13: types::GLenum = 0x84CD; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE14: types::GLenum = 0x84CE; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE15: types::GLenum = 0x84CF; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE16: types::GLenum = 0x84D0; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE17: types::GLenum = 0x84D1; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE18: types::GLenum = 0x84D2; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE19: types::GLenum = 0x84D3; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE2: types::GLenum = 0x84C2; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE20: types::GLenum = 0x84D4; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE21: types::GLenum = 0x84D5; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE22: types::GLenum = 0x84D6; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE23: types::GLenum = 0x84D7; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE24: types::GLenum = 0x84D8; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE25: types::GLenum = 0x84D9; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE26: types::GLenum = 0x84DA; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE27: types::GLenum = 0x84DB; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE28: types::GLenum = 0x84DC; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE29: types::GLenum = 0x84DD; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE3: types::GLenum = 0x84C3; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE30: types::GLenum = 0x84DE; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE31: types::GLenum = 0x84DF; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE4: types::GLenum = 0x84C4; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE5: types::GLenum = 0x84C5; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE6: types::GLenum = 0x84C6; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE7: types::GLenum = 0x84C7; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE8: types::GLenum = 0x84C8; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE9: types::GLenum = 0x84C9; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_2D: types::GLenum = 0x0DE1; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_2D_ARRAY: types::GLenum = 0x8C1A; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_3D: types::GLenum = 0x806F; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_BASE_LEVEL: types::GLenum = 0x813C; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_BINDING_2D: types::GLenum = 0x8069; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_BINDING_2D_ARRAY: types::GLenum = 0x8C1D; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_BINDING_3D: types::GLenum = 0x806A; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_BINDING_CUBE_MAP: types::GLenum = 0x8514; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_COMPARE_FUNC: types::GLenum = 0x884D; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_COMPARE_MODE: types::GLenum = 0x884C; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP: types::GLenum = 0x8513; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_NEGATIVE_X: types::GLenum = 0x8516; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_NEGATIVE_Y: types::GLenum = 0x8518; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_NEGATIVE_Z: types::GLenum = 0x851A; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_POSITIVE_X: types::GLenum = 0x8515; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_POSITIVE_Y: types::GLenum = 0x8517; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_POSITIVE_Z: types::GLenum = 0x8519; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_IMMUTABLE_FORMAT: types::GLenum = 0x912F; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_IMMUTABLE_LEVELS: types::GLenum = 0x82DF; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_MAG_FILTER: types::GLenum = 0x2800; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_MAX_LEVEL: types::GLenum = 0x813D; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_MAX_LOD: types::GLenum = 0x813B; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_MIN_FILTER: types::GLenum = 0x2801; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_MIN_LOD: types::GLenum = 0x813A; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_SWIZZLE_A: types::GLenum = 0x8E45; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_SWIZZLE_B: types::GLenum = 0x8E44; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_SWIZZLE_G: types::GLenum = 0x8E43; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_SWIZZLE_R: types::GLenum = 0x8E42; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_WRAP_R: types::GLenum = 0x8072; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_WRAP_S: types::GLenum = 0x2802; +#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_WRAP_T: types::GLenum = 0x2803; +#[allow(dead_code, non_upper_case_globals)] pub const TIMEOUT_EXPIRED: types::GLenum = 0x911B; +#[allow(dead_code, non_upper_case_globals)] pub const TIMEOUT_IGNORED: types::GLuint64 = 0xFFFFFFFFFFFFFFFF; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK: types::GLenum = 0x8E22; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_ACTIVE: types::GLenum = 0x8E24; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BINDING: types::GLenum = 0x8E25; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BUFFER: types::GLenum = 0x8C8E; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BUFFER_BINDING: types::GLenum = 0x8C8F; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BUFFER_MODE: types::GLenum = 0x8C7F; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BUFFER_SIZE: types::GLenum = 0x8C85; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BUFFER_START: types::GLenum = 0x8C84; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_PAUSED: types::GLenum = 0x8E23; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: types::GLenum = 0x8C88; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_VARYINGS: types::GLenum = 0x8C83; +#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: types::GLenum = 0x8C76; +#[allow(dead_code, non_upper_case_globals)] pub const TRIANGLES: types::GLenum = 0x0004; +#[allow(dead_code, non_upper_case_globals)] pub const TRIANGLE_FAN: types::GLenum = 0x0006; +#[allow(dead_code, non_upper_case_globals)] pub const TRIANGLE_STRIP: types::GLenum = 0x0005; +#[allow(dead_code, non_upper_case_globals)] pub const TRUE: types::GLboolean = 1; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_ARRAY_STRIDE: types::GLenum = 0x8A3C; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_ACTIVE_UNIFORMS: types::GLenum = 0x8A42; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: types::GLenum = 0x8A43; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_BINDING: types::GLenum = 0x8A3F; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_DATA_SIZE: types::GLenum = 0x8A40; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_INDEX: types::GLenum = 0x8A3A; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_NAME_LENGTH: types::GLenum = 0x8A41; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: types::GLenum = 0x8A46; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: types::GLenum = 0x8A44; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BUFFER: types::GLenum = 0x8A11; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BUFFER_BINDING: types::GLenum = 0x8A28; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BUFFER_OFFSET_ALIGNMENT: types::GLenum = 0x8A34; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BUFFER_SIZE: types::GLenum = 0x8A2A; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BUFFER_START: types::GLenum = 0x8A29; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_IS_ROW_MAJOR: types::GLenum = 0x8A3E; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_MATRIX_STRIDE: types::GLenum = 0x8A3D; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_NAME_LENGTH: types::GLenum = 0x8A39; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_OFFSET: types::GLenum = 0x8A3B; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_SIZE: types::GLenum = 0x8A38; +#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_TYPE: types::GLenum = 0x8A37; +#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_ALIGNMENT: types::GLenum = 0x0CF5; +#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_IMAGE_HEIGHT: types::GLenum = 0x806E; +#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_ROW_LENGTH: types::GLenum = 0x0CF2; +#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_SKIP_IMAGES: types::GLenum = 0x806D; +#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_SKIP_PIXELS: types::GLenum = 0x0CF4; +#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_SKIP_ROWS: types::GLenum = 0x0CF3; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNALED: types::GLenum = 0x9118; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_BYTE: types::GLenum = 0x1401; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT: types::GLenum = 0x1405; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_10F_11F_11F_REV: types::GLenum = 0x8C3B; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_24_8: types::GLenum = 0x84FA; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_2_10_10_10_REV: types::GLenum = 0x8368; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_5_9_9_9_REV: types::GLenum = 0x8C3E; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_SAMPLER_2D: types::GLenum = 0x8DD2; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_SAMPLER_2D_ARRAY: types::GLenum = 0x8DD7; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_SAMPLER_3D: types::GLenum = 0x8DD3; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_SAMPLER_CUBE: types::GLenum = 0x8DD4; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_VEC2: types::GLenum = 0x8DC6; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_VEC3: types::GLenum = 0x8DC7; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_VEC4: types::GLenum = 0x8DC8; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_NORMALIZED: types::GLenum = 0x8C17; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_SHORT: types::GLenum = 0x1403; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_SHORT_4_4_4_4: types::GLenum = 0x8033; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_SHORT_5_5_5_1: types::GLenum = 0x8034; +#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_SHORT_5_6_5: types::GLenum = 0x8363; +#[allow(dead_code, non_upper_case_globals)] pub const VALIDATE_STATUS: types::GLenum = 0x8B83; +#[allow(dead_code, non_upper_case_globals)] pub const VENDOR: types::GLenum = 0x1F00; +#[allow(dead_code, non_upper_case_globals)] pub const VERSION: types::GLenum = 0x1F02; +#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ARRAY_BINDING: types::GLenum = 0x85B5; +#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: types::GLenum = 0x889F; +#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_DIVISOR: types::GLenum = 0x88FE; +#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_ENABLED: types::GLenum = 0x8622; +#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_INTEGER: types::GLenum = 0x88FD; +#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_NORMALIZED: types::GLenum = 0x886A; +#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_POINTER: types::GLenum = 0x8645; +#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_SIZE: types::GLenum = 0x8623; +#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_STRIDE: types::GLenum = 0x8624; +#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_TYPE: types::GLenum = 0x8625; +#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_SHADER: types::GLenum = 0x8B31; +#[allow(dead_code, non_upper_case_globals)] pub const VIEWPORT: types::GLenum = 0x0BA2; +#[allow(dead_code, non_upper_case_globals)] pub const WAIT_FAILED: types::GLenum = 0x911D; +#[allow(dead_code, non_upper_case_globals)] pub const ZERO: types::GLenum = 0; + + #[allow(dead_code, missing_copy_implementations)] + #[derive(Clone)] + pub struct FnPtr { + /// The function pointer that will be used when calling the function. + f: *const __gl_imports::raw::c_void, + /// True if the pointer points to a real function, false if points to a `panic!` fn. + is_loaded: bool, + } + + impl FnPtr { + /// Creates a `FnPtr` from a load attempt. + fn new(ptr: *const __gl_imports::raw::c_void) -> FnPtr { + if ptr.is_null() { + FnPtr { + f: missing_fn_panic as *const __gl_imports::raw::c_void, + is_loaded: false + } + } else { + FnPtr { f: ptr, is_loaded: true } + } + } + + /// Returns `true` if the function has been successfully loaded. + /// + /// If it returns `false`, calling the corresponding function will fail. + #[inline] + #[allow(dead_code)] + pub fn is_loaded(&self) -> bool { + self.is_loaded + } + } + +#[inline(never)] + fn missing_fn_panic() -> ! { + panic!("gles2 function was not loaded") + } + + #[allow(non_camel_case_types, non_snake_case, dead_code)] + #[derive(Clone)] + pub struct Gles2 { +/// Fallbacks: ActiveTextureARB +pub ActiveTexture: FnPtr, +/// Fallbacks: AttachObjectARB +pub AttachShader: FnPtr, +/// Fallbacks: BeginQueryARB +pub BeginQuery: FnPtr, +/// Fallbacks: BeginTransformFeedbackEXT, BeginTransformFeedbackNV +pub BeginTransformFeedback: FnPtr, +/// Fallbacks: BindAttribLocationARB +pub BindAttribLocation: FnPtr, +/// Fallbacks: BindBufferARB +pub BindBuffer: FnPtr, +/// Fallbacks: BindBufferBaseEXT, BindBufferBaseNV +pub BindBufferBase: FnPtr, +/// Fallbacks: BindBufferRangeEXT, BindBufferRangeNV +pub BindBufferRange: FnPtr, +pub BindFramebuffer: FnPtr, +pub BindRenderbuffer: FnPtr, +pub BindSampler: FnPtr, +/// Fallbacks: BindTextureEXT +pub BindTexture: FnPtr, +pub BindTransformFeedback: FnPtr, +/// Fallbacks: BindVertexArrayOES +pub BindVertexArray: FnPtr, +/// Fallbacks: BlendColorEXT +pub BlendColor: FnPtr, +/// Fallbacks: BlendEquationEXT +pub BlendEquation: FnPtr, +/// Fallbacks: BlendEquationSeparateEXT +pub BlendEquationSeparate: FnPtr, +pub BlendFunc: FnPtr, +/// Fallbacks: BlendFuncSeparateEXT, BlendFuncSeparateINGR +pub BlendFuncSeparate: FnPtr, +/// Fallbacks: BlitFramebufferEXT, BlitFramebufferNV +pub BlitFramebuffer: FnPtr, +/// Fallbacks: BufferDataARB +pub BufferData: FnPtr, +/// Fallbacks: BufferSubDataARB +pub BufferSubData: FnPtr, +/// Fallbacks: CheckFramebufferStatusEXT +pub CheckFramebufferStatus: FnPtr, +pub Clear: FnPtr, +pub ClearBufferfi: FnPtr, +pub ClearBufferfv: FnPtr, +pub ClearBufferiv: FnPtr, +pub ClearBufferuiv: FnPtr, +pub ClearColor: FnPtr, +/// Fallbacks: ClearDepthfOES +pub ClearDepthf: FnPtr, +pub ClearStencil: FnPtr, +/// Fallbacks: ClientWaitSyncAPPLE +pub ClientWaitSync: FnPtr, +pub ColorMask: FnPtr, +/// Fallbacks: CompileShaderARB +pub CompileShader: FnPtr, +/// Fallbacks: CompressedTexImage2DARB +pub CompressedTexImage2D: FnPtr, +/// Fallbacks: CompressedTexImage3DARB +pub CompressedTexImage3D: FnPtr, +/// Fallbacks: CompressedTexSubImage2DARB +pub CompressedTexSubImage2D: FnPtr, +/// Fallbacks: CompressedTexSubImage3DARB +pub CompressedTexSubImage3D: FnPtr, +/// Fallbacks: CopyBufferSubDataNV +pub CopyBufferSubData: FnPtr, +/// Fallbacks: CopyTexImage2DEXT +pub CopyTexImage2D: FnPtr, +/// Fallbacks: CopyTexSubImage2DEXT +pub CopyTexSubImage2D: FnPtr, +/// Fallbacks: CopyTexSubImage3DEXT +pub CopyTexSubImage3D: FnPtr, +/// Fallbacks: CreateProgramObjectARB +pub CreateProgram: FnPtr, +/// Fallbacks: CreateShaderObjectARB +pub CreateShader: FnPtr, +pub CullFace: FnPtr, +/// Fallbacks: DeleteBuffersARB +pub DeleteBuffers: FnPtr, +/// Fallbacks: DeleteFramebuffersEXT +pub DeleteFramebuffers: FnPtr, +pub DeleteProgram: FnPtr, +/// Fallbacks: DeleteQueriesARB +pub DeleteQueries: FnPtr, +/// Fallbacks: DeleteRenderbuffersEXT +pub DeleteRenderbuffers: FnPtr, +pub DeleteSamplers: FnPtr, +pub DeleteShader: FnPtr, +/// Fallbacks: DeleteSyncAPPLE +pub DeleteSync: FnPtr, +pub DeleteTextures: FnPtr, +/// Fallbacks: DeleteTransformFeedbacksNV +pub DeleteTransformFeedbacks: FnPtr, +/// Fallbacks: DeleteVertexArraysAPPLE, DeleteVertexArraysOES +pub DeleteVertexArrays: FnPtr, +pub DepthFunc: FnPtr, +pub DepthMask: FnPtr, +/// Fallbacks: DepthRangefOES +pub DepthRangef: FnPtr, +/// Fallbacks: DetachObjectARB +pub DetachShader: FnPtr, +pub Disable: FnPtr, +/// Fallbacks: DisableVertexAttribArrayARB +pub DisableVertexAttribArray: FnPtr, +/// Fallbacks: DrawArraysEXT +pub DrawArrays: FnPtr, +/// Fallbacks: DrawArraysInstancedANGLE, DrawArraysInstancedARB, DrawArraysInstancedEXT, DrawArraysInstancedNV +pub DrawArraysInstanced: FnPtr, +/// Fallbacks: DrawBuffersARB, DrawBuffersATI, DrawBuffersEXT +pub DrawBuffers: FnPtr, +pub DrawElements: FnPtr, +/// Fallbacks: DrawElementsInstancedANGLE, DrawElementsInstancedARB, DrawElementsInstancedEXT, DrawElementsInstancedNV +pub DrawElementsInstanced: FnPtr, +/// Fallbacks: DrawRangeElementsEXT +pub DrawRangeElements: FnPtr, +pub Enable: FnPtr, +/// Fallbacks: EnableVertexAttribArrayARB +pub EnableVertexAttribArray: FnPtr, +/// Fallbacks: EndQueryARB +pub EndQuery: FnPtr, +/// Fallbacks: EndTransformFeedbackEXT, EndTransformFeedbackNV +pub EndTransformFeedback: FnPtr, +/// Fallbacks: FenceSyncAPPLE +pub FenceSync: FnPtr, +pub Finish: FnPtr, +pub Flush: FnPtr, +/// Fallbacks: FlushMappedBufferRangeAPPLE, FlushMappedBufferRangeEXT +pub FlushMappedBufferRange: FnPtr, +/// Fallbacks: FramebufferRenderbufferEXT +pub FramebufferRenderbuffer: FnPtr, +/// Fallbacks: FramebufferTexture2DEXT +pub FramebufferTexture2D: FnPtr, +/// Fallbacks: FramebufferTextureLayerARB, FramebufferTextureLayerEXT +pub FramebufferTextureLayer: FnPtr, +pub FrontFace: FnPtr, +/// Fallbacks: GenBuffersARB +pub GenBuffers: FnPtr, +/// Fallbacks: GenFramebuffersEXT +pub GenFramebuffers: FnPtr, +/// Fallbacks: GenQueriesARB +pub GenQueries: FnPtr, +/// Fallbacks: GenRenderbuffersEXT +pub GenRenderbuffers: FnPtr, +pub GenSamplers: FnPtr, +pub GenTextures: FnPtr, +/// Fallbacks: GenTransformFeedbacksNV +pub GenTransformFeedbacks: FnPtr, +/// Fallbacks: GenVertexArraysAPPLE, GenVertexArraysOES +pub GenVertexArrays: FnPtr, +/// Fallbacks: GenerateMipmapEXT +pub GenerateMipmap: FnPtr, +/// Fallbacks: GetActiveAttribARB +pub GetActiveAttrib: FnPtr, +/// Fallbacks: GetActiveUniformARB +pub GetActiveUniform: FnPtr, +pub GetActiveUniformBlockName: FnPtr, +pub GetActiveUniformBlockiv: FnPtr, +pub GetActiveUniformsiv: FnPtr, +pub GetAttachedShaders: FnPtr, +/// Fallbacks: GetAttribLocationARB +pub GetAttribLocation: FnPtr, +pub GetBooleanv: FnPtr, +pub GetBufferParameteri64v: FnPtr, +/// Fallbacks: GetBufferParameterivARB +pub GetBufferParameteriv: FnPtr, +/// Fallbacks: GetBufferPointervARB, GetBufferPointervOES +pub GetBufferPointerv: FnPtr, +pub GetError: FnPtr, +pub GetFloatv: FnPtr, +/// Fallbacks: GetFragDataLocationEXT +pub GetFragDataLocation: FnPtr, +/// Fallbacks: GetFramebufferAttachmentParameterivEXT +pub GetFramebufferAttachmentParameteriv: FnPtr, +pub GetInteger64i_v: FnPtr, +/// Fallbacks: GetInteger64vAPPLE +pub GetInteger64v: FnPtr, +/// Fallbacks: GetIntegerIndexedvEXT +pub GetIntegeri_v: FnPtr, +pub GetIntegerv: FnPtr, +pub GetInternalformativ: FnPtr, +/// Fallbacks: GetProgramBinaryOES +pub GetProgramBinary: FnPtr, +pub GetProgramInfoLog: FnPtr, +pub GetProgramiv: FnPtr, +/// Fallbacks: GetQueryObjectuivARB +pub GetQueryObjectuiv: FnPtr, +/// Fallbacks: GetQueryivARB +pub GetQueryiv: FnPtr, +/// Fallbacks: GetRenderbufferParameterivEXT +pub GetRenderbufferParameteriv: FnPtr, +pub GetSamplerParameterfv: FnPtr, +pub GetSamplerParameteriv: FnPtr, +pub GetShaderInfoLog: FnPtr, +pub GetShaderPrecisionFormat: FnPtr, +/// Fallbacks: GetShaderSourceARB +pub GetShaderSource: FnPtr, +pub GetShaderiv: FnPtr, +pub GetString: FnPtr, +pub GetStringi: FnPtr, +/// Fallbacks: GetSyncivAPPLE +pub GetSynciv: FnPtr, +pub GetTexParameterfv: FnPtr, +pub GetTexParameteriv: FnPtr, +/// Fallbacks: GetTransformFeedbackVaryingEXT +pub GetTransformFeedbackVarying: FnPtr, +pub GetUniformBlockIndex: FnPtr, +pub GetUniformIndices: FnPtr, +/// Fallbacks: GetUniformLocationARB +pub GetUniformLocation: FnPtr, +/// Fallbacks: GetUniformfvARB +pub GetUniformfv: FnPtr, +/// Fallbacks: GetUniformivARB +pub GetUniformiv: FnPtr, +/// Fallbacks: GetUniformuivEXT +pub GetUniformuiv: FnPtr, +/// Fallbacks: GetVertexAttribIivEXT +pub GetVertexAttribIiv: FnPtr, +/// Fallbacks: GetVertexAttribIuivEXT +pub GetVertexAttribIuiv: FnPtr, +/// Fallbacks: GetVertexAttribPointervARB, GetVertexAttribPointervNV +pub GetVertexAttribPointerv: FnPtr, +/// Fallbacks: GetVertexAttribfvARB, GetVertexAttribfvNV +pub GetVertexAttribfv: FnPtr, +/// Fallbacks: GetVertexAttribivARB, GetVertexAttribivNV +pub GetVertexAttribiv: FnPtr, +pub Hint: FnPtr, +pub InvalidateFramebuffer: FnPtr, +pub InvalidateSubFramebuffer: FnPtr, +/// Fallbacks: IsBufferARB +pub IsBuffer: FnPtr, +pub IsEnabled: FnPtr, +/// Fallbacks: IsFramebufferEXT +pub IsFramebuffer: FnPtr, +pub IsProgram: FnPtr, +/// Fallbacks: IsQueryARB +pub IsQuery: FnPtr, +/// Fallbacks: IsRenderbufferEXT +pub IsRenderbuffer: FnPtr, +pub IsSampler: FnPtr, +pub IsShader: FnPtr, +/// Fallbacks: IsSyncAPPLE +pub IsSync: FnPtr, +pub IsTexture: FnPtr, +/// Fallbacks: IsTransformFeedbackNV +pub IsTransformFeedback: FnPtr, +/// Fallbacks: IsVertexArrayAPPLE, IsVertexArrayOES +pub IsVertexArray: FnPtr, +pub LineWidth: FnPtr, +/// Fallbacks: LinkProgramARB +pub LinkProgram: FnPtr, +/// Fallbacks: MapBufferRangeEXT +pub MapBufferRange: FnPtr, +/// Fallbacks: PauseTransformFeedbackNV +pub PauseTransformFeedback: FnPtr, +pub PixelStorei: FnPtr, +pub PolygonOffset: FnPtr, +/// Fallbacks: ProgramBinaryOES +pub ProgramBinary: FnPtr, +/// Fallbacks: ProgramParameteriARB, ProgramParameteriEXT +pub ProgramParameteri: FnPtr, +pub ReadBuffer: FnPtr, +pub ReadPixels: FnPtr, +pub ReleaseShaderCompiler: FnPtr, +/// Fallbacks: RenderbufferStorageEXT +pub RenderbufferStorage: FnPtr, +/// Fallbacks: RenderbufferStorageMultisampleEXT, RenderbufferStorageMultisampleNV +pub RenderbufferStorageMultisample: FnPtr, +/// Fallbacks: ResumeTransformFeedbackNV +pub ResumeTransformFeedback: FnPtr, +/// Fallbacks: SampleCoverageARB +pub SampleCoverage: FnPtr, +pub SamplerParameterf: FnPtr, +pub SamplerParameterfv: FnPtr, +pub SamplerParameteri: FnPtr, +pub SamplerParameteriv: FnPtr, +pub Scissor: FnPtr, +pub ShaderBinary: FnPtr, +/// Fallbacks: ShaderSourceARB +pub ShaderSource: FnPtr, +pub StencilFunc: FnPtr, +pub StencilFuncSeparate: FnPtr, +pub StencilMask: FnPtr, +pub StencilMaskSeparate: FnPtr, +pub StencilOp: FnPtr, +/// Fallbacks: StencilOpSeparateATI +pub StencilOpSeparate: FnPtr, +pub TexImage2D: FnPtr, +/// Fallbacks: TexImage3DEXT +pub TexImage3D: FnPtr, +pub TexParameterf: FnPtr, +pub TexParameterfv: FnPtr, +pub TexParameteri: FnPtr, +pub TexParameteriv: FnPtr, +/// Fallbacks: TexStorage2DEXT +pub TexStorage2D: FnPtr, +/// Fallbacks: TexStorage3DEXT +pub TexStorage3D: FnPtr, +/// Fallbacks: TexSubImage2DEXT +pub TexSubImage2D: FnPtr, +/// Fallbacks: TexSubImage3DEXT +pub TexSubImage3D: FnPtr, +/// Fallbacks: TransformFeedbackVaryingsEXT +pub TransformFeedbackVaryings: FnPtr, +/// Fallbacks: Uniform1fARB +pub Uniform1f: FnPtr, +/// Fallbacks: Uniform1fvARB +pub Uniform1fv: FnPtr, +/// Fallbacks: Uniform1iARB +pub Uniform1i: FnPtr, +/// Fallbacks: Uniform1ivARB +pub Uniform1iv: FnPtr, +/// Fallbacks: Uniform1uiEXT +pub Uniform1ui: FnPtr, +/// Fallbacks: Uniform1uivEXT +pub Uniform1uiv: FnPtr, +/// Fallbacks: Uniform2fARB +pub Uniform2f: FnPtr, +/// Fallbacks: Uniform2fvARB +pub Uniform2fv: FnPtr, +/// Fallbacks: Uniform2iARB +pub Uniform2i: FnPtr, +/// Fallbacks: Uniform2ivARB +pub Uniform2iv: FnPtr, +/// Fallbacks: Uniform2uiEXT +pub Uniform2ui: FnPtr, +/// Fallbacks: Uniform2uivEXT +pub Uniform2uiv: FnPtr, +/// Fallbacks: Uniform3fARB +pub Uniform3f: FnPtr, +/// Fallbacks: Uniform3fvARB +pub Uniform3fv: FnPtr, +/// Fallbacks: Uniform3iARB +pub Uniform3i: FnPtr, +/// Fallbacks: Uniform3ivARB +pub Uniform3iv: FnPtr, +/// Fallbacks: Uniform3uiEXT +pub Uniform3ui: FnPtr, +/// Fallbacks: Uniform3uivEXT +pub Uniform3uiv: FnPtr, +/// Fallbacks: Uniform4fARB +pub Uniform4f: FnPtr, +/// Fallbacks: Uniform4fvARB +pub Uniform4fv: FnPtr, +/// Fallbacks: Uniform4iARB +pub Uniform4i: FnPtr, +/// Fallbacks: Uniform4ivARB +pub Uniform4iv: FnPtr, +/// Fallbacks: Uniform4uiEXT +pub Uniform4ui: FnPtr, +/// Fallbacks: Uniform4uivEXT +pub Uniform4uiv: FnPtr, +pub UniformBlockBinding: FnPtr, +/// Fallbacks: UniformMatrix2fvARB +pub UniformMatrix2fv: FnPtr, +/// Fallbacks: UniformMatrix2x3fvNV +pub UniformMatrix2x3fv: FnPtr, +/// Fallbacks: UniformMatrix2x4fvNV +pub UniformMatrix2x4fv: FnPtr, +/// Fallbacks: UniformMatrix3fvARB +pub UniformMatrix3fv: FnPtr, +/// Fallbacks: UniformMatrix3x2fvNV +pub UniformMatrix3x2fv: FnPtr, +/// Fallbacks: UniformMatrix3x4fvNV +pub UniformMatrix3x4fv: FnPtr, +/// Fallbacks: UniformMatrix4fvARB +pub UniformMatrix4fv: FnPtr, +/// Fallbacks: UniformMatrix4x2fvNV +pub UniformMatrix4x2fv: FnPtr, +/// Fallbacks: UniformMatrix4x3fvNV +pub UniformMatrix4x3fv: FnPtr, +/// Fallbacks: UnmapBufferARB, UnmapBufferOES +pub UnmapBuffer: FnPtr, +/// Fallbacks: UseProgramObjectARB +pub UseProgram: FnPtr, +/// Fallbacks: ValidateProgramARB +pub ValidateProgram: FnPtr, +/// Fallbacks: VertexAttrib1fARB, VertexAttrib1fNV +pub VertexAttrib1f: FnPtr, +/// Fallbacks: VertexAttrib1fvARB, VertexAttrib1fvNV +pub VertexAttrib1fv: FnPtr, +/// Fallbacks: VertexAttrib2fARB, VertexAttrib2fNV +pub VertexAttrib2f: FnPtr, +/// Fallbacks: VertexAttrib2fvARB, VertexAttrib2fvNV +pub VertexAttrib2fv: FnPtr, +/// Fallbacks: VertexAttrib3fARB, VertexAttrib3fNV +pub VertexAttrib3f: FnPtr, +/// Fallbacks: VertexAttrib3fvARB, VertexAttrib3fvNV +pub VertexAttrib3fv: FnPtr, +/// Fallbacks: VertexAttrib4fARB, VertexAttrib4fNV +pub VertexAttrib4f: FnPtr, +/// Fallbacks: VertexAttrib4fvARB, VertexAttrib4fvNV +pub VertexAttrib4fv: FnPtr, +/// Fallbacks: VertexAttribDivisorANGLE, VertexAttribDivisorARB, VertexAttribDivisorEXT, VertexAttribDivisorNV +pub VertexAttribDivisor: FnPtr, +/// Fallbacks: VertexAttribI4iEXT +pub VertexAttribI4i: FnPtr, +/// Fallbacks: VertexAttribI4ivEXT +pub VertexAttribI4iv: FnPtr, +/// Fallbacks: VertexAttribI4uiEXT +pub VertexAttribI4ui: FnPtr, +/// Fallbacks: VertexAttribI4uivEXT +pub VertexAttribI4uiv: FnPtr, +/// Fallbacks: VertexAttribIPointerEXT +pub VertexAttribIPointer: FnPtr, +/// Fallbacks: VertexAttribPointerARB +pub VertexAttribPointer: FnPtr, +pub Viewport: FnPtr, +/// Fallbacks: WaitSyncAPPLE +pub WaitSync: FnPtr, +_priv: () +} +impl Gles2 { + /// Load each OpenGL symbol using a custom load function. This allows for the + /// use of functions like `glfwGetProcAddress` or `SDL_GL_GetProcAddress`. + /// + /// ~~~ignore + /// let gl = Gl::load_with(|s| glfw.get_proc_address(s)); + /// ~~~ + #[allow(dead_code, unused_variables)] + pub fn load_with(mut loadfn: F) -> Gles2 where F: FnMut(&'static str) -> *const __gl_imports::raw::c_void { + #[inline(never)] + fn do_metaloadfn(loadfn: &mut dyn FnMut(&'static str) -> *const __gl_imports::raw::c_void, + symbol: &'static str, + symbols: &[&'static str]) + -> *const __gl_imports::raw::c_void { + let mut ptr = loadfn(symbol); + if ptr.is_null() { + for &sym in symbols { + ptr = loadfn(sym); + if !ptr.is_null() { break; } + } + } + ptr + } + let mut metaloadfn = |symbol: &'static str, symbols: &[&'static str]| { + do_metaloadfn(&mut loadfn, symbol, symbols) + }; + Gles2 { +ActiveTexture: FnPtr::new(metaloadfn("glActiveTexture", &["glActiveTextureARB"])), +AttachShader: FnPtr::new(metaloadfn("glAttachShader", &["glAttachObjectARB"])), +BeginQuery: FnPtr::new(metaloadfn("glBeginQuery", &["glBeginQueryARB"])), +BeginTransformFeedback: FnPtr::new(metaloadfn("glBeginTransformFeedback", &["glBeginTransformFeedbackEXT", "glBeginTransformFeedbackNV"])), +BindAttribLocation: FnPtr::new(metaloadfn("glBindAttribLocation", &["glBindAttribLocationARB"])), +BindBuffer: FnPtr::new(metaloadfn("glBindBuffer", &["glBindBufferARB"])), +BindBufferBase: FnPtr::new(metaloadfn("glBindBufferBase", &["glBindBufferBaseEXT", "glBindBufferBaseNV"])), +BindBufferRange: FnPtr::new(metaloadfn("glBindBufferRange", &["glBindBufferRangeEXT", "glBindBufferRangeNV"])), +BindFramebuffer: FnPtr::new(metaloadfn("glBindFramebuffer", &[])), +BindRenderbuffer: FnPtr::new(metaloadfn("glBindRenderbuffer", &[])), +BindSampler: FnPtr::new(metaloadfn("glBindSampler", &[])), +BindTexture: FnPtr::new(metaloadfn("glBindTexture", &["glBindTextureEXT"])), +BindTransformFeedback: FnPtr::new(metaloadfn("glBindTransformFeedback", &[])), +BindVertexArray: FnPtr::new(metaloadfn("glBindVertexArray", &["glBindVertexArrayOES"])), +BlendColor: FnPtr::new(metaloadfn("glBlendColor", &["glBlendColorEXT"])), +BlendEquation: FnPtr::new(metaloadfn("glBlendEquation", &["glBlendEquationEXT"])), +BlendEquationSeparate: FnPtr::new(metaloadfn("glBlendEquationSeparate", &["glBlendEquationSeparateEXT"])), +BlendFunc: FnPtr::new(metaloadfn("glBlendFunc", &[])), +BlendFuncSeparate: FnPtr::new(metaloadfn("glBlendFuncSeparate", &["glBlendFuncSeparateEXT", "glBlendFuncSeparateINGR"])), +BlitFramebuffer: FnPtr::new(metaloadfn("glBlitFramebuffer", &["glBlitFramebufferEXT", "glBlitFramebufferNV"])), +BufferData: FnPtr::new(metaloadfn("glBufferData", &["glBufferDataARB"])), +BufferSubData: FnPtr::new(metaloadfn("glBufferSubData", &["glBufferSubDataARB"])), +CheckFramebufferStatus: FnPtr::new(metaloadfn("glCheckFramebufferStatus", &["glCheckFramebufferStatusEXT"])), +Clear: FnPtr::new(metaloadfn("glClear", &[])), +ClearBufferfi: FnPtr::new(metaloadfn("glClearBufferfi", &[])), +ClearBufferfv: FnPtr::new(metaloadfn("glClearBufferfv", &[])), +ClearBufferiv: FnPtr::new(metaloadfn("glClearBufferiv", &[])), +ClearBufferuiv: FnPtr::new(metaloadfn("glClearBufferuiv", &[])), +ClearColor: FnPtr::new(metaloadfn("glClearColor", &[])), +ClearDepthf: FnPtr::new(metaloadfn("glClearDepthf", &["glClearDepthfOES"])), +ClearStencil: FnPtr::new(metaloadfn("glClearStencil", &[])), +ClientWaitSync: FnPtr::new(metaloadfn("glClientWaitSync", &["glClientWaitSyncAPPLE"])), +ColorMask: FnPtr::new(metaloadfn("glColorMask", &[])), +CompileShader: FnPtr::new(metaloadfn("glCompileShader", &["glCompileShaderARB"])), +CompressedTexImage2D: FnPtr::new(metaloadfn("glCompressedTexImage2D", &["glCompressedTexImage2DARB"])), +CompressedTexImage3D: FnPtr::new(metaloadfn("glCompressedTexImage3D", &["glCompressedTexImage3DARB"])), +CompressedTexSubImage2D: FnPtr::new(metaloadfn("glCompressedTexSubImage2D", &["glCompressedTexSubImage2DARB"])), +CompressedTexSubImage3D: FnPtr::new(metaloadfn("glCompressedTexSubImage3D", &["glCompressedTexSubImage3DARB"])), +CopyBufferSubData: FnPtr::new(metaloadfn("glCopyBufferSubData", &["glCopyBufferSubDataNV"])), +CopyTexImage2D: FnPtr::new(metaloadfn("glCopyTexImage2D", &["glCopyTexImage2DEXT"])), +CopyTexSubImage2D: FnPtr::new(metaloadfn("glCopyTexSubImage2D", &["glCopyTexSubImage2DEXT"])), +CopyTexSubImage3D: FnPtr::new(metaloadfn("glCopyTexSubImage3D", &["glCopyTexSubImage3DEXT"])), +CreateProgram: FnPtr::new(metaloadfn("glCreateProgram", &["glCreateProgramObjectARB"])), +CreateShader: FnPtr::new(metaloadfn("glCreateShader", &["glCreateShaderObjectARB"])), +CullFace: FnPtr::new(metaloadfn("glCullFace", &[])), +DeleteBuffers: FnPtr::new(metaloadfn("glDeleteBuffers", &["glDeleteBuffersARB"])), +DeleteFramebuffers: FnPtr::new(metaloadfn("glDeleteFramebuffers", &["glDeleteFramebuffersEXT"])), +DeleteProgram: FnPtr::new(metaloadfn("glDeleteProgram", &[])), +DeleteQueries: FnPtr::new(metaloadfn("glDeleteQueries", &["glDeleteQueriesARB"])), +DeleteRenderbuffers: FnPtr::new(metaloadfn("glDeleteRenderbuffers", &["glDeleteRenderbuffersEXT"])), +DeleteSamplers: FnPtr::new(metaloadfn("glDeleteSamplers", &[])), +DeleteShader: FnPtr::new(metaloadfn("glDeleteShader", &[])), +DeleteSync: FnPtr::new(metaloadfn("glDeleteSync", &["glDeleteSyncAPPLE"])), +DeleteTextures: FnPtr::new(metaloadfn("glDeleteTextures", &[])), +DeleteTransformFeedbacks: FnPtr::new(metaloadfn("glDeleteTransformFeedbacks", &["glDeleteTransformFeedbacksNV"])), +DeleteVertexArrays: FnPtr::new(metaloadfn("glDeleteVertexArrays", &["glDeleteVertexArraysAPPLE", "glDeleteVertexArraysOES"])), +DepthFunc: FnPtr::new(metaloadfn("glDepthFunc", &[])), +DepthMask: FnPtr::new(metaloadfn("glDepthMask", &[])), +DepthRangef: FnPtr::new(metaloadfn("glDepthRangef", &["glDepthRangefOES"])), +DetachShader: FnPtr::new(metaloadfn("glDetachShader", &["glDetachObjectARB"])), +Disable: FnPtr::new(metaloadfn("glDisable", &[])), +DisableVertexAttribArray: FnPtr::new(metaloadfn("glDisableVertexAttribArray", &["glDisableVertexAttribArrayARB"])), +DrawArrays: FnPtr::new(metaloadfn("glDrawArrays", &["glDrawArraysEXT"])), +DrawArraysInstanced: FnPtr::new(metaloadfn("glDrawArraysInstanced", &["glDrawArraysInstancedANGLE", "glDrawArraysInstancedARB", "glDrawArraysInstancedEXT", "glDrawArraysInstancedNV"])), +DrawBuffers: FnPtr::new(metaloadfn("glDrawBuffers", &["glDrawBuffersARB", "glDrawBuffersATI", "glDrawBuffersEXT"])), +DrawElements: FnPtr::new(metaloadfn("glDrawElements", &[])), +DrawElementsInstanced: FnPtr::new(metaloadfn("glDrawElementsInstanced", &["glDrawElementsInstancedANGLE", "glDrawElementsInstancedARB", "glDrawElementsInstancedEXT", "glDrawElementsInstancedNV"])), +DrawRangeElements: FnPtr::new(metaloadfn("glDrawRangeElements", &["glDrawRangeElementsEXT"])), +Enable: FnPtr::new(metaloadfn("glEnable", &[])), +EnableVertexAttribArray: FnPtr::new(metaloadfn("glEnableVertexAttribArray", &["glEnableVertexAttribArrayARB"])), +EndQuery: FnPtr::new(metaloadfn("glEndQuery", &["glEndQueryARB"])), +EndTransformFeedback: FnPtr::new(metaloadfn("glEndTransformFeedback", &["glEndTransformFeedbackEXT", "glEndTransformFeedbackNV"])), +FenceSync: FnPtr::new(metaloadfn("glFenceSync", &["glFenceSyncAPPLE"])), +Finish: FnPtr::new(metaloadfn("glFinish", &[])), +Flush: FnPtr::new(metaloadfn("glFlush", &[])), +FlushMappedBufferRange: FnPtr::new(metaloadfn("glFlushMappedBufferRange", &["glFlushMappedBufferRangeAPPLE", "glFlushMappedBufferRangeEXT"])), +FramebufferRenderbuffer: FnPtr::new(metaloadfn("glFramebufferRenderbuffer", &["glFramebufferRenderbufferEXT"])), +FramebufferTexture2D: FnPtr::new(metaloadfn("glFramebufferTexture2D", &["glFramebufferTexture2DEXT"])), +FramebufferTextureLayer: FnPtr::new(metaloadfn("glFramebufferTextureLayer", &["glFramebufferTextureLayerARB", "glFramebufferTextureLayerEXT"])), +FrontFace: FnPtr::new(metaloadfn("glFrontFace", &[])), +GenBuffers: FnPtr::new(metaloadfn("glGenBuffers", &["glGenBuffersARB"])), +GenFramebuffers: FnPtr::new(metaloadfn("glGenFramebuffers", &["glGenFramebuffersEXT"])), +GenQueries: FnPtr::new(metaloadfn("glGenQueries", &["glGenQueriesARB"])), +GenRenderbuffers: FnPtr::new(metaloadfn("glGenRenderbuffers", &["glGenRenderbuffersEXT"])), +GenSamplers: FnPtr::new(metaloadfn("glGenSamplers", &[])), +GenTextures: FnPtr::new(metaloadfn("glGenTextures", &[])), +GenTransformFeedbacks: FnPtr::new(metaloadfn("glGenTransformFeedbacks", &["glGenTransformFeedbacksNV"])), +GenVertexArrays: FnPtr::new(metaloadfn("glGenVertexArrays", &["glGenVertexArraysAPPLE", "glGenVertexArraysOES"])), +GenerateMipmap: FnPtr::new(metaloadfn("glGenerateMipmap", &["glGenerateMipmapEXT"])), +GetActiveAttrib: FnPtr::new(metaloadfn("glGetActiveAttrib", &["glGetActiveAttribARB"])), +GetActiveUniform: FnPtr::new(metaloadfn("glGetActiveUniform", &["glGetActiveUniformARB"])), +GetActiveUniformBlockName: FnPtr::new(metaloadfn("glGetActiveUniformBlockName", &[])), +GetActiveUniformBlockiv: FnPtr::new(metaloadfn("glGetActiveUniformBlockiv", &[])), +GetActiveUniformsiv: FnPtr::new(metaloadfn("glGetActiveUniformsiv", &[])), +GetAttachedShaders: FnPtr::new(metaloadfn("glGetAttachedShaders", &[])), +GetAttribLocation: FnPtr::new(metaloadfn("glGetAttribLocation", &["glGetAttribLocationARB"])), +GetBooleanv: FnPtr::new(metaloadfn("glGetBooleanv", &[])), +GetBufferParameteri64v: FnPtr::new(metaloadfn("glGetBufferParameteri64v", &[])), +GetBufferParameteriv: FnPtr::new(metaloadfn("glGetBufferParameteriv", &["glGetBufferParameterivARB"])), +GetBufferPointerv: FnPtr::new(metaloadfn("glGetBufferPointerv", &["glGetBufferPointervARB", "glGetBufferPointervOES"])), +GetError: FnPtr::new(metaloadfn("glGetError", &[])), +GetFloatv: FnPtr::new(metaloadfn("glGetFloatv", &[])), +GetFragDataLocation: FnPtr::new(metaloadfn("glGetFragDataLocation", &["glGetFragDataLocationEXT"])), +GetFramebufferAttachmentParameteriv: FnPtr::new(metaloadfn("glGetFramebufferAttachmentParameteriv", &["glGetFramebufferAttachmentParameterivEXT"])), +GetInteger64i_v: FnPtr::new(metaloadfn("glGetInteger64i_v", &[])), +GetInteger64v: FnPtr::new(metaloadfn("glGetInteger64v", &["glGetInteger64vAPPLE"])), +GetIntegeri_v: FnPtr::new(metaloadfn("glGetIntegeri_v", &["glGetIntegerIndexedvEXT"])), +GetIntegerv: FnPtr::new(metaloadfn("glGetIntegerv", &[])), +GetInternalformativ: FnPtr::new(metaloadfn("glGetInternalformativ", &[])), +GetProgramBinary: FnPtr::new(metaloadfn("glGetProgramBinary", &["glGetProgramBinaryOES"])), +GetProgramInfoLog: FnPtr::new(metaloadfn("glGetProgramInfoLog", &[])), +GetProgramiv: FnPtr::new(metaloadfn("glGetProgramiv", &[])), +GetQueryObjectuiv: FnPtr::new(metaloadfn("glGetQueryObjectuiv", &["glGetQueryObjectuivARB"])), +GetQueryiv: FnPtr::new(metaloadfn("glGetQueryiv", &["glGetQueryivARB"])), +GetRenderbufferParameteriv: FnPtr::new(metaloadfn("glGetRenderbufferParameteriv", &["glGetRenderbufferParameterivEXT"])), +GetSamplerParameterfv: FnPtr::new(metaloadfn("glGetSamplerParameterfv", &[])), +GetSamplerParameteriv: FnPtr::new(metaloadfn("glGetSamplerParameteriv", &[])), +GetShaderInfoLog: FnPtr::new(metaloadfn("glGetShaderInfoLog", &[])), +GetShaderPrecisionFormat: FnPtr::new(metaloadfn("glGetShaderPrecisionFormat", &[])), +GetShaderSource: FnPtr::new(metaloadfn("glGetShaderSource", &["glGetShaderSourceARB"])), +GetShaderiv: FnPtr::new(metaloadfn("glGetShaderiv", &[])), +GetString: FnPtr::new(metaloadfn("glGetString", &[])), +GetStringi: FnPtr::new(metaloadfn("glGetStringi", &[])), +GetSynciv: FnPtr::new(metaloadfn("glGetSynciv", &["glGetSyncivAPPLE"])), +GetTexParameterfv: FnPtr::new(metaloadfn("glGetTexParameterfv", &[])), +GetTexParameteriv: FnPtr::new(metaloadfn("glGetTexParameteriv", &[])), +GetTransformFeedbackVarying: FnPtr::new(metaloadfn("glGetTransformFeedbackVarying", &["glGetTransformFeedbackVaryingEXT"])), +GetUniformBlockIndex: FnPtr::new(metaloadfn("glGetUniformBlockIndex", &[])), +GetUniformIndices: FnPtr::new(metaloadfn("glGetUniformIndices", &[])), +GetUniformLocation: FnPtr::new(metaloadfn("glGetUniformLocation", &["glGetUniformLocationARB"])), +GetUniformfv: FnPtr::new(metaloadfn("glGetUniformfv", &["glGetUniformfvARB"])), +GetUniformiv: FnPtr::new(metaloadfn("glGetUniformiv", &["glGetUniformivARB"])), +GetUniformuiv: FnPtr::new(metaloadfn("glGetUniformuiv", &["glGetUniformuivEXT"])), +GetVertexAttribIiv: FnPtr::new(metaloadfn("glGetVertexAttribIiv", &["glGetVertexAttribIivEXT"])), +GetVertexAttribIuiv: FnPtr::new(metaloadfn("glGetVertexAttribIuiv", &["glGetVertexAttribIuivEXT"])), +GetVertexAttribPointerv: FnPtr::new(metaloadfn("glGetVertexAttribPointerv", &["glGetVertexAttribPointervARB", "glGetVertexAttribPointervNV"])), +GetVertexAttribfv: FnPtr::new(metaloadfn("glGetVertexAttribfv", &["glGetVertexAttribfvARB", "glGetVertexAttribfvNV"])), +GetVertexAttribiv: FnPtr::new(metaloadfn("glGetVertexAttribiv", &["glGetVertexAttribivARB", "glGetVertexAttribivNV"])), +Hint: FnPtr::new(metaloadfn("glHint", &[])), +InvalidateFramebuffer: FnPtr::new(metaloadfn("glInvalidateFramebuffer", &[])), +InvalidateSubFramebuffer: FnPtr::new(metaloadfn("glInvalidateSubFramebuffer", &[])), +IsBuffer: FnPtr::new(metaloadfn("glIsBuffer", &["glIsBufferARB"])), +IsEnabled: FnPtr::new(metaloadfn("glIsEnabled", &[])), +IsFramebuffer: FnPtr::new(metaloadfn("glIsFramebuffer", &["glIsFramebufferEXT"])), +IsProgram: FnPtr::new(metaloadfn("glIsProgram", &[])), +IsQuery: FnPtr::new(metaloadfn("glIsQuery", &["glIsQueryARB"])), +IsRenderbuffer: FnPtr::new(metaloadfn("glIsRenderbuffer", &["glIsRenderbufferEXT"])), +IsSampler: FnPtr::new(metaloadfn("glIsSampler", &[])), +IsShader: FnPtr::new(metaloadfn("glIsShader", &[])), +IsSync: FnPtr::new(metaloadfn("glIsSync", &["glIsSyncAPPLE"])), +IsTexture: FnPtr::new(metaloadfn("glIsTexture", &[])), +IsTransformFeedback: FnPtr::new(metaloadfn("glIsTransformFeedback", &["glIsTransformFeedbackNV"])), +IsVertexArray: FnPtr::new(metaloadfn("glIsVertexArray", &["glIsVertexArrayAPPLE", "glIsVertexArrayOES"])), +LineWidth: FnPtr::new(metaloadfn("glLineWidth", &[])), +LinkProgram: FnPtr::new(metaloadfn("glLinkProgram", &["glLinkProgramARB"])), +MapBufferRange: FnPtr::new(metaloadfn("glMapBufferRange", &["glMapBufferRangeEXT"])), +PauseTransformFeedback: FnPtr::new(metaloadfn("glPauseTransformFeedback", &["glPauseTransformFeedbackNV"])), +PixelStorei: FnPtr::new(metaloadfn("glPixelStorei", &[])), +PolygonOffset: FnPtr::new(metaloadfn("glPolygonOffset", &[])), +ProgramBinary: FnPtr::new(metaloadfn("glProgramBinary", &["glProgramBinaryOES"])), +ProgramParameteri: FnPtr::new(metaloadfn("glProgramParameteri", &["glProgramParameteriARB", "glProgramParameteriEXT"])), +ReadBuffer: FnPtr::new(metaloadfn("glReadBuffer", &[])), +ReadPixels: FnPtr::new(metaloadfn("glReadPixels", &[])), +ReleaseShaderCompiler: FnPtr::new(metaloadfn("glReleaseShaderCompiler", &[])), +RenderbufferStorage: FnPtr::new(metaloadfn("glRenderbufferStorage", &["glRenderbufferStorageEXT"])), +RenderbufferStorageMultisample: FnPtr::new(metaloadfn("glRenderbufferStorageMultisample", &["glRenderbufferStorageMultisampleEXT", "glRenderbufferStorageMultisampleNV"])), +ResumeTransformFeedback: FnPtr::new(metaloadfn("glResumeTransformFeedback", &["glResumeTransformFeedbackNV"])), +SampleCoverage: FnPtr::new(metaloadfn("glSampleCoverage", &["glSampleCoverageARB"])), +SamplerParameterf: FnPtr::new(metaloadfn("glSamplerParameterf", &[])), +SamplerParameterfv: FnPtr::new(metaloadfn("glSamplerParameterfv", &[])), +SamplerParameteri: FnPtr::new(metaloadfn("glSamplerParameteri", &[])), +SamplerParameteriv: FnPtr::new(metaloadfn("glSamplerParameteriv", &[])), +Scissor: FnPtr::new(metaloadfn("glScissor", &[])), +ShaderBinary: FnPtr::new(metaloadfn("glShaderBinary", &[])), +ShaderSource: FnPtr::new(metaloadfn("glShaderSource", &["glShaderSourceARB"])), +StencilFunc: FnPtr::new(metaloadfn("glStencilFunc", &[])), +StencilFuncSeparate: FnPtr::new(metaloadfn("glStencilFuncSeparate", &[])), +StencilMask: FnPtr::new(metaloadfn("glStencilMask", &[])), +StencilMaskSeparate: FnPtr::new(metaloadfn("glStencilMaskSeparate", &[])), +StencilOp: FnPtr::new(metaloadfn("glStencilOp", &[])), +StencilOpSeparate: FnPtr::new(metaloadfn("glStencilOpSeparate", &["glStencilOpSeparateATI"])), +TexImage2D: FnPtr::new(metaloadfn("glTexImage2D", &[])), +TexImage3D: FnPtr::new(metaloadfn("glTexImage3D", &["glTexImage3DEXT"])), +TexParameterf: FnPtr::new(metaloadfn("glTexParameterf", &[])), +TexParameterfv: FnPtr::new(metaloadfn("glTexParameterfv", &[])), +TexParameteri: FnPtr::new(metaloadfn("glTexParameteri", &[])), +TexParameteriv: FnPtr::new(metaloadfn("glTexParameteriv", &[])), +TexStorage2D: FnPtr::new(metaloadfn("glTexStorage2D", &["glTexStorage2DEXT"])), +TexStorage3D: FnPtr::new(metaloadfn("glTexStorage3D", &["glTexStorage3DEXT"])), +TexSubImage2D: FnPtr::new(metaloadfn("glTexSubImage2D", &["glTexSubImage2DEXT"])), +TexSubImage3D: FnPtr::new(metaloadfn("glTexSubImage3D", &["glTexSubImage3DEXT"])), +TransformFeedbackVaryings: FnPtr::new(metaloadfn("glTransformFeedbackVaryings", &["glTransformFeedbackVaryingsEXT"])), +Uniform1f: FnPtr::new(metaloadfn("glUniform1f", &["glUniform1fARB"])), +Uniform1fv: FnPtr::new(metaloadfn("glUniform1fv", &["glUniform1fvARB"])), +Uniform1i: FnPtr::new(metaloadfn("glUniform1i", &["glUniform1iARB"])), +Uniform1iv: FnPtr::new(metaloadfn("glUniform1iv", &["glUniform1ivARB"])), +Uniform1ui: FnPtr::new(metaloadfn("glUniform1ui", &["glUniform1uiEXT"])), +Uniform1uiv: FnPtr::new(metaloadfn("glUniform1uiv", &["glUniform1uivEXT"])), +Uniform2f: FnPtr::new(metaloadfn("glUniform2f", &["glUniform2fARB"])), +Uniform2fv: FnPtr::new(metaloadfn("glUniform2fv", &["glUniform2fvARB"])), +Uniform2i: FnPtr::new(metaloadfn("glUniform2i", &["glUniform2iARB"])), +Uniform2iv: FnPtr::new(metaloadfn("glUniform2iv", &["glUniform2ivARB"])), +Uniform2ui: FnPtr::new(metaloadfn("glUniform2ui", &["glUniform2uiEXT"])), +Uniform2uiv: FnPtr::new(metaloadfn("glUniform2uiv", &["glUniform2uivEXT"])), +Uniform3f: FnPtr::new(metaloadfn("glUniform3f", &["glUniform3fARB"])), +Uniform3fv: FnPtr::new(metaloadfn("glUniform3fv", &["glUniform3fvARB"])), +Uniform3i: FnPtr::new(metaloadfn("glUniform3i", &["glUniform3iARB"])), +Uniform3iv: FnPtr::new(metaloadfn("glUniform3iv", &["glUniform3ivARB"])), +Uniform3ui: FnPtr::new(metaloadfn("glUniform3ui", &["glUniform3uiEXT"])), +Uniform3uiv: FnPtr::new(metaloadfn("glUniform3uiv", &["glUniform3uivEXT"])), +Uniform4f: FnPtr::new(metaloadfn("glUniform4f", &["glUniform4fARB"])), +Uniform4fv: FnPtr::new(metaloadfn("glUniform4fv", &["glUniform4fvARB"])), +Uniform4i: FnPtr::new(metaloadfn("glUniform4i", &["glUniform4iARB"])), +Uniform4iv: FnPtr::new(metaloadfn("glUniform4iv", &["glUniform4ivARB"])), +Uniform4ui: FnPtr::new(metaloadfn("glUniform4ui", &["glUniform4uiEXT"])), +Uniform4uiv: FnPtr::new(metaloadfn("glUniform4uiv", &["glUniform4uivEXT"])), +UniformBlockBinding: FnPtr::new(metaloadfn("glUniformBlockBinding", &[])), +UniformMatrix2fv: FnPtr::new(metaloadfn("glUniformMatrix2fv", &["glUniformMatrix2fvARB"])), +UniformMatrix2x3fv: FnPtr::new(metaloadfn("glUniformMatrix2x3fv", &["glUniformMatrix2x3fvNV"])), +UniformMatrix2x4fv: FnPtr::new(metaloadfn("glUniformMatrix2x4fv", &["glUniformMatrix2x4fvNV"])), +UniformMatrix3fv: FnPtr::new(metaloadfn("glUniformMatrix3fv", &["glUniformMatrix3fvARB"])), +UniformMatrix3x2fv: FnPtr::new(metaloadfn("glUniformMatrix3x2fv", &["glUniformMatrix3x2fvNV"])), +UniformMatrix3x4fv: FnPtr::new(metaloadfn("glUniformMatrix3x4fv", &["glUniformMatrix3x4fvNV"])), +UniformMatrix4fv: FnPtr::new(metaloadfn("glUniformMatrix4fv", &["glUniformMatrix4fvARB"])), +UniformMatrix4x2fv: FnPtr::new(metaloadfn("glUniformMatrix4x2fv", &["glUniformMatrix4x2fvNV"])), +UniformMatrix4x3fv: FnPtr::new(metaloadfn("glUniformMatrix4x3fv", &["glUniformMatrix4x3fvNV"])), +UnmapBuffer: FnPtr::new(metaloadfn("glUnmapBuffer", &["glUnmapBufferARB", "glUnmapBufferOES"])), +UseProgram: FnPtr::new(metaloadfn("glUseProgram", &["glUseProgramObjectARB"])), +ValidateProgram: FnPtr::new(metaloadfn("glValidateProgram", &["glValidateProgramARB"])), +VertexAttrib1f: FnPtr::new(metaloadfn("glVertexAttrib1f", &["glVertexAttrib1fARB", "glVertexAttrib1fNV"])), +VertexAttrib1fv: FnPtr::new(metaloadfn("glVertexAttrib1fv", &["glVertexAttrib1fvARB", "glVertexAttrib1fvNV"])), +VertexAttrib2f: FnPtr::new(metaloadfn("glVertexAttrib2f", &["glVertexAttrib2fARB", "glVertexAttrib2fNV"])), +VertexAttrib2fv: FnPtr::new(metaloadfn("glVertexAttrib2fv", &["glVertexAttrib2fvARB", "glVertexAttrib2fvNV"])), +VertexAttrib3f: FnPtr::new(metaloadfn("glVertexAttrib3f", &["glVertexAttrib3fARB", "glVertexAttrib3fNV"])), +VertexAttrib3fv: FnPtr::new(metaloadfn("glVertexAttrib3fv", &["glVertexAttrib3fvARB", "glVertexAttrib3fvNV"])), +VertexAttrib4f: FnPtr::new(metaloadfn("glVertexAttrib4f", &["glVertexAttrib4fARB", "glVertexAttrib4fNV"])), +VertexAttrib4fv: FnPtr::new(metaloadfn("glVertexAttrib4fv", &["glVertexAttrib4fvARB", "glVertexAttrib4fvNV"])), +VertexAttribDivisor: FnPtr::new(metaloadfn("glVertexAttribDivisor", &["glVertexAttribDivisorANGLE", "glVertexAttribDivisorARB", "glVertexAttribDivisorEXT", "glVertexAttribDivisorNV"])), +VertexAttribI4i: FnPtr::new(metaloadfn("glVertexAttribI4i", &["glVertexAttribI4iEXT"])), +VertexAttribI4iv: FnPtr::new(metaloadfn("glVertexAttribI4iv", &["glVertexAttribI4ivEXT"])), +VertexAttribI4ui: FnPtr::new(metaloadfn("glVertexAttribI4ui", &["glVertexAttribI4uiEXT"])), +VertexAttribI4uiv: FnPtr::new(metaloadfn("glVertexAttribI4uiv", &["glVertexAttribI4uivEXT"])), +VertexAttribIPointer: FnPtr::new(metaloadfn("glVertexAttribIPointer", &["glVertexAttribIPointerEXT"])), +VertexAttribPointer: FnPtr::new(metaloadfn("glVertexAttribPointer", &["glVertexAttribPointerARB"])), +Viewport: FnPtr::new(metaloadfn("glViewport", &[])), +WaitSync: FnPtr::new(metaloadfn("glWaitSync", &["glWaitSyncAPPLE"])), +_priv: () +} + } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ActiveTexture(&self, texture: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.ActiveTexture.f)(texture) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn AttachShader(&self, program: types::GLuint, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.AttachShader.f)(program, shader) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BeginQuery(&self, target: types::GLenum, id: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BeginQuery.f)(target, id) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BeginTransformFeedback(&self, primitiveMode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.BeginTransformFeedback.f)(primitiveMode) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BindAttribLocation(&self, program: types::GLuint, index: types::GLuint, name: *const types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, *const types::GLchar) -> ()>(self.BindAttribLocation.f)(program, index, name) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BindBuffer(&self, target: types::GLenum, buffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindBuffer.f)(target, buffer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BindBufferBase(&self, target: types::GLenum, index: types::GLuint, buffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, types::GLuint) -> ()>(self.BindBufferBase.f)(target, index, buffer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BindBufferRange(&self, target: types::GLenum, index: types::GLuint, buffer: types::GLuint, offset: types::GLintptr, size: types::GLsizeiptr) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, types::GLuint, types::GLintptr, types::GLsizeiptr) -> ()>(self.BindBufferRange.f)(target, index, buffer, offset, size) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BindFramebuffer(&self, target: types::GLenum, framebuffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindFramebuffer.f)(target, framebuffer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BindRenderbuffer(&self, target: types::GLenum, renderbuffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindRenderbuffer.f)(target, renderbuffer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BindSampler(&self, unit: types::GLuint, sampler: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.BindSampler.f)(unit, sampler) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BindTexture(&self, target: types::GLenum, texture: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindTexture.f)(target, texture) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BindTransformFeedback(&self, target: types::GLenum, id: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindTransformFeedback.f)(target, id) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BindVertexArray(&self, array: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.BindVertexArray.f)(array) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BlendColor(&self, red: types::GLfloat, green: types::GLfloat, blue: types::GLfloat, alpha: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.BlendColor.f)(red, green, blue, alpha) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BlendEquation(&self, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.BlendEquation.f)(mode) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BlendEquationSeparate(&self, modeRGB: types::GLenum, modeAlpha: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum) -> ()>(self.BlendEquationSeparate.f)(modeRGB, modeAlpha) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BlendFunc(&self, sfactor: types::GLenum, dfactor: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum) -> ()>(self.BlendFunc.f)(sfactor, dfactor) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BlendFuncSeparate(&self, sfactorRGB: types::GLenum, dfactorRGB: types::GLenum, sfactorAlpha: types::GLenum, dfactorAlpha: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLenum) -> ()>(self.BlendFuncSeparate.f)(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BlitFramebuffer(&self, srcX0: types::GLint, srcY0: types::GLint, srcX1: types::GLint, srcY1: types::GLint, dstX0: types::GLint, dstY0: types::GLint, dstX1: types::GLint, dstY1: types::GLint, mask: types::GLbitfield, filter: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLbitfield, types::GLenum) -> ()>(self.BlitFramebuffer.f)(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BufferData(&self, target: types::GLenum, size: types::GLsizeiptr, data: *const __gl_imports::raw::c_void, usage: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizeiptr, *const __gl_imports::raw::c_void, types::GLenum) -> ()>(self.BufferData.f)(target, size, data, usage) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn BufferSubData(&self, target: types::GLenum, offset: types::GLintptr, size: types::GLsizeiptr, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLintptr, types::GLsizeiptr, *const __gl_imports::raw::c_void) -> ()>(self.BufferSubData.f)(target, offset, size, data) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CheckFramebufferStatus(&self, target: types::GLenum) -> types::GLenum { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLenum>(self.CheckFramebufferStatus.f)(target) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Clear(&self, mask: types::GLbitfield) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLbitfield) -> ()>(self.Clear.f)(mask) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ClearBufferfi(&self, buffer: types::GLenum, drawbuffer: types::GLint, depth: types::GLfloat, stencil: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLfloat, types::GLint) -> ()>(self.ClearBufferfi.f)(buffer, drawbuffer, depth, stencil) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ClearBufferfv(&self, buffer: types::GLenum, drawbuffer: types::GLint, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, *const types::GLfloat) -> ()>(self.ClearBufferfv.f)(buffer, drawbuffer, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ClearBufferiv(&self, buffer: types::GLenum, drawbuffer: types::GLint, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, *const types::GLint) -> ()>(self.ClearBufferiv.f)(buffer, drawbuffer, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ClearBufferuiv(&self, buffer: types::GLenum, drawbuffer: types::GLint, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, *const types::GLuint) -> ()>(self.ClearBufferuiv.f)(buffer, drawbuffer, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ClearColor(&self, red: types::GLfloat, green: types::GLfloat, blue: types::GLfloat, alpha: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.ClearColor.f)(red, green, blue, alpha) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ClearDepthf(&self, d: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat) -> ()>(self.ClearDepthf.f)(d) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ClearStencil(&self, s: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint) -> ()>(self.ClearStencil.f)(s) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ClientWaitSync(&self, sync: types::GLsync, flags: types::GLbitfield, timeout: types::GLuint64) -> types::GLenum { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync, types::GLbitfield, types::GLuint64) -> types::GLenum>(self.ClientWaitSync.f)(sync, flags, timeout) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ColorMask(&self, red: types::GLboolean, green: types::GLboolean, blue: types::GLboolean, alpha: types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLboolean, types::GLboolean, types::GLboolean, types::GLboolean) -> ()>(self.ColorMask.f)(red, green, blue, alpha) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CompileShader(&self, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.CompileShader.f)(shader) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CompressedTexImage2D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei, border: types::GLint, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLenum, types::GLsizei, types::GLsizei, types::GLint, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexImage2D.f)(target, level, internalformat, width, height, border, imageSize, data) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CompressedTexImage3D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, border: types::GLint, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLenum, types::GLsizei, types::GLsizei, types::GLsizei, types::GLint, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexImage3D.f)(target, level, internalformat, width, height, depth, border, imageSize, data) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CompressedTexSubImage2D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, format: types::GLenum, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLenum, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexSubImage2D.f)(target, level, xoffset, yoffset, width, height, format, imageSize, data) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CompressedTexSubImage3D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, zoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, format: types::GLenum, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLsizei, types::GLenum, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexSubImage3D.f)(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CopyBufferSubData(&self, readTarget: types::GLenum, writeTarget: types::GLenum, readOffset: types::GLintptr, writeOffset: types::GLintptr, size: types::GLsizeiptr) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLintptr, types::GLintptr, types::GLsizeiptr) -> ()>(self.CopyBufferSubData.f)(readTarget, writeTarget, readOffset, writeOffset, size) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CopyTexImage2D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLenum, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei, border: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLint) -> ()>(self.CopyTexImage2D.f)(target, level, internalformat, x, y, width, height, border) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CopyTexSubImage2D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.CopyTexSubImage2D.f)(target, level, xoffset, yoffset, x, y, width, height) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CopyTexSubImage3D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, zoffset: types::GLint, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.CopyTexSubImage3D.f)(target, level, xoffset, yoffset, zoffset, x, y, width, height) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CreateProgram(&self, ) -> types::GLuint { __gl_imports::mem::transmute::<_, extern "system" fn() -> types::GLuint>(self.CreateProgram.f)() } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CreateShader(&self, type_: types::GLenum) -> types::GLuint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLuint>(self.CreateShader.f)(type_) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn CullFace(&self, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.CullFace.f)(mode) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DeleteBuffers(&self, n: types::GLsizei, buffers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteBuffers.f)(n, buffers) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DeleteFramebuffers(&self, n: types::GLsizei, framebuffers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteFramebuffers.f)(n, framebuffers) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DeleteProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.DeleteProgram.f)(program) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DeleteQueries(&self, n: types::GLsizei, ids: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteQueries.f)(n, ids) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DeleteRenderbuffers(&self, n: types::GLsizei, renderbuffers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteRenderbuffers.f)(n, renderbuffers) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DeleteSamplers(&self, count: types::GLsizei, samplers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteSamplers.f)(count, samplers) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DeleteShader(&self, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.DeleteShader.f)(shader) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DeleteSync(&self, sync: types::GLsync) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync) -> ()>(self.DeleteSync.f)(sync) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DeleteTextures(&self, n: types::GLsizei, textures: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteTextures.f)(n, textures) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DeleteTransformFeedbacks(&self, n: types::GLsizei, ids: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteTransformFeedbacks.f)(n, ids) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DeleteVertexArrays(&self, n: types::GLsizei, arrays: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteVertexArrays.f)(n, arrays) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DepthFunc(&self, func: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.DepthFunc.f)(func) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DepthMask(&self, flag: types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLboolean) -> ()>(self.DepthMask.f)(flag) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DepthRangef(&self, n: types::GLfloat, f: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat) -> ()>(self.DepthRangef.f)(n, f) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DetachShader(&self, program: types::GLuint, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.DetachShader.f)(program, shader) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Disable(&self, cap: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.Disable.f)(cap) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DisableVertexAttribArray(&self, index: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.DisableVertexAttribArray.f)(index) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DrawArrays(&self, mode: types::GLenum, first: types::GLint, count: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLsizei) -> ()>(self.DrawArrays.f)(mode, first, count) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DrawArraysInstanced(&self, mode: types::GLenum, first: types::GLint, count: types::GLsizei, instancecount: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.DrawArraysInstanced.f)(mode, first, count, instancecount) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DrawBuffers(&self, n: types::GLsizei, bufs: *const types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLenum) -> ()>(self.DrawBuffers.f)(n, bufs) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DrawElements(&self, mode: types::GLenum, count: types::GLsizei, type_: types::GLenum, indices: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.DrawElements.f)(mode, count, type_, indices) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DrawElementsInstanced(&self, mode: types::GLenum, count: types::GLsizei, type_: types::GLenum, indices: *const __gl_imports::raw::c_void, instancecount: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, *const __gl_imports::raw::c_void, types::GLsizei) -> ()>(self.DrawElementsInstanced.f)(mode, count, type_, indices, instancecount) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn DrawRangeElements(&self, mode: types::GLenum, start: types::GLuint, end: types::GLuint, count: types::GLsizei, type_: types::GLenum, indices: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, types::GLuint, types::GLsizei, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.DrawRangeElements.f)(mode, start, end, count, type_, indices) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Enable(&self, cap: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.Enable.f)(cap) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn EnableVertexAttribArray(&self, index: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.EnableVertexAttribArray.f)(index) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn EndQuery(&self, target: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.EndQuery.f)(target) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn EndTransformFeedback(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.EndTransformFeedback.f)() } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn FenceSync(&self, condition: types::GLenum, flags: types::GLbitfield) -> types::GLsync { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLbitfield) -> types::GLsync>(self.FenceSync.f)(condition, flags) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Finish(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.Finish.f)() } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Flush(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.Flush.f)() } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn FlushMappedBufferRange(&self, target: types::GLenum, offset: types::GLintptr, length: types::GLsizeiptr) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLintptr, types::GLsizeiptr) -> ()>(self.FlushMappedBufferRange.f)(target, offset, length) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn FramebufferRenderbuffer(&self, target: types::GLenum, attachment: types::GLenum, renderbuffertarget: types::GLenum, renderbuffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLuint) -> ()>(self.FramebufferRenderbuffer.f)(target, attachment, renderbuffertarget, renderbuffer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn FramebufferTexture2D(&self, target: types::GLenum, attachment: types::GLenum, textarget: types::GLenum, texture: types::GLuint, level: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLuint, types::GLint) -> ()>(self.FramebufferTexture2D.f)(target, attachment, textarget, texture, level) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn FramebufferTextureLayer(&self, target: types::GLenum, attachment: types::GLenum, texture: types::GLuint, level: types::GLint, layer: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLuint, types::GLint, types::GLint) -> ()>(self.FramebufferTextureLayer.f)(target, attachment, texture, level, layer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn FrontFace(&self, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.FrontFace.f)(mode) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GenBuffers(&self, n: types::GLsizei, buffers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenBuffers.f)(n, buffers) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GenFramebuffers(&self, n: types::GLsizei, framebuffers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenFramebuffers.f)(n, framebuffers) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GenQueries(&self, n: types::GLsizei, ids: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenQueries.f)(n, ids) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GenRenderbuffers(&self, n: types::GLsizei, renderbuffers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenRenderbuffers.f)(n, renderbuffers) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GenSamplers(&self, count: types::GLsizei, samplers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenSamplers.f)(count, samplers) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GenTextures(&self, n: types::GLsizei, textures: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenTextures.f)(n, textures) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GenTransformFeedbacks(&self, n: types::GLsizei, ids: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenTransformFeedbacks.f)(n, ids) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GenVertexArrays(&self, n: types::GLsizei, arrays: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenVertexArrays.f)(n, arrays) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GenerateMipmap(&self, target: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.GenerateMipmap.f)(target) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetActiveAttrib(&self, program: types::GLuint, index: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, size: *mut types::GLint, type_: *mut types::GLenum, name: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLint, *mut types::GLenum, *mut types::GLchar) -> ()>(self.GetActiveAttrib.f)(program, index, bufSize, length, size, type_, name) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetActiveUniform(&self, program: types::GLuint, index: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, size: *mut types::GLint, type_: *mut types::GLenum, name: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLint, *mut types::GLenum, *mut types::GLchar) -> ()>(self.GetActiveUniform.f)(program, index, bufSize, length, size, type_, name) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetActiveUniformBlockName(&self, program: types::GLuint, uniformBlockIndex: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, uniformBlockName: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetActiveUniformBlockName.f)(program, uniformBlockIndex, bufSize, length, uniformBlockName) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetActiveUniformBlockiv(&self, program: types::GLuint, uniformBlockIndex: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetActiveUniformBlockiv.f)(program, uniformBlockIndex, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetActiveUniformsiv(&self, program: types::GLuint, uniformCount: types::GLsizei, uniformIndices: *const types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetActiveUniformsiv.f)(program, uniformCount, uniformIndices, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetAttachedShaders(&self, program: types::GLuint, maxCount: types::GLsizei, count: *mut types::GLsizei, shaders: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLuint) -> ()>(self.GetAttachedShaders.f)(program, maxCount, count, shaders) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetAttribLocation(&self, program: types::GLuint, name: *const types::GLchar) -> types::GLint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLint>(self.GetAttribLocation.f)(program, name) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetBooleanv(&self, pname: types::GLenum, data: *mut types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLboolean) -> ()>(self.GetBooleanv.f)(pname, data) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetBufferParameteri64v(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint64) -> ()>(self.GetBufferParameteri64v.f)(target, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetBufferParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetBufferParameteriv.f)(target, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetBufferPointerv(&self, target: types::GLenum, pname: types::GLenum, params: *const *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *const *mut __gl_imports::raw::c_void) -> ()>(self.GetBufferPointerv.f)(target, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetError(&self, ) -> types::GLenum { __gl_imports::mem::transmute::<_, extern "system" fn() -> types::GLenum>(self.GetError.f)() } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetFloatv(&self, pname: types::GLenum, data: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLfloat) -> ()>(self.GetFloatv.f)(pname, data) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetFragDataLocation(&self, program: types::GLuint, name: *const types::GLchar) -> types::GLint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLint>(self.GetFragDataLocation.f)(program, name) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetFramebufferAttachmentParameteriv(&self, target: types::GLenum, attachment: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetFramebufferAttachmentParameteriv.f)(target, attachment, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetInteger64i_v(&self, target: types::GLenum, index: types::GLuint, data: *mut types::GLint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, *mut types::GLint64) -> ()>(self.GetInteger64i_v.f)(target, index, data) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetInteger64v(&self, pname: types::GLenum, data: *mut types::GLint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLint64) -> ()>(self.GetInteger64v.f)(pname, data) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetIntegeri_v(&self, target: types::GLenum, index: types::GLuint, data: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, *mut types::GLint) -> ()>(self.GetIntegeri_v.f)(target, index, data) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetIntegerv(&self, pname: types::GLenum, data: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLint) -> ()>(self.GetIntegerv.f)(pname, data) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetInternalformativ(&self, target: types::GLenum, internalformat: types::GLenum, pname: types::GLenum, bufSize: types::GLsizei, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLsizei, *mut types::GLint) -> ()>(self.GetInternalformativ.f)(target, internalformat, pname, bufSize, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetProgramBinary(&self, program: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, binaryFormat: *mut types::GLenum, binary: *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLenum, *mut __gl_imports::raw::c_void) -> ()>(self.GetProgramBinary.f)(program, bufSize, length, binaryFormat, binary) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetProgramInfoLog(&self, program: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, infoLog: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetProgramInfoLog.f)(program, bufSize, length, infoLog) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetProgramiv(&self, program: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetProgramiv.f)(program, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetQueryObjectuiv(&self, id: types::GLuint, pname: types::GLenum, params: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLuint) -> ()>(self.GetQueryObjectuiv.f)(id, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetQueryiv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetQueryiv.f)(target, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetRenderbufferParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetRenderbufferParameteriv.f)(target, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetSamplerParameterfv(&self, sampler: types::GLuint, pname: types::GLenum, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLfloat) -> ()>(self.GetSamplerParameterfv.f)(sampler, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetSamplerParameteriv(&self, sampler: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetSamplerParameteriv.f)(sampler, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetShaderInfoLog(&self, shader: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, infoLog: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetShaderInfoLog.f)(shader, bufSize, length, infoLog) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetShaderPrecisionFormat(&self, shadertype: types::GLenum, precisiontype: types::GLenum, range: *mut types::GLint, precision: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint, *mut types::GLint) -> ()>(self.GetShaderPrecisionFormat.f)(shadertype, precisiontype, range, precision) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetShaderSource(&self, shader: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, source: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetShaderSource.f)(shader, bufSize, length, source) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetShaderiv(&self, shader: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetShaderiv.f)(shader, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetString(&self, name: types::GLenum) -> *const types::GLubyte { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> *const types::GLubyte>(self.GetString.f)(name) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetStringi(&self, name: types::GLenum, index: types::GLuint) -> *const types::GLubyte { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> *const types::GLubyte>(self.GetStringi.f)(name, index) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetSynciv(&self, sync: types::GLsync, pname: types::GLenum, bufSize: types::GLsizei, length: *mut types::GLsizei, values: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync, types::GLenum, types::GLsizei, *mut types::GLsizei, *mut types::GLint) -> ()>(self.GetSynciv.f)(sync, pname, bufSize, length, values) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetTexParameterfv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLfloat) -> ()>(self.GetTexParameterfv.f)(target, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetTexParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetTexParameteriv.f)(target, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetTransformFeedbackVarying(&self, program: types::GLuint, index: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, size: *mut types::GLsizei, type_: *mut types::GLenum, name: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLsizei, *mut types::GLenum, *mut types::GLchar) -> ()>(self.GetTransformFeedbackVarying.f)(program, index, bufSize, length, size, type_, name) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetUniformBlockIndex(&self, program: types::GLuint, uniformBlockName: *const types::GLchar) -> types::GLuint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLuint>(self.GetUniformBlockIndex.f)(program, uniformBlockName) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetUniformIndices(&self, program: types::GLuint, uniformCount: types::GLsizei, uniformNames: *const *const types::GLchar, uniformIndices: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const *const types::GLchar, *mut types::GLuint) -> ()>(self.GetUniformIndices.f)(program, uniformCount, uniformNames, uniformIndices) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetUniformLocation(&self, program: types::GLuint, name: *const types::GLchar) -> types::GLint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLint>(self.GetUniformLocation.f)(program, name) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetUniformfv(&self, program: types::GLuint, location: types::GLint, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, *mut types::GLfloat) -> ()>(self.GetUniformfv.f)(program, location, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetUniformiv(&self, program: types::GLuint, location: types::GLint, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, *mut types::GLint) -> ()>(self.GetUniformiv.f)(program, location, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetUniformuiv(&self, program: types::GLuint, location: types::GLint, params: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, *mut types::GLuint) -> ()>(self.GetUniformuiv.f)(program, location, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetVertexAttribIiv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetVertexAttribIiv.f)(index, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetVertexAttribIuiv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLuint) -> ()>(self.GetVertexAttribIuiv.f)(index, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetVertexAttribPointerv(&self, index: types::GLuint, pname: types::GLenum, pointer: *const *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const *mut __gl_imports::raw::c_void) -> ()>(self.GetVertexAttribPointerv.f)(index, pname, pointer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetVertexAttribfv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLfloat) -> ()>(self.GetVertexAttribfv.f)(index, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn GetVertexAttribiv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetVertexAttribiv.f)(index, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Hint(&self, target: types::GLenum, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum) -> ()>(self.Hint.f)(target, mode) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn InvalidateFramebuffer(&self, target: types::GLenum, numAttachments: types::GLsizei, attachments: *const types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, *const types::GLenum) -> ()>(self.InvalidateFramebuffer.f)(target, numAttachments, attachments) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn InvalidateSubFramebuffer(&self, target: types::GLenum, numAttachments: types::GLsizei, attachments: *const types::GLenum, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, *const types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.InvalidateSubFramebuffer.f)(target, numAttachments, attachments, x, y, width, height) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsBuffer(&self, buffer: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsBuffer.f)(buffer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsEnabled(&self, cap: types::GLenum) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLboolean>(self.IsEnabled.f)(cap) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsFramebuffer(&self, framebuffer: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsFramebuffer.f)(framebuffer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsProgram(&self, program: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsProgram.f)(program) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsQuery(&self, id: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsQuery.f)(id) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsRenderbuffer(&self, renderbuffer: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsRenderbuffer.f)(renderbuffer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsSampler(&self, sampler: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsSampler.f)(sampler) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsShader(&self, shader: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsShader.f)(shader) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsSync(&self, sync: types::GLsync) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync) -> types::GLboolean>(self.IsSync.f)(sync) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsTexture(&self, texture: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsTexture.f)(texture) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsTransformFeedback(&self, id: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsTransformFeedback.f)(id) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn IsVertexArray(&self, array: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsVertexArray.f)(array) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn LineWidth(&self, width: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat) -> ()>(self.LineWidth.f)(width) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn LinkProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.LinkProgram.f)(program) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn MapBufferRange(&self, target: types::GLenum, offset: types::GLintptr, length: types::GLsizeiptr, access: types::GLbitfield) -> *mut __gl_imports::raw::c_void { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLintptr, types::GLsizeiptr, types::GLbitfield) -> *mut __gl_imports::raw::c_void>(self.MapBufferRange.f)(target, offset, length, access) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn PauseTransformFeedback(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.PauseTransformFeedback.f)() } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn PixelStorei(&self, pname: types::GLenum, param: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint) -> ()>(self.PixelStorei.f)(pname, param) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn PolygonOffset(&self, factor: types::GLfloat, units: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat) -> ()>(self.PolygonOffset.f)(factor, units) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ProgramBinary(&self, program: types::GLuint, binaryFormat: types::GLenum, binary: *const __gl_imports::raw::c_void, length: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const __gl_imports::raw::c_void, types::GLsizei) -> ()>(self.ProgramBinary.f)(program, binaryFormat, binary, length) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ProgramParameteri(&self, program: types::GLuint, pname: types::GLenum, value: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, types::GLint) -> ()>(self.ProgramParameteri.f)(program, pname, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ReadBuffer(&self, src: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.ReadBuffer.f)(src) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ReadPixels(&self, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei, format: types::GLenum, type_: types::GLenum, pixels: *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLenum, types::GLenum, *mut __gl_imports::raw::c_void) -> ()>(self.ReadPixels.f)(x, y, width, height, format, type_, pixels) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ReleaseShaderCompiler(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.ReleaseShaderCompiler.f)() } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn RenderbufferStorage(&self, target: types::GLenum, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLsizei, types::GLsizei) -> ()>(self.RenderbufferStorage.f)(target, internalformat, width, height) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn RenderbufferStorageMultisample(&self, target: types::GLenum, samples: types::GLsizei, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, types::GLsizei, types::GLsizei) -> ()>(self.RenderbufferStorageMultisample.f)(target, samples, internalformat, width, height) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ResumeTransformFeedback(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.ResumeTransformFeedback.f)() } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn SampleCoverage(&self, value: types::GLfloat, invert: types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLboolean) -> ()>(self.SampleCoverage.f)(value, invert) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn SamplerParameterf(&self, sampler: types::GLuint, pname: types::GLenum, param: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, types::GLfloat) -> ()>(self.SamplerParameterf.f)(sampler, pname, param) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn SamplerParameterfv(&self, sampler: types::GLuint, pname: types::GLenum, param: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const types::GLfloat) -> ()>(self.SamplerParameterfv.f)(sampler, pname, param) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn SamplerParameteri(&self, sampler: types::GLuint, pname: types::GLenum, param: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, types::GLint) -> ()>(self.SamplerParameteri.f)(sampler, pname, param) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn SamplerParameteriv(&self, sampler: types::GLuint, pname: types::GLenum, param: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const types::GLint) -> ()>(self.SamplerParameteriv.f)(sampler, pname, param) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Scissor(&self, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.Scissor.f)(x, y, width, height) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ShaderBinary(&self, count: types::GLsizei, shaders: *const types::GLuint, binaryformat: types::GLenum, binary: *const __gl_imports::raw::c_void, length: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint, types::GLenum, *const __gl_imports::raw::c_void, types::GLsizei) -> ()>(self.ShaderBinary.f)(count, shaders, binaryformat, binary, length) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ShaderSource(&self, shader: types::GLuint, count: types::GLsizei, string: *const *const types::GLchar, length: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const *const types::GLchar, *const types::GLint) -> ()>(self.ShaderSource.f)(shader, count, string, length) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn StencilFunc(&self, func: types::GLenum, ref_: types::GLint, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLuint) -> ()>(self.StencilFunc.f)(func, ref_, mask) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn StencilFuncSeparate(&self, face: types::GLenum, func: types::GLenum, ref_: types::GLint, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLint, types::GLuint) -> ()>(self.StencilFuncSeparate.f)(face, func, ref_, mask) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn StencilMask(&self, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.StencilMask.f)(mask) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn StencilMaskSeparate(&self, face: types::GLenum, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.StencilMaskSeparate.f)(face, mask) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn StencilOp(&self, fail: types::GLenum, zfail: types::GLenum, zpass: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum) -> ()>(self.StencilOp.f)(fail, zfail, zpass) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn StencilOpSeparate(&self, face: types::GLenum, sfail: types::GLenum, dpfail: types::GLenum, dppass: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLenum) -> ()>(self.StencilOpSeparate.f)(face, sfail, dpfail, dppass) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn TexImage2D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLint, width: types::GLsizei, height: types::GLsizei, border: types::GLint, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLint, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexImage2D.f)(target, level, internalformat, width, height, border, format, type_, pixels) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn TexImage3D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLint, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, border: types::GLint, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLsizei, types::GLint, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexImage3D.f)(target, level, internalformat, width, height, depth, border, format, type_, pixels) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn TexParameterf(&self, target: types::GLenum, pname: types::GLenum, param: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLfloat) -> ()>(self.TexParameterf.f)(target, pname, param) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn TexParameterfv(&self, target: types::GLenum, pname: types::GLenum, params: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *const types::GLfloat) -> ()>(self.TexParameterfv.f)(target, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn TexParameteri(&self, target: types::GLenum, pname: types::GLenum, param: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLint) -> ()>(self.TexParameteri.f)(target, pname, param) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn TexParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *const types::GLint) -> ()>(self.TexParameteriv.f)(target, pname, params) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn TexStorage2D(&self, target: types::GLenum, levels: types::GLsizei, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, types::GLsizei, types::GLsizei) -> ()>(self.TexStorage2D.f)(target, levels, internalformat, width, height) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn TexStorage3D(&self, target: types::GLenum, levels: types::GLsizei, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, types::GLsizei, types::GLsizei, types::GLsizei) -> ()>(self.TexStorage3D.f)(target, levels, internalformat, width, height, depth) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn TexSubImage2D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexSubImage2D.f)(target, level, xoffset, yoffset, width, height, format, type_, pixels) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn TexSubImage3D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, zoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLsizei, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexSubImage3D.f)(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type_, pixels) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn TransformFeedbackVaryings(&self, program: types::GLuint, count: types::GLsizei, varyings: *const *const types::GLchar, bufferMode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const *const types::GLchar, types::GLenum) -> ()>(self.TransformFeedbackVaryings.f)(program, count, varyings, bufferMode) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform1f(&self, location: types::GLint, v0: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat) -> ()>(self.Uniform1f.f)(location, v0) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform1fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform1fv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform1i(&self, location: types::GLint, v0: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint) -> ()>(self.Uniform1i.f)(location, v0) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform1iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform1iv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform1ui(&self, location: types::GLint, v0: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint) -> ()>(self.Uniform1ui.f)(location, v0) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform1uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform1uiv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform2f(&self, location: types::GLint, v0: types::GLfloat, v1: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat, types::GLfloat) -> ()>(self.Uniform2f.f)(location, v0, v1) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform2fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform2fv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform2i(&self, location: types::GLint, v0: types::GLint, v1: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint) -> ()>(self.Uniform2i.f)(location, v0, v1) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform2iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform2iv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform2ui(&self, location: types::GLint, v0: types::GLuint, v1: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint, types::GLuint) -> ()>(self.Uniform2ui.f)(location, v0, v1) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform2uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform2uiv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform3f(&self, location: types::GLint, v0: types::GLfloat, v1: types::GLfloat, v2: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.Uniform3f.f)(location, v0, v1, v2) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform3fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform3fv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform3i(&self, location: types::GLint, v0: types::GLint, v1: types::GLint, v2: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint, types::GLint) -> ()>(self.Uniform3i.f)(location, v0, v1, v2) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform3iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform3iv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform3ui(&self, location: types::GLint, v0: types::GLuint, v1: types::GLuint, v2: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint, types::GLuint, types::GLuint) -> ()>(self.Uniform3ui.f)(location, v0, v1, v2) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform3uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform3uiv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform4f(&self, location: types::GLint, v0: types::GLfloat, v1: types::GLfloat, v2: types::GLfloat, v3: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.Uniform4f.f)(location, v0, v1, v2, v3) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform4fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform4fv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform4i(&self, location: types::GLint, v0: types::GLint, v1: types::GLint, v2: types::GLint, v3: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint, types::GLint, types::GLint) -> ()>(self.Uniform4i.f)(location, v0, v1, v2, v3) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform4iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform4iv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform4ui(&self, location: types::GLint, v0: types::GLuint, v1: types::GLuint, v2: types::GLuint, v3: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint, types::GLuint, types::GLuint, types::GLuint) -> ()>(self.Uniform4ui.f)(location, v0, v1, v2, v3) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Uniform4uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform4uiv.f)(location, count, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UniformBlockBinding(&self, program: types::GLuint, uniformBlockIndex: types::GLuint, uniformBlockBinding: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLuint) -> ()>(self.UniformBlockBinding.f)(program, uniformBlockIndex, uniformBlockBinding) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UniformMatrix2fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix2fv.f)(location, count, transpose, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UniformMatrix2x3fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix2x3fv.f)(location, count, transpose, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UniformMatrix2x4fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix2x4fv.f)(location, count, transpose, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UniformMatrix3fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix3fv.f)(location, count, transpose, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UniformMatrix3x2fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix3x2fv.f)(location, count, transpose, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UniformMatrix3x4fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix3x4fv.f)(location, count, transpose, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UniformMatrix4fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix4fv.f)(location, count, transpose, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UniformMatrix4x2fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix4x2fv.f)(location, count, transpose, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UniformMatrix4x3fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix4x3fv.f)(location, count, transpose, value) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UnmapBuffer(&self, target: types::GLenum) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLboolean>(self.UnmapBuffer.f)(target) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn UseProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.UseProgram.f)(program) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn ValidateProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.ValidateProgram.f)(program) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttrib1f(&self, index: types::GLuint, x: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat) -> ()>(self.VertexAttrib1f.f)(index, x) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttrib1fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib1fv.f)(index, v) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttrib2f(&self, index: types::GLuint, x: types::GLfloat, y: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat, types::GLfloat) -> ()>(self.VertexAttrib2f.f)(index, x, y) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttrib2fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib2fv.f)(index, v) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttrib3f(&self, index: types::GLuint, x: types::GLfloat, y: types::GLfloat, z: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.VertexAttrib3f.f)(index, x, y, z) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttrib3fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib3fv.f)(index, v) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttrib4f(&self, index: types::GLuint, x: types::GLfloat, y: types::GLfloat, z: types::GLfloat, w: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.VertexAttrib4f.f)(index, x, y, z, w) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttrib4fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib4fv.f)(index, v) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttribDivisor(&self, index: types::GLuint, divisor: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.VertexAttribDivisor.f)(index, divisor) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttribI4i(&self, index: types::GLuint, x: types::GLint, y: types::GLint, z: types::GLint, w: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, types::GLint, types::GLint, types::GLint) -> ()>(self.VertexAttribI4i.f)(index, x, y, z, w) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttribI4iv(&self, index: types::GLuint, v: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLint) -> ()>(self.VertexAttribI4iv.f)(index, v) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttribI4ui(&self, index: types::GLuint, x: types::GLuint, y: types::GLuint, z: types::GLuint, w: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLuint, types::GLuint, types::GLuint) -> ()>(self.VertexAttribI4ui.f)(index, x, y, z, w) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttribI4uiv(&self, index: types::GLuint, v: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLuint) -> ()>(self.VertexAttribI4uiv.f)(index, v) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttribIPointer(&self, index: types::GLuint, size: types::GLint, type_: types::GLenum, stride: types::GLsizei, pointer: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, types::GLenum, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.VertexAttribIPointer.f)(index, size, type_, stride, pointer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn VertexAttribPointer(&self, index: types::GLuint, size: types::GLint, type_: types::GLenum, normalized: types::GLboolean, stride: types::GLsizei, pointer: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, types::GLenum, types::GLboolean, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.VertexAttribPointer.f)(index, size, type_, normalized, stride, pointer) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn Viewport(&self, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.Viewport.f)(x, y, width, height) } +#[allow(non_snake_case, unused_variables, dead_code)] + #[inline] pub unsafe fn WaitSync(&self, sync: types::GLsync, flags: types::GLbitfield, timeout: types::GLuint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync, types::GLbitfield, types::GLuint64) -> ()>(self.WaitSync.f)(sync, flags, timeout) } +} + + unsafe impl __gl_imports::Send for Gles2 {} diff --git a/src/framework/graphics.rs b/src/framework/graphics.rs index 9dbd845..6e69c6c 100644 --- a/src/framework/graphics.rs +++ b/src/framework/graphics.rs @@ -60,6 +60,14 @@ pub fn screen_size(ctx: &mut Context) -> (f32, f32) { ctx.screen_size } +pub fn screen_insets(ctx: &mut Context) -> (f32, f32, f32, f32) { + ctx.screen_insets +} + +pub fn screen_insets_scaled(ctx: &mut Context, scale: f32) -> (f32, f32, f32, f32) { + (ctx.screen_insets.0 / scale, ctx.screen_insets.1 / scale, ctx.screen_insets.2 / scale, ctx.screen_insets.3 / scale) +} + pub fn set_render_target(ctx: &mut Context, texture: Option<&Box>) -> GameResult { if let Some(renderer) = ctx.renderer.as_mut() { return renderer.set_render_target(texture); @@ -108,9 +116,9 @@ pub fn render_imgui(ctx: &mut Context, draw_data: &imgui::DrawData) -> GameResul Err(GameError::RenderError("Rendering backend hasn't been initialized yet.".to_string())) } -pub fn imgui_prepare_frame(ctx: &Context, ui: &imgui::Ui) -> GameResult { - if let Some(renderer) = ctx.renderer.as_ref() { - return renderer.prepare_frame(ui); +pub fn prepare_draw(ctx: &mut Context) -> GameResult { + if let Some(renderer) = ctx.renderer.as_mut() { + return renderer.prepare_draw(ctx.screen_size.0, ctx.screen_size.1); } Err(GameError::RenderError("Rendering backend hasn't been initialized yet.".to_string())) diff --git a/src/framework/keyboard.rs b/src/framework/keyboard.rs index 432f4ef..24db967 100644 --- a/src/framework/keyboard.rs +++ b/src/framework/keyboard.rs @@ -165,6 +165,7 @@ pub enum ScanCode { Mail, MediaSelect, MediaStop, + Menu, Minus, Mute, MyComputer, diff --git a/src/framework/mod.rs b/src/framework/mod.rs index 78d67c8..1ae9e4e 100644 --- a/src/framework/mod.rs +++ b/src/framework/mod.rs @@ -1,7 +1,13 @@ pub mod backend; -#[cfg(feature = "backend_sdl2")] -pub mod backend_sdl2; pub mod backend_null; +#[cfg(feature = "backend-glutin")] +pub mod backend_opengl; +#[cfg(feature = "backend-glutin")] +mod gl; +#[cfg(feature = "backend-sdl")] +pub mod backend_sdl2; +#[cfg(feature = "backend-sokol")] +pub mod backend_sokol; pub mod context; pub mod error; pub mod filesystem; diff --git a/src/input/touch_controls.rs b/src/input/touch_controls.rs index b5dc2bc..585b888 100644 --- a/src/input/touch_controls.rs +++ b/src/input/touch_controls.rs @@ -1,8 +1,8 @@ -use crate::framework::context::Context; -use crate::framework::error::GameResult; - use crate::common::Rect; use crate::engine_constants::EngineConstants; +use crate::framework::context::Context; +use crate::framework::error::GameResult; +use crate::framework::graphics::screen_insets_scaled; use crate::texture_set::TextureSet; #[derive(Copy, Clone, PartialEq, Eq)] @@ -14,67 +14,38 @@ pub enum TouchControlType { #[derive(Copy, Clone)] pub struct TouchPoint { - id: u64, - touch_id: u64, - position: (f64, f64), - last_position: (f64, f64), + pub id: u64, + pub touch_id: u64, + pub position: (f64, f64), + pub last_position: (f64, f64), } pub struct TouchControls { pub control_type: TouchControlType, pub points: Vec, pub interact_icon: bool, - touch_id_counter: u64, - clicks: Vec, + pub touch_id_counter: u64, + pub clicks: Vec, } impl TouchControls { pub fn new() -> TouchControls { TouchControls { control_type: TouchControlType::None, - touch_id_counter: 0, - interact_icon: false, points: Vec::with_capacity(8), + interact_icon: false, + touch_id_counter: 0, clicks: Vec::with_capacity(8), } } - /* - pub fn process_winit_event(&mut self, scale: f32, touch: winit::event::Touch) { - match touch.phase { - TouchPhase::Started | TouchPhase::Moved => { - if let Some(point) = self.points.iter_mut().find(|p| p.id == touch.id) { - point.last_position = point.position; - point.position = (touch.location.x / scale as f64, touch.location.y / scale as f64); - } else { - self.touch_id_counter = self.touch_id_counter.wrapping_add(1); - - let point = TouchPoint { - id: touch.id, - touch_id: self.touch_id_counter, - position: (touch.location.x / scale as f64, touch.location.y / scale as f64), - last_position: (0.0, 0.0), - }; - self.points.push(point); - - if touch.phase == TouchPhase::Started { - self.clicks.push(point); - } - } - } - TouchPhase::Ended | TouchPhase::Cancelled => { - self.points.retain(|p| p.id != touch.id); - self.clicks.retain(|p| p.id != touch.id); - } - } - }*/ - pub fn point_in(&self, bounds: Rect) -> Option { for point in self.points.iter() { if (point.position.0 as isize) > bounds.left && (point.position.0 as isize) < bounds.right && (point.position.1 as isize) > bounds.top - && (point.position.1 as isize) < bounds.bottom { + && (point.position.1 as isize) < bounds.bottom + { return Some(point.touch_id); } } @@ -89,7 +60,8 @@ impl TouchControls { if (point.position.0 as isize) > bounds.left && (point.position.0 as isize) < bounds.right && (point.position.1 as isize) > bounds.top - && (point.position.1 as isize) < bounds.bottom { + && (point.position.1 as isize) < bounds.bottom + { point.touch_id = 0; return true; @@ -99,11 +71,20 @@ impl TouchControls { false } - pub fn draw(&self, canvas_size: (f32, f32), constants: &EngineConstants, texture_set: &mut TextureSet, ctx: &mut Context) -> GameResult { + pub fn draw( + &self, + canvas_size: (f32, f32), + scale: f32, + constants: &EngineConstants, + texture_set: &mut TextureSet, + ctx: &mut Context, + ) -> GameResult { if self.control_type == TouchControlType::Controls { let batch = texture_set.get_or_load_batch(ctx, constants, "builtin/touch")?; let color = (255, 255, 255, 160); + let (left, _, right, bottom) = screen_insets_scaled(ctx, scale); + for x in 0..3 { for y in 0..3 { let mut icon_x = x; @@ -113,21 +94,28 @@ impl TouchControls { icon_x = 3; } - batch.add_rect_tinted(4.0 + 48.0 * x as f32 + 8.0, - (canvas_size.1 - 4.0 - 48.0 * 3.0) + 48.0 * y as f32 + 8.0, - color, - &Rect::new_size(icon_x * 32, icon_y * 32, 32, 32)); + batch.add_rect_tinted( + 4.0 + 48.0 * x as f32 + 8.0 + left, + (canvas_size.1 - 4.0 - 48.0 * 3.0) + 48.0 * y as f32 + 8.0 - bottom, + color, + &Rect::new_size(icon_x * 32, icon_y * 32, 32, 32), + ); } } + batch.add_rect_tinted( + canvas_size.0 - (4.0 + 48.0) + 8.0 - right, + canvas_size.1 - (4.0 + 48.0) + 8.0 - bottom, + color, + &Rect::new_size(3 * 32, 32, 32, 32), + ); - batch.add_rect_tinted(canvas_size.0 - (4.0 + 48.0) + 8.0, canvas_size.1 - (4.0 + 48.0) + 8.0, - color, - &Rect::new_size(3 * 32, 32, 32, 32)); - - batch.add_rect_tinted(canvas_size.0 - (4.0 + 48.0) + 8.0, canvas_size.1 - (4.0 + 48.0) * 2.0 + 8.0, - color, - &Rect::new_size(3 * 32, 0, 32, 32)); + batch.add_rect_tinted( + canvas_size.0 - (4.0 + 48.0) + 8.0 - right, + canvas_size.1 - (4.0 + 48.0) * 2.0 + 8.0 - bottom, + color, + &Rect::new_size(3 * 32, 0, 32, 32), + ); batch.draw(ctx)?; } diff --git a/src/input/touch_player_controller.rs b/src/input/touch_player_controller.rs index 04b026a..48719bd 100644 --- a/src/input/touch_player_controller.rs +++ b/src/input/touch_player_controller.rs @@ -1,9 +1,8 @@ -use crate::framework::context::Context; -use crate::framework::error::GameResult; - - use crate::bitfield; use crate::common::Rect; +use crate::framework::context::Context; +use crate::framework::error::GameResult; +use crate::framework::graphics::screen_insets_scaled; use crate::input::player_controller::PlayerController; use crate::input::touch_controls::TouchControlType; use crate::shared_game_state::SharedGameState; @@ -37,21 +36,21 @@ bitfield! { impl TouchPlayerController { pub fn new() -> TouchPlayerController { - TouchPlayerController { - state: KeyState(0), - old_state: KeyState(0), - trigger: KeyState(0), - prev_touch_len: 0, - } + TouchPlayerController { state: KeyState(0), old_state: KeyState(0), trigger: KeyState(0), prev_touch_len: 0 } } } impl PlayerController for TouchPlayerController { - fn update(&mut self, state: &mut SharedGameState, _ctx: &mut Context) -> GameResult { + fn update(&mut self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult { match state.touch_controls.control_type { TouchControlType::None => {} TouchControlType::Dialog => { - self.state.set_jump(state.touch_controls.point_in(Rect::new_size(0, 0, state.canvas_size.0 as isize, state.canvas_size.1 as isize)).is_some()); + self.state.set_jump( + state + .touch_controls + .point_in(Rect::new_size(0, 0, state.canvas_size.0 as isize, state.canvas_size.1 as isize)) + .is_some(), + ); if state.touch_controls.points.len() > 1 && self.prev_touch_len != state.touch_controls.points.len() { self.prev_touch_len = state.touch_controls.points.len(); @@ -59,37 +58,152 @@ impl PlayerController for TouchPlayerController { } } TouchControlType::Controls => { + let (left, _, right, bottom) = screen_insets_scaled(ctx, state.scale); + + let left = 4 + left as isize; + let bottom = 4 + bottom as isize; + let right = 4 + right as isize; + self.state.0 = 0; // left - self.state.set_left(self.state.left() || state.touch_controls.point_in(Rect::new_size(4, state.canvas_size.1 as isize - 4 - 48 * 2, 48, 48)).is_some()); + self.state.set_left( + self.state.left() + || state + .touch_controls + .point_in(Rect::new_size(left, state.canvas_size.1 as isize - bottom - 48 * 2, 48, 48)) + .is_some(), + ); // up - self.state.set_up(self.state.up() || state.touch_controls.point_in(Rect::new_size(48 + 4, state.canvas_size.1 as isize - 4 - 48 * 3, 48, 48)).is_some()); + self.state.set_up( + self.state.up() + || state + .touch_controls + .point_in(Rect::new_size(48 + left, state.canvas_size.1 as isize - bottom - 48 * 3, 48, 48)) + .is_some(), + ); // right - self.state.set_right(self.state.right() || state.touch_controls.point_in(Rect::new_size(4 + 48 * 2, state.canvas_size.1 as isize - 4 - 48 * 2, 48, 48)).is_some()); + self.state.set_right( + self.state.right() + || state + .touch_controls + .point_in(Rect::new_size( + 48 * 2 + left, + state.canvas_size.1 as isize - bottom - 48 * 2, + 48, + 48, + )) + .is_some(), + ); // down - self.state.set_down(self.state.down() || state.touch_controls.point_in(Rect::new_size(48 + 4, state.canvas_size.1 as isize - 4 - 48, 48, 48)).is_some()); + self.state.set_down( + self.state.down() + || state + .touch_controls + .point_in(Rect::new_size(48 + left, state.canvas_size.1 as isize - bottom - 48, 48, 48)) + .is_some(), + ); // left+up - self.state.set_left(self.state.left() || state.touch_controls.point_in(Rect::new_size(4, state.canvas_size.1 as isize - 4 - 48 * 3, 48, 48)).is_some()); - self.state.set_up(self.state.up() || state.touch_controls.point_in(Rect::new_size(4, state.canvas_size.1 as isize - 4 - 48 * 3, 48, 48)).is_some()); + self.state.set_left( + self.state.left() + || state + .touch_controls + .point_in(Rect::new_size(left, state.canvas_size.1 as isize - bottom - 48 * 3, 48, 48)) + .is_some(), + ); + self.state.set_up( + self.state.up() + || state + .touch_controls + .point_in(Rect::new_size(left, state.canvas_size.1 as isize - bottom - 48 * 3, 48, 48)) + .is_some(), + ); // right+up - self.state.set_right(self.state.right() || state.touch_controls.point_in(Rect::new_size(4 + 48 * 2, state.canvas_size.1 as isize - 4 - 48 * 3, 48, 48)).is_some()); - self.state.set_up(self.state.up() || state.touch_controls.point_in(Rect::new_size(4 + 48 * 2, state.canvas_size.1 as isize - 4 - 48 * 3, 48, 48)).is_some()); + self.state.set_right( + self.state.right() + || state + .touch_controls + .point_in(Rect::new_size( + 48 * 2 + left, + state.canvas_size.1 as isize - bottom - 48 * 3, + 48, + 48, + )) + .is_some(), + ); + self.state.set_up( + self.state.up() + || state + .touch_controls + .point_in(Rect::new_size( + 48 * 2 + left, + state.canvas_size.1 as isize - bottom - 48 * 3, + 48, + 48, + )) + .is_some(), + ); // left+down - self.state.set_left(self.state.left() || state.touch_controls.point_in(Rect::new_size(4, state.canvas_size.1 as isize - 48 - 4, 48, 48)).is_some()); - self.state.set_down(self.state.down() || state.touch_controls.point_in(Rect::new_size(4, state.canvas_size.1 as isize - 48 - 4, 48, 48)).is_some()); + self.state.set_left( + self.state.left() + || state + .touch_controls + .point_in(Rect::new_size(left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) + .is_some(), + ); + self.state.set_down( + self.state.down() + || state + .touch_controls + .point_in(Rect::new_size(left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) + .is_some(), + ); // right+down - self.state.set_right(self.state.right() || state.touch_controls.point_in(Rect::new_size(4 + 48 * 2, state.canvas_size.1 as isize - 48 - 4, 48, 48)).is_some()); - self.state.set_down(self.state.down() || state.touch_controls.point_in(Rect::new_size(4 + 48 * 2, state.canvas_size.1 as isize - 48 - 4, 48, 48)).is_some()); + self.state.set_right( + self.state.right() + || state + .touch_controls + .point_in(Rect::new_size(48 * 2 + left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) + .is_some(), + ); + self.state.set_down( + self.state.down() + || state + .touch_controls + .point_in(Rect::new_size(48 * 2 + left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) + .is_some(), + ); - self.state.set_jump(self.state.jump() || state.touch_controls.point_in(Rect::new_size(state.canvas_size.0 as isize - 48 - 4, state.canvas_size.1 as isize - 48 - 4, 48, 48)).is_some()); - self.state.set_shoot(self.state.shoot() || state.touch_controls.point_in(Rect::new_size(state.canvas_size.0 as isize - 48 - 4, state.canvas_size.1 as isize - (48 - 4) * 2, 48, 48)).is_some()); + self.state.set_jump( + self.state.jump() + || state + .touch_controls + .point_in(Rect::new_size( + state.canvas_size.0 as isize - 48 - right, + state.canvas_size.1 as isize - (48 + 4) - bottom, + 48, + 48, + )) + .is_some(), + ); + self.state.set_shoot( + self.state.shoot() + || state + .touch_controls + .point_in(Rect::new_size( + state.canvas_size.0 as isize - 48 - right, + state.canvas_size.1 as isize - (48 + 4) * 2 - bottom, + 48, + 48, + )) + .is_some(), + ); } } diff --git a/src/lib.rs b/src/lib.rs index 4bb03f7..3f4e53d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,9 +10,11 @@ extern crate strum_macros; use std::cell::UnsafeCell; use std::env; use std::path::PathBuf; +use std::sync::Mutex; use std::time::Instant; use directories::ProjectDirs; +use lazy_static::lazy_static; use log::*; use pretty_env_logger::env_logger::Env; @@ -65,6 +67,10 @@ mod text_script; mod texture_set; mod weapon; +lazy_static! { + pub static ref GAME_SUSPENDED: Mutex = Mutex::new(false); +} + pub struct Game { scene: Option>, state: UnsafeCell, @@ -98,14 +104,12 @@ impl Game { TimingMode::_50Hz | TimingMode::_60Hz => { let last_tick = self.next_tick; - while self.start_time.elapsed().as_nanos() >= self.next_tick && self.loops < 10 - { + while self.start_time.elapsed().as_nanos() >= self.next_tick && self.loops < 10 { if (state_ref.settings.speed - 1.0).abs() < 0.01 { self.next_tick += state_ref.timing_mode.get_delta() as u128; } else { - self.next_tick += (state_ref.timing_mode.get_delta() as f64 - / state_ref.settings.speed) - as u128; + self.next_tick += + (state_ref.timing_mode.get_delta() as f64 / state_ref.settings.speed) as u128; } self.loops += 1; } @@ -114,8 +118,7 @@ impl Game { log::warn!("Frame skip is way too high, a long system lag occurred?"); self.last_tick = self.start_time.elapsed().as_nanos(); self.next_tick = self.last_tick - + (state_ref.timing_mode.get_delta() as f64 / state_ref.settings.speed) - as u128; + + (state_ref.timing_mode.get_delta() as f64 / state_ref.settings.speed) as u128; self.loops = 0; } @@ -141,152 +144,59 @@ impl Game { if state_ref.timing_mode != TimingMode::FrameSynchronized { let mut elapsed = self.start_time.elapsed().as_nanos(); - #[cfg(target_os = "windows")] - { - // Even with the non-monotonic Instant mitigation at the start of the event loop, there's still a chance of it not working. - // This check here should trigger if that happens and makes sure there's no panic from an underflow. - if elapsed < self.last_tick { - elapsed = self.last_tick; - } + + // Even with the non-monotonic Instant mitigation at the start of the event loop, there's still a chance of it not working. + // This check here should trigger if that happens and makes sure there's no panic from an underflow. + if elapsed < self.last_tick { + elapsed = self.last_tick; } + let n1 = (elapsed - self.last_tick) as f64; let n2 = (self.next_tick - self.last_tick) as f64; - state_ref.frame_time = if state_ref.settings.motion_interpolation { - n1 / n2 - } else { - 1.0 - }; + state_ref.frame_time = if state_ref.settings.motion_interpolation { n1 / n2 } else { 1.0 }; } unsafe { - G_MAG = if state_ref.settings.subpixel_coords { - state_ref.scale - } else { - 1.0 - }; + G_MAG = if state_ref.settings.subpixel_coords { state_ref.scale } else { 1.0 }; I_MAG = state_ref.scale; } self.loops = 0; + graphics::prepare_draw(ctx)?; graphics::clear(ctx, [0.0, 0.0, 0.0, 1.0].into()); - /*graphics::set_projection(ctx, DrawParam::new() - .scale(Vec2::new(state_ref.scale, state_ref.scale)) - .to_matrix());*/ if let Some(scene) = self.scene.as_mut() { scene.draw(state_ref, ctx)?; if state_ref.settings.touch_controls { state_ref.touch_controls.draw( state_ref.canvas_size, + state_ref.scale, &state_ref.constants, &mut state_ref.texture_set, ctx, )?; } - //graphics::set_projection(ctx, self.def_matrix); self.ui.draw(state_ref, ctx, scene)?; } graphics::present(ctx)?; + Ok(()) } } #[cfg(target_os = "android")] -fn request_perms() -> GameResult { - use jni::objects::JObject; - use jni::objects::JValue; - - let native_activity = ndk_glue::native_activity(); - let vm_ptr = native_activity.vm(); - let vm = unsafe { jni::JavaVM::from_raw(vm_ptr) }?; - let vm_env = vm.attach_current_thread()?; - - fn perm_name<'a, 'b, 'c>( - vm_env: &'b jni::AttachGuard<'a>, - name: &'c str, - ) -> GameResult> { - let class = vm_env.find_class("android/Manifest$permission")?; - Ok(vm_env.get_static_field(class, name.to_owned(), "Ljava/lang/String;")?) - } - - fn has_permission( - vm_env: &jni::AttachGuard, - activity: &jni::sys::jobject, - name: &str, - ) -> GameResult { - let perm_granted = { - let class = vm_env.find_class("android/content/pm/PackageManager")?; - vm_env - .get_static_field(class, "PERMISSION_GRANTED", "I")? - .i()? - }; - - let perm = perm_name(vm_env, name)?; - let activity_obj = JObject::from(*activity); - let result = vm_env - .call_method( - activity_obj, - "checkSelfPermission", - "(Ljava/lang/String;)I", - &[perm], - )? - .i()?; - Ok(result == perm_granted) - } - - let str_class = vm_env.find_class("java/lang/String")?; - let array = vm_env.new_object_array(2, str_class, JObject::null())?; - vm_env.set_object_array_element(array, 0, perm_name(&vm_env, "READ_EXTERNAL_STORAGE")?.l()?)?; - vm_env.set_object_array_element( - array, - 1, - perm_name(&vm_env, "WRITE_EXTERNAL_STORAGE")?.l()?, - )?; - let activity_obj = JObject::from(native_activity.activity()); - - loop { - if has_permission( - &vm_env, - &native_activity.activity(), - "READ_EXTERNAL_STORAGE", - )? && has_permission( - &vm_env, - &native_activity.activity(), - "WRITE_EXTERNAL_STORAGE", - )? { - break; - } - - vm_env.call_method( - activity_obj, - "requestPermissions", - "([Ljava/lang/String;I)V", - &[JValue::from(array), JValue::from(0)], - )?; - } - - Ok(()) -} - -#[cfg(target_os = "android")] -#[cfg_attr(target_os = "android", ndk_glue::main(backtrace = "on"))] +#[cfg_attr(target_os = "android", ndk_glue::main())] pub fn android_main() { - println!("main invoked."); - - request_perms().expect("Failed to attach to the JVM and request storage permissions."); - - env::set_var("CAVESTORY_DATA_DIR", "/sdcard/doukutsu"); - - let _ = std::fs::create_dir("/sdcard/doukutsu/"); - let _ = std::fs::write("/sdcard/doukutsu/.nomedia", b""); - init().unwrap(); } pub fn init() -> GameResult { - pretty_env_logger::env_logger::from_env(Env::default().default_filter_or("info")).init(); + pretty_env_logger::env_logger::from_env(Env::default().default_filter_or("info")) + //.filter(Some("ndk_glue"), LevelFilter::Trace) + .init(); + #[cfg(not(target_os = "android"))] let resource_dir = if let Ok(data_dir) = env::var("CAVESTORY_DATA_DIR") { PathBuf::from(data_dir) } else { @@ -298,51 +208,53 @@ pub fn init() -> GameResult { resource_dir }; + #[cfg(not(target_os = "android"))] info!("Resource directory: {:?}", resource_dir); info!("Initializing engine..."); let mut context = Context::new(); mount_vfs(&mut context, Box::new(BuiltinFS::new())); + + #[cfg(not(target_os = "android"))] mount_vfs(&mut context, Box::new(PhysicalFS::new(&resource_dir, true))); #[cfg(not(target_os = "android"))] let project_dirs = match ProjectDirs::from("", "", "doukutsu-rs") { Some(dirs) => dirs, None => { - return Err(GameError::FilesystemError(String::from( - "No valid home directory path could be retrieved.", - ))); + return Err(GameError::FilesystemError(String::from("No valid home directory path could be retrieved."))); } }; - mount_user_vfs( - &mut context, - Box::new(PhysicalFS::new(project_dirs.data_local_dir(), false)), - ); - #[cfg(target_os = "android")] { - loop { - match ndk_glue::native_window().as_ref() { - Some(_) => { - println!("NativeScreen Found:{:?}", ndk_glue::native_window()); - break; - } - None => (), - } - } + let mut data_path = + PathBuf::from(ndk_glue::native_activity().internal_data_path().to_string_lossy().to_string()); + let mut user_path = data_path.clone(); + + data_path.push("data"); + user_path.push("saves"); + + let _ = std::fs::create_dir_all(&data_path); + let _ = std::fs::create_dir_all(&user_path); + + log::info!("Android data directories: data_path={:?} user_path={:?}", &data_path, &user_path); + + mount_vfs(&mut context, Box::new(PhysicalFS::new(&data_path, true))); + mount_user_vfs(&mut context, Box::new(PhysicalFS::new(&user_path, false))); } - let mut game = Game::new(&mut context)?; - let state_ref = unsafe { &mut *game.state.get() }; + #[cfg(not(target_os = "android"))] + mount_user_vfs(&mut context, Box::new(PhysicalFS::new(project_dirs.data_local_dir(), false))); + + let game = UnsafeCell::new(Game::new(&mut context)?); + let state_ref = unsafe { &mut *((&mut *game.get()).state.get()) }; #[cfg(feature = "scripting")] { - state_ref - .lua - .update_refs(game.state.get(), &mut context as *mut Context); + state_ref.lua.update_refs(unsafe { (&*game.get()).state.get() }, &mut context as *mut Context); } state_ref.next_scene = Some(Box::new(LoadingScene::new())); - context.run(&mut game)?; + context.run(unsafe { &mut *game.get() })?; Ok(()) } diff --git a/src/scene/loading_scene.rs b/src/scene/loading_scene.rs index 575e19c..03df7cd 100644 --- a/src/scene/loading_scene.rs +++ b/src/scene/loading_scene.rs @@ -45,6 +45,7 @@ impl LoadingScene { impl Scene for LoadingScene { fn tick(&mut self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult { + println!("**TICK**"); // deferred to let the loading image draw if self.tick == 1 { if let Err(err) = self.load_stuff(state, ctx) { @@ -66,6 +67,8 @@ impl Scene for LoadingScene { batch.draw(ctx)?; } Err(err) => { + log::error!("Failed to load game data: {}", err); + state.next_scene = Some(Box::new(NoDataScene::new(err))); } } diff --git a/src/scene/title_scene.rs b/src/scene/title_scene.rs index b5459c0..b054303 100644 --- a/src/scene/title_scene.rs +++ b/src/scene/title_scene.rs @@ -182,7 +182,7 @@ impl Scene for TitleScene { TimingMode::_60Hz => state.timing_mode = TimingMode::_50Hz, _ => {} } - state.settings.save(ctx); + let _ = state.settings.save(ctx); *value = state.timing_mode == TimingMode::_50Hz; } @@ -190,7 +190,7 @@ impl Scene for TitleScene { MenuSelectionResult::Selected(1, toggle) => { if let MenuEntry::Toggle(_, value) = toggle { state.settings.shader_effects = !state.settings.shader_effects; - state.settings.save(ctx); + let _ = state.settings.save(ctx); *value = state.settings.shader_effects; } @@ -199,7 +199,7 @@ impl Scene for TitleScene { if let MenuEntry::Toggle(_, value) = toggle { state.settings.original_textures = !state.settings.original_textures; state.reload_textures(); - state.settings.save(ctx); + let _ = state.settings.save(ctx); *value = state.settings.original_textures; } @@ -208,7 +208,7 @@ impl Scene for TitleScene { if let MenuEntry::Toggle(_, value) = toggle { state.settings.seasonal_textures = !state.settings.seasonal_textures; state.reload_textures(); - state.settings.save(ctx); + let _ = state.settings.save(ctx); *value = state.settings.seasonal_textures; } diff --git a/src/scripting/doukutsu.d.ts b/src/scripting/doukutsu.d.ts index 60995ed..ccd0575 100644 --- a/src/scripting/doukutsu.d.ts +++ b/src/scripting/doukutsu.d.ts @@ -1,7 +1,7 @@ declare type EventHandler = (this: void, param: T) => void; /** - * Represents a + * Represents an in-game player. */ declare interface DoukutsuPlayer { /** @@ -28,28 +28,40 @@ declare interface DoukutsuPlayer { * Current velocity of player in Y axis (as floating point, not internal fixed point representation). */ velY(): number; + + /** + * Sets the position of player in X axis (as floating point, not internal fixed point representation). + */ + setX(value: number): void; + + /** + * Sets the position of player in Y axis (as floating point, not internal fixed point representation). + */ + setY(value: number): void; + + /** + * Sets the velocity of player in X axis (as floating point, not internal fixed point representation). + */ + setVelX(value: number): void; + + /** + * Sets the velocity of player in Y axis (as floating point, not internal fixed point representation). + */ + setVelY(value: number): void; + + } -declare interface DoukutsuScene { +declare interface DoukutsuStage { /** - * Returns the tick of current scene. + * Returns the tick of current stage. */ tick(): number; - /** - * Returns a list of players connected to current game. - */ - onlinePlayers(): DoukutsuPlayer[]; - /** * Returns a list of players on current map. */ - mapPlayers(): DoukutsuPlayer[]; - - /** - * Returns the id of local player. - */ - localPlayerId(): number; + players(): DoukutsuPlayer[]; /** * Returns player with specified id. @@ -69,6 +81,22 @@ declare namespace doukutsu { */ function playMusic(id: number): void; + /** + * Returns the value of a certain TSC flag. + * @param id the flag number + */ + function getFlag(id: number): boolean; + + /** + * Returns a list of players connected to current game. + */ + function onlinePlayers(): DoukutsuPlayer[]; + + /** + * Returns the id of local player. + */ + function localPlayerId(): number; + /** * Sets an implementation-defined game setting. * @param name @@ -88,7 +116,7 @@ declare namespace doukutsu { * @param event event name * @param handler event handler procedure */ - function on(event: "tick", handler: EventHandler): EventHandler; + function on(event: "tick", handler: EventHandler): EventHandler; function on(event: string, handler: EventHandler): EventHandler; } diff --git a/src/scripting/doukutsu.rs b/src/scripting/doukutsu.rs index b757a11..6bc2f41 100644 --- a/src/scripting/doukutsu.rs +++ b/src/scripting/doukutsu.rs @@ -35,6 +35,18 @@ impl Doukutsu { 0 } + unsafe fn lua_set_setting(&self, state: &mut State) -> c_int { + if let Some(index) = state.to_int(2) { + let game_state = &mut (*(*self.ptr).state_ptr); + + state.push(game_state.get_flag(index.max(0) as usize)); + } else { + state.push_nil(); + } + + 1 + } + unsafe fn lua_get_flag(&self, state: &mut State) -> c_int { if let Some(index) = state.to_int(2) { let game_state = &mut (*(*self.ptr).state_ptr); @@ -55,9 +67,9 @@ impl LuaObject for Doukutsu { fn lua_fns() -> Vec { vec![ - lua_method!("play_sfx", Doukutsu, Doukutsu::lua_play_sfx), - lua_method!("play_song", Doukutsu, Doukutsu::lua_play_song), - lua_method!("get_flag", Doukutsu, Doukutsu::lua_get_flag), + lua_method!("playSfx", Doukutsu, Doukutsu::lua_play_sfx), + lua_method!("playSong", Doukutsu, Doukutsu::lua_play_song), + lua_method!("getFlag", Doukutsu, Doukutsu::lua_get_flag), ] } } diff --git a/src/shared_game_state.rs b/src/shared_game_state.rs index 9ead5f6..ca3c46f 100644 --- a/src/shared_game_state.rs +++ b/src/shared_game_state.rs @@ -222,6 +222,10 @@ impl SharedGameState { self.texture_set = texture_set; } + pub fn graphics_reset(&mut self) { + self.reload_textures(); + } + pub fn start_new_game(&mut self, ctx: &mut Context) -> GameResult { let mut next_scene = GameScene::new(self, ctx, 13)?; next_scene.player1.cond.set_alive(true); diff --git a/src/sound/mod.rs b/src/sound/mod.rs index 0a35d52..0cfb1b8 100644 --- a/src/sound/mod.rs +++ b/src/sound/mod.rs @@ -526,9 +526,29 @@ where }, err_fn, )?; + stream.play()?; + let mut saved_state = true; loop { std::thread::sleep(Duration::from_millis(10)); + + { + let mutex = crate::GAME_SUSPENDED.lock().unwrap(); + let state = *mutex; + if saved_state != state { + saved_state = state; + + if state { + if let Err(e) = stream.pause() { + log::error!("Failed to pause the stream: {}", e); + } + } else { + if let Err(e) = stream.play() { + log::error!("Failed to unpause the stream: {}", e); + } + } + } + } } } diff --git a/src/text_script.rs b/src/text_script.rs index 5845dcf..3d16a44 100644 --- a/src/text_script.rs +++ b/src/text_script.rs @@ -729,7 +729,7 @@ impl TextScriptVM { FromPrimitive::from_i32(read_cur_varint(&mut cursor).unwrap_or_else(|_| OpCode::END as i32)); if let Some(op) = op_maybe { - println!("opcode: {:?}", op); + log::info!("opcode: {:?}", op); match op { OpCode::_NOP => { exec_state = TextScriptExecutionState::Running(event, cursor.position() as u32);