summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ci.yml68
-rw-r--r--.gitignore40
-rw-r--r--CMakeLists.txt155
-rw-r--r--changelog.md948
-rw-r--r--cmake/CompilerOptionsOverride.cmake5
-rw-r--r--cmake/CompilerWarnings.cmake116
-rw-r--r--cmake/Config.cmake65
-rw-r--r--cmake/Macros.cmake205
-rw-r--r--cmake/Modules/FindDRM.cmake18
-rw-r--r--cmake/Modules/FindGBM.cmake18
-rw-r--r--cmake/Modules/FindVORBIS.cmake (renamed from cmake/Modules/FindVorbis.cmake)0
-rw-r--r--cmake/SFMLConfig.cmake.in20
-rw-r--r--cmake/SFMLConfigDependencies.cmake.in18
-rw-r--r--cmake/toolchains/android.toolchain.cmake1666
-rw-r--r--debian/changelog47
-rw-r--r--debian/control64
-rw-r--r--debian/copyright311
-rw-r--r--debian/libsfml-audio2.6.install (renamed from debian/libsfml-audio2.5.install)0
-rw-r--r--debian/libsfml-doc.docs3
-rw-r--r--debian/libsfml-doc.links7
-rw-r--r--debian/libsfml-graphics2.6.install (renamed from debian/libsfml-graphics2.5.install)0
-rw-r--r--debian/libsfml-network2.6.install (renamed from debian/libsfml-network2.5.install)0
-rw-r--r--debian/libsfml-system2.6.install (renamed from debian/libsfml-system2.5.install)0
-rw-r--r--debian/libsfml-system2.6.lintian-overrides (renamed from debian/libsfml-system2.5.lintian-overrides)2
-rw-r--r--debian/libsfml-window2.6.install (renamed from debian/libsfml-window2.5.install)0
-rw-r--r--debian/libsfml-window2.6.lintian-overrides3
-rw-r--r--debian/not-installed2
-rw-r--r--debian/patches/02_build-doc-once.patch4
-rw-r--r--debian/patches/03_unbundle_vulkan.patch40
-rw-r--r--debian/patches/04_unbundle_stb.patch35
-rw-r--r--debian/patches/05_cmake_override_doc_path.patch35
-rw-r--r--debian/patches/07_remove-runtests-all.patch23
-rw-r--r--debian/patches/series4
-rwxr-xr-xdebian/rules12
-rw-r--r--debian/tests/control2
-rw-r--r--debian/upstream/metadata7
-rw-r--r--debian/watch2
-rw-r--r--doc/CMakeLists.txt8
-rw-r--r--doc/doxyfile.in790
-rw-r--r--doc/doxygen.css16
-rw-r--r--doc/header.html.in9
-rw-r--r--doc/mainpage.hpp4
-rw-r--r--doc/searchOverrides.css45
-rw-r--r--examples/CMakeLists.txt47
-rw-r--r--examples/X11/CMakeLists.txt5
-rw-r--r--examples/X11/X11.cpp39
-rw-r--r--examples/X11/gl.h7837
-rw-r--r--examples/android/app/src/main/assets/sansation.ttfbin28912 -> 0 bytes
-rwxr-xr-xexamples/android/app/src/main/assets/tuffy.ttfbin0 -> 18444 bytes
-rw-r--r--examples/android/app/src/main/jni/main.cpp10
-rw-r--r--examples/asset_licenses.md26
-rw-r--r--examples/assets/LaunchScreen.storyboard38
-rw-r--r--examples/assets/icon.icnsbin0 -> 38947 bytes
-rw-r--r--examples/assets/info.plist36
-rw-r--r--examples/assets/logo.pngbin0 -> 30801 bytes
-rw-r--r--examples/cocoa/CMakeLists.txt6
-rw-r--r--examples/cocoa/CocoaAppDelegate.h2
-rw-r--r--examples/cocoa/CocoaAppDelegate.mm18
-rw-r--r--examples/cocoa/NSString+stdstring.h2
-rw-r--r--examples/cocoa/NSString+stdstring.mm8
-rw-r--r--examples/cocoa/main.m2
-rw-r--r--examples/cocoa/resources/Cocoa-Info.plist2
-rw-r--r--examples/cocoa/resources/sansation.ttfbin28912 -> 0 bytes
-rwxr-xr-xexamples/cocoa/resources/tuffy.ttfbin0 -> 18444 bytes
-rw-r--r--examples/iOS/CMakeLists.txt25
-rw-r--r--examples/iOS/main.cpp65
-rw-r--r--examples/iOS/resources/image.pngbin8849 -> 0 bytes
-rw-r--r--examples/iOS/resources/sansation.ttfbin28912 -> 0 bytes
-rw-r--r--examples/island/CMakeLists.txt7
-rw-r--r--examples/island/Island.cpp83
-rw-r--r--examples/island/resources/sansation.ttfbin28912 -> 0 bytes
-rwxr-xr-xexamples/island/resources/tuffy.ttfbin0 -> 18444 bytes
-rw-r--r--examples/joystick/CMakeLists.txt2
-rw-r--r--examples/joystick/Joystick.cpp12
-rw-r--r--examples/joystick/resources/sansation.ttfbin28912 -> 0 bytes
-rwxr-xr-xexamples/joystick/resources/tuffy.ttfbin0 -> 18444 bytes
-rw-r--r--examples/opengl/CMakeLists.txt13
-rw-r--r--examples/opengl/OpenGL.cpp80
-rw-r--r--examples/opengl/gl.h7837
-rw-r--r--examples/opengl/resources/background.jpgbin0 -> 107190 bytes
-rw-r--r--examples/opengl/resources/logo.pngbin0 -> 33601 bytes
-rw-r--r--examples/opengl/resources/sansation.ttfbin28912 -> 0 bytes
-rwxr-xr-xexamples/opengl/resources/tuffy.ttfbin0 -> 18444 bytes
-rw-r--r--examples/pong/CMakeLists.txt11
-rw-r--r--examples/pong/resources/ball.wavbin15442 -> 0 bytes
-rw-r--r--examples/pong/resources/sansation.ttfbin28912 -> 0 bytes
-rw-r--r--examples/shader/Shader.cpp38
-rw-r--r--examples/shader/resources/background.jpgbin0 -> 66931 bytes
-rw-r--r--examples/shader/resources/devices.pngbin51410 -> 7173 bytes
-rw-r--r--examples/shader/resources/sansation.ttfbin28912 -> 0 bytes
-rwxr-xr-xexamples/shader/resources/tuffy.ttfbin0 -> 18444 bytes
-rw-r--r--examples/sound/Sound.cpp9
-rw-r--r--examples/sound/resources/ding.flacbin61764 -> 56364 bytes
-rw-r--r--examples/sound/resources/ding.mp3bin0 -> 16527 bytes
-rw-r--r--examples/sound/resources/doodle_pop.oggbin0 -> 116492 bytes
-rw-r--r--examples/sound/resources/killdeer.wavbin0 -> 113156 bytes
-rw-r--r--examples/tennis/CMakeLists.txt18
-rw-r--r--examples/tennis/Tennis.cpp (renamed from examples/pong/Pong.cpp)89
-rw-r--r--examples/tennis/resources/ball.wavbin0 -> 4892 bytes
-rw-r--r--examples/tennis/resources/sfml_logo.pngbin0 -> 13419 bytes
-rwxr-xr-xexamples/tennis/resources/tuffy.ttfbin0 -> 18444 bytes
-rw-r--r--examples/voip/Client.cpp8
-rw-r--r--examples/voip/Server.cpp20
-rw-r--r--examples/vulkan/CMakeLists.txt14
-rw-r--r--examples/vulkan/Vulkan.cpp2559
-rw-r--r--examples/vulkan/resources/logo.pngbin0 -> 21279 bytes
-rw-r--r--examples/vulkan/resources/shader.frag16
-rw-r--r--examples/vulkan/resources/shader.frag.spvbin0 -> 888 bytes
-rw-r--r--examples/vulkan/resources/shader.vert25
-rw-r--r--examples/vulkan/resources/shader.vert.spvbin0 -> 1600 bytes
-rw-r--r--examples/vulkan/vulkan.h3341
-rw-r--r--examples/win32/Win32.cpp4
-rw-r--r--examples/win32/resources/image1.jpgbin0 -> 14273 bytes
-rw-r--r--examples/win32/resources/image2.jpgbin0 -> 14866 bytes
-rw-r--r--examples/window/CMakeLists.txt5
-rw-r--r--examples/window/Window.cpp38
-rw-r--r--examples/window/gl.h7837
-rw-r--r--extlibs/headers/glad/include/glad/egl.h1530
-rw-r--r--extlibs/headers/glad/include/glad/gl.h12248
-rw-r--r--extlibs/headers/glad/include/glad/glx.h1043
-rw-r--r--extlibs/headers/glad/include/glad/wgl.h572
-rw-r--r--extlibs/headers/minimp3/minimp3.h1855
-rw-r--r--extlibs/headers/minimp3/minimp3_ex.h1397
-rw-r--r--extlibs/headers/stb_image/stb_image.h7187
-rw-r--r--extlibs/headers/stb_image/stb_image_write.h1458
-rw-r--r--include/SFML/Audio.hpp2
-rw-r--r--include/SFML/Audio/AlResource.hpp2
-rw-r--r--include/SFML/Audio/Export.hpp2
-rw-r--r--include/SFML/Audio/InputSoundFile.hpp29
-rw-r--r--include/SFML/Audio/Listener.hpp2
-rw-r--r--include/SFML/Audio/Music.hpp20
-rw-r--r--include/SFML/Audio/OutputSoundFile.hpp8
-rw-r--r--include/SFML/Audio/Sound.hpp4
-rw-r--r--include/SFML/Audio/SoundBuffer.hpp12
-rw-r--r--include/SFML/Audio/SoundBufferRecorder.hpp6
-rw-r--r--include/SFML/Audio/SoundFileFactory.hpp6
-rw-r--r--include/SFML/Audio/SoundFileFactory.inl2
-rw-r--r--include/SFML/Audio/SoundFileReader.hpp8
-rw-r--r--include/SFML/Audio/SoundFileWriter.hpp2
-rw-r--r--include/SFML/Audio/SoundRecorder.hpp22
-rw-r--r--include/SFML/Audio/SoundSource.hpp10
-rw-r--r--include/SFML/Audio/SoundStream.hpp53
-rw-r--r--include/SFML/Config.hpp18
-rw-r--r--include/SFML/GpuPreference.hpp2
-rw-r--r--include/SFML/Graphics.hpp2
-rw-r--r--include/SFML/Graphics/BlendMode.hpp52
-rw-r--r--include/SFML/Graphics/CircleShape.hpp6
-rw-r--r--include/SFML/Graphics/Color.hpp28
-rw-r--r--include/SFML/Graphics/ConvexShape.hpp4
-rw-r--r--include/SFML/Graphics/Drawable.hpp2
-rw-r--r--include/SFML/Graphics/Export.hpp2
-rw-r--r--include/SFML/Graphics/Font.hpp105
-rw-r--r--include/SFML/Graphics/Glsl.hpp2
-rw-r--r--include/SFML/Graphics/Glsl.inl12
-rw-r--r--include/SFML/Graphics/Glyph.hpp10
-rw-r--r--include/SFML/Graphics/Image.hpp46
-rw-r--r--include/SFML/Graphics/PrimitiveType.hpp22
-rw-r--r--include/SFML/Graphics/Rect.hpp30
-rw-r--r--include/SFML/Graphics/Rect.inl14
-rw-r--r--include/SFML/Graphics/RectangleShape.hpp4
-rw-r--r--include/SFML/Graphics/RenderStates.hpp12
-rw-r--r--include/SFML/Graphics/RenderTarget.hpp34
-rw-r--r--include/SFML/Graphics/RenderTexture.hpp18
-rw-r--r--include/SFML/Graphics/RenderWindow.hpp20
-rw-r--r--include/SFML/Graphics/Shader.hpp16
-rw-r--r--include/SFML/Graphics/Shape.hpp20
-rw-r--r--include/SFML/Graphics/Sprite.hpp8
-rw-r--r--include/SFML/Graphics/Text.hpp40
-rw-r--r--include/SFML/Graphics/Texture.hpp26
-rw-r--r--include/SFML/Graphics/Transform.hpp28
-rw-r--r--include/SFML/Graphics/Transformable.hpp18
-rw-r--r--include/SFML/Graphics/Vertex.hpp8
-rw-r--r--include/SFML/Graphics/VertexArray.hpp6
-rw-r--r--include/SFML/Graphics/VertexBuffer.hpp16
-rw-r--r--include/SFML/Graphics/View.hpp18
-rw-r--r--include/SFML/Main.hpp2
-rw-r--r--include/SFML/Network.hpp2
-rw-r--r--include/SFML/Network/Export.hpp2
-rw-r--r--include/SFML/Network/Ftp.hpp106
-rw-r--r--include/SFML/Network/Http.hpp88
-rw-r--r--include/SFML/Network/IpAddress.hpp14
-rw-r--r--include/SFML/Network/Packet.hpp23
-rw-r--r--include/SFML/Network/Socket.hpp24
-rw-r--r--include/SFML/Network/SocketHandle.hpp2
-rw-r--r--include/SFML/Network/SocketSelector.hpp4
-rw-r--r--include/SFML/Network/TcpListener.hpp6
-rw-r--r--include/SFML/Network/TcpSocket.hpp12
-rw-r--r--include/SFML/Network/UdpSocket.hpp13
-rw-r--r--include/SFML/OpenGL.hpp4
-rw-r--r--include/SFML/System.hpp2
-rw-r--r--include/SFML/System/Clock.hpp4
-rw-r--r--include/SFML/System/Err.hpp2
-rw-r--r--include/SFML/System/Export.hpp2
-rw-r--r--include/SFML/System/FileInputStream.hpp4
-rw-r--r--include/SFML/System/InputStream.hpp2
-rw-r--r--include/SFML/System/Lock.hpp4
-rw-r--r--include/SFML/System/MemoryInputStream.hpp8
-rw-r--r--include/SFML/System/Mutex.hpp4
-rw-r--r--include/SFML/System/NativeActivity.hpp2
-rw-r--r--include/SFML/System/NonCopyable.hpp2
-rw-r--r--include/SFML/System/Sleep.hpp2
-rw-r--r--include/SFML/System/String.hpp10
-rw-r--r--include/SFML/System/String.inl2
-rw-r--r--include/SFML/System/Thread.hpp6
-rw-r--r--include/SFML/System/Thread.inl2
-rw-r--r--include/SFML/System/ThreadLocal.hpp4
-rw-r--r--include/SFML/System/ThreadLocalPtr.hpp2
-rw-r--r--include/SFML/System/ThreadLocalPtr.inl2
-rw-r--r--include/SFML/System/Time.hpp6
-rw-r--r--include/SFML/System/Utf.hpp2
-rw-r--r--include/SFML/System/Utf.inl24
-rw-r--r--include/SFML/System/Vector2.hpp6
-rw-r--r--include/SFML/System/Vector2.inl2
-rw-r--r--include/SFML/System/Vector3.hpp8
-rw-r--r--include/SFML/System/Vector3.inl2
-rw-r--r--include/SFML/Window.hpp2
-rw-r--r--include/SFML/Window/Clipboard.hpp2
-rw-r--r--include/SFML/Window/Context.hpp4
-rw-r--r--include/SFML/Window/ContextSettings.hpp22
-rw-r--r--include/SFML/Window/Cursor.hpp53
-rw-r--r--include/SFML/Window/Event.hpp143
-rw-r--r--include/SFML/Window/Export.hpp2
-rw-r--r--include/SFML/Window/GlResource.hpp2
-rw-r--r--include/SFML/Window/Joystick.hpp30
-rw-r--r--include/SFML/Window/Keyboard.hpp485
-rw-r--r--include/SFML/Window/Mouse.hpp27
-rw-r--r--include/SFML/Window/Sensor.hpp16
-rw-r--r--include/SFML/Window/Touch.hpp6
-rw-r--r--include/SFML/Window/VideoMode.hpp8
-rw-r--r--include/SFML/Window/Vulkan.hpp115
-rw-r--r--include/SFML/Window/Window.hpp338
-rw-r--r--include/SFML/Window/WindowBase.hpp518
-rw-r--r--include/SFML/Window/WindowHandle.hpp4
-rw-r--r--include/SFML/Window/WindowStyle.hpp14
-rw-r--r--license.md3
-rw-r--r--src/SFML/Audio/ALCheck.cpp9
-rw-r--r--src/SFML/Audio/ALCheck.hpp20
-rw-r--r--src/SFML/Audio/AlResource.cpp2
-rw-r--r--src/SFML/Audio/AudioDevice.cpp27
-rw-r--r--src/SFML/Audio/AudioDevice.hpp2
-rw-r--r--src/SFML/Audio/CMakeLists.txt11
-rw-r--r--src/SFML/Audio/InputSoundFile.cpp14
-rw-r--r--src/SFML/Audio/Listener.cpp2
-rw-r--r--src/SFML/Audio/Music.cpp16
-rw-r--r--src/SFML/Audio/OutputSoundFile.cpp2
-rw-r--r--src/SFML/Audio/Sound.cpp15
-rw-r--r--src/SFML/Audio/SoundBuffer.cpp19
-rw-r--r--src/SFML/Audio/SoundBufferRecorder.cpp2
-rw-r--r--src/SFML/Audio/SoundFileFactory.cpp4
-rw-r--r--src/SFML/Audio/SoundFileReaderFlac.cpp22
-rw-r--r--src/SFML/Audio/SoundFileReaderFlac.hpp6
-rw-r--r--src/SFML/Audio/SoundFileReaderMp3.cpp164
-rw-r--r--src/SFML/Audio/SoundFileReaderMp3.hpp143
-rw-r--r--src/SFML/Audio/SoundFileReaderOgg.cpp16
-rw-r--r--src/SFML/Audio/SoundFileReaderOgg.hpp2
-rw-r--r--src/SFML/Audio/SoundFileReaderWav.cpp38
-rw-r--r--src/SFML/Audio/SoundFileReaderWav.hpp10
-rw-r--r--src/SFML/Audio/SoundFileWriterFlac.cpp14
-rw-r--r--src/SFML/Audio/SoundFileWriterFlac.hpp8
-rw-r--r--src/SFML/Audio/SoundFileWriterOgg.cpp18
-rw-r--r--src/SFML/Audio/SoundFileWriterOgg.hpp2
-rw-r--r--src/SFML/Audio/SoundFileWriterWav.cpp15
-rw-r--r--src/SFML/Audio/SoundFileWriterWav.hpp4
-rw-r--r--src/SFML/Audio/SoundRecorder.cpp15
-rw-r--r--src/SFML/Audio/SoundSource.cpp9
-rw-r--r--src/SFML/Audio/SoundStream.cpp46
-rw-r--r--src/SFML/CMakeLists.txt6
-rw-r--r--src/SFML/Graphics/BlendMode.cpp8
-rw-r--r--src/SFML/Graphics/CMakeLists.txt37
-rw-r--r--src/SFML/Graphics/CircleShape.cpp4
-rw-r--r--src/SFML/Graphics/Color.cpp8
-rw-r--r--src/SFML/Graphics/ConvexShape.cpp2
-rw-r--r--src/SFML/Graphics/Font.cpp147
-rw-r--r--src/SFML/Graphics/GLCheck.cpp2
-rw-r--r--src/SFML/Graphics/GLCheck.hpp2
-rw-r--r--src/SFML/Graphics/GLExtensions.cpp18
-rw-r--r--src/SFML/Graphics/GLExtensions.hpp119
-rw-r--r--src/SFML/Graphics/GLLoader.cpp1019
-rw-r--r--src/SFML/Graphics/GLLoader.hpp1706
-rw-r--r--src/SFML/Graphics/Glsl.cpp2
-rw-r--r--src/SFML/Graphics/Image.cpp61
-rw-r--r--src/SFML/Graphics/ImageLoader.cpp86
-rw-r--r--src/SFML/Graphics/ImageLoader.hpp15
-rw-r--r--src/SFML/Graphics/RectangleShape.cpp2
-rw-r--r--src/SFML/Graphics/RenderStates.cpp2
-rw-r--r--src/SFML/Graphics/RenderTarget.cpp196
-rw-r--r--src/SFML/Graphics/RenderTexture.cpp12
-rw-r--r--src/SFML/Graphics/RenderTextureImpl.cpp2
-rw-r--r--src/SFML/Graphics/RenderTextureImpl.hpp13
-rw-r--r--src/SFML/Graphics/RenderTextureImplDefault.cpp12
-rw-r--r--src/SFML/Graphics/RenderTextureImplDefault.hpp19
-rw-r--r--src/SFML/Graphics/RenderTextureImplFBO.cpp54
-rw-r--r--src/SFML/Graphics/RenderTextureImplFBO.hpp34
-rw-r--r--src/SFML/Graphics/RenderWindow.cpp31
-rw-r--r--src/SFML/Graphics/Shader.cpp111
-rw-r--r--src/SFML/Graphics/Shape.cpp11
-rw-r--r--src/SFML/Graphics/Sprite.cpp23
-rw-r--r--src/SFML/Graphics/Text.cpp68
-rw-r--r--src/SFML/Graphics/Texture.cpp118
-rw-r--r--src/SFML/Graphics/TextureSaver.cpp4
-rw-r--r--src/SFML/Graphics/TextureSaver.hpp4
-rw-r--r--src/SFML/Graphics/Transform.cpp2
-rw-r--r--src/SFML/Graphics/Transformable.cpp8
-rw-r--r--src/SFML/Graphics/Vertex.cpp2
-rw-r--r--src/SFML/Graphics/VertexArray.cpp2
-rw-r--r--src/SFML/Graphics/VertexBuffer.cpp33
-rw-r--r--src/SFML/Graphics/View.cpp8
-rw-r--r--src/SFML/Main/CMakeLists.txt8
-rw-r--r--src/SFML/Main/MainAndroid.cpp49
-rw-r--r--src/SFML/Main/MainWin32.cpp5
-rw-r--r--src/SFML/Main/MainiOS.mm2
-rw-r--r--src/SFML/Main/SFMLActivity.cpp5
-rw-r--r--src/SFML/Network/Ftp.cpp20
-rw-r--r--src/SFML/Network/Http.cpp15
-rw-r--r--src/SFML/Network/IpAddress.cpp8
-rw-r--r--src/SFML/Network/Packet.cpp39
-rw-r--r--src/SFML/Network/Socket.cpp2
-rw-r--r--src/SFML/Network/SocketImpl.hpp2
-rw-r--r--src/SFML/Network/SocketSelector.cpp12
-rw-r--r--src/SFML/Network/TcpListener.cpp2
-rw-r--r--src/SFML/Network/TcpSocket.cpp32
-rw-r--r--src/SFML/Network/UdpSocket.cpp12
-rw-r--r--src/SFML/Network/Unix/SocketImpl.cpp2
-rw-r--r--src/SFML/Network/Unix/SocketImpl.hpp3
-rw-r--r--src/SFML/Network/Win32/SocketImpl.cpp4
-rw-r--r--src/SFML/Network/Win32/SocketImpl.hpp3
-rw-r--r--src/SFML/System/Android/Activity.cpp27
-rw-r--r--src/SFML/System/Android/Activity.hpp5
-rw-r--r--src/SFML/System/Android/NativeActivity.cpp4
-rw-r--r--src/SFML/System/Android/ResourceStream.cpp10
-rw-r--r--src/SFML/System/CMakeLists.txt5
-rw-r--r--src/SFML/System/Clock.cpp2
-rw-r--r--src/SFML/System/Err.cpp4
-rw-r--r--src/SFML/System/FileInputStream.cpp4
-rw-r--r--src/SFML/System/Lock.cpp2
-rw-r--r--src/SFML/System/MemoryInputStream.cpp4
-rw-r--r--src/SFML/System/Mutex.cpp2
-rw-r--r--src/SFML/System/Sleep.cpp2
-rw-r--r--src/SFML/System/String.cpp2
-rw-r--r--src/SFML/System/Thread.cpp2
-rw-r--r--src/SFML/System/ThreadLocal.cpp2
-rw-r--r--src/SFML/System/Time.cpp4
-rw-r--r--src/SFML/System/Unix/ClockImpl.cpp4
-rw-r--r--src/SFML/System/Unix/ClockImpl.hpp2
-rw-r--r--src/SFML/System/Unix/MutexImpl.cpp2
-rw-r--r--src/SFML/System/Unix/MutexImpl.hpp2
-rw-r--r--src/SFML/System/Unix/SleepImpl.cpp8
-rw-r--r--src/SFML/System/Unix/SleepImpl.hpp2
-rw-r--r--src/SFML/System/Unix/ThreadImpl.cpp2
-rw-r--r--src/SFML/System/Unix/ThreadImpl.hpp2
-rw-r--r--src/SFML/System/Unix/ThreadLocalImpl.cpp2
-rw-r--r--src/SFML/System/Unix/ThreadLocalImpl.hpp2
-rw-r--r--src/SFML/System/Win32/ClockImpl.cpp10
-rw-r--r--src/SFML/System/Win32/ClockImpl.hpp2
-rw-r--r--src/SFML/System/Win32/MutexImpl.cpp2
-rw-r--r--src/SFML/System/Win32/MutexImpl.hpp4
-rw-r--r--src/SFML/System/Win32/SleepImpl.cpp4
-rw-r--r--src/SFML/System/Win32/SleepImpl.hpp2
-rw-r--r--src/SFML/System/Win32/ThreadImpl.cpp2
-rw-r--r--src/SFML/System/Win32/ThreadImpl.hpp6
-rw-r--r--src/SFML/System/Win32/ThreadLocalImpl.cpp2
-rw-r--r--src/SFML/System/Win32/ThreadLocalImpl.hpp4
-rw-r--r--src/SFML/Window/Android/ClipboardImpl.cpp4
-rw-r--r--src/SFML/Window/Android/ClipboardImpl.hpp2
-rw-r--r--src/SFML/Window/Android/CursorImpl.cpp6
-rw-r--r--src/SFML/Window/Android/CursorImpl.hpp2
-rw-r--r--src/SFML/Window/Android/InputImpl.cpp75
-rw-r--r--src/SFML/Window/Android/InputImpl.hpp36
-rw-r--r--src/SFML/Window/Android/JoystickImpl.cpp4
-rw-r--r--src/SFML/Window/Android/JoystickImpl.hpp1
-rw-r--r--src/SFML/Window/Android/SensorImpl.cpp18
-rw-r--r--src/SFML/Window/Android/SensorImpl.hpp2
-rw-r--r--src/SFML/Window/Android/VideoModeImpl.cpp6
-rw-r--r--src/SFML/Window/Android/WindowImplAndroid.cpp219
-rw-r--r--src/SFML/Window/Android/WindowImplAndroid.hpp8
-rw-r--r--src/SFML/Window/CMakeLists.txt170
-rw-r--r--src/SFML/Window/Clipboard.cpp2
-rw-r--r--src/SFML/Window/ClipboardImpl.hpp10
-rw-r--r--src/SFML/Window/Context.cpp20
-rw-r--r--src/SFML/Window/Cursor.cpp2
-rw-r--r--src/SFML/Window/CursorImpl.hpp20
-rw-r--r--src/SFML/Window/DRM/ClipboardImpl.cpp (renamed from src/SFML/Window/OSX/AutoreleasePoolWrapper.h)28
-rw-r--r--src/SFML/Window/DRM/ClipboardImpl.hpp76
-rw-r--r--src/SFML/Window/DRM/CursorImpl.cpp90
-rw-r--r--src/SFML/Window/DRM/CursorImpl.hpp119
-rw-r--r--src/SFML/Window/DRM/DRMContext.cpp872
-rw-r--r--src/SFML/Window/DRM/DRMContext.hpp224
-rw-r--r--src/SFML/Window/DRM/InputImplUDev.cpp752
-rw-r--r--src/SFML/Window/DRM/InputImplUDev.hpp211
-rw-r--r--src/SFML/Window/DRM/VideoModeImpl.cpp72
-rw-r--r--src/SFML/Window/DRM/WindowImplDRM.cpp160
-rw-r--r--src/SFML/Window/DRM/WindowImplDRM.hpp205
-rw-r--r--src/SFML/Window/EGLCheck.cpp6
-rw-r--r--src/SFML/Window/EGLCheck.hpp9
-rw-r--r--src/SFML/Window/EglContext.cpp169
-rw-r--r--src/SFML/Window/EglContext.hpp31
-rw-r--r--src/SFML/Window/FreeBSD/JoystickImpl.cpp15
-rw-r--r--src/SFML/Window/FreeBSD/JoystickImpl.hpp2
-rw-r--r--src/SFML/Window/GlContext.cpp479
-rw-r--r--src/SFML/Window/GlContext.hpp14
-rw-r--r--src/SFML/Window/GlResource.cpp2
-rw-r--r--src/SFML/Window/InputImpl.hpp11
-rw-r--r--src/SFML/Window/Joystick.cpp2
-rw-r--r--src/SFML/Window/JoystickImpl.hpp17
-rw-r--r--src/SFML/Window/JoystickManager.cpp4
-rw-r--r--src/SFML/Window/JoystickManager.hpp12
-rw-r--r--src/SFML/Window/Keyboard.cpp26
-rw-r--r--src/SFML/Window/Mouse.cpp6
-rw-r--r--src/SFML/Window/NetBSD/JoystickImpl.cpp350
-rw-r--r--src/SFML/Window/NetBSD/JoystickImpl.hpp130
-rw-r--r--src/SFML/Window/OSX/AutoreleasePoolWrapper.hpp76
-rw-r--r--src/SFML/Window/OSX/AutoreleasePoolWrapper.mm77
-rw-r--r--src/SFML/Window/OSX/ClipboardImpl.hpp2
-rw-r--r--src/SFML/Window/OSX/ClipboardImpl.mm5
-rw-r--r--src/SFML/Window/OSX/CursorImpl.hpp2
-rw-r--r--src/SFML/Window/OSX/CursorImpl.mm54
-rw-r--r--src/SFML/Window/OSX/HIDInputManager.hpp151
-rw-r--r--src/SFML/Window/OSX/HIDInputManager.mm1767
-rw-r--r--src/SFML/Window/OSX/HIDJoystickManager.cpp4
-rw-r--r--src/SFML/Window/OSX/HIDJoystickManager.hpp2
-rw-r--r--src/SFML/Window/OSX/InputImpl.hpp38
-rw-r--r--src/SFML/Window/OSX/InputImpl.mm69
-rw-r--r--src/SFML/Window/OSX/JoystickImpl.cpp43
-rw-r--r--src/SFML/Window/OSX/JoystickImpl.hpp2
-rw-r--r--src/SFML/Window/OSX/NSImage+raw.h2
-rw-r--r--src/SFML/Window/OSX/NSImage+raw.mm6
-rw-r--r--src/SFML/Window/OSX/SFApplication.h2
-rw-r--r--src/SFML/Window/OSX/SFApplication.m18
-rw-r--r--src/SFML/Window/OSX/SFApplicationDelegate.h2
-rw-r--r--src/SFML/Window/OSX/SFApplicationDelegate.m10
-rw-r--r--src/SFML/Window/OSX/SFContext.hpp2
-rw-r--r--src/SFML/Window/OSX/SFContext.mm48
-rw-r--r--src/SFML/Window/OSX/SFKeyboardModifiersHelper.h5
-rw-r--r--src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm49
-rw-r--r--src/SFML/Window/OSX/SFOpenGLView+keyboard.mm32
-rw-r--r--src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h2
-rw-r--r--src/SFML/Window/OSX/SFOpenGLView+mouse.mm22
-rw-r--r--src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h2
-rw-r--r--src/SFML/Window/OSX/SFOpenGLView.h23
-rw-r--r--src/SFML/Window/OSX/SFOpenGLView.mm34
-rw-r--r--src/SFML/Window/OSX/SFSilentResponder.h2
-rw-r--r--src/SFML/Window/OSX/SFSilentResponder.m2
-rw-r--r--src/SFML/Window/OSX/SFViewController.h2
-rw-r--r--src/SFML/Window/OSX/SFViewController.mm12
-rw-r--r--src/SFML/Window/OSX/SFWindow.h14
-rw-r--r--src/SFML/Window/OSX/SFWindow.m9
-rw-r--r--src/SFML/Window/OSX/SFWindowController.h3
-rw-r--r--src/SFML/Window/OSX/SFWindowController.mm50
-rw-r--r--src/SFML/Window/OSX/Scaling.h6
-rw-r--r--src/SFML/Window/OSX/SensorImpl.cpp2
-rw-r--r--src/SFML/Window/OSX/SensorImpl.hpp2
-rw-r--r--src/SFML/Window/OSX/VideoModeImpl.cpp4
-rw-r--r--src/SFML/Window/OSX/WindowImplCocoa.hpp19
-rw-r--r--src/SFML/Window/OSX/WindowImplCocoa.mm59
-rw-r--r--src/SFML/Window/OSX/WindowImplDelegateProtocol.h20
-rw-r--r--src/SFML/Window/OSX/cg_sf_conversion.hpp2
-rw-r--r--src/SFML/Window/OSX/cg_sf_conversion.mm12
-rw-r--r--src/SFML/Window/OSX/cpp_objc_conversion.h2
-rw-r--r--src/SFML/Window/OSX/cpp_objc_conversion.mm4
-rw-r--r--src/SFML/Window/Sensor.cpp2
-rw-r--r--src/SFML/Window/SensorImpl.hpp4
-rw-r--r--src/SFML/Window/SensorManager.cpp2
-rw-r--r--src/SFML/Window/SensorManager.hpp12
-rw-r--r--src/SFML/Window/Touch.cpp4
-rw-r--r--src/SFML/Window/Unix/ClipboardImpl.cpp14
-rw-r--r--src/SFML/Window/Unix/ClipboardImpl.hpp2
-rw-r--r--src/SFML/Window/Unix/CursorImpl.cpp110
-rw-r--r--src/SFML/Window/Unix/CursorImpl.hpp24
-rw-r--r--src/SFML/Window/Unix/Display.cpp54
-rw-r--r--src/SFML/Window/Unix/Display.hpp23
-rw-r--r--src/SFML/Window/Unix/GlxContext.cpp87
-rw-r--r--src/SFML/Window/Unix/GlxContext.hpp4
-rw-r--r--src/SFML/Window/Unix/GlxExtensions.cpp218
-rw-r--r--src/SFML/Window/Unix/GlxExtensions.hpp251
-rw-r--r--src/SFML/Window/Unix/GlxExtensions.txt14
-rw-r--r--src/SFML/Window/Unix/InputImpl.cpp167
-rw-r--r--src/SFML/Window/Unix/InputImpl.hpp38
-rw-r--r--src/SFML/Window/Unix/JoystickImpl.cpp43
-rw-r--r--src/SFML/Window/Unix/JoystickImpl.hpp2
-rw-r--r--src/SFML/Window/Unix/KeySymToKeyMapping.cpp263
-rw-r--r--src/SFML/Window/Unix/KeySymToKeyMapping.hpp63
-rw-r--r--src/SFML/Window/Unix/KeySymToUnicodeMapping.cpp1403
-rw-r--r--src/SFML/Window/Unix/KeySymToUnicodeMapping.hpp60
-rw-r--r--src/SFML/Window/Unix/KeyboardImpl.cpp815
-rw-r--r--src/SFML/Window/Unix/KeyboardImpl.hpp104
-rw-r--r--src/SFML/Window/Unix/SensorImpl.cpp2
-rw-r--r--src/SFML/Window/Unix/SensorImpl.hpp2
-rw-r--r--src/SFML/Window/Unix/VideoModeImpl.cpp16
-rw-r--r--src/SFML/Window/Unix/VulkanImplX11.cpp225
-rw-r--r--src/SFML/Window/Unix/VulkanImplX11.hpp103
-rw-r--r--src/SFML/Window/Unix/WindowImplX11.cpp972
-rw-r--r--src/SFML/Window/Unix/WindowImplX11.hpp41
-rw-r--r--src/SFML/Window/VideoMode.cpp2
-rw-r--r--src/SFML/Window/VideoModeImpl.hpp2
-rw-r--r--src/SFML/Window/Vulkan.cpp105
-rw-r--r--src/SFML/Window/Win32/ClipboardImpl.cpp2
-rw-r--r--src/SFML/Window/Win32/ClipboardImpl.hpp2
-rwxr-xr-xsrc/SFML/Window/Win32/CursorImpl.cpp31
-rwxr-xr-xsrc/SFML/Window/Win32/CursorImpl.hpp3
-rw-r--r--src/SFML/Window/Win32/InputImpl.cpp702
-rw-r--r--src/SFML/Window/Win32/InputImpl.hpp52
-rw-r--r--src/SFML/Window/Win32/JoystickImpl.cpp461
-rw-r--r--src/SFML/Window/Win32/JoystickImpl.hpp31
-rw-r--r--src/SFML/Window/Win32/SensorImpl.cpp2
-rw-r--r--src/SFML/Window/Win32/SensorImpl.hpp2
-rw-r--r--src/SFML/Window/Win32/VideoModeImpl.cpp4
-rw-r--r--src/SFML/Window/Win32/VulkanImplWin32.cpp221
-rw-r--r--src/SFML/Window/Win32/VulkanImplWin32.hpp103
-rw-r--r--src/SFML/Window/Win32/WglContext.cpp175
-rw-r--r--src/SFML/Window/Win32/WglContext.hpp14
-rw-r--r--src/SFML/Window/Win32/WglExtensions.cpp223
-rw-r--r--src/SFML/Window/Win32/WglExtensions.hpp236
-rw-r--r--src/SFML/Window/Win32/WglExtensions.txt13
-rwxr-xr-xsrc/SFML/Window/Win32/WindowImplWin32.cpp223
-rwxr-xr-xsrc/SFML/Window/Win32/WindowImplWin32.hpp36
-rw-r--r--src/SFML/Window/Window.cpp261
-rw-r--r--src/SFML/Window/WindowBase.cpp383
-rw-r--r--src/SFML/Window/WindowImpl.cpp55
-rw-r--r--src/SFML/Window/WindowImpl.hpp24
-rw-r--r--src/SFML/Window/iOS/ClipboardImpl.hpp2
-rw-r--r--src/SFML/Window/iOS/ClipboardImpl.mm2
-rw-r--r--src/SFML/Window/iOS/CursorImpl.cpp6
-rw-r--r--src/SFML/Window/iOS/CursorImpl.hpp2
-rw-r--r--src/SFML/Window/iOS/EaglContext.hpp14
-rw-r--r--src/SFML/Window/iOS/EaglContext.mm127
-rw-r--r--src/SFML/Window/iOS/InputImpl.hpp38
-rw-r--r--src/SFML/Window/iOS/InputImpl.mm41
-rw-r--r--src/SFML/Window/iOS/JoystickImpl.hpp2
-rw-r--r--src/SFML/Window/iOS/JoystickImpl.mm6
-rw-r--r--src/SFML/Window/iOS/ObjCType.hpp2
-rw-r--r--src/SFML/Window/iOS/SFAppDelegate.hpp2
-rw-r--r--src/SFML/Window/iOS/SFAppDelegate.mm45
-rw-r--r--src/SFML/Window/iOS/SFMain.hpp2
-rw-r--r--src/SFML/Window/iOS/SFMain.mm2
-rw-r--r--src/SFML/Window/iOS/SFView.hpp2
-rw-r--r--src/SFML/Window/iOS/SFView.mm18
-rw-r--r--src/SFML/Window/iOS/SFViewController.hpp2
-rw-r--r--src/SFML/Window/iOS/SFViewController.mm2
-rw-r--r--src/SFML/Window/iOS/SensorImpl.hpp2
-rw-r--r--src/SFML/Window/iOS/SensorImpl.mm32
-rw-r--r--src/SFML/Window/iOS/VideoModeImpl.mm6
-rw-r--r--src/SFML/Window/iOS/WindowImplUIKit.hpp2
-rw-r--r--src/SFML/Window/iOS/WindowImplUIKit.mm60
-rw-r--r--test/CMakeLists.txt49
-rw-r--r--test/src/CatchMain.cpp2
-rw-r--r--test/src/Graphics/Rect.cpp120
-rw-r--r--test/src/Network/Packet.cpp52
-rw-r--r--test/src/System/Vector2.cpp148
-rw-r--r--test/src/System/Vector3.cpp161
-rw-r--r--test/src/TestUtilities/GraphicsUtil.cpp19
-rw-r--r--test/src/TestUtilities/GraphicsUtil.hpp23
-rw-r--r--test/src/TestUtilities/SystemUtil.cpp20
-rw-r--r--test/src/TestUtilities/SystemUtil.hpp45
-rw-r--r--test/src/TestUtilities/WindowUtil.cpp14
-rw-r--r--test/src/TestUtilities/WindowUtil.hpp33
-rw-r--r--tools/nsis/header.bmpbin0 -> 9742 bytes
-rw-r--r--tools/nsis/sfml.icobin0 -> 15086 bytes
-rw-r--r--tools/nsis/sidebar.bmpbin0 -> 52574 bytes
-rw-r--r--tools/pkg-config/sfml-all.pc.in2
-rw-r--r--tools/pkg-config/sfml-audio.pc.in2
-rw-r--r--tools/pkg-config/sfml-graphics.pc.in2
-rw-r--r--tools/pkg-config/sfml-network.pc.in2
-rw-r--r--tools/pkg-config/sfml-system.pc.in2
-rw-r--r--tools/pkg-config/sfml-window.pc.in2
-rw-r--r--tools/windows/resource.rc.in63
-rw-r--r--tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp43
-rw-r--r--tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm52
-rw-r--r--tools/xcode/templates/SFML/SFML App.xctemplate/TemplateIcon.icnsbin0 -> 179106 bytes
-rw-r--r--tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in278
-rw-r--r--tools/xcode/templates/SFML/SFML App.xctemplate/background.jpgbin0 -> 49008 bytes
-rw-r--r--tools/xcode/templates/SFML/SFML App.xctemplate/doodle_pop.oggbin0 -> 116492 bytes
-rw-r--r--tools/xcode/templates/SFML/SFML App.xctemplate/icon.pngbin0 -> 21279 bytes
-rw-r--r--tools/xcode/templates/SFML/SFML App.xctemplate/main.cpp91
-rwxr-xr-xtools/xcode/templates/SFML/SFML App.xctemplate/tuffy.ttfbin0 -> 18444 bytes
-rw-r--r--tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist116
-rw-r--r--tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist137
-rw-r--r--tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateIcon.icnsbin0 -> 179106 bytes
-rw-r--r--tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist136
-rw-r--r--tools/xcode/templates/SFML/SFML CLT.xctemplate/background.jpgbin0 -> 49008 bytes
-rw-r--r--tools/xcode/templates/SFML/SFML CLT.xctemplate/doodle_pop.oggbin0 -> 116492 bytes
-rw-r--r--tools/xcode/templates/SFML/SFML CLT.xctemplate/icon.pngbin0 -> 21279 bytes
-rw-r--r--tools/xcode/templates/SFML/SFML CLT.xctemplate/main.cpp89
-rwxr-xr-xtools/xcode/templates/SFML/SFML CLT.xctemplate/tuffy.ttfbin0 -> 18444 bytes
-rw-r--r--tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in124
-rw-r--r--tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist362
-rw-r--r--tools/xcode/templates/readme.txt150
586 files changed, 69133 insertions, 20069 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..6f0841e
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,68 @@
+name: CI
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ name: ${{ matrix.platform.name }} ${{ matrix.config.name }}
+ runs-on: ${{ matrix.platform.os }}
+
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ - { name: Windows VS2019, os: windows-2019 }
+ - { name: Windows VS2022, os: windows-2022 }
+ - { name: Windows VS2022 Clang, os: windows-2022, flags: -T ClangCL }
+ - { name: Linux GCC, os: ubuntu-20.04 }
+ - { name: Linux Clang, os: ubuntu-20.04, flags: -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ }
+ - { name: Linux GCC OpenGL ES, os: ubuntu-20.04, flags: -DSFML_OPENGL_ES=ON }
+ - { name: MacOS XCode, os: macos-11 }
+ config:
+ - { name: Shared, flags: -DBUILD_SHARED_LIBS=TRUE }
+ - { name: Static, flags: -DBUILD_SHARED_LIBS=FALSE }
+
+ include:
+ - platform: { name: Windows VS2022, os: windows-2022 }
+ config: { name: Unity, flags: -DBUILD_SHARED_LIBS=TRUE -DCMAKE_UNITY_BUILD=ON }
+ - platform: { name: MacOS XCode, os: macos-11 }
+ config: { name: Frameworks, flags: -DSFML_BUILD_FRAMEWORKS=TRUE }
+ - platform: { name: MacOS XCode, os: macos-11 }
+ config: { name: iOS, flags: -DCMAKE_TOOLCHAIN_FILE=$GITHUB_WORKSPACE/cmake/toolchains/iOS.toolchain.cmake -DIOS_PLATFORM=SIMULATOR }
+ - platform: { name: Android, os: ubuntu-20.04 }
+ config: { name: x86, flags: -DCMAKE_ANDROID_ARCH_ABI=x86 -DCMAKE_SYSTEM_NAME=Android -DSFML_BUILD_TEST_SUITE=FALSE -DCMAKE_ANDROID_NDK=$GITHUB_WORKSPACE/android-ndk-r18b -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26 }
+ - platform: { name: Android, os: ubuntu-20.04 }
+ config: { name: armeabi-v7a, flags: -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_SYSTEM_NAME=Android -DSFML_BUILD_TEST_SUITE=FALSE -DCMAKE_ANDROID_NDK=$GITHUB_WORKSPACE/android-ndk-r18b -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26 }
+ - platform: { name: Android, os: ubuntu-20.04 }
+ config: { name: arm64-v8a, flags: -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -DCMAKE_SYSTEM_NAME=Android -DSFML_BUILD_TEST_SUITE=FALSE -DCMAKE_TOOLCHAIN_FILE=$GITHUB_WORKSPACE/android-ndk-r18b/build/cmake/android.toolchain.cmake -DCMAKE_ANDROID_NDK=$GITHUB_WORKSPACE/android-ndk-r18b -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26 }
+ - platform: { name: Android, os: ubuntu-20.04 }
+ config: { name: x86_64, flags: -DCMAKE_ANDROID_ARCH_ABI=x86_64 -DCMAKE_SYSTEM_NAME=Android -DSFML_BUILD_TEST_SUITE=FALSE -DCMAKE_TOOLCHAIN_FILE=$GITHUB_WORKSPACE/android-ndk-r18b/build/cmake/android.toolchain.cmake -DCMAKE_ANDROID_NDK=$GITHUB_WORKSPACE/android-ndk-r18b -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26 }
+ - platform: { name: Linux GCC, os: ubuntu-20.04 }
+ config: { name: Static DRM, flags: -DBUILD_SHARED_LIBS=FALSE -DSFML_USE_DRM=TRUE }
+ - platform: { name: Linux GCC, os: ubuntu-20.04 }
+ config: { name: Shared DRM, flags: -DBUILD_SHARED_LIBS=TRUE -DSFML_USE_DRM=TRUE }
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v3
+
+ - name: Install Linux Dependencies
+ if: runner.os == 'Linux'
+ run: sudo apt-get update && sudo apt-get install libxrandr-dev libxcursor-dev libudev-dev libopenal-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev libdrm-dev libgbm-dev
+
+
+ - name: Install Android Components
+ if: matrix.platform.name == 'Android'
+ run: |
+ echo "y" | /usr/local/lib/android/sdk/tools/bin/sdkmanager --install "cmake;3.10.2.4988404" --sdk_root=ANDROID_SDK_ROOT
+ sudo ln -sf /usr/local/lib/android/sdk/cmake/3.10.2.4988404/bin/cmake /usr/bin/cmake
+ wget -nv https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip -P $GITHUB_WORKSPACE
+ unzip -qq -d $GITHUB_WORKSPACE android-ndk-r18b-linux-x86_64.zip
+
+
+ - name: Configure CMake
+ shell: bash
+ run: cmake -S $GITHUB_WORKSPACE -B $GITHUB_WORKSPACE/build -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/install -DSFML_BUILD_EXAMPLES=TRUE -DCMAKE_VERBOSE_MAKEFILE=ON -DSFML_BUILD_TEST_SUITE=TRUE -DWARNINGS_AS_ERRORS=TRUE ${{matrix.platform.flags}} ${{matrix.config.flags}}
+
+ - name: Build
+ shell: bash
+ run: cmake --build $GITHUB_WORKSPACE/build --config Release --target install
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5a9a38a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,40 @@
+# Prerequisites
+*.d
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+*.smod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+
+# Build folders
+build/
+
+# Cache/IDE folders
+.cache/
+.vscode/
+.idea/
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e821a49..fc9a268 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,9 +1,7 @@
-# CMake's built-in Android support requires 3.7.0
-if(CMAKE_SYSTEM_NAME MATCHES "Android")
- cmake_minimum_required(VERSION 3.7.2)
-else()
- cmake_minimum_required(VERSION 3.0.2)
-endif()
+cmake_minimum_required(VERSION 3.7.2)
+
+# customize the compiler options CMake uses to initialize variables with
+set(CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/CompilerOptionsOverride.cmake")
# define a macro that helps defining an option
macro(sfml_set_option var default type docstring)
@@ -27,11 +25,6 @@ if (NOT CMAKE_VERSION VERSION_LESS 3.9)
cmake_policy(SET CMP0068 NEW)
endif()
-# add some default value for some additional macOS variable
-# note that those variables are ignored on other systems
-if(NOT CMAKE_OSX_ARCHITECTURES)
- set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "macOS architecture to build; 64-bit is expected" FORCE)
-endif()
if(NOT CMAKE_OSX_SYSROOT)
# query the path to the default SDK, will fail on non-macOS, but it's okay.
execute_process(COMMAND xcodebuild -sdk macosx -version Path
@@ -47,9 +40,14 @@ project(SFML)
# include the configuration file
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake)
+# we use the paths from the cmake GNUInstallDirs module as defaults
+# you can override these if you like
+# https://cmake.org/cmake/help/v3.0/module/GNUInstallDirs.html
+include(GNUInstallDirs)
+
# setup version numbers
set(VERSION_MAJOR 2)
-set(VERSION_MINOR 5)
+set(VERSION_MINOR 6)
set(VERSION_PATCH 1)
# add an option for choosing the build type (shared or static)
@@ -79,28 +77,41 @@ sfml_set_option(SFML_BUILD_NETWORK TRUE BOOL "TRUE to build SFML's Network modul
# add an option for building the API documentation
sfml_set_option(SFML_BUILD_DOC FALSE BOOL "TRUE to generate the API documentation, FALSE to ignore it")
-# add an option for choosing the OpenGL implementation
if(SFML_BUILD_WINDOW)
+ # add an option for choosing the OpenGL implementation
sfml_set_option(SFML_OPENGL_ES ${OPENGL_ES} BOOL "TRUE to use an OpenGL ES implementation, FALSE to use a desktop OpenGL implementation")
+
+ # add an option for choosing whether to use the DRM windowing backend
+ if(SFML_OS_LINUX)
+ sfml_set_option(SFML_USE_DRM FALSE BOOL "TRUE to use DRM windowing backend")
+ endif()
endif()
-# Mac OS X specific options
+# add an option for building the test suite
+sfml_set_option(SFML_BUILD_TEST_SUITE FALSE BOOL "TRUE to build the SFML test suite, FALSE to ignore it")
+
+# macOS specific options
if(SFML_OS_MACOSX)
# add an option to build frameworks instead of dylibs (release only)
sfml_set_option(SFML_BUILD_FRAMEWORKS FALSE BOOL "TRUE to build SFML as frameworks libraries (release only), FALSE to build according to BUILD_SHARED_LIBS")
- # add an option to let the user specify a custom directory for external frameworks installation
- sfml_set_option(SFML_DEPENDENCIES_INSTALL_PREFIX "/Library/Frameworks" PATH "External frameworks (FLAC, Freetype, Vorbis, ...) installation directory")
-
# add an option to automatically install Xcode templates
sfml_set_option(SFML_INSTALL_XCODE_TEMPLATES FALSE BOOL "TRUE to automatically install the Xcode templates, FALSE to do nothing about it. The templates are compatible with Xcode 4 and 5.")
-else()
- # add an option to let the user specify a custom directory for external libraries installation
- sfml_set_option(SFML_DEPENDENCIES_INSTALL_PREFIX "." PATH "External libraries (FLAC, Freetype, Vorbis, ...) installation directory")
+endif()
+
+# iOS specific options
+if(SFML_OS_IOS)
+ # At the moment the minimal deployement target version is 10.2 only because the externals for iOS were built with that requirement.
+ sfml_set_option(SFML_IOS_DEPLOYMENT_TARGET "10.2" STRING "The minimal iOS version that will be able to run the built binaries. Cannot be lower than 10.2.")
+
+ sfml_set_option(SFML_CODE_SIGN_IDENTITY "iPhone Developer" STRING "The code signing identity to use when building for a real device")
endif()
# Android options
if(SFML_OS_ANDROID)
+ # avoid missing libraries when building SFML for Android with NDK r19c and later
+ set(CMAKE_FIND_ROOT_PATH "${PROJECT_SOURCE_DIR};${CMAKE_FIND_ROOT_PATH}")
+
# make sure there's the android library available
if (CMAKE_ANDROID_API LESS 14)
message(FATAL_ERROR "Android API level (${CMAKE_ANDROID_API}) must be equal or greater than 14.")
@@ -114,9 +125,8 @@ if(SFML_OS_ANDROID)
# install everything in $NDK/sources/ because this path is appended by the NDK (convenient)
set(CMAKE_INSTALL_PREFIX ${CMAKE_ANDROID_NDK}/sources/third_party/sfml)
- # we install libs in a subdirectory named after the ABI (lib/mips/*.so)
- set(LIB_SUFFIX "/${CMAKE_ANDROID_ARCH_ABI}")
-
+ # we install libs in a subdirectory named after the ABI
+ set(CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}/${CMAKE_ANDROID_ARCH_ABI}")
# pass shared STL configuration (if any)
if (CMAKE_ANDROID_STL_TYPE MATCHES "_shared")
add_definitions("-DSTL_LIBRARY=${CMAKE_ANDROID_STL_TYPE}")
@@ -140,16 +150,13 @@ endif()
# For miscellaneous files
if(SFML_OS_WINDOWS OR SFML_OS_IOS)
set(DEFAULT_INSTALL_MISC_DIR .)
-elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD)
+elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD OR SFML_OS_NETBSD)
set(DEFAULT_INSTALL_MISC_DIR share/SFML)
elseif(SFML_OS_MACOSX)
set(DEFAULT_INSTALL_MISC_DIR /usr/local/share/SFML)
elseif(SFML_OS_ANDROID)
set(DEFAULT_INSTALL_MISC_DIR ${CMAKE_ANDROID_NDK}/sources/third_party/sfml)
endif()
-# add an option to let the user specify a custom directory for doc, examples, licence, readme and other miscellaneous files
-sfml_set_option(SFML_MISC_INSTALL_PREFIX "${DEFAULT_INSTALL_MISC_DIR}" PATH "Prefix installation path for miscellaneous files")
-
# force building sfml-window, if sfml-graphics module is built
if(SFML_BUILD_GRAPHICS AND NOT SFML_BUILD_WINDOW)
@@ -173,14 +180,14 @@ if(SFML_USE_SYSTEM_DEPS)
foreach(DEP_FILE ${DEP_LIBS} ${DEP_BINS} ${DEP_HEADERS})
get_filename_component(DEP_DIR ${DEP_FILE} PATH)
- if(NOT DEP_DIR MATCHES "/stb_image(/|$)")
- set(CMAKE_IGNORE_PATH ${CMAKE_IGNORE_PATH} ${DEP_DIR})
+ if(NOT DEP_DIR MATCHES "/(stb_image|minimp3)(/|$)")
+ list(APPEND CMAKE_IGNORE_PATH "${DEP_DIR}")
endif()
get_filename_component(DEP_PARENT_DIR ${DEP_DIR} PATH)
while(NOT DEP_PARENT_DIR STREQUAL "${CMAKE_SOURCE_DIR}/extlibs")
- if(NOT DEP_DIR MATCHES "/stb_image(/|$)")
- set(CMAKE_IGNORE_PATH ${CMAKE_IGNORE_PATH} ${DEP_PARENT_DIR})
+ if(NOT DEP_DIR MATCHES "/(stb_image|minimp3)(/|$)")
+ list(APPEND CMAKE_IGNORE_PATH "${DEP_PARENT_DIR}")
endif()
get_filename_component(DEP_PARENT_DIR ${DEP_PARENT_DIR} PATH)
@@ -216,12 +223,12 @@ if(SFML_OS_WINDOWS)
sfml_set_option(SFML_USE_STATIC_STD_LIBS FALSE BOOL "TRUE to statically link to the standard libraries, FALSE to use them as DLLs")
# the following combination of flags is not valid
- if (BUILD_SHARED_LIBS AND SFML_USE_STATIC_STD_LIBS)
+ if(BUILD_SHARED_LIBS AND SFML_USE_STATIC_STD_LIBS)
message(FATAL_ERROR "BUILD_SHARED_LIBS and SFML_USE_STATIC_STD_LIBS cannot be used together")
endif()
# for VC++, we can apply it globally by modifying the compiler flags
- if(SFML_COMPILER_MSVC AND SFML_USE_STATIC_STD_LIBS)
+ if((SFML_COMPILER_MSVC OR (SFML_COMPILER_CLANG AND NOT MINGW)) AND SFML_USE_STATIC_STD_LIBS)
foreach(flag
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
@@ -252,10 +259,12 @@ if(SFML_OS_MACOSX)
endif()
endif()
- # only the default architecture (i.e. 64-bit) is supported
- if(NOT CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64")
- message(FATAL_ERROR "Only 64-bit architecture is supported")
- endif()
+ # only the default x86_64 or arm64 are supported
+ foreach (arch IN LISTS CMAKE_OSX_ARCHITECTURES)
+ if (NOT (arch STREQUAL "x86_64" OR arch STREQUAL "arm64"))
+ message(FATAL_ERROR "Invalid arch ${arch}")
+ endif()
+ endforeach()
# configure Xcode templates
set(XCODE_TEMPLATES_ARCH "\$(NATIVE_ARCH_ACTUAL)")
@@ -273,11 +282,19 @@ endif()
if(SFML_BUILD_DOC)
add_subdirectory(doc)
endif()
+if(SFML_BUILD_TEST_SUITE)
+ if (SFML_OS_IOS)
+ message( WARNING "Unit testing not supported on iOS")
+ else()
+ enable_testing()
+ add_subdirectory(test)
+ endif()
+endif()
# on Linux and BSD-like OS, install pkg-config files by default
set(SFML_INSTALL_PKGCONFIG_DEFAULT FALSE)
-if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD)
+if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD OR SFML_OS_NETBSD)
set(SFML_INSTALL_PKGCONFIG_DEFAULT TRUE)
endif()
@@ -398,8 +415,8 @@ else()
COMPONENT devel)
endif()
-install(FILES license.md DESTINATION ${SFML_MISC_INSTALL_PREFIX})
-install(FILES readme.md DESTINATION ${SFML_MISC_INSTALL_PREFIX})
+install(FILES license.md DESTINATION ${CMAKE_INSTALL_DOCDIR})
+install(FILES readme.md DESTINATION ${CMAKE_INSTALL_DOCDIR})
# install 3rd-party libraries and tools
if(SFML_OS_WINDOWS)
@@ -407,22 +424,22 @@ if(SFML_OS_WINDOWS)
if(NOT SFML_USE_SYSTEM_DEPS)
# install the binaries of SFML dependencies
if(ARCH_32BITS)
- install(DIRECTORY extlibs/bin/x86/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/bin)
+ install(DIRECTORY extlibs/bin/x86/ DESTINATION ${CMAKE_INSTALL_BINDIR})
if(SFML_COMPILER_MSVC AND SFML_MSVC_VERSION LESS 14)
- install(DIRECTORY extlibs/libs-msvc/x86/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib)
- elseif(SFML_COMPILER_MSVC)
- install(DIRECTORY extlibs/libs-msvc-universal/x86/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib)
+ install(DIRECTORY extlibs/libs-msvc/x86/ DESTINATION ${CMAKE_INSTALL_LIBDIR})
+ elseif(SFML_COMPILER_MSVC OR (SFML_COMPILER_CLANG AND NOT MINGW))
+ install(DIRECTORY extlibs/libs-msvc-universal/x86/ DESTINATION ${CMAKE_INSTALL_LIBDIR})
else()
- install(DIRECTORY extlibs/libs-mingw/x86/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib)
+ install(DIRECTORY extlibs/libs-mingw/x86/ DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
elseif(ARCH_64BITS)
- install(DIRECTORY extlibs/bin/x64/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/bin)
+ install(DIRECTORY extlibs/bin/x64/ DESTINATION ${CMAKE_INSTALL_BINDIR})
if(SFML_COMPILER_MSVC AND SFML_MSVC_VERSION LESS 14)
- install(DIRECTORY extlibs/libs-msvc/x64/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib)
- elseif(SFML_COMPILER_MSVC)
- install(DIRECTORY extlibs/libs-msvc-universal/x64/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib)
+ install(DIRECTORY extlibs/libs-msvc/x64/ DESTINATION ${CMAKE_INSTALL_LIBDIR})
+ elseif(SFML_COMPILER_MSVC OR (SFML_COMPILER_CLANG AND NOT MINGW))
+ install(DIRECTORY extlibs/libs-msvc-universal/x64/ DESTINATION ${CMAKE_INSTALL_LIBDIR})
else()
- install(DIRECTORY extlibs/libs-mingw/x64/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib)
+ install(DIRECTORY extlibs/libs-mingw/x64/ DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
endif()
endif()
@@ -431,33 +448,33 @@ elseif(SFML_OS_MACOSX)
# install extlibs dependencies only when used
if(SFML_BUILD_GRAPHICS)
if(FREETYPE_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/freetype.framework")
- install(DIRECTORY extlibs/libs-osx/Frameworks/freetype.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX})
+ install(DIRECTORY extlibs/libs-osx/Frameworks/freetype.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
endif()
if(SFML_BUILD_AUDIO)
if(FLAC_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/FLAC.framework")
- install(DIRECTORY extlibs/libs-osx/Frameworks/FLAC.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX})
+ install(DIRECTORY extlibs/libs-osx/Frameworks/FLAC.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
if(OGG_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/ogg.framework")
- install(DIRECTORY extlibs/libs-osx/Frameworks/ogg.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX})
+ install(DIRECTORY extlibs/libs-osx/Frameworks/ogg.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
if(VORBIS_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/vorbis.framework")
- install(DIRECTORY extlibs/libs-osx/Frameworks/vorbis.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX})
+ install(DIRECTORY extlibs/libs-osx/Frameworks/vorbis.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
if(VORBISENC_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/vorbisenc.framework")
- install(DIRECTORY extlibs/libs-osx/Frameworks/vorbisenc.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX})
+ install(DIRECTORY extlibs/libs-osx/Frameworks/vorbisenc.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
if(VORBISFILE_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/vorbisfile.framework")
- install(DIRECTORY extlibs/libs-osx/Frameworks/vorbisfile.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX})
+ install(DIRECTORY extlibs/libs-osx/Frameworks/vorbisfile.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
if(OPENAL_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/OpenAL.framework")
- install(DIRECTORY "${OPENAL_LIBRARY}" DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX})
+ install(DIRECTORY "${OPENAL_LIBRARY}" DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
endif()
@@ -479,7 +496,7 @@ elseif(SFML_OS_MACOSX)
elseif(SFML_OS_IOS)
# fix CMake install rules broken for iOS (see http://public.kitware.com/Bug/view.php?id=12506)
- install(DIRECTORY "${CMAKE_BINARY_DIR}/lib/\$ENV{CONFIGURATION}/" DESTINATION lib${LIB_SUFFIX})
+ install(DIRECTORY "${CMAKE_BINARY_DIR}/lib/\$ENV{CONFIGURATION}/" DESTINATION ${CMAKE_INSTALL_LIBDIR})
if(NOT SFML_USE_SYSTEM_DEPS)
# since the iOS libraries are built as static, we must install the SFML dependencies
@@ -489,7 +506,7 @@ elseif(SFML_OS_IOS)
endif()
if(SFML_BUILD_AUDIO)
- install(FILES extlibs/libs-ios/libflac.a
+ install(FILES extlibs/libs-ios/libflac.a
extlibs/libs-ios/libvorbis.a
extlibs/libs-ios/libogg.a
DESTINATION lib)
@@ -510,3 +527,23 @@ elseif(SFML_OS_ANDROID)
endif()
sfml_export_targets()
+
+set(CPACK_PACKAGE_NAME_SUMMARY "Simple and Fast Multimedia Library")
+set(CPACK_PACKAGE_VENDOR "SFML Team")
+set(CPACK_PACKAGE_FILE_NAME "SFML-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${CMAKE_CXX_COMPILER_ID}-${CMAKE_CXX_COMPILER_VERSION}-${CMAKE_BUILD_TYPE}")
+set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/readme.md")
+set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/license.md")
+set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}")
+set(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}")
+set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}")
+set(CPACK_PACKAGE_INSTALL_DIRECTORY "SFML ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
+set(CPACK_MONOLITHIC_INSTALL ON)
+
+# NSIS configurations
+set(CPACK_NSIS_DISPLAY_NAME "SFML ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} (${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION})")
+set(CPACK_NSIS_CONTACT "team@sfml-dev.org")
+set(NSIS_IMAGE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/tools/nsis/")
+string(REGEX REPLACE "/" "\\\\\\\\" NSIS_IMAGE_PATH ${NSIS_IMAGE_PATH})
+set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "!define MUI_WELCOMEFINISHPAGE_BITMAP \\\"${NSIS_IMAGE_PATH}sidebar.bmp\\\"\n!define MUI_HEADERIMAGE_BITMAP \\\"${NSIS_IMAGE_PATH}header.bmp\\\"\n!define MUI_ICON \\\"${NSIS_IMAGE_PATH}sfml.ico\\\"")
+
+include(CPack)
diff --git a/changelog.md b/changelog.md
index 6174a84..ead1944 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,52 +1,228 @@
# Changelog
+## SFML 2.6.1
+
+Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.6.1
+
+### General
+
+- Stop overwriting CMAKE_MODULE_PATH (#2577)
+- Loosen restrictions on unknown compilers (#2585)
+- Fix CI deprecation warnings (#2624)
+- Fix unused compiler flag error in Clang (#2625)
+- Disable warnings as errors by default (#2680)
+
+### Window
+
+**Bugfixes**
+
+- Fix macOS resize event bug (#2618)
+- Skip ClientMessage events with other window ID unless it is for IM (#2651)
+
+### Graphics
+
+**Bugfixes**
+
+- Ensure OpenGL extensions are loaded before querying maximum texture size (#2603)
+- Fixed RenderTexture being upside down on Android (#2730)
+- Fix warnings in Linux OpenGL ES codepaths (#2747)
+
+### Audio
+
+**Bugfixes**
+
+- Remove use of C++11 header (#2591)
+
+## SFML 2.6.0
+
+Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.6.0
+
+### General
+
+- Various CMake enhancements (#1477, #1509, #1561, #1563, #1576, #1624, #1739, #1960)
+- Small documentation changes (#1519, #1608, #1628, #1657, #1658, #1652, #1665, #1697, #1774, #1776, #1853, #2038, #2083, #2271)
+- Various casting fixes (#1499, #1553, #2040, #2222, #2297, #2298, #2323, #2576)
+- Add unit testing foundation to SFML (#623, #1475)
+- Changed Doxygen single-line comment format (#1622, #1623)
+- Add support for GitHub Actions (#1716, #1751, #2058, #2114)
+- Add support for NetBSD (#1535, #1723)
+- Slight increase performance and code refactor (#1732)
+- Use public domain resources for examples (#1627, #1718)
+- Add support for CPack and NSIS with CPack (#1114)
+- Enable support for unity builds (#1787, #1788)
+- Various clean ups (#1848, #1849, #2219, #2220, #2221, #2241)
+- Enable and enforce a large set of warnings (#1785, #1791, #1846, #1906, #1908, #2048, #2066, #2073, #2094, #2100, #2106, #2142, #2217, #2218)
+- Enable search box for the Doxygen documentation (#1841, #1940, #2173, #2477)
+- Enhancements of the CI pipeline (#2046, #2263, #2294)
+- Fix header include paths in Doxygen documentation (#2512)
+- Fix compilation for GCC 13.1.1 (#2553)
+- [macOS] Add support for arm64 on macOS (#1749, #1750, #1761, #1843, #1868)
+- [iOS] Build examples for iOS as well (#1418, #1520, #1522)
+- [Windows] Properly support Clang on Windows (#1612, #1720, #1784, #1795)
+- [Windows] Link legacy stdio definitions on newer Visual Studio versions (#1712)
+- [Windows] Provide additional metadata through resource files (#1419, #1779)
+- [Android] Add 64-bits libraries for Android (#1648, #2165)
+- [Android] Adjust NDK search path to support newer NDKs (#1575)
+- [macOS] Copy logo.png to Resources in Cocoa example (#1818)
+- [Windows] Add support for Visual Studio 2022 (#1819)
+- [Android] Build sfml-main with position-independent code (#2393, #2397)
+
+### System
+
+**Features**
+
+- [Android] Simplify management of ActivityStates (#1845)
+
+**Bugfixes**
+
+- [Windows] Fix overflow when using `sf::Clock` for long time (#1765, #1771)
+
+### Window
+
+**Features**
+
+- Allow creation of a window without an OpenGL context (#1484)
+- Dynamically load EGL and GLES extensions as is done for desktop GL (#1539, #1577, #1603, #2157, #2160)
+- Add support for creating Vulkan window surfaces (#1557)
+- Scancode support (#1235, #1400, #1596, #2009, #2096, #2148, #2243)
+- [Linux] Add support for colored cursors in Unix implementation (#1693, #1694)
+- [Linux] Added support for directional arrow resize cursors on Linux (#1688)
+- [Linux] Add support for X Input Method (#1840, #1850, #2191, #2242)
+- [Linux] Add support for Direct Rendering Mode (DRM) / Kernel Mode Setting (KMS) (#2029, #2146, #2246, #2259, #2400)
+- [Windows] Use monitor aware DPI scaling on Windows (#2268)
+
+**Bugfixes**
+
+- Fix `sf::Context::getActiveContext` to stop returning inactive contexts (#1794)
+- [Linux] Fixed crash with X11 when `$DISPLAY` is not `0.0` (#724, #1504)
+- [Android] Ensure `setActive(false)` is called before the surface is destroyed in EglContext (#1530, #1531)
+- [Android] Fixed EGL incorrectly being passed the anti-aliasing level as `EGL_SAMPLE_BUFFERS` instead of `EGL_SAMPLES` (#1533, #1534)
+- [Linux] Fix OpenGL extensions not loading in a specific Linux VM configuration (#1495, #1543)
+- [Windows] Fixed potential buffer overrun in Win32 OpenGL error handling (#1245, #1246)
+- [Windows] Fix no longer hides cursor when hovering title bar (#1569, #1570)
+- [macOS] Initialize `m_context` correctly in `SFContext` constructors (#1582, #1610)
+- [Android] Fixed navigation bar not being entirely hidden on Android (#1538, #1554)
+- [Windows] Make the process to set a DirectInput device's axis mode more conservative (#1634)
+- [Linux] Fix an issue where the cursor wasn't changed instantaneously (#1686)
+- [Windows] Fix issue where joystick/controller POV values were not set correctly for DirectInput devices (#1719)
+- [Android] Fix warning: control may reach end of non-void function (#1713)
+- [Windows] Fixed Win32 requestFocus in multi-threaded environment (#1600)
+- [Android] Fix issue where `EGL_DEFAULT_DISPLAY` is `NULL` (#1639, #1740)
+- [macOS] When initializing an OpenGL view with an existing window, call `finishInit` (#1759, #1760)
+- [macOS] Fix potential crash when changing cursor (#1721, #1736)
+- [Android] Fixed `SIGSEGV` after pressing back button on Android (#531, #1580)
+- [Android] Fix issue with `waitEvent` and an OpenGL Context (#1532, #1790)
+- [iOS] Fix issue where OpenGL ES libraries couldn't be located (#1687, #1804)
+- [macOS] Fix issue where window wouldn't be closing because of events still being processed (#1581, #1814)
+- [Windows] Preserve the drop shadow for system cursors on Windows (#1731)
+- [Windows] Use GetWindowLongPtr for better overall compatibility (#1806)
+- [macOS] Ensure proper nesting of autorelease pools on OS X (#1549, #1820)
+- [Linux] Fix typo in window construction (#1951, #1953)
+- [Linux] Prevent crash in Unix JoystickImpl with too many file descriptors (#1900, #1941)
+
+### Graphics
+
+**Features**
+
+- Allow re-creation of the shared context as a core context if the user requests a core profile context (#1434, #1443)
+- Added `getPosition()` and `getSize()` to `sf::Rect` (#1047)
+- Added `Font::hasGlyph` field (#1644)
+- Implemented saveToMemory and saveImageToMemory (#988, #1597, #1669)
+- Implement smoothing for fonts (#1690, #2064, #2072)
+- Add Min and Max blend modes (#1710, #1756)
+- Support geometry shaders when a OpenGL 3.2+ context is available (#1768, #1769, #1786, #1789)
+- Align encodings for new line characters (#2107)
+- Update stb_image to 2.28, thus adding support for more image formats (#1712, #2322, #2464)
+- [macOS] Improve high DPI handling on macOS (#1817)
+
+**Bugfixes**
+
+- Fixed missing checks for empty vertex arrays when updating the vertex buffers in `sf::Text` (#1558, #1560)
+- Remove unnecessary `glFlush()` in `sf::Texture` (#1609)
+- Fixed text rendering artifacts on Radeon cards (#1568)
+- Force OpenGL states to be reset when RenderTarget detects that a new context has to be tracked (#1625, #1630)
+- Don't set default Texture Rect of a `sf::Sprite` before the user provided one (#1725)
+- Added auto hinting compensation to fix too wide gaps between small glyphs (#1745, #1746)
+- Fix support for sRGB color space in `sf::RenderTexture` (#1092, #1757)
+- Fix incorrect glyph rect for text outline (#1826, #1827, #1836)
+- Fix alpha value calculation for semi-transparent pixels on fully transparent pixels with `sf::Image::copy()` (#1993)
+- Fix getLocalBounds inconsistency for `sf::Text` (#2129, #2132)
+- [iOS] Ensure the proper default framebuffer is bound when activating a RenderWindow (#1471, #1487)
+
+### Audio
+
+**Features**
+
+- Allow explicitly closing `sf::InputSoundFile` (#1516)
+- Replace use of auto_ptr for future-proofing (#1546)
+- Adjustable processing interval in `sf::SoundStream` (#1517, #1666)
+- Fix `sf::Music` sometimes failing to loop after seeking (#1707)
+- Add MP3 decoding support (#1232, #1796, #1851)
+
+**Bugfixes**
+
+- Rename FindVorbis -> FindVORBIS, for consistency with exported variables (#1626, #1629)
+- Fix naming of VORBIS in `SFMLConfigDependencies.cmake.in` (#1636, #1637)
+- Fixed copy assign operator in `sf::Sound` so it checks for self-assignment (#1744)
+- Fix SoundStream::play to restart the sound if it was played before (#2175)
+
+### Networking
+
+**Features**
+
+- Added method to get the current read position of `sf::Packet` (#1382, #1641)
+
+**Bugfixes**
+
+- Fixed sometimes failing to read floats and doubles from Packet on Android (#1565, #1578)
+
## SFML 2.5.1
Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.5.1
### General
- * Various CMake fixes (#1414, #1416, #1436, #1439, #1467, #1470)
- * Fixed the installation of pkg-config files (#1466)
- * Fixed two conversion warnings (#1454)
- * [Android] Fixes all symbols in sfml-main are hidden (#1457, #1460)
- * [Android] Fixed some `#define` flag problem (#1458)
- * [Android] Fix deadlock in main cleanup (#1265)
- * [iOS] Modernized toolchain file (#1411)
- * [iOS] Check that `<SFML/Main.hpp>` is used (#1412)
- * [macOS] Add `-ObjC` flag to fix static linking on macOS (#1485)
+- Various CMake fixes (#1414, #1416, #1436, #1439, #1467, #1470)
+- Fixed the installation of pkg-config files (#1466)
+- Fixed two conversion warnings (#1454)
+- [Android] Fixes all symbols in sfml-main are hidden (#1457, #1460)
+- [Android] Fixed some `#define` flag problem (#1458)
+- [Android] Fix deadlock in main cleanup (#1265)
+- [iOS] Modernized toolchain file (#1411)
+- [iOS] Check that `<SFML/Main.hpp>` is used (#1412)
+- [macOS] Add `-ObjC` flag to fix static linking on macOS (#1485)
### Window
**Bugfixes**
- * [iOS] Use default supported rotations when none are specified (#1417)
- * [iOS] Fixed autocomplete window overlaps keyboard (#1473, #1482)
- * [Linux] Fixed dual monitor issue (#1226, #1238)
- * [Linux] Fixed issue where fullscreen window didn't go over task bars on top and left on in Ubuntu (#1224)
- * [Linux] Fixed the Unix clipboard implementation causing an abort due to internal data races in Xlib (#1437)
- * [macOS] Added additional system cursors (#1401, #1413, #1425)
- * [Windows] Fixed swapped colors for custom cursors (#1464, #1465, #1491)
+- [iOS] Use default supported rotations when none are specified (#1417)
+- [iOS] Fixed autocomplete window overlaps keyboard (#1473, #1482)
+- [Linux] Fixed dual monitor issue (#1226, #1238)
+- [Linux] Fixed issue where fullscreen window didn't go over task bars on top and left on in Ubuntu (#1224)
+- [Linux] Fixed the Unix clipboard implementation causing an abort due to internal data races in Xlib (#1437)
+- [macOS] Added additional system cursors (#1401, #1413, #1425)
+- [Windows] Fixed swapped colors for custom cursors (#1464, #1465, #1491)
### Graphics
**Bugfixes**
- * Fixed a bug in which a `sf::RenderTexture` would not be re-activated after being re-created (#1438)
- * Fixed `sf::RenderTextureImplFBO`'s destructor incorrectly triggering deletion of other `sf::RenderTextureImplFBO`'s active FBOs (#1440)
- * Fix `sf::RenderWindow::setActive` incorrectly trying to unbind an FBO during deactivation (#1442)
- * Fixed `sf::RenderTexture::display()` dereferencing a NULL pointer when being called before `sf::RenderTexture::create()` (#1446)
- * Fixed bug in `sf::Text` when applying an outline color/thickness (#1176)
- * Squash duplicated `sf::Font` glyphs to single chars (#1461)
- * Fixed two issues with glyph sub-pixel positioning (#1452)
- * Reduced context locking & unlocking while creating textures (#1459)
- * Fixed the error message when the wrong bitmap font size is selected (#1456, #1474, #1492)
+- Fixed a bug in which a `sf::RenderTexture` would not be re-activated after being re-created (#1438)
+- Fixed `sf::RenderTextureImplFBO`'s destructor incorrectly triggering deletion of other `sf::RenderTextureImplFBO`'s active FBOs (#1440)
+- Fix `sf::RenderWindow::setActive` incorrectly trying to unbind an FBO during deactivation (#1442)
+- Fixed `sf::RenderTexture::display()` dereferencing a NULL pointer when being called before `sf::RenderTexture::create()` (#1446)
+- Fixed bug in `sf::Text` when applying an outline color/thickness (#1176)
+- Squash duplicated `sf::Font` glyphs to single chars (#1461)
+- Fixed two issues with glyph sub-pixel positioning (#1452)
+- Reduced context locking & unlocking while creating textures (#1459)
+- Fixed the error message when the wrong bitmap font size is selected (#1456, #1474, #1492)
### Audio
**Bugfixes**
- * Fixed performance issue with reading WAV files (#1450)
+- Fixed performance issue with reading WAV files (#1450)
## SFML 2.5.0
@@ -54,117 +230,117 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.5.0
### General
- * Replaced FindSFML.cmake with SFMLConfig.cmake (#1335)
- * Markdown'd and updated readme, changelog, contributing and license files (#1196, #1368, #1317)
- * Improve packaging support (#1173)
- * Added Tagfile generation and search (#1327)
- * Added CMake variables to select the modules to be built (#798, #800)
- * Do not install extlibs if `SFML_USE_SYSTEM_DEPS` is true (#1236, #1237)
- * Fixed various type conversion/comparison warnings (#1325)
- * [Android] Increased minimum API version to 14 (#1362)
- * [Android] Removed custom toolchain and added support for the newest NDK version and Gradle (#1350, #1393)
- * [iOS] Updated the binary libs from exlibs/libs-ios (#1207, #1209)
- * [iOS] Use a CMake toolchain file for iOS build (#1268, #1269)
- * [iOS] Install extlibs if needed (#1348)
- * [iOS] Drop 32 bit support (#1374)
- * [iOS] Force correct iOS architecture for cmake (#1373, #1377)
- * [iOS] Added iOS example (#1378)
- * [macOS] Fixed launch of cocoa examples (#1334)
- * [macOS] Improved application signing process (#1020, #1036, #1194)
- * [macOS] Improved CMake script (#1215, #1371)
- * [macOS] Use `-stdlib=libc++` (#1361)
- * [OpenBSD] Added support for OpenBSD (#1330)
+- Replaced FindSFML.cmake with SFMLConfig.cmake (#1335)
+- Markdown'd and updated readme, changelog, contributing and license files (#1196, #1368, #1317)
+- Improve packaging support (#1173)
+- Added Tagfile generation and search (#1327)
+- Added CMake variables to select the modules to be built (#798, #800)
+- Do not install extlibs if `SFML_USE_SYSTEM_DEPS` is true (#1236, #1237)
+- Fixed various type conversion/comparison warnings (#1325)
+- [Android] Increased minimum API version to 14 (#1362)
+- [Android] Removed custom toolchain and added support for the newest NDK version and Gradle (#1350, #1393)
+- [iOS] Updated the binary libs from exlibs/libs-ios (#1207, #1209)
+- [iOS] Use a CMake toolchain file for iOS build (#1268, #1269)
+- [iOS] Install extlibs if needed (#1348)
+- [iOS] Drop 32 bit support (#1374)
+- [iOS] Force correct iOS architecture for cmake (#1373, #1377)
+- [iOS] Added iOS example (#1378)
+- [macOS] Fixed launch of cocoa examples (#1334)
+- [macOS] Improved application signing process (#1020, #1036, #1194)
+- [macOS] Improved CMake script (#1215, #1371)
+- [macOS] Use `-stdlib=libc++` (#1361)
+- [OpenBSD] Added support for OpenBSD (#1330)
### System
**Bugfixes**
- * Added protected destructor to `sf::NonCopyable` to prevent possible resource leaks (#1125, #1161)
- * Fixed crash when `sf::Clock` is constructed in a global scope (#1258)
+- Added protected destructor to `sf::NonCopyable` to prevent possible resource leaks (#1125, #1161)
+- Fixed crash when `sf::Clock` is constructed in a global scope (#1258)
### Window
**Features**
- * Implemented Cursor API (#269, #784, #827)
- * Implemented Clipboard API (#715, #1204, #1221)
- * Renamed a few key codes (#1395)
- * Added joystick example (#1363)
- * [Windows] Added support for interfacing with joysticks via DirectInput when it is available (#1251, #1326)
- * [Windows] Fix discrete GPU preference symbols being exported from the wrong place (#1192, #1406)
+- Implemented Cursor API (#269, #784, #827)
+- Implemented Clipboard API (#715, #1204, #1221)
+- Renamed a few key codes (#1395)
+- Added joystick example (#1363)
+- [Windows] Added support for interfacing with joysticks via DirectInput when it is available (#1251, #1326)
+- [Windows] Fix discrete GPU preference symbols being exported from the wrong place (#1192, #1406)
**Bugfixes**
- * [Android] Return correct key code for delete/backspace (#1309, #1362)
- * [iOS] Don't need to find vorbisfile or vorbisenc (#1347)
- * [Linux] Fixed `sf::Window::getPosition()` returning incorrect position because of differences in window managers (#1228, #1266)
- * [Linux] Fix X11 key repeat handling not filtering out events from other windows (#1223, #1230, #1291)
- * [Linux] Restore fullscreen of a non-visible window (#1339)
- * [macOS] Fixed window menu not working (#1091, #1180, #1193)
- * [macOS] Fixed crash with application messing hardware detection e.g. TeamViewer (#1323)
- * [macOS] Added support for (some) Hat/POV axis (#1248)
- * [Windows] Prevent uninitialized read by zeroing memory (#1264)
- * [Windows] Fixed modifier keys handling (#1357)
+- [Android] Return correct key code for delete/backspace (#1309, #1362)
+- [iOS] Don't need to find vorbisfile or vorbisenc (#1347)
+- [Linux] Fixed `sf::Window::getPosition()` returning incorrect position because of differences in window managers (#1228, #1266)
+- [Linux] Fix X11 key repeat handling not filtering out events from other windows (#1223, #1230, #1291)
+- [Linux] Restore fullscreen of a non-visible window (#1339)
+- [macOS] Fixed window menu not working (#1091, #1180, #1193)
+- [macOS] Fixed crash with application messing hardware detection e.g. TeamViewer (#1323)
+- [macOS] Added support for (some) Hat/POV axis (#1248)
+- [Windows] Prevent uninitialized read by zeroing memory (#1264)
+- [Windows] Fixed modifier keys handling (#1357)
### Graphics
**Features**
- * Implemented additional line spacing and letter spacing in `sf::Text` (#928, #1366)
- * Added `sf::VertexBuffer` class (#1308)
- * Added GPU local texture copying support, allowing performance optimizations and texture swapping (#1119, #1319, #1320)
- * Optimize performance by skipping `glTexCoordPointer()` call if not needed (#1015)
- * Generate shape outline vertices only if necessary (#925, #1356)
- * Removed dependency to libjpeg, stb_image_write now supports writing JPEG files (#1278, #1279)
- * Enable comparing `sf::Transform` and optimize resetting OpenGL back to the identity matrix (#1298)
- * Added missing `setActive()` virtual method to `sf::RenderTarget` (#1157)
- * Updated stb_image to v2.16 and stb_image_write to v1.07 (#1270)
- * Added `sf::RenderTexture` stencil and multisampling support (#1274, #1285)
- * Added example demonstrating `sf::VertexBuffer`, `sf::Shader` and `sf::Thread` usage (#1352)
- * Optimized `sf::RenderTexture` performance (#1379)
-
-**Bugfixes**
-
- * Properly free memory in `sf::Font::cleanup()` (#1119)
- * Fixed memory leak in `sf::Font` (#1216)
- * Fix OpenGL texture coordinate pointer not being updated correctly under certain conditions (#1297)
- * Fix for broken text when the font is reloaded (#1345)
- * Fix memory leak in `sf::Text` (#1233, #1360)
- * Fixed strict aliasing punning warning when generating the key of a glyph in Font.cpp (#1187, #1396)
- * Fixed OpenGL version string being parsed incorrectly on some platforms (#1249, #1390)
- * [macOS] Worked around render target bug (#1132, #1342)
- * [Windows] Replaced time-based joystick poll with a hardware event handler (#1179, #1195, #1198, #1199, #1421)
+- Implemented additional line spacing and letter spacing in `sf::Text` (#928, #1366)
+- Added `sf::VertexBuffer` class (#1308)
+- Added GPU local texture copying support, allowing performance optimizations and texture swapping (#1119, #1319, #1320)
+- Optimize performance by skipping `glTexCoordPointer()` call if not needed (#1015)
+- Generate shape outline vertices only if necessary (#925, #1356)
+- Removed dependency to libjpeg, stb_image_write now supports writing JPEG files (#1278, #1279)
+- Enable comparing `sf::Transform` and optimize resetting OpenGL back to the identity matrix (#1298)
+- Added missing `setActive()` virtual method to `sf::RenderTarget` (#1157)
+- Updated stb_image to v2.16 and stb_image_write to v1.07 (#1270)
+- Added `sf::RenderTexture` stencil and multisampling support (#1274, #1285)
+- Added example demonstrating `sf::VertexBuffer`, `sf::Shader` and `sf::Thread` usage (#1352)
+- Optimized `sf::RenderTexture` performance (#1379)
+
+**Bugfixes**
+
+- Properly free memory in `sf::Font::cleanup()` (#1119)
+- Fixed memory leak in `sf::Font` (#1216)
+- Fix OpenGL texture coordinate pointer not being updated correctly under certain conditions (#1297)
+- Fix for broken text when the font is reloaded (#1345)
+- Fix memory leak in `sf::Text` (#1233, #1360)
+- Fixed strict aliasing punning warning when generating the key of a glyph in Font.cpp (#1187, #1396)
+- Fixed OpenGL version string being parsed incorrectly on some platforms (#1249, #1390)
+- [macOS] Worked around render target bug (#1132, #1342)
+- [Windows] Replaced time-based joystick poll with a hardware event handler (#1179, #1195, #1198, #1199, #1421)
### Audio
**Features**
- * Added loop point support to `sf::Music` (#177, #629)
- * Added support for the extensible PCM wave file format (#1296)
- * [iOS] Enable audio module (#1338)
+- Added loop point support to `sf::Music` (#177, #629)
+- Added support for the extensible PCM wave file format (#1296)
+- [iOS] Enable audio module (#1338)
**Bugfixes**
- * Fixed inconsistent seek behavior in `sf::SoundStream` (#1118)
- * Fixed stack overflow in `sf::SoundStream::fillAndPushBuffer()` (#1154)
- * Fixed seeking quirks in the FLAC reader (#966, #1162)
- * Allow polymorphism with `sf::SoundSource` (#1185)
- * Fixed WAV file writer writing wrong header values (#1280, #1281)
- * Small bugfix to argument of `alcCaptureOpenDevice()` (#1304, #1305)
- * [iOS] Find OpenAL correctly (#1263, #1376)
- * [Windows] Updated OpenAL Soft to 1.18.1 fixing crashes (#1247, #1260)
+- Fixed inconsistent seek behavior in `sf::SoundStream` (#1118)
+- Fixed stack overflow in `sf::SoundStream::fillAndPushBuffer()` (#1154)
+- Fixed seeking quirks in the FLAC reader (#966, #1162)
+- Allow polymorphism with `sf::SoundSource` (#1185)
+- Fixed WAV file writer writing wrong header values (#1280, #1281)
+- Small bugfix to argument of `alcCaptureOpenDevice()` (#1304, #1305)
+- [iOS] Find OpenAL correctly (#1263, #1376)
+- [Windows] Updated OpenAL Soft to 1.18.1 fixing crashes (#1247, #1260)
### Network
**Features**
- * Add append/overwrite parameter to Ftp::upload (#1072, #1399)
+- Add append/overwrite parameter to Ftp::upload (#1072, #1399)
**Bugfixes**
- * Fixed wrong condition for building network support (#1253)
- * Changed TCP listen backlog from 0 to SOMAXCONN (#1369, #1407)
- * Fixed socket reuse not conforming to documentation (#1346, #1408)
+- Fixed wrong condition for building network support (#1253)
+- Changed TCP listen backlog from 0 to SOMAXCONN (#1369, #1407)
+- Fixed socket reuse not conforming to documentation (#1346, #1408)
## SFML 2.4.2
@@ -174,22 +350,22 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.2
**Bugfixes**
- * [Windows] Removed thread affinity changes in sf::Clock (#1107)
+- [Windows] Removed thread affinity changes in sf::Clock (#1107)
### Window
**Bugfixes**
- * Fixed bug where TransientContextLock would hang (#1165, #1172)
- * [Linux] Fixed GLX extensions being loaded too late (#1183)
- * [Linux] Fix wrong types passed to XChangeProperty (#1168, #1171)
- * [Windows] Make context disabling via wglMakeCurrent more tolerant of broken drivers (#1186)
+- Fixed bug where TransientContextLock would hang (#1165, #1172)
+- [Linux] Fixed GLX extensions being loaded too late (#1183)
+- [Linux] Fix wrong types passed to XChangeProperty (#1168, #1171)
+- [Windows] Make context disabling via wglMakeCurrent more tolerant of broken drivers (#1186)
### Graphics
**Bugfixes**
- * Optimized sf::Image::create and made it more exception safe (#1166)
+- Optimized sf::Image::create and made it more exception safe (#1166)
## SFML 2.4.1
@@ -197,37 +373,37 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.1
### General
- * [kFreeBSD] Define SFML_OS_FREEBSD when compiling for kFreeBSD (#1129)
- * [Windows] Added some simple messaging when trying to build under Cygwin (#1153)
+- [kFreeBSD] Define SFML_OS_FREEBSD when compiling for kFreeBSD (#1129)
+- [Windows] Added some simple messaging when trying to build under Cygwin (#1153)
### Window
**Bugfixes**
- * Fixed stack overflow on GlContext creation with multiple threads (#989, #1002)
- * Adjusted mouse cursor grab documentation (#1133)
- * [iOS] Fixed orientation change not rescaling window size properly (#1049, #1050)
- * [Linux] Fixed fullscreen issue (#921, #1138)
- * [Linux] Switched from XCB back to Xlib for windowing (#1138)
- * [Linux] Fixed window icon not showing up on some distros (#1087, #1088)
- * [Linux] Fixed an issue where GNOME flags window unresponsive (#1089, #1138)
- * [Linux] Fixed leak of XVisualInfo objects during GlxContext creation (#1135)
- * [Linux] Fixed possible hang when setting visibility if external window sources (#1136)
- * [macOS] Fixed inconsistency between doc and impl on macOS for the grab feature (#1133, #1148, #1150)
- * [Windows] Fixed context memory leaks (#1143, #1002)
+- Fixed stack overflow on GlContext creation with multiple threads (#989, #1002)
+- Adjusted mouse cursor grab documentation (#1133)
+- [iOS] Fixed orientation change not rescaling window size properly (#1049, #1050)
+- [Linux] Fixed fullscreen issue (#921, #1138)
+- [Linux] Switched from XCB back to Xlib for windowing (#1138)
+- [Linux] Fixed window icon not showing up on some distros (#1087, #1088)
+- [Linux] Fixed an issue where GNOME flags window unresponsive (#1089, #1138)
+- [Linux] Fixed leak of XVisualInfo objects during GlxContext creation (#1135)
+- [Linux] Fixed possible hang when setting visibility if external window sources (#1136)
+- [macOS] Fixed inconsistency between doc and impl on macOS for the grab feature (#1133, #1148, #1150)
+- [Windows] Fixed context memory leaks (#1143, #1002)
### Graphics
**Bugfixes**
- * Adjusted uniform error message (#1131)
- * Clarify documentation on Rect::contains function bounds (#1151)
+- Adjusted uniform error message (#1131)
+- Clarify documentation on Rect::contains function bounds (#1151)
### Network
**Bugfixes**
- * Fixed a typo in comment for void unbind() (#1121)
+- Fixed a typo in comment for void unbind() (#1121)
## SFML 2.4.0
@@ -235,103 +411,103 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.0
### General
- * Added deprecation macro (#969)
- * Fixed issues reported by Coverity Scan static analysis (#1064)
- * Fixed some initialization issues reported by Cppcheck (#1008)
- * Changed comment chars in FindSFML.cmake to # (#1090)
- * Fixed some typos (#1098, #993, #1099, #956, #963, #979)
- * Updated/fixed string comparisons in Config.cmake (#1102)
- * Added the missing -s postfix for the RelWithDebInfo config (#1014)
- * [Android] Fixed current Android compilation issues (#1116, #1111, #1079)
- * [macOS] Update Xcode template material (#976, #968)
- * [Windows] Added support for VS 2015 (#972)
- * [Windows] Create and install PDB debug symbols alongside binaries (#1037)
+- Added deprecation macro (#969)
+- Fixed issues reported by Coverity Scan static analysis (#1064)
+- Fixed some initialization issues reported by Cppcheck (#1008)
+- Changed comment chars in FindSFML.cmake to # (#1090)
+- Fixed some typos (#1098, #993, #1099, #956, #963, #979)
+- Updated/fixed string comparisons in Config.cmake (#1102)
+- Added the missing -s postfix for the RelWithDebInfo config (#1014)
+- [Android] Fixed current Android compilation issues (#1116, #1111, #1079)
+- [macOS] Update Xcode template material (#976, #968)
+- [Windows] Added support for VS 2015 (#972)
+- [Windows] Create and install PDB debug symbols alongside binaries (#1037)
### Deprecated API
- * sf::RenderWindow::capture(): Use a sf::Texture and its sf::Texture::update(const Window&) function and copy its contents into an sf::Image instead.
- * sf::Shader::setParameter(): Use setUniform() instead.
- * sf::Text::getColor(): There is now fill and outline colors instead of a single global color. Use getFillColor() or getOutlineColor() instead.
- * sf::Text::setColor(): There is now fill and outline colors instead of a single global color. Use setFillColor() or setOutlineColor() instead.
- * sf::LinesStrip: Use LineStrip instead.
- * sf::TrianglesFan: Use TriangleFan instead.
- * sf::TrianglesStrip: Use TriangleStrip instead.
+- sf::RenderWindow::capture(): Use a sf::Texture and its sf::Texture::update(const Window&) function and copy its contents into an sf::Image instead.
+- sf::Shader::setParameter(): Use setUniform() instead.
+- sf::Text::getColor(): There is now fill and outline colors instead of a single global color. Use getFillColor() or getOutlineColor() instead.
+- sf::Text::setColor(): There is now fill and outline colors instead of a single global color. Use setFillColor() or setOutlineColor() instead.
+- sf::LinesStrip: Use LineStrip instead.
+- sf::TrianglesFan: Use TriangleFan instead.
+- sf::TrianglesStrip: Use TriangleStrip instead.
### System
**Features**
- * [Android] Added sf::getNativeActivity() (#1005, #680)
+- [Android] Added sf::getNativeActivity() (#1005, #680)
**Bugfixes**
- * Added missing <iterator> include in String.hpp (#1069, #1068)
- * Fixed encoding of UTF-16 (#997)
- * [Android] Fixed crash when trying to load a non-existing font file (#1058)
+- Added missing <iterator> include in String.hpp (#1069, #1068)
+- Fixed encoding of UTF-16 (#997)
+- [Android] Fixed crash when trying to load a non-existing font file (#1058)
### Window
**Features**
- * Added ability to grab cursor (#614, #394, #1107)
- * Added Multi-GPU preference (#869, #867)
- * Added support for sRGB capable framebuffers (#981, #175)
- * [Linux, Windows] Improved OpenGL context creation (#884)
- * [Linux, Windows] Added support for pbuffers on Windows and Unix (#885, #434)
+- Added ability to grab cursor (#614, #394, #1107)
+- Added Multi-GPU preference (#869, #867)
+- Added support for sRGB capable framebuffers (#981, #175)
+- [Linux, Windows] Improved OpenGL context creation (#884)
+- [Linux, Windows] Added support for pbuffers on Windows and Unix (#885, #434)
**Bugfixes**
- * Updated platform-specific handle documentation (#961)
- * [Android] Accept touch events from "multiple" devices (#954, #953)
- * [Android] Copy the selected EGL context's settings to SFML (#1039)
- * [Linux] Fixed modifiers causing sf::Keyboard::Unknown being returned (#1022, #1012)
- * [macOS] Improved memory management on macOS (#962, #790)
- * [macOS] Fixed crash when resizing a window to a zero-height/width size (#986, #984)
- * [macOS] Use the mouse button constant instead of 0 to avoid a compiler error on macOS (#1035)
- * [macOS] macOS improvement: warnings + bugfix + refactoring, the lot! (#1042)
+- Updated platform-specific handle documentation (#961)
+- [Android] Accept touch events from "multiple" devices (#954, #953)
+- [Android] Copy the selected EGL context's settings to SFML (#1039)
+- [Linux] Fixed modifiers causing sf::Keyboard::Unknown being returned (#1022, #1012)
+- [macOS] Improved memory management on macOS (#962, #790)
+- [macOS] Fixed crash when resizing a window to a zero-height/width size (#986, #984)
+- [macOS] Use the mouse button constant instead of 0 to avoid a compiler error on macOS (#1035)
+- [macOS] macOS improvement: warnings + bugfix + refactoring, the lot! (#1042)
### Graphics
**Features**
- * Added support for outlined text (#840)
- * Add support for geometry shaders (#886, #428)
- * Feature/blend mode reverse subtract (#945, #944)
- * Implemented support for mipmap generation (#973, #498, #123)
- * Added new API to set shader uniforms (#983, #538)
- * Rewrite RenderWindow::capture (#1001)
+- Added support for outlined text (#840)
+- Add support for geometry shaders (#886, #428)
+- Feature/blend mode reverse subtract (#945, #944)
+- Implemented support for mipmap generation (#973, #498, #123)
+- Added new API to set shader uniforms (#983, #538)
+- Rewrite RenderWindow::capture (#1001)
**Bugfixes**
- * Exporting some Glsl utility functions due to linking issues (#1044, #1046)
- * Fixed missing initialisation of Font::m_stroker (#1059)
- * Changed primitive types to be grammatically correct (#1095, #939)
+- Exporting some Glsl utility functions due to linking issues (#1044, #1046)
+- Fixed missing initialisation of Font::m_stroker (#1059)
+- Changed primitive types to be grammatically correct (#1095, #939)
### Audio
**Features**
- * Implemented stereo audio recording (#1010)
+- Implemented stereo audio recording (#1010)
**Bugfixes**
- * Added an assignment operator to SoundSource (#864)
- * [macOS] Updates OpenAL-soft for macOS to version 1.17.2 (#1057, #900, #1000)
- * Fixed a bug where vorbis can't handle large buffers (#1067)
- * Added support for 24-bit .wav files (#958, #955)
- * Fixed threading issue in sf::SoundRecorder (#1011)
- * Made WAV file reader no longer assume that data chunk goes till end of file to prevent reading trailing metadata as samples (#1018)
- * Fixed seeking in multi channel FLAC files (#1041, #1040)
+- Added an assignment operator to SoundSource (#864)
+- [macOS] Updates OpenAL-soft for macOS to version 1.17.2 (#1057, #900, #1000)
+- Fixed a bug where vorbis can't handle large buffers (#1067)
+- Added support for 24-bit .wav files (#958, #955)
+- Fixed threading issue in sf::SoundRecorder (#1011)
+- Made WAV file reader no longer assume that data chunk goes till end of file to prevent reading trailing metadata as samples (#1018)
+- Fixed seeking in multi channel FLAC files (#1041, #1040)
### Network
**Features**
- * Added optional argument on which address to bind (socket). (#850, #678)
+- Added optional argument on which address to bind (socket). (#850, #678)
**Bugfixes**
- * Fixed FTP directory listing blocking forever (#1086, #1025)
+- Fixed FTP directory listing blocking forever (#1086, #1025)
## SFML 2.3.2
@@ -339,27 +515,27 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.3.2
### General
- * Fixed an issue where FindSFML.cmake couldn't find older versions of SFML (#903)
- * Robust alCheck and glCheck macros (#917)
- * Fixed FindSFML.cmake to use the uppercase FLAC name (#923)
- * Added a CONTRIBUTING file so GitHub shows a message when creating a new issue (#932)
+- Fixed an issue where FindSFML.cmake couldn't find older versions of SFML (#903)
+- Robust alCheck and glCheck macros (#917)
+- Fixed FindSFML.cmake to use the uppercase FLAC name (#923)
+- Added a CONTRIBUTING file so GitHub shows a message when creating a new issue (#932)
### Window
**Bugfixes**
- * [Linux] Fixed an issue where the keypad's key weren't being detected (#910)
- * [Linux] Revert to Xlib event handling (#934)
- * [Linux] Fixed `XK_*` inconsistency in InpuImpl.cpp (#947)
- * [Linux] Fix `_NET_WM_PING` messages not being replied to properly (#947)
+- [Linux] Fixed an issue where the keypad's key weren't being detected (#910)
+- [Linux] Revert to Xlib event handling (#934)
+- [Linux] Fixed `XK_*` inconsistency in InpuImpl.cpp (#947)
+- [Linux] Fix `_NET_WM_PING` messages not being replied to properly (#947)
### Graphics
**Bugfixes**
- * Fixed clear bug on RenderTextures (#915)
- * Fixed image file extension detection (#929, #930, #931)
- * Secure function against random data return (#935, #942)
+- Fixed clear bug on RenderTextures (#915)
+- Fixed image file extension detection (#929, #930, #931)
+- Secure function against random data return (#935, #942)
## SFML 2.3.1
@@ -369,25 +545,25 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.3.1
**Bugfixes**
- * [Android] Make sure a window still exists before trying to access its dimensions (#854)
- * [Android] Added Android API level checks (#856)
- * [Android] Updated the JNI/event handling code (#906)
- * [Linux] Resized events are only spawned when the window size actually changes (#878, #893)
- * [Linux] Whitelisted X SHAPE events (#879, #883)
- * [Linux] Remap Unix keyboard when user changes layout (#895, #897)
- * [Linux] Fix undefined behavior in ewmhSupported() (#892, #901)
+- [Android] Make sure a window still exists before trying to access its dimensions (#854)
+- [Android] Added Android API level checks (#856)
+- [Android] Updated the JNI/event handling code (#906)
+- [Linux] Resized events are only spawned when the window size actually changes (#878, #893)
+- [Linux] Whitelisted X SHAPE events (#879, #883)
+- [Linux] Remap Unix keyboard when user changes layout (#895, #897)
+- [Linux] Fix undefined behavior in ewmhSupported() (#892, #901)
### Graphics
**Bugfixes**
- * Added support for GL_EXT_texture_edge_clamp for systems that don't expose GL_SGIS_texture_edge_clamp (#880, #882)
+- Added support for GL_EXT_texture_edge_clamp for systems that don't expose GL_SGIS_texture_edge_clamp (#880, #882)
### Audio
**Bugfixes**
- * [Android] Fixed audio files not loading (and possibly crashing) (#855, #887)
+- [Android] Fixed audio files not loading (and possibly crashing) (#855, #887)
## SFML 2.3
@@ -395,77 +571,77 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.3
### General
- * Examples only link against sfml-main in release mode (#610, #766)
- * Replaced unsigned int with std::size_t for array indices and sizes (#739)
- * Fixed some issues with the Doxygen documentation (#750)
- * Added support for EditorConfig (#751)
- * Hide success message for CMake in quiet mode (#753)
- * Improved documentation for statuses with sf::Ftp (#763)
- * Moved stb_image into the extlibs directory (#795)
- * Changed the SOVERSION to major.minor (#812)
- * Fixed warnings about switch-statements (#863)
- * Added missing includes in the general headers (#851)
- * [Android] Updated toolchain file and dependencies (#791)
- * [Linux] Fixed missing pthread dependency (#794)
- * [macOS] Relaxed CMake installation rules regarding framework dependencies (#767)
+- Examples only link against sfml-main in release mode (#610, #766)
+- Replaced unsigned int with std::size_t for array indices and sizes (#739)
+- Fixed some issues with the Doxygen documentation (#750)
+- Added support for EditorConfig (#751)
+- Hide success message for CMake in quiet mode (#753)
+- Improved documentation for statuses with sf::Ftp (#763)
+- Moved stb_image into the extlibs directory (#795)
+- Changed the SOVERSION to major.minor (#812)
+- Fixed warnings about switch-statements (#863)
+- Added missing includes in the general headers (#851)
+- [Android] Updated toolchain file and dependencies (#791)
+- [Linux] Fixed missing pthread dependency (#794)
+- [macOS] Relaxed CMake installation rules regarding framework dependencies (#767)
### Deprecated API
- * sf::Event::MouseWheelEvent: This event is deprecated and potentially inaccurate. Use MouseWheelScrollEvent instead.
+- sf::Event::MouseWheelEvent: This event is deprecated and potentially inaccurate. Use MouseWheelScrollEvent instead.
### Window
**Features**
- * Added new events for handling high-precision scrolling (#95, #810, #837)
- * Switched from Xlib to XCB (#200, #319, #694, #780, #813, #825)
- * Added support for OpenGL 3 core context creation (#654, #779)
+- Added new events for handling high-precision scrolling (#95, #810, #837)
+- Switched from Xlib to XCB (#200, #319, #694, #780, #813, #825)
+- Added support for OpenGL 3 core context creation (#654, #779)
**Bugfixes**
- * Fixed glXSwapIntervalSGI being broken for some driver implementations (#727, #779)
- * Fixed simultaneous context operations causing crashes on some AMD hardware (#778, #779)
- * Fixed joystick identification (#809, #811)
- * [iOS] Fixed various issues including stencil bits, device orientation and retina support (#748)
- * [iOS] Fixed inconsistency between sf::Touch::getPosition and touch events (#875)
- * [Linux] Fixed Alt+F4 not getting triggered in window mode (#274)
- * [Linux] Fixed Unix joystick stuff (#838)
- * [macOS] Fixed typo in JoystickImpl.cpp to prevent a crash (#762, #765)
- * [macOS] Fixed an issue in InputImpl::getSFOpenGLViewFromSFMLWindow (#782, #792)
+- Fixed glXSwapIntervalSGI being broken for some driver implementations (#727, #779)
+- Fixed simultaneous context operations causing crashes on some AMD hardware (#778, #779)
+- Fixed joystick identification (#809, #811)
+- [iOS] Fixed various issues including stencil bits, device orientation and retina support (#748)
+- [iOS] Fixed inconsistency between sf::Touch::getPosition and touch events (#875)
+- [Linux] Fixed Alt+F4 not getting triggered in window mode (#274)
+- [Linux] Fixed Unix joystick stuff (#838)
+- [macOS] Fixed typo in JoystickImpl.cpp to prevent a crash (#762, #765)
+- [macOS] Fixed an issue in InputImpl::getSFOpenGLViewFromSFMLWindow (#782, #792)
### Graphics
**Features**
- * Replaced GLEW with loader generated by glLoadGen (#779)
- * Added a new constructor to sf::Color that takes an sf::Uint32 (#722)
- * Updated stb_image to v2.02 (#777)
- * Updated FreeType to v2.5.5 (#799, #804)
- * Added checks for software OpenGL (#870)
+- Replaced GLEW with loader generated by glLoadGen (#779)
+- Added a new constructor to sf::Color that takes an sf::Uint32 (#722)
+- Updated stb_image to v2.02 (#777)
+- Updated FreeType to v2.5.5 (#799, #804)
+- Added checks for software OpenGL (#870)
**Bugfixes**
- * Fixed GL_ARB_compatibility not being detected (#859)
- * Fixed pixel format selection (#862)
- * Bumped back the OpenGL version requirement to 1.1 (#858)
+- Fixed GL_ARB_compatibility not being detected (#859)
+- Fixed pixel format selection (#862)
+- Bumped back the OpenGL version requirement to 1.1 (#858)
### Audio
**Features**
- * Dropped libsndfile and started using Vorbis, FLAC and OGG directly (#604, #757)
- * Added a FLAC file to the sound example (#815)
+- Dropped libsndfile and started using Vorbis, FLAC and OGG directly (#604, #757)
+- Added a FLAC file to the sound example (#815)
**Bugfixes**
- * Fixed access violation error in the destructor of sf::AudioDevice (#30, #602)
- * [macOS] Fixed threading issue with sf::SoundStream and OpenAL (#541, #831)
+- Fixed access violation error in the destructor of sf::AudioDevice (#30, #602)
+- [macOS] Fixed threading issue with sf::SoundStream and OpenAL (#541, #831)
### Network
**Bugfixes**
- * Fixed sf::TcpSocket not handling partial sends properly (#749, #796)
+- Fixed sf::TcpSocket not handling partial sends properly (#749, #796)
## SFML 2.2
@@ -473,147 +649,147 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.2
### General
- * Support for iOS and Android platform (#410, #440)
- * Various documentation corrections (#438, #496, #497, #714)
- * Fixed support for compilers on Debian FreeBSD (#380, #578)
- * Added support for Visual Studio 2013 and proper support for the TDM builds (#482)
- * Fixed CMake problems related to FindSFML and cached variables (#637, #684)
- * Switched and enforced LF line endings (#708, #712)
- * Updated OpenAL to version 1.15.1 (d077210)
- * Made compiler and OS variable names much clearer in CMake files (9b0ed30)
- * Re-enabled RPATH feature (e157e7a)
- * Slight adjustments to the examples (#737)
- * [FreeBSD] Various configuration fixes (#577, #578)
- * [Linux] Updated FindSFML.cmake to add UDev to SFML's dependencies (#728, #729, #734, #736)
- * [macOS] Fixed incorrect symlink in freetype.framework (#519)
- * [macOS] CMake module for correct dependencies (#548)
- * [macOS] Fixed SFML target for Xcode (#595, #596)
- * [macOS] Updated implementation, mainly reverting to non-ARC (#601)
- * [macOS] Fixed memory leaks and dead store (#615)
- * [macOS] Improved event handling and performance (#617)
- * [macOS] Reduced memory usage (#672, #698)
- * [macOS] macOS 10.10 support (#691, #699)
- * [macOS] Improve flexibility of dependencies' locations (#713)
- * [Windows] Removed the hack that copied external libraries into SFML static libraries (dbf01a7)
+- Support for iOS and Android platform (#410, #440)
+- Various documentation corrections (#438, #496, #497, #714)
+- Fixed support for compilers on Debian FreeBSD (#380, #578)
+- Added support for Visual Studio 2013 and proper support for the TDM builds (#482)
+- Fixed CMake problems related to FindSFML and cached variables (#637, #684)
+- Switched and enforced LF line endings (#708, #712)
+- Updated OpenAL to version 1.15.1 (d077210)
+- Made compiler and OS variable names much clearer in CMake files (9b0ed30)
+- Re-enabled RPATH feature (e157e7a)
+- Slight adjustments to the examples (#737)
+- [FreeBSD] Various configuration fixes (#577, #578)
+- [Linux] Updated FindSFML.cmake to add UDev to SFML's dependencies (#728, #729, #734, #736)
+- [macOS] Fixed incorrect symlink in freetype.framework (#519)
+- [macOS] CMake module for correct dependencies (#548)
+- [macOS] Fixed SFML target for Xcode (#595, #596)
+- [macOS] Updated implementation, mainly reverting to non-ARC (#601)
+- [macOS] Fixed memory leaks and dead store (#615)
+- [macOS] Improved event handling and performance (#617)
+- [macOS] Reduced memory usage (#672, #698)
+- [macOS] macOS 10.10 support (#691, #699)
+- [macOS] Improve flexibility of dependencies' locations (#713)
+- [Windows] Removed the hack that copied external libraries into SFML static libraries (dbf01a7)
### System
**Features**
- * Added substring and replace functions to sf::String (#21, #355)
- * Added toUtfX to sf::String (#501)
- * Added fromUtfX functions to set the internal data to a string by converting from another string in a fixed encoding (#196)
- * Added modulo operator for sf::Time (#429, #430)
- * Added division operator for sf::Time (#453)
+- Added substring and replace functions to sf::String (#21, #355)
+- Added toUtfX to sf::String (#501)
+- Added fromUtfX functions to set the internal data to a string by converting from another string in a fixed encoding (#196)
+- Added modulo operator for sf::Time (#429, #430)
+- Added division operator for sf::Time (#453)
**Bugfixes**
- * Ensured a high resolution for sf::sleep (#439, #475)
- * [Windows] Fixed stack unalignment by two internal functions (#412)
+- Ensured a high resolution for sf::sleep (#439, #475)
+- [Windows] Fixed stack unalignment by two internal functions (#412)
### Window
**Features**
- * Added window methods to request and to check focus (#518, #525, #613, #723, #735)
- * Provide name, manufacturer ID and product ID via sf::Joystick (#152, #528)
- * [FreeBSD] Joystick support (#477)
- * [macOS] Improved integration with menus and dock actions (#11)
- * [macOS] Support for OpenGL 3.2 (#84)
- * [macOS] Improved fullscreen support (#343)
- * [macOS] Added support for retina displays (#353, #388)
- * [Windows] Removed support for Windows 9x (#469)
- * [Windows] Fixed typo in Windows keyboard implementation (#516)
-
-**Bugfixes**
-
- * sf::Window::create() now also resets framerate limit (#371)
- * Fixed OpenGL context leak (#635, #705)
- * Fixed various joystick problems (memory leak, accelerometer detected, code refactoring) (#660, #686, #742, #743)
- * Optimized sf::Window::waitEvent a bit, no sleep if events are available at first try (ff555d6)
- * [Linux] Output error message when XOpenDisplay() fails (#508, #616)
- * [Linux] Resize window with setSize when sf::Style::Resize is set (#466)
- * [Linux] Fixed broken key repeat on window recreation (#564, #567)
- * [macOS] Fixed KeyReleased not being fired in fullscreen mode (#465)
- * [macOS] Fixed an issue where disconnecting the keyboard would cause a crash (#467)
- * [macOS] Fixed unexpected resizing behavior (#468)
- * [macOS] Improved resizing windows (#474)
- * [macOS] Fixed memory leak with sf::Window::create() (#484)
- * [macOS] Fixed menu shortcuts in fullscreen on macOS (#527)
- * [macOS] Improved cursor hiding (#703)
- * [macOS] Fixed right click not detected with trackpads (#716, #730)
- * [Windows] Fixed joystick POV values (ef1d29b)
- * [Windows] Fixed Unicode inconsistency (#635)
- * [Windows] Fixed Alt+F4 and mouse clicks issues (#437, #457)
- * [Windows] Send MouseButtonReleased event when the mouse is outside of the window (#455, #457)
- * [Windows] Fixed sf::Joystick wrong registry usage (#701, #702, #706)
+- Added window methods to request and to check focus (#518, #525, #613, #723, #735)
+- Provide name, manufacturer ID and product ID via sf::Joystick (#152, #528)
+- [FreeBSD] Joystick support (#477)
+- [macOS] Improved integration with menus and dock actions (#11)
+- [macOS] Support for OpenGL 3.2 (#84)
+- [macOS] Improved fullscreen support (#343)
+- [macOS] Added support for retina displays (#353, #388)
+- [Windows] Removed support for Windows 9x (#469)
+- [Windows] Fixed typo in Windows keyboard implementation (#516)
+
+**Bugfixes**
+
+- sf::Window::create() now also resets framerate limit (#371)
+- Fixed OpenGL context leak (#635, #705)
+- Fixed various joystick problems (memory leak, accelerometer detected, code refactoring) (#660, #686, #742, #743)
+- Optimized sf::Window::waitEvent a bit, no sleep if events are available at first try (ff555d6)
+- [Linux] Output error message when XOpenDisplay() fails (#508, #616)
+- [Linux] Resize window with setSize when sf::Style::Resize is set (#466)
+- [Linux] Fixed broken key repeat on window recreation (#564, #567)
+- [macOS] Fixed KeyReleased not being fired in fullscreen mode (#465)
+- [macOS] Fixed an issue where disconnecting the keyboard would cause a crash (#467)
+- [macOS] Fixed unexpected resizing behavior (#468)
+- [macOS] Improved resizing windows (#474)
+- [macOS] Fixed memory leak with sf::Window::create() (#484)
+- [macOS] Fixed menu shortcuts in fullscreen on macOS (#527)
+- [macOS] Improved cursor hiding (#703)
+- [macOS] Fixed right click not detected with trackpads (#716, #730)
+- [Windows] Fixed joystick POV values (ef1d29b)
+- [Windows] Fixed Unicode inconsistency (#635)
+- [Windows] Fixed Alt+F4 and mouse clicks issues (#437, #457)
+- [Windows] Send MouseButtonReleased event when the mouse is outside of the window (#455, #457)
+- [Windows] Fixed sf::Joystick wrong registry usage (#701, #702, #706)
### Graphics
**Features**
- * Provide more information about the loaded font in sf::Font (#164)
- * Implemented a more flexible blending system (#298)
- * Added strikethrough text style (#243, #362, #682)
- * Slight optimization for sf::Text::setString (#413)
- * Added subtraction operator for sf::Color (#114, #145)
- * Optimized sf::Image::flipVertically/flipHorizontally (#555)
- * Changed sf::Font measurements from int to float to allow better underline drawing (#693)
-
-**Bugfixes**
-
- * Improved text quality for small and pixelated fonts (#228)
- * Yet another fix for Intel GPUs with sf::RenderTexture (#418)
- * Removed VTab since it causes issues and doesn't have a use nowadays (#442, #445, #460, #588)
- * Fixed broken BDF and PCF font formats (#448)
- * Fixed compilation issue with newer versions of GCC for sf::Rect (#458)
- * Fixed resetGLStates() not explicitly setting the default polygon mode (#480)
- * Fixed division-by-zero in sf::RectangleShape (#499)
- * Fixed potential memory leak in sf::Font (#509)
- * Updated glext and removed glxext (#511, #583)
- * Make sure texture unit 0 is active when resetting sf::RenderTarget states (#523, #591)
- * Fixed texture rect computation in fonts (#669)
- * Improved rendering of underlined text (#593)
- * Avoided repeated output of error messages (#566)
- * Fixed text rendered with vertical offset on ascent and font size mismatch (#576)
- * Fixed rounding problem for viewports (#598)
- * Fixed sf::Shader::isAvailable() possibly breaking context management (#211, #603, #608, #603)
- * Fixed sf::Texture::getMaximumSize() possibly breaking context management (#666)
- * Fixed various sf::Text rendering issues (#692, #699)
- * The texture matrix is now reset in sf::Texture::bind(NULL) (7c4b058)
- * [Windows] Fixed DPI scaling causing strange window behavior (#679, #681, #688)
+- Provide more information about the loaded font in sf::Font (#164)
+- Implemented a more flexible blending system (#298)
+- Added strikethrough text style (#243, #362, #682)
+- Slight optimization for sf::Text::setString (#413)
+- Added subtraction operator for sf::Color (#114, #145)
+- Optimized sf::Image::flipVertically/flipHorizontally (#555)
+- Changed sf::Font measurements from int to float to allow better underline drawing (#693)
+
+**Bugfixes**
+
+- Improved text quality for small and pixelated fonts (#228)
+- Yet another fix for Intel GPUs with sf::RenderTexture (#418)
+- Removed VTab since it causes issues and doesn't have a use nowadays (#442, #445, #460, #588)
+- Fixed broken BDF and PCF font formats (#448)
+- Fixed compilation issue with newer versions of GCC for sf::Rect (#458)
+- Fixed resetGLStates() not explicitly setting the default polygon mode (#480)
+- Fixed division-by-zero in sf::RectangleShape (#499)
+- Fixed potential memory leak in sf::Font (#509)
+- Updated glext and removed glxext (#511, #583)
+- Make sure texture unit 0 is active when resetting sf::RenderTarget states (#523, #591)
+- Fixed texture rect computation in fonts (#669)
+- Improved rendering of underlined text (#593)
+- Avoided repeated output of error messages (#566)
+- Fixed text rendered with vertical offset on ascent and font size mismatch (#576)
+- Fixed rounding problem for viewports (#598)
+- Fixed sf::Shader::isAvailable() possibly breaking context management (#211, #603, #608, #603)
+- Fixed sf::Texture::getMaximumSize() possibly breaking context management (#666)
+- Fixed various sf::Text rendering issues (#692, #699)
+- The texture matrix is now reset in sf::Texture::bind(NULL) (7c4b058)
+- [Windows] Fixed DPI scaling causing strange window behavior (#679, #681, #688)
### Audio
**Features**
- * Added support for selecting the audio capture device (#220, #470)
- * Make sf::SoundRecorder processing frequency configurable (#333)
- * Added up vector to sf::Listener (#545)
+- Added support for selecting the audio capture device (#220, #470)
+- Make sf::SoundRecorder processing frequency configurable (#333)
+- Added up vector to sf::Listener (#545)
**Bugfixes**
- * Prevented sf::SoundStream::setPlayingOffset() from restarting playing even when paused (#203, #592)
- * Fixed sf::SoundBuffer contents not being able to be updated when still attached to sounds (#354, 367, #390, #589)
- * Catch audio format error and prevent division by zero (#529)
- * Fixed sf::SoundBuffer returning wrong duration for sounds containing more than ~4.3 million samples (2ff58ed)
- * Optimized sf::Listener with a cache (d97e524)
+- Prevented sf::SoundStream::setPlayingOffset() from restarting playing even when paused (#203, #592)
+- Fixed sf::SoundBuffer contents not being able to be updated when still attached to sounds (#354, 367, #390, #589)
+- Catch audio format error and prevent division by zero (#529)
+- Fixed sf::SoundBuffer returning wrong duration for sounds containing more than ~4.3 million samples (2ff58ed)
+- Optimized sf::Listener with a cache (d97e524)
### Network
**Features**
- * Added support for PUT and DELETE in sf::Http (#257, #312, #607)
- * Added support for chunked HTTP transfers (#296, #337)
- * Added support for 64-bit integers in sf::Packet (#710)
- * Made sf::Ftp::sendCommand() public (2c5cab5)
+- Added support for PUT and DELETE in sf::Http (#257, #312, #607)
+- Added support for chunked HTTP transfers (#296, #337)
+- Added support for 64-bit integers in sf::Packet (#710)
+- Made sf::Ftp::sendCommand() public (2c5cab5)
**Bugfixes**
- * Checked socket descriptor limit (#153, #628, #683)
- * Fixed sf::TcpSocket::connect()'s switching from blocking to non-blocking mode on immediate connection success (#221)
- * Fixed FTP download and upload file sizes being limited by available RAM (#565, #590)
- * Fixed C++11 compiler warnings for sf::Uint8 (#731, #732)
+- Checked socket descriptor limit (#153, #628, #683)
+- Fixed sf::TcpSocket::connect()'s switching from blocking to non-blocking mode on immediate connection success (#221)
+- Fixed FTP download and upload file sizes being limited by available RAM (#565, #590)
+- Fixed C++11 compiler warnings for sf::Uint8 (#731, #732)
## SFML 2.1
@@ -621,81 +797,81 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.1
### General
- * Updated the Window and OpenGL examples (got rid of GLU and immediate mode)
+- Updated the Window and OpenGL examples (got rid of GLU and immediate mode)
### Window
**Features**
- * Now using inotify on Linux to avoid constantly polling joystick connections (#96)
- * Add keypad return, equal and period keys support for macOS
- * Improved mouse events on macOS regarding fullscreen mode
- * Improved mouse events on macOS (#213, #277)
- * Improved reactivity of setMousePosition on macOS (#290)
- * Added support for right control key on macOS
- * Improved TextEntered for macOS (#377)
- * Improved the performances of Window::getSize() (the size is now cached)
- * Added the WM_CLASS property to SFML windows on Linux
- * Fake resize events are no longer sent when the window is moved, on Linux
- * Pressing ALT or F10 on Windows no longer steals the focus
-
-**Bugfixes**
-
- * Fixed MouseMove event sometimes not generated when holding left button on Windows (#225)
- * Fixed ContextSettings ignored when creating a 3.x/4.x OpenGL context on Linux (#258)
- * Fixed ContextSettings ignored on Linux when creating a window (#35)
- * Fixed windows bigger than the desktop not appearing on Windows (#215)
- * Fixed KeyRelease events sometimes not reported on Linux (#404)
- * Fixed mouse moved event on macOS when dragging the cursor (#277)
- * Fixed KeyRelease event with CMD key pressed (#381)
- * Fixed taskbar bugs on Windows (#328, #69)
- * Fixed Window::getPosition() on Linux (#346)
- * Unicode characters outside the BMP (> 0xFFFF) are now correctly handled on Windows (#366)
+- Now using inotify on Linux to avoid constantly polling joystick connections (#96)
+- Add keypad return, equal and period keys support for macOS
+- Improved mouse events on macOS regarding fullscreen mode
+- Improved mouse events on macOS (#213, #277)
+- Improved reactivity of setMousePosition on macOS (#290)
+- Added support for right control key on macOS
+- Improved TextEntered for macOS (#377)
+- Improved the performances of Window::getSize() (the size is now cached)
+- Added the WM_CLASS property to SFML windows on Linux
+- Fake resize events are no longer sent when the window is moved, on Linux
+- Pressing ALT or F10 on Windows no longer steals the focus
+
+**Bugfixes**
+
+- Fixed MouseMove event sometimes not generated when holding left button on Windows (#225)
+- Fixed ContextSettings ignored when creating a 3.x/4.x OpenGL context on Linux (#258)
+- Fixed ContextSettings ignored on Linux when creating a window (#35)
+- Fixed windows bigger than the desktop not appearing on Windows (#215)
+- Fixed KeyRelease events sometimes not reported on Linux (#404)
+- Fixed mouse moved event on macOS when dragging the cursor (#277)
+- Fixed KeyRelease event with CMD key pressed (#381)
+- Fixed taskbar bugs on Windows (#328, #69)
+- Fixed Window::getPosition() on Linux (#346)
+- Unicode characters outside the BMP (> 0xFFFF) are now correctly handled on Windows (#366)
### Graphics
**Features**
- * Checking errors in RenderTarget::pushGLStates() to avoid generating false error messages when user leaves unchecked OpenGL errors (#340)
- * Optimized Shader::setParameter functions, by using a cache internally (#316, #358)
+- Checking errors in RenderTarget::pushGLStates() to avoid generating false error messages when user leaves unchecked OpenGL errors (#340)
+- Optimized Shader::setParameter functions, by using a cache internally (#316, #358)
**Bugfixes**
- * Fixed bounding rect of sf::Text ignoring whitespaces (#216)
- * Solved graphics resources not updated or corrupted when loaded in a thread (#411)
- * Fixed white pixel showing on first character of sf::Text (#414)
- * sf::Rect::contains and sf::Rect::intersects now handle rectangles with negative dimensions correctly (#219)
- * Fixed Shape::setTextureRect not working when called before setTexture
+- Fixed bounding rect of sf::Text ignoring whitespaces (#216)
+- Solved graphics resources not updated or corrupted when loaded in a thread (#411)
+- Fixed white pixel showing on first character of sf::Text (#414)
+- sf::Rect::contains and sf::Rect::intersects now handle rectangles with negative dimensions correctly (#219)
+- Fixed Shape::setTextureRect not working when called before setTexture
### Audio
**Features**
- * loadFromStream functions now explicitly reset the stream (seek(0)) before starting to read (#349)
+- loadFromStream functions now explicitly reset the stream (seek(0)) before starting to read (#349)
**Bugfixes**
- * Added a workaround for a bug in the macOS implementation of OpenAL (unsupported channel count no properly detected) (#201)
- * Fixed SoundBuffer::loadFromStream reading past the end of the stream (#214)
+- Added a workaround for a bug in the macOS implementation of OpenAL (unsupported channel count no properly detected) (#201)
+- Fixed SoundBuffer::loadFromStream reading past the end of the stream (#214)
### Network
**Features**
- * Replaced the deprecated gethostbyname with getaddrinfo (#47)
- * Minor improvements to sf::Packet operators (now using strlen and wcslen instead of explicit loops) (#118)
+- Replaced the deprecated gethostbyname with getaddrinfo (#47)
+- Minor improvements to sf::Packet operators (now using strlen and wcslen instead of explicit loops) (#118)
**Bugfixes**
- * Fixed non-blocking connection with a sf::TcpSocket on Windows
- * Fixed TCP packet data corruption in non-blocking mode (#402, #119)
- * On Unix systems, a socket disconnection no longer stops the program with signal SIGPIPE (#72)
+- Fixed non-blocking connection with a sf::TcpSocket on Windows
+- Fixed TCP packet data corruption in non-blocking mode (#402, #119)
+- On Unix systems, a socket disconnection no longer stops the program with signal SIGPIPE (#72)
## SFML 2.0
Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.0
-No changelog available. *Everything changed.*
+No changelog available. _Everything changed._
## Older Releases
diff --git a/cmake/CompilerOptionsOverride.cmake b/cmake/CompilerOptionsOverride.cmake
new file mode 100644
index 0000000..d53f7f2
--- /dev/null
+++ b/cmake/CompilerOptionsOverride.cmake
@@ -0,0 +1,5 @@
+if(MSVC)
+ # remove default warning level from CMAKE_CXX_FLAGS_INIT
+ string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS_INIT}")
+ string(REGEX REPLACE "/W[0-4]" "" CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS_INIT}")
+endif()
diff --git a/cmake/CompilerWarnings.cmake b/cmake/CompilerWarnings.cmake
new file mode 100644
index 0000000..96231f8
--- /dev/null
+++ b/cmake/CompilerWarnings.cmake
@@ -0,0 +1,116 @@
+# from here:
+#
+# https://github.com/lefticus/cppbestpractices/blob/master/02-Use_the_Tools_Available.md
+
+# Helper function to enable compiler warnings for a specific set of files
+function(set_file_warnings)
+ option(WARNINGS_AS_ERRORS "Treat compiler warnings as errors" FALSE)
+
+ set(MSVC_WARNINGS
+ /W4 # Baseline reasonable warnings
+ /w14242 # 'identifier': conversion from 'type1' to 'type1', possible loss of data
+ /w14254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
+ /w14263 # 'function': member function does not override any base class virtual member function
+ /w14265 # 'classname': class has virtual functions, but destructor is not virtual instances of this class may not be destructed correctly
+ /w14287 # 'operator': unsigned/negative constant mismatch
+ /we4289 # nonstandard extension used: 'variable': loop control variable declared in the for-loop is used outside the for-loop scope
+ /w14296 # 'operator': expression is always 'boolean_value'
+ /w14311 # 'variable': pointer truncation from 'type1' to 'type2'
+ /w14545 # expression before comma evaluates to a function which is missing an argument list
+ /w14546 # function call before comma missing argument list
+ /w14547 # 'operator': operator before comma has no effect; expected operator with side-effect
+ /w14549 # 'operator': operator before comma has no effect; did you intend 'operator'?
+ /w14555 # expression has no effect; expected expression with side- effect
+ /w14619 # pragma warning: there is no warning number 'number'
+ /w14640 # Enable warning on thread un-safe static member initialization
+ /w14826 # Conversion from 'type1' to 'type_2' is sign-extended. This may cause unexpected runtime behavior.
+ /w14905 # wide string literal cast to 'LPSTR'
+ /w14906 # string literal cast to 'LPWSTR'
+ /w14928 # illegal copy-initialization; more than one user-defined conversion has been implicitly applied
+ # /permissive- # standards conformance mode for MSVC compiler. Disabled until all out-of-the-box Windows SDKs can successfully build with it.
+
+ # Disables, remove when appropriate
+ /wd4996 # disable warnings about deprecated functions
+ /wd4068 # disable warnings about unknown pragmas (e.g. #pragma GCC)
+ /wd4505 # disable warnings about unused functions that might be platform-specific
+ /wd4800 # disable warnings regarding implicit conversions to bool
+ )
+
+ # some warnings are not supported on older NDK versions used for CI
+ if (ANDROID)
+ set(NON_ANDROID_CLANG_AND_GCC_WARNINGS "")
+ set(NON_ANDROID_GCC_WARNINGS "")
+ else()
+ set(NON_ANDROID_CLANG_AND_GCC_WARNINGS
+ -Wnull-dereference # warn if a null dereference is detected
+ -Wold-style-cast # warn for c-style casts
+ -Wpedantic # warn if non-standard C++ is used
+ )
+
+ set(NON_ANDROID_GCC_WARNINGS
+ -Wmisleading-indentation # warn if indentation implies blocks where blocks do not exist
+ -Wduplicated-cond # warn if if / else chain has duplicated conditions
+ )
+ endif()
+
+ set(CLANG_AND_GCC_WARNINGS
+ -Wall
+ -Wextra # reasonable and standard
+ -Wshadow # warn the user if a variable declaration shadows one from a parent context
+ -Wnon-virtual-dtor # warn the user if a class with virtual functions has a non-virtual destructor. This helps catch hard to track down memory errors
+ -Wcast-align # warn for potential performance problem casts
+ -Wunused # warn on anything being unused
+ -Woverloaded-virtual # warn if you overload (not override) a virtual function
+ -Wconversion # warn on type conversions that may lose data
+ -Wsign-conversion # warn on sign conversions
+ -Wdouble-promotion # warn if float is implicit promoted to double
+ -Wformat=2 # warn on security issues around functions that format output (ie printf)
+ # -Wimplicit-fallthrough # warn when a missing break causes control flow to continue at the next case in a switch statement (disabled until better compiler support for explicit fallthrough is available)
+ ${NON_ANDROID_CLANG_AND_GCC_WARNINGS}
+ )
+
+ # Disable warnings as errors when using Clang on Windows to work around deprecation warnings in Windows APIs
+ if(SFML_OS_WINDOWS AND (SFML_COMPILER_CLANG OR SFML_COMPILER_CLANG_CL))
+ set(WARNINGS_AS_ERRORS FALSE)
+ endif()
+
+ if(WARNINGS_AS_ERRORS)
+ set(CLANG_AND_GCC_WARNINGS ${CLANG_AND_GCC_WARNINGS} -Werror)
+ set(MSVC_WARNINGS ${MSVC_WARNINGS} /WX)
+ endif()
+
+ set(CLANG_WARNINGS
+ ${CLANG_AND_GCC_WARNINGS}
+ -Wno-unknown-warning-option # do not warn on GCC-specific warning diagnostic pragmas
+ )
+
+ set(GCC_WARNINGS
+ ${CLANG_AND_GCC_WARNINGS}
+ ${NON_ANDROID_GCC_WARNINGS}
+ -Wlogical-op # warn about logical operations being used where bitwise were probably wanted
+ # -Wuseless-cast # warn if you perform a cast to the same type (disabled because it is not portable as some typedefs might vary between platforms)
+ )
+
+ # Don't enable -Wduplicated-branches for GCC < 8.1 since it will lead to false positives
+ # https://github.com/gcc-mirror/gcc/commit/6bebae75035889a4844eb4d32a695bebf412bcd7
+ if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1)
+ set(GCC_WARNINGS
+ ${GCC_WARNINGS}
+ -Wduplicated-branches # warn if if / else branches have duplicated code
+ )
+ endif()
+
+ if(MSVC)
+ set(FILE_WARNINGS ${MSVC_WARNINGS})
+ elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
+ set(FILE_WARNINGS ${CLANG_WARNINGS})
+ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ set(FILE_WARNINGS ${GCC_WARNINGS})
+ else()
+ message(AUTHOR_WARNING "No compiler warnings set for '${CMAKE_CXX_COMPILER_ID}' compiler.")
+ endif()
+
+ foreach(WARNING ${FILE_WARNINGS})
+ set_property(SOURCE ${ARGV} APPEND_STRING PROPERTY COMPILE_FLAGS " ${WARNING}")
+ endforeach()
+endfunction()
diff --git a/cmake/Config.cmake b/cmake/Config.cmake
index 0a28660..48bf1d0 100644
--- a/cmake/Config.cmake
+++ b/cmake/Config.cmake
@@ -35,6 +35,10 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "^OpenBSD$")
set(SFML_OS_OPENBSD 1)
# don't use the OpenGL ES implementation on OpenBSD
set(OPENGL_ES 0)
+elseif(CMAKE_SYSTEM_NAME MATCHES "^NetBSD$")
+ set(SFML_OS_NETBSD 1)
+ # don't use the OpenGL ES implementation on NetBSD
+ set(OPENGL_ES 0)
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
if(IOS)
set(SFML_OS_IOS 1)
@@ -71,34 +75,19 @@ endif()
# set pkgconfig install directory
# this could be e.g. macports on mac or msys2 on windows etc.
-set(SFML_PKGCONFIG_DIR "/lib${LIB_SUFFIX}/pkgconfig")
+set(SFML_PKGCONFIG_DIR "/${CMAKE_INSTALL_LIBDIR}/pkgconfig")
-if(SFML_OS_FREEBSD OR SFML_OS_OPENBSD)
+if(SFML_OS_FREEBSD OR SFML_OS_OPENBSD OR SFML_OS_NETBSD)
set(SFML_PKGCONFIG_DIR "/libdata/pkgconfig")
endif()
# detect the compiler and its version
-# Note: on some platforms (OS X), CMAKE_COMPILER_IS_GNUCXX is true
-# even when CLANG is used, therefore the Clang test is done first
-if(CMAKE_CXX_COMPILER MATCHES "clang[+][+]" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- # CMAKE_CXX_COMPILER_ID is an internal CMake variable subject to change,
- # but there is no other way to detect CLang at the moment
- set(SFML_COMPILER_CLANG 1)
- execute_process(COMMAND "${CMAKE_CXX_COMPILER}" "--version" OUTPUT_VARIABLE CLANG_VERSION_OUTPUT)
- string(REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1" SFML_CLANG_VERSION "${CLANG_VERSION_OUTPUT}")
-elseif(CMAKE_COMPILER_IS_GNUCXX)
- set(SFML_COMPILER_GCC 1)
- execute_process(COMMAND "${CMAKE_CXX_COMPILER}" "-dumpversion" OUTPUT_VARIABLE GCC_VERSION_OUTPUT)
- string(REGEX REPLACE "([0-9]+\\.[0-9]+).*" "\\1" SFML_GCC_VERSION "${GCC_VERSION_OUTPUT}")
- execute_process(COMMAND "${CMAKE_CXX_COMPILER}" "--version" OUTPUT_VARIABLE GCC_COMPILER_VERSION)
- string(REGEX MATCHALL ".*(tdm[64]*-[1-9]).*" SFML_COMPILER_GCC_TDM "${GCC_COMPILER_VERSION}")
- execute_process(COMMAND "${CMAKE_CXX_COMPILER}" "-dumpmachine" OUTPUT_VARIABLE GCC_MACHINE)
- string(STRIP "${GCC_MACHINE}" GCC_MACHINE)
- if(GCC_MACHINE MATCHES ".*w64.*")
- set(SFML_COMPILER_GCC_W64 1)
- endif()
-elseif(MSVC)
+# Note: The detection is order is important because:
+# - Visual Studio can both use MSVC and Clang
+# - GNUCXX can still be set on macOS when using Clang
+if(MSVC)
set(SFML_COMPILER_MSVC 1)
+
if(MSVC_VERSION EQUAL 1400)
set(SFML_MSVC_VERSION 8)
elseif(MSVC_VERSION EQUAL 1500)
@@ -111,8 +100,36 @@ elseif(MSVC)
set(SFML_MSVC_VERSION 12)
elseif(MSVC_VERSION EQUAL 1900)
set(SFML_MSVC_VERSION 14)
+ elseif(MSVC_VERSION LESS_EQUAL 1919)
+ set(SFML_MSVC_VERSION 15)
+ elseif(MSVC_VERSION LESS_EQUAL 1929)
+ set(SFML_MSVC_VERSION 16)
+ elseif(MSVC_VERSION LESS_EQUAL 1939)
+ set(SFML_MSVC_VERSION 17)
+ endif()
+
+ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ set(SFML_COMPILER_CLANG_CL 1)
+ endif()
+
+elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ set(SFML_COMPILER_CLANG 1)
+
+ execute_process(COMMAND "${CMAKE_CXX_COMPILER}" "--version" OUTPUT_VARIABLE CLANG_VERSION_OUTPUT)
+ string(REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1" SFML_CLANG_VERSION "${CLANG_VERSION_OUTPUT}")
+elseif(CMAKE_COMPILER_IS_GNUCXX)
+ set(SFML_COMPILER_GCC 1)
+
+ execute_process(COMMAND "${CMAKE_CXX_COMPILER}" "-dumpversion" OUTPUT_VARIABLE GCC_VERSION_OUTPUT)
+ string(REGEX REPLACE "([0-9]+\\.[0-9]+).*" "\\1" SFML_GCC_VERSION "${GCC_VERSION_OUTPUT}")
+ execute_process(COMMAND "${CMAKE_CXX_COMPILER}" "--version" OUTPUT_VARIABLE GCC_COMPILER_VERSION)
+ string(REGEX MATCHALL ".*(tdm[64]*-[1-9]).*" SFML_COMPILER_GCC_TDM "${GCC_COMPILER_VERSION}")
+ execute_process(COMMAND "${CMAKE_CXX_COMPILER}" "-dumpmachine" OUTPUT_VARIABLE GCC_MACHINE)
+ string(STRIP "${GCC_MACHINE}" GCC_MACHINE)
+
+ if(GCC_MACHINE MATCHES ".*w64.*")
+ set(SFML_COMPILER_GCC_W64 1)
endif()
else()
- message(FATAL_ERROR "Unsupported compiler")
- return()
+ message(WARNING "Unrecognized compiler: ${CMAKE_CXX_COMPILER_ID}. Use at your own risk.")
endif()
diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake
index ecb37c8..65f6977 100644
--- a/cmake/Macros.cmake
+++ b/cmake/Macros.cmake
@@ -1,5 +1,8 @@
include(CMakeParseArguments)
+# include the compiler warnings helpers
+include(${CMAKE_CURRENT_LIST_DIR}/CompilerWarnings.cmake)
+
# This little macro lets you set any Xcode specific property
macro (sfml_set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE)
set_property (TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} ${XCODE_VALUE})
@@ -17,13 +20,25 @@ function(sfml_set_stdlib target)
endif()
endif()
- if (SFML_OS_MACOSX)
- if (${CMAKE_GENERATOR} MATCHES "Xcode")
- sfml_set_xcode_property(${target} CLANG_CXX_LIBRARY "libc++")
- else()
- target_compile_options(${target} PRIVATE "-stdlib=libc++")
- target_link_libraries(${target} PRIVATE "-stdlib=libc++")
- endif()
+ if(${CMAKE_GENERATOR} MATCHES "Xcode")
+ sfml_set_xcode_property(${target} CLANG_CXX_LIBRARY "libc++")
+ endif()
+endfunction()
+
+function(sfml_set_common_ios_properties target)
+ # enable automatic reference counting on iOS
+ sfml_set_xcode_property(${target} CLANG_ENABLE_OBJC_ARC YES)
+ sfml_set_xcode_property(${target} IPHONEOS_DEPLOYMENT_TARGET "${SFML_IOS_DEPLOYMENT_TARGET}")
+ sfml_set_xcode_property(${target} CODE_SIGN_IDENTITY "${SFML_CODE_SIGN_IDENTITY}")
+
+ get_target_property(target_type ${target} TYPE)
+ if (target_type STREQUAL "EXECUTABLE")
+ set_target_properties(${target} PROPERTIES
+ MACOSX_BUNDLE TRUE # Bare executables are not usable on iOS, only bundle applications
+ MACOSX_BUNDLE_GUI_IDENTIFIER "org.sfml-dev.${target}" # If missing, trying to launch an example in simulator will make Xcode < 9.3 crash
+ MACOSX_BUNDLE_BUNDLE_NAME "${target}"
+ MACOSX_BUNDLE_LONG_VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"
+ )
endif()
endfunction()
@@ -46,6 +61,8 @@ macro(sfml_add_library target)
add_library(${target} ${THIS_SOURCES})
endif()
+ set_file_warnings(${THIS_SOURCES})
+
# define the export symbol of the module
string(REPLACE "-" "_" NAME_UPPER "${target}")
string(TOUPPER "${NAME_UPPER}" NAME_UPPER)
@@ -57,11 +74,31 @@ macro(sfml_add_library target)
# include the major version number in Windows shared library names (but not import library names)
set_target_properties(${target} PROPERTIES DEBUG_POSTFIX -d)
set_target_properties(${target} PROPERTIES SUFFIX "-${VERSION_MAJOR}${CMAKE_SHARED_LIBRARY_SUFFIX}")
+
+ # fill out all variables we use to generate the .rc file
+ string(TIMESTAMP RC_CURRENT_YEAR "%Y")
+ string(REGEX REPLACE "sfml-([a-z])([a-z]*)" "\\1" RC_MODULE_NAME_HEAD "${target}")
+ string(REGEX REPLACE "sfml-([a-z])([a-z]*)" "\\2" RC_MODULE_NAME_TAIL "${target}")
+ string(TOUPPER "${RC_MODULE_NAME_HEAD}" RC_MODULE_NAME_HEAD)
+ set(RC_MODULE_NAME "${RC_MODULE_NAME_HEAD}${RC_MODULE_NAME_TAIL}")
+ set(RC_VERSION_SUFFIX "") # Add something like the git revision short SHA-1 in the future
+ set(RC_PRERELEASE "0") # Set to 1 to mark the DLL as a pre-release DLL
+ set(RC_TARGET_NAME "${target}")
+ set(RC_TARGET_FILE_NAME_SUFFIX "-${VERSION_MAJOR}${CMAKE_SHARED_LIBRARY_SUFFIX}")
+
+ # generate the .rc file
+ configure_file(
+ "${SFML_SOURCE_DIR}/tools/windows/resource.rc.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/${target}.rc"
+ @ONLY
+ )
+ target_sources(${target} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${target}.rc")
+ source_group("" FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}.rc")
else()
set_target_properties(${target} PROPERTIES DEBUG_POSTFIX -d)
endif()
- if (SFML_OS_WINDOWS AND SFML_COMPILER_GCC)
- # on Windows/gcc get rid of "lib" prefix for shared libraries,
+ if (SFML_OS_WINDOWS AND (SFML_COMPILER_GCC OR SFML_COMPILER_CLANG))
+ # on Windows + gcc/clang get rid of "lib" prefix for shared libraries,
# and transform the ".dll.a" suffix into ".a" for import libraries
set_target_properties(${target} PROPERTIES PREFIX "")
set_target_properties(${target} PROPERTIES IMPORT_SUFFIX ".a")
@@ -140,9 +177,8 @@ macro(sfml_add_library target)
endif()
endif()
- # enable automatic reference counting on iOS
if (SFML_OS_IOS)
- set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES)
+ sfml_set_common_ios_properties(${target})
endif()
# sfml-activity library is our bootstrap activity and must not depend on stlport_shared
@@ -159,9 +195,9 @@ macro(sfml_add_library target)
# add the install rule
install(TARGETS ${target} EXPORT SFMLConfigExport
- RUNTIME DESTINATION bin COMPONENT bin
- LIBRARY DESTINATION lib${LIB_SUFFIX} COMPONENT bin
- ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT devel
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT bin
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT bin
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT devel
FRAMEWORK DESTINATION "." COMPONENT bin)
# add <project>/include as public include directory
@@ -207,12 +243,25 @@ macro(sfml_add_example target)
add_executable(${target} WIN32 ${target_input})
target_link_libraries(${target} PRIVATE sfml-main)
elseif(THIS_GUI_APP AND SFML_OS_IOS)
- add_executable(${target} MACOSX_BUNDLE ${target_input})
+
+ # For iOS apps we need the launch screen storyboard,
+ # and a custom info.plist to use it
+ SET(LAUNCH_SCREEN "${CMAKE_SOURCE_DIR}/examples/assets/LaunchScreen.storyboard")
+ SET(LOGO "${CMAKE_SOURCE_DIR}/examples/assets/logo.png")
+ SET(INFO_PLIST "${CMAKE_SOURCE_DIR}/examples/assets/info.plist")
+ SET(ICONS "${CMAKE_SOURCE_DIR}/examples/assets/icon.icns")
+ add_executable(${target} MACOSX_BUNDLE ${target_input} ${LAUNCH_SCREEN} ${LOGO} ${ICONS})
+ set(RESOURCES ${LAUNCH_SCREEN} ${LOGO} ${ICONS})
+ set_target_properties(${target} PROPERTIES RESOURCE "${RESOURCES}"
+ MACOSX_BUNDLE_INFO_PLIST ${INFO_PLIST}
+ MACOSX_BUNDLE_ICON_FILE icon.icns)
target_link_libraries(${target} PRIVATE sfml-main)
else()
add_executable(${target} ${target_input})
endif()
+ set_file_warnings(${target_input})
+
# set the debug suffix
set_target_properties(${target} PROPERTIES DEBUG_POSTFIX -d)
@@ -230,37 +279,53 @@ macro(sfml_add_example target)
target_link_libraries(${target} PRIVATE ${THIS_DEPENDS})
endif()
- # add the install rule
- install(TARGETS ${target}
- RUNTIME DESTINATION ${SFML_MISC_INSTALL_PREFIX}/examples/${target} COMPONENT examples
- BUNDLE DESTINATION ${SFML_MISC_INSTALL_PREFIX}/examples/${target} COMPONENT examples)
+ if (SFML_OS_IOS)
+ sfml_set_common_ios_properties(${target})
+ endif()
- # install the example's source code
- install(FILES ${THIS_SOURCES}
- DESTINATION ${SFML_MISC_INSTALL_PREFIX}/examples/${target}
- COMPONENT examples)
+endmacro()
- if (THIS_RESOURCES_DIR)
- # install the example's resources as well
- get_filename_component(THIS_RESOURCES_DIR "${THIS_RESOURCES_DIR}" ABSOLUTE)
+# add a new target which is a SFML test
+# example: sfml_add_test(sfml-test
+# ftp.cpp ...
+# sfml-network)
+function(sfml_add_test target SOURCES DEPENDS)
- if(NOT EXISTS "${THIS_RESOURCES_DIR}")
- message(FATAL_ERROR "Given resources directory to install does not exist: ${THIS_RESOURCES_DIR}")
- endif()
- install(DIRECTORY ${THIS_RESOURCES_DIR}
- DESTINATION ${SFML_MISC_INSTALL_PREFIX}/examples/${target}
- COMPONENT examples)
- endif()
+ # set a source group for the source files
+ source_group("" FILES ${SOURCES})
-endmacro()
+ # create the target
+ add_executable(${target} ${SOURCES})
+ # set the target's folder (for IDEs that support it, e.g. Visual Studio)
+ set_target_properties(${target} PROPERTIES FOLDER "Tests")
-# Find the requested package and make an INTERFACE library from it
-# Usage: sfml_find_package(wanted_target_name
-# [INCLUDE "OPENGL_INCLUDE_DIR"]
-# [LINK "OPENGL_gl_LIBRARY"])
-function(sfml_find_package)
- set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules/")
+ # link the target to its SFML dependencies
+ if(DEPENDS)
+ target_link_libraries(${target} PRIVATE ${DEPENDS})
+ endif()
+
+ # Add the test
+ add_test(${target} ${target})
+
+ # If building shared libs on windows we must copy the dependencies into the folder
+ if (WIN32 AND BUILD_SHARED_LIBS)
+ foreach (DEPENDENCY ${DEPENDS})
+ add_custom_command(TARGET ${target} PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy
+ $<TARGET_FILE:${DEPENDENCY}>
+ $<TARGET_FILE_DIR:${target}>)
+ endforeach()
+ endif()
+endfunction()
+
+# Create an interface library for an external dependency. This virtual target can provide
+# link specifications and include directories to be used by dependees.
+# The created INTERFACE library is tagged for export to be part of the generated SFMLConfig
+# Usage: sfml_add_external(target_name
+# [INCLUDE "extlibs/include"]
+# [LINK "extlibs/libfoo/libfoo.a"])
+function(sfml_add_external)
list(GET ARGN 0 target)
list(REMOVE_AT ARGN 0)
@@ -273,34 +338,73 @@ function(sfml_find_package)
message(FATAL_ERROR "Unknown arguments when calling sfml_import_library: ${THIS_UNPARSED_ARGUMENTS}")
endif()
- if (SFML_OS_IOS)
- find_host_package(${target} REQUIRED)
- else()
- find_package(${target} REQUIRED)
- endif()
-
add_library(${target} INTERFACE)
if (THIS_INCLUDE)
- foreach(include_dir IN LISTS "${THIS_INCLUDE}")
+ foreach(include_dir IN LISTS THIS_INCLUDE)
if (NOT include_dir)
message(FATAL_ERROR "No path given for include dir ${THIS_INCLUDE}")
endif()
- target_include_directories(${target} INTERFACE "$<BUILD_INTERFACE:${include_dir}>")
+ target_include_directories(${target} SYSTEM INTERFACE "$<BUILD_INTERFACE:${include_dir}>")
endforeach()
endif()
if (THIS_LINK)
- foreach(link_item IN LISTS ${THIS_LINK})
+ foreach(link_item IN LISTS THIS_LINK)
if (NOT link_item)
message(FATAL_ERROR "Missing item in ${THIS_LINK}")
endif()
target_link_libraries(${target} INTERFACE "$<BUILD_INTERFACE:${link_item}>")
endforeach()
endif()
+
install(TARGETS ${target} EXPORT SFMLConfigExport)
endfunction()
+# Find the requested package and make an INTERFACE library from it
+# The created INTERFACE library is tagged for export to be part of the generated SFMLConfig
+# Usage: sfml_find_package(wanted_target_name
+# [INCLUDE "OPENGL_INCLUDE_DIR"]
+# [LINK "OPENGL_gl_LIBRARY"])
+function(sfml_find_package)
+ list(GET ARGN 0 target)
+ list(REMOVE_AT ARGN 0)
+
+ if (TARGET ${target})
+ message(FATAL_ERROR "Target '${target}' is already defined")
+ endif()
+
+ cmake_parse_arguments(THIS "" "" "INCLUDE;LINK" ${ARGN})
+ if (THIS_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Unknown arguments when calling sfml_import_library: ${THIS_UNPARSED_ARGUMENTS}")
+ endif()
+
+ list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules/")
+ if (SFML_OS_IOS)
+ find_host_package(${target} REQUIRED)
+ else()
+ find_package(${target} REQUIRED)
+ endif()
+
+ # Make sure to interpret the items in INCLUDE and LINK parameters. sfml_add_external()
+ # does not interpret given items in order to also accept parameters that must not be interpreted
+ set(LINK_LIST "")
+ if (THIS_LINK)
+ foreach(link_item IN LISTS THIS_LINK)
+ list(APPEND LINK_LIST "${${link_item}}")
+ endforeach()
+ endif()
+
+ set(INCLUDE_LIST "")
+ if (THIS_INCLUDE)
+ foreach(include_dir IN LISTS THIS_INCLUDE)
+ list(APPEND INCLUDE_LIST "${${include_dir}}")
+ endforeach()
+ endif()
+
+ sfml_add_external(${target} INCLUDE ${INCLUDE_LIST} LINK ${LINK_LIST})
+endfunction()
+
# Generate a SFMLConfig.cmake file (and associated files) from the targets registered against
# the EXPORT name "SFMLConfigExport" (EXPORT parameter of install(TARGETS))
function(sfml_export_targets)
@@ -325,7 +429,7 @@ function(sfml_export_targets)
if (SFML_BUILD_FRAMEWORKS)
set(config_package_location "SFML.framework/Resources/CMake")
else()
- set(config_package_location lib${LIB_SUFFIX}/cmake/SFML)
+ set(config_package_location ${CMAKE_INSTALL_LIBDIR}/cmake/SFML)
endif()
configure_package_config_file("${CURRENT_DIR}/SFMLConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/SFMLConfig.cmake"
INSTALL_DESTINATION "${config_package_location}")
@@ -343,4 +447,3 @@ function(sfml_export_targets)
DESTINATION ${config_package_location}
COMPONENT devel)
endfunction()
-
diff --git a/cmake/Modules/FindDRM.cmake b/cmake/Modules/FindDRM.cmake
new file mode 100644
index 0000000..23b38b1
--- /dev/null
+++ b/cmake/Modules/FindDRM.cmake
@@ -0,0 +1,18 @@
+#
+# Try to find EGL library and include path.
+# Once done this will define
+#
+# DRM_FOUND
+# DRM_INCLUDE_PATH
+# DRM_LIBRARY
+#
+
+if(PKG_CONFIG_FOUND)
+ pkg_check_modules(PC_DRM drm QUIET)
+endif()
+
+find_path(DRM_INCLUDE_DIR NAMES libdrm/drm.h)
+find_library(DRM_LIBRARY NAMES drm)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(DRM DEFAULT_MSG DRM_LIBRARY DRM_INCLUDE_DIR)
diff --git a/cmake/Modules/FindGBM.cmake b/cmake/Modules/FindGBM.cmake
new file mode 100644
index 0000000..4deb5eb
--- /dev/null
+++ b/cmake/Modules/FindGBM.cmake
@@ -0,0 +1,18 @@
+#
+# Try to find GBM library and include path.
+# Once done this will define
+#
+# GBM_FOUND
+# GBM_INCLUDE_PATH
+# GBM_LIBRARY
+#
+
+if(PKG_CONFIG_FOUND)
+ pkg_check_modules(PC_GBM gbm QUIET)
+endif()
+
+find_path(GBM_INCLUDE_DIR NAMES gbm.h)
+find_library(GBM_LIBRARY NAMES gbm)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(GBM DEFAULT_MSG GBM_LIBRARY GBM_INCLUDE_DIR)
diff --git a/cmake/Modules/FindVorbis.cmake b/cmake/Modules/FindVORBIS.cmake
index e285411..e285411 100644
--- a/cmake/Modules/FindVorbis.cmake
+++ b/cmake/Modules/FindVORBIS.cmake
diff --git a/cmake/SFMLConfig.cmake.in b/cmake/SFMLConfig.cmake.in
index ce81953..8731cba 100644
--- a/cmake/SFMLConfig.cmake.in
+++ b/cmake/SFMLConfig.cmake.in
@@ -14,7 +14,7 @@
# example:
# find_package(SFML COMPONENTS ...) # no specific version required
# find_package(SFML 2 COMPONENTS ...) # any 2.x version
-# find_package(SFML 2.4 COMPONENTS ...) # version 2.4 or greater
+# find_package(SFML 2.6 COMPONENTS ...) # version 2.6 or greater
#
# By default, the dynamic libraries of SFML will be found. To find the static ones instead,
# you must set the SFML_STATIC_LIBRARIES variable to TRUE before calling find_package(SFML ...).
@@ -63,23 +63,7 @@ if (NOT SFML_FIND_COMPONENTS)
message(FATAL_ERROR "find_package(SFML) called with no component")
endif()
-set(FIND_SFML_PATHS
- "${CMAKE_CURRENT_LIST_DIR}/../.."
- ${SFML_ROOT}
- $ENV{SFML_ROOT}
- ~/Library/Frameworks
- /Library/Frameworks
- /usr/local
- /usr
- /sw
- /opt/local
- /opt/csw
- /opt)
-
-find_path(SFML_DOC_DIR SFML.tag
- PATH_SUFFIXES SFML/doc share/SFML/doc
- PATHS ${FIND_SFML_PATHS})
-
+set(SFML_DOC_PATH "/usr/share/doc/libsfml-dev")
# Update requested components (eg. request window component if graphics component was requested)
set(FIND_SFML_SYSTEM_DEPENDENCIES "")
diff --git a/cmake/SFMLConfigDependencies.cmake.in b/cmake/SFMLConfigDependencies.cmake.in
index 1028110..0737ec5 100644
--- a/cmake/SFMLConfigDependencies.cmake.in
+++ b/cmake/SFMLConfigDependencies.cmake.in
@@ -10,6 +10,10 @@ if(SFML_STATIC_LIBRARIES)
set(FIND_SFML_OS_WINDOWS 1)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(FIND_SFML_OS_LINUX 1)
+
+ if(@SFML_USE_DRM@)
+ set(FIND_SFML_USE_DRM 1)
+ endif()
elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
set(FIND_SFML_OS_FREEBSD 1)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
@@ -44,9 +48,13 @@ if(SFML_STATIC_LIBRARIES)
# sfml-window
list(FIND SFML_FIND_COMPONENTS "window" FIND_SFML_WINDOW_COMPONENT_INDEX)
if(FIND_SFML_WINDOW_COMPONENT_INDEX GREATER -1)
- if(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD)
+ if(FIND_SFML_USE_DRM)
+ sfml_bind_dependency(TARGET DRM FRIENDLY_NAME "drm" SEARCH_NAMES "drm")
+ sfml_bind_dependency(TARGET GBM FRIENDLY_NAME "gbm" SEARCH_NAMES "gbm")
+ elseif(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD)
sfml_bind_dependency(TARGET X11 FRIENDLY_NAME "X11" SEARCH_NAMES "X11")
sfml_bind_dependency(TARGET X11 FRIENDLY_NAME "Xrandr" SEARCH_NAMES "Xrandr")
+ sfml_bind_dependency(TARGET X11 FRIENDLY_NAME "Xcursor" SEARCH_NAMES "Xcursor")
endif()
if(FIND_SFML_OS_LINUX)
@@ -71,11 +79,11 @@ if(SFML_STATIC_LIBRARIES)
if(FIND_SFML_AUDIO_COMPONENT_INDEX GREATER -1)
sfml_bind_dependency(TARGET OpenAL FRIENDLY_NAME "OpenAL" SEARCH_NAMES "OpenAL" "openal" "openal32")
if (NOT FIND_SFML_OS_IOS)
- sfml_bind_dependency(TARGET Vorbis FRIENDLY_NAME "VorbisFile" SEARCH_NAMES "vorbisfile")
- sfml_bind_dependency(TARGET Vorbis FRIENDLY_NAME "VorbisEnc" SEARCH_NAMES "vorbisenc")
+ sfml_bind_dependency(TARGET VORBIS FRIENDLY_NAME "VorbisFile" SEARCH_NAMES "vorbisfile")
+ sfml_bind_dependency(TARGET VORBIS FRIENDLY_NAME "VorbisEnc" SEARCH_NAMES "vorbisenc")
endif()
- sfml_bind_dependency(TARGET Vorbis FRIENDLY_NAME "Vorbis" SEARCH_NAMES "vorbis")
- sfml_bind_dependency(TARGET Vorbis FRIENDLY_NAME "Ogg" SEARCH_NAMES "ogg")
+ sfml_bind_dependency(TARGET VORBIS FRIENDLY_NAME "Vorbis" SEARCH_NAMES "vorbis")
+ sfml_bind_dependency(TARGET VORBIS FRIENDLY_NAME "Ogg" SEARCH_NAMES "ogg")
sfml_bind_dependency(TARGET FLAC FRIENDLY_NAME "FLAC" SEARCH_NAMES "FLAC")
endif()
diff --git a/cmake/toolchains/android.toolchain.cmake b/cmake/toolchains/android.toolchain.cmake
deleted file mode 100644
index ee28e51..0000000
--- a/cmake/toolchains/android.toolchain.cmake
+++ /dev/null
@@ -1,1666 +0,0 @@
-# Copyright (c) 2010-2011, Ethan Rublee
-# Copyright (c) 2011-2014, Andrey Kamaev
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# 1. Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-#
-# 3. Neither the name of the copyright holder nor the names of its
-# contributors may be used to endorse or promote products derived from this
-# software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-
-# ------------------------------------------------------------------------------
-# Android CMake toolchain file, for use with the Android NDK r5-r10d
-# Requires cmake 2.6.3 or newer (2.8.9 or newer is recommended).
-# See home page: https://github.com/taka-no-me/android-cmake
-#
-# Usage Linux:
-# $ export ANDROID_NDK=/absolute/path/to/the/android-ndk
-# $ mkdir build && cd build
-# $ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/the/android.toolchain.cmake ..
-# $ make -j8
-#
-# Usage Windows:
-# You need native port of make to build your project.
-# Android NDK r7 (and newer) already has make.exe on board.
-# For older NDK you have to install it separately.
-# For example, this one: http://gnuwin32.sourceforge.net/packages/make.htm
-#
-# $ SET ANDROID_NDK=C:\absolute\path\to\the\android-ndk
-# $ mkdir build && cd build
-# $ cmake.exe -G"MinGW Makefiles"
-# -DCMAKE_TOOLCHAIN_FILE=path\to\the\android.toolchain.cmake
-# -DCMAKE_MAKE_PROGRAM="%ANDROID_NDK%\prebuilt\windows\bin\make.exe" ..
-# $ cmake.exe --build .
-#
-#
-# Options (can be set as cmake parameters: -D<option_name>=<value>):
-# ANDROID_NDK=/opt/android-ndk - path to the NDK root.
-# Can be set as environment variable. Can be set only at first cmake run.
-#
-# ANDROID_ABI=armeabi-v7a - specifies the target Application Binary
-# Interface (ABI). This option nearly matches to the APP_ABI variable
-# used by ndk-build tool from Android NDK.
-#
-# Possible targets are:
-# "armeabi" - ARMv5TE based CPU with software floating point operations
-# "armeabi-v7a" - ARMv7 based devices with hardware FPU instructions
-# this ABI target is used by default
-# "armeabi-v7a with NEON" - same as armeabi-v7a, but
-# sets NEON as floating-point unit
-# "armeabi-v7a with VFPV3" - same as armeabi-v7a, but
-# sets VFPV3 as floating-point unit (has 32 registers instead of 16)
-# "armeabi-v6 with VFP" - tuned for ARMv6 processors having VFP
-# "x86" - IA-32 instruction set
-# "mips" - MIPS32 instruction set
-#
-# 64-bit ABIs for NDK r10 and newer:
-# "arm64-v8a" - ARMv8 AArch64 instruction set
-# "x86_64" - Intel64 instruction set (r1)
-# "mips64" - MIPS64 instruction set (r6)
-#
-# ANDROID_NATIVE_API_LEVEL=android-8 - level of Android API compile for.
-# Option is read-only when standalone toolchain is used.
-# Note: building for "android-L" requires explicit configuration.
-#
-# ANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 - the name of compiler
-# toolchain to be used. The list of possible values depends on the NDK
-# version. For NDK r10c the possible values are:
-#
-# * aarch64-linux-android-4.9
-# * aarch64-linux-android-clang3.4
-# * aarch64-linux-android-clang3.5
-# * arm-linux-androideabi-4.6
-# * arm-linux-androideabi-4.8
-# * arm-linux-androideabi-4.9 (default)
-# * arm-linux-androideabi-clang3.4
-# * arm-linux-androideabi-clang3.5
-# * mips64el-linux-android-4.9
-# * mips64el-linux-android-clang3.4
-# * mips64el-linux-android-clang3.5
-# * mipsel-linux-android-4.6
-# * mipsel-linux-android-4.8
-# * mipsel-linux-android-4.9
-# * mipsel-linux-android-clang3.4
-# * mipsel-linux-android-clang3.5
-# * x86-4.6
-# * x86-4.8
-# * x86-4.9
-# * x86-clang3.4
-# * x86-clang3.5
-# * x86_64-4.9
-# * x86_64-clang3.4
-# * x86_64-clang3.5
-#
-# ANDROID_FORCE_ARM_BUILD=OFF - set ON to generate 32-bit ARM instructions
-# instead of Thumb. Is not available for "armeabi-v6 with VFP"
-# (is forced to be ON) ABI.
-#
-# ANDROID_NO_UNDEFINED=ON - set ON to show all undefined symbols as linker
-# errors even if they are not used.
-#
-# ANDROID_SO_UNDEFINED=OFF - set ON to allow undefined symbols in shared
-# libraries. Automatically turned for NDK r5x and r6x due to GLESv2
-# problems.
-#
-# ANDROID_STL=gnustl_static - specify the runtime to use.
-#
-# Possible values are:
-# none -> Do not configure the runtime.
-# system -> Use the default minimal system C++ runtime library.
-# Implies -fno-rtti -fno-exceptions.
-# Is not available for standalone toolchain.
-# system_re -> Use the default minimal system C++ runtime library.
-# Implies -frtti -fexceptions.
-# Is not available for standalone toolchain.
-# gabi++_static -> Use the GAbi++ runtime as a static library.
-# Implies -frtti -fno-exceptions.
-# Available for NDK r7 and newer.
-# Is not available for standalone toolchain.
-# gabi++_shared -> Use the GAbi++ runtime as a shared library.
-# Implies -frtti -fno-exceptions.
-# Available for NDK r7 and newer.
-# Is not available for standalone toolchain.
-# stlport_static -> Use the STLport runtime as a static library.
-# Implies -fno-rtti -fno-exceptions for NDK before r7.
-# Implies -frtti -fno-exceptions for NDK r7 and newer.
-# Is not available for standalone toolchain.
-# stlport_shared -> Use the STLport runtime as a shared library.
-# Implies -fno-rtti -fno-exceptions for NDK before r7.
-# Implies -frtti -fno-exceptions for NDK r7 and newer.
-# Is not available for standalone toolchain.
-# gnustl_static -> Use the GNU STL as a static library.
-# Implies -frtti -fexceptions.
-# gnustl_shared -> Use the GNU STL as a shared library.
-# Implies -frtti -fno-exceptions.
-# Available for NDK r7b and newer.
-# Silently degrades to gnustl_static if not available.
-# c++_static -> Use libc++ as a static library.
-# c++_shared -> Use libc++ as a shared library.
-#
-# ANDROID_STL_FORCE_FEATURES=ON - turn rtti and exceptions support based on
-# chosen runtime. If disabled, then the user is responsible for settings
-# these options.
-#
-# What?:
-# android-cmake toolchain searches for NDK/toolchain in the following order:
-# ANDROID_NDK - cmake parameter
-# ANDROID_NDK - environment variable
-# ANDROID_STANDALONE_TOOLCHAIN - cmake parameter
-# ANDROID_STANDALONE_TOOLCHAIN - environment variable
-# ANDROID_NDK - default locations
-# ANDROID_STANDALONE_TOOLCHAIN - default locations
-#
-# Make sure to do the following in your scripts:
-# SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${my_cxx_flags}" )
-# SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${my_cxx_flags}" )
-# The flags will be prepopulated with critical flags, so don't loose them.
-# Also be aware that toolchain also sets configuration-specific compiler
-# flags and linker flags.
-#
-# ANDROID and BUILD_ANDROID will be set to true, you may test any of these
-# variables to make necessary Android-specific configuration changes.
-#
-# Also ARMEABI or ARMEABI_V7A or X86 or MIPS or ARM64_V8A or X86_64 or MIPS64
-# will be set true, mutually exclusive. NEON option will be set true
-# if VFP is set to NEON.
-#
-# ------------------------------------------------------------------------------
-
-cmake_minimum_required( VERSION 2.6.3 )
-
-if( DEFINED CMAKE_CROSSCOMPILING )
- # subsequent toolchain loading is not really needed
- return()
-endif()
-
-if( CMAKE_TOOLCHAIN_FILE )
- # touch toolchain variable to suppress "unused variable" warning
-endif()
-
-# inherit settings in recursive loads
-get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE )
-if( _CMAKE_IN_TRY_COMPILE )
- include( "${CMAKE_CURRENT_SOURCE_DIR}/../android.toolchain.config.cmake" OPTIONAL )
-endif()
-
-# this one is important
-if( CMAKE_VERSION VERSION_GREATER "3.0.99" )
- set( CMAKE_SYSTEM_NAME Android )
-else()
- set( CMAKE_SYSTEM_NAME Linux )
-endif()
-
-# this one not so much
-set( CMAKE_SYSTEM_VERSION 1 )
-
-# rpath makes low sense for Android
-set( CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "" )
-set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." )
-
-# NDK search paths
-set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r10d -r10c -r10b -r10 -r9d -r9c -r9b -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
-if( NOT DEFINED ANDROID_NDK_SEARCH_PATHS )
- if( CMAKE_HOST_WIN32 )
- file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS )
- set( ANDROID_NDK_SEARCH_PATHS "${ANDROID_NDK_SEARCH_PATHS}" "$ENV{SystemDrive}/NVPACK" )
- else()
- file( TO_CMAKE_PATH "$ENV{HOME}" ANDROID_NDK_SEARCH_PATHS )
- set( ANDROID_NDK_SEARCH_PATHS /opt "${ANDROID_NDK_SEARCH_PATHS}/NVPACK" )
- endif()
-endif()
-if( NOT DEFINED ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH )
- set( ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH /opt/android-toolchain )
-endif()
-
-# known ABIs
-set( ANDROID_SUPPORTED_ABIS_arm "armeabi-v7a;armeabi;armeabi-v7a with NEON;armeabi-v7a with VFPV3;armeabi-v6 with VFP" )
-set( ANDROID_SUPPORTED_ABIS_arm64 "arm64-v8a" )
-set( ANDROID_SUPPORTED_ABIS_x86 "x86" )
-set( ANDROID_SUPPORTED_ABIS_x86_64 "x86_64" )
-set( ANDROID_SUPPORTED_ABIS_mips "mips" )
-set( ANDROID_SUPPORTED_ABIS_mips64 "mips64" )
-
-# API level defaults
-set( ANDROID_DEFAULT_NDK_API_LEVEL 8 )
-set( ANDROID_DEFAULT_NDK_API_LEVEL_arm64 21 )
-set( ANDROID_DEFAULT_NDK_API_LEVEL_x86 9 )
-set( ANDROID_DEFAULT_NDK_API_LEVEL_x86_64 21 )
-set( ANDROID_DEFAULT_NDK_API_LEVEL_mips 9 )
-set( ANDROID_DEFAULT_NDK_API_LEVEL_mips64 21 )
-
-
-macro( __LIST_FILTER listvar regex )
- if( ${listvar} )
- foreach( __val ${${listvar}} )
- if( __val MATCHES "${regex}" )
- list( REMOVE_ITEM ${listvar} "${__val}" )
- endif()
- endforeach()
- endif()
-endmacro()
-
-macro( __INIT_VARIABLE var_name )
- set( __test_path 0 )
- foreach( __var ${ARGN} )
- if( __var STREQUAL "PATH" )
- set( __test_path 1 )
- break()
- endif()
- endforeach()
-
- if( __test_path AND NOT EXISTS "${${var_name}}" )
- unset( ${var_name} CACHE )
- endif()
-
- if( " ${${var_name}}" STREQUAL " " )
- set( __values 0 )
- foreach( __var ${ARGN} )
- if( __var STREQUAL "VALUES" )
- set( __values 1 )
- elseif( NOT __var STREQUAL "PATH" )
- if( __var MATCHES "^ENV_.*$" )
- string( REPLACE "ENV_" "" __var "${__var}" )
- set( __value "$ENV{${__var}}" )
- elseif( DEFINED ${__var} )
- set( __value "${${__var}}" )
- elseif( __values )
- set( __value "${__var}" )
- else()
- set( __value "" )
- endif()
-
- if( NOT " ${__value}" STREQUAL " " AND (NOT __test_path OR EXISTS "${__value}") )
- set( ${var_name} "${__value}" )
- break()
- endif()
- endif()
- endforeach()
- unset( __value )
- unset( __values )
- endif()
-
- if( __test_path )
- file( TO_CMAKE_PATH "${${var_name}}" ${var_name} )
- endif()
- unset( __test_path )
-endmacro()
-
-macro( __DETECT_NATIVE_API_LEVEL _var _path )
- set( __ndkApiLevelRegex "^[\t ]*#define[\t ]+__ANDROID_API__[\t ]+([0-9]+)[\t ]*.*$" )
- file( STRINGS ${_path} __apiFileContent REGEX "${__ndkApiLevelRegex}" )
- if( NOT __apiFileContent )
- message( SEND_ERROR "Could not get Android native API level. Probably you have specified invalid level value, or your copy of NDK/toolchain is broken." )
- endif()
- string( REGEX REPLACE "${__ndkApiLevelRegex}" "\\1" ${_var} "${__apiFileContent}" )
- unset( __apiFileContent )
- unset( __ndkApiLevelRegex )
-endmacro()
-
-macro( __DETECT_TOOLCHAIN_MACHINE_NAME _var _root )
- if( EXISTS "${_root}" )
- file( GLOB __gccExePath RELATIVE "${_root}/bin/" "${_root}/bin/*-gcc${TOOL_OS_SUFFIX}" )
- __LIST_FILTER( __gccExePath "^[.].*" )
- list( LENGTH __gccExePath __gccExePathsCount )
- if( NOT __gccExePathsCount EQUAL 1 AND NOT _CMAKE_IN_TRY_COMPILE )
- message( WARNING "Could not determine machine name for compiler from ${_root}" )
- set( ${_var} "" )
- else()
- get_filename_component( __gccExeName "${__gccExePath}" NAME_WE )
- string( REPLACE "-gcc" "" ${_var} "${__gccExeName}" )
- endif()
- unset( __gccExePath )
- unset( __gccExePathsCount )
- unset( __gccExeName )
- else()
- set( ${_var} "" )
- endif()
-endmacro()
-
-
-# fight against cygwin
-set( ANDROID_FORBID_SYGWIN TRUE CACHE BOOL "Prevent cmake from working under cygwin and using cygwin tools")
-mark_as_advanced( ANDROID_FORBID_SYGWIN )
-if( ANDROID_FORBID_SYGWIN )
- if( CYGWIN )
- message( FATAL_ERROR "Android NDK and android-cmake toolchain are not welcome Cygwin. It is unlikely that this cmake toolchain will work under cygwin. But if you want to try then you can set cmake variable ANDROID_FORBID_SYGWIN to FALSE and rerun cmake." )
- endif()
-
- if( CMAKE_HOST_WIN32 )
- # remove cygwin from PATH
- set( __new_path "$ENV{PATH}")
- __LIST_FILTER( __new_path "cygwin" )
- set(ENV{PATH} "${__new_path}")
- unset(__new_path)
- endif()
-endif()
-
-
-# detect current host platform
-if( NOT DEFINED ANDROID_NDK_HOST_X64 AND (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64" OR CMAKE_HOST_APPLE) )
- set( ANDROID_NDK_HOST_X64 1 CACHE BOOL "Try to use 64-bit compiler toolchain" )
- mark_as_advanced( ANDROID_NDK_HOST_X64 )
-endif()
-
-set( TOOL_OS_SUFFIX "" )
-if( CMAKE_HOST_APPLE )
- set( ANDROID_NDK_HOST_SYSTEM_NAME "darwin-x86_64" )
- set( ANDROID_NDK_HOST_SYSTEM_NAME2 "darwin-x86" )
-elseif( CMAKE_HOST_WIN32 )
- set( ANDROID_NDK_HOST_SYSTEM_NAME "windows-x86_64" )
- set( ANDROID_NDK_HOST_SYSTEM_NAME2 "windows" )
- set( TOOL_OS_SUFFIX ".exe" )
-elseif( CMAKE_HOST_UNIX )
- set( ANDROID_NDK_HOST_SYSTEM_NAME "linux-x86_64" )
- set( ANDROID_NDK_HOST_SYSTEM_NAME2 "linux-x86" )
-else()
- message( FATAL_ERROR "Cross-compilation on your platform is not supported by this cmake toolchain" )
-endif()
-
-if( NOT ANDROID_NDK_HOST_X64 )
- set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} )
-endif()
-
-# see if we have path to Android NDK
-if( NOT ANDROID_NDK AND NOT ANDROID_STANDALONE_TOOLCHAIN )
- __INIT_VARIABLE( ANDROID_NDK PATH ENV_ANDROID_NDK )
-endif()
-if( NOT ANDROID_NDK )
- # see if we have path to Android standalone toolchain
- __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ENV_ANDROID_STANDALONE_TOOLCHAIN )
-
- if( NOT ANDROID_STANDALONE_TOOLCHAIN )
- #try to find Android NDK in one of the the default locations
- set( __ndkSearchPaths )
- foreach( __ndkSearchPath ${ANDROID_NDK_SEARCH_PATHS} )
- foreach( suffix ${ANDROID_SUPPORTED_NDK_VERSIONS} )
- list( APPEND __ndkSearchPaths "${__ndkSearchPath}/android-ndk${suffix}" )
- endforeach()
- endforeach()
- __INIT_VARIABLE( ANDROID_NDK PATH VALUES ${__ndkSearchPaths} )
- unset( __ndkSearchPaths )
-
- if( ANDROID_NDK )
- message( STATUS "Using default path for Android NDK: ${ANDROID_NDK}" )
- message( STATUS " If you prefer to use a different location, please define a cmake or environment variable: ANDROID_NDK" )
- else()
- #try to find Android standalone toolchain in one of the the default locations
- __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH )
-
- if( ANDROID_STANDALONE_TOOLCHAIN )
- message( STATUS "Using default path for standalone toolchain ${ANDROID_STANDALONE_TOOLCHAIN}" )
- message( STATUS " If you prefer to use a different location, please define the variable: ANDROID_STANDALONE_TOOLCHAIN" )
- endif( ANDROID_STANDALONE_TOOLCHAIN )
- endif( ANDROID_NDK )
- endif( NOT ANDROID_STANDALONE_TOOLCHAIN )
-endif( NOT ANDROID_NDK )
-
-# remember found paths
-if( ANDROID_NDK )
- get_filename_component( ANDROID_NDK "${ANDROID_NDK}" ABSOLUTE )
- set( ANDROID_NDK "${ANDROID_NDK}" CACHE INTERNAL "Path of the Android NDK" FORCE )
- set( BUILD_WITH_ANDROID_NDK True )
- if( EXISTS "${ANDROID_NDK}/RELEASE.TXT" )
- file( STRINGS "${ANDROID_NDK}/RELEASE.TXT" ANDROID_NDK_RELEASE_FULL LIMIT_COUNT 1 REGEX "r[0-9]+[a-z]?" )
- string( REGEX MATCH "r([0-9]+)([a-z]?)" ANDROID_NDK_RELEASE "${ANDROID_NDK_RELEASE_FULL}" )
- else()
- set( ANDROID_NDK_RELEASE "r1x" )
- set( ANDROID_NDK_RELEASE_FULL "unreleased" )
- endif()
- string( REGEX REPLACE "r([0-9]+)([a-z]?)" "\\1*1000" ANDROID_NDK_RELEASE_NUM "${ANDROID_NDK_RELEASE}" )
- string( FIND " abcdefghijklmnopqastuvwxyz" "${CMAKE_MATCH_2}" __ndkReleaseLetterNum )
- math( EXPR ANDROID_NDK_RELEASE_NUM "${ANDROID_NDK_RELEASE_NUM}+${__ndkReleaseLetterNum}" )
-elseif( ANDROID_STANDALONE_TOOLCHAIN )
- get_filename_component( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" ABSOLUTE )
- # try to detect change
- if( CMAKE_AR )
- string( LENGTH "${ANDROID_STANDALONE_TOOLCHAIN}" __length )
- string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidStandaloneToolchainPreviousPath )
- if( NOT __androidStandaloneToolchainPreviousPath STREQUAL ANDROID_STANDALONE_TOOLCHAIN )
- message( FATAL_ERROR "It is not possible to change path to the Android standalone toolchain on subsequent run." )
- endif()
- unset( __androidStandaloneToolchainPreviousPath )
- unset( __length )
- endif()
- set( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" CACHE INTERNAL "Path of the Android standalone toolchain" FORCE )
- set( BUILD_WITH_STANDALONE_TOOLCHAIN True )
-else()
- list(GET ANDROID_NDK_SEARCH_PATHS 0 ANDROID_NDK_SEARCH_PATH)
- message( FATAL_ERROR "Could not find neither Android NDK nor Android standalone toolchain.
- You should either set an environment variable:
- export ANDROID_NDK=~/my-android-ndk
- or
- export ANDROID_STANDALONE_TOOLCHAIN=~/my-android-toolchain
- or put the toolchain or NDK in the default path:
- sudo ln -s ~/my-android-ndk ${ANDROID_NDK_SEARCH_PATH}/android-ndk
- sudo ln -s ~/my-android-toolchain ${ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH}" )
-endif()
-
-# android NDK layout
-if( BUILD_WITH_ANDROID_NDK )
- if( NOT DEFINED ANDROID_NDK_LAYOUT )
- # try to automatically detect the layout
- if( EXISTS "${ANDROID_NDK}/RELEASE.TXT")
- set( ANDROID_NDK_LAYOUT "RELEASE" )
- elseif( EXISTS "${ANDROID_NDK}/../../linux-x86/toolchain/" )
- set( ANDROID_NDK_LAYOUT "LINARO" )
- elseif( EXISTS "${ANDROID_NDK}/../../gcc/" )
- set( ANDROID_NDK_LAYOUT "ANDROID" )
- endif()
- endif()
- set( ANDROID_NDK_LAYOUT "${ANDROID_NDK_LAYOUT}" CACHE STRING "The inner layout of NDK" )
- mark_as_advanced( ANDROID_NDK_LAYOUT )
- if( ANDROID_NDK_LAYOUT STREQUAL "LINARO" )
- set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) # only 32-bit at the moment
- set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/../../${ANDROID_NDK_HOST_SYSTEM_NAME}/toolchain" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH "" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "" )
- elseif( ANDROID_NDK_LAYOUT STREQUAL "ANDROID" )
- set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) # only 32-bit at the moment
- set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/../../gcc/${ANDROID_NDK_HOST_SYSTEM_NAME}/arm" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH "" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "" )
- else() # ANDROID_NDK_LAYOUT STREQUAL "RELEASE"
- set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/toolchains" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH "/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME2}" )
- endif()
- get_filename_component( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK_TOOLCHAINS_PATH}" ABSOLUTE )
-
- # try to detect change of NDK
- if( CMAKE_AR )
- string( LENGTH "${ANDROID_NDK_TOOLCHAINS_PATH}" __length )
- string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidNdkPreviousPath )
- if( NOT __androidNdkPreviousPath STREQUAL ANDROID_NDK_TOOLCHAINS_PATH )
- message( FATAL_ERROR "It is not possible to change the path to the NDK on subsequent CMake run. You must remove all generated files from your build folder first.
- " )
- endif()
- unset( __androidNdkPreviousPath )
- unset( __length )
- endif()
-endif()
-
-
-# get all the details about standalone toolchain
-if( BUILD_WITH_STANDALONE_TOOLCHAIN )
- __DETECT_NATIVE_API_LEVEL( ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot/usr/include/android/api-level.h" )
- set( ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
- set( __availableToolchains "standalone" )
- __DETECT_TOOLCHAIN_MACHINE_NAME( __availableToolchainMachines "${ANDROID_STANDALONE_TOOLCHAIN}" )
- if( NOT __availableToolchainMachines )
- message( FATAL_ERROR "Could not determine machine name of your toolchain. Probably your Android standalone toolchain is broken." )
- endif()
- if( __availableToolchainMachines MATCHES x86_64 )
- set( __availableToolchainArchs "x86_64" )
- elseif( __availableToolchainMachines MATCHES i686 )
- set( __availableToolchainArchs "x86" )
- elseif( __availableToolchainMachines MATCHES aarch64 )
- set( __availableToolchainArchs "arm64" )
- elseif( __availableToolchainMachines MATCHES arm )
- set( __availableToolchainArchs "arm" )
- elseif( __availableToolchainMachines MATCHES mips64el )
- set( __availableToolchainArchs "mips64" )
- elseif( __availableToolchainMachines MATCHES mipsel )
- set( __availableToolchainArchs "mips" )
- endif()
- execute_process( COMMAND "${ANDROID_STANDALONE_TOOLCHAIN}/bin/${__availableToolchainMachines}-gcc${TOOL_OS_SUFFIX}" -dumpversion
- OUTPUT_VARIABLE __availableToolchainCompilerVersions OUTPUT_STRIP_TRAILING_WHITESPACE )
- string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9]+)?" __availableToolchainCompilerVersions "${__availableToolchainCompilerVersions}" )
- if( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/bin/clang${TOOL_OS_SUFFIX}" )
- list( APPEND __availableToolchains "standalone-clang" )
- list( APPEND __availableToolchainMachines ${__availableToolchainMachines} )
- list( APPEND __availableToolchainArchs ${__availableToolchainArchs} )
- list( APPEND __availableToolchainCompilerVersions ${__availableToolchainCompilerVersions} )
- endif()
-endif()
-
-macro( __GLOB_NDK_TOOLCHAINS __availableToolchainsVar __availableToolchainsLst __toolchain_subpath )
- foreach( __toolchain ${${__availableToolchainsLst}} )
- if( "${__toolchain}" MATCHES "-clang3[.][0-9]$" AND NOT EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/${__toolchain}${__toolchain_subpath}" )
- SET( __toolchainVersionRegex "^TOOLCHAIN_VERSION[\t ]+:=[\t ]+(.*)$" )
- FILE( STRINGS "${ANDROID_NDK_TOOLCHAINS_PATH}/${__toolchain}/setup.mk" __toolchainVersionStr REGEX "${__toolchainVersionRegex}" )
- if( __toolchainVersionStr )
- string( REGEX REPLACE "${__toolchainVersionRegex}" "\\1" __toolchainVersionStr "${__toolchainVersionStr}" )
- string( REGEX REPLACE "-clang3[.][0-9]$" "-${__toolchainVersionStr}" __gcc_toolchain "${__toolchain}" )
- else()
- string( REGEX REPLACE "-clang3[.][0-9]$" "-4.6" __gcc_toolchain "${__toolchain}" )
- endif()
- unset( __toolchainVersionStr )
- unset( __toolchainVersionRegex )
- else()
- set( __gcc_toolchain "${__toolchain}" )
- endif()
- __DETECT_TOOLCHAIN_MACHINE_NAME( __machine "${ANDROID_NDK_TOOLCHAINS_PATH}/${__gcc_toolchain}${__toolchain_subpath}" )
- if( __machine )
- string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9x]+)?$" __version "${__gcc_toolchain}" )
- if( __machine MATCHES x86_64 )
- set( __arch "x86_64" )
- elseif( __machine MATCHES i686 )
- set( __arch "x86" )
- elseif( __machine MATCHES aarch64 )
- set( __arch "arm64" )
- elseif( __machine MATCHES arm )
- set( __arch "arm" )
- elseif( __machine MATCHES mips64el )
- set( __arch "mips64" )
- elseif( __machine MATCHES mipsel )
- set( __arch "mips" )
- else()
- set( __arch "" )
- endif()
- #message("machine: !${__machine}!\narch: !${__arch}!\nversion: !${__version}!\ntoolchain: !${__toolchain}!\n")
- if (__arch)
- list( APPEND __availableToolchainMachines "${__machine}" )
- list( APPEND __availableToolchainArchs "${__arch}" )
- list( APPEND __availableToolchainCompilerVersions "${__version}" )
- list( APPEND ${__availableToolchainsVar} "${__toolchain}" )
- endif()
- endif()
- unset( __gcc_toolchain )
- endforeach()
-endmacro()
-
-# get all the details about NDK
-if( BUILD_WITH_ANDROID_NDK )
- file( GLOB ANDROID_SUPPORTED_NATIVE_API_LEVELS RELATIVE "${ANDROID_NDK}/platforms" "${ANDROID_NDK}/platforms/android-*" )
- string( REPLACE "android-" "" ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_SUPPORTED_NATIVE_API_LEVELS}" )
- set( __availableToolchains "" )
- set( __availableToolchainMachines "" )
- set( __availableToolchainArchs "" )
- set( __availableToolchainCompilerVersions "" )
- if( ANDROID_TOOLCHAIN_NAME AND EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_TOOLCHAIN_NAME}/" )
- # do not go through all toolchains if we know the name
- set( __availableToolchainsLst "${ANDROID_TOOLCHAIN_NAME}" )
- __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
- if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 )
- __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" )
- if( __availableToolchains )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH ${ANDROID_NDK_TOOLCHAINS_SUBPATH2} )
- endif()
- endif()
- endif()
- if( NOT __availableToolchains )
- file( GLOB __availableToolchainsLst RELATIVE "${ANDROID_NDK_TOOLCHAINS_PATH}" "${ANDROID_NDK_TOOLCHAINS_PATH}/*" )
- if( __availableToolchainsLst )
- list(SORT __availableToolchainsLst) # we need clang to go after gcc
- endif()
- __LIST_FILTER( __availableToolchainsLst "^[.]" )
- __LIST_FILTER( __availableToolchainsLst "llvm" )
- __LIST_FILTER( __availableToolchainsLst "renderscript" )
- __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
- if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 )
- __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" )
- if( __availableToolchains )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH ${ANDROID_NDK_TOOLCHAINS_SUBPATH2} )
- endif()
- endif()
- endif()
- if( NOT __availableToolchains )
- message( FATAL_ERROR "Could not find any working toolchain in the NDK. Probably your Android NDK is broken." )
- endif()
-endif()
-
-# build list of available ABIs
-set( ANDROID_SUPPORTED_ABIS "" )
-set( __uniqToolchainArchNames ${__availableToolchainArchs} )
-list( REMOVE_DUPLICATES __uniqToolchainArchNames )
-list( SORT __uniqToolchainArchNames )
-foreach( __arch ${__uniqToolchainArchNames} )
- list( APPEND ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${__arch}} )
-endforeach()
-unset( __uniqToolchainArchNames )
-if( NOT ANDROID_SUPPORTED_ABIS )
- message( FATAL_ERROR "No one of known Android ABIs is supported by this cmake toolchain." )
-endif()
-
-# choose target ABI
-__INIT_VARIABLE( ANDROID_ABI VALUES ${ANDROID_SUPPORTED_ABIS} )
-# verify that target ABI is supported
-list( FIND ANDROID_SUPPORTED_ABIS "${ANDROID_ABI}" __androidAbiIdx )
-if( __androidAbiIdx EQUAL -1 )
- string( REPLACE ";" "\", \"" PRINTABLE_ANDROID_SUPPORTED_ABIS "${ANDROID_SUPPORTED_ABIS}" )
- message( FATAL_ERROR "Specified ANDROID_ABI = \"${ANDROID_ABI}\" is not supported by this cmake toolchain or your NDK/toolchain.
- Supported values are: \"${PRINTABLE_ANDROID_SUPPORTED_ABIS}\"
- " )
-endif()
-unset( __androidAbiIdx )
-
-# set target ABI options
-if( ANDROID_ABI STREQUAL "x86" )
- set( X86 true )
- set( ANDROID_NDK_ABI_NAME "x86" )
- set( ANDROID_ARCH_NAME "x86" )
- set( ANDROID_LLVM_TRIPLE "i686-none-linux-android" )
- set( CMAKE_SYSTEM_PROCESSOR "i686" )
-elseif( ANDROID_ABI STREQUAL "x86_64" )
- set( X86 true )
- set( X86_64 true )
- set( ANDROID_NDK_ABI_NAME "x86_64" )
- set( ANDROID_ARCH_NAME "x86_64" )
- set( CMAKE_SYSTEM_PROCESSOR "x86_64" )
- set( ANDROID_LLVM_TRIPLE "x86_64-none-linux-android" )
-elseif( ANDROID_ABI STREQUAL "mips64" )
- set( MIPS64 true )
- set( ANDROID_NDK_ABI_NAME "mips64" )
- set( ANDROID_ARCH_NAME "mips64" )
- set( ANDROID_LLVM_TRIPLE "mips64el-none-linux-android" )
- set( CMAKE_SYSTEM_PROCESSOR "mips64" )
-elseif( ANDROID_ABI STREQUAL "mips" )
- set( MIPS true )
- set( ANDROID_NDK_ABI_NAME "mips" )
- set( ANDROID_ARCH_NAME "mips" )
- set( ANDROID_LLVM_TRIPLE "mipsel-none-linux-android" )
- set( CMAKE_SYSTEM_PROCESSOR "mips" )
-elseif( ANDROID_ABI STREQUAL "arm64-v8a" )
- set( ARM64_V8A true )
- set( ANDROID_NDK_ABI_NAME "arm64-v8a" )
- set( ANDROID_ARCH_NAME "arm64" )
- set( ANDROID_LLVM_TRIPLE "aarch64-none-linux-android" )
- set( CMAKE_SYSTEM_PROCESSOR "aarch64" )
- set( VFPV3 true )
- set( NEON true )
-elseif( ANDROID_ABI STREQUAL "armeabi" )
- set( ARMEABI true )
- set( ANDROID_NDK_ABI_NAME "armeabi" )
- set( ANDROID_ARCH_NAME "arm" )
- set( ANDROID_LLVM_TRIPLE "armv5te-none-linux-androideabi" )
- set( CMAKE_SYSTEM_PROCESSOR "armv5te" )
-elseif( ANDROID_ABI STREQUAL "armeabi-v6 with VFP" )
- set( ARMEABI_V6 true )
- set( ANDROID_NDK_ABI_NAME "armeabi" )
- set( ANDROID_ARCH_NAME "arm" )
- set( ANDROID_LLVM_TRIPLE "armv5te-none-linux-androideabi" )
- set( CMAKE_SYSTEM_PROCESSOR "armv6" )
- # need always fallback to older platform
- set( ARMEABI true )
-elseif( ANDROID_ABI STREQUAL "armeabi-v7a")
- set( ARMEABI_V7A true )
- set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
- set( ANDROID_ARCH_NAME "arm" )
- set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
- set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
-elseif( ANDROID_ABI STREQUAL "armeabi-v7a with VFPV3" )
- set( ARMEABI_V7A true )
- set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
- set( ANDROID_ARCH_NAME "arm" )
- set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
- set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
- set( VFPV3 true )
-elseif( ANDROID_ABI STREQUAL "armeabi-v7a with NEON" )
- set( ARMEABI_V7A true )
- set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
- set( ANDROID_ARCH_NAME "arm" )
- set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
- set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
- set( VFPV3 true )
- set( NEON true )
-else()
- message( SEND_ERROR "Unknown ANDROID_ABI=\"${ANDROID_ABI}\" is specified." )
-endif()
-
-if( CMAKE_BINARY_DIR AND EXISTS "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" )
- # really dirty hack
- # it is not possible to change CMAKE_SYSTEM_PROCESSOR after the first run...
- file( APPEND "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" "SET(CMAKE_SYSTEM_PROCESSOR \"${CMAKE_SYSTEM_PROCESSOR}\")\n" )
-endif()
-
-if( ANDROID_ARCH_NAME STREQUAL "arm" AND NOT ARMEABI_V6 )
- __INIT_VARIABLE( ANDROID_FORCE_ARM_BUILD VALUES OFF )
- set( ANDROID_FORCE_ARM_BUILD ${ANDROID_FORCE_ARM_BUILD} CACHE BOOL "Use 32-bit ARM instructions instead of Thumb-1" FORCE )
- mark_as_advanced( ANDROID_FORCE_ARM_BUILD )
-else()
- unset( ANDROID_FORCE_ARM_BUILD CACHE )
-endif()
-
-# choose toolchain
-if( ANDROID_TOOLCHAIN_NAME )
- list( FIND __availableToolchains "${ANDROID_TOOLCHAIN_NAME}" __toolchainIdx )
- if( __toolchainIdx EQUAL -1 )
- list( SORT __availableToolchains )
- string( REPLACE ";" "\n * " toolchains_list "${__availableToolchains}" )
- set( toolchains_list " * ${toolchains_list}")
- message( FATAL_ERROR "Specified toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is missing in your NDK or broken. Please verify that your NDK is working or select another compiler toolchain.
-To configure the toolchain set CMake variable ANDROID_TOOLCHAIN_NAME to one of the following values:\n${toolchains_list}\n" )
- endif()
- list( GET __availableToolchainArchs ${__toolchainIdx} __toolchainArch )
- if( NOT __toolchainArch STREQUAL ANDROID_ARCH_NAME )
- message( SEND_ERROR "Selected toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is not able to compile binaries for the \"${ANDROID_ARCH_NAME}\" platform." )
- endif()
-else()
- set( __toolchainIdx -1 )
- set( __applicableToolchains "" )
- set( __toolchainMaxVersion "0.0.0" )
- list( LENGTH __availableToolchains __availableToolchainsCount )
- math( EXPR __availableToolchainsCount "${__availableToolchainsCount}-1" )
- foreach( __idx RANGE ${__availableToolchainsCount} )
- list( GET __availableToolchainArchs ${__idx} __toolchainArch )
- if( __toolchainArch STREQUAL ANDROID_ARCH_NAME )
- list( GET __availableToolchainCompilerVersions ${__idx} __toolchainVersion )
- string( REPLACE "x" "99" __toolchainVersion "${__toolchainVersion}")
- if( __toolchainVersion VERSION_GREATER __toolchainMaxVersion )
- set( __toolchainMaxVersion "${__toolchainVersion}" )
- set( __toolchainIdx ${__idx} )
- endif()
- endif()
- endforeach()
- unset( __availableToolchainsCount )
- unset( __toolchainMaxVersion )
- unset( __toolchainVersion )
-endif()
-unset( __toolchainArch )
-if( __toolchainIdx EQUAL -1 )
- message( FATAL_ERROR "No one of available compiler toolchains is able to compile for ${ANDROID_ARCH_NAME} platform." )
-endif()
-list( GET __availableToolchains ${__toolchainIdx} ANDROID_TOOLCHAIN_NAME )
-list( GET __availableToolchainMachines ${__toolchainIdx} ANDROID_TOOLCHAIN_MACHINE_NAME )
-list( GET __availableToolchainCompilerVersions ${__toolchainIdx} ANDROID_COMPILER_VERSION )
-
-unset( __toolchainIdx )
-unset( __availableToolchains )
-unset( __availableToolchainMachines )
-unset( __availableToolchainArchs )
-unset( __availableToolchainCompilerVersions )
-
-# choose native API level
-__INIT_VARIABLE( ANDROID_NATIVE_API_LEVEL ENV_ANDROID_NATIVE_API_LEVEL ANDROID_API_LEVEL ENV_ANDROID_API_LEVEL ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME} ANDROID_DEFAULT_NDK_API_LEVEL )
-string( REPLACE "android-" "" ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" )
-string( STRIP "${ANDROID_NATIVE_API_LEVEL}" ANDROID_NATIVE_API_LEVEL )
-# adjust API level
-set( __real_api_level ${ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME}} )
-foreach( __level ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
- if( (__level LESS ANDROID_NATIVE_API_LEVEL OR __level STREQUAL ANDROID_NATIVE_API_LEVEL) AND NOT __level LESS __real_api_level )
- set( __real_api_level ${__level} )
- endif()
-endforeach()
-if( __real_api_level AND NOT ANDROID_NATIVE_API_LEVEL STREQUAL __real_api_level )
- message( STATUS "Adjusting Android API level 'android-${ANDROID_NATIVE_API_LEVEL}' to 'android-${__real_api_level}'")
- set( ANDROID_NATIVE_API_LEVEL ${__real_api_level} )
-endif()
-unset(__real_api_level)
-# validate
-list( FIND ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_NATIVE_API_LEVEL}" __levelIdx )
-if( __levelIdx EQUAL -1 )
- message( SEND_ERROR "Specified Android native API level 'android-${ANDROID_NATIVE_API_LEVEL}' is not supported by your NDK/toolchain." )
-else()
- if( BUILD_WITH_ANDROID_NDK )
- __DETECT_NATIVE_API_LEVEL( __realApiLevel "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}/usr/include/android/api-level.h" )
- if( NOT __realApiLevel EQUAL ANDROID_NATIVE_API_LEVEL AND NOT __realApiLevel GREATER 9000 )
- message( SEND_ERROR "Specified Android API level (${ANDROID_NATIVE_API_LEVEL}) does not match to the level found (${__realApiLevel}). Probably your copy of NDK is broken." )
- endif()
- unset( __realApiLevel )
- endif()
- set( ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" CACHE STRING "Android API level for native code" FORCE )
- set( CMAKE_ANDROID_API ${ANDROID_NATIVE_API_LEVEL} )
- list( SORT ANDROID_SUPPORTED_NATIVE_API_LEVELS )
- set_property( CACHE ANDROID_NATIVE_API_LEVEL PROPERTY STRINGS ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
-endif()
-unset( __levelIdx )
-
-
-# remember target ABI
-set( ANDROID_ABI "${ANDROID_ABI}" CACHE STRING "The target ABI for Android. If arm, then armeabi-v7a is recommended for hardware floating point." FORCE )
-list( SORT ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME} )
-set_property( CACHE ANDROID_ABI PROPERTY STRINGS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME}} )
-
-
-# runtime choice (STL, rtti, exceptions)
-if( NOT ANDROID_STL )
- set( ANDROID_STL gnustl_static )
-endif()
-set( ANDROID_STL "${ANDROID_STL}" CACHE STRING "C++ runtime" )
-set( ANDROID_STL_FORCE_FEATURES ON CACHE BOOL "automatically configure rtti and exceptions support based on C++ runtime" )
-mark_as_advanced( ANDROID_STL ANDROID_STL_FORCE_FEATURES )
-
-if( BUILD_WITH_ANDROID_NDK )
- if( NOT "${ANDROID_STL}" MATCHES "^(none|system|system_re|gabi\\+\\+_static|gabi\\+\\+_shared|stlport_static|stlport_shared|gnustl_static|gnustl_shared|c\\+\\+_static|c\\+\\+_shared)$")
- message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\".
-The possible values are:
- none -> Do not configure the runtime.
- system -> Use the default minimal system C++ runtime library.
- system_re -> Same as system but with rtti and exceptions.
- gabi++_static -> Use the GAbi++ runtime as a static library.
- gabi++_shared -> Use the GAbi++ runtime as a shared library.
- stlport_static -> Use the STLport runtime as a static library.
- stlport_shared -> Use the STLport runtime as a shared library.
- gnustl_static -> (default) Use the GNU STL as a static library.
- gnustl_shared -> Use the GNU STL as a shared library.
- c++_static -> Use libc++ as a static library.
- c++_shared -> Use libc++ as a shared library.
-" )
- endif()
-elseif( BUILD_WITH_STANDALONE_TOOLCHAIN )
- if( NOT "${ANDROID_STL}" MATCHES "^(none|gnustl_static|gnustl_shared)$")
- message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\".
-The possible values are:
- none -> Do not configure the runtime.
- gnustl_static -> (default) Use the GNU STL as a static library.
- gnustl_shared -> Use the GNU STL as a shared library.
-" )
- endif()
-endif()
-
-unset( ANDROID_RTTI )
-unset( ANDROID_EXCEPTIONS )
-unset( ANDROID_STL_INCLUDE_DIRS )
-unset( __libstl )
-unset( __libsupcxx )
-
-if( NOT _CMAKE_IN_TRY_COMPILE AND ANDROID_NDK_RELEASE STREQUAL "r7b" AND ARMEABI_V7A AND NOT VFPV3 AND ANDROID_STL MATCHES "gnustl" )
- message( WARNING "The GNU STL armeabi-v7a binaries from NDK r7b can crash non-NEON devices. The files provided with NDK r7b were not configured properly, resulting in crashes on Tegra2-based devices and others when trying to use certain floating-point functions (e.g., cosf, sinf, expf).
-You are strongly recommended to switch to another NDK release.
-" )
-endif()
-
-if( NOT _CMAKE_IN_TRY_COMPILE AND X86 AND ANDROID_STL MATCHES "gnustl" AND ANDROID_NDK_RELEASE STREQUAL "r6" )
- message( WARNING "The x86 system header file from NDK r6 has incorrect definition for ptrdiff_t. You are recommended to upgrade to a newer NDK release or manually patch the header:
-See https://android.googlesource.com/platform/development.git f907f4f9d4e56ccc8093df6fee54454b8bcab6c2
- diff --git a/ndk/platforms/android-9/arch-x86/include/machine/_types.h b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
- index 5e28c64..65892a1 100644
- --- a/ndk/platforms/android-9/arch-x86/include/machine/_types.h
- +++ b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
- @@ -51,7 +51,11 @@ typedef long int ssize_t;
- #endif
- #ifndef _PTRDIFF_T
- #define _PTRDIFF_T
- -typedef long ptrdiff_t;
- +# ifdef __ANDROID__
- + typedef int ptrdiff_t;
- +# else
- + typedef long ptrdiff_t;
- +# endif
- #endif
-" )
-endif()
-
-
-# setup paths and STL for standalone toolchain
-if( BUILD_WITH_STANDALONE_TOOLCHAIN )
- set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" )
- set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" )
- set( ANDROID_SYSROOT "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot" )
-
- if( NOT ANDROID_STL STREQUAL "none" )
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/include/c++/${ANDROID_COMPILER_VERSION}" )
- if( NOT EXISTS "${ANDROID_STL_INCLUDE_DIRS}" )
- # old location ( pre r8c )
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}" )
- endif()
- if( ARMEABI_V7A AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/bits" )
- list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}" )
- elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb/bits" )
- list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb" )
- else()
- list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" )
- endif()
- # always search static GNU STL to get the location of libsupc++.a
- if( ARMEABI_V7A AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb" )
- elseif( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}" )
- elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libstdc++.a" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb" )
- elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libstdc++.a" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib" )
- endif()
- if( __libstl )
- set( __libsupcxx "${__libstl}/libsupc++.a" )
- set( __libstl "${__libstl}/libstdc++.a" )
- endif()
- if( NOT EXISTS "${__libsupcxx}" )
- message( FATAL_ERROR "The required libstdsupc++.a is missing in your standalone toolchain.
- Usually it happens because of bug in make-standalone-toolchain.sh script from NDK r7, r7b and r7c.
- You need to either upgrade to newer NDK or manually copy
- $ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a
- to
- ${__libsupcxx}
- " )
- endif()
- if( ANDROID_STL STREQUAL "gnustl_shared" )
- if( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" )
- elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" )
- elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" )
- endif()
- endif()
- endif()
-endif()
-
-# clang
-if( "${ANDROID_TOOLCHAIN_NAME}" STREQUAL "standalone-clang" )
- set( ANDROID_COMPILER_IS_CLANG 1 )
- execute_process( COMMAND "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/clang${TOOL_OS_SUFFIX}" --version OUTPUT_VARIABLE ANDROID_CLANG_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE )
- string( REGEX MATCH "[0-9]+[.][0-9]+" ANDROID_CLANG_VERSION "${ANDROID_CLANG_VERSION}")
-elseif( "${ANDROID_TOOLCHAIN_NAME}" MATCHES "-clang3[.][0-9]?$" )
- string( REGEX MATCH "3[.][0-9]$" ANDROID_CLANG_VERSION "${ANDROID_TOOLCHAIN_NAME}")
- string( REGEX REPLACE "-clang${ANDROID_CLANG_VERSION}$" "-${ANDROID_COMPILER_VERSION}" ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" )
- if( NOT EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/llvm-${ANDROID_CLANG_VERSION}${ANDROID_NDK_TOOLCHAINS_SUBPATH}/bin/clang${TOOL_OS_SUFFIX}" )
- message( FATAL_ERROR "Could not find the Clang compiler driver" )
- endif()
- set( ANDROID_COMPILER_IS_CLANG 1 )
- set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_NDK_TOOLCHAINS_PATH}/llvm-${ANDROID_CLANG_VERSION}${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
-else()
- set( ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" )
- unset( ANDROID_COMPILER_IS_CLANG CACHE )
-endif()
-
-string( REPLACE "." "" _clang_name "clang${ANDROID_CLANG_VERSION}" )
-if( NOT EXISTS "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" )
- set( _clang_name "clang" )
-endif()
-
-
-# setup paths and STL for NDK
-if( BUILD_WITH_ANDROID_NDK )
- set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
- set( ANDROID_SYSROOT "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}" )
-
- if( ANDROID_STL STREQUAL "none" )
- # do nothing
- elseif( ANDROID_STL STREQUAL "system" )
- set( ANDROID_RTTI OFF )
- set( ANDROID_EXCEPTIONS OFF )
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" )
- elseif( ANDROID_STL STREQUAL "system_re" )
- set( ANDROID_RTTI ON )
- set( ANDROID_EXCEPTIONS ON )
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" )
- elseif( ANDROID_STL MATCHES "gabi" )
- if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
- message( FATAL_ERROR "gabi++ is not available in your NDK. You have to upgrade to NDK r7 or newer to use gabi++.")
- endif()
- set( ANDROID_RTTI ON )
- set( ANDROID_EXCEPTIONS OFF )
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/gabi++/include" )
- set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gabi++/libs/${ANDROID_NDK_ABI_NAME}/libgabi++_static.a" )
- elseif( ANDROID_STL MATCHES "stlport" )
- if( NOT ANDROID_NDK_RELEASE_NUM LESS 8004 ) # before r8d
- set( ANDROID_EXCEPTIONS ON )
- else()
- set( ANDROID_EXCEPTIONS OFF )
- endif()
- if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
- set( ANDROID_RTTI OFF )
- else()
- set( ANDROID_RTTI ON )
- endif()
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/stlport/stlport" )
- set( __libstl "${ANDROID_NDK}/sources/cxx-stl/stlport/libs/${ANDROID_NDK_ABI_NAME}/libstlport_static.a" )
- elseif( ANDROID_STL MATCHES "gnustl" )
- set( ANDROID_EXCEPTIONS ON )
- set( ANDROID_RTTI ON )
- if( EXISTS "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" )
- if( ARMEABI_V7A AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.7" AND ANDROID_NDK_RELEASE STREQUAL "r8d" )
- # gnustl binary for 4.7 compiler is buggy :(
- # TODO: look for right fix
- set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.6" )
- else()
- set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" )
- endif()
- else()
- set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++" )
- endif()
- set( ANDROID_STL_INCLUDE_DIRS "${__libstl}/include" "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/include" "${__libstl}/include/backward" )
- if( EXISTS "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" )
- set( __libstl "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" )
- else()
- set( __libstl "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" )
- endif()
- elseif( ANDROID_STL MATCHES "c\\+\\+_shared" OR ANDROID_STL MATCHES "c\\+\\+_static" )
- set( ANDROID_EXCEPTIONS ON )
- set( ANDROID_RTTI ON )
- set( ANDROID_CXX_ROOT "${ANDROID_NDK}/sources/cxx-stl/" )
- set( ANDROID_LLVM_ROOT "${ANDROID_CXX_ROOT}/llvm-libc++" )
- if( X86 )
- set( ANDROID_ABI_INCLUDE_DIRS "${ANDROID_CXX_ROOT}/gabi++/include" )
- else()
- set( ANDROID_ABI_INCLUDE_DIRS "${ANDROID_CXX_ROOT}/llvm-libc++abi/include" )
- endif()
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_LLVM_ROOT}/libcxx/include"
- "${ANDROID_ABI_INCLUDE_DIRS}" )
- # android support sfiles
- include_directories ( SYSTEM ${ANDROID_NDK}/sources/android/support/include )
- if( ANDROID_STL MATCHES "c\\+\\+_shared" AND EXISTS "${ANDROID_LLVM_ROOT}/libs/${ANDROID_NDK_ABI_NAME}/libc++_shared.so" )
- set( __libstl "${ANDROID_LLVM_ROOT}/libs/${ANDROID_NDK_ABI_NAME}/libc++_shared.so" )
- elseif( ANDROID_STL MATCHES "c\\+\\+_static" AND EXISTS "${ANDROID_LLVM_ROOT}/libs/${ANDROID_NDK_ABI_NAME}/libc++_static.a" )
- set( __libstl "${ANDROID_LLVM_ROOT}/libs/${ANDROID_NDK_ABI_NAME}/libc++_static.a" )
- else()
- message( "c++ library doesn't exist" )
- endif()
- else()
- message( FATAL_ERROR "Unknown runtime: ${ANDROID_STL}" )
- endif()
- # find libsupc++.a - rtti & exceptions
- if( ANDROID_STL STREQUAL "system_re" OR ANDROID_STL MATCHES "gnustl" )
- set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) # r8b or newer
- if( NOT EXISTS "${__libsupcxx}" )
- set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) # r7-r8
- endif()
- if( NOT EXISTS "${__libsupcxx}" ) # before r7
- if( ARMEABI_V7A )
- if( ANDROID_FORCE_ARM_BUILD )
- set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" )
- else()
- set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" )
- endif()
- elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD )
- set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" )
- else()
- set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" )
- endif()
- endif()
- if( NOT EXISTS "${__libsupcxx}")
- message( ERROR "Could not find libsupc++.a for a chosen platform. Either your NDK is not supported or is broken.")
- endif()
- endif()
-endif()
-
-
-# case of shared STL linkage
-if( ANDROID_STL MATCHES "shared" AND DEFINED __libstl )
- string( REPLACE "_static.a" "_shared.so" __libstl "${__libstl}" )
- # TODO: check if .so file exists before the renaming
-endif()
-
-
-# ccache support
-__INIT_VARIABLE( _ndk_ccache NDK_CCACHE ENV_NDK_CCACHE )
-if( _ndk_ccache )
- if( DEFINED NDK_CCACHE AND NOT EXISTS NDK_CCACHE )
- unset( NDK_CCACHE CACHE )
- endif()
- find_program( NDK_CCACHE "${_ndk_ccache}" DOC "The path to ccache binary")
-else()
- unset( NDK_CCACHE CACHE )
-endif()
-unset( _ndk_ccache )
-
-
-# setup the cross-compiler
-if( NOT CMAKE_C_COMPILER )
- if( NDK_CCACHE AND NOT ANDROID_SYSROOT MATCHES "[ ;\"]" )
- set( CMAKE_C_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C compiler" )
- set( CMAKE_CXX_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C++ compiler" )
- if( ANDROID_COMPILER_IS_CLANG )
- set( CMAKE_C_COMPILER_ARG1 "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" CACHE PATH "C compiler")
- set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
- else()
- set( CMAKE_C_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "C compiler")
- set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
- endif()
- else()
- if( ANDROID_COMPILER_IS_CLANG )
- set( CMAKE_C_COMPILER "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" CACHE PATH "C compiler")
- set( CMAKE_CXX_COMPILER "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
- else()
- set( CMAKE_C_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "C compiler" )
- set( CMAKE_CXX_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler" )
- endif()
- endif()
- set( CMAKE_ASM_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "assembler" )
- set( CMAKE_STRIP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-strip${TOOL_OS_SUFFIX}" CACHE PATH "strip" )
- if( EXISTS "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc-ar${TOOL_OS_SUFFIX}" )
- # Use gcc-ar if we have it for better LTO support.
- set( CMAKE_AR "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc-ar${TOOL_OS_SUFFIX}" CACHE PATH "archive" )
- else()
- set( CMAKE_AR "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ar${TOOL_OS_SUFFIX}" CACHE PATH "archive" )
- endif()
- set( CMAKE_LINKER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ld${TOOL_OS_SUFFIX}" CACHE PATH "linker" )
- set( CMAKE_NM "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-nm${TOOL_OS_SUFFIX}" CACHE PATH "nm" )
- set( CMAKE_OBJCOPY "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objcopy${TOOL_OS_SUFFIX}" CACHE PATH "objcopy" )
- set( CMAKE_OBJDUMP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objdump${TOOL_OS_SUFFIX}" CACHE PATH "objdump" )
- set( CMAKE_RANLIB "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ranlib${TOOL_OS_SUFFIX}" CACHE PATH "ranlib" )
-endif()
-
-set( _CMAKE_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_MACHINE_NAME}-" )
-if( APPLE )
- find_program( CMAKE_INSTALL_NAME_TOOL NAMES install_name_tool )
- if( NOT CMAKE_INSTALL_NAME_TOOL )
- message( FATAL_ERROR "Could not find install_name_tool, please check your installation." )
- endif()
- mark_as_advanced( CMAKE_INSTALL_NAME_TOOL )
-endif()
-
-# Force set compilers because standard identification works badly for us
-include( CMakeForceCompiler )
-CMAKE_FORCE_C_COMPILER( "${CMAKE_C_COMPILER}" GNU )
-if( ANDROID_COMPILER_IS_CLANG )
- set( CMAKE_C_COMPILER_ID Clang )
-endif()
-set( CMAKE_C_PLATFORM_ID Linux )
-if( X86_64 OR MIPS64 OR ARM64_V8A )
- set( CMAKE_C_SIZEOF_DATA_PTR 8 )
-else()
- set( CMAKE_C_SIZEOF_DATA_PTR 4 )
-endif()
-set( CMAKE_C_HAS_ISYSROOT 1 )
-set( CMAKE_C_COMPILER_ABI ELF )
-CMAKE_FORCE_CXX_COMPILER( "${CMAKE_CXX_COMPILER}" GNU )
-if( ANDROID_COMPILER_IS_CLANG )
- set( CMAKE_CXX_COMPILER_ID Clang)
-endif()
-set( CMAKE_CXX_PLATFORM_ID Linux )
-set( CMAKE_CXX_SIZEOF_DATA_PTR ${CMAKE_C_SIZEOF_DATA_PTR} )
-set( CMAKE_CXX_HAS_ISYSROOT 1 )
-set( CMAKE_CXX_COMPILER_ABI ELF )
-set( CMAKE_CXX_SOURCE_FILE_EXTENSIONS cc cp cxx cpp CPP c++ C )
-# force ASM compiler (required for CMake < 2.8.5)
-set( CMAKE_ASM_COMPILER_ID_RUN TRUE )
-set( CMAKE_ASM_COMPILER_ID GNU )
-set( CMAKE_ASM_COMPILER_WORKS TRUE )
-set( CMAKE_ASM_COMPILER_FORCED TRUE )
-set( CMAKE_COMPILER_IS_GNUASM 1)
-set( CMAKE_ASM_SOURCE_FILE_EXTENSIONS s S asm )
-
-foreach( lang C CXX ASM )
- if( ANDROID_COMPILER_IS_CLANG )
- set( CMAKE_${lang}_COMPILER_VERSION ${ANDROID_CLANG_VERSION} )
- else()
- set( CMAKE_${lang}_COMPILER_VERSION ${ANDROID_COMPILER_VERSION} )
- endif()
-endforeach()
-
-# flags and definitions
-remove_definitions( -DANDROID )
-add_definitions( -DANDROID )
-
-if( ANDROID_SYSROOT MATCHES "[ ;\"]" )
- if( CMAKE_HOST_WIN32 )
- # try to convert path to 8.3 form
- file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/cvt83.cmd" "@echo %~s1" )
- execute_process( COMMAND "$ENV{ComSpec}" /c "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/cvt83.cmd" "${ANDROID_SYSROOT}"
- OUTPUT_VARIABLE __path OUTPUT_STRIP_TRAILING_WHITESPACE
- RESULT_VARIABLE __result ERROR_QUIET )
- if( __result EQUAL 0 )
- file( TO_CMAKE_PATH "${__path}" ANDROID_SYSROOT )
- set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" )
- else()
- set( ANDROID_CXX_FLAGS "--sysroot=\"${ANDROID_SYSROOT}\"" )
- endif()
- else()
- set( ANDROID_CXX_FLAGS "'--sysroot=${ANDROID_SYSROOT}'" )
- endif()
- if( NOT _CMAKE_IN_TRY_COMPILE )
- # quotes can break try_compile and compiler identification
- message(WARNING "Path to your Android NDK (or toolchain) has non-alphanumeric symbols.\nThe build might be broken.\n")
- endif()
-else()
- set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" )
-endif()
-
-# NDK flags
-if (ARM64_V8A )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
- set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer -fstrict-aliasing" )
- set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer -fno-strict-aliasing" )
- if( NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" )
- endif()
-elseif( ARMEABI OR ARMEABI_V7A)
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
- if( NOT ANDROID_FORCE_ARM_BUILD AND NOT ARMEABI_V6 )
- set( ANDROID_CXX_FLAGS_RELEASE "-mthumb -fomit-frame-pointer -fno-strict-aliasing" )
- set( ANDROID_CXX_FLAGS_DEBUG "-marm -fno-omit-frame-pointer -fno-strict-aliasing" )
- if( NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -finline-limit=64" )
- endif()
- else()
- # always compile ARMEABI_V6 in arm mode; otherwise there is no difference from ARMEABI
- set( ANDROID_CXX_FLAGS_RELEASE "-marm -fomit-frame-pointer -fstrict-aliasing" )
- set( ANDROID_CXX_FLAGS_DEBUG "-marm -fno-omit-frame-pointer -fno-strict-aliasing" )
- if( NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" )
- endif()
- endif()
-elseif( X86 OR X86_64 )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
- if( NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" )
- endif()
- set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer -fstrict-aliasing" )
- set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer -fno-strict-aliasing" )
-elseif( MIPS OR MIPS64 )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fno-strict-aliasing -finline-functions -funwind-tables -fmessage-length=0" )
- set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer" )
- set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer" )
- if( NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers" )
- set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" )
- endif()
-elseif()
- set( ANDROID_CXX_FLAGS_RELEASE "" )
- set( ANDROID_CXX_FLAGS_DEBUG "" )
-endif()
-
-set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" ) # good/necessary when porting desktop libraries
-
-if( NOT X86 AND NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "-Wno-psabi ${ANDROID_CXX_FLAGS}" )
-endif()
-
-if( NOT ANDROID_COMPILER_VERSION VERSION_LESS "4.6" )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -no-canonical-prefixes" ) # see https://android-review.googlesource.com/#/c/47564/
-endif()
-
-# ABI-specific flags
-if( ARMEABI_V7A )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv7-a -mfloat-abi=softfp" )
- if( NEON )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=neon" )
- elseif( VFPV3 )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3" )
- else()
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3-d16" )
- endif()
-elseif( ARMEABI_V6 )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv6 -mfloat-abi=softfp -mfpu=vfp" ) # vfp == vfpv2
-elseif( ARMEABI )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv5te -mtune=xscale -msoft-float" )
-endif()
-
-if( ANDROID_STL MATCHES "gnustl" AND (EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}") )
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
-else()
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
-endif()
-
-# STL
-if( EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" )
- if( EXISTS "${__libstl}" )
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libstl}\"" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libstl}\"" )
- set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libstl}\"" )
- endif()
- if( EXISTS "${__libsupcxx}" )
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" )
- set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libsupcxx}\"" )
- # C objects:
- set( CMAKE_C_CREATE_SHARED_LIBRARY "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_C_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_C_CREATE_SHARED_MODULE "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_C_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
- set( CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" )
- set( CMAKE_C_CREATE_SHARED_MODULE "${CMAKE_C_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" )
- set( CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE} \"${__libsupcxx}\"" )
- endif()
- if( ANDROID_STL MATCHES "gnustl" )
- if( NOT EXISTS "${ANDROID_LIBM_PATH}" )
- set( ANDROID_LIBM_PATH -lm )
- endif()
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} ${ANDROID_LIBM_PATH}" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} ${ANDROID_LIBM_PATH}" )
- set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} ${ANDROID_LIBM_PATH}" )
- endif()
-endif()
-
-# variables controlling optional build flags
-if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
- # libGLESv2.so in NDK's prior to r7 refers to missing external symbols.
- # So this flag option is required for all projects using OpenGL from native.
- __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES ON )
-else()
- __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES OFF )
-endif()
-__INIT_VARIABLE( ANDROID_NO_UNDEFINED VALUES ON )
-__INIT_VARIABLE( ANDROID_FUNCTION_LEVEL_LINKING VALUES ON )
-__INIT_VARIABLE( ANDROID_GOLD_LINKER VALUES ON )
-__INIT_VARIABLE( ANDROID_NOEXECSTACK VALUES ON )
-__INIT_VARIABLE( ANDROID_RELRO VALUES ON )
-
-set( ANDROID_NO_UNDEFINED ${ANDROID_NO_UNDEFINED} CACHE BOOL "Show all undefined symbols as linker errors" )
-set( ANDROID_SO_UNDEFINED ${ANDROID_SO_UNDEFINED} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" )
-set( ANDROID_FUNCTION_LEVEL_LINKING ${ANDROID_FUNCTION_LEVEL_LINKING} CACHE BOOL "Put each function in separate section and enable garbage collection of unused input sections at link time" )
-set( ANDROID_GOLD_LINKER ${ANDROID_GOLD_LINKER} CACHE BOOL "Enables gold linker" )
-set( ANDROID_NOEXECSTACK ${ANDROID_NOEXECSTACK} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" )
-set( ANDROID_RELRO ${ANDROID_RELRO} CACHE BOOL "Enables RELRO - a memory corruption mitigation technique" )
-mark_as_advanced( ANDROID_NO_UNDEFINED ANDROID_SO_UNDEFINED ANDROID_FUNCTION_LEVEL_LINKING ANDROID_GOLD_LINKER ANDROID_NOEXECSTACK ANDROID_RELRO )
-
-# linker flags
-set( ANDROID_LINKER_FLAGS "" )
-
-if( ARMEABI_V7A )
- # this is *required* to use the following linker flags that routes around
- # a CPU bug in some Cortex-A8 implementations:
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--fix-cortex-a8" )
-endif()
-
-if( ANDROID_NO_UNDEFINED )
- if( MIPS )
- # there is some sysroot-related problem in mips linker...
- if( NOT ANDROID_SYSROOT MATCHES "[ ;\"]" )
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-undefined -Wl,-rpath-link,${ANDROID_SYSROOT}/usr/lib" )
- endif()
- else()
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-undefined" )
- endif()
-endif()
-
-if( ANDROID_SO_UNDEFINED )
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-allow-shlib-undefined" )
-endif()
-
-if( ANDROID_FUNCTION_LEVEL_LINKING )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fdata-sections -ffunction-sections" )
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--gc-sections" )
-endif()
-
-if( ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" )
- if( ANDROID_GOLD_LINKER AND (CMAKE_HOST_UNIX OR ANDROID_NDK_RELEASE_NUM GREATER 8002) AND (ARMEABI OR ARMEABI_V7A OR X86) )
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" )
- elseif( ANDROID_NDK_RELEASE_NUM GREATER 8002 ) # after r8b
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=bfd" )
- elseif( ANDROID_NDK_RELEASE STREQUAL "r8b" AND ARMEABI AND NOT _CMAKE_IN_TRY_COMPILE )
- message( WARNING "The default bfd linker from arm GCC 4.6 toolchain can fail with 'unresolvable R_ARM_THM_CALL relocation' error message. See https://code.google.com/p/android/issues/detail?id=35342
- On Linux and OS X host platform you can workaround this problem using gold linker (default).
- Rerun cmake with -DANDROID_GOLD_LINKER=ON option in case of problems.
-" )
- endif()
-endif() # version 4.6
-
-if( ANDROID_NOEXECSTACK )
- if( ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -Xclang -mnoexecstack" )
- else()
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -Wa,--noexecstack" )
- endif()
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,noexecstack" )
-endif()
-
-if( ANDROID_RELRO )
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now" )
-endif()
-
-if( ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "-target ${ANDROID_LLVM_TRIPLE} -Qunused-arguments ${ANDROID_CXX_FLAGS}" )
- if( BUILD_WITH_ANDROID_NDK )
- set( ANDROID_CXX_FLAGS "-gcc-toolchain ${ANDROID_TOOLCHAIN_ROOT} ${ANDROID_CXX_FLAGS}" )
- endif()
-endif()
-
-# cache flags
-set( CMAKE_CXX_FLAGS "" CACHE STRING "c++ flags" )
-set( CMAKE_C_FLAGS "" CACHE STRING "c flags" )
-set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "c++ Release flags" )
-set( CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "c Release flags" )
-set( CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c++ Debug flags" )
-set( CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c Debug flags" )
-set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags" )
-set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags" )
-set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "executable linker flags" )
-
-# put flags to cache (for debug purpose only)
-set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Android specific c/c++ flags" )
-set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE}" CACHE INTERNAL "Android specific c/c++ Release flags" )
-set( ANDROID_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG}" CACHE INTERNAL "Android specific c/c++ Debug flags" )
-set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}" CACHE INTERNAL "Android specific c/c++ linker flags" )
-
-# finish flags
-set( CMAKE_CXX_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" )
-set( CMAKE_C_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_C_FLAGS}" )
-set( CMAKE_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}" )
-set( CMAKE_C_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}" )
-set( CMAKE_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}" )
-set( CMAKE_C_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}" )
-set( CMAKE_SHARED_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" )
-set( CMAKE_MODULE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" )
-set( CMAKE_EXE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" )
-
-if( MIPS AND BUILD_WITH_ANDROID_NDK AND ANDROID_NDK_RELEASE STREQUAL "r8" )
- set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_SHARED_LINKER_FLAGS}" )
- set( CMAKE_MODULE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_MODULE_LINKER_FLAGS}" )
- set( CMAKE_EXE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.x ${CMAKE_EXE_LINKER_FLAGS}" )
-endif()
-
-# pie/pic
-if( NOT (ANDROID_NATIVE_API_LEVEL LESS 16) AND (NOT DEFINED ANDROID_APP_PIE OR ANDROID_APP_PIE))
- set( CMAKE_POSITION_INDEPENDENT_CODE TRUE )
- set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")
-else()
- set( CMAKE_POSITION_INDEPENDENT_CODE FALSE )
- set( CMAKE_CXX_FLAGS "-fpic ${CMAKE_CXX_FLAGS}" )
- set( CMAKE_C_FLAGS "-fpic ${CMAKE_C_FLAGS}" )
-endif()
-
-# configure rtti
-if( DEFINED ANDROID_RTTI AND ANDROID_STL_FORCE_FEATURES )
- if( ANDROID_RTTI )
- set( CMAKE_CXX_FLAGS "-frtti ${CMAKE_CXX_FLAGS}" )
- else()
- set( CMAKE_CXX_FLAGS "-fno-rtti ${CMAKE_CXX_FLAGS}" )
- endif()
-endif()
-
-# configure exceptios
-if( DEFINED ANDROID_EXCEPTIONS AND ANDROID_STL_FORCE_FEATURES )
- if( ANDROID_EXCEPTIONS )
- set( CMAKE_CXX_FLAGS "-fexceptions ${CMAKE_CXX_FLAGS}" )
- set( CMAKE_C_FLAGS "-fexceptions ${CMAKE_C_FLAGS}" )
- else()
- set( CMAKE_CXX_FLAGS "-fno-exceptions ${CMAKE_CXX_FLAGS}" )
- set( CMAKE_C_FLAGS "-fno-exceptions ${CMAKE_C_FLAGS}" )
- endif()
-endif()
-
-# global includes and link directories
-include_directories( SYSTEM "${ANDROID_SYSROOT}/usr/include" ${ANDROID_STL_INCLUDE_DIRS} )
-get_filename_component(__android_install_path "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ABSOLUTE) # avoid CMP0015 policy warning
-link_directories( "${__android_install_path}" )
-
-# detect if need link crtbegin_so.o explicitly
-if( NOT DEFINED ANDROID_EXPLICIT_CRT_LINK )
- set( __cmd "${CMAKE_CXX_CREATE_SHARED_LIBRARY}" )
- string( REPLACE "<CMAKE_CXX_COMPILER>" "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" __cmd "${__cmd}" )
- string( REPLACE "<CMAKE_C_COMPILER>" "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}" __cmd "${__cmd}" )
- string( REPLACE "<CMAKE_SHARED_LIBRARY_CXX_FLAGS>" "${CMAKE_CXX_FLAGS}" __cmd "${__cmd}" )
- string( REPLACE "<LANGUAGE_COMPILE_FLAGS>" "" __cmd "${__cmd}" )
- string( REPLACE "<LINK_FLAGS>" "${CMAKE_SHARED_LINKER_FLAGS}" __cmd "${__cmd}" )
- string( REPLACE "<CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS>" "-shared" __cmd "${__cmd}" )
- string( REPLACE "<CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG>" "" __cmd "${__cmd}" )
- string( REPLACE "<TARGET_SONAME>" "" __cmd "${__cmd}" )
- string( REPLACE "<TARGET>" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/toolchain_crtlink_test.so" __cmd "${__cmd}" )
- string( REPLACE "<OBJECTS>" "\"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" __cmd "${__cmd}" )
- string( REPLACE "<LINK_LIBRARIES>" "" __cmd "${__cmd}" )
- separate_arguments( __cmd )
- foreach( __var ANDROID_NDK ANDROID_NDK_TOOLCHAINS_PATH ANDROID_STANDALONE_TOOLCHAIN )
- if( ${__var} )
- set( __tmp "${${__var}}" )
- separate_arguments( __tmp )
- string( REPLACE "${__tmp}" "${${__var}}" __cmd "${__cmd}")
- endif()
- endforeach()
- string( REPLACE "'" "" __cmd "${__cmd}" )
- string( REPLACE "\"" "" __cmd "${__cmd}" )
- execute_process( COMMAND ${__cmd} RESULT_VARIABLE __cmd_result OUTPUT_QUIET ERROR_QUIET )
- if( __cmd_result EQUAL 0 )
- set( ANDROID_EXPLICIT_CRT_LINK ON )
- else()
- set( ANDROID_EXPLICIT_CRT_LINK OFF )
- endif()
-endif()
-
-if( ANDROID_EXPLICIT_CRT_LINK )
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" )
-endif()
-
-# setup output directories
-set( CMAKE_INSTALL_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/user" CACHE STRING "path for installing" )
-
-if( DEFINED LIBRARY_OUTPUT_PATH_ROOT
- OR EXISTS "${CMAKE_SOURCE_DIR}/AndroidManifest.xml"
- OR (EXISTS "${CMAKE_SOURCE_DIR}/../AndroidManifest.xml" AND EXISTS "${CMAKE_SOURCE_DIR}/../jni/") )
- set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_SOURCE_DIR} CACHE PATH "Root for binaries output, set this to change where Android libs are installed to" )
- if( NOT _CMAKE_IN_TRY_COMPILE )
- if( EXISTS "${CMAKE_SOURCE_DIR}/jni/CMakeLists.txt" )
- set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for applications" )
- else()
- set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin" CACHE PATH "Output directory for applications" )
- endif()
- set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for Android libs" )
- endif()
-endif()
-
-# copy shaed stl library to build directory
-if( NOT _CMAKE_IN_TRY_COMPILE AND __libstl MATCHES "[.]so$" AND DEFINED LIBRARY_OUTPUT_PATH )
- get_filename_component( __libstlname "${__libstl}" NAME )
- execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${__libstl}" "${LIBRARY_OUTPUT_PATH}/${__libstlname}" RESULT_VARIABLE __fileCopyProcess )
- if( NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS "${LIBRARY_OUTPUT_PATH}/${__libstlname}")
- message( SEND_ERROR "Failed copying of ${__libstl} to the ${LIBRARY_OUTPUT_PATH}/${__libstlname}" )
- endif()
- unset( __fileCopyProcess )
- unset( __libstlname )
-endif()
-
-
-# set these global flags for cmake client scripts to change behavior
-set( ANDROID True )
-set( BUILD_ANDROID True )
-
-# where is the target environment
-set( CMAKE_FIND_ROOT_PATH "${ANDROID_TOOLCHAIN_ROOT}/bin" "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" "${ANDROID_SYSROOT}" "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_PREFIX}/share" )
-
-# only search for libraries and includes in the ndk toolchain
-set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
-set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
-set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
-
-# export toolchain settings for the try_compile() command
-if( NOT _CMAKE_IN_TRY_COMPILE )
- set( __toolchain_config "")
- foreach( __var NDK_CCACHE LIBRARY_OUTPUT_PATH_ROOT ANDROID_FORBID_SYGWIN
- ANDROID_NDK_HOST_X64
- ANDROID_NDK
- ANDROID_NDK_LAYOUT
- ANDROID_STANDALONE_TOOLCHAIN
- ANDROID_TOOLCHAIN_NAME
- ANDROID_ABI
- ANDROID_NATIVE_API_LEVEL
- ANDROID_STL
- ANDROID_STL_FORCE_FEATURES
- ANDROID_FORCE_ARM_BUILD
- ANDROID_NO_UNDEFINED
- ANDROID_SO_UNDEFINED
- ANDROID_FUNCTION_LEVEL_LINKING
- ANDROID_GOLD_LINKER
- ANDROID_NOEXECSTACK
- ANDROID_RELRO
- ANDROID_LIBM_PATH
- ANDROID_EXPLICIT_CRT_LINK
- ANDROID_APP_PIE
- )
- if( DEFINED ${__var} )
- if( ${__var} MATCHES " ")
- set( __toolchain_config "${__toolchain_config}set( ${__var} \"${${__var}}\" CACHE INTERNAL \"\" )\n" )
- else()
- set( __toolchain_config "${__toolchain_config}set( ${__var} ${${__var}} CACHE INTERNAL \"\" )\n" )
- endif()
- endif()
- endforeach()
- file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/android.toolchain.config.cmake" "${__toolchain_config}" )
- unset( __toolchain_config )
-endif()
-
-
-# force cmake to produce / instead of \ in build commands for Ninja generator
-if( CMAKE_GENERATOR MATCHES "Ninja" AND CMAKE_HOST_WIN32 )
- # it is a bad hack after all
- # CMake generates Ninja makefiles with UNIX paths only if it thinks that we are going to build with MinGW
- set( CMAKE_COMPILER_IS_MINGW TRUE ) # tell CMake that we are MinGW
- set( CMAKE_CROSSCOMPILING TRUE ) # stop recursion
- enable_language( C )
- enable_language( CXX )
- # unset( CMAKE_COMPILER_IS_MINGW ) # can't unset because CMake does not convert back-slashes in response files without it
- unset( MINGW )
-endif()
-
-
-# Variables controlling behavior or set by cmake toolchain:
-# ANDROID_ABI : "armeabi-v7a" (default), "armeabi", "armeabi-v7a with NEON", "armeabi-v7a with VFPV3", "armeabi-v6 with VFP", "x86", "mips", "arm64-v8a", "x86_64", "mips64"
-# ANDROID_NATIVE_API_LEVEL : 3,4,5,8,9,14,15,16,17,18,19,21 (depends on NDK version)
-# ANDROID_STL : gnustl_static/gnustl_shared/stlport_static/stlport_shared/gabi++_static/gabi++_shared/system_re/system/none
-# ANDROID_FORBID_SYGWIN : ON/OFF
-# ANDROID_NO_UNDEFINED : ON/OFF
-# ANDROID_SO_UNDEFINED : OFF/ON (default depends on NDK version)
-# ANDROID_FUNCTION_LEVEL_LINKING : ON/OFF
-# ANDROID_GOLD_LINKER : ON/OFF
-# ANDROID_NOEXECSTACK : ON/OFF
-# ANDROID_RELRO : ON/OFF
-# ANDROID_FORCE_ARM_BUILD : ON/OFF
-# ANDROID_STL_FORCE_FEATURES : ON/OFF
-# ANDROID_LIBM_PATH : path to libm.so (set to something like $(TOP)/out/target/product/<product_name>/obj/lib/libm.so) to workaround unresolved `sincos`
-# Can be set only at the first run:
-# ANDROID_NDK : path to your NDK install
-# NDK_CCACHE : path to your ccache executable
-# ANDROID_TOOLCHAIN_NAME : the NDK name of compiler toolchain
-# ANDROID_NDK_HOST_X64 : try to use x86_64 toolchain (default for x64 host systems)
-# ANDROID_NDK_LAYOUT : the inner NDK structure (RELEASE, LINARO, ANDROID)
-# LIBRARY_OUTPUT_PATH_ROOT : <any valid path>
-# ANDROID_STANDALONE_TOOLCHAIN
-#
-# Primary read-only variables:
-# ANDROID : always TRUE
-# ARMEABI : TRUE for arm v6 and older devices
-# ARMEABI_V6 : TRUE for arm v6
-# ARMEABI_V7A : TRUE for arm v7a
-# ARM64_V8A : TRUE for arm64-v8a
-# NEON : TRUE if NEON unit is enabled
-# VFPV3 : TRUE if VFP version 3 is enabled
-# X86 : TRUE if configured for x86
-# X86_64 : TRUE if configured for x86_64
-# MIPS : TRUE if configured for mips
-# MIPS64 : TRUE if configured for mips64
-# BUILD_WITH_ANDROID_NDK : TRUE if NDK is used
-# BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used
-# ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform
-# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86", "mips", "arm64-v8a", "x86_64", "mips64" depending on ANDROID_ABI
-# ANDROID_NDK_RELEASE : from r5 to r10d; set only for NDK
-# ANDROID_NDK_RELEASE_NUM : numeric ANDROID_NDK_RELEASE version (1000*major+minor)
-# ANDROID_ARCH_NAME : "arm", "x86", "mips", "arm64", "x86_64", "mips64" depending on ANDROID_ABI
-# ANDROID_SYSROOT : path to the compiler sysroot
-# TOOL_OS_SUFFIX : "" or ".exe" depending on host platform
-# ANDROID_COMPILER_IS_CLANG : TRUE if clang compiler is used
-#
-# Secondary (less stable) read-only variables:
-# ANDROID_COMPILER_VERSION : GCC version used (not Clang version)
-# ANDROID_CLANG_VERSION : version of clang compiler if clang is used
-# ANDROID_CXX_FLAGS : C/C++ compiler flags required by Android platform
-# ANDROID_SUPPORTED_ABIS : list of currently allowed values for ANDROID_ABI
-# ANDROID_TOOLCHAIN_MACHINE_NAME : "arm-linux-androideabi", "arm-eabi" or "i686-android-linux"
-# ANDROID_TOOLCHAIN_ROOT : path to the top level of toolchain (standalone or placed inside NDK)
-# ANDROID_CLANG_TOOLCHAIN_ROOT : path to clang tools
-# ANDROID_SUPPORTED_NATIVE_API_LEVELS : list of native API levels found inside NDK
-# ANDROID_STL_INCLUDE_DIRS : stl include paths
-# ANDROID_RTTI : if rtti is enabled by the runtime
-# ANDROID_EXCEPTIONS : if exceptions are enabled by the runtime
-# ANDROID_GCC_TOOLCHAIN_NAME : read-only, differs from ANDROID_TOOLCHAIN_NAME only if clang is used
-#
-# Defaults:
-# ANDROID_DEFAULT_NDK_API_LEVEL
-# ANDROID_DEFAULT_NDK_API_LEVEL_${ARCH}
-# ANDROID_NDK_SEARCH_PATHS
-# ANDROID_SUPPORTED_ABIS_${ARCH}
-# ANDROID_SUPPORTED_NDK_VERSIONS
diff --git a/debian/changelog b/debian/changelog
index 080f1ce..93c5a48 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,50 @@
+libsfml (2.6.1+dfsg-3) unstable; urgency=medium
+
+ * d/copyright: Update date.
+ * d/control:
+ - Bump standards version to 4.7.0.
+ - Build-depend on pkgconf instead of pkg-config.
+ * d/patches: Add patch to avoid running tests during build. (Closes: #1069298)
+ * d/tests: Mark tests as superficial.
+
+ -- James Cowgill <jcowgill@debian.org> Sun, 12 May 2024 22:56:18 +0100
+
+libsfml (2.6.1+dfsg-2) unstable; urgency=medium
+
+ * Upload to unstable.
+
+ -- James Cowgill <jcowgill@debian.org> Sat, 02 Dec 2023 11:33:22 +0000
+
+libsfml (2.6.1+dfsg-1) experimental; urgency=medium
+
+ * New upstream version. (Closes: #1055440)
+ * Unbundle libstb. (Closes: #949709)
+ * Unbundle vulkan headers.
+
+ * d/copyright: Update for 2.6.1.
+ * d/control:
+ - Rename 2.5 packages to 2.6.
+ - Drop minimum versions from cmake and g++.
+ - Update obsolete dependencies in d/control.
+ - Tighten dependencies between packages.
+ - Manually depend on libgl1 and libvulkan1.
+ - Bump standards version.
+ - Use debhelper 13.
+ - Build depend on catch and libxcursor-dev.
+ * d/libsfml-doc.docs:
+ - Update docs source directory.
+ - Install doxygen tag file.
+ - Use fonts-tuffy package in examples.
+ * d/libsfml-window2.6: Add hardening-no-fortify-functions override
+ * d/not-installed: Ignore extra documentation files.
+ * d/rules:
+ - Update build config and enable test suite.
+ - Drop manual -Wl,--as-needed flag.
+ * d/upstream/metadata: Add file.
+ * d/watch: Use uscan version 4.
+
+ -- James Cowgill <jcowgill@debian.org> Tue, 28 Nov 2023 20:53:54 +0000
+
libsfml (2.5.1+dfsg-2) unstable; urgency=high
* Team upload.
diff --git a/debian/control b/debian/control
index 9d9ac3f..567d46a 100644
--- a/debian/control
+++ b/debian/control
@@ -4,21 +4,25 @@ Priority: optional
Maintainer: Debian Games Team <pkg-games-devel@lists.alioth.debian.org>
Uploaders:
James Cowgill <jcowgill@debian.org>
-Build-Depends: debhelper-compat (= 11),
- cmake (>= 3.0.2),
+Build-Depends: debhelper-compat (= 13),
+ cmake,
+ catch,
doxygen,
- g++ (>= 4:7),
libflac-dev,
- libfreetype6-dev,
- libgl1-mesa-dev,
+ libfreetype-dev,
+ libgl-dev,
libopenal-dev,
+ libstb-dev,
libudev-dev [linux-any],
libusbhid-dev [kfreebsd-any],
libvorbis-dev,
+ libvulkan-dev,
+ libxcursor-dev,
libx11-dev,
libxrandr-dev,
+ pkgconf,
Rules-Requires-Root: no
-Standards-Version: 4.2.1
+Standards-Version: 4.7.0
Homepage: https://www.sfml-dev.org/
Vcs-Git: https://salsa.debian.org/games-team/libsfml.git
Vcs-Browser: https://salsa.debian.org/games-team/libsfml
@@ -28,12 +32,12 @@ Section: libdevel
Architecture: any
Multi-Arch: same
Depends: ${misc:Depends},
- libgl1-mesa-dev | libgl-dev,
- libsfml-audio2.5 (= ${binary:Version}),
- libsfml-graphics2.5 (= ${binary:Version}),
- libsfml-network2.5 (= ${binary:Version}),
- libsfml-system2.5 (= ${binary:Version}),
- libsfml-window2.5 (= ${binary:Version})
+ libgl-dev,
+ libsfml-audio2.6 (= ${binary:Version}),
+ libsfml-graphics2.6 (= ${binary:Version}),
+ libsfml-network2.6 (= ${binary:Version}),
+ libsfml-system2.6 (= ${binary:Version}),
+ libsfml-window2.6 (= ${binary:Version})
Suggests: libsfml-doc
Description: Simple and Fast Multimedia Library - Development Files
SFML is a modern multimedia library offering a wide range of subsystems
@@ -43,11 +47,14 @@ Description: Simple and Fast Multimedia Library - Development Files
.
This package includes header files for all SFML libraries.
-Package: libsfml-audio2.5
+Package: libsfml-audio2.6
Architecture: any
Multi-Arch: same
Pre-Depends: ${misc:Pre-Depends}
-Depends: ${shlibs:Depends}, ${misc:Depends}
+Depends:
+ libsfml-system2.6 (= ${binary:Version}),
+ ${shlibs:Depends},
+ ${misc:Depends}
Description: Simple and Fast Multimedia Library - Audio part
SFML is a modern multimedia library offering a wide range of subsystems
useful to produce a multimedia app. It offers OpenGL integration for
@@ -57,11 +64,16 @@ Description: Simple and Fast Multimedia Library - Audio part
The Audio library is used to play sound and music in games. It is able to
load OGG/Vorbis files.
-Package: libsfml-graphics2.5
+Package: libsfml-graphics2.6
Architecture: any
Multi-Arch: same
Pre-Depends: ${misc:Pre-Depends}
-Depends: ${shlibs:Depends}, ${misc:Depends}
+Depends:
+ libgl1,
+ libsfml-system2.6 (= ${binary:Version}),
+ libsfml-window2.6 (= ${binary:Version}),
+ ${shlibs:Depends},
+ ${misc:Depends}
Description: Simple and Fast Multimedia Library - Graphics part
SFML is a modern multimedia library offering a wide range of subsystems
useful to produce a multimedia app. It offers OpenGL integration for
@@ -71,11 +83,14 @@ Description: Simple and Fast Multimedia Library - Graphics part
The Graphics library contains all the OpenGL and drawing code. It needs the
Window library for Window creation.
-Package: libsfml-network2.5
+Package: libsfml-network2.6
Architecture: any
Multi-Arch: same
Pre-Depends: ${misc:Pre-Depends}
-Depends: ${shlibs:Depends}, ${misc:Depends}
+Depends:
+ libsfml-system2.6 (= ${binary:Version}),
+ ${shlibs:Depends},
+ ${misc:Depends}
Description: Simple and Fast Multimedia Library - Network part
SFML is a modern multimedia library offering a wide range of subsystems
useful to produce a multimedia app. It offers OpenGL integration for
@@ -84,7 +99,7 @@ Description: Simple and Fast Multimedia Library - Network part
.
The Network Library brings basic networking support as needed by games.
-Package: libsfml-system2.5
+Package: libsfml-system2.6
Architecture: any
Multi-Arch: same
Pre-Depends: ${misc:Pre-Depends}
@@ -98,11 +113,16 @@ Description: Simple and Fast Multimedia Library - System part
The system library brings useful system utilities like multithreading and
UNICODE handling.
-Package: libsfml-window2.5
+Package: libsfml-window2.6
Architecture: any
Multi-Arch: same
Pre-Depends: ${misc:Pre-Depends}
-Depends: ${shlibs:Depends}, ${misc:Depends}
+Depends:
+ libgl1,
+ libsfml-system2.6 (= ${binary:Version}),
+ libvulkan1,
+ ${shlibs:Depends},
+ ${misc:Depends}
Description: Simple and Fast Multimedia Library - Window part
SFML is a modern multimedia library offering a wide range of subsystems
useful to produce a multimedia app. It offers OpenGL integration for
@@ -115,7 +135,7 @@ Package: libsfml-doc
Section: doc
Architecture: all
Multi-Arch: foreign
-Depends: ${misc:Depends}
+Depends: fonts-tuffy, ${misc:Depends}
Description: Simple and Fast Multimedia Library - Documentation
SFML is a modern multimedia library offering a wide range of subsystems
useful to produce a multimedia app. It offers OpenGL integration for
diff --git a/debian/copyright b/debian/copyright
index cfa65e4..d0419d5 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,88 +1,173 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: SFML (Simple and Fast Multimedia Library)
Source: https://github.com/SFML/SFML
- Repackaged to remove external libraries and non-dfsg example resources
+ Repackaged to remove external libraries
Files-Excluded:
- examples/android/app/src/main/assets/canary.wav
- examples/android/app/src/main/assets/orchestral.ogg
- examples/iOS/resources/canary.wav
- examples/iOS/resources/orchestral.ogg
- examples/opengl/resources/background.jpg
- examples/opengl/resources/texture.jpg
- examples/shader/resources/background.jpg
- examples/sound/resources/canary.wav
- examples/sound/resources/orchestral.ogg
- examples/win32/resources
extlibs/bin
extlibs/headers/AL
extlibs/headers/FLAC
+ extlibs/headers/catch.hpp
extlibs/headers/freetype2
extlibs/headers/mingw
extlibs/headers/ogg
+ extlibs/headers/stb_image
extlibs/headers/vorbis
+ extlibs/headers/vulkan
extlibs/libs-*
- tools/xcode
Files: *
Copyright:
+ 2007-2023, Laurent Gomila <laurent@sfml-dev.org>
+ 2007-2023, Marco Antognini <antognini.marco@gmail.com>
2013, David Demelier <demelier.david@gmail.com>
- 2013-2014, Jonathan De Wachter <dewachter.jonathan@gmail.com>a
- 2007-2018, Laurent Gomila <laurent.gom@sfml-dev.org>
- 2007-2018, Marco Antognini <antognini.marco@gmail.com>
+ 2013-2014, Jonathan De Wachter <dewachter.jonathan@gmail.com>
+ 2016-2023, Andrew Mickelson
License: Zlib
-Files:
- cmake/Modules/FindFreetype.cmake
- cmake/Modules/FindUDev.cmake
- cmake/toolchains/*
-Copyright:
- 2011-2014, Andrey Kamaev <andrey.kamaev@itseez.com>
- 2016, Bogdan Cristea <cristeab@gmail.com>
- 2010-2011, Ethan Rublee <ethan.ruble@gmail.com>
- 2007-2009, Kitware, Inc.
- 2011, Petr Vanek <petr@scribus.info>
+Files: cmake/Modules/FindFreetype.cmake
+Copyright: 2007-2009, Kitware, Inc.
+License: BSD-3-clause
+
+Files: cmake/Modules/FindUDev.cmake
+Copyright: 2011, Petr Vanek <petr@scribus.info>
+License: BSD-3-clause
+
+Files: cmake/toolchains/iOS.toolchain.cmake
+Copyright: 2016, Bogdan Cristea <cristeab@gmail.com>
License: BSD-3-clause
Files: debian/*
Copyright:
2008-2009 Christoph Egger <debian@christoph-egger.org>
- 2013-2018 James Cowgill <jcowgill@debian.org>
+ 2013-2024 James Cowgill <jcowgill@debian.org>
License: Zlib
Files:
debian/missing-sources/sfml-final-clean.svg
examples/android/app/src/main/assets/image.png
examples/android/app/src/main/res/*/sfml_logo.png
+ examples/assets/icon.icns
+ examples/assets/logo.png
examples/cocoa/resources/icon.icns
examples/cocoa/resources/logo.png
- examples/iOS/resources/image.png
+ examples/opengl/resources/logo.png
examples/shader/resources/logo.png
+ examples/tennis/resources/sfml_logo.png
+ examples/vulkan/resources/logo.png
+ tools/nsis/header.bmp
+ tools/nsis/sfml.ico
+ tools/nsis/sidebar.bmp
Copyright: Public Domain
License: public-domain-logo
The author has released the SFML logo into the public domain.
See http://en.sfml-dev.org/forums/index.php?topic=4960.msg78285#msg78285
Files:
- examples/android/app/src/main/assets/sansation.ttf
- examples/*/resources/sansation.ttf
-Copyright: 2011 Bernd Montag <berndmontag@gmx.de>
-License: OFL-1.1
+ examples/android/app/src/main/assets/tuffy.ttf
+ examples/cocoa/resources/tuffy.ttf
+ examples/island/resources/tuffy.ttf
+ examples/joystick/resources/tuffy.ttf
+ examples/opengl/resources/tuffy.ttf
+ examples/shader/resources/tuffy.ttf
+ examples/tennis/resources/tuffy.ttf
+ tools/xcode/templates/SFML/*/tuffy.ttf
+Copyright: 2004-2011, Thatcher Ulrich, Karoly Barta and Michael Everson
+License: public-domain-tuffy
+ We, the copyright holders of this work, hereby release it into the
+ public domain. This applies worldwide.
+ .
+ In case this is not legally possible,
+ .
+ We grant any entity the right to use this work for any purpose, without
+ any conditions, unless such conditions are required by law.
+ .
+ Thatcher Ulrich <tu@tulrich.com> http://tulrich.com
+ Karoly Barta
+ Michael Evans http://www.evertype.com
-Files: examples/shader/resources/devices.png
-Copyright: 2005 Alexander Moore
-License: GPL-2.0+
+Files: examples/sound/resources/ding.*
+Copyright: Kenny.nl
+License: CC0-1.0
+Comment: https://www.kenney.nl/assets/interface-sounds
-Files: examples/sound/resources/ding.flac
-Copyright: 2014 JaggedStone
+Files:
+ examples/opengl/resources/background.jpg
+ tools/xcode/templates/SFML/*/background.jpg
+Copyright: 2017, Nidhoggn
License: CC0-1.0
-Comment: http://opengameart.org/content/magic-spell-sfx
+Comment: https://opengameart.org/content/backgrounds-3
Files:
- examples/island/stb_perlin.h
- extlibs/headers/stb_image/*
+ examples/shader/resources/background.jpg
+Copyright: Arcana Dea
+License: CC0-1.0
+Comment:
+ https://www.publicdomainpictures.net/en/view-image.php?image=10979&picture=monarch-butterfly
+
+Files: examples/shader/resources/devices.png
+License: CC0-1.0
+Copyright: Kenny.nl
+Comment: https://www.kenney.nl/assets/game-icons
+
+Files:
+ examples/sound/resources/doodle_pop.ogg
+ examples/tennis/resources/ball.wav
+ tools/xcode/templates/SFML/*/doodle_pop.ogg
+Copyright: MrZeusTheCoder
+License: Unlicense
+Comment: https://github.com/MrZeusTheCoder/public-domain
+
+Files: examples/sound/resources/killdeer.wav
+Copyright: United States National Park Service
+License: public-domain-nps
+ Copyright law does not protect "any work of the U.S. Government" where
+ "a work prepared by an officer or employee of the U.S. Government as
+ part of that person's official duties" (See, 17 U.S.C. Ā§Ā§ 101,
+ 105). Thus, material created by the NPS and presented on this website,
+ unless otherwise indicated, is generally considered in the public
+ domain. It may be distributed or copied as permitted by applicable
+ law.
+Comment: https://www.nps.gov/subjects/sound/sounds-killdeer.htm
+
+Files: examples/win32/resources/image*.jpg
+Copyright: Kenny.nl
+License: CC0-1.0
+Comment: https://www.kenney.nl/assets/toon-characters-1
+
+Files: examples/island/stb_perlin.h
Copyright: 2007, Sean Barrett
License: Expat
+Files:
+ examples/X11/gl.h
+ examples/opengl/gl.h
+ examples/window/gl.h
+ extlibs/headers/glad/include/glad/gl.h
+ extlibs/headers/glad/include/glad/glx.h
+ extlibs/headers/glad/include/glad/wgl.h
+Copyright: 2007-2020, The Khronos Group Inc
+License: CC0-1.0 and Expat
+Comment:
+ Generated glad code is licensed as CC0. Portions based on OpenGL
+ headers licensed as Expat.
+
+Files:
+ examples/vulkan/vulkan.h
+ extlibs/headers/glad/include/glad/egl.h
+Copyright: 2007-2020, The Khronos Group Inc
+License: CC0-1.0 and Apache-2.0
+Comment:
+ Generated glad code is licensed as CC0. Portions based on OpenGL
+ and Vulkan headers licensed as Apache-2.0.
+
+Files: extlibs/headers/minimp3/*
+Copyright: lieff
+License: CC0-1.0
+
+License: Apache-2.0
+ On Debian systems, the full Apache-2.0 license text can be found at
+ /usr/share/common-licenses/Apache-2.0.
+
License: BSD-3-clause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -110,6 +195,17 @@ License: BSD-3-clause
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
+License: CC0-1.0
+ To the extent possible under law, the author(s) have dedicated all copyright
+ and related and neighboring rights to this software to the public domain
+ worldwide. This software is distributed without any warranty.
+ .
+ You should have received a copy of the CC0 Public Domain Dedication along with
+ this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
+ .
+ On Debian systems, the full text of the CC0 1.0 Universal license can be found
+ in the file `/usr/share/common-licenses/CC0-1.0'.
+
License: Expat
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
@@ -129,126 +225,31 @@ License: Expat
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-License: CC0-1.0
- To the extent possible under law, the author(s) have dedicated all copyright
- and related and neighboring rights to this software to the public domain
- worldwide. This software is distributed without any warranty.
- .
- You should have received a copy of the CC0 Public Domain Dedication along with
- this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
- .
- On Debian systems, the full text of the CC0 1.0 Universal license can be found
- in the file `/usr/share/common-licenses/CC0-1.0'.
-
-License: GPL-2.0+
- This program is free software; you can redistribute it
- and/or modify it under the terms of the GNU General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later
- version.
- .
- This program is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied
- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the GNU General Public License for more
- details.
- .
- You should have received a copy of the GNU General Public
- License along with this package; if not, write to the Free
- Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- Boston, MA 02110-1301 USA
- .
- On Debian systems, the full text of the GNU General Public
- License version 2 can be found in the file
- `/usr/share/common-licenses/GPL-2'.
-
-License: OFL-1.1
- -----------------------------------------------------------
- SIL OPEN FONT LICENSE Version 1.1 - 1 February 2007
- -----------------------------------------------------------
- .
- PREAMBLE
- The goals of the Open Font License (OFL) are to stimulate worldwide
- development of collaborative font projects, to support the font creation
- efforts of academic and linguistic communities, and to provide a free and
- open framework in which fonts may be shared and improved in partnership
- with others.
- .
- The OFL allows the licensed fonts to be used, studied, modified and
- redistributed freely as long as they are not sold by themselves. The
- fonts, including any derivative works, can be bundled, embedded,
- redistributed and/or sold with any software provided that the font
- names of derivative works are changed. The fonts and derivatives,
- however, cannot be released under any other type of license. The
- requirement for fonts to remain under this license does not apply
- to any document created using the fonts or their derivatives.
- .
- DEFINITIONS
- "Font Software" refers to the set of files released by the Copyright
- Holder(s) under this license and clearly marked as such. This may
- include source files, build scripts and documentation.
- .
- "Reserved Font Name" refers to any names specified as such after the
- copyright statement(s).
- .
- "Original Version" refers to the collection of Font Software components as
- distributed by the Copyright Holder(s).
- .
- "Modified Version" refers to any derivative made by adding to, deleting,
- or substituting -- in part or in whole -- any of the components of the
- Original Version, by changing formats or by porting the Font Software to a
- new environment.
- .
- "Author" refers to any designer, engineer, programmer, technical
- writer or other person who contributed to the Font Software.
- .
- PERMISSION & CONDITIONS
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of the Font Software, to use, study, copy, merge, embed, modify,
- redistribute, and sell modified and unmodified copies of the Font
- Software, subject to the following conditions:
- .
- 1) Neither the Font Software nor any of its individual components,
- in Original or Modified Versions, may be sold by itself.
- .
- 2) Original or Modified Versions of the Font Software may be bundled,
- redistributed and/or sold with any software, provided that each copy
- contains the above copyright notice and this license. These can be
- included either as stand-alone text files, human-readable headers or
- in the appropriate machine-readable metadata fields within text or
- binary files as long as those fields can be easily viewed by the user.
- .
- 3) No Modified Version of the Font Software may use the Reserved Font
- Name(s) unless explicit written permission is granted by the corresponding
- Copyright Holder. This restriction only applies to the primary font name as
- presented to the users.
+License: Unlicense
+ This is free and unencumbered software released into the public domain.
.
- 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
- Software shall not be used to promote, endorse or advertise any
- Modified Version, except to acknowledge the contribution(s) of the
- Copyright Holder(s) and the Author(s) or with their explicit written
- permission.
+ Anyone is free to copy, modify, publish, use, compile, sell, or
+ distribute this software, either in source code form or as a compiled
+ binary, for any purpose, commercial or non-commercial, and by any
+ means.
.
- 5) The Font Software, modified or unmodified, in part or in whole,
- must be distributed entirely under this license, and must not be
- distributed under any other license. The requirement for fonts to
- remain under this license does not apply to any document created
- using the Font Software.
+ In jurisdictions that recognize copyright laws, the author or authors
+ of this software dedicate any and all copyright interest in the
+ software to the public domain. We make this dedication for the benefit
+ of the public at large and to the detriment of our heirs and
+ successors. We intend this dedication to be an overt act of
+ relinquishment in perpetuity of all present and future rights to this
+ software under copyright law.
.
- TERMINATION
- This license becomes null and void if any of the above conditions are
- not met.
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
.
- DISCLAIMER
- THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
- OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
- COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
- DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
- OTHER DEALINGS IN THE FONT SOFTWARE.
+ For more information, please refer to <https://unlicense.org>
License: Zlib
This software is provided 'as-is', without any express or implied warranty.
diff --git a/debian/libsfml-audio2.5.install b/debian/libsfml-audio2.6.install
index 8a7b276..8a7b276 100644
--- a/debian/libsfml-audio2.5.install
+++ b/debian/libsfml-audio2.6.install
diff --git a/debian/libsfml-doc.docs b/debian/libsfml-doc.docs
index f9a1781..c2fcc52 100644
--- a/debian/libsfml-doc.docs
+++ b/debian/libsfml-doc.docs
@@ -1 +1,2 @@
-usr/share/SFML/doc/html
+usr/share/doc/SFML/SFML.tag
+usr/share/doc/SFML/html
diff --git a/debian/libsfml-doc.links b/debian/libsfml-doc.links
new file mode 100644
index 0000000..aecc6eb
--- /dev/null
+++ b/debian/libsfml-doc.links
@@ -0,0 +1,7 @@
+usr/share/fonts/truetype/tuffy/tuffy_regular.ttf usr/share/doc/libsfml-dev/examples/android/app/src/main/assets/tuffy.ttf
+usr/share/fonts/truetype/tuffy/tuffy_regular.ttf usr/share/doc/libsfml-dev/examples/cocoa/resources/tuffy.ttf
+usr/share/fonts/truetype/tuffy/tuffy_regular.ttf usr/share/doc/libsfml-dev/examples/island/resources/tuffy.ttf
+usr/share/fonts/truetype/tuffy/tuffy_regular.ttf usr/share/doc/libsfml-dev/examples/joystick/resources/tuffy.ttf
+usr/share/fonts/truetype/tuffy/tuffy_regular.ttf usr/share/doc/libsfml-dev/examples/opengl/resources/tuffy.ttf
+usr/share/fonts/truetype/tuffy/tuffy_regular.ttf usr/share/doc/libsfml-dev/examples/shader/resources/tuffy.ttf
+usr/share/fonts/truetype/tuffy/tuffy_regular.ttf usr/share/doc/libsfml-dev/examples/tennis/resources/tuffy.ttf
diff --git a/debian/libsfml-graphics2.5.install b/debian/libsfml-graphics2.6.install
index 1853f3b..1853f3b 100644
--- a/debian/libsfml-graphics2.5.install
+++ b/debian/libsfml-graphics2.6.install
diff --git a/debian/libsfml-network2.5.install b/debian/libsfml-network2.6.install
index b769faf..b769faf 100644
--- a/debian/libsfml-network2.5.install
+++ b/debian/libsfml-network2.6.install
diff --git a/debian/libsfml-system2.5.install b/debian/libsfml-system2.6.install
index 19b0317..19b0317 100644
--- a/debian/libsfml-system2.5.install
+++ b/debian/libsfml-system2.6.install
diff --git a/debian/libsfml-system2.5.lintian-overrides b/debian/libsfml-system2.6.lintian-overrides
index d91ea2e..259c5e9 100644
--- a/debian/libsfml-system2.5.lintian-overrides
+++ b/debian/libsfml-system2.6.lintian-overrides
@@ -1,3 +1,3 @@
# The libsfml-system package doesn't use any functions which can be
# fortified, even though all the correct flags are passed.
-libsfml-system2.5 binary: hardening-no-fortify-functions
+libsfml-system2.6 binary: hardening-no-fortify-functions
diff --git a/debian/libsfml-window2.5.install b/debian/libsfml-window2.6.install
index bf25e6e..bf25e6e 100644
--- a/debian/libsfml-window2.5.install
+++ b/debian/libsfml-window2.6.install
diff --git a/debian/libsfml-window2.6.lintian-overrides b/debian/libsfml-window2.6.lintian-overrides
new file mode 100644
index 0000000..1302a56
--- /dev/null
+++ b/debian/libsfml-window2.6.lintian-overrides
@@ -0,0 +1,3 @@
+# The libsfml-window package doesn't use any functions which can be
+# fortified, even though all the correct flags are passed.
+libsfml-window2.6 binary: hardening-no-fortify-functions
diff --git a/debian/not-installed b/debian/not-installed
new file mode 100644
index 0000000..f68d8fa
--- /dev/null
+++ b/debian/not-installed
@@ -0,0 +1,2 @@
+usr/share/doc/SFML/license.md
+usr/share/doc/SFML/readme.md
diff --git a/debian/patches/02_build-doc-once.patch b/debian/patches/02_build-doc-once.patch
index 3674295..caa2dfa 100644
--- a/debian/patches/02_build-doc-once.patch
+++ b/debian/patches/02_build-doc-once.patch
@@ -10,8 +10,8 @@ Forwarded: no
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
-@@ -45,7 +45,7 @@ configure_file(${DOXYGEN_INPUT_DIR}/doc/
- configure_file(${DOXYGEN_INPUT_DIR}/doc/doxygen.css ${DOXYGEN_OUTPUT_DIR}/html/doxygen.css COPYONLY)
+@@ -46,7 +46,7 @@ configure_file(${DOXYGEN_INPUT_DIR}/doc/
+ configure_file(${DOXYGEN_INPUT_DIR}/doc/searchOverrides.css ${DOXYGEN_OUTPUT_DIR}/html/searchOverrides.css COPYONLY)
# target setup
-add_custom_target(doc ALL
diff --git a/debian/patches/03_unbundle_vulkan.patch b/debian/patches/03_unbundle_vulkan.patch
new file mode 100644
index 0000000..33ee7c2
--- /dev/null
+++ b/debian/patches/03_unbundle_vulkan.patch
@@ -0,0 +1,40 @@
+Description: Unbundle Vulkan
+ Use headers from libvulkan-dev and link directly to the library
+ instead of using bundled copy removed from extlibs.
+Author: James Cowgill <jcowgill@debian.org>
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/src/SFML/Window/CMakeLists.txt
++++ b/src/SFML/Window/CMakeLists.txt
+@@ -306,7 +306,8 @@ if ((NOT BUILD_SHARED_LIBS) AND SFML_OS_
+ endif()
+
+ # Vulkan headers
+-target_include_directories(sfml-window PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/vulkan")
++find_package(Vulkan REQUIRED)
++target_link_libraries(sfml-window PRIVATE Vulkan::Vulkan)
+
+ # CMake 3.11 and later prefer to choose GLVND, but we choose legacy OpenGL for backward compability
+ # (unless the OpenGL_GL_PREFERENCE was explicitly set)
+--- a/src/SFML/Window/Unix/VulkanImplX11.cpp
++++ b/src/SFML/Window/Unix/VulkanImplX11.cpp
+@@ -30,7 +30,7 @@
+ #include <dlfcn.h>
+ #define VK_USE_PLATFORM_XLIB_KHR
+ #define VK_NO_PROTOTYPES
+-#include <vulkan.h>
++#include <vulkan/vulkan.h>
+ #include <string>
+ #include <map>
+ #include <cstring>
+--- a/src/SFML/Window/Win32/VulkanImplWin32.cpp
++++ b/src/SFML/Window/Win32/VulkanImplWin32.cpp
+@@ -32,7 +32,7 @@
+ #include <windows.h>
+ #define VK_USE_PLATFORM_WIN32_KHR
+ #define VK_NO_PROTOTYPES
+-#include <vulkan.h>
++#include <vulkan/vulkan.h>
+ #include <string>
+ #include <map>
+ #include <cstring>
diff --git a/debian/patches/04_unbundle_stb.patch b/debian/patches/04_unbundle_stb.patch
new file mode 100644
index 0000000..bff2832
--- /dev/null
+++ b/debian/patches/04_unbundle_stb.patch
@@ -0,0 +1,35 @@
+Description: Unbundle libstb
+ Use headers from libstb-dev and link directly to the library instead
+ of using bundled copy removed from extlibs.
+Author: James Cowgill <jcowgill@debian.org>
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/src/SFML/Graphics/CMakeLists.txt
++++ b/src/SFML/Graphics/CMakeLists.txt
+@@ -93,7 +93,9 @@ sfml_add_library(sfml-graphics
+ target_link_libraries(sfml-graphics PUBLIC sfml-window)
+
+ # stb_image sources
+-target_include_directories(sfml-graphics SYSTEM PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/stb_image")
++find_package(PkgConfig REQUIRED)
++pkg_check_modules(stb REQUIRED IMPORTED_TARGET stb)
++target_link_libraries(sfml-graphics PRIVATE PkgConfig::stb)
+
+ # glad sources
+ target_include_directories(sfml-graphics SYSTEM PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/glad/include")
+--- a/src/SFML/Graphics/ImageLoader.cpp
++++ b/src/SFML/Graphics/ImageLoader.cpp
+@@ -28,12 +28,11 @@
+ #include <SFML/Graphics/ImageLoader.hpp>
+ #include <SFML/System/InputStream.hpp>
+ #include <SFML/System/Err.hpp>
+-#define STB_IMAGE_IMPLEMENTATION
+ #include <stb_image.h>
+-#define STB_IMAGE_WRITE_IMPLEMENTATION
+ #include <stb_image_write.h>
+ #include <cctype>
+ #include <iterator>
++#include <cstring>
+
+
+ namespace
diff --git a/debian/patches/05_cmake_override_doc_path.patch b/debian/patches/05_cmake_override_doc_path.patch
new file mode 100644
index 0000000..1848702
--- /dev/null
+++ b/debian/patches/05_cmake_override_doc_path.patch
@@ -0,0 +1,35 @@
+Description: Override SFML_DOC_PATH in SFMLConfig.cmake
+ The existing detection assumes the documentation is installed in
+ /usr/share/doc/SFML, but we install it into
+ /usr/share/doc/libsfml-dev.
+Author: James Cowgill <jcowgill@debian.org>
+Forwarded: not-needed
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/cmake/SFMLConfig.cmake.in
++++ b/cmake/SFMLConfig.cmake.in
+@@ -63,23 +63,7 @@ if (NOT SFML_FIND_COMPONENTS)
+ message(FATAL_ERROR "find_package(SFML) called with no component")
+ endif()
+
+-set(FIND_SFML_PATHS
+- "${CMAKE_CURRENT_LIST_DIR}/../.."
+- ${SFML_ROOT}
+- $ENV{SFML_ROOT}
+- ~/Library/Frameworks
+- /Library/Frameworks
+- /usr/local
+- /usr
+- /sw
+- /opt/local
+- /opt/csw
+- /opt)
+-
+-find_path(SFML_DOC_DIR SFML.tag
+- PATH_SUFFIXES SFML/doc share/doc/SFML
+- PATHS ${FIND_SFML_PATHS})
+-
++set(SFML_DOC_PATH "/usr/share/doc/libsfml-dev")
+
+ # Update requested components (eg. request window component if graphics component was requested)
+ set(FIND_SFML_SYSTEM_DEPENDENCIES "")
diff --git a/debian/patches/07_remove-runtests-all.patch b/debian/patches/07_remove-runtests-all.patch
new file mode 100644
index 0000000..aa45104
--- /dev/null
+++ b/debian/patches/07_remove-runtests-all.patch
@@ -0,0 +1,23 @@
+Description: Don't automatically run tests after build
+Origin: backport, https://github.com/SFML/SFML/commit/0b6254394275dfe7450772689134681bc7f36daf
+Author: Chris Thrasher <chrisjthrasher@gmail.com>
+Bug: https://github.com/SFML/SFML/pull/2446
+Bug-Debian: https://bugs.debian.org/1069298
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/test/CMakeLists.txt
++++ b/test/CMakeLists.txt
+@@ -41,11 +41,8 @@ if(SFML_BUILD_NETWORK)
+ sfml_add_test(test-sfml-network "${NETWORK_SRC}" sfml-network)
+ endif()
+
+-# Automatically run the tests at the end of the build
+-add_custom_target(runtests ALL
+- DEPENDS test-sfml-system test-sfml-window test-sfml-graphics test-sfml-network
+-)
+-
++# Convenience for building and running tests in a single command
++add_custom_target(runtests DEPENDS test-sfml-system test-sfml-window test-sfml-graphics test-sfml-network test-sfml-audio)
+ add_custom_command(TARGET runtests
+ COMMENT "Run tests"
+ POST_BUILD COMMAND ctest ARGS --output-on-failure
diff --git a/debian/patches/series b/debian/patches/series
index 8fe6881..b081397 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,7 @@
01_remove-googleapi-css.patch
02_build-doc-once.patch
+03_unbundle_vulkan.patch
+04_unbundle_stb.patch
+05_cmake_override_doc_path.patch
06_pkgconfig-libs-private.patch
+07_remove-runtests-all.patch
diff --git a/debian/rules b/debian/rules
index 0064c41..5892f3e 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,22 +1,20 @@
#!/usr/bin/make -f
-# -*- makefile -*-
-
-include /usr/share/dpkg/architecture.mk
-
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
-export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
%:
dh $@
override_dh_auto_configure:
dh_auto_configure -- \
- -DLIB_SUFFIX=/$(DEB_HOST_MULTIARCH) \
-DSFML_BUILD_DOC=ON \
- -DSFML_PKGCONFIG_INSTALL_PREFIX=/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig
+ -DSFML_BUILD_EXAMPLES=ON \
+ -DSFML_BUILD_TEST_SUITE=ON
override_dh_auto_build:
dh_auto_build -- all doc
override_dh_installexamples:
dh_installexamples -X.gitignore
+
+override_dh_compress:
+ dh_compress -XSFML.tag
diff --git a/debian/tests/control b/debian/tests/control
index 4a1a5d5..57d4c4d 100644
--- a/debian/tests/control
+++ b/debian/tests/control
@@ -1,5 +1,7 @@
Tests: build
Depends: g++, libsfml-dev, pkg-config
+Restrictions: superficial
Tests: cmake
Depends: cmake, g++, libsfml-dev, make
+Restrictions: superficial
diff --git a/debian/upstream/metadata b/debian/upstream/metadata
new file mode 100644
index 0000000..54f79a2
--- /dev/null
+++ b/debian/upstream/metadata
@@ -0,0 +1,7 @@
+---
+Bug-Database: https://github.com/SFML/SFML/issues
+Bug-Submit: https://github.com/SFML/SFML/issues/new
+Documentation: https://www.sfml-dev.org/documentation/
+FAQ: https://www.sfml-dev.org/faq.php
+Repository: https://github.com/SFML/SFML.git
+Repository-Browse: https://github.com/SFML/SFML
diff --git a/debian/watch b/debian/watch
index 48a60a9..d5d7ba0 100644
--- a/debian/watch
+++ b/debian/watch
@@ -1,5 +1,5 @@
# See uscan(1) for format
-version=3
+version=4
# From GitHub
opts=repack,compression=xz,filenamemangle=s/.+\/v?(\d\S*)\.tar\.gz/SFML-$1\.tar\.gz/,dversionmangle=s/\+dfsg\d?$//,repacksuffix=+dfsg \
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
index e52f115..c77d10d 100644
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
@@ -43,6 +43,7 @@ configure_file(${DOXYGEN_INPUT_DIR}/doc/header.html.in ${DOXYGEN_OUTPUT_DIR}/hea
# copy the files needed by the documentation
configure_file(${DOXYGEN_INPUT_DIR}/doc/doxygen.css ${DOXYGEN_OUTPUT_DIR}/html/doxygen.css COPYONLY)
+configure_file(${DOXYGEN_INPUT_DIR}/doc/searchOverrides.css ${DOXYGEN_OUTPUT_DIR}/html/searchOverrides.css COPYONLY)
# target setup
add_custom_target(doc
@@ -52,11 +53,14 @@ add_custom_target(doc
WORKING_DIRECTORY ${DOXYGEN_INPUT_DIR})
# setup install rules
+install(FILES ${DOXYGEN_OUTPUT_DIR}/SFML.tag
+ DESTINATION ${CMAKE_INSTALL_DOCDIR}
+ COMPONENT doc)
install(DIRECTORY ${DOXYGEN_OUTPUT_DIR}/html
- DESTINATION ${SFML_MISC_INSTALL_PREFIX}/doc
+ DESTINATION ${CMAKE_INSTALL_DOCDIR}
COMPONENT doc)
if(DOXYGEN_HHC_PROGRAM)
install(FILES ${DOXYGEN_OUTPUT_DIR}/sfml.chm
- DESTINATION ${SFML_MISC_INSTALL_PREFIX}/doc
+ DESTINATION ${CMAKE_INSTALL_DOCDIR}
COMPONENT doc)
endif()
diff --git a/doc/doxyfile.in b/doc/doxyfile.in
index 104ff75..67cf6b4 100644
--- a/doc/doxyfile.in
+++ b/doc/doxyfile.in
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.14
+# Doxyfile 1.9.6
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
@@ -12,15 +12,25 @@
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").
+#
+# Note:
+#
+# Use doxygen to compare the used configuration file with the template
+# configuration file:
+# doxygen -x [configFile]
+# Use doxygen to compare the used configuration file with the template
+# configuration file without replacing the environment variables or CMake type
+# replacement variables:
+# doxygen -x_noenv [configFile]
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all text
-# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
-# built into libc) for the transcoding. See
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
# The default value is: UTF-8.
@@ -60,16 +70,28 @@ PROJECT_LOGO =
OUTPUT_DIRECTORY = "@DOXYGEN_OUTPUT_DIR@"
-# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
+# sub-directories (in 2 levels) under the output directory of each output format
+# and will distribute the generated files over these directories. Enabling this
# option can be useful when feeding doxygen a huge amount of source files, where
# putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
+# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
+# control the number of sub-directories.
# The default value is: NO.
CREATE_SUBDIRS = NO
+# Controls the number of sub-directories that will be created when
+# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
+# level increment doubles the number of directories, resulting in 4096
+# directories at level 8 which is the default and also the maximum value. The
+# sub-directories are organized in 2 levels, the first level always has a fixed
+# number of 16 directories.
+# Minimum value: 0, maximum value: 8, default value: 8.
+# This tag requires that the tag CREATE_SUBDIRS is set to YES.
+
+CREATE_SUBDIRS_LEVEL = 8
+
# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
# characters to appear in the names of generated files. If set to NO, non-ASCII
# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
@@ -81,14 +103,14 @@ ALLOW_UNICODE_NAMES = NO
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
-# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
-# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
-# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
-# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
-# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
-# Ukrainian and Vietnamese.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
+# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
+# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
+# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
+# English messages), Korean, Korean-en (Korean with English messages), Latvian,
+# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
+# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
+# Swedish, Turkish, Ukrainian and Vietnamese.
# The default value is: English.
OUTPUT_LANGUAGE = English
@@ -171,7 +193,7 @@ STRIP_FROM_PATH =
# specify the list of include paths that are normally passed to the compiler
# using the -I flag.
-STRIP_FROM_INC_PATH =
+STRIP_FROM_INC_PATH = "@DOXYGEN_INPUT_DIR@/include"
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
# less readable) file names. This can be useful is your file systems doesn't
@@ -189,6 +211,16 @@ SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = YES
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by doxygen.
+# The default value is: NO.
+
+JAVADOC_BANNER = NO
+
# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
# line (until the first dot) of a Qt-style comment as the brief description. If
# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
@@ -209,6 +241,14 @@ QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
+# By default Python docstrings are displayed as preformatted text and doxygen's
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
+# doxygen's special commands can be used and the contents of the docstring
+# documentation blocks is shown as doxygen documentation.
+# The default value is: YES.
+
+PYTHON_DOCSTRING = YES
+
# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
# documentation from any documented member that it re-implements.
# The default value is: YES.
@@ -232,12 +272,16 @@ TAB_SIZE = 4
# the documentation. An alias has the form:
# name=value
# For example adding
-# "sideeffect=@par Side Effects:\n"
+# "sideeffect=@par Side Effects:^^"
# will allow you to put the command \sideeffect (or @sideeffect) in the
# documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines (in the resulting output). You can put ^^ in the value part of an
-# alias to insert a newline as if a physical newline was in the original file.
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
+# to insert newlines (in the resulting output). You can put ^^ in the value part
+# of an alias to insert a newline as if a physical newline was in the original
+# file. When you need a literal { or } or , in the value part of an alias you
+# have to escape them by means of a backslash (\), this can lead to conflicts
+# with the commands \{ and \} for these it is advised to use the version @{ and
+# @} or use a double escape (\\{ and \\})
#---------------------------------------------------------------------------
# SFML specific aliases
@@ -258,12 +302,6 @@ TAB_SIZE = 4
ALIASES = "sfplatform{1}=<dl class=\"attention\"><dt>Platform Limitation</dt><dd><b>This is only available on \1.</b></dd></dl>" \
"sfplatform{2}=<dl class=\"attention\"><dt>Platform Limitation</dt><dd><b>This is only available on \1</b> and to use it, you'll have to specifically include \2 in your code.</dd></dl>"
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST =
-
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For
# instance, some of the names that are used will be different. The list of all
@@ -292,28 +330,40 @@ OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE = NO
+
# Doxygen selects the parser to use depending on the extension of the files it
# parses. With this tag you can assign which parser to use for a given
# extension. Doxygen has a built-in mapping, but you can override or extend it
# using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
-# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
-# Fortran. In the later case the parser tries to guess whether the code is fixed
-# or free formatted code, this is the default for Fortran type files), VHDL. For
-# instance to make doxygen treat .inc files as Fortran files (default is PHP),
-# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files). For instance to make doxygen treat .inc files
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C.
#
# Note: For files without extension you can use no_extension as a placeholder.
#
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
+# the files are not read by doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
EXTENSION_MAPPING =
# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
# according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
# The output of markdown processing is further processed by doxygen, so you can
# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
# case of backward compatibilities issues.
@@ -325,7 +375,7 @@ MARKDOWN_SUPPORT = YES
# to that level are automatically included in the table of contents, even if
# they do not have an id attribute.
# Note: This feature currently applies only to Markdown headings.
-# Minimum value: 0, maximum value: 99, default value: 0.
+# Minimum value: 0, maximum value: 99, default value: 5.
# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
TOC_INCLUDE_HEADINGS = 0
@@ -441,6 +491,19 @@ TYPEDEF_HIDES_STRUCT = NO
LOOKUP_CACHE_SIZE = 0
+# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use
+# during processing. When set to 0 doxygen will based this on the number of
+# cores available in the system. You can set it explicitly to a value larger
+# than 0 to get more control over the balance between CPU load and processing
+# speed. At this moment only the input processing can be done using multiple
+# threads. Since this is still an experimental feature the default is set to 1,
+# which effectively disables parallel processing. Please report any issues you
+# encounter. Generating dot graphs in parallel is controlled by the
+# DOT_NUM_THREADS setting.
+# Minimum value: 0, maximum value: 32, default value: 1.
+
+NUM_PROC_THREADS = 1
+
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
@@ -461,6 +524,12 @@ EXTRACT_ALL = NO
EXTRACT_PRIVATE = NO
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL = NO
+
# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
# scope will be included in the documentation.
# The default value is: NO.
@@ -498,6 +567,13 @@ EXTRACT_LOCAL_METHODS = NO
EXTRACT_ANON_NSPACES = NO
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
# undocumented members inside documented classes or files. If set to NO these
# members will be included in the various overviews, but no documentation
@@ -509,14 +585,15 @@ HIDE_UNDOC_MEMBERS = NO
# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy. If set
# to NO, these classes will be included in the various overviews. This option
-# has no effect if EXTRACT_ALL is enabled.
+# will also hide undocumented C++ concepts if enabled. This option has no effect
+# if EXTRACT_ALL is enabled.
# The default value is: NO.
HIDE_UNDOC_CLASSES = NO
# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO, these declarations will be
-# included in the documentation.
+# declarations. If set to NO, these declarations will be included in the
+# documentation.
# The default value is: NO.
HIDE_FRIEND_COMPOUNDS = NO
@@ -535,12 +612,20 @@ HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-# The default value is: system dependent.
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and MacOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
+# Possible values are: SYSTEM, NO and YES.
+# The default value is: SYSTEM.
CASE_SENSE_NAMES = YES
@@ -558,6 +643,12 @@ HIDE_SCOPE_NAMES = NO
HIDE_COMPOUND_REFERENCE= NO
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
+# will show which file needs to be included to use the class.
+# The default value is: YES.
+
+SHOW_HEADERFILE = YES
+
# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
# the files that are included by a file in the documentation of that file.
# The default value is: YES.
@@ -715,7 +806,8 @@ FILE_VERSION_FILTER =
# output files in an output format independent way. To create the layout file
# that represents doxygen's defaults, run doxygen with the -l option. You can
# optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
+# will be used as the name of the layout file. See also section "Changing the
+# layout of pages" for information.
#
# Note that if you run doxygen from a directory containing a file called
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
@@ -761,23 +853,43 @@ WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
+# potential errors in the documentation, such as documenting some parameters in
+# a documented function twice, or documenting parameters that don't exist or
+# using markup commands wrongly.
# The default value is: YES.
WARN_IF_DOC_ERROR = YES
+# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
+# function parameter documentation. If set to NO, doxygen will accept that some
+# parameters have no documentation without warning.
+# The default value is: YES.
+
+WARN_IF_INCOMPLETE_DOC = YES
+
# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
# are documented, but have no documentation for their parameters or return
-# value. If set to NO, doxygen will only warn about wrong or incomplete
-# parameter documentation, but not about the absence of documentation.
+# value. If set to NO, doxygen will only warn about wrong parameter
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
+# set to YES then this flag will automatically be disabled. See also
+# WARN_IF_INCOMPLETE_DOC
# The default value is: NO.
WARN_NO_PARAMDOC = YES
+# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about
+# undocumented enumeration values. If set to NO, doxygen will accept
+# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: NO.
+
+WARN_IF_UNDOC_ENUM_VAL = NO
+
# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the doxygen process doxygen will return with a non-zero status.
+# Possible values are: NO, YES and FAIL_ON_WARNINGS.
# The default value is: NO.
WARN_AS_ERROR = NO
@@ -788,13 +900,27 @@ WARN_AS_ERROR = NO
# and the warning text. Optionally the format may contain $version, which will
# be replaced by the version of the file (if it could be obtained via
# FILE_VERSION_FILTER)
+# See also: WARN_LINE_FORMAT
# The default value is: $file:$line: $text.
WARN_FORMAT = "$file:$line: $text"
+# In the $text part of the WARN_FORMAT command it is possible that a reference
+# to a more specific place is given. To make it easier to jump to this place
+# (outside of doxygen) the user can define a custom "cut" / "paste" string.
+# Example:
+# WARN_LINE_FORMAT = "'vi $file +$line'"
+# See also: WARN_FORMAT
+# The default value is: at line $line of file $file.
+
+WARN_LINE_FORMAT = "at line $line of file $file"
+
# The WARN_LOGFILE tag can be used to specify a file to which warning and error
# messages should be written. If left blank the output is written to standard
-# error (stderr).
+# error (stderr). In case the file specified cannot be opened for writing the
+# warning and error messages are written to standard error. When as file - is
+# specified the warning and error messages are written to standard output
+# (stdout).
WARN_LOGFILE =
@@ -814,12 +940,23 @@ INPUT = "@DOXYGEN_INPUT_DIR@/include/SFML" \
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
-# possible encodings.
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
+# See also: INPUT_FILE_ENCODING
# The default value is: UTF-8.
INPUT_ENCODING = UTF-8
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
+# character encoding on a per file pattern basis. Doxygen will compare the file
+# name with each pattern and apply the encoding instead of the default
+# INPUT_ENCODING) if there is a match. The character encodings are a list of the
+# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding
+# "INPUT_ENCODING" for further information on supported encodings.
+
+INPUT_FILE_ENCODING =
+
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories.
@@ -828,11 +965,15 @@ INPUT_ENCODING = UTF-8
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# read by doxygen.
#
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
+#
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
-# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
+# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
+# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
+# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
+# *.vhdl, *.ucf, *.qsf and *.ice.
FILE_PATTERNS = *.hpp
@@ -878,7 +1019,7 @@ EXCLUDE_PATTERNS = .git \
# (namespaces, classes, functions, etc.) that should be excluded from the
# output. The symbol name can be a fully qualified name, a word, or if the
# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
+# ANamespace::AClass, ANamespace::*Test
#
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories use the pattern */test/*
@@ -926,6 +1067,11 @@ IMAGE_PATH =
# code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly.
#
+# Note that doxygen will use the data processed and written to standard output
+# for further processing, therefore nothing else, like debug statements or used
+# commands (so in case of a Windows batch file always use @echo OFF), should be
+# written to standard output.
+#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# properly processed by doxygen.
@@ -967,6 +1113,15 @@ FILTER_SOURCE_PATTERNS =
USE_MDFILE_AS_MAINPAGE =
+# The Fortran standard specifies that for fixed formatted Fortran code all
+# characters from position 72 are to be considered as comment. A common
+# extension is to allow longer lines before the automatic comment starts. The
+# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
+# be processed before the automatic comment starts.
+# Minimum value: 7, maximum value: 10000, default value: 72.
+
+FORTRAN_COMMENT_AFTER = 72
+
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
@@ -994,7 +1149,7 @@ INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# function all documented functions referencing it will be listed.
+# entity all documented functions referencing it will be listed.
# The default value is: NO.
REFERENCED_BY_RELATION = NO
@@ -1031,7 +1186,7 @@ SOURCE_TOOLTIPS = YES
#
# To use it do the following:
# - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
# - Make sure the INPUT points to the root of the source tree
# - Run doxygen as normal
#
@@ -1053,6 +1208,46 @@ USE_HTAGS = NO
VERBATIM_HEADERS = YES
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see:
+# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
+# performance. This can be particularly helpful with template rich C++ code for
+# which doxygen's built-in parser lacks the necessary type information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS
+# tag is set to YES then doxygen will add the directory of each input to the
+# include path.
+# The default value is: YES.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_ADD_INC_PATHS = YES
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS =
+
+# If clang assisted parsing is enabled you can provide the clang parser with the
+# path to the directory containing a file called compile_commands.json. This
+# file is the compilation database (see:
+# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
+# options used when the source files were built. This is equivalent to
+# specifying the -p option to a clang tool, such as clang-check. These options
+# will then be passed to the parser. Any options specified with CLANG_OPTIONS
+# will be added as well.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+
+CLANG_DATABASE_PATH =
+
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
@@ -1064,17 +1259,11 @@ VERBATIM_HEADERS = YES
ALPHABETICAL_INDEX = YES
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX = 3
-
-# In case all classes in a project start with a common prefix, all classes will
-# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
-# can be used to specify a prefix (or a list of prefixes) that should be ignored
-# while generating the index headers.
+# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes)
+# that should be ignored while generating the index headers. The IGNORE_PREFIX
+# tag works for classes, function and member names. The entity will be placed in
+# the alphabetical list under the first letter of the entity name that remains
+# after removing the prefix.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
IGNORE_PREFIX =
@@ -1153,10 +1342,15 @@ HTML_STYLESHEET = "@DOXYGEN_INPUT_DIR@/doc/doxygen.css"
# Doxygen will copy the style sheet files to the output directory.
# Note: The order of the extra style sheet files is of importance (e.g. the last
# style sheet in the list overrules the setting of the previous ones in the
-# list). For an example see the documentation.
+# list).
+# Note: Since the styling of scrollbars can currently not be overruled in
+# Webkit/Chromium, the styling will be left out of the default doxygen.css if
+# one or more extra stylesheets have been specified. So if scrollbar
+# customization is desired it has to be added explicitly. For an example see the
+# documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_STYLESHEET =
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note
@@ -1168,9 +1362,22 @@ HTML_EXTRA_STYLESHEET =
HTML_EXTRA_FILES =
+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
+# should be rendered with a dark or light theme.
+# Possible values are: LIGHT always generate light mode output, DARK always
+# generate dark mode output, AUTO_LIGHT automatically set the mode according to
+# the user preference, use light mode if no preference is set (the default),
+# AUTO_DARK automatically set the mode according to the user preference, use
+# dark mode if no preference is set and TOGGLE allow to user to switch between
+# light and dark mode via a button.
+# The default value is: AUTO_LIGHT.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE = LIGHT
+
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
+# this color. Hue is specified as an angle on a color-wheel, see
# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
# purple, and 360 is red again.
@@ -1180,7 +1387,7 @@ HTML_EXTRA_FILES =
HTML_COLORSTYLE_HUE = 220
# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
+# in the HTML output. For a value of 0 the output will use gray-scales only. A
# value of 255 will produce the most vivid colors.
# Minimum value: 0, maximum value: 255, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1209,9 +1416,9 @@ HTML_TIMESTAMP = NO
# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
# documentation will contain a main index with vertical navigation menus that
-# are dynamically created via Javascript. If disabled, the navigation index will
+# are dynamically created via JavaScript. If disabled, the navigation index will
# consists of multiple levels of tabs that are statically embedded in every HTML
-# page. Disable this option to support browsers that do not have Javascript,
+# page. Disable this option to support browsers that do not have JavaScript,
# like the Qt help browser.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1241,13 +1448,14 @@ HTML_INDEX_NUM_ENTRIES = 100
# If the GENERATE_DOCSET tag is set to YES, additional index files will be
# generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: https://developer.apple.com/tools/xcode/), introduced with
-# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1261,6 +1469,13 @@ GENERATE_DOCSET = NO
DOCSET_FEEDNAME = "SFML Documentation"
+# This tag determines the URL of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDURL =
+
# This tag specifies a string that should uniquely identify the documentation
# set bundle. This should be a reverse domain-name style string, e.g.
# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
@@ -1286,8 +1501,12 @@ DOCSET_PUBLISHER_NAME = SFML
# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
+# on Windows. In the beginning of 2021 Microsoft took the original page, with
+# a.o. the download links, offline the HTML help workshop was already many years
+# in maintenance mode). You can download the HTML help workshop from the web
+# archives at Installation executable (see:
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
#
# The HTML Help Workshop contains a compiler that can convert all HTML output
# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
@@ -1317,7 +1536,7 @@ CHM_FILE = ../SFML.chm
HHC_LOCATION = "@DOXYGEN_HHC_PROGRAM@"
# The GENERATE_CHI flag controls if a separate .chi index file is generated
-# (YES) or that it should be included in the master .chm file (NO).
+# (YES) or that it should be included in the main .chm file (NO).
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
@@ -1362,7 +1581,8 @@ QCH_FILE =
# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
# Project output. For more information please see Qt Help Project / Namespace
-# (see: http://doc.qt.io/qt-4.8/qthelpproject.html#namespace).
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_QHP is set to YES.
@@ -1370,7 +1590,8 @@ QHP_NAMESPACE = org.doxygen.Project
# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
# Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders).
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
# The default value is: doc.
# This tag requires that the tag GENERATE_QHP is set to YES.
@@ -1378,28 +1599,30 @@ QHP_VIRTUAL_FOLDER = doc
# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
# filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_NAME =
# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
# custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_ATTRS =
# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
# project's filter section matches. Qt Help Project / Filter Attributes (see:
-# http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes).
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_SECT_FILTER_ATTRS =
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
# This tag requires that the tag GENERATE_QHP is set to YES.
QHG_LOCATION =
@@ -1442,16 +1665,28 @@ DISABLE_INDEX = NO
# to work a browser that supports JavaScript, DHTML, CSS and frames is required
# (i.e. any modern browser). Windows users are probably better off using the
# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
+# further fine tune the look of the index (see "Fine-tuning the output"). As an
+# example, the default style sheet generated by doxygen has an example that
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
+# Since the tree basically has the same information as the tab index, you could
+# consider setting DISABLE_INDEX to YES when enabling this option.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_TREEVIEW = NO
+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
+# area (value NO) or if it should extend to the full height of the window (value
+# YES). Setting this to YES gives a layout similar to
+# https://docs.readthedocs.io with more room for contents, but less room for the
+# project logo, title, and description. If either GENERATE_TREEVIEW or
+# DISABLE_INDEX is set to NO, this option has no effect.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FULL_SIDEBAR = NO
+
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
# doxygen will group on one line in the generated HTML documentation.
#
@@ -1476,6 +1711,24 @@ TREEVIEW_WIDTH = 250
EXT_LINKS_IN_WINDOW = NO
+# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
+# addresses.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+OBFUSCATE_EMAILS = YES
+
+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
+# the HTML output. These images will generally look nicer at scaled resolutions.
+# Possible values are: png (the default) and svg (looks nicer but requires the
+# pdf2svg or inkscape tool).
+# The default value is: png.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FORMULA_FORMAT = png
+
# Use this tag to change the font size of LaTeX formulas included as images in
# the HTML documentation. When you change the font size after a successful
# doxygen run you need to manually remove any form_*.png images from the HTML
@@ -1485,19 +1738,14 @@ EXT_LINKS_IN_WINDOW = NO
FORMULA_FONTSIZE = 10
-# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
-FORMULA_TRANSPARENT = YES
+FORMULA_MACROFILE =
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# https://www.mathjax.org) which uses client side Javascript for the rendering
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
# installed or if you want to formulas look prettier in the HTML output. When
# enabled you may also need to install MathJax separately and configure the path
@@ -1507,11 +1755,29 @@ FORMULA_TRANSPARENT = YES
USE_MATHJAX = NO
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
+# Note that the different versions of MathJax have different requirements with
+# regards to the different settings, so it is possible that also other MathJax
+# settings have to be changed when switching between the different MathJax
+# versions.
+# Possible values are: MathJax_2 and MathJax_3.
+# The default value is: MathJax_2.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_VERSION = MathJax_2
+
# When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
+# the MathJax output. For more details about the output format see MathJax
+# version 2 (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
+# (see:
+# http://docs.mathjax.org/en/latest/web/components/output.html).
# Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
+# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
+# is the name for Mathjax version 3, for MathJax version 2 this will be
+# translated into HTML-CSS) and SVG.
# The default value is: HTML-CSS.
# This tag requires that the tag USE_MATHJAX is set to YES.
@@ -1524,22 +1790,29 @@ MATHJAX_FORMAT = HTML-CSS
# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
# Content Delivery Network so you can quickly see the result without installing
# MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from https://www.mathjax.org before deployment.
-# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/.
+# MathJax from https://www.mathjax.org before deployment. The default value is:
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_RELPATH = https://cdn.mathjax.org/mathjax/latest
# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
# extension names that should be enabled during MathJax rendering. For example
+# for MathJax version 2 (see
+# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# For example for MathJax version 3 (see
+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
+# MATHJAX_EXTENSIONS = ams
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_EXTENSIONS =
# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
# of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
# example see the documentation.
# This tag requires that the tag USE_MATHJAX is set to YES.
@@ -1564,10 +1837,10 @@ MATHJAX_CODEFILE =
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
-SEARCHENGINE = NO
+SEARCHENGINE = YES
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using Javascript. There
+# implemented using a web server instead of a web client using JavaScript. There
# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
# setting. When disabled, doxygen will generate a PHP script for searching and
# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
@@ -1586,7 +1859,8 @@ SERVER_BASED_SEARCH = NO
#
# Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/).
+# Xapian (see:
+# https://xapian.org/).
#
# See the section "External Indexing and Searching" for details.
# The default value is: NO.
@@ -1599,8 +1873,9 @@ EXTERNAL_SEARCH = NO
#
# Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/). See the section "External Indexing and
-# Searching" for details.
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
# This tag requires that the tag SEARCHENGINE is set to YES.
SEARCHENGINE_URL =
@@ -1651,21 +1926,35 @@ LATEX_OUTPUT = latex
# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
# invoked.
#
-# Note that when enabling USE_PDFLATEX this option is only used for generating
-# bitmaps for formulas in the HTML output, but not in the Makefile that is
-# written to the output directory.
-# The default file is: latex.
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_CMD_NAME = latex
# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
# index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
# The default file is: makeindex.
# This tag requires that the tag GENERATE_LATEX is set to YES.
MAKEINDEX_CMD_NAME = makeindex
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD = makeindex
+
# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
# documents. This may be useful for small projects and may help to save some
# trees in general.
@@ -1695,29 +1984,31 @@ PAPER_TYPE = a4
EXTRA_PACKAGES =
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
+# the generated LaTeX document. The header should contain everything until the
+# first chapter. If it is left blank doxygen will generate a standard header. It
+# is highly recommended to start with a default header using
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
+# and then modify the file new_header.tex. See also section "Doxygen usage" for
+# information on how to generate the default header that doxygen normally uses.
#
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
-# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
-# string, for the replacement values of the other commands the user is referred
-# to HTML_HEADER.
+# Note: Only use a user-defined header if you know what you are doing!
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. The following
+# commands have a special meaning inside the header (and footer): For a
+# description of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_HEADER =
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer. See
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
+# the generated LaTeX document. The footer should contain everything after the
+# last chapter. If it is left blank doxygen will generate a standard footer. See
# LATEX_HEADER for more information on how to generate a default footer and what
-# special commands can be used inside the footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
+# special commands can be used inside the footer. See also section "Doxygen
+# usage" for information on how to generate the default footer that doxygen
+# normally uses. Note: Only use a user-defined footer if you know what you are
+# doing!
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_FOOTER =
@@ -1750,9 +2041,11 @@ LATEX_EXTRA_FILES =
PDF_HYPERLINKS = YES
-# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES, to get a
-# higher quality PDF documentation.
+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
+# files. Set this option to YES, to get a higher quality PDF documentation.
+#
+# See also section LATEX_CMD_NAME for selecting the engine.
# The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES.
@@ -1760,8 +2053,7 @@ USE_PDFLATEX = YES
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
+# if errors occur, instead of asking the user for help.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
@@ -1774,16 +2066,6 @@ LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_SOURCE_CODE = NO
-
# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
# bibliography, e.g. plainnat, or ieeetr. See
# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
@@ -1800,6 +2082,14 @@ LATEX_BIB_STYLE = plain
LATEX_TIMESTAMP = NO
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EMOJI_DIRECTORY =
+
#---------------------------------------------------------------------------
# Configuration options related to the RTF output
#---------------------------------------------------------------------------
@@ -1839,9 +2129,9 @@ COMPACT_RTF = NO
RTF_HYPERLINKS = NO
-# Load stylesheet definitions from file. Syntax is similar to doxygen's config
-# file, i.e. a series of assignments. You only have to provide replacements,
-# missing definitions are set to their default value.
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
#
# See also section "Doxygen usage" for information on how to generate the
# default style sheet that doxygen normally uses.
@@ -1850,22 +2140,12 @@ RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's config file. A template extensions file can be generated
-# using doxygen -e rtf extensionFile.
+# similar to doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
# This tag requires that the tag GENERATE_RTF is set to YES.
RTF_EXTENSIONS_FILE =
-# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
-# with syntax highlighting in the RTF output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_SOURCE_CODE = NO
-
#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------
@@ -1937,6 +2217,13 @@ XML_OUTPUT = xml
XML_PROGRAMLISTING = YES
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
#---------------------------------------------------------------------------
@@ -1955,15 +2242,6 @@ GENERATE_DOCBOOK = NO
DOCBOOK_OUTPUT = docbook
-# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
-# program listings (including syntax highlighting and cross-referencing
-# information) to the DOCBOOK output. Note that enabling this will significantly
-# increase the size of the DOCBOOK output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_PROGRAMLISTING = NO
-
#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
@@ -1977,6 +2255,10 @@ DOCBOOK_PROGRAMLISTING = NO
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
+# Configuration options related to Sqlite3 output
+#---------------------------------------------------------------------------
+
+#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
@@ -2050,7 +2332,8 @@ SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by the
-# preprocessor.
+# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
+# RECURSIVE has no effect here.
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
INCLUDE_PATH =
@@ -2121,7 +2404,7 @@ TAGFILES =
# tag file that is based on the input files it reads. See section "Linking to
# external documentation" for more information about the usage of tag files.
-GENERATE_TAGFILE = @DOXYGEN_OUTPUT_DIR@/SFML.tag
+GENERATE_TAGFILE = "@DOXYGEN_OUTPUT_DIR@/SFML.tag"
# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
# the class index. If set to NO, only the inherited external classes will be
@@ -2144,34 +2427,10 @@ EXTERNAL_GROUPS = YES
EXTERNAL_PAGES = YES
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH = /usr/bin/perl
-
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
-# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
-CLASS_DIAGRAMS = YES
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH =
-
# You can include diagrams made with dia in doxygen documentation. Doxygen will
# then run dia to produce the diagram and insert it in the documentation. The
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
@@ -2204,35 +2463,50 @@ HAVE_DOT = NO
DOT_NUM_THREADS = 0
-# When you want a differently looking font in the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
+# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
+# subgraphs. When you want a differently looking font in the dot files that
+# doxygen generates you can specify fontname, fontcolor and fontsize attributes.
+# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node,
+# Edge and Graph Attributes specification</a> You need to make sure dot is able
+# to find the font, which can be done by putting it in a standard location or by
+# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font. Default graphviz fontsize is 14.
+# The default value is: fontname=Helvetica,fontsize=10.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_FONTNAME = Helvetica
+DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
+# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
+# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a
+# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about
+# arrows shapes.</a>
+# The default value is: labelfontname=Helvetica,labelfontsize=10.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_FONTSIZE = 10
+DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
+# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
+# around nodes set 'shape=plain' or 'shape=plaintext' <a
+# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
+# The default value is: shape=box,height=0.2,width=0.4.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
+
+# You can set the path where dot can find font specified with fontname in
+# DOT_COMMON_ATTR and others dot attributes.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTPATH =
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
+# graph for each documented class showing the direct and indirect inheritance
+# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
+# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
+# to TEXT the direct and indirect inheritance relations will be shown as texts /
+# links.
+# Possible values are: NO, YES, TEXT and GRAPH.
# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
CLASS_GRAPH = YES
@@ -2246,7 +2520,8 @@ CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
+# groups, showing the direct groups dependencies. See also the chapter Grouping
+# in the manual.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
@@ -2269,10 +2544,32 @@ UML_LOOK = NO
# but if the number exceeds 15, the total amount of fields shown is limited to
# 10.
# Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
+# This tag requires that the tag UML_LOOK is set to YES.
UML_LIMIT_NUM_FIELDS = 10
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will wrapped across multiple lines. Some heuristics are apply
+# to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD = 17
+
# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
# collaboration graphs will show the relations between templates and their
# instances.
@@ -2339,6 +2636,13 @@ GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
+# of child directories generated in directory dependency graphs by dot.
+# Minimum value: 1, maximum value: 25, default value: 1.
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
+
+DIR_GRAPH_MAX_DEPTH = 1
+
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. For an explanation of the image formats see the section
# output formats in the documentation of the dot tool (Graphviz (see:
@@ -2392,10 +2696,10 @@ MSCFILE_DIRS =
DIAFILE_DIRS =
# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
-# path where java can find the plantuml.jar file. If left blank, it is assumed
-# PlantUML is not used or called during a preprocessing step. Doxygen will
-# generate a warning when it encounters a \startuml command in this case and
-# will not generate output for the diagram.
+# path where java can find the plantuml.jar file or to the filename of jar file
+# to be used. If left blank, it is assumed PlantUML is not used or called during
+# a preprocessing step. Doxygen will generate a warning when it encounters a
+# \startuml command in this case and will not generate output for the diagram.
PLANTUML_JAR_PATH =
@@ -2433,18 +2737,6 @@ DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_TRANSPARENT = NO
-
# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This
# makes dot run faster, but since only newer versions of dot (>1.8.10) support
@@ -2457,14 +2749,18 @@ DOT_MULTI_TARGETS = NO
# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
# explaining the meaning of the various boxes and arrows in the dot generated
# graphs.
+# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
+# graphical representation for inheritance and collaboration diagrams is used.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
GENERATE_LEGEND = YES
-# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
# files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc temporary
+# files.
# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
DOT_CLEANUP = YES
diff --git a/doc/doxygen.css b/doc/doxygen.css
index 9c2fc6a..632fbba 100644
--- a/doc/doxygen.css
+++ b/doc/doxygen.css
@@ -1062,18 +1062,26 @@ tr.heading h2 {
display: table;
}
+.tablist {
+ width: 100%;
+}
+
.tablist li {
float: left;
display: table-cell;
list-style: none;
}
+#navrow1 .tablist li:last-child {
+ float: right;
+}
+
#navrow1 {
border-top: 1px solid #999;
margin-top: 2em;
}
-#navrow1 .tablist a, #navrow2 .tablist a, #navrow3 .tablist a, #navrow4 .tablist a {
+#navrow1 .tablist a:not(#MSearchClose), #navrow2 .tablist a, #navrow3 .tablist a, #navrow4 .tablist a {
display: block;
margin: 8px 0;
padding: 0 8px;
@@ -1246,7 +1254,7 @@ div.contents ul li {
width: 24px;
height: 18px;
margin-bottom: 4px;
- background-image:url('ftv2folderopen.png');
+ background-image:url('folderopen.png');
background-position: 0px -4px;
background-repeat: repeat-y;
vertical-align:top;
@@ -1257,7 +1265,7 @@ div.contents ul li {
width: 24px;
height: 18px;
margin-bottom: 4px;
- background-image:url('ftv2folderclosed.png');
+ background-image:url('folderclosed.png');
background-position: 0px -4px;
background-repeat: repeat-y;
vertical-align:top;
@@ -1268,7 +1276,7 @@ div.contents ul li {
width: 24px;
height: 18px;
margin-bottom: 4px;
- background-image:url('ftv2doc.png');
+ background-image:url('doc.png');
background-position: 0px -4px;
background-repeat: repeat-y;
vertical-align:top;
diff --git a/doc/header.html.in b/doc/header.html.in
index a06170b..dd95639 100644
--- a/doc/header.html.in
+++ b/doc/header.html.in
@@ -7,6 +7,15 @@
<link rel="stylesheet" type="text/css" href="doxygen.css" title="default" media="screen,print" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
+ <link rel="stylesheet" type="text/css" href="search/search.css" />
+ <link rel="stylesheet" type="text/css" href="searchOverrides.css" />
+ <script type="text/javascript" src="search/searchdata.js"></script>
+ <script type="text/javascript" src="search/search.js"></script>
+ <script type="text/javascript">
+ /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+ $(document).ready(function() { init_search(); });
+ /* @license-end */
+ </script>
</head>
<body>
<div id="banner-container">
diff --git a/doc/mainpage.hpp b/doc/mainpage.hpp
index 16f2c43..db549d9 100644
--- a/doc/mainpage.hpp
+++ b/doc/mainpage.hpp
@@ -1,9 +1,9 @@
////////////////////////////////////////////////////////////
-/// \mainpage
+/// \mainpage SFML Documentation
///
/// \section welcome Welcome
/// Welcome to the official SFML documentation. Here you will find a detailed
-/// view of all the SFML <a href="./annotated.php">classes</a> and functions. <br/>
+/// view of all the SFML classes and functions. <br/>
/// If you are looking for tutorials, you can visit the official website
/// at <a href="https://www.sfml-dev.org/">www.sfml-dev.org</a>.
///
diff --git a/doc/searchOverrides.css b/doc/searchOverrides.css
new file mode 100644
index 0000000..19b17e6
--- /dev/null
+++ b/doc/searchOverrides.css
@@ -0,0 +1,45 @@
+/* Override search/search.css rules to adjust seach box placement */
+#MSearchBox {
+ position: relative;
+ display: block;
+ border-radius: 0;
+ box-shadow: none;
+ border-width: 1px;
+ border-color: #BBB;
+ border-style: solid;
+}
+.right #MSearchClose {
+ margin: 0;
+ right: auto;
+}
+#MSearchResultsWindow {
+ background-color: #EAF5DB;
+ border-color: #999;
+}
+#MSearchResults > .SRPage {
+ background-color: #EAF5DB;
+}
+a.SRSymbol {
+ color: rgb(70, 100, 30);
+}
+a.SRSymbol:hover {
+ text-decoration: underline;
+}
+a.SRScope {
+ color: rgb(70, 100, 30);
+}
+a.SRScope:hover {
+ text-decoration: underline;
+}
+#MSearchSelectWindow {
+ background-color: #EAF5DB;
+}
+#MSearchSelectWindow > a.SelectItem {
+ color: #333;
+ text-decoration: none;
+}
+#MSearchSelectWindow > a.SelectItem:hover {
+ color: white;
+ background-color: #8CC841;
+ text-decoration: none;
+}
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index a13f585..e537438 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -1,10 +1,5 @@
-
-# iOS Demo
-if(SFML_OS_IOS)
- add_subdirectory(iOS)
-else(SFML_OS_IOS)
-
- # add the examples subdirectories
+# CLI based examples
+if (NOT SFML_OS_IOS)
if(SFML_BUILD_NETWORK)
add_subdirectory(ftp)
add_subdirectory(sockets)
@@ -16,23 +11,33 @@ else(SFML_OS_IOS)
add_subdirectory(sound)
add_subdirectory(sound_capture)
endif()
- if(SFML_BUILD_WINDOW)
- add_subdirectory(window)
- endif()
- if(SFML_BUILD_GRAPHICS)
+endif()
+
+# GUI based examples
+if(SFML_BUILD_WINDOW)
+ add_subdirectory(window)
+endif()
+
+if(SFML_BUILD_GRAPHICS)
+ add_subdirectory(opengl)
+
+ if (NOT SFML_OS_IOS)
add_subdirectory(joystick)
- add_subdirectory(opengl)
add_subdirectory(shader)
add_subdirectory(island)
- if(SFML_OS_WINDOWS)
- add_subdirectory(win32)
- elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD)
+ add_subdirectory(vulkan)
+ endif()
+
+ if(SFML_OS_WINDOWS)
+ add_subdirectory(win32)
+ elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD)
+ if(NOT SFML_USE_DRM)
add_subdirectory(X11)
- elseif(SFML_OS_MACOSX)
- add_subdirectory(cocoa)
endif()
+ elseif(SFML_OS_MACOSX AND ${CMAKE_GENERATOR} MATCHES "Xcode")
+ add_subdirectory(cocoa)
endif()
- if(SFML_BUILD_GRAPHICS AND SFML_BUILD_AUDIO)
- add_subdirectory(pong)
- endif()
-endif(SFML_OS_IOS) \ No newline at end of file
+endif()
+if(SFML_BUILD_GRAPHICS AND SFML_BUILD_AUDIO)
+ add_subdirectory(tennis)
+endif()
diff --git a/examples/X11/CMakeLists.txt b/examples/X11/CMakeLists.txt
index 27509a6..0ff90ac 100644
--- a/examples/X11/CMakeLists.txt
+++ b/examples/X11/CMakeLists.txt
@@ -7,4 +7,7 @@ set(SRC ${SRCROOT}/X11.cpp)
# define the X11 target
sfml_add_example(X11Example GUI_APP
SOURCES ${SRC}
- DEPENDS sfml-window OpenGL X11)
+ DEPENDS sfml-window X11)
+
+# external dependency headers
+target_include_directories(X11Example SYSTEM PRIVATE ${PROJECT_SOURCE_DIR}/examples/X11) \ No newline at end of file
diff --git a/examples/X11/X11.cpp b/examples/X11/X11.cpp
index 746bf07..76d52d3 100644
--- a/examples/X11/X11.cpp
+++ b/examples/X11/X11.cpp
@@ -3,8 +3,10 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Window.hpp>
-#include <SFML/System/Err.hpp>
-#include <SFML/OpenGL.hpp>
+
+#define GLAD_GL_IMPLEMENTATION
+#include <gl.h>
+
#include <X11/Xlib.h>
#include <iostream>
#include <cmath>
@@ -23,7 +25,13 @@ void initialize(sf::Window& window)
// Setup OpenGL states
// Set color and depth clear value
+
+#ifdef SFML_OPENGL_ES
+ glClearDepthf(1.f);
+#else
glClearDepth(1.f);
+#endif
+
glClearColor(0.f, 0.5f, 0.5f, 0.f);
// Enable Z-buffer read and write
@@ -33,9 +41,14 @@ void initialize(sf::Window& window)
// Setup a perspective projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
- static const double pi = 3.141592654;
- GLdouble extent = std::tan(90.0 * pi / 360.0);
- glFrustum(-extent, extent, -extent, extent, 1.0, 500.0);
+ static const float pi = 3.141592654f;
+ float extent = std::tan(90.0f * pi / 360.0f);
+
+#ifdef SFML_OPENGL_ES
+ glFrustumf(-extent, extent, -extent, extent, 1.0f, 500.0f);
+#else
+ glFrustum(-extent, extent, -extent, extent, 1.0f, 500.0f);
+#endif
// Enable position and texture coordinates vertex components
glEnableClientState(GL_VERTEX_ARRAY);
@@ -177,6 +190,15 @@ int main()
// Create a clock for measuring elapsed time
sf::Clock clock;
+ // Load OpenGL or OpenGL ES entry points using glad
+ sfmlView1.setActive();
+
+#ifdef SFML_OPENGL_ES
+ gladLoadGLES1(reinterpret_cast<GLADloadfunc>(sf::Context::getFunction));
+#else
+ gladLoadGL(reinterpret_cast<GLADloadfunc>(sf::Context::getFunction));
+#endif
+
// Initialize our views
initialize(sfmlView1);
initialize(sfmlView2);
@@ -210,6 +232,13 @@ int main()
sfmlView2.display();
}
+ // Close our SFML views before destroying the underlying window
+ sfmlView1.close();
+ sfmlView2.close();
+
+ // Destroy the window
+ XDestroyWindow(display, window);
+
// Close the display
XCloseDisplay(display);
diff --git a/examples/X11/gl.h b/examples/X11/gl.h
new file mode 100644
index 0000000..54500f6
--- /dev/null
+++ b/examples/X11/gl.h
@@ -0,0 +1,7837 @@
+/**
+ * Loader generated by glad 2.0.0-beta on Wed Jul 17 01:48:58 2019
+ *
+ * Generator: C/C++
+ * Specification: gl
+ * Extensions: 42
+ *
+ * APIs:
+ * - gl:compatibility=1.1
+ * - gles1:common=1.0
+ *
+ * Options:
+ * - MX_GLOBAL = False
+ * - ON_DEMAND = False
+ * - LOADER = False
+ * - ALIAS = True
+ * - HEADER_ONLY = True
+ * - DEBUG = False
+ * - MX = False
+ *
+ * Commandline:
+ * --merge --api='gl:compatibility=1.1,gles1:common=1.0' --extensions='GL_ARB_copy_buffer,GL_ARB_fragment_shader,GL_ARB_framebuffer_object,GL_ARB_geometry_shader4,GL_ARB_get_program_binary,GL_ARB_imaging,GL_ARB_multitexture,GL_ARB_separate_shader_objects,GL_ARB_shader_objects,GL_ARB_shading_language_100,GL_ARB_texture_non_power_of_two,GL_ARB_vertex_buffer_object,GL_ARB_vertex_program,GL_ARB_vertex_shader,GL_EXT_blend_equation_separate,GL_EXT_blend_func_separate,GL_EXT_blend_minmax,GL_EXT_blend_subtract,GL_EXT_copy_texture,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_EXT_geometry_shader4,GL_EXT_packed_depth_stencil,GL_EXT_subtexture,GL_EXT_texture_array,GL_EXT_texture_object,GL_EXT_texture_sRGB,GL_EXT_vertex_array,GL_INGR_blend_func_separate,GL_KHR_debug,GL_NV_geometry_program4,GL_NV_vertex_program,GL_SGIS_texture_edge_clamp,GL_EXT_sRGB,GL_OES_blend_equation_separate,GL_OES_blend_func_separate,GL_OES_blend_subtract,GL_OES_framebuffer_object,GL_OES_packed_depth_stencil,GL_OES_single_precision,GL_OES_texture_npot' c --alias --header-only
+ *
+ * Online:
+ * http://glad.sh/#api=gl%3Acompatibility%3D1.1%2Cgles1%3Acommon%3D1.0&extensions=GL_ARB_copy_buffer%2CGL_ARB_fragment_shader%2CGL_ARB_framebuffer_object%2CGL_ARB_geometry_shader4%2CGL_ARB_get_program_binary%2CGL_ARB_imaging%2CGL_ARB_multitexture%2CGL_ARB_separate_shader_objects%2CGL_ARB_shader_objects%2CGL_ARB_shading_language_100%2CGL_ARB_texture_non_power_of_two%2CGL_ARB_vertex_buffer_object%2CGL_ARB_vertex_program%2CGL_ARB_vertex_shader%2CGL_EXT_blend_equation_separate%2CGL_EXT_blend_func_separate%2CGL_EXT_blend_minmax%2CGL_EXT_blend_subtract%2CGL_EXT_copy_texture%2CGL_EXT_framebuffer_blit%2CGL_EXT_framebuffer_multisample%2CGL_EXT_framebuffer_object%2CGL_EXT_geometry_shader4%2CGL_EXT_packed_depth_stencil%2CGL_EXT_subtexture%2CGL_EXT_texture_array%2CGL_EXT_texture_object%2CGL_EXT_texture_sRGB%2CGL_EXT_vertex_array%2CGL_INGR_blend_func_separate%2CGL_KHR_debug%2CGL_NV_geometry_program4%2CGL_NV_vertex_program%2CGL_SGIS_texture_edge_clamp%2CGL_EXT_sRGB%2CGL_OES_blend_equation_separate%2CGL_OES_blend_func_separate%2CGL_OES_blend_subtract%2CGL_OES_framebuffer_object%2CGL_OES_packed_depth_stencil%2CGL_OES_single_precision%2CGL_OES_texture_npot&generator=c&options=MERGE%2CALIAS%2CHEADER_ONLY
+ *
+ */
+
+#ifndef GLAD_GL_H_
+#define GLAD_GL_H_
+
+#ifdef __gl_h_
+ #error OpenGL header already included (API: gl), remove previous include!
+#endif
+#define __gl_h_ 1
+
+
+#define GLAD_GL
+#define GLAD_OPTION_GL_ALIAS
+#define GLAD_OPTION_GL_HEADER_ONLY
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef GLAD_PLATFORM_H_
+#define GLAD_PLATFORM_H_
+
+#ifndef GLAD_PLATFORM_WIN32
+ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)
+ #define GLAD_PLATFORM_WIN32 1
+ #else
+ #define GLAD_PLATFORM_WIN32 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_APPLE
+ #ifdef __APPLE__
+ #define GLAD_PLATFORM_APPLE 1
+ #else
+ #define GLAD_PLATFORM_APPLE 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_EMSCRIPTEN
+ #ifdef __EMSCRIPTEN__
+ #define GLAD_PLATFORM_EMSCRIPTEN 1
+ #else
+ #define GLAD_PLATFORM_EMSCRIPTEN 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_UWP
+ #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY)
+ #ifdef __has_include
+ #if __has_include(<winapifamily.h>)
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #endif
+
+ #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY
+ #include <winapifamily.h>
+ #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ #define GLAD_PLATFORM_UWP 1
+ #endif
+ #endif
+
+ #ifndef GLAD_PLATFORM_UWP
+ #define GLAD_PLATFORM_UWP 0
+ #endif
+#endif
+
+#ifdef __GNUC__
+ #define GLAD_GNUC_EXTENSION __extension__
+#else
+ #define GLAD_GNUC_EXTENSION
+#endif
+
+#ifndef GLAD_API_CALL
+ #if defined(GLAD_API_CALL_EXPORT)
+ #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__)
+ #if defined(GLAD_API_CALL_EXPORT_BUILD)
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllexport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllexport) extern
+ #endif
+ #else
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllimport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllimport) extern
+ #endif
+ #endif
+ #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD)
+ #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+#endif
+
+#ifdef APIENTRY
+ #define GLAD_API_PTR APIENTRY
+#elif GLAD_PLATFORM_WIN32
+ #define GLAD_API_PTR __stdcall
+#else
+ #define GLAD_API_PTR
+#endif
+
+#ifndef GLAPI
+#define GLAPI GLAD_API_CALL
+#endif
+
+#ifndef GLAPIENTRY
+#define GLAPIENTRY GLAD_API_PTR
+#endif
+
+#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor)
+#define GLAD_VERSION_MAJOR(version) (version / 10000)
+#define GLAD_VERSION_MINOR(version) (version % 10000)
+
+#define GLAD_GENERATOR_VERSION "2.0.0-beta"
+
+typedef void (*GLADapiproc)(void);
+
+typedef GLADapiproc (*GLADloadfunc)(const char *name);
+typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name);
+
+typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...);
+typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...);
+
+#endif /* GLAD_PLATFORM_H_ */
+
+#define GL_2D 0x0600
+#define GL_2_BYTES 0x1407
+#define GL_3D 0x0601
+#define GL_3D_COLOR 0x0602
+#define GL_3D_COLOR_TEXTURE 0x0603
+#define GL_3_BYTES 0x1408
+#define GL_4D_COLOR_TEXTURE 0x0604
+#define GL_4_BYTES 0x1409
+#define GL_ACCUM 0x0100
+#define GL_ACCUM_ALPHA_BITS 0x0D5B
+#define GL_ACCUM_BLUE_BITS 0x0D5A
+#define GL_ACCUM_BUFFER_BIT 0x00000200
+#define GL_ACCUM_CLEAR_VALUE 0x0B80
+#define GL_ACCUM_GREEN_BITS 0x0D59
+#define GL_ACCUM_RED_BITS 0x0D58
+#define GL_ACTIVE_PROGRAM 0x8259
+#define GL_ACTIVE_TEXTURE_ARB 0x84E0
+#define GL_ADD 0x0104
+#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF
+#define GL_ALL_SHADER_BITS 0xFFFFFFFF
+#define GL_ALPHA 0x1906
+#define GL_ALPHA12 0x803D
+#define GL_ALPHA16 0x803E
+#define GL_ALPHA4 0x803B
+#define GL_ALPHA8 0x803C
+#define GL_ALPHA_BIAS 0x0D1D
+#define GL_ALPHA_BITS 0x0D55
+#define GL_ALPHA_SCALE 0x0D1C
+#define GL_ALPHA_TEST 0x0BC0
+#define GL_ALPHA_TEST_FUNC 0x0BC1
+#define GL_ALPHA_TEST_REF 0x0BC2
+#define GL_ALWAYS 0x0207
+#define GL_AMBIENT 0x1200
+#define GL_AMBIENT_AND_DIFFUSE 0x1602
+#define GL_AND 0x1501
+#define GL_AND_INVERTED 0x1504
+#define GL_AND_REVERSE 0x1502
+#define GL_ARRAY_BUFFER_ARB 0x8892
+#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894
+#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645
+#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623
+#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624
+#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625
+#define GL_ATTRIB_STACK_DEPTH 0x0BB0
+#define GL_AUTO_NORMAL 0x0D80
+#define GL_AUX0 0x0409
+#define GL_AUX1 0x040A
+#define GL_AUX2 0x040B
+#define GL_AUX3 0x040C
+#define GL_AUX_BUFFERS 0x0C00
+#define GL_BACK 0x0405
+#define GL_BACK_LEFT 0x0402
+#define GL_BACK_RIGHT 0x0403
+#define GL_BITMAP 0x1A00
+#define GL_BITMAP_TOKEN 0x0704
+#define GL_BLEND 0x0BE2
+#define GL_BLEND_COLOR 0x8005
+#define GL_BLEND_DST 0x0BE0
+#define GL_BLEND_DST_ALPHA_EXT 0x80CA
+#define GL_BLEND_DST_RGB_EXT 0x80C8
+#define GL_BLEND_EQUATION 0x8009
+#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D
+#define GL_BLEND_EQUATION_EXT 0x8009
+#define GL_BLEND_EQUATION_RGB_EXT 0x8009
+#define GL_BLEND_SRC 0x0BE1
+#define GL_BLEND_SRC_ALPHA_EXT 0x80CB
+#define GL_BLEND_SRC_RGB_EXT 0x80C9
+#define GL_BLUE 0x1905
+#define GL_BLUE_BIAS 0x0D1B
+#define GL_BLUE_BITS 0x0D54
+#define GL_BLUE_SCALE 0x0D1A
+#define GL_BOOL_ARB 0x8B56
+#define GL_BOOL_VEC2_ARB 0x8B57
+#define GL_BOOL_VEC3_ARB 0x8B58
+#define GL_BOOL_VEC4_ARB 0x8B59
+#define GL_BUFFER 0x82E0
+#define GL_BUFFER_ACCESS_ARB 0x88BB
+#define GL_BUFFER_MAPPED_ARB 0x88BC
+#define GL_BUFFER_MAP_POINTER_ARB 0x88BD
+#define GL_BUFFER_SIZE_ARB 0x8764
+#define GL_BUFFER_USAGE_ARB 0x8765
+#define GL_BYTE 0x1400
+#define GL_C3F_V3F 0x2A24
+#define GL_C4F_N3F_V3F 0x2A26
+#define GL_C4UB_V2F 0x2A22
+#define GL_C4UB_V3F 0x2A23
+#define GL_CCW 0x0901
+#define GL_CLAMP 0x2900
+#define GL_CLAMP_TO_EDGE_SGIS 0x812F
+#define GL_CLEAR 0x1500
+#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
+#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF
+#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1
+#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
+#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
+#define GL_CLIP_PLANE0 0x3000
+#define GL_CLIP_PLANE1 0x3001
+#define GL_CLIP_PLANE2 0x3002
+#define GL_CLIP_PLANE3 0x3003
+#define GL_CLIP_PLANE4 0x3004
+#define GL_CLIP_PLANE5 0x3005
+#define GL_COEFF 0x0A00
+#define GL_COLOR 0x1800
+#define GL_COLOR_ARRAY 0x8076
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
+#define GL_COLOR_ARRAY_COUNT_EXT 0x8084
+#define GL_COLOR_ARRAY_EXT 0x8076
+#define GL_COLOR_ARRAY_POINTER 0x8090
+#define GL_COLOR_ARRAY_POINTER_EXT 0x8090
+#define GL_COLOR_ARRAY_SIZE 0x8081
+#define GL_COLOR_ARRAY_SIZE_EXT 0x8081
+#define GL_COLOR_ARRAY_STRIDE 0x8083
+#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083
+#define GL_COLOR_ARRAY_TYPE 0x8082
+#define GL_COLOR_ARRAY_TYPE_EXT 0x8082
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT13_EXT 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
+#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_INDEX 0x1900
+#define GL_COLOR_INDEXES 0x1603
+#define GL_COLOR_LOGIC_OP 0x0BF2
+#define GL_COLOR_MATERIAL 0x0B57
+#define GL_COLOR_MATERIAL_FACE 0x0B55
+#define GL_COLOR_MATERIAL_PARAMETER 0x0B56
+#define GL_COLOR_MATRIX 0x80B1
+#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2
+#define GL_COLOR_SUM_ARB 0x8458
+#define GL_COLOR_TABLE 0x80D0
+#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD
+#define GL_COLOR_TABLE_BIAS 0x80D7
+#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC
+#define GL_COLOR_TABLE_FORMAT 0x80D8
+#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB
+#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF
+#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE
+#define GL_COLOR_TABLE_RED_SIZE 0x80DA
+#define GL_COLOR_TABLE_SCALE 0x80D6
+#define GL_COLOR_TABLE_WIDTH 0x80D9
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E
+#define GL_COMPILE 0x1300
+#define GL_COMPILE_AND_EXECUTE 0x1301
+#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B
+#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A
+#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
+#define GL_COMPRESSED_SRGB_EXT 0x8C48
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_CONSTANT_ATTENUATION 0x1207
+#define GL_CONSTANT_BORDER 0x8151
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
+#define GL_CONVOLUTION_1D 0x8010
+#define GL_CONVOLUTION_2D 0x8011
+#define GL_CONVOLUTION_BORDER_COLOR 0x8154
+#define GL_CONVOLUTION_BORDER_MODE 0x8013
+#define GL_CONVOLUTION_FILTER_BIAS 0x8015
+#define GL_CONVOLUTION_FILTER_SCALE 0x8014
+#define GL_CONVOLUTION_FORMAT 0x8017
+#define GL_CONVOLUTION_HEIGHT 0x8019
+#define GL_CONVOLUTION_WIDTH 0x8018
+#define GL_COPY 0x1503
+#define GL_COPY_INVERTED 0x150C
+#define GL_COPY_PIXEL_TOKEN 0x0706
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#define GL_CULL_FACE 0x0B44
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_CURRENT_ATTRIB_NV 0x8626
+#define GL_CURRENT_BIT 0x00000001
+#define GL_CURRENT_COLOR 0x0B00
+#define GL_CURRENT_INDEX 0x0B01
+#define GL_CURRENT_MATRIX_ARB 0x8641
+#define GL_CURRENT_MATRIX_NV 0x8641
+#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
+#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640
+#define GL_CURRENT_NORMAL 0x0B02
+#define GL_CURRENT_RASTER_COLOR 0x0B04
+#define GL_CURRENT_RASTER_DISTANCE 0x0B09
+#define GL_CURRENT_RASTER_INDEX 0x0B05
+#define GL_CURRENT_RASTER_POSITION 0x0B07
+#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08
+#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06
+#define GL_CURRENT_TEXTURE_COORDS 0x0B03
+#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
+#define GL_CW 0x0900
+#define GL_DEBUG_CALLBACK_FUNCTION 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
+#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
+#define GL_DEBUG_LOGGED_MESSAGES 0x9145
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
+#define GL_DEBUG_OUTPUT 0x92E0
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
+#define GL_DEBUG_SEVERITY_HIGH 0x9146
+#define GL_DEBUG_SEVERITY_LOW 0x9148
+#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
+#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
+#define GL_DEBUG_SOURCE_API 0x8246
+#define GL_DEBUG_SOURCE_APPLICATION 0x824A
+#define GL_DEBUG_SOURCE_OTHER 0x824B
+#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
+#define GL_DEBUG_TYPE_ERROR 0x824C
+#define GL_DEBUG_TYPE_MARKER 0x8268
+#define GL_DEBUG_TYPE_OTHER 0x8251
+#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
+#define GL_DEBUG_TYPE_POP_GROUP 0x826A
+#define GL_DEBUG_TYPE_PORTABILITY 0x824F
+#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
+#define GL_DECAL 0x2101
+#define GL_DECR 0x1E03
+#define GL_DEPTH 0x1801
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_DEPTH24_STENCIL8_EXT 0x88F0
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_DEPTH_ATTACHMENT_EXT 0x8D00
+#define GL_DEPTH_BIAS 0x0D1F
+#define GL_DEPTH_BITS 0x0D56
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_SCALE 0x0D1E
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_DEPTH_STENCIL_EXT 0x84F9
+#define GL_DEPTH_TEST 0x0B71
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DIFFUSE 0x1201
+#define GL_DISPLAY_LIST 0x82E7
+#define GL_DITHER 0x0BD0
+#define GL_DOMAIN 0x0A02
+#define GL_DONT_CARE 0x1100
+#define GL_DOUBLE 0x140A
+#define GL_DOUBLEBUFFER 0x0C32
+#define GL_DRAW_BUFFER 0x0C01
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
+#define GL_DRAW_PIXEL_TOKEN 0x0705
+#define GL_DST_ALPHA 0x0304
+#define GL_DST_COLOR 0x0306
+#define GL_DYNAMIC_COPY_ARB 0x88EA
+#define GL_DYNAMIC_DRAW_ARB 0x88E8
+#define GL_DYNAMIC_READ_ARB 0x88E9
+#define GL_EDGE_FLAG 0x0B43
+#define GL_EDGE_FLAG_ARRAY 0x8079
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B
+#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D
+#define GL_EDGE_FLAG_ARRAY_EXT 0x8079
+#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
+#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093
+#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C
+#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C
+#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
+#define GL_EMISSION 0x1600
+#define GL_ENABLE_BIT 0x00002000
+#define GL_EQUAL 0x0202
+#define GL_EQUIV 0x1509
+#define GL_EVAL_BIT 0x00010000
+#define GL_EXP 0x0800
+#define GL_EXP2 0x0801
+#define GL_EXTENSIONS 0x1F03
+#define GL_EYE_LINEAR 0x2400
+#define GL_EYE_PLANE 0x2502
+#define GL_FALSE 0
+#define GL_FASTEST 0x1101
+#define GL_FEEDBACK 0x1C01
+#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0
+#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1
+#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2
+#define GL_FILL 0x1B02
+#define GL_FLAT 0x1D00
+#define GL_FLOAT 0x1406
+#define GL_FLOAT_MAT2_ARB 0x8B5A
+#define GL_FLOAT_MAT3_ARB 0x8B5B
+#define GL_FLOAT_MAT4_ARB 0x8B5C
+#define GL_FLOAT_VEC2_ARB 0x8B50
+#define GL_FLOAT_VEC3_ARB 0x8B51
+#define GL_FLOAT_VEC4_ARB 0x8B52
+#define GL_FOG 0x0B60
+#define GL_FOG_BIT 0x00000080
+#define GL_FOG_COLOR 0x0B66
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D
+#define GL_FOG_DENSITY 0x0B62
+#define GL_FOG_END 0x0B64
+#define GL_FOG_HINT 0x0C54
+#define GL_FOG_INDEX 0x0B61
+#define GL_FOG_MODE 0x0B65
+#define GL_FOG_START 0x0B63
+#define GL_FRAGMENT_SHADER_ARB 0x8B30
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_EXT 0x8D40
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
+#define GL_FRONT 0x0404
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_FRONT_FACE 0x0B46
+#define GL_FRONT_LEFT 0x0400
+#define GL_FRONT_RIGHT 0x0401
+#define GL_FUNC_ADD 0x8006
+#define GL_FUNC_ADD_EXT 0x8006
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_SUBTRACT_EXT 0x800A
+#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB
+#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB
+#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC
+#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC
+#define GL_GEOMETRY_PROGRAM_NV 0x8C26
+#define GL_GEOMETRY_SHADER_ARB 0x8DD9
+#define GL_GEOMETRY_SHADER_BIT 0x00000004
+#define GL_GEOMETRY_SHADER_EXT 0x8DD9
+#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA
+#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA
+#define GL_GEQUAL 0x0206
+#define GL_GREATER 0x0204
+#define GL_GREEN 0x1904
+#define GL_GREEN_BIAS 0x0D19
+#define GL_GREEN_BITS 0x0D53
+#define GL_GREEN_SCALE 0x0D18
+#define GL_HINT_BIT 0x00008000
+#define GL_HISTOGRAM 0x8024
+#define GL_HISTOGRAM_ALPHA_SIZE 0x802B
+#define GL_HISTOGRAM_BLUE_SIZE 0x802A
+#define GL_HISTOGRAM_FORMAT 0x8027
+#define GL_HISTOGRAM_GREEN_SIZE 0x8029
+#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C
+#define GL_HISTOGRAM_RED_SIZE 0x8028
+#define GL_HISTOGRAM_SINK 0x802D
+#define GL_HISTOGRAM_WIDTH 0x8026
+#define GL_IDENTITY_NV 0x862A
+#define GL_INCR 0x1E02
+#define GL_INDEX 0x8222
+#define GL_INDEX_ARRAY 0x8077
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
+#define GL_INDEX_ARRAY_COUNT_EXT 0x8087
+#define GL_INDEX_ARRAY_EXT 0x8077
+#define GL_INDEX_ARRAY_POINTER 0x8091
+#define GL_INDEX_ARRAY_POINTER_EXT 0x8091
+#define GL_INDEX_ARRAY_STRIDE 0x8086
+#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086
+#define GL_INDEX_ARRAY_TYPE 0x8085
+#define GL_INDEX_ARRAY_TYPE_EXT 0x8085
+#define GL_INDEX_BITS 0x0D51
+#define GL_INDEX_CLEAR_VALUE 0x0C20
+#define GL_INDEX_LOGIC_OP 0x0BF1
+#define GL_INDEX_MODE 0x0C30
+#define GL_INDEX_OFFSET 0x0D13
+#define GL_INDEX_SHIFT 0x0D12
+#define GL_INDEX_WRITEMASK 0x0C21
+#define GL_INT 0x1404
+#define GL_INTENSITY 0x8049
+#define GL_INTENSITY12 0x804C
+#define GL_INTENSITY16 0x804D
+#define GL_INTENSITY4 0x804A
+#define GL_INTENSITY8 0x804B
+#define GL_INT_VEC2_ARB 0x8B53
+#define GL_INT_VEC3_ARB 0x8B54
+#define GL_INT_VEC4_ARB 0x8B55
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
+#define GL_INVALID_OPERATION 0x0502
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVERSE_NV 0x862B
+#define GL_INVERSE_TRANSPOSE_NV 0x862D
+#define GL_INVERT 0x150A
+#define GL_KEEP 0x1E00
+#define GL_LEFT 0x0406
+#define GL_LEQUAL 0x0203
+#define GL_LESS 0x0201
+#define GL_LIGHT0 0x4000
+#define GL_LIGHT1 0x4001
+#define GL_LIGHT2 0x4002
+#define GL_LIGHT3 0x4003
+#define GL_LIGHT4 0x4004
+#define GL_LIGHT5 0x4005
+#define GL_LIGHT6 0x4006
+#define GL_LIGHT7 0x4007
+#define GL_LIGHTING 0x0B50
+#define GL_LIGHTING_BIT 0x00000040
+#define GL_LIGHT_MODEL_AMBIENT 0x0B53
+#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
+#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
+#define GL_LINE 0x1B01
+#define GL_LINEAR 0x2601
+#define GL_LINEAR_ATTENUATION 0x1208
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_LINES 0x0001
+#define GL_LINES_ADJACENCY_ARB 0x000A
+#define GL_LINES_ADJACENCY_EXT 0x000A
+#define GL_LINE_BIT 0x00000004
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_RESET_TOKEN 0x0707
+#define GL_LINE_SMOOTH 0x0B20
+#define GL_LINE_SMOOTH_HINT 0x0C52
+#define GL_LINE_STIPPLE 0x0B24
+#define GL_LINE_STIPPLE_PATTERN 0x0B25
+#define GL_LINE_STIPPLE_REPEAT 0x0B26
+#define GL_LINE_STRIP 0x0003
+#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B
+#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B
+#define GL_LINE_TOKEN 0x0702
+#define GL_LINE_WIDTH 0x0B21
+#define GL_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_LINE_WIDTH_RANGE 0x0B22
+#define GL_LIST_BASE 0x0B32
+#define GL_LIST_BIT 0x00020000
+#define GL_LIST_INDEX 0x0B33
+#define GL_LIST_MODE 0x0B30
+#define GL_LOAD 0x0101
+#define GL_LOGIC_OP 0x0BF1
+#define GL_LOGIC_OP_MODE 0x0BF0
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE12 0x8041
+#define GL_LUMINANCE12_ALPHA12 0x8047
+#define GL_LUMINANCE12_ALPHA4 0x8046
+#define GL_LUMINANCE16 0x8042
+#define GL_LUMINANCE16_ALPHA16 0x8048
+#define GL_LUMINANCE4 0x803F
+#define GL_LUMINANCE4_ALPHA4 0x8043
+#define GL_LUMINANCE6_ALPHA2 0x8044
+#define GL_LUMINANCE8 0x8040
+#define GL_LUMINANCE8_ALPHA8 0x8045
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_MAP1_COLOR_4 0x0D90
+#define GL_MAP1_GRID_DOMAIN 0x0DD0
+#define GL_MAP1_GRID_SEGMENTS 0x0DD1
+#define GL_MAP1_INDEX 0x0D91
+#define GL_MAP1_NORMAL 0x0D92
+#define GL_MAP1_TEXTURE_COORD_1 0x0D93
+#define GL_MAP1_TEXTURE_COORD_2 0x0D94
+#define GL_MAP1_TEXTURE_COORD_3 0x0D95
+#define GL_MAP1_TEXTURE_COORD_4 0x0D96
+#define GL_MAP1_VERTEX_3 0x0D97
+#define GL_MAP1_VERTEX_4 0x0D98
+#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660
+#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A
+#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B
+#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C
+#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D
+#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E
+#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F
+#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661
+#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662
+#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663
+#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664
+#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665
+#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666
+#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667
+#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668
+#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669
+#define GL_MAP2_COLOR_4 0x0DB0
+#define GL_MAP2_GRID_DOMAIN 0x0DD2
+#define GL_MAP2_GRID_SEGMENTS 0x0DD3
+#define GL_MAP2_INDEX 0x0DB1
+#define GL_MAP2_NORMAL 0x0DB2
+#define GL_MAP2_TEXTURE_COORD_1 0x0DB3
+#define GL_MAP2_TEXTURE_COORD_2 0x0DB4
+#define GL_MAP2_TEXTURE_COORD_3 0x0DB5
+#define GL_MAP2_TEXTURE_COORD_4 0x0DB6
+#define GL_MAP2_VERTEX_3 0x0DB7
+#define GL_MAP2_VERTEX_4 0x0DB8
+#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670
+#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A
+#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B
+#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C
+#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D
+#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E
+#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F
+#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671
+#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672
+#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673
+#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674
+#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675
+#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676
+#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677
+#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678
+#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679
+#define GL_MAP_COLOR 0x0D10
+#define GL_MAP_STENCIL 0x0D11
+#define GL_MATRIX0_ARB 0x88C0
+#define GL_MATRIX0_NV 0x8630
+#define GL_MATRIX10_ARB 0x88CA
+#define GL_MATRIX11_ARB 0x88CB
+#define GL_MATRIX12_ARB 0x88CC
+#define GL_MATRIX13_ARB 0x88CD
+#define GL_MATRIX14_ARB 0x88CE
+#define GL_MATRIX15_ARB 0x88CF
+#define GL_MATRIX16_ARB 0x88D0
+#define GL_MATRIX17_ARB 0x88D1
+#define GL_MATRIX18_ARB 0x88D2
+#define GL_MATRIX19_ARB 0x88D3
+#define GL_MATRIX1_ARB 0x88C1
+#define GL_MATRIX1_NV 0x8631
+#define GL_MATRIX20_ARB 0x88D4
+#define GL_MATRIX21_ARB 0x88D5
+#define GL_MATRIX22_ARB 0x88D6
+#define GL_MATRIX23_ARB 0x88D7
+#define GL_MATRIX24_ARB 0x88D8
+#define GL_MATRIX25_ARB 0x88D9
+#define GL_MATRIX26_ARB 0x88DA
+#define GL_MATRIX27_ARB 0x88DB
+#define GL_MATRIX28_ARB 0x88DC
+#define GL_MATRIX29_ARB 0x88DD
+#define GL_MATRIX2_ARB 0x88C2
+#define GL_MATRIX2_NV 0x8632
+#define GL_MATRIX30_ARB 0x88DE
+#define GL_MATRIX31_ARB 0x88DF
+#define GL_MATRIX3_ARB 0x88C3
+#define GL_MATRIX3_NV 0x8633
+#define GL_MATRIX4_ARB 0x88C4
+#define GL_MATRIX4_NV 0x8634
+#define GL_MATRIX5_ARB 0x88C5
+#define GL_MATRIX5_NV 0x8635
+#define GL_MATRIX6_ARB 0x88C6
+#define GL_MATRIX6_NV 0x8636
+#define GL_MATRIX7_ARB 0x88C7
+#define GL_MATRIX7_NV 0x8637
+#define GL_MATRIX8_ARB 0x88C8
+#define GL_MATRIX9_ARB 0x88C9
+#define GL_MATRIX_MODE 0x0BA0
+#define GL_MAX 0x8008
+#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF
+#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35
+#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B
+#define GL_MAX_CLIP_PLANES 0x0D32
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D
+#define GL_MAX_CONVOLUTION_HEIGHT 0x801B
+#define GL_MAX_CONVOLUTION_WIDTH 0x801A
+#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
+#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
+#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
+#define GL_MAX_EVAL_ORDER 0x0D30
+#define GL_MAX_EXT 0x8008
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD
+#define GL_MAX_LABEL_LENGTH 0x82E8
+#define GL_MAX_LIGHTS 0x0D31
+#define GL_MAX_LIST_NESTING 0x0B31
+#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36
+#define GL_MAX_NAME_STACK_DEPTH 0x0D37
+#define GL_MAX_PIXEL_MAP_TABLE 0x0D34
+#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
+#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD
+#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
+#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1
+#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
+#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F
+#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
+#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
+#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
+#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
+#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
+#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
+#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27
+#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9
+#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5
+#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28
+#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
+#define GL_MAX_SAMPLES 0x8D57
+#define GL_MAX_SAMPLES_EXT 0x8D57
+#define GL_MAX_TEXTURE_COORDS_ARB 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39
+#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
+#define GL_MAX_TRACK_MATRICES_NV 0x862F
+#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B
+#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B
+#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_MIN 0x8007
+#define GL_MINMAX 0x802E
+#define GL_MINMAX_FORMAT 0x802F
+#define GL_MINMAX_SINK 0x8030
+#define GL_MIN_EXT 0x8007
+#define GL_MODELVIEW 0x1700
+#define GL_MODELVIEW_MATRIX 0x0BA6
+#define GL_MODELVIEW_PROJECTION_NV 0x8629
+#define GL_MODELVIEW_STACK_DEPTH 0x0BA3
+#define GL_MODULATE 0x2100
+#define GL_MULT 0x0103
+#define GL_N3F_V3F 0x2A25
+#define GL_NAME_STACK_DEPTH 0x0D70
+#define GL_NAND 0x150E
+#define GL_NEAREST 0x2600
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_NEVER 0x0200
+#define GL_NICEST 0x1102
+#define GL_NONE 0
+#define GL_NOOP 0x1505
+#define GL_NOR 0x1508
+#define GL_NORMALIZE 0x0BA1
+#define GL_NORMAL_ARRAY 0x8075
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
+#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080
+#define GL_NORMAL_ARRAY_EXT 0x8075
+#define GL_NORMAL_ARRAY_POINTER 0x808F
+#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F
+#define GL_NORMAL_ARRAY_STRIDE 0x807F
+#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F
+#define GL_NORMAL_ARRAY_TYPE 0x807E
+#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E
+#define GL_NOTEQUAL 0x0205
+#define GL_NO_ERROR 0
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89
+#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A
+#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86
+#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
+#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85
+#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81
+#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80
+#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84
+#define GL_OBJECT_LINEAR 0x2401
+#define GL_OBJECT_LINK_STATUS_ARB 0x8B82
+#define GL_OBJECT_PLANE 0x2501
+#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88
+#define GL_OBJECT_SUBTYPE_ARB 0x8B4F
+#define GL_OBJECT_TYPE_ARB 0x8B4E
+#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83
+#define GL_ONE 1
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_OR 0x1507
+#define GL_ORDER 0x0A01
+#define GL_OR_INVERTED 0x150D
+#define GL_OR_REVERSE 0x150B
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_PACK_LSB_FIRST 0x0D01
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SWAP_BYTES 0x0D00
+#define GL_PASS_THROUGH_TOKEN 0x0700
+#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50
+#define GL_PIXEL_MAP_A_TO_A 0x0C79
+#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9
+#define GL_PIXEL_MAP_B_TO_B 0x0C78
+#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8
+#define GL_PIXEL_MAP_G_TO_G 0x0C77
+#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7
+#define GL_PIXEL_MAP_I_TO_A 0x0C75
+#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5
+#define GL_PIXEL_MAP_I_TO_B 0x0C74
+#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4
+#define GL_PIXEL_MAP_I_TO_G 0x0C73
+#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3
+#define GL_PIXEL_MAP_I_TO_I 0x0C70
+#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0
+#define GL_PIXEL_MAP_I_TO_R 0x0C72
+#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2
+#define GL_PIXEL_MAP_R_TO_R 0x0C76
+#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6
+#define GL_PIXEL_MAP_S_TO_S 0x0C71
+#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1
+#define GL_PIXEL_MODE_BIT 0x00000020
+#define GL_POINT 0x1B00
+#define GL_POINTS 0x0000
+#define GL_POINT_BIT 0x00000002
+#define GL_POINT_SIZE 0x0B11
+#define GL_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_POINT_SIZE_RANGE 0x0B12
+#define GL_POINT_SMOOTH 0x0B10
+#define GL_POINT_SMOOTH_HINT 0x0C51
+#define GL_POINT_TOKEN 0x0701
+#define GL_POLYGON 0x0009
+#define GL_POLYGON_BIT 0x00000008
+#define GL_POLYGON_MODE 0x0B40
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_POLYGON_OFFSET_LINE 0x2A02
+#define GL_POLYGON_OFFSET_POINT 0x2A01
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_SMOOTH 0x0B41
+#define GL_POLYGON_SMOOTH_HINT 0x0C53
+#define GL_POLYGON_STIPPLE 0x0B42
+#define GL_POLYGON_STIPPLE_BIT 0x00000010
+#define GL_POLYGON_TOKEN 0x0703
+#define GL_POSITION 0x1203
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5
+#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8
+#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4
+#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
+#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F
+#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
+#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E
+#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1
+#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
+#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D
+#define GL_POST_CONVOLUTION_RED_BIAS 0x8020
+#define GL_POST_CONVOLUTION_RED_SCALE 0x801C
+#define GL_PROGRAM 0x82E2
+#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0
+#define GL_PROGRAM_ATTRIBS_ARB 0x88AC
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINDING_ARB 0x8677
+#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B
+#define GL_PROGRAM_ERROR_POSITION_NV 0x864B
+#define GL_PROGRAM_ERROR_STRING_ARB 0x8874
+#define GL_PROGRAM_FORMAT_ARB 0x8876
+#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875
+#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0
+#define GL_PROGRAM_LENGTH_ARB 0x8627
+#define GL_PROGRAM_LENGTH_NV 0x8627
+#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
+#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE
+#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
+#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA
+#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
+#define GL_PROGRAM_OBJECT_ARB 0x8B40
+#define GL_PROGRAM_PARAMETERS_ARB 0x88A8
+#define GL_PROGRAM_PARAMETER_NV 0x8644
+#define GL_PROGRAM_PIPELINE 0x82E4
+#define GL_PROGRAM_PIPELINE_BINDING 0x825A
+#define GL_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_PROGRAM_POINT_SIZE_EXT 0x8642
+#define GL_PROGRAM_RESIDENT_NV 0x8647
+#define GL_PROGRAM_SEPARABLE 0x8258
+#define GL_PROGRAM_STRING_ARB 0x8628
+#define GL_PROGRAM_STRING_NV 0x8628
+#define GL_PROGRAM_TARGET_NV 0x8646
+#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4
+#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
+#define GL_PROJECTION 0x1701
+#define GL_PROJECTION_MATRIX 0x0BA7
+#define GL_PROJECTION_STACK_DEPTH 0x0BA4
+#define GL_PROXY_COLOR_TABLE 0x80D3
+#define GL_PROXY_HISTOGRAM 0x8025
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
+#define GL_PROXY_TEXTURE_1D 0x8063
+#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19
+#define GL_PROXY_TEXTURE_2D 0x8064
+#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B
+#define GL_Q 0x2003
+#define GL_QUADRATIC_ATTENUATION 0x1209
+#define GL_QUADS 0x0007
+#define GL_QUAD_STRIP 0x0008
+#define GL_QUERY 0x82E3
+#define GL_R 0x2002
+#define GL_R3_G3_B2 0x2A10
+#define GL_READ_BUFFER 0x0C02
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
+#define GL_READ_FRAMEBUFFER_EXT 0x8CA8
+#define GL_READ_ONLY_ARB 0x88B8
+#define GL_READ_WRITE_ARB 0x88BA
+#define GL_RED 0x1903
+#define GL_REDUCE 0x8016
+#define GL_RED_BIAS 0x0D15
+#define GL_RED_BITS 0x0D52
+#define GL_RED_SCALE 0x0D14
+#define GL_RENDER 0x1C00
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54
+#define GL_RENDERBUFFER_EXT 0x8D41
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
+#define GL_RENDERER 0x1F01
+#define GL_RENDER_MODE 0x0C40
+#define GL_REPEAT 0x2901
+#define GL_REPLACE 0x1E01
+#define GL_REPLICATE_BORDER 0x8153
+#define GL_RETURN 0x0102
+#define GL_RGB 0x1907
+#define GL_RGB10 0x8052
+#define GL_RGB10_A2 0x8059
+#define GL_RGB12 0x8053
+#define GL_RGB16 0x8054
+#define GL_RGB4 0x804F
+#define GL_RGB5 0x8050
+#define GL_RGB5_A1 0x8057
+#define GL_RGB8 0x8051
+#define GL_RGBA 0x1908
+#define GL_RGBA12 0x805A
+#define GL_RGBA16 0x805B
+#define GL_RGBA2 0x8055
+#define GL_RGBA4 0x8056
+#define GL_RGBA8 0x8058
+#define GL_RGBA_MODE 0x0C31
+#define GL_RIGHT 0x0407
+#define GL_S 0x2000
+#define GL_SAMPLER 0x82E6
+#define GL_SAMPLER_1D_ARB 0x8B5D
+#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61
+#define GL_SAMPLER_2D_ARB 0x8B5E
+#define GL_SAMPLER_2D_RECT_ARB 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
+#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62
+#define GL_SAMPLER_3D_ARB 0x8B5F
+#define GL_SAMPLER_CUBE_ARB 0x8B60
+#define GL_SCISSOR_BIT 0x00080000
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
+#define GL_SELECT 0x1C02
+#define GL_SELECTION_BUFFER_POINTER 0x0DF3
+#define GL_SELECTION_BUFFER_SIZE 0x0DF4
+#define GL_SEPARABLE_2D 0x8012
+#define GL_SET 0x150F
+#define GL_SHADER 0x82E1
+#define GL_SHADER_OBJECT_ARB 0x8B48
+#define GL_SHADE_MODEL 0x0B54
+#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
+#define GL_SHININESS 0x1601
+#define GL_SHORT 0x1402
+#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45
+#define GL_SLUMINANCE8_EXT 0x8C47
+#define GL_SLUMINANCE_ALPHA_EXT 0x8C44
+#define GL_SLUMINANCE_EXT 0x8C46
+#define GL_SMOOTH 0x1D01
+#define GL_SPECULAR 0x1202
+#define GL_SPHERE_MAP 0x2402
+#define GL_SPOT_CUTOFF 0x1206
+#define GL_SPOT_DIRECTION 0x1204
+#define GL_SPOT_EXPONENT 0x1205
+#define GL_SRC_ALPHA 0x0302
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_SRC_COLOR 0x0300
+#define GL_SRGB8_ALPHA8_EXT 0x8C43
+#define GL_SRGB8_EXT 0x8C41
+#define GL_SRGB_ALPHA_EXT 0x8C42
+#define GL_SRGB_EXT 0x8C40
+#define GL_STACK_OVERFLOW 0x0503
+#define GL_STACK_UNDERFLOW 0x0504
+#define GL_STATIC_COPY_ARB 0x88E6
+#define GL_STATIC_DRAW_ARB 0x88E4
+#define GL_STATIC_READ_ARB 0x88E5
+#define GL_STENCIL 0x1802
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_STENCIL_ATTACHMENT_EXT 0x8D20
+#define GL_STENCIL_BITS 0x0D57
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_INDEX 0x1901
+#define GL_STENCIL_INDEX1 0x8D46
+#define GL_STENCIL_INDEX16 0x8D49
+#define GL_STENCIL_INDEX16_EXT 0x8D49
+#define GL_STENCIL_INDEX1_EXT 0x8D46
+#define GL_STENCIL_INDEX4 0x8D47
+#define GL_STENCIL_INDEX4_EXT 0x8D47
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_STENCIL_INDEX8_EXT 0x8D48
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_TEST 0x0B90
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_STEREO 0x0C33
+#define GL_STREAM_COPY_ARB 0x88E2
+#define GL_STREAM_DRAW_ARB 0x88E0
+#define GL_STREAM_READ_ARB 0x88E1
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_T 0x2001
+#define GL_T2F_C3F_V3F 0x2A2A
+#define GL_T2F_C4F_N3F_V3F 0x2A2C
+#define GL_T2F_C4UB_V3F 0x2A29
+#define GL_T2F_N3F_V3F 0x2A2B
+#define GL_T2F_V3F 0x2A27
+#define GL_T4F_C4F_N3F_V4F 0x2A2D
+#define GL_T4F_V4F 0x2A28
+#define GL_TABLE_TOO_LARGE 0x8031
+#define GL_TESS_CONTROL_SHADER_BIT 0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010
+#define GL_TEXTURE 0x1702
+#define GL_TEXTURE0_ARB 0x84C0
+#define GL_TEXTURE10_ARB 0x84CA
+#define GL_TEXTURE11_ARB 0x84CB
+#define GL_TEXTURE12_ARB 0x84CC
+#define GL_TEXTURE13_ARB 0x84CD
+#define GL_TEXTURE14_ARB 0x84CE
+#define GL_TEXTURE15_ARB 0x84CF
+#define GL_TEXTURE16_ARB 0x84D0
+#define GL_TEXTURE17_ARB 0x84D1
+#define GL_TEXTURE18_ARB 0x84D2
+#define GL_TEXTURE19_ARB 0x84D3
+#define GL_TEXTURE1_ARB 0x84C1
+#define GL_TEXTURE20_ARB 0x84D4
+#define GL_TEXTURE21_ARB 0x84D5
+#define GL_TEXTURE22_ARB 0x84D6
+#define GL_TEXTURE23_ARB 0x84D7
+#define GL_TEXTURE24_ARB 0x84D8
+#define GL_TEXTURE25_ARB 0x84D9
+#define GL_TEXTURE26_ARB 0x84DA
+#define GL_TEXTURE27_ARB 0x84DB
+#define GL_TEXTURE28_ARB 0x84DC
+#define GL_TEXTURE29_ARB 0x84DD
+#define GL_TEXTURE2_ARB 0x84C2
+#define GL_TEXTURE30_ARB 0x84DE
+#define GL_TEXTURE31_ARB 0x84DF
+#define GL_TEXTURE3_ARB 0x84C3
+#define GL_TEXTURE4_ARB 0x84C4
+#define GL_TEXTURE5_ARB 0x84C5
+#define GL_TEXTURE6_ARB 0x84C6
+#define GL_TEXTURE7_ARB 0x84C7
+#define GL_TEXTURE8_ARB 0x84C8
+#define GL_TEXTURE9_ARB 0x84C9
+#define GL_TEXTURE_1D 0x0DE0
+#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18
+#define GL_TEXTURE_1D_BINDING_EXT 0x8068
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A
+#define GL_TEXTURE_2D_BINDING_EXT 0x8069
+#define GL_TEXTURE_3D_BINDING_EXT 0x806A
+#define GL_TEXTURE_ALPHA_SIZE 0x805F
+#define GL_TEXTURE_BINDING_1D 0x8068
+#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D
+#define GL_TEXTURE_BIT 0x00040000
+#define GL_TEXTURE_BLUE_SIZE 0x805E
+#define GL_TEXTURE_BORDER 0x1005
+#define GL_TEXTURE_BORDER_COLOR 0x1004
+#define GL_TEXTURE_COMPONENTS 0x1003
+#define GL_TEXTURE_COORD_ARRAY 0x8078
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A
+#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B
+#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078
+#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092
+#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
+#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088
+#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088
+#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A
+#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
+#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089
+#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089
+#define GL_TEXTURE_ENV 0x2300
+#define GL_TEXTURE_ENV_COLOR 0x2201
+#define GL_TEXTURE_ENV_MODE 0x2200
+#define GL_TEXTURE_GEN_MODE 0x2500
+#define GL_TEXTURE_GEN_Q 0x0C63
+#define GL_TEXTURE_GEN_R 0x0C62
+#define GL_TEXTURE_GEN_S 0x0C60
+#define GL_TEXTURE_GEN_T 0x0C61
+#define GL_TEXTURE_GREEN_SIZE 0x805D
+#define GL_TEXTURE_HEIGHT 0x1001
+#define GL_TEXTURE_INTENSITY_SIZE 0x8061
+#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
+#define GL_TEXTURE_LUMINANCE_SIZE 0x8060
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MATRIX 0x0BA8
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_PRIORITY 0x8066
+#define GL_TEXTURE_PRIORITY_EXT 0x8066
+#define GL_TEXTURE_RED_SIZE 0x805C
+#define GL_TEXTURE_RESIDENT 0x8067
+#define GL_TEXTURE_RESIDENT_EXT 0x8067
+#define GL_TEXTURE_STACK_DEPTH 0x0BA5
+#define GL_TEXTURE_STENCIL_SIZE 0x88F1
+#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1
+#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_TRACK_MATRIX_NV 0x8648
+#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649
+#define GL_TRANSFORM_BIT 0x00001000
+#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7
+#define GL_TRANSPOSE_NV 0x862C
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLES_ADJACENCY_ARB 0x000C
+#define GL_TRIANGLES_ADJACENCY_EXT 0x000C
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D
+#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D
+#define GL_TRUE 1
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_UNPACK_LSB_FIRST 0x0CF1
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SWAP_BYTES 0x0CF0
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_UNSIGNED_INT 0x1405
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_UNSIGNED_INT_24_8_EXT 0x84FA
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_V2F 0x2A20
+#define GL_V3F 0x2A21
+#define GL_VENDOR 0x1F00
+#define GL_VERSION 0x1F02
+#define GL_VERTEX_ARRAY 0x8074
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
+#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D
+#define GL_VERTEX_ARRAY_EXT 0x8074
+#define GL_VERTEX_ARRAY_POINTER 0x808E
+#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E
+#define GL_VERTEX_ARRAY_SIZE 0x807A
+#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A
+#define GL_VERTEX_ARRAY_STRIDE 0x807C
+#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C
+#define GL_VERTEX_ARRAY_TYPE 0x807B
+#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B
+#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650
+#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A
+#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B
+#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C
+#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D
+#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E
+#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F
+#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651
+#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652
+#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653
+#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654
+#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655
+#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656
+#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657
+#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658
+#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
+#define GL_VERTEX_PROGRAM_ARB 0x8620
+#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A
+#define GL_VERTEX_PROGRAM_NV 0x8620
+#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
+#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643
+#define GL_VERTEX_SHADER_ARB 0x8B31
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#define GL_VERTEX_STATE_PROGRAM_NV 0x8621
+#define GL_VIEWPORT 0x0BA2
+#define GL_VIEWPORT_BIT 0x00000800
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E
+#define GL_WRITE_ONLY_ARB 0x88B9
+#define GL_XOR 0x1506
+#define GL_ZERO 0
+#define GL_ZOOM_X 0x0D16
+#define GL_ZOOM_Y 0x0D17
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_ADD_SIGNED 0x8574
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_BLEND_DST_ALPHA_OES 0x80CA
+#define GL_BLEND_DST_RGB_OES 0x80C8
+#define GL_BLEND_EQUATION_ALPHA_OES 0x883D
+#define GL_BLEND_EQUATION_OES 0x8009
+#define GL_BLEND_EQUATION_RGB_OES 0x8009
+#define GL_BLEND_SRC_ALPHA_OES 0x80CB
+#define GL_BLEND_SRC_RGB_OES 0x80C9
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1
+#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898
+#define GL_COLOR_ATTACHMENT0_OES 0x8CE0
+#define GL_COMBINE 0x8570
+#define GL_COMBINE_ALPHA 0x8572
+#define GL_COMBINE_RGB 0x8571
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_CONSTANT 0x8576
+#define GL_DEPTH24_STENCIL8_OES 0x88F0
+#define GL_DEPTH_ATTACHMENT_OES 0x8D00
+#define GL_DEPTH_COMPONENT16_OES 0x81A5
+#define GL_DEPTH_STENCIL_OES 0x84F9
+#define GL_DOT3_RGB 0x86AE
+#define GL_DOT3_RGBA 0x86AF
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_FIXED 0x140C
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES 0x8CD2
+#define GL_FRAMEBUFFER_BINDING_OES 0x8CA6
+#define GL_FRAMEBUFFER_COMPLETE_OES 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES 0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES 0x8CDA
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES 0x8CD7
+#define GL_FRAMEBUFFER_OES 0x8D40
+#define GL_FRAMEBUFFER_UNSUPPORTED_OES 0x8CDD
+#define GL_FUNC_ADD_OES 0x8006
+#define GL_FUNC_REVERSE_SUBTRACT_OES 0x800B
+#define GL_FUNC_SUBTRACT_OES 0x800A
+#define GL_GENERATE_MIPMAP 0x8191
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_INTERPOLATE 0x8575
+#define GL_INVALID_FRAMEBUFFER_OPERATION_OES 0x0506
+#define GL_MAX_RENDERBUFFER_SIZE_OES 0x84E8
+#define GL_MAX_TEXTURE_UNITS 0x84E2
+#define GL_MULTISAMPLE 0x809D
+#define GL_NONE_OES 0
+#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_OPERAND0_ALPHA 0x8598
+#define GL_OPERAND0_RGB 0x8590
+#define GL_OPERAND1_ALPHA 0x8599
+#define GL_OPERAND1_RGB 0x8591
+#define GL_OPERAND2_ALPHA 0x859A
+#define GL_OPERAND2_RGB 0x8592
+#define GL_POINT_DISTANCE_ATTENUATION 0x8129
+#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128
+#define GL_POINT_SIZE_MAX 0x8127
+#define GL_POINT_SIZE_MIN 0x8126
+#define GL_PREVIOUS 0x8578
+#define GL_PRIMARY_COLOR 0x8577
+#define GL_RENDERBUFFER_ALPHA_SIZE_OES 0x8D53
+#define GL_RENDERBUFFER_BINDING_OES 0x8CA7
+#define GL_RENDERBUFFER_BLUE_SIZE_OES 0x8D52
+#define GL_RENDERBUFFER_DEPTH_SIZE_OES 0x8D54
+#define GL_RENDERBUFFER_GREEN_SIZE_OES 0x8D51
+#define GL_RENDERBUFFER_HEIGHT_OES 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_OES 0x8D44
+#define GL_RENDERBUFFER_OES 0x8D41
+#define GL_RENDERBUFFER_RED_SIZE_OES 0x8D50
+#define GL_RENDERBUFFER_STENCIL_SIZE_OES 0x8D55
+#define GL_RENDERBUFFER_WIDTH_OES 0x8D42
+#define GL_RESCALE_NORMAL 0x803A
+#define GL_RGB565_OES 0x8D62
+#define GL_RGB5_A1_OES 0x8057
+#define GL_RGBA4_OES 0x8056
+#define GL_RGB_SCALE 0x8573
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE 0x809F
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22
+#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12
+#define GL_SOURCE0_ALPHA 0x8588
+#define GL_SOURCE0_RGB 0x8580
+#define GL_SOURCE1_ALPHA 0x8589
+#define GL_SOURCE1_RGB 0x8581
+#define GL_SOURCE2_ALPHA 0x858A
+#define GL_SOURCE2_RGB 0x8582
+#define GL_SRC0_ALPHA 0x8588
+#define GL_SRC0_RGB 0x8580
+#define GL_SRC1_ALPHA 0x8589
+#define GL_SRC1_RGB 0x8581
+#define GL_SRC2_ALPHA 0x858A
+#define GL_SRC2_RGB 0x8582
+#define GL_STATIC_DRAW 0x88E4
+#define GL_STENCIL_ATTACHMENT_OES 0x8D20
+#define GL_SUBTRACT 0x84E7
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A
+#define GL_UNSIGNED_INT_24_8_OES 0x84FA
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_VERSION_ES_CL_1_0 1
+#define GL_VERSION_ES_CL_1_1 1
+#define GL_VERSION_ES_CM_1_1 1
+#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896
+
+
+#ifndef __khrplatform_h_
+#define __khrplatform_h_
+
+/*
+** Copyright (c) 2008-2018 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+/* Khronos platform-specific types and definitions.
+ *
+ * The master copy of khrplatform.h is maintained in the Khronos EGL
+ * Registry repository at https://github.com/KhronosGroup/EGL-Registry
+ * The last semantic modification to khrplatform.h was at commit ID:
+ * 67a3e0864c2d75ea5287b9f3d2eb74a745936692
+ *
+ * Adopters may modify this file to suit their platform. Adopters are
+ * encouraged to submit platform specific modifications to the Khronos
+ * group so that they can be included in future versions of this file.
+ * Please submit changes by filing pull requests or issues on
+ * the EGL Registry repository linked above.
+ *
+ *
+ * See the Implementer's Guidelines for information about where this file
+ * should be located on your system and for more details of its use:
+ * http://www.khronos.org/registry/implementers_guide.pdf
+ *
+ * This file should be included as
+ * #include <KHR/khrplatform.h>
+ * by Khronos client API header files that use its types and defines.
+ *
+ * The types in khrplatform.h should only be used to define API-specific types.
+ *
+ * Types defined in khrplatform.h:
+ * khronos_int8_t signed 8 bit
+ * khronos_uint8_t unsigned 8 bit
+ * khronos_int16_t signed 16 bit
+ * khronos_uint16_t unsigned 16 bit
+ * khronos_int32_t signed 32 bit
+ * khronos_uint32_t unsigned 32 bit
+ * khronos_int64_t signed 64 bit
+ * khronos_uint64_t unsigned 64 bit
+ * khronos_intptr_t signed same number of bits as a pointer
+ * khronos_uintptr_t unsigned same number of bits as a pointer
+ * khronos_ssize_t signed size
+ * khronos_usize_t unsigned size
+ * khronos_float_t signed 32 bit floating point
+ * khronos_time_ns_t unsigned 64 bit time in nanoseconds
+ * khronos_utime_nanoseconds_t unsigned time interval or absolute time in
+ * nanoseconds
+ * khronos_stime_nanoseconds_t signed time interval in nanoseconds
+ * khronos_boolean_enum_t enumerated boolean type. This should
+ * only be used as a base type when a client API's boolean type is
+ * an enum. Client APIs which use an integer or other type for
+ * booleans cannot use this as the base type for their boolean.
+ *
+ * Tokens defined in khrplatform.h:
+ *
+ * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
+ *
+ * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
+ * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
+ *
+ * Calling convention macros defined in this file:
+ * KHRONOS_APICALL
+ * KHRONOS_GLAD_API_PTR
+ * KHRONOS_APIATTRIBUTES
+ *
+ * These may be used in function prototypes as:
+ *
+ * KHRONOS_APICALL void KHRONOS_GLAD_API_PTR funcname(
+ * int arg1,
+ * int arg2) KHRONOS_APIATTRIBUTES;
+ */
+
+#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC)
+# define KHRONOS_STATIC 1
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APICALL
+ *-------------------------------------------------------------------------
+ * This precedes the return type of the function in the function prototype.
+ */
+#if defined(KHRONOS_STATIC)
+ /* If the preprocessor constant KHRONOS_STATIC is defined, make the
+ * header compatible with static linking. */
+# define KHRONOS_APICALL
+#elif defined(_WIN32)
+# define KHRONOS_APICALL __declspec(dllimport)
+#elif defined (__SYMBIAN32__)
+# define KHRONOS_APICALL IMPORT_C
+#elif defined(__ANDROID__)
+# define KHRONOS_APICALL __attribute__((visibility("default")))
+#else
+# define KHRONOS_APICALL
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_GLAD_API_PTR
+ *-------------------------------------------------------------------------
+ * This follows the return type of the function and precedes the function
+ * name in the function prototype.
+ */
+#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(KHRONOS_STATIC)
+ /* Win32 but not WinCE */
+# define KHRONOS_GLAD_API_PTR __stdcall
+#else
+# define KHRONOS_GLAD_API_PTR
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APIATTRIBUTES
+ *-------------------------------------------------------------------------
+ * This follows the closing parenthesis of the function prototype arguments.
+ */
+#if defined (__ARMCC_2__)
+#define KHRONOS_APIATTRIBUTES __softfp
+#else
+#define KHRONOS_APIATTRIBUTES
+#endif
+
+/*-------------------------------------------------------------------------
+ * basic type definitions
+ *-----------------------------------------------------------------------*/
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
+
+
+/*
+ * Using <stdint.h>
+ */
+#include <stdint.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(__VMS ) || defined(__sgi)
+
+/*
+ * Using <inttypes.h>
+ */
+#include <inttypes.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
+
+/*
+ * Win32
+ */
+typedef __int32 khronos_int32_t;
+typedef unsigned __int32 khronos_uint32_t;
+typedef __int64 khronos_int64_t;
+typedef unsigned __int64 khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(__sun__) || defined(__digital__)
+
+/*
+ * Sun or Digital
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#if defined(__arch64__) || defined(_LP64)
+typedef long int khronos_int64_t;
+typedef unsigned long int khronos_uint64_t;
+#else
+typedef long long int khronos_int64_t;
+typedef unsigned long long int khronos_uint64_t;
+#endif /* __arch64__ */
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif 0
+
+/*
+ * Hypothetical platform with no float or int64 support
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#define KHRONOS_SUPPORT_INT64 0
+#define KHRONOS_SUPPORT_FLOAT 0
+
+#else
+
+/*
+ * Generic fallback
+ */
+#include <stdint.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#endif
+
+
+/*
+ * Types that are (so far) the same on all platforms
+ */
+typedef signed char khronos_int8_t;
+typedef unsigned char khronos_uint8_t;
+typedef signed short int khronos_int16_t;
+typedef unsigned short int khronos_uint16_t;
+
+/*
+ * Types that differ between LLP64 and LP64 architectures - in LLP64,
+ * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
+ * to be the only LLP64 architecture in current use.
+ */
+#ifdef _WIN64
+typedef signed long long int khronos_intptr_t;
+typedef unsigned long long int khronos_uintptr_t;
+typedef signed long long int khronos_ssize_t;
+typedef unsigned long long int khronos_usize_t;
+#else
+typedef signed long int khronos_intptr_t;
+typedef unsigned long int khronos_uintptr_t;
+typedef signed long int khronos_ssize_t;
+typedef unsigned long int khronos_usize_t;
+#endif
+
+#if KHRONOS_SUPPORT_FLOAT
+/*
+ * Float type
+ */
+typedef float khronos_float_t;
+#endif
+
+#if KHRONOS_SUPPORT_INT64
+/* Time types
+ *
+ * These types can be used to represent a time interval in nanoseconds or
+ * an absolute Unadjusted System Time. Unadjusted System Time is the number
+ * of nanoseconds since some arbitrary system event (e.g. since the last
+ * time the system booted). The Unadjusted System Time is an unsigned
+ * 64 bit value that wraps back to 0 every 584 years. Time intervals
+ * may be either signed or unsigned.
+ */
+typedef khronos_uint64_t khronos_utime_nanoseconds_t;
+typedef khronos_int64_t khronos_stime_nanoseconds_t;
+#endif
+
+/*
+ * Dummy value used to pad enum types to 32 bits.
+ */
+#ifndef KHRONOS_MAX_ENUM
+#define KHRONOS_MAX_ENUM 0x7FFFFFFF
+#endif
+
+/*
+ * Enumerated boolean type
+ *
+ * Values other than zero should be considered to be true. Therefore
+ * comparisons should not be made against KHRONOS_TRUE.
+ */
+typedef enum {
+ KHRONOS_FALSE = 0,
+ KHRONOS_TRUE = 1,
+ KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
+} khronos_boolean_enum_t;
+
+#endif /* __khrplatform_h_ */
+typedef unsigned int GLenum;
+typedef unsigned char GLboolean;
+typedef unsigned int GLbitfield;
+typedef void GLvoid;
+typedef khronos_int8_t GLbyte;
+typedef khronos_uint8_t GLubyte;
+typedef khronos_int16_t GLshort;
+typedef khronos_uint16_t GLushort;
+typedef int GLint;
+typedef unsigned int GLuint;
+typedef khronos_int32_t GLclampx;
+typedef int GLsizei;
+typedef khronos_float_t GLfloat;
+typedef khronos_float_t GLclampf;
+typedef double GLdouble;
+typedef double GLclampd;
+typedef void *GLeglClientBufferEXT;
+typedef void *GLeglImageOES;
+typedef char GLchar;
+typedef char GLcharARB;
+#ifdef __APPLE__
+typedef void *GLhandleARB;
+#else
+typedef unsigned int GLhandleARB;
+#endif
+typedef khronos_uint16_t GLhalf;
+typedef khronos_uint16_t GLhalfARB;
+typedef khronos_int32_t GLfixed;
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_intptr_t GLintptr;
+#else
+typedef khronos_intptr_t GLintptr;
+#endif
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_intptr_t GLintptrARB;
+#else
+typedef khronos_intptr_t GLintptrARB;
+#endif
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_ssize_t GLsizeiptr;
+#else
+typedef khronos_ssize_t GLsizeiptr;
+#endif
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_ssize_t GLsizeiptrARB;
+#else
+typedef khronos_ssize_t GLsizeiptrARB;
+#endif
+typedef khronos_int64_t GLint64;
+typedef khronos_int64_t GLint64EXT;
+typedef khronos_uint64_t GLuint64;
+typedef khronos_uint64_t GLuint64EXT;
+typedef struct __GLsync *GLsync;
+struct _cl_context;
+struct _cl_event;
+typedef void ( *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+typedef void ( *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+typedef void ( *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+typedef void ( *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam);
+typedef unsigned short GLhalfNV;
+typedef GLintptr GLvdpauSurfaceNV;
+typedef void ( *GLVULKANPROCNV)(void);
+
+
+#define GL_VERSION_1_0 1
+GLAD_API_CALL int GLAD_GL_VERSION_1_0;
+#define GL_VERSION_1_1 1
+GLAD_API_CALL int GLAD_GL_VERSION_1_1;
+#define GL_VERSION_ES_CM_1_0 1
+GLAD_API_CALL int GLAD_GL_VERSION_ES_CM_1_0;
+#define GL_ARB_copy_buffer 1
+GLAD_API_CALL int GLAD_GL_ARB_copy_buffer;
+#define GL_ARB_fragment_shader 1
+GLAD_API_CALL int GLAD_GL_ARB_fragment_shader;
+#define GL_ARB_framebuffer_object 1
+GLAD_API_CALL int GLAD_GL_ARB_framebuffer_object;
+#define GL_ARB_geometry_shader4 1
+GLAD_API_CALL int GLAD_GL_ARB_geometry_shader4;
+#define GL_ARB_get_program_binary 1
+GLAD_API_CALL int GLAD_GL_ARB_get_program_binary;
+#define GL_ARB_imaging 1
+GLAD_API_CALL int GLAD_GL_ARB_imaging;
+#define GL_ARB_multitexture 1
+GLAD_API_CALL int GLAD_GL_ARB_multitexture;
+#define GL_ARB_separate_shader_objects 1
+GLAD_API_CALL int GLAD_GL_ARB_separate_shader_objects;
+#define GL_ARB_shader_objects 1
+GLAD_API_CALL int GLAD_GL_ARB_shader_objects;
+#define GL_ARB_shading_language_100 1
+GLAD_API_CALL int GLAD_GL_ARB_shading_language_100;
+#define GL_ARB_texture_non_power_of_two 1
+GLAD_API_CALL int GLAD_GL_ARB_texture_non_power_of_two;
+#define GL_ARB_vertex_buffer_object 1
+GLAD_API_CALL int GLAD_GL_ARB_vertex_buffer_object;
+#define GL_ARB_vertex_program 1
+GLAD_API_CALL int GLAD_GL_ARB_vertex_program;
+#define GL_ARB_vertex_shader 1
+GLAD_API_CALL int GLAD_GL_ARB_vertex_shader;
+#define GL_EXT_blend_equation_separate 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_equation_separate;
+#define GL_EXT_blend_func_separate 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_func_separate;
+#define GL_EXT_blend_minmax 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_minmax;
+#define GL_EXT_blend_subtract 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_subtract;
+#define GL_EXT_copy_texture 1
+GLAD_API_CALL int GLAD_GL_EXT_copy_texture;
+#define GL_EXT_framebuffer_blit 1
+GLAD_API_CALL int GLAD_GL_EXT_framebuffer_blit;
+#define GL_EXT_framebuffer_multisample 1
+GLAD_API_CALL int GLAD_GL_EXT_framebuffer_multisample;
+#define GL_EXT_framebuffer_object 1
+GLAD_API_CALL int GLAD_GL_EXT_framebuffer_object;
+#define GL_EXT_geometry_shader4 1
+GLAD_API_CALL int GLAD_GL_EXT_geometry_shader4;
+#define GL_EXT_packed_depth_stencil 1
+GLAD_API_CALL int GLAD_GL_EXT_packed_depth_stencil;
+#define GL_EXT_subtexture 1
+GLAD_API_CALL int GLAD_GL_EXT_subtexture;
+#define GL_EXT_texture_array 1
+GLAD_API_CALL int GLAD_GL_EXT_texture_array;
+#define GL_EXT_texture_object 1
+GLAD_API_CALL int GLAD_GL_EXT_texture_object;
+#define GL_EXT_texture_sRGB 1
+GLAD_API_CALL int GLAD_GL_EXT_texture_sRGB;
+#define GL_EXT_vertex_array 1
+GLAD_API_CALL int GLAD_GL_EXT_vertex_array;
+#define GL_INGR_blend_func_separate 1
+GLAD_API_CALL int GLAD_GL_INGR_blend_func_separate;
+#define GL_KHR_debug 1
+GLAD_API_CALL int GLAD_GL_KHR_debug;
+#define GL_NV_geometry_program4 1
+GLAD_API_CALL int GLAD_GL_NV_geometry_program4;
+#define GL_NV_vertex_program 1
+GLAD_API_CALL int GLAD_GL_NV_vertex_program;
+#define GL_SGIS_texture_edge_clamp 1
+GLAD_API_CALL int GLAD_GL_SGIS_texture_edge_clamp;
+#define GL_EXT_sRGB 1
+GLAD_API_CALL int GLAD_GL_EXT_sRGB;
+#define GL_OES_blend_equation_separate 1
+GLAD_API_CALL int GLAD_GL_OES_blend_equation_separate;
+#define GL_OES_blend_func_separate 1
+GLAD_API_CALL int GLAD_GL_OES_blend_func_separate;
+#define GL_OES_blend_subtract 1
+GLAD_API_CALL int GLAD_GL_OES_blend_subtract;
+#define GL_OES_framebuffer_object 1
+GLAD_API_CALL int GLAD_GL_OES_framebuffer_object;
+#define GL_OES_packed_depth_stencil 1
+GLAD_API_CALL int GLAD_GL_OES_packed_depth_stencil;
+#define GL_OES_single_precision 1
+GLAD_API_CALL int GLAD_GL_OES_single_precision;
+#define GL_OES_texture_npot 1
+GLAD_API_CALL int GLAD_GL_OES_texture_npot;
+
+
+typedef void (GLAD_API_PTR *PFNGLACCUMPROC)(GLenum op, GLfloat value);
+typedef void (GLAD_API_PTR *PFNGLACTIVESHADERPROGRAMPROC)(GLuint pipeline, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLALPHAFUNCPROC)(GLenum func, GLfloat ref);
+typedef GLboolean (GLAD_API_PTR *PFNGLAREPROGRAMSRESIDENTNVPROC)(GLsizei n, const GLuint * programs, GLboolean * residences);
+typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences);
+typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTEXTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences);
+typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTPROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTEXTPROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLATTACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB obj);
+typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLBEGINPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONARBPROC)(GLhandleARB programObj, GLuint index, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERARBPROC)(GLenum target, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMARBPROC)(GLenum target, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMNVPROC)(GLenum target, GLuint id);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREEXTPROC)(GLenum target, GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLBITMAPPROC)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap);
+typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONEXTPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEINGRPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage);
+typedef void (GLAD_API_PTR *PFNGLBUFFERDATAARBPROC)(GLenum target, GLsizeiptrARB size, const void * data, GLenum usage);
+typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data);
+typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCALLLISTPROC)(GLuint list);
+typedef void (GLAD_API_PTR *PFNGLCALLLISTSPROC)(GLsizei n, GLenum type, const void * lists);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLCLEARACCUMPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth);
+typedef void (GLAD_API_PTR *PFNGLCLEARINDEXPROC)(GLfloat c);
+typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s);
+typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEPROC)(GLenum plane, const GLdouble * equation);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3IPROC)(GLint red, GLint green, GLint blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UBVPROC)(const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UIVPROC)(const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3USVPROC)(const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4BPROC)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4DPROC)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4FPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4IPROC)(GLint red, GLint green, GLint blue, GLint alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4SPROC)(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UBPROC)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UBVPROC)(const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UIPROC)(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UIVPROC)(const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4USPROC)(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4USVPROC)(const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLORMATERIALPROC)(GLenum face, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLCOLORPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * table);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERARBPROC)(GLhandleARB shaderObj);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * image);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * image);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIPROC)(GLenum target, GLenum pname, GLint params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GLAD_API_PTR *PFNGLCOPYCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATEPROGRAMOBJECTARBPROC)(void);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATESHADEROBJECTARBPROC)(GLenum shaderType);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar *const* strings);
+typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void * userParam);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf);
+typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSARBPROC)(GLsizei n, const GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETELISTSPROC)(GLuint list, GLsizei range);
+typedef void (GLAD_API_PTR *PFNGLDELETEOBJECTARBPROC)(GLhandleARB obj);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint * pipelines);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSARBPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSNVPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESEXTPROC)(GLsizei n, const GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func);
+typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f);
+typedef void (GLAD_API_PTR *PFNGLDETACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB attachedObj);
+typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap);
+typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEPROC)(GLenum array);
+typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count);
+typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSEXTPROC)(GLenum mode, GLint first, GLsizei count);
+typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf);
+typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices);
+typedef void (GLAD_API_PTR *PFNGLDRAWPIXELSPROC)(GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPROC)(GLboolean flag);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTERPROC)(GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTEREXTPROC)(GLsizei stride, GLsizei count, const GLboolean * pointer);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGVPROC)(const GLboolean * flag);
+typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap);
+typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEPROC)(GLenum array);
+typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLENDPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLENDLISTPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DPROC)(GLdouble u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DVPROC)(const GLdouble * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FPROC)(GLfloat u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FVPROC)(const GLfloat * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DPROC)(GLdouble u, GLdouble v);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DVPROC)(const GLdouble * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FPROC)(GLfloat u, GLfloat v);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FVPROC)(const GLfloat * u);
+typedef void (GLAD_API_PTR *PFNGLEVALMESH1PROC)(GLenum mode, GLint i1, GLint i2);
+typedef void (GLAD_API_PTR *PFNGLEVALMESH2PROC)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+typedef void (GLAD_API_PTR *PFNGLEVALPOINT1PROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLEVALPOINT2PROC)(GLint i, GLint j);
+typedef void (GLAD_API_PTR *PFNGLEXECUTEPROGRAMNVPROC)(GLenum target, GLuint id, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLFEEDBACKBUFFERPROC)(GLsizei size, GLenum type, GLfloat * buffer);
+typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLFOGFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLFOGFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLFOGIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLFOGIVPROC)(GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLGENBUFFERSARBPROC)(GLsizei n, GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint * framebuffers);
+typedef GLuint (GLAD_API_PTR *PFNGLGENLISTSPROC)(GLsizei range);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSARBPROC)(GLsizei n, GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSNVPROC)(GLsizei n, GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLGENTEXTURESEXTPROC)(GLsizei n, GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPEXTPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETATTACHEDOBJECTSARBPROC)(GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj);
+typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVARBPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVARBPROC)(GLenum target, GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEPROC)(GLenum plane, GLdouble * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPROC)(GLenum target, GLenum format, GLenum type, void * table);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONFILTERPROC)(GLenum target, GLenum format, GLenum type, void * image);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog);
+typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data);
+typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLGETHANDLEARBPROC)(GLenum pname);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETINFOLOGARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog);
+typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTFVPROC)(GLenum light, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTIVPROC)(GLenum light, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETMAPDVPROC)(GLenum target, GLenum query, GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLGETMAPFVPROC)(GLenum target, GLenum query, GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLGETMAPIVPROC)(GLenum target, GLenum query, GLint * v);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALFVPROC)(GLenum face, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALIVPROC)(GLenum face, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERFVARBPROC)(GLhandleARB obj, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERIVARBPROC)(GLhandleARB obj, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPTRLABELPROC)(const void * ptr, GLsizei bufSize, GLsizei * length, GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPFVPROC)(GLenum map, GLfloat * values);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUIVPROC)(GLenum map, GLuint * values);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUSVPROC)(GLenum map, GLushort * values);
+typedef void (GLAD_API_PTR *PFNGLGETPOINTERVPROC)(GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETPOINTERVEXTPROC)(GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte * mask);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERDVNVPROC)(GLenum target, GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERFVNVPROC)(GLenum target, GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGARBPROC)(GLenum target, GLenum pname, void * string);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGNVPROC)(GLuint id, GLenum pname, GLubyte * program);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVARBPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVNVPROC)(GLuint id, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETSEPARABLEFILTERPROC)(GLenum target, GLenum format, GLenum type, void * row, void * column, void * span);
+typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source);
+typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source);
+typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENDVPROC)(GLenum coord, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENFVPROC)(GLenum coord, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENIVPROC)(GLenum coord, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTRACKMATRIXIVNVPROC)(GLenum target, GLuint address, GLenum pname, GLint * params);
+typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVARBPROC)(GLhandleARB programObj, GLint location, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVARBPROC)(GLhandleARB programObj, GLint location, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVARBPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVNVPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVARBPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVNVPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVARBPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVNVPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVARBPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVNVPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLHISTOGRAMPROC)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+typedef void (GLAD_API_PTR *PFNGLINDEXMASKPROC)(GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLINDEXPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLINDEXPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLINDEXDPROC)(GLdouble c);
+typedef void (GLAD_API_PTR *PFNGLINDEXDVPROC)(const GLdouble * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXFPROC)(GLfloat c);
+typedef void (GLAD_API_PTR *PFNGLINDEXFVPROC)(const GLfloat * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXIPROC)(GLint c);
+typedef void (GLAD_API_PTR *PFNGLINDEXIVPROC)(const GLint * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXSPROC)(GLshort c);
+typedef void (GLAD_API_PTR *PFNGLINDEXSVPROC)(const GLshort * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXUBPROC)(GLubyte c);
+typedef void (GLAD_API_PTR *PFNGLINDEXUBVPROC)(const GLubyte * c);
+typedef void (GLAD_API_PTR *PFNGLINITNAMESPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLINTERLEAVEDARRAYSPROC)(GLenum format, GLsizei stride, const void * pointer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERARBPROC)(GLuint buffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISLISTPROC)(GLuint list);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMARBPROC)(GLuint program);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMNVPROC)(GLuint id);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture);
+typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREEXTPROC)(GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIVPROC)(GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTFPROC)(GLenum light, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTFVPROC)(GLenum light, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTIPROC)(GLenum light, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTIVPROC)(GLenum light, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLLINESTIPPLEPROC)(GLint factor, GLushort pattern);
+typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width);
+typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLLISTBASEPROC)(GLuint base);
+typedef void (GLAD_API_PTR *PFNGLLOADIDENTITYPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXDPROC)(const GLdouble * m);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXFPROC)(const GLfloat * m);
+typedef void (GLAD_API_PTR *PFNGLLOADNAMEPROC)(GLuint name);
+typedef void (GLAD_API_PTR *PFNGLLOADPROGRAMNVPROC)(GLenum target, GLuint id, GLsizei len, const GLubyte * program);
+typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode);
+typedef void (GLAD_API_PTR *PFNGLMAP1DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points);
+typedef void (GLAD_API_PTR *PFNGLMAP1FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points);
+typedef void (GLAD_API_PTR *PFNGLMAP2DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points);
+typedef void (GLAD_API_PTR *PFNGLMAP2FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points);
+typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access);
+typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERARBPROC)(GLenum target, GLenum access);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID1DPROC)(GLint un, GLdouble u1, GLdouble u2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID1FPROC)(GLint un, GLfloat u1, GLfloat u2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID2DPROC)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID2FPROC)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLMATERIALFPROC)(GLenum face, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALFVPROC)(GLenum face, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLMATERIALIPROC)(GLenum face, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALIVPROC)(GLenum face, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLMATRIXMODEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLMINMAXPROC)(GLenum target, GLenum internalformat, GLboolean sink);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXDPROC)(const GLdouble * m);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXFPROC)(const GLfloat * m);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DPROC)(GLenum target, GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DARBPROC)(GLenum target, GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FPROC)(GLenum target, GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FARBPROC)(GLenum target, GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IPROC)(GLenum target, GLint s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IARBPROC)(GLenum target, GLint s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SPROC)(GLenum target, GLshort s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SARBPROC)(GLenum target, GLshort s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DPROC)(GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DARBPROC)(GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FPROC)(GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FARBPROC)(GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IPROC)(GLenum target, GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IARBPROC)(GLenum target, GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SPROC)(GLenum target, GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SARBPROC)(GLenum target, GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IPROC)(GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IARBPROC)(GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SPROC)(GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IARBPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLNEWLISTPROC)(GLuint list, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3BPROC)(GLbyte nx, GLbyte ny, GLbyte nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3DPROC)(GLdouble nx, GLdouble ny, GLdouble nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3FPROC)(GLfloat nx, GLfloat ny, GLfloat nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3IPROC)(GLint nx, GLint ny, GLint nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3SPROC)(GLshort nx, GLshort ny, GLshort nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLNORMALPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLNORMALPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELPROC)(const void * ptr, GLsizei length, const GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLORTHOPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+typedef void (GLAD_API_PTR *PFNGLPASSTHROUGHPROC)(GLfloat token);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPFVPROC)(GLenum map, GLsizei mapsize, const GLfloat * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPUIVPROC)(GLenum map, GLsizei mapsize, const GLuint * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPUSVPROC)(GLenum map, GLsizei mapsize, const GLushort * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLPIXELZOOMPROC)(GLfloat xfactor, GLfloat yfactor);
+typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONSTIPPLEPROC)(const GLubyte * mask);
+typedef void (GLAD_API_PTR *PFNGLPOPATTRIBPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPCLIENTATTRIBPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPMATRIXPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPNAMEPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESPROC)(GLsizei n, const GLuint * textures, const GLfloat * priorities);
+typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESEXTPROC)(GLsizei n, const GLuint * textures, const GLclampf * priorities);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLsizei length);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DNVPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DVNVPROC)(GLenum target, GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FNVPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FVNVPROC)(GLenum target, GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIARBPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIEXTPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4DVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4FVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMSTRINGARBPROC)(GLenum target, GLenum format, GLsizei len, const void * string);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DPROC)(GLuint program, GLint location, GLdouble v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FPROC)(GLuint program, GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IPROC)(GLuint program, GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIPROC)(GLuint program, GLint location, GLuint v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IPROC)(GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMVERTEXLIMITNVPROC)(GLenum target, GLint limit);
+typedef void (GLAD_API_PTR *PFNGLPUSHATTRIBPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message);
+typedef void (GLAD_API_PTR *PFNGLPUSHMATRIXPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPUSHNAMEPROC)(GLuint name);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DPROC)(GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FPROC)(GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IPROC)(GLint x, GLint y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SPROC)(GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IPROC)(GLint x, GLint y, GLint z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SPROC)(GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IPROC)(GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src);
+typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLRECTDPROC)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+typedef void (GLAD_API_PTR *PFNGLRECTDVPROC)(const GLdouble * v1, const GLdouble * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTFPROC)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+typedef void (GLAD_API_PTR *PFNGLRECTFVPROC)(const GLfloat * v1, const GLfloat * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTIPROC)(GLint x1, GLint y1, GLint x2, GLint y2);
+typedef void (GLAD_API_PTR *PFNGLRECTIVPROC)(const GLint * v1, const GLint * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTSPROC)(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+typedef void (GLAD_API_PTR *PFNGLRECTSVPROC)(const GLshort * v1, const GLshort * v2);
+typedef GLint (GLAD_API_PTR *PFNGLRENDERMODEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLREQUESTRESIDENTPROGRAMSNVPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLRESETHISTOGRAMPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLRESETMINMAXPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLROTATEDPROC)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLROTATEFPROC)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLSCALEDPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLSCALEFPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLSELECTBUFFERPROC)(GLsizei size, GLuint * buffer);
+typedef void (GLAD_API_PTR *PFNGLSEPARABLEFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * row, const void * column);
+typedef void (GLAD_API_PTR *PFNGLSHADEMODELPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length);
+typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEARBPROC)(GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint * length);
+typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DPROC)(GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FPROC)(GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IPROC)(GLint s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SPROC)(GLshort s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DPROC)(GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FPROC)(GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IPROC)(GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SPROC)(GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DPROC)(GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FPROC)(GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IPROC)(GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SPROC)(GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DPROC)(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FPROC)(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IPROC)(GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SPROC)(GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLTEXENVFPROC)(GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXENVIPROC)(GLenum target, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENDPROC)(GLenum coord, GLenum pname, GLdouble param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENDVPROC)(GLenum coord, GLenum pname, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENFPROC)(GLenum coord, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENFVPROC)(GLenum coord, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENIPROC)(GLenum coord, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENIVPROC)(GLenum coord, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTRACKMATRIXNVPROC)(GLenum target, GLuint address, GLenum matrix, GLenum transform);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEDPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEFPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FARBPROC)(GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IARBPROC)(GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FARBPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IARBPROC)(GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target);
+typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERARBPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMOBJECTARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2DPROC)(GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2FPROC)(GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2IPROC)(GLint x, GLint y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2SPROC)(GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3DPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3FPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3IPROC)(GLint x, GLint y, GLint z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3SPROC)(GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4IPROC)(GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DARBPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DNVPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FARBPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FNVPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SARBPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SNVPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DARBPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DNVPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FARBPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FNVPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SARBPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SNVPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVARBPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVARBPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBARBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVARBPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVARBPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVARBPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVARBPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVARBPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBNVPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVARBPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVNVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVARBPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVARBPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERARBPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERNVPROC)(GLuint index, GLint fsize, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4UBVNVPROC)(GLuint index, GLsizei count, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLALPHAFUNCXPROC)(GLenum func, GLfixed ref);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEROESPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEROESPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONOESPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEOESPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEOESPROC)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSOESPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLCLEARCOLORXPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat d);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFOESPROC)(GLclampf depth);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHXPROC)(GLfixed depth);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFPROC)(GLenum p, const GLfloat * eqn);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFOESPROC)(GLenum plane, const GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEXPROC)(GLenum plane, const GLfixed * equation);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4XPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSOESPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSOESPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFOESPROC)(GLclampf n, GLclampf f);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEXPROC)(GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLFOGXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLFOGXVPROC)(GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEROESPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DOESPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMFPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMXPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSOESPROC)(GLsizei n, GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSOESPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPOESPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFPROC)(GLenum plane, GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFOESPROC)(GLenum plane, GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEXPROC)(GLenum plane, GLfixed * equation);
+typedef void (GLAD_API_PTR *PFNGLGETFIXEDVPROC)(GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTXVPROC)(GLenum light, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALXVPROC)(GLenum face, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVOESPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVXVPROC)(GLenum target, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERXVPROC)(GLenum target, GLenum pname, GLfixed * params);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFEROESPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFEROESPROC)(GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELXVPROC)(GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTXPROC)(GLenum light, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTXVPROC)(GLenum light, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLLINEWIDTHXPROC)(GLfixed width);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXXPROC)(const GLfixed * m);
+typedef void (GLAD_API_PTR *PFNGLMATERIALXPROC)(GLenum face, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALXVPROC)(GLenum face, GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXXPROC)(const GLfixed * m);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4XPROC)(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3XPROC)(GLfixed nx, GLfixed ny, GLfixed nz);
+typedef void (GLAD_API_PTR *PFNGLORTHOFPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLORTHOFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLORTHOXPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERXVPROC)(GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLPOINTSIZEXPROC)(GLfixed size);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETXPROC)(GLfixed factor, GLfixed units);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEOESPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLROTATEXPROC)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert);
+typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEXPROC)(GLclampx value, GLboolean invert);
+typedef void (GLAD_API_PTR *PFNGLSCALEXPROC)(GLfixed x, GLfixed y, GLfixed z);
+typedef void (GLAD_API_PTR *PFNGLTEXENVXPROC)(GLenum target, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVXVPROC)(GLenum target, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERXPROC)(GLenum target, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERXVPROC)(GLenum target, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEXPROC)(GLfixed x, GLfixed y, GLfixed z);
+
+GLAD_API_CALL PFNGLACCUMPROC glad_glAccum;
+#define glAccum glad_glAccum
+GLAD_API_CALL PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram;
+#define glActiveShaderProgram glad_glActiveShaderProgram
+GLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture;
+#define glActiveTexture glad_glActiveTexture
+GLAD_API_CALL PFNGLACTIVETEXTUREARBPROC glad_glActiveTextureARB;
+#define glActiveTextureARB glad_glActiveTextureARB
+GLAD_API_CALL PFNGLALPHAFUNCPROC glad_glAlphaFunc;
+#define glAlphaFunc glad_glAlphaFunc
+GLAD_API_CALL PFNGLAREPROGRAMSRESIDENTNVPROC glad_glAreProgramsResidentNV;
+#define glAreProgramsResidentNV glad_glAreProgramsResidentNV
+GLAD_API_CALL PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident;
+#define glAreTexturesResident glad_glAreTexturesResident
+GLAD_API_CALL PFNGLARETEXTURESRESIDENTEXTPROC glad_glAreTexturesResidentEXT;
+#define glAreTexturesResidentEXT glad_glAreTexturesResidentEXT
+GLAD_API_CALL PFNGLARRAYELEMENTPROC glad_glArrayElement;
+#define glArrayElement glad_glArrayElement
+GLAD_API_CALL PFNGLARRAYELEMENTEXTPROC glad_glArrayElementEXT;
+#define glArrayElementEXT glad_glArrayElementEXT
+GLAD_API_CALL PFNGLATTACHOBJECTARBPROC glad_glAttachObjectARB;
+#define glAttachObjectARB glad_glAttachObjectARB
+GLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader;
+#define glAttachShader glad_glAttachShader
+GLAD_API_CALL PFNGLBEGINPROC glad_glBegin;
+#define glBegin glad_glBegin
+GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation;
+#define glBindAttribLocation glad_glBindAttribLocation
+GLAD_API_CALL PFNGLBINDATTRIBLOCATIONARBPROC glad_glBindAttribLocationARB;
+#define glBindAttribLocationARB glad_glBindAttribLocationARB
+GLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer;
+#define glBindBuffer glad_glBindBuffer
+GLAD_API_CALL PFNGLBINDBUFFERARBPROC glad_glBindBufferARB;
+#define glBindBufferARB glad_glBindBufferARB
+GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer;
+#define glBindFramebuffer glad_glBindFramebuffer
+GLAD_API_CALL PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT;
+#define glBindFramebufferEXT glad_glBindFramebufferEXT
+GLAD_API_CALL PFNGLBINDPROGRAMARBPROC glad_glBindProgramARB;
+#define glBindProgramARB glad_glBindProgramARB
+GLAD_API_CALL PFNGLBINDPROGRAMNVPROC glad_glBindProgramNV;
+#define glBindProgramNV glad_glBindProgramNV
+GLAD_API_CALL PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline;
+#define glBindProgramPipeline glad_glBindProgramPipeline
+GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer;
+#define glBindRenderbuffer glad_glBindRenderbuffer
+GLAD_API_CALL PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT;
+#define glBindRenderbufferEXT glad_glBindRenderbufferEXT
+GLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture;
+#define glBindTexture glad_glBindTexture
+GLAD_API_CALL PFNGLBINDTEXTUREEXTPROC glad_glBindTextureEXT;
+#define glBindTextureEXT glad_glBindTextureEXT
+GLAD_API_CALL PFNGLBITMAPPROC glad_glBitmap;
+#define glBitmap glad_glBitmap
+GLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor;
+#define glBlendColor glad_glBlendColor
+GLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation;
+#define glBlendEquation glad_glBlendEquation
+GLAD_API_CALL PFNGLBLENDEQUATIONEXTPROC glad_glBlendEquationEXT;
+#define glBlendEquationEXT glad_glBlendEquationEXT
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate;
+#define glBlendEquationSeparate glad_glBlendEquationSeparate
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEEXTPROC glad_glBlendEquationSeparateEXT;
+#define glBlendEquationSeparateEXT glad_glBlendEquationSeparateEXT
+GLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc;
+#define glBlendFunc glad_glBlendFunc
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate;
+#define glBlendFuncSeparate glad_glBlendFuncSeparate
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEEXTPROC glad_glBlendFuncSeparateEXT;
+#define glBlendFuncSeparateEXT glad_glBlendFuncSeparateEXT
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEINGRPROC glad_glBlendFuncSeparateINGR;
+#define glBlendFuncSeparateINGR glad_glBlendFuncSeparateINGR
+GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer;
+#define glBlitFramebuffer glad_glBlitFramebuffer
+GLAD_API_CALL PFNGLBLITFRAMEBUFFEREXTPROC glad_glBlitFramebufferEXT;
+#define glBlitFramebufferEXT glad_glBlitFramebufferEXT
+GLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData;
+#define glBufferData glad_glBufferData
+GLAD_API_CALL PFNGLBUFFERDATAARBPROC glad_glBufferDataARB;
+#define glBufferDataARB glad_glBufferDataARB
+GLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData;
+#define glBufferSubData glad_glBufferSubData
+GLAD_API_CALL PFNGLBUFFERSUBDATAARBPROC glad_glBufferSubDataARB;
+#define glBufferSubDataARB glad_glBufferSubDataARB
+GLAD_API_CALL PFNGLCALLLISTPROC glad_glCallList;
+#define glCallList glad_glCallList
+GLAD_API_CALL PFNGLCALLLISTSPROC glad_glCallLists;
+#define glCallLists glad_glCallLists
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus;
+#define glCheckFramebufferStatus glad_glCheckFramebufferStatus
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT;
+#define glCheckFramebufferStatusEXT glad_glCheckFramebufferStatusEXT
+GLAD_API_CALL PFNGLCLEARPROC glad_glClear;
+#define glClear glad_glClear
+GLAD_API_CALL PFNGLCLEARACCUMPROC glad_glClearAccum;
+#define glClearAccum glad_glClearAccum
+GLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor;
+#define glClearColor glad_glClearColor
+GLAD_API_CALL PFNGLCLEARDEPTHPROC glad_glClearDepth;
+#define glClearDepth glad_glClearDepth
+GLAD_API_CALL PFNGLCLEARINDEXPROC glad_glClearIndex;
+#define glClearIndex glad_glClearIndex
+GLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil;
+#define glClearStencil glad_glClearStencil
+GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture;
+#define glClientActiveTexture glad_glClientActiveTexture
+GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREARBPROC glad_glClientActiveTextureARB;
+#define glClientActiveTextureARB glad_glClientActiveTextureARB
+GLAD_API_CALL PFNGLCLIPPLANEPROC glad_glClipPlane;
+#define glClipPlane glad_glClipPlane
+GLAD_API_CALL PFNGLCOLOR3BPROC glad_glColor3b;
+#define glColor3b glad_glColor3b
+GLAD_API_CALL PFNGLCOLOR3BVPROC glad_glColor3bv;
+#define glColor3bv glad_glColor3bv
+GLAD_API_CALL PFNGLCOLOR3DPROC glad_glColor3d;
+#define glColor3d glad_glColor3d
+GLAD_API_CALL PFNGLCOLOR3DVPROC glad_glColor3dv;
+#define glColor3dv glad_glColor3dv
+GLAD_API_CALL PFNGLCOLOR3FPROC glad_glColor3f;
+#define glColor3f glad_glColor3f
+GLAD_API_CALL PFNGLCOLOR3FVPROC glad_glColor3fv;
+#define glColor3fv glad_glColor3fv
+GLAD_API_CALL PFNGLCOLOR3IPROC glad_glColor3i;
+#define glColor3i glad_glColor3i
+GLAD_API_CALL PFNGLCOLOR3IVPROC glad_glColor3iv;
+#define glColor3iv glad_glColor3iv
+GLAD_API_CALL PFNGLCOLOR3SPROC glad_glColor3s;
+#define glColor3s glad_glColor3s
+GLAD_API_CALL PFNGLCOLOR3SVPROC glad_glColor3sv;
+#define glColor3sv glad_glColor3sv
+GLAD_API_CALL PFNGLCOLOR3UBPROC glad_glColor3ub;
+#define glColor3ub glad_glColor3ub
+GLAD_API_CALL PFNGLCOLOR3UBVPROC glad_glColor3ubv;
+#define glColor3ubv glad_glColor3ubv
+GLAD_API_CALL PFNGLCOLOR3UIPROC glad_glColor3ui;
+#define glColor3ui glad_glColor3ui
+GLAD_API_CALL PFNGLCOLOR3UIVPROC glad_glColor3uiv;
+#define glColor3uiv glad_glColor3uiv
+GLAD_API_CALL PFNGLCOLOR3USPROC glad_glColor3us;
+#define glColor3us glad_glColor3us
+GLAD_API_CALL PFNGLCOLOR3USVPROC glad_glColor3usv;
+#define glColor3usv glad_glColor3usv
+GLAD_API_CALL PFNGLCOLOR4BPROC glad_glColor4b;
+#define glColor4b glad_glColor4b
+GLAD_API_CALL PFNGLCOLOR4BVPROC glad_glColor4bv;
+#define glColor4bv glad_glColor4bv
+GLAD_API_CALL PFNGLCOLOR4DPROC glad_glColor4d;
+#define glColor4d glad_glColor4d
+GLAD_API_CALL PFNGLCOLOR4DVPROC glad_glColor4dv;
+#define glColor4dv glad_glColor4dv
+GLAD_API_CALL PFNGLCOLOR4FPROC glad_glColor4f;
+#define glColor4f glad_glColor4f
+GLAD_API_CALL PFNGLCOLOR4FVPROC glad_glColor4fv;
+#define glColor4fv glad_glColor4fv
+GLAD_API_CALL PFNGLCOLOR4IPROC glad_glColor4i;
+#define glColor4i glad_glColor4i
+GLAD_API_CALL PFNGLCOLOR4IVPROC glad_glColor4iv;
+#define glColor4iv glad_glColor4iv
+GLAD_API_CALL PFNGLCOLOR4SPROC glad_glColor4s;
+#define glColor4s glad_glColor4s
+GLAD_API_CALL PFNGLCOLOR4SVPROC glad_glColor4sv;
+#define glColor4sv glad_glColor4sv
+GLAD_API_CALL PFNGLCOLOR4UBPROC glad_glColor4ub;
+#define glColor4ub glad_glColor4ub
+GLAD_API_CALL PFNGLCOLOR4UBVPROC glad_glColor4ubv;
+#define glColor4ubv glad_glColor4ubv
+GLAD_API_CALL PFNGLCOLOR4UIPROC glad_glColor4ui;
+#define glColor4ui glad_glColor4ui
+GLAD_API_CALL PFNGLCOLOR4UIVPROC glad_glColor4uiv;
+#define glColor4uiv glad_glColor4uiv
+GLAD_API_CALL PFNGLCOLOR4USPROC glad_glColor4us;
+#define glColor4us glad_glColor4us
+GLAD_API_CALL PFNGLCOLOR4USVPROC glad_glColor4usv;
+#define glColor4usv glad_glColor4usv
+GLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask;
+#define glColorMask glad_glColorMask
+GLAD_API_CALL PFNGLCOLORMATERIALPROC glad_glColorMaterial;
+#define glColorMaterial glad_glColorMaterial
+GLAD_API_CALL PFNGLCOLORPOINTERPROC glad_glColorPointer;
+#define glColorPointer glad_glColorPointer
+GLAD_API_CALL PFNGLCOLORPOINTEREXTPROC glad_glColorPointerEXT;
+#define glColorPointerEXT glad_glColorPointerEXT
+GLAD_API_CALL PFNGLCOLORSUBTABLEPROC glad_glColorSubTable;
+#define glColorSubTable glad_glColorSubTable
+GLAD_API_CALL PFNGLCOLORTABLEPROC glad_glColorTable;
+#define glColorTable glad_glColorTable
+GLAD_API_CALL PFNGLCOLORTABLEPARAMETERFVPROC glad_glColorTableParameterfv;
+#define glColorTableParameterfv glad_glColorTableParameterfv
+GLAD_API_CALL PFNGLCOLORTABLEPARAMETERIVPROC glad_glColorTableParameteriv;
+#define glColorTableParameteriv glad_glColorTableParameteriv
+GLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader;
+#define glCompileShader glad_glCompileShader
+GLAD_API_CALL PFNGLCOMPILESHADERARBPROC glad_glCompileShaderARB;
+#define glCompileShaderARB glad_glCompileShaderARB
+GLAD_API_CALL PFNGLCONVOLUTIONFILTER1DPROC glad_glConvolutionFilter1D;
+#define glConvolutionFilter1D glad_glConvolutionFilter1D
+GLAD_API_CALL PFNGLCONVOLUTIONFILTER2DPROC glad_glConvolutionFilter2D;
+#define glConvolutionFilter2D glad_glConvolutionFilter2D
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFPROC glad_glConvolutionParameterf;
+#define glConvolutionParameterf glad_glConvolutionParameterf
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFVPROC glad_glConvolutionParameterfv;
+#define glConvolutionParameterfv glad_glConvolutionParameterfv
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIPROC glad_glConvolutionParameteri;
+#define glConvolutionParameteri glad_glConvolutionParameteri
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIVPROC glad_glConvolutionParameteriv;
+#define glConvolutionParameteriv glad_glConvolutionParameteriv
+GLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData;
+#define glCopyBufferSubData glad_glCopyBufferSubData
+GLAD_API_CALL PFNGLCOPYCOLORSUBTABLEPROC glad_glCopyColorSubTable;
+#define glCopyColorSubTable glad_glCopyColorSubTable
+GLAD_API_CALL PFNGLCOPYCOLORTABLEPROC glad_glCopyColorTable;
+#define glCopyColorTable glad_glCopyColorTable
+GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER1DPROC glad_glCopyConvolutionFilter1D;
+#define glCopyConvolutionFilter1D glad_glCopyConvolutionFilter1D
+GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER2DPROC glad_glCopyConvolutionFilter2D;
+#define glCopyConvolutionFilter2D glad_glCopyConvolutionFilter2D
+GLAD_API_CALL PFNGLCOPYPIXELSPROC glad_glCopyPixels;
+#define glCopyPixels glad_glCopyPixels
+GLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D;
+#define glCopyTexImage1D glad_glCopyTexImage1D
+GLAD_API_CALL PFNGLCOPYTEXIMAGE1DEXTPROC glad_glCopyTexImage1DEXT;
+#define glCopyTexImage1DEXT glad_glCopyTexImage1DEXT
+GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D;
+#define glCopyTexImage2D glad_glCopyTexImage2D
+GLAD_API_CALL PFNGLCOPYTEXIMAGE2DEXTPROC glad_glCopyTexImage2DEXT;
+#define glCopyTexImage2DEXT glad_glCopyTexImage2DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D;
+#define glCopyTexSubImage1D glad_glCopyTexSubImage1D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DEXTPROC glad_glCopyTexSubImage1DEXT;
+#define glCopyTexSubImage1DEXT glad_glCopyTexSubImage1DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D;
+#define glCopyTexSubImage2D glad_glCopyTexSubImage2D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DEXTPROC glad_glCopyTexSubImage2DEXT;
+#define glCopyTexSubImage2DEXT glad_glCopyTexSubImage2DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D;
+#define glCopyTexSubImage3D glad_glCopyTexSubImage3D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DEXTPROC glad_glCopyTexSubImage3DEXT;
+#define glCopyTexSubImage3DEXT glad_glCopyTexSubImage3DEXT
+GLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram;
+#define glCreateProgram glad_glCreateProgram
+GLAD_API_CALL PFNGLCREATEPROGRAMOBJECTARBPROC glad_glCreateProgramObjectARB;
+#define glCreateProgramObjectARB glad_glCreateProgramObjectARB
+GLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader;
+#define glCreateShader glad_glCreateShader
+GLAD_API_CALL PFNGLCREATESHADEROBJECTARBPROC glad_glCreateShaderObjectARB;
+#define glCreateShaderObjectARB glad_glCreateShaderObjectARB
+GLAD_API_CALL PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv;
+#define glCreateShaderProgramv glad_glCreateShaderProgramv
+GLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace;
+#define glCullFace glad_glCullFace
+GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback;
+#define glDebugMessageCallback glad_glDebugMessageCallback
+GLAD_API_CALL PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl;
+#define glDebugMessageControl glad_glDebugMessageControl
+GLAD_API_CALL PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert;
+#define glDebugMessageInsert glad_glDebugMessageInsert
+GLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers;
+#define glDeleteBuffers glad_glDeleteBuffers
+GLAD_API_CALL PFNGLDELETEBUFFERSARBPROC glad_glDeleteBuffersARB;
+#define glDeleteBuffersARB glad_glDeleteBuffersARB
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers;
+#define glDeleteFramebuffers glad_glDeleteFramebuffers
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT;
+#define glDeleteFramebuffersEXT glad_glDeleteFramebuffersEXT
+GLAD_API_CALL PFNGLDELETELISTSPROC glad_glDeleteLists;
+#define glDeleteLists glad_glDeleteLists
+GLAD_API_CALL PFNGLDELETEOBJECTARBPROC glad_glDeleteObjectARB;
+#define glDeleteObjectARB glad_glDeleteObjectARB
+GLAD_API_CALL PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines;
+#define glDeleteProgramPipelines glad_glDeleteProgramPipelines
+GLAD_API_CALL PFNGLDELETEPROGRAMSARBPROC glad_glDeleteProgramsARB;
+#define glDeleteProgramsARB glad_glDeleteProgramsARB
+GLAD_API_CALL PFNGLDELETEPROGRAMSNVPROC glad_glDeleteProgramsNV;
+#define glDeleteProgramsNV glad_glDeleteProgramsNV
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers;
+#define glDeleteRenderbuffers glad_glDeleteRenderbuffers
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT;
+#define glDeleteRenderbuffersEXT glad_glDeleteRenderbuffersEXT
+GLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures;
+#define glDeleteTextures glad_glDeleteTextures
+GLAD_API_CALL PFNGLDELETETEXTURESEXTPROC glad_glDeleteTexturesEXT;
+#define glDeleteTexturesEXT glad_glDeleteTexturesEXT
+GLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc;
+#define glDepthFunc glad_glDepthFunc
+GLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask;
+#define glDepthMask glad_glDepthMask
+GLAD_API_CALL PFNGLDEPTHRANGEPROC glad_glDepthRange;
+#define glDepthRange glad_glDepthRange
+GLAD_API_CALL PFNGLDETACHOBJECTARBPROC glad_glDetachObjectARB;
+#define glDetachObjectARB glad_glDetachObjectARB
+GLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader;
+#define glDetachShader glad_glDetachShader
+GLAD_API_CALL PFNGLDISABLEPROC glad_glDisable;
+#define glDisable glad_glDisable
+GLAD_API_CALL PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState;
+#define glDisableClientState glad_glDisableClientState
+GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray;
+#define glDisableVertexAttribArray glad_glDisableVertexAttribArray
+GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glad_glDisableVertexAttribArrayARB;
+#define glDisableVertexAttribArrayARB glad_glDisableVertexAttribArrayARB
+GLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays;
+#define glDrawArrays glad_glDrawArrays
+GLAD_API_CALL PFNGLDRAWARRAYSEXTPROC glad_glDrawArraysEXT;
+#define glDrawArraysEXT glad_glDrawArraysEXT
+GLAD_API_CALL PFNGLDRAWBUFFERPROC glad_glDrawBuffer;
+#define glDrawBuffer glad_glDrawBuffer
+GLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements;
+#define glDrawElements glad_glDrawElements
+GLAD_API_CALL PFNGLDRAWPIXELSPROC glad_glDrawPixels;
+#define glDrawPixels glad_glDrawPixels
+GLAD_API_CALL PFNGLEDGEFLAGPROC glad_glEdgeFlag;
+#define glEdgeFlag glad_glEdgeFlag
+GLAD_API_CALL PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer;
+#define glEdgeFlagPointer glad_glEdgeFlagPointer
+GLAD_API_CALL PFNGLEDGEFLAGPOINTEREXTPROC glad_glEdgeFlagPointerEXT;
+#define glEdgeFlagPointerEXT glad_glEdgeFlagPointerEXT
+GLAD_API_CALL PFNGLEDGEFLAGVPROC glad_glEdgeFlagv;
+#define glEdgeFlagv glad_glEdgeFlagv
+GLAD_API_CALL PFNGLENABLEPROC glad_glEnable;
+#define glEnable glad_glEnable
+GLAD_API_CALL PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState;
+#define glEnableClientState glad_glEnableClientState
+GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray;
+#define glEnableVertexAttribArray glad_glEnableVertexAttribArray
+GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYARBPROC glad_glEnableVertexAttribArrayARB;
+#define glEnableVertexAttribArrayARB glad_glEnableVertexAttribArrayARB
+GLAD_API_CALL PFNGLENDPROC glad_glEnd;
+#define glEnd glad_glEnd
+GLAD_API_CALL PFNGLENDLISTPROC glad_glEndList;
+#define glEndList glad_glEndList
+GLAD_API_CALL PFNGLEVALCOORD1DPROC glad_glEvalCoord1d;
+#define glEvalCoord1d glad_glEvalCoord1d
+GLAD_API_CALL PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv;
+#define glEvalCoord1dv glad_glEvalCoord1dv
+GLAD_API_CALL PFNGLEVALCOORD1FPROC glad_glEvalCoord1f;
+#define glEvalCoord1f glad_glEvalCoord1f
+GLAD_API_CALL PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv;
+#define glEvalCoord1fv glad_glEvalCoord1fv
+GLAD_API_CALL PFNGLEVALCOORD2DPROC glad_glEvalCoord2d;
+#define glEvalCoord2d glad_glEvalCoord2d
+GLAD_API_CALL PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv;
+#define glEvalCoord2dv glad_glEvalCoord2dv
+GLAD_API_CALL PFNGLEVALCOORD2FPROC glad_glEvalCoord2f;
+#define glEvalCoord2f glad_glEvalCoord2f
+GLAD_API_CALL PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv;
+#define glEvalCoord2fv glad_glEvalCoord2fv
+GLAD_API_CALL PFNGLEVALMESH1PROC glad_glEvalMesh1;
+#define glEvalMesh1 glad_glEvalMesh1
+GLAD_API_CALL PFNGLEVALMESH2PROC glad_glEvalMesh2;
+#define glEvalMesh2 glad_glEvalMesh2
+GLAD_API_CALL PFNGLEVALPOINT1PROC glad_glEvalPoint1;
+#define glEvalPoint1 glad_glEvalPoint1
+GLAD_API_CALL PFNGLEVALPOINT2PROC glad_glEvalPoint2;
+#define glEvalPoint2 glad_glEvalPoint2
+GLAD_API_CALL PFNGLEXECUTEPROGRAMNVPROC glad_glExecuteProgramNV;
+#define glExecuteProgramNV glad_glExecuteProgramNV
+GLAD_API_CALL PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer;
+#define glFeedbackBuffer glad_glFeedbackBuffer
+GLAD_API_CALL PFNGLFINISHPROC glad_glFinish;
+#define glFinish glad_glFinish
+GLAD_API_CALL PFNGLFLUSHPROC glad_glFlush;
+#define glFlush glad_glFlush
+GLAD_API_CALL PFNGLFOGFPROC glad_glFogf;
+#define glFogf glad_glFogf
+GLAD_API_CALL PFNGLFOGFVPROC glad_glFogfv;
+#define glFogfv glad_glFogfv
+GLAD_API_CALL PFNGLFOGIPROC glad_glFogi;
+#define glFogi glad_glFogi
+GLAD_API_CALL PFNGLFOGIVPROC glad_glFogiv;
+#define glFogiv glad_glFogiv
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer;
+#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT;
+#define glFramebufferRenderbufferEXT glad_glFramebufferRenderbufferEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture;
+#define glFramebufferTexture glad_glFramebufferTexture
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D;
+#define glFramebufferTexture1D glad_glFramebufferTexture1D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT;
+#define glFramebufferTexture1DEXT glad_glFramebufferTexture1DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D;
+#define glFramebufferTexture2D glad_glFramebufferTexture2D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT;
+#define glFramebufferTexture2DEXT glad_glFramebufferTexture2DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D;
+#define glFramebufferTexture3D glad_glFramebufferTexture3D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT;
+#define glFramebufferTexture3DEXT glad_glFramebufferTexture3DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREARBPROC glad_glFramebufferTextureARB;
+#define glFramebufferTextureARB glad_glFramebufferTextureARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT;
+#define glFramebufferTextureEXT glad_glFramebufferTextureEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEARBPROC glad_glFramebufferTextureFaceARB;
+#define glFramebufferTextureFaceARB glad_glFramebufferTextureFaceARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC glad_glFramebufferTextureFaceEXT;
+#define glFramebufferTextureFaceEXT glad_glFramebufferTextureFaceEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer;
+#define glFramebufferTextureLayer glad_glFramebufferTextureLayer
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERARBPROC glad_glFramebufferTextureLayerARB;
+#define glFramebufferTextureLayerARB glad_glFramebufferTextureLayerARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC glad_glFramebufferTextureLayerEXT;
+#define glFramebufferTextureLayerEXT glad_glFramebufferTextureLayerEXT
+GLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace;
+#define glFrontFace glad_glFrontFace
+GLAD_API_CALL PFNGLFRUSTUMPROC glad_glFrustum;
+#define glFrustum glad_glFrustum
+GLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers;
+#define glGenBuffers glad_glGenBuffers
+GLAD_API_CALL PFNGLGENBUFFERSARBPROC glad_glGenBuffersARB;
+#define glGenBuffersARB glad_glGenBuffersARB
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers;
+#define glGenFramebuffers glad_glGenFramebuffers
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT;
+#define glGenFramebuffersEXT glad_glGenFramebuffersEXT
+GLAD_API_CALL PFNGLGENLISTSPROC glad_glGenLists;
+#define glGenLists glad_glGenLists
+GLAD_API_CALL PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines;
+#define glGenProgramPipelines glad_glGenProgramPipelines
+GLAD_API_CALL PFNGLGENPROGRAMSARBPROC glad_glGenProgramsARB;
+#define glGenProgramsARB glad_glGenProgramsARB
+GLAD_API_CALL PFNGLGENPROGRAMSNVPROC glad_glGenProgramsNV;
+#define glGenProgramsNV glad_glGenProgramsNV
+GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers;
+#define glGenRenderbuffers glad_glGenRenderbuffers
+GLAD_API_CALL PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT;
+#define glGenRenderbuffersEXT glad_glGenRenderbuffersEXT
+GLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures;
+#define glGenTextures glad_glGenTextures
+GLAD_API_CALL PFNGLGENTEXTURESEXTPROC glad_glGenTexturesEXT;
+#define glGenTexturesEXT glad_glGenTexturesEXT
+GLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap;
+#define glGenerateMipmap glad_glGenerateMipmap
+GLAD_API_CALL PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT;
+#define glGenerateMipmapEXT glad_glGenerateMipmapEXT
+GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib;
+#define glGetActiveAttrib glad_glGetActiveAttrib
+GLAD_API_CALL PFNGLGETACTIVEATTRIBARBPROC glad_glGetActiveAttribARB;
+#define glGetActiveAttribARB glad_glGetActiveAttribARB
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform;
+#define glGetActiveUniform glad_glGetActiveUniform
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMARBPROC glad_glGetActiveUniformARB;
+#define glGetActiveUniformARB glad_glGetActiveUniformARB
+GLAD_API_CALL PFNGLGETATTACHEDOBJECTSARBPROC glad_glGetAttachedObjectsARB;
+#define glGetAttachedObjectsARB glad_glGetAttachedObjectsARB
+GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation;
+#define glGetAttribLocation glad_glGetAttribLocation
+GLAD_API_CALL PFNGLGETATTRIBLOCATIONARBPROC glad_glGetAttribLocationARB;
+#define glGetAttribLocationARB glad_glGetAttribLocationARB
+GLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv;
+#define glGetBooleanv glad_glGetBooleanv
+GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv;
+#define glGetBufferParameteriv glad_glGetBufferParameteriv
+GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVARBPROC glad_glGetBufferParameterivARB;
+#define glGetBufferParameterivARB glad_glGetBufferParameterivARB
+GLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv;
+#define glGetBufferPointerv glad_glGetBufferPointerv
+GLAD_API_CALL PFNGLGETBUFFERPOINTERVARBPROC glad_glGetBufferPointervARB;
+#define glGetBufferPointervARB glad_glGetBufferPointervARB
+GLAD_API_CALL PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData;
+#define glGetBufferSubData glad_glGetBufferSubData
+GLAD_API_CALL PFNGLGETBUFFERSUBDATAARBPROC glad_glGetBufferSubDataARB;
+#define glGetBufferSubDataARB glad_glGetBufferSubDataARB
+GLAD_API_CALL PFNGLGETCLIPPLANEPROC glad_glGetClipPlane;
+#define glGetClipPlane glad_glGetClipPlane
+GLAD_API_CALL PFNGLGETCOLORTABLEPROC glad_glGetColorTable;
+#define glGetColorTable glad_glGetColorTable
+GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERFVPROC glad_glGetColorTableParameterfv;
+#define glGetColorTableParameterfv glad_glGetColorTableParameterfv
+GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERIVPROC glad_glGetColorTableParameteriv;
+#define glGetColorTableParameteriv glad_glGetColorTableParameteriv
+GLAD_API_CALL PFNGLGETCONVOLUTIONFILTERPROC glad_glGetConvolutionFilter;
+#define glGetConvolutionFilter glad_glGetConvolutionFilter
+GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERFVPROC glad_glGetConvolutionParameterfv;
+#define glGetConvolutionParameterfv glad_glGetConvolutionParameterfv
+GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERIVPROC glad_glGetConvolutionParameteriv;
+#define glGetConvolutionParameteriv glad_glGetConvolutionParameteriv
+GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog;
+#define glGetDebugMessageLog glad_glGetDebugMessageLog
+GLAD_API_CALL PFNGLGETDOUBLEVPROC glad_glGetDoublev;
+#define glGetDoublev glad_glGetDoublev
+GLAD_API_CALL PFNGLGETERRORPROC glad_glGetError;
+#define glGetError glad_glGetError
+GLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv;
+#define glGetFloatv glad_glGetFloatv
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv;
+#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT;
+#define glGetFramebufferAttachmentParameterivEXT glad_glGetFramebufferAttachmentParameterivEXT
+GLAD_API_CALL PFNGLGETHANDLEARBPROC glad_glGetHandleARB;
+#define glGetHandleARB glad_glGetHandleARB
+GLAD_API_CALL PFNGLGETHISTOGRAMPROC glad_glGetHistogram;
+#define glGetHistogram glad_glGetHistogram
+GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERFVPROC glad_glGetHistogramParameterfv;
+#define glGetHistogramParameterfv glad_glGetHistogramParameterfv
+GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERIVPROC glad_glGetHistogramParameteriv;
+#define glGetHistogramParameteriv glad_glGetHistogramParameteriv
+GLAD_API_CALL PFNGLGETINFOLOGARBPROC glad_glGetInfoLogARB;
+#define glGetInfoLogARB glad_glGetInfoLogARB
+GLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv;
+#define glGetIntegerv glad_glGetIntegerv
+GLAD_API_CALL PFNGLGETLIGHTFVPROC glad_glGetLightfv;
+#define glGetLightfv glad_glGetLightfv
+GLAD_API_CALL PFNGLGETLIGHTIVPROC glad_glGetLightiv;
+#define glGetLightiv glad_glGetLightiv
+GLAD_API_CALL PFNGLGETMAPDVPROC glad_glGetMapdv;
+#define glGetMapdv glad_glGetMapdv
+GLAD_API_CALL PFNGLGETMAPFVPROC glad_glGetMapfv;
+#define glGetMapfv glad_glGetMapfv
+GLAD_API_CALL PFNGLGETMAPIVPROC glad_glGetMapiv;
+#define glGetMapiv glad_glGetMapiv
+GLAD_API_CALL PFNGLGETMATERIALFVPROC glad_glGetMaterialfv;
+#define glGetMaterialfv glad_glGetMaterialfv
+GLAD_API_CALL PFNGLGETMATERIALIVPROC glad_glGetMaterialiv;
+#define glGetMaterialiv glad_glGetMaterialiv
+GLAD_API_CALL PFNGLGETMINMAXPROC glad_glGetMinmax;
+#define glGetMinmax glad_glGetMinmax
+GLAD_API_CALL PFNGLGETMINMAXPARAMETERFVPROC glad_glGetMinmaxParameterfv;
+#define glGetMinmaxParameterfv glad_glGetMinmaxParameterfv
+GLAD_API_CALL PFNGLGETMINMAXPARAMETERIVPROC glad_glGetMinmaxParameteriv;
+#define glGetMinmaxParameteriv glad_glGetMinmaxParameteriv
+GLAD_API_CALL PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel;
+#define glGetObjectLabel glad_glGetObjectLabel
+GLAD_API_CALL PFNGLGETOBJECTPARAMETERFVARBPROC glad_glGetObjectParameterfvARB;
+#define glGetObjectParameterfvARB glad_glGetObjectParameterfvARB
+GLAD_API_CALL PFNGLGETOBJECTPARAMETERIVARBPROC glad_glGetObjectParameterivARB;
+#define glGetObjectParameterivARB glad_glGetObjectParameterivARB
+GLAD_API_CALL PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel;
+#define glGetObjectPtrLabel glad_glGetObjectPtrLabel
+GLAD_API_CALL PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv;
+#define glGetPixelMapfv glad_glGetPixelMapfv
+GLAD_API_CALL PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv;
+#define glGetPixelMapuiv glad_glGetPixelMapuiv
+GLAD_API_CALL PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv;
+#define glGetPixelMapusv glad_glGetPixelMapusv
+GLAD_API_CALL PFNGLGETPOINTERVPROC glad_glGetPointerv;
+#define glGetPointerv glad_glGetPointerv
+GLAD_API_CALL PFNGLGETPOINTERVEXTPROC glad_glGetPointervEXT;
+#define glGetPointervEXT glad_glGetPointervEXT
+GLAD_API_CALL PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple;
+#define glGetPolygonStipple glad_glGetPolygonStipple
+GLAD_API_CALL PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary;
+#define glGetProgramBinary glad_glGetProgramBinary
+GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERDVARBPROC glad_glGetProgramEnvParameterdvARB;
+#define glGetProgramEnvParameterdvARB glad_glGetProgramEnvParameterdvARB
+GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERFVARBPROC glad_glGetProgramEnvParameterfvARB;
+#define glGetProgramEnvParameterfvARB glad_glGetProgramEnvParameterfvARB
+GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glad_glGetProgramLocalParameterdvARB;
+#define glGetProgramLocalParameterdvARB glad_glGetProgramLocalParameterdvARB
+GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glad_glGetProgramLocalParameterfvARB;
+#define glGetProgramLocalParameterfvARB glad_glGetProgramLocalParameterfvARB
+GLAD_API_CALL PFNGLGETPROGRAMPARAMETERDVNVPROC glad_glGetProgramParameterdvNV;
+#define glGetProgramParameterdvNV glad_glGetProgramParameterdvNV
+GLAD_API_CALL PFNGLGETPROGRAMPARAMETERFVNVPROC glad_glGetProgramParameterfvNV;
+#define glGetProgramParameterfvNV glad_glGetProgramParameterfvNV
+GLAD_API_CALL PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog;
+#define glGetProgramPipelineInfoLog glad_glGetProgramPipelineInfoLog
+GLAD_API_CALL PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv;
+#define glGetProgramPipelineiv glad_glGetProgramPipelineiv
+GLAD_API_CALL PFNGLGETPROGRAMSTRINGARBPROC glad_glGetProgramStringARB;
+#define glGetProgramStringARB glad_glGetProgramStringARB
+GLAD_API_CALL PFNGLGETPROGRAMSTRINGNVPROC glad_glGetProgramStringNV;
+#define glGetProgramStringNV glad_glGetProgramStringNV
+GLAD_API_CALL PFNGLGETPROGRAMIVARBPROC glad_glGetProgramivARB;
+#define glGetProgramivARB glad_glGetProgramivARB
+GLAD_API_CALL PFNGLGETPROGRAMIVNVPROC glad_glGetProgramivNV;
+#define glGetProgramivNV glad_glGetProgramivNV
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv;
+#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT;
+#define glGetRenderbufferParameterivEXT glad_glGetRenderbufferParameterivEXT
+GLAD_API_CALL PFNGLGETSEPARABLEFILTERPROC glad_glGetSeparableFilter;
+#define glGetSeparableFilter glad_glGetSeparableFilter
+GLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource;
+#define glGetShaderSource glad_glGetShaderSource
+GLAD_API_CALL PFNGLGETSHADERSOURCEARBPROC glad_glGetShaderSourceARB;
+#define glGetShaderSourceARB glad_glGetShaderSourceARB
+GLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString;
+#define glGetString glad_glGetString
+GLAD_API_CALL PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv;
+#define glGetTexEnvfv glad_glGetTexEnvfv
+GLAD_API_CALL PFNGLGETTEXENVIVPROC glad_glGetTexEnviv;
+#define glGetTexEnviv glad_glGetTexEnviv
+GLAD_API_CALL PFNGLGETTEXGENDVPROC glad_glGetTexGendv;
+#define glGetTexGendv glad_glGetTexGendv
+GLAD_API_CALL PFNGLGETTEXGENFVPROC glad_glGetTexGenfv;
+#define glGetTexGenfv glad_glGetTexGenfv
+GLAD_API_CALL PFNGLGETTEXGENIVPROC glad_glGetTexGeniv;
+#define glGetTexGeniv glad_glGetTexGeniv
+GLAD_API_CALL PFNGLGETTEXIMAGEPROC glad_glGetTexImage;
+#define glGetTexImage glad_glGetTexImage
+GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv;
+#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv
+GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv;
+#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv
+GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv;
+#define glGetTexParameterfv glad_glGetTexParameterfv
+GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv;
+#define glGetTexParameteriv glad_glGetTexParameteriv
+GLAD_API_CALL PFNGLGETTRACKMATRIXIVNVPROC glad_glGetTrackMatrixivNV;
+#define glGetTrackMatrixivNV glad_glGetTrackMatrixivNV
+GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation;
+#define glGetUniformLocation glad_glGetUniformLocation
+GLAD_API_CALL PFNGLGETUNIFORMLOCATIONARBPROC glad_glGetUniformLocationARB;
+#define glGetUniformLocationARB glad_glGetUniformLocationARB
+GLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv;
+#define glGetUniformfv glad_glGetUniformfv
+GLAD_API_CALL PFNGLGETUNIFORMFVARBPROC glad_glGetUniformfvARB;
+#define glGetUniformfvARB glad_glGetUniformfvARB
+GLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv;
+#define glGetUniformiv glad_glGetUniformiv
+GLAD_API_CALL PFNGLGETUNIFORMIVARBPROC glad_glGetUniformivARB;
+#define glGetUniformivARB glad_glGetUniformivARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv;
+#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVARBPROC glad_glGetVertexAttribPointervARB;
+#define glGetVertexAttribPointervARB glad_glGetVertexAttribPointervARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVNVPROC glad_glGetVertexAttribPointervNV;
+#define glGetVertexAttribPointervNV glad_glGetVertexAttribPointervNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv;
+#define glGetVertexAttribdv glad_glGetVertexAttribdv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVARBPROC glad_glGetVertexAttribdvARB;
+#define glGetVertexAttribdvARB glad_glGetVertexAttribdvARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVNVPROC glad_glGetVertexAttribdvNV;
+#define glGetVertexAttribdvNV glad_glGetVertexAttribdvNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv;
+#define glGetVertexAttribfv glad_glGetVertexAttribfv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVARBPROC glad_glGetVertexAttribfvARB;
+#define glGetVertexAttribfvARB glad_glGetVertexAttribfvARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVNVPROC glad_glGetVertexAttribfvNV;
+#define glGetVertexAttribfvNV glad_glGetVertexAttribfvNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv;
+#define glGetVertexAttribiv glad_glGetVertexAttribiv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVARBPROC glad_glGetVertexAttribivARB;
+#define glGetVertexAttribivARB glad_glGetVertexAttribivARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVNVPROC glad_glGetVertexAttribivNV;
+#define glGetVertexAttribivNV glad_glGetVertexAttribivNV
+GLAD_API_CALL PFNGLHINTPROC glad_glHint;
+#define glHint glad_glHint
+GLAD_API_CALL PFNGLHISTOGRAMPROC glad_glHistogram;
+#define glHistogram glad_glHistogram
+GLAD_API_CALL PFNGLINDEXMASKPROC glad_glIndexMask;
+#define glIndexMask glad_glIndexMask
+GLAD_API_CALL PFNGLINDEXPOINTERPROC glad_glIndexPointer;
+#define glIndexPointer glad_glIndexPointer
+GLAD_API_CALL PFNGLINDEXPOINTEREXTPROC glad_glIndexPointerEXT;
+#define glIndexPointerEXT glad_glIndexPointerEXT
+GLAD_API_CALL PFNGLINDEXDPROC glad_glIndexd;
+#define glIndexd glad_glIndexd
+GLAD_API_CALL PFNGLINDEXDVPROC glad_glIndexdv;
+#define glIndexdv glad_glIndexdv
+GLAD_API_CALL PFNGLINDEXFPROC glad_glIndexf;
+#define glIndexf glad_glIndexf
+GLAD_API_CALL PFNGLINDEXFVPROC glad_glIndexfv;
+#define glIndexfv glad_glIndexfv
+GLAD_API_CALL PFNGLINDEXIPROC glad_glIndexi;
+#define glIndexi glad_glIndexi
+GLAD_API_CALL PFNGLINDEXIVPROC glad_glIndexiv;
+#define glIndexiv glad_glIndexiv
+GLAD_API_CALL PFNGLINDEXSPROC glad_glIndexs;
+#define glIndexs glad_glIndexs
+GLAD_API_CALL PFNGLINDEXSVPROC glad_glIndexsv;
+#define glIndexsv glad_glIndexsv
+GLAD_API_CALL PFNGLINDEXUBPROC glad_glIndexub;
+#define glIndexub glad_glIndexub
+GLAD_API_CALL PFNGLINDEXUBVPROC glad_glIndexubv;
+#define glIndexubv glad_glIndexubv
+GLAD_API_CALL PFNGLINITNAMESPROC glad_glInitNames;
+#define glInitNames glad_glInitNames
+GLAD_API_CALL PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays;
+#define glInterleavedArrays glad_glInterleavedArrays
+GLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer;
+#define glIsBuffer glad_glIsBuffer
+GLAD_API_CALL PFNGLISBUFFERARBPROC glad_glIsBufferARB;
+#define glIsBufferARB glad_glIsBufferARB
+GLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled;
+#define glIsEnabled glad_glIsEnabled
+GLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer;
+#define glIsFramebuffer glad_glIsFramebuffer
+GLAD_API_CALL PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT;
+#define glIsFramebufferEXT glad_glIsFramebufferEXT
+GLAD_API_CALL PFNGLISLISTPROC glad_glIsList;
+#define glIsList glad_glIsList
+GLAD_API_CALL PFNGLISPROGRAMARBPROC glad_glIsProgramARB;
+#define glIsProgramARB glad_glIsProgramARB
+GLAD_API_CALL PFNGLISPROGRAMNVPROC glad_glIsProgramNV;
+#define glIsProgramNV glad_glIsProgramNV
+GLAD_API_CALL PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline;
+#define glIsProgramPipeline glad_glIsProgramPipeline
+GLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer;
+#define glIsRenderbuffer glad_glIsRenderbuffer
+GLAD_API_CALL PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT;
+#define glIsRenderbufferEXT glad_glIsRenderbufferEXT
+GLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture;
+#define glIsTexture glad_glIsTexture
+GLAD_API_CALL PFNGLISTEXTUREEXTPROC glad_glIsTextureEXT;
+#define glIsTextureEXT glad_glIsTextureEXT
+GLAD_API_CALL PFNGLLIGHTMODELFPROC glad_glLightModelf;
+#define glLightModelf glad_glLightModelf
+GLAD_API_CALL PFNGLLIGHTMODELFVPROC glad_glLightModelfv;
+#define glLightModelfv glad_glLightModelfv
+GLAD_API_CALL PFNGLLIGHTMODELIPROC glad_glLightModeli;
+#define glLightModeli glad_glLightModeli
+GLAD_API_CALL PFNGLLIGHTMODELIVPROC glad_glLightModeliv;
+#define glLightModeliv glad_glLightModeliv
+GLAD_API_CALL PFNGLLIGHTFPROC glad_glLightf;
+#define glLightf glad_glLightf
+GLAD_API_CALL PFNGLLIGHTFVPROC glad_glLightfv;
+#define glLightfv glad_glLightfv
+GLAD_API_CALL PFNGLLIGHTIPROC glad_glLighti;
+#define glLighti glad_glLighti
+GLAD_API_CALL PFNGLLIGHTIVPROC glad_glLightiv;
+#define glLightiv glad_glLightiv
+GLAD_API_CALL PFNGLLINESTIPPLEPROC glad_glLineStipple;
+#define glLineStipple glad_glLineStipple
+GLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth;
+#define glLineWidth glad_glLineWidth
+GLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram;
+#define glLinkProgram glad_glLinkProgram
+GLAD_API_CALL PFNGLLINKPROGRAMARBPROC glad_glLinkProgramARB;
+#define glLinkProgramARB glad_glLinkProgramARB
+GLAD_API_CALL PFNGLLISTBASEPROC glad_glListBase;
+#define glListBase glad_glListBase
+GLAD_API_CALL PFNGLLOADIDENTITYPROC glad_glLoadIdentity;
+#define glLoadIdentity glad_glLoadIdentity
+GLAD_API_CALL PFNGLLOADMATRIXDPROC glad_glLoadMatrixd;
+#define glLoadMatrixd glad_glLoadMatrixd
+GLAD_API_CALL PFNGLLOADMATRIXFPROC glad_glLoadMatrixf;
+#define glLoadMatrixf glad_glLoadMatrixf
+GLAD_API_CALL PFNGLLOADNAMEPROC glad_glLoadName;
+#define glLoadName glad_glLoadName
+GLAD_API_CALL PFNGLLOADPROGRAMNVPROC glad_glLoadProgramNV;
+#define glLoadProgramNV glad_glLoadProgramNV
+GLAD_API_CALL PFNGLLOGICOPPROC glad_glLogicOp;
+#define glLogicOp glad_glLogicOp
+GLAD_API_CALL PFNGLMAP1DPROC glad_glMap1d;
+#define glMap1d glad_glMap1d
+GLAD_API_CALL PFNGLMAP1FPROC glad_glMap1f;
+#define glMap1f glad_glMap1f
+GLAD_API_CALL PFNGLMAP2DPROC glad_glMap2d;
+#define glMap2d glad_glMap2d
+GLAD_API_CALL PFNGLMAP2FPROC glad_glMap2f;
+#define glMap2f glad_glMap2f
+GLAD_API_CALL PFNGLMAPBUFFERPROC glad_glMapBuffer;
+#define glMapBuffer glad_glMapBuffer
+GLAD_API_CALL PFNGLMAPBUFFERARBPROC glad_glMapBufferARB;
+#define glMapBufferARB glad_glMapBufferARB
+GLAD_API_CALL PFNGLMAPGRID1DPROC glad_glMapGrid1d;
+#define glMapGrid1d glad_glMapGrid1d
+GLAD_API_CALL PFNGLMAPGRID1FPROC glad_glMapGrid1f;
+#define glMapGrid1f glad_glMapGrid1f
+GLAD_API_CALL PFNGLMAPGRID2DPROC glad_glMapGrid2d;
+#define glMapGrid2d glad_glMapGrid2d
+GLAD_API_CALL PFNGLMAPGRID2FPROC glad_glMapGrid2f;
+#define glMapGrid2f glad_glMapGrid2f
+GLAD_API_CALL PFNGLMATERIALFPROC glad_glMaterialf;
+#define glMaterialf glad_glMaterialf
+GLAD_API_CALL PFNGLMATERIALFVPROC glad_glMaterialfv;
+#define glMaterialfv glad_glMaterialfv
+GLAD_API_CALL PFNGLMATERIALIPROC glad_glMateriali;
+#define glMateriali glad_glMateriali
+GLAD_API_CALL PFNGLMATERIALIVPROC glad_glMaterialiv;
+#define glMaterialiv glad_glMaterialiv
+GLAD_API_CALL PFNGLMATRIXMODEPROC glad_glMatrixMode;
+#define glMatrixMode glad_glMatrixMode
+GLAD_API_CALL PFNGLMINMAXPROC glad_glMinmax;
+#define glMinmax glad_glMinmax
+GLAD_API_CALL PFNGLMULTMATRIXDPROC glad_glMultMatrixd;
+#define glMultMatrixd glad_glMultMatrixd
+GLAD_API_CALL PFNGLMULTMATRIXFPROC glad_glMultMatrixf;
+#define glMultMatrixf glad_glMultMatrixf
+GLAD_API_CALL PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d;
+#define glMultiTexCoord1d glad_glMultiTexCoord1d
+GLAD_API_CALL PFNGLMULTITEXCOORD1DARBPROC glad_glMultiTexCoord1dARB;
+#define glMultiTexCoord1dARB glad_glMultiTexCoord1dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv;
+#define glMultiTexCoord1dv glad_glMultiTexCoord1dv
+GLAD_API_CALL PFNGLMULTITEXCOORD1DVARBPROC glad_glMultiTexCoord1dvARB;
+#define glMultiTexCoord1dvARB glad_glMultiTexCoord1dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f;
+#define glMultiTexCoord1f glad_glMultiTexCoord1f
+GLAD_API_CALL PFNGLMULTITEXCOORD1FARBPROC glad_glMultiTexCoord1fARB;
+#define glMultiTexCoord1fARB glad_glMultiTexCoord1fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv;
+#define glMultiTexCoord1fv glad_glMultiTexCoord1fv
+GLAD_API_CALL PFNGLMULTITEXCOORD1FVARBPROC glad_glMultiTexCoord1fvARB;
+#define glMultiTexCoord1fvARB glad_glMultiTexCoord1fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i;
+#define glMultiTexCoord1i glad_glMultiTexCoord1i
+GLAD_API_CALL PFNGLMULTITEXCOORD1IARBPROC glad_glMultiTexCoord1iARB;
+#define glMultiTexCoord1iARB glad_glMultiTexCoord1iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv;
+#define glMultiTexCoord1iv glad_glMultiTexCoord1iv
+GLAD_API_CALL PFNGLMULTITEXCOORD1IVARBPROC glad_glMultiTexCoord1ivARB;
+#define glMultiTexCoord1ivARB glad_glMultiTexCoord1ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s;
+#define glMultiTexCoord1s glad_glMultiTexCoord1s
+GLAD_API_CALL PFNGLMULTITEXCOORD1SARBPROC glad_glMultiTexCoord1sARB;
+#define glMultiTexCoord1sARB glad_glMultiTexCoord1sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv;
+#define glMultiTexCoord1sv glad_glMultiTexCoord1sv
+GLAD_API_CALL PFNGLMULTITEXCOORD1SVARBPROC glad_glMultiTexCoord1svARB;
+#define glMultiTexCoord1svARB glad_glMultiTexCoord1svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d;
+#define glMultiTexCoord2d glad_glMultiTexCoord2d
+GLAD_API_CALL PFNGLMULTITEXCOORD2DARBPROC glad_glMultiTexCoord2dARB;
+#define glMultiTexCoord2dARB glad_glMultiTexCoord2dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv;
+#define glMultiTexCoord2dv glad_glMultiTexCoord2dv
+GLAD_API_CALL PFNGLMULTITEXCOORD2DVARBPROC glad_glMultiTexCoord2dvARB;
+#define glMultiTexCoord2dvARB glad_glMultiTexCoord2dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f;
+#define glMultiTexCoord2f glad_glMultiTexCoord2f
+GLAD_API_CALL PFNGLMULTITEXCOORD2FARBPROC glad_glMultiTexCoord2fARB;
+#define glMultiTexCoord2fARB glad_glMultiTexCoord2fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv;
+#define glMultiTexCoord2fv glad_glMultiTexCoord2fv
+GLAD_API_CALL PFNGLMULTITEXCOORD2FVARBPROC glad_glMultiTexCoord2fvARB;
+#define glMultiTexCoord2fvARB glad_glMultiTexCoord2fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i;
+#define glMultiTexCoord2i glad_glMultiTexCoord2i
+GLAD_API_CALL PFNGLMULTITEXCOORD2IARBPROC glad_glMultiTexCoord2iARB;
+#define glMultiTexCoord2iARB glad_glMultiTexCoord2iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv;
+#define glMultiTexCoord2iv glad_glMultiTexCoord2iv
+GLAD_API_CALL PFNGLMULTITEXCOORD2IVARBPROC glad_glMultiTexCoord2ivARB;
+#define glMultiTexCoord2ivARB glad_glMultiTexCoord2ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s;
+#define glMultiTexCoord2s glad_glMultiTexCoord2s
+GLAD_API_CALL PFNGLMULTITEXCOORD2SARBPROC glad_glMultiTexCoord2sARB;
+#define glMultiTexCoord2sARB glad_glMultiTexCoord2sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv;
+#define glMultiTexCoord2sv glad_glMultiTexCoord2sv
+GLAD_API_CALL PFNGLMULTITEXCOORD2SVARBPROC glad_glMultiTexCoord2svARB;
+#define glMultiTexCoord2svARB glad_glMultiTexCoord2svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d;
+#define glMultiTexCoord3d glad_glMultiTexCoord3d
+GLAD_API_CALL PFNGLMULTITEXCOORD3DARBPROC glad_glMultiTexCoord3dARB;
+#define glMultiTexCoord3dARB glad_glMultiTexCoord3dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv;
+#define glMultiTexCoord3dv glad_glMultiTexCoord3dv
+GLAD_API_CALL PFNGLMULTITEXCOORD3DVARBPROC glad_glMultiTexCoord3dvARB;
+#define glMultiTexCoord3dvARB glad_glMultiTexCoord3dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f;
+#define glMultiTexCoord3f glad_glMultiTexCoord3f
+GLAD_API_CALL PFNGLMULTITEXCOORD3FARBPROC glad_glMultiTexCoord3fARB;
+#define glMultiTexCoord3fARB glad_glMultiTexCoord3fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv;
+#define glMultiTexCoord3fv glad_glMultiTexCoord3fv
+GLAD_API_CALL PFNGLMULTITEXCOORD3FVARBPROC glad_glMultiTexCoord3fvARB;
+#define glMultiTexCoord3fvARB glad_glMultiTexCoord3fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i;
+#define glMultiTexCoord3i glad_glMultiTexCoord3i
+GLAD_API_CALL PFNGLMULTITEXCOORD3IARBPROC glad_glMultiTexCoord3iARB;
+#define glMultiTexCoord3iARB glad_glMultiTexCoord3iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv;
+#define glMultiTexCoord3iv glad_glMultiTexCoord3iv
+GLAD_API_CALL PFNGLMULTITEXCOORD3IVARBPROC glad_glMultiTexCoord3ivARB;
+#define glMultiTexCoord3ivARB glad_glMultiTexCoord3ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s;
+#define glMultiTexCoord3s glad_glMultiTexCoord3s
+GLAD_API_CALL PFNGLMULTITEXCOORD3SARBPROC glad_glMultiTexCoord3sARB;
+#define glMultiTexCoord3sARB glad_glMultiTexCoord3sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv;
+#define glMultiTexCoord3sv glad_glMultiTexCoord3sv
+GLAD_API_CALL PFNGLMULTITEXCOORD3SVARBPROC glad_glMultiTexCoord3svARB;
+#define glMultiTexCoord3svARB glad_glMultiTexCoord3svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d;
+#define glMultiTexCoord4d glad_glMultiTexCoord4d
+GLAD_API_CALL PFNGLMULTITEXCOORD4DARBPROC glad_glMultiTexCoord4dARB;
+#define glMultiTexCoord4dARB glad_glMultiTexCoord4dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv;
+#define glMultiTexCoord4dv glad_glMultiTexCoord4dv
+GLAD_API_CALL PFNGLMULTITEXCOORD4DVARBPROC glad_glMultiTexCoord4dvARB;
+#define glMultiTexCoord4dvARB glad_glMultiTexCoord4dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f;
+#define glMultiTexCoord4f glad_glMultiTexCoord4f
+GLAD_API_CALL PFNGLMULTITEXCOORD4FARBPROC glad_glMultiTexCoord4fARB;
+#define glMultiTexCoord4fARB glad_glMultiTexCoord4fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv;
+#define glMultiTexCoord4fv glad_glMultiTexCoord4fv
+GLAD_API_CALL PFNGLMULTITEXCOORD4FVARBPROC glad_glMultiTexCoord4fvARB;
+#define glMultiTexCoord4fvARB glad_glMultiTexCoord4fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i;
+#define glMultiTexCoord4i glad_glMultiTexCoord4i
+GLAD_API_CALL PFNGLMULTITEXCOORD4IARBPROC glad_glMultiTexCoord4iARB;
+#define glMultiTexCoord4iARB glad_glMultiTexCoord4iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv;
+#define glMultiTexCoord4iv glad_glMultiTexCoord4iv
+GLAD_API_CALL PFNGLMULTITEXCOORD4IVARBPROC glad_glMultiTexCoord4ivARB;
+#define glMultiTexCoord4ivARB glad_glMultiTexCoord4ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s;
+#define glMultiTexCoord4s glad_glMultiTexCoord4s
+GLAD_API_CALL PFNGLMULTITEXCOORD4SARBPROC glad_glMultiTexCoord4sARB;
+#define glMultiTexCoord4sARB glad_glMultiTexCoord4sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv;
+#define glMultiTexCoord4sv glad_glMultiTexCoord4sv
+GLAD_API_CALL PFNGLMULTITEXCOORD4SVARBPROC glad_glMultiTexCoord4svARB;
+#define glMultiTexCoord4svARB glad_glMultiTexCoord4svARB
+GLAD_API_CALL PFNGLNEWLISTPROC glad_glNewList;
+#define glNewList glad_glNewList
+GLAD_API_CALL PFNGLNORMAL3BPROC glad_glNormal3b;
+#define glNormal3b glad_glNormal3b
+GLAD_API_CALL PFNGLNORMAL3BVPROC glad_glNormal3bv;
+#define glNormal3bv glad_glNormal3bv
+GLAD_API_CALL PFNGLNORMAL3DPROC glad_glNormal3d;
+#define glNormal3d glad_glNormal3d
+GLAD_API_CALL PFNGLNORMAL3DVPROC glad_glNormal3dv;
+#define glNormal3dv glad_glNormal3dv
+GLAD_API_CALL PFNGLNORMAL3FPROC glad_glNormal3f;
+#define glNormal3f glad_glNormal3f
+GLAD_API_CALL PFNGLNORMAL3FVPROC glad_glNormal3fv;
+#define glNormal3fv glad_glNormal3fv
+GLAD_API_CALL PFNGLNORMAL3IPROC glad_glNormal3i;
+#define glNormal3i glad_glNormal3i
+GLAD_API_CALL PFNGLNORMAL3IVPROC glad_glNormal3iv;
+#define glNormal3iv glad_glNormal3iv
+GLAD_API_CALL PFNGLNORMAL3SPROC glad_glNormal3s;
+#define glNormal3s glad_glNormal3s
+GLAD_API_CALL PFNGLNORMAL3SVPROC glad_glNormal3sv;
+#define glNormal3sv glad_glNormal3sv
+GLAD_API_CALL PFNGLNORMALPOINTERPROC glad_glNormalPointer;
+#define glNormalPointer glad_glNormalPointer
+GLAD_API_CALL PFNGLNORMALPOINTEREXTPROC glad_glNormalPointerEXT;
+#define glNormalPointerEXT glad_glNormalPointerEXT
+GLAD_API_CALL PFNGLOBJECTLABELPROC glad_glObjectLabel;
+#define glObjectLabel glad_glObjectLabel
+GLAD_API_CALL PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel;
+#define glObjectPtrLabel glad_glObjectPtrLabel
+GLAD_API_CALL PFNGLORTHOPROC glad_glOrtho;
+#define glOrtho glad_glOrtho
+GLAD_API_CALL PFNGLPASSTHROUGHPROC glad_glPassThrough;
+#define glPassThrough glad_glPassThrough
+GLAD_API_CALL PFNGLPIXELMAPFVPROC glad_glPixelMapfv;
+#define glPixelMapfv glad_glPixelMapfv
+GLAD_API_CALL PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv;
+#define glPixelMapuiv glad_glPixelMapuiv
+GLAD_API_CALL PFNGLPIXELMAPUSVPROC glad_glPixelMapusv;
+#define glPixelMapusv glad_glPixelMapusv
+GLAD_API_CALL PFNGLPIXELSTOREFPROC glad_glPixelStoref;
+#define glPixelStoref glad_glPixelStoref
+GLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei;
+#define glPixelStorei glad_glPixelStorei
+GLAD_API_CALL PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf;
+#define glPixelTransferf glad_glPixelTransferf
+GLAD_API_CALL PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi;
+#define glPixelTransferi glad_glPixelTransferi
+GLAD_API_CALL PFNGLPIXELZOOMPROC glad_glPixelZoom;
+#define glPixelZoom glad_glPixelZoom
+GLAD_API_CALL PFNGLPOINTSIZEPROC glad_glPointSize;
+#define glPointSize glad_glPointSize
+GLAD_API_CALL PFNGLPOLYGONMODEPROC glad_glPolygonMode;
+#define glPolygonMode glad_glPolygonMode
+GLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset;
+#define glPolygonOffset glad_glPolygonOffset
+GLAD_API_CALL PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple;
+#define glPolygonStipple glad_glPolygonStipple
+GLAD_API_CALL PFNGLPOPATTRIBPROC glad_glPopAttrib;
+#define glPopAttrib glad_glPopAttrib
+GLAD_API_CALL PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib;
+#define glPopClientAttrib glad_glPopClientAttrib
+GLAD_API_CALL PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup;
+#define glPopDebugGroup glad_glPopDebugGroup
+GLAD_API_CALL PFNGLPOPMATRIXPROC glad_glPopMatrix;
+#define glPopMatrix glad_glPopMatrix
+GLAD_API_CALL PFNGLPOPNAMEPROC glad_glPopName;
+#define glPopName glad_glPopName
+GLAD_API_CALL PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures;
+#define glPrioritizeTextures glad_glPrioritizeTextures
+GLAD_API_CALL PFNGLPRIORITIZETEXTURESEXTPROC glad_glPrioritizeTexturesEXT;
+#define glPrioritizeTexturesEXT glad_glPrioritizeTexturesEXT
+GLAD_API_CALL PFNGLPROGRAMBINARYPROC glad_glProgramBinary;
+#define glProgramBinary glad_glProgramBinary
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DARBPROC glad_glProgramEnvParameter4dARB;
+#define glProgramEnvParameter4dARB glad_glProgramEnvParameter4dARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DVARBPROC glad_glProgramEnvParameter4dvARB;
+#define glProgramEnvParameter4dvARB glad_glProgramEnvParameter4dvARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FARBPROC glad_glProgramEnvParameter4fARB;
+#define glProgramEnvParameter4fARB glad_glProgramEnvParameter4fARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FVARBPROC glad_glProgramEnvParameter4fvARB;
+#define glProgramEnvParameter4fvARB glad_glProgramEnvParameter4fvARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DARBPROC glad_glProgramLocalParameter4dARB;
+#define glProgramLocalParameter4dARB glad_glProgramLocalParameter4dARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glad_glProgramLocalParameter4dvARB;
+#define glProgramLocalParameter4dvARB glad_glProgramLocalParameter4dvARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FARBPROC glad_glProgramLocalParameter4fARB;
+#define glProgramLocalParameter4fARB glad_glProgramLocalParameter4fARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glad_glProgramLocalParameter4fvARB;
+#define glProgramLocalParameter4fvARB glad_glProgramLocalParameter4fvARB
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4DNVPROC glad_glProgramParameter4dNV;
+#define glProgramParameter4dNV glad_glProgramParameter4dNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4DVNVPROC glad_glProgramParameter4dvNV;
+#define glProgramParameter4dvNV glad_glProgramParameter4dvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4FNVPROC glad_glProgramParameter4fNV;
+#define glProgramParameter4fNV glad_glProgramParameter4fNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4FVNVPROC glad_glProgramParameter4fvNV;
+#define glProgramParameter4fvNV glad_glProgramParameter4fvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri;
+#define glProgramParameteri glad_glProgramParameteri
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIARBPROC glad_glProgramParameteriARB;
+#define glProgramParameteriARB glad_glProgramParameteriARB
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIEXTPROC glad_glProgramParameteriEXT;
+#define glProgramParameteriEXT glad_glProgramParameteriEXT
+GLAD_API_CALL PFNGLPROGRAMPARAMETERS4DVNVPROC glad_glProgramParameters4dvNV;
+#define glProgramParameters4dvNV glad_glProgramParameters4dvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETERS4FVNVPROC glad_glProgramParameters4fvNV;
+#define glProgramParameters4fvNV glad_glProgramParameters4fvNV
+GLAD_API_CALL PFNGLPROGRAMSTRINGARBPROC glad_glProgramStringARB;
+#define glProgramStringARB glad_glProgramStringARB
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d;
+#define glProgramUniform1d glad_glProgramUniform1d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv;
+#define glProgramUniform1dv glad_glProgramUniform1dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f;
+#define glProgramUniform1f glad_glProgramUniform1f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv;
+#define glProgramUniform1fv glad_glProgramUniform1fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i;
+#define glProgramUniform1i glad_glProgramUniform1i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv;
+#define glProgramUniform1iv glad_glProgramUniform1iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui;
+#define glProgramUniform1ui glad_glProgramUniform1ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv;
+#define glProgramUniform1uiv glad_glProgramUniform1uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d;
+#define glProgramUniform2d glad_glProgramUniform2d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv;
+#define glProgramUniform2dv glad_glProgramUniform2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f;
+#define glProgramUniform2f glad_glProgramUniform2f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv;
+#define glProgramUniform2fv glad_glProgramUniform2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i;
+#define glProgramUniform2i glad_glProgramUniform2i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv;
+#define glProgramUniform2iv glad_glProgramUniform2iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui;
+#define glProgramUniform2ui glad_glProgramUniform2ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv;
+#define glProgramUniform2uiv glad_glProgramUniform2uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d;
+#define glProgramUniform3d glad_glProgramUniform3d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv;
+#define glProgramUniform3dv glad_glProgramUniform3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f;
+#define glProgramUniform3f glad_glProgramUniform3f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv;
+#define glProgramUniform3fv glad_glProgramUniform3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i;
+#define glProgramUniform3i glad_glProgramUniform3i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv;
+#define glProgramUniform3iv glad_glProgramUniform3iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui;
+#define glProgramUniform3ui glad_glProgramUniform3ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv;
+#define glProgramUniform3uiv glad_glProgramUniform3uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d;
+#define glProgramUniform4d glad_glProgramUniform4d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv;
+#define glProgramUniform4dv glad_glProgramUniform4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f;
+#define glProgramUniform4f glad_glProgramUniform4f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv;
+#define glProgramUniform4fv glad_glProgramUniform4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i;
+#define glProgramUniform4i glad_glProgramUniform4i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv;
+#define glProgramUniform4iv glad_glProgramUniform4iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui;
+#define glProgramUniform4ui glad_glProgramUniform4ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv;
+#define glProgramUniform4uiv glad_glProgramUniform4uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv;
+#define glProgramUniformMatrix2dv glad_glProgramUniformMatrix2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv;
+#define glProgramUniformMatrix2fv glad_glProgramUniformMatrix2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv;
+#define glProgramUniformMatrix2x3dv glad_glProgramUniformMatrix2x3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv;
+#define glProgramUniformMatrix2x3fv glad_glProgramUniformMatrix2x3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv;
+#define glProgramUniformMatrix2x4dv glad_glProgramUniformMatrix2x4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv;
+#define glProgramUniformMatrix2x4fv glad_glProgramUniformMatrix2x4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv;
+#define glProgramUniformMatrix3dv glad_glProgramUniformMatrix3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv;
+#define glProgramUniformMatrix3fv glad_glProgramUniformMatrix3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv;
+#define glProgramUniformMatrix3x2dv glad_glProgramUniformMatrix3x2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv;
+#define glProgramUniformMatrix3x2fv glad_glProgramUniformMatrix3x2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv;
+#define glProgramUniformMatrix3x4dv glad_glProgramUniformMatrix3x4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv;
+#define glProgramUniformMatrix3x4fv glad_glProgramUniformMatrix3x4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv;
+#define glProgramUniformMatrix4dv glad_glProgramUniformMatrix4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv;
+#define glProgramUniformMatrix4fv glad_glProgramUniformMatrix4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv;
+#define glProgramUniformMatrix4x2dv glad_glProgramUniformMatrix4x2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv;
+#define glProgramUniformMatrix4x2fv glad_glProgramUniformMatrix4x2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv;
+#define glProgramUniformMatrix4x3dv glad_glProgramUniformMatrix4x3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv;
+#define glProgramUniformMatrix4x3fv glad_glProgramUniformMatrix4x3fv
+GLAD_API_CALL PFNGLPROGRAMVERTEXLIMITNVPROC glad_glProgramVertexLimitNV;
+#define glProgramVertexLimitNV glad_glProgramVertexLimitNV
+GLAD_API_CALL PFNGLPUSHATTRIBPROC glad_glPushAttrib;
+#define glPushAttrib glad_glPushAttrib
+GLAD_API_CALL PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib;
+#define glPushClientAttrib glad_glPushClientAttrib
+GLAD_API_CALL PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup;
+#define glPushDebugGroup glad_glPushDebugGroup
+GLAD_API_CALL PFNGLPUSHMATRIXPROC glad_glPushMatrix;
+#define glPushMatrix glad_glPushMatrix
+GLAD_API_CALL PFNGLPUSHNAMEPROC glad_glPushName;
+#define glPushName glad_glPushName
+GLAD_API_CALL PFNGLRASTERPOS2DPROC glad_glRasterPos2d;
+#define glRasterPos2d glad_glRasterPos2d
+GLAD_API_CALL PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv;
+#define glRasterPos2dv glad_glRasterPos2dv
+GLAD_API_CALL PFNGLRASTERPOS2FPROC glad_glRasterPos2f;
+#define glRasterPos2f glad_glRasterPos2f
+GLAD_API_CALL PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv;
+#define glRasterPos2fv glad_glRasterPos2fv
+GLAD_API_CALL PFNGLRASTERPOS2IPROC glad_glRasterPos2i;
+#define glRasterPos2i glad_glRasterPos2i
+GLAD_API_CALL PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv;
+#define glRasterPos2iv glad_glRasterPos2iv
+GLAD_API_CALL PFNGLRASTERPOS2SPROC glad_glRasterPos2s;
+#define glRasterPos2s glad_glRasterPos2s
+GLAD_API_CALL PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv;
+#define glRasterPos2sv glad_glRasterPos2sv
+GLAD_API_CALL PFNGLRASTERPOS3DPROC glad_glRasterPos3d;
+#define glRasterPos3d glad_glRasterPos3d
+GLAD_API_CALL PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv;
+#define glRasterPos3dv glad_glRasterPos3dv
+GLAD_API_CALL PFNGLRASTERPOS3FPROC glad_glRasterPos3f;
+#define glRasterPos3f glad_glRasterPos3f
+GLAD_API_CALL PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv;
+#define glRasterPos3fv glad_glRasterPos3fv
+GLAD_API_CALL PFNGLRASTERPOS3IPROC glad_glRasterPos3i;
+#define glRasterPos3i glad_glRasterPos3i
+GLAD_API_CALL PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv;
+#define glRasterPos3iv glad_glRasterPos3iv
+GLAD_API_CALL PFNGLRASTERPOS3SPROC glad_glRasterPos3s;
+#define glRasterPos3s glad_glRasterPos3s
+GLAD_API_CALL PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv;
+#define glRasterPos3sv glad_glRasterPos3sv
+GLAD_API_CALL PFNGLRASTERPOS4DPROC glad_glRasterPos4d;
+#define glRasterPos4d glad_glRasterPos4d
+GLAD_API_CALL PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv;
+#define glRasterPos4dv glad_glRasterPos4dv
+GLAD_API_CALL PFNGLRASTERPOS4FPROC glad_glRasterPos4f;
+#define glRasterPos4f glad_glRasterPos4f
+GLAD_API_CALL PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv;
+#define glRasterPos4fv glad_glRasterPos4fv
+GLAD_API_CALL PFNGLRASTERPOS4IPROC glad_glRasterPos4i;
+#define glRasterPos4i glad_glRasterPos4i
+GLAD_API_CALL PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv;
+#define glRasterPos4iv glad_glRasterPos4iv
+GLAD_API_CALL PFNGLRASTERPOS4SPROC glad_glRasterPos4s;
+#define glRasterPos4s glad_glRasterPos4s
+GLAD_API_CALL PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv;
+#define glRasterPos4sv glad_glRasterPos4sv
+GLAD_API_CALL PFNGLREADBUFFERPROC glad_glReadBuffer;
+#define glReadBuffer glad_glReadBuffer
+GLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels;
+#define glReadPixels glad_glReadPixels
+GLAD_API_CALL PFNGLRECTDPROC glad_glRectd;
+#define glRectd glad_glRectd
+GLAD_API_CALL PFNGLRECTDVPROC glad_glRectdv;
+#define glRectdv glad_glRectdv
+GLAD_API_CALL PFNGLRECTFPROC glad_glRectf;
+#define glRectf glad_glRectf
+GLAD_API_CALL PFNGLRECTFVPROC glad_glRectfv;
+#define glRectfv glad_glRectfv
+GLAD_API_CALL PFNGLRECTIPROC glad_glRecti;
+#define glRecti glad_glRecti
+GLAD_API_CALL PFNGLRECTIVPROC glad_glRectiv;
+#define glRectiv glad_glRectiv
+GLAD_API_CALL PFNGLRECTSPROC glad_glRects;
+#define glRects glad_glRects
+GLAD_API_CALL PFNGLRECTSVPROC glad_glRectsv;
+#define glRectsv glad_glRectsv
+GLAD_API_CALL PFNGLRENDERMODEPROC glad_glRenderMode;
+#define glRenderMode glad_glRenderMode
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage;
+#define glRenderbufferStorage glad_glRenderbufferStorage
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT;
+#define glRenderbufferStorageEXT glad_glRenderbufferStorageEXT
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample;
+#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glRenderbufferStorageMultisampleEXT;
+#define glRenderbufferStorageMultisampleEXT glad_glRenderbufferStorageMultisampleEXT
+GLAD_API_CALL PFNGLREQUESTRESIDENTPROGRAMSNVPROC glad_glRequestResidentProgramsNV;
+#define glRequestResidentProgramsNV glad_glRequestResidentProgramsNV
+GLAD_API_CALL PFNGLRESETHISTOGRAMPROC glad_glResetHistogram;
+#define glResetHistogram glad_glResetHistogram
+GLAD_API_CALL PFNGLRESETMINMAXPROC glad_glResetMinmax;
+#define glResetMinmax glad_glResetMinmax
+GLAD_API_CALL PFNGLROTATEDPROC glad_glRotated;
+#define glRotated glad_glRotated
+GLAD_API_CALL PFNGLROTATEFPROC glad_glRotatef;
+#define glRotatef glad_glRotatef
+GLAD_API_CALL PFNGLSCALEDPROC glad_glScaled;
+#define glScaled glad_glScaled
+GLAD_API_CALL PFNGLSCALEFPROC glad_glScalef;
+#define glScalef glad_glScalef
+GLAD_API_CALL PFNGLSCISSORPROC glad_glScissor;
+#define glScissor glad_glScissor
+GLAD_API_CALL PFNGLSELECTBUFFERPROC glad_glSelectBuffer;
+#define glSelectBuffer glad_glSelectBuffer
+GLAD_API_CALL PFNGLSEPARABLEFILTER2DPROC glad_glSeparableFilter2D;
+#define glSeparableFilter2D glad_glSeparableFilter2D
+GLAD_API_CALL PFNGLSHADEMODELPROC glad_glShadeModel;
+#define glShadeModel glad_glShadeModel
+GLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource;
+#define glShaderSource glad_glShaderSource
+GLAD_API_CALL PFNGLSHADERSOURCEARBPROC glad_glShaderSourceARB;
+#define glShaderSourceARB glad_glShaderSourceARB
+GLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc;
+#define glStencilFunc glad_glStencilFunc
+GLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask;
+#define glStencilMask glad_glStencilMask
+GLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp;
+#define glStencilOp glad_glStencilOp
+GLAD_API_CALL PFNGLTEXCOORD1DPROC glad_glTexCoord1d;
+#define glTexCoord1d glad_glTexCoord1d
+GLAD_API_CALL PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv;
+#define glTexCoord1dv glad_glTexCoord1dv
+GLAD_API_CALL PFNGLTEXCOORD1FPROC glad_glTexCoord1f;
+#define glTexCoord1f glad_glTexCoord1f
+GLAD_API_CALL PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv;
+#define glTexCoord1fv glad_glTexCoord1fv
+GLAD_API_CALL PFNGLTEXCOORD1IPROC glad_glTexCoord1i;
+#define glTexCoord1i glad_glTexCoord1i
+GLAD_API_CALL PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv;
+#define glTexCoord1iv glad_glTexCoord1iv
+GLAD_API_CALL PFNGLTEXCOORD1SPROC glad_glTexCoord1s;
+#define glTexCoord1s glad_glTexCoord1s
+GLAD_API_CALL PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv;
+#define glTexCoord1sv glad_glTexCoord1sv
+GLAD_API_CALL PFNGLTEXCOORD2DPROC glad_glTexCoord2d;
+#define glTexCoord2d glad_glTexCoord2d
+GLAD_API_CALL PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv;
+#define glTexCoord2dv glad_glTexCoord2dv
+GLAD_API_CALL PFNGLTEXCOORD2FPROC glad_glTexCoord2f;
+#define glTexCoord2f glad_glTexCoord2f
+GLAD_API_CALL PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv;
+#define glTexCoord2fv glad_glTexCoord2fv
+GLAD_API_CALL PFNGLTEXCOORD2IPROC glad_glTexCoord2i;
+#define glTexCoord2i glad_glTexCoord2i
+GLAD_API_CALL PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv;
+#define glTexCoord2iv glad_glTexCoord2iv
+GLAD_API_CALL PFNGLTEXCOORD2SPROC glad_glTexCoord2s;
+#define glTexCoord2s glad_glTexCoord2s
+GLAD_API_CALL PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv;
+#define glTexCoord2sv glad_glTexCoord2sv
+GLAD_API_CALL PFNGLTEXCOORD3DPROC glad_glTexCoord3d;
+#define glTexCoord3d glad_glTexCoord3d
+GLAD_API_CALL PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv;
+#define glTexCoord3dv glad_glTexCoord3dv
+GLAD_API_CALL PFNGLTEXCOORD3FPROC glad_glTexCoord3f;
+#define glTexCoord3f glad_glTexCoord3f
+GLAD_API_CALL PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv;
+#define glTexCoord3fv glad_glTexCoord3fv
+GLAD_API_CALL PFNGLTEXCOORD3IPROC glad_glTexCoord3i;
+#define glTexCoord3i glad_glTexCoord3i
+GLAD_API_CALL PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv;
+#define glTexCoord3iv glad_glTexCoord3iv
+GLAD_API_CALL PFNGLTEXCOORD3SPROC glad_glTexCoord3s;
+#define glTexCoord3s glad_glTexCoord3s
+GLAD_API_CALL PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv;
+#define glTexCoord3sv glad_glTexCoord3sv
+GLAD_API_CALL PFNGLTEXCOORD4DPROC glad_glTexCoord4d;
+#define glTexCoord4d glad_glTexCoord4d
+GLAD_API_CALL PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv;
+#define glTexCoord4dv glad_glTexCoord4dv
+GLAD_API_CALL PFNGLTEXCOORD4FPROC glad_glTexCoord4f;
+#define glTexCoord4f glad_glTexCoord4f
+GLAD_API_CALL PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv;
+#define glTexCoord4fv glad_glTexCoord4fv
+GLAD_API_CALL PFNGLTEXCOORD4IPROC glad_glTexCoord4i;
+#define glTexCoord4i glad_glTexCoord4i
+GLAD_API_CALL PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv;
+#define glTexCoord4iv glad_glTexCoord4iv
+GLAD_API_CALL PFNGLTEXCOORD4SPROC glad_glTexCoord4s;
+#define glTexCoord4s glad_glTexCoord4s
+GLAD_API_CALL PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv;
+#define glTexCoord4sv glad_glTexCoord4sv
+GLAD_API_CALL PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer;
+#define glTexCoordPointer glad_glTexCoordPointer
+GLAD_API_CALL PFNGLTEXCOORDPOINTEREXTPROC glad_glTexCoordPointerEXT;
+#define glTexCoordPointerEXT glad_glTexCoordPointerEXT
+GLAD_API_CALL PFNGLTEXENVFPROC glad_glTexEnvf;
+#define glTexEnvf glad_glTexEnvf
+GLAD_API_CALL PFNGLTEXENVFVPROC glad_glTexEnvfv;
+#define glTexEnvfv glad_glTexEnvfv
+GLAD_API_CALL PFNGLTEXENVIPROC glad_glTexEnvi;
+#define glTexEnvi glad_glTexEnvi
+GLAD_API_CALL PFNGLTEXENVIVPROC glad_glTexEnviv;
+#define glTexEnviv glad_glTexEnviv
+GLAD_API_CALL PFNGLTEXGENDPROC glad_glTexGend;
+#define glTexGend glad_glTexGend
+GLAD_API_CALL PFNGLTEXGENDVPROC glad_glTexGendv;
+#define glTexGendv glad_glTexGendv
+GLAD_API_CALL PFNGLTEXGENFPROC glad_glTexGenf;
+#define glTexGenf glad_glTexGenf
+GLAD_API_CALL PFNGLTEXGENFVPROC glad_glTexGenfv;
+#define glTexGenfv glad_glTexGenfv
+GLAD_API_CALL PFNGLTEXGENIPROC glad_glTexGeni;
+#define glTexGeni glad_glTexGeni
+GLAD_API_CALL PFNGLTEXGENIVPROC glad_glTexGeniv;
+#define glTexGeniv glad_glTexGeniv
+GLAD_API_CALL PFNGLTEXIMAGE1DPROC glad_glTexImage1D;
+#define glTexImage1D glad_glTexImage1D
+GLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D;
+#define glTexImage2D glad_glTexImage2D
+GLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf;
+#define glTexParameterf glad_glTexParameterf
+GLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv;
+#define glTexParameterfv glad_glTexParameterfv
+GLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri;
+#define glTexParameteri glad_glTexParameteri
+GLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv;
+#define glTexParameteriv glad_glTexParameteriv
+GLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D;
+#define glTexSubImage1D glad_glTexSubImage1D
+GLAD_API_CALL PFNGLTEXSUBIMAGE1DEXTPROC glad_glTexSubImage1DEXT;
+#define glTexSubImage1DEXT glad_glTexSubImage1DEXT
+GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D;
+#define glTexSubImage2D glad_glTexSubImage2D
+GLAD_API_CALL PFNGLTEXSUBIMAGE2DEXTPROC glad_glTexSubImage2DEXT;
+#define glTexSubImage2DEXT glad_glTexSubImage2DEXT
+GLAD_API_CALL PFNGLTRACKMATRIXNVPROC glad_glTrackMatrixNV;
+#define glTrackMatrixNV glad_glTrackMatrixNV
+GLAD_API_CALL PFNGLTRANSLATEDPROC glad_glTranslated;
+#define glTranslated glad_glTranslated
+GLAD_API_CALL PFNGLTRANSLATEFPROC glad_glTranslatef;
+#define glTranslatef glad_glTranslatef
+GLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f;
+#define glUniform1f glad_glUniform1f
+GLAD_API_CALL PFNGLUNIFORM1FARBPROC glad_glUniform1fARB;
+#define glUniform1fARB glad_glUniform1fARB
+GLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv;
+#define glUniform1fv glad_glUniform1fv
+GLAD_API_CALL PFNGLUNIFORM1FVARBPROC glad_glUniform1fvARB;
+#define glUniform1fvARB glad_glUniform1fvARB
+GLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i;
+#define glUniform1i glad_glUniform1i
+GLAD_API_CALL PFNGLUNIFORM1IARBPROC glad_glUniform1iARB;
+#define glUniform1iARB glad_glUniform1iARB
+GLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv;
+#define glUniform1iv glad_glUniform1iv
+GLAD_API_CALL PFNGLUNIFORM1IVARBPROC glad_glUniform1ivARB;
+#define glUniform1ivARB glad_glUniform1ivARB
+GLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f;
+#define glUniform2f glad_glUniform2f
+GLAD_API_CALL PFNGLUNIFORM2FARBPROC glad_glUniform2fARB;
+#define glUniform2fARB glad_glUniform2fARB
+GLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv;
+#define glUniform2fv glad_glUniform2fv
+GLAD_API_CALL PFNGLUNIFORM2FVARBPROC glad_glUniform2fvARB;
+#define glUniform2fvARB glad_glUniform2fvARB
+GLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i;
+#define glUniform2i glad_glUniform2i
+GLAD_API_CALL PFNGLUNIFORM2IARBPROC glad_glUniform2iARB;
+#define glUniform2iARB glad_glUniform2iARB
+GLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv;
+#define glUniform2iv glad_glUniform2iv
+GLAD_API_CALL PFNGLUNIFORM2IVARBPROC glad_glUniform2ivARB;
+#define glUniform2ivARB glad_glUniform2ivARB
+GLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f;
+#define glUniform3f glad_glUniform3f
+GLAD_API_CALL PFNGLUNIFORM3FARBPROC glad_glUniform3fARB;
+#define glUniform3fARB glad_glUniform3fARB
+GLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv;
+#define glUniform3fv glad_glUniform3fv
+GLAD_API_CALL PFNGLUNIFORM3FVARBPROC glad_glUniform3fvARB;
+#define glUniform3fvARB glad_glUniform3fvARB
+GLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i;
+#define glUniform3i glad_glUniform3i
+GLAD_API_CALL PFNGLUNIFORM3IARBPROC glad_glUniform3iARB;
+#define glUniform3iARB glad_glUniform3iARB
+GLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv;
+#define glUniform3iv glad_glUniform3iv
+GLAD_API_CALL PFNGLUNIFORM3IVARBPROC glad_glUniform3ivARB;
+#define glUniform3ivARB glad_glUniform3ivARB
+GLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f;
+#define glUniform4f glad_glUniform4f
+GLAD_API_CALL PFNGLUNIFORM4FARBPROC glad_glUniform4fARB;
+#define glUniform4fARB glad_glUniform4fARB
+GLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv;
+#define glUniform4fv glad_glUniform4fv
+GLAD_API_CALL PFNGLUNIFORM4FVARBPROC glad_glUniform4fvARB;
+#define glUniform4fvARB glad_glUniform4fvARB
+GLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i;
+#define glUniform4i glad_glUniform4i
+GLAD_API_CALL PFNGLUNIFORM4IARBPROC glad_glUniform4iARB;
+#define glUniform4iARB glad_glUniform4iARB
+GLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv;
+#define glUniform4iv glad_glUniform4iv
+GLAD_API_CALL PFNGLUNIFORM4IVARBPROC glad_glUniform4ivARB;
+#define glUniform4ivARB glad_glUniform4ivARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv;
+#define glUniformMatrix2fv glad_glUniformMatrix2fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX2FVARBPROC glad_glUniformMatrix2fvARB;
+#define glUniformMatrix2fvARB glad_glUniformMatrix2fvARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv;
+#define glUniformMatrix3fv glad_glUniformMatrix3fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX3FVARBPROC glad_glUniformMatrix3fvARB;
+#define glUniformMatrix3fvARB glad_glUniformMatrix3fvARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv;
+#define glUniformMatrix4fv glad_glUniformMatrix4fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX4FVARBPROC glad_glUniformMatrix4fvARB;
+#define glUniformMatrix4fvARB glad_glUniformMatrix4fvARB
+GLAD_API_CALL PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer;
+#define glUnmapBuffer glad_glUnmapBuffer
+GLAD_API_CALL PFNGLUNMAPBUFFERARBPROC glad_glUnmapBufferARB;
+#define glUnmapBufferARB glad_glUnmapBufferARB
+GLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram;
+#define glUseProgram glad_glUseProgram
+GLAD_API_CALL PFNGLUSEPROGRAMOBJECTARBPROC glad_glUseProgramObjectARB;
+#define glUseProgramObjectARB glad_glUseProgramObjectARB
+GLAD_API_CALL PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages;
+#define glUseProgramStages glad_glUseProgramStages
+GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram;
+#define glValidateProgram glad_glValidateProgram
+GLAD_API_CALL PFNGLVALIDATEPROGRAMARBPROC glad_glValidateProgramARB;
+#define glValidateProgramARB glad_glValidateProgramARB
+GLAD_API_CALL PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline;
+#define glValidateProgramPipeline glad_glValidateProgramPipeline
+GLAD_API_CALL PFNGLVERTEX2DPROC glad_glVertex2d;
+#define glVertex2d glad_glVertex2d
+GLAD_API_CALL PFNGLVERTEX2DVPROC glad_glVertex2dv;
+#define glVertex2dv glad_glVertex2dv
+GLAD_API_CALL PFNGLVERTEX2FPROC glad_glVertex2f;
+#define glVertex2f glad_glVertex2f
+GLAD_API_CALL PFNGLVERTEX2FVPROC glad_glVertex2fv;
+#define glVertex2fv glad_glVertex2fv
+GLAD_API_CALL PFNGLVERTEX2IPROC glad_glVertex2i;
+#define glVertex2i glad_glVertex2i
+GLAD_API_CALL PFNGLVERTEX2IVPROC glad_glVertex2iv;
+#define glVertex2iv glad_glVertex2iv
+GLAD_API_CALL PFNGLVERTEX2SPROC glad_glVertex2s;
+#define glVertex2s glad_glVertex2s
+GLAD_API_CALL PFNGLVERTEX2SVPROC glad_glVertex2sv;
+#define glVertex2sv glad_glVertex2sv
+GLAD_API_CALL PFNGLVERTEX3DPROC glad_glVertex3d;
+#define glVertex3d glad_glVertex3d
+GLAD_API_CALL PFNGLVERTEX3DVPROC glad_glVertex3dv;
+#define glVertex3dv glad_glVertex3dv
+GLAD_API_CALL PFNGLVERTEX3FPROC glad_glVertex3f;
+#define glVertex3f glad_glVertex3f
+GLAD_API_CALL PFNGLVERTEX3FVPROC glad_glVertex3fv;
+#define glVertex3fv glad_glVertex3fv
+GLAD_API_CALL PFNGLVERTEX3IPROC glad_glVertex3i;
+#define glVertex3i glad_glVertex3i
+GLAD_API_CALL PFNGLVERTEX3IVPROC glad_glVertex3iv;
+#define glVertex3iv glad_glVertex3iv
+GLAD_API_CALL PFNGLVERTEX3SPROC glad_glVertex3s;
+#define glVertex3s glad_glVertex3s
+GLAD_API_CALL PFNGLVERTEX3SVPROC glad_glVertex3sv;
+#define glVertex3sv glad_glVertex3sv
+GLAD_API_CALL PFNGLVERTEX4DPROC glad_glVertex4d;
+#define glVertex4d glad_glVertex4d
+GLAD_API_CALL PFNGLVERTEX4DVPROC glad_glVertex4dv;
+#define glVertex4dv glad_glVertex4dv
+GLAD_API_CALL PFNGLVERTEX4FPROC glad_glVertex4f;
+#define glVertex4f glad_glVertex4f
+GLAD_API_CALL PFNGLVERTEX4FVPROC glad_glVertex4fv;
+#define glVertex4fv glad_glVertex4fv
+GLAD_API_CALL PFNGLVERTEX4IPROC glad_glVertex4i;
+#define glVertex4i glad_glVertex4i
+GLAD_API_CALL PFNGLVERTEX4IVPROC glad_glVertex4iv;
+#define glVertex4iv glad_glVertex4iv
+GLAD_API_CALL PFNGLVERTEX4SPROC glad_glVertex4s;
+#define glVertex4s glad_glVertex4s
+GLAD_API_CALL PFNGLVERTEX4SVPROC glad_glVertex4sv;
+#define glVertex4sv glad_glVertex4sv
+GLAD_API_CALL PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d;
+#define glVertexAttrib1d glad_glVertexAttrib1d
+GLAD_API_CALL PFNGLVERTEXATTRIB1DARBPROC glad_glVertexAttrib1dARB;
+#define glVertexAttrib1dARB glad_glVertexAttrib1dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1DNVPROC glad_glVertexAttrib1dNV;
+#define glVertexAttrib1dNV glad_glVertexAttrib1dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv;
+#define glVertexAttrib1dv glad_glVertexAttrib1dv
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVARBPROC glad_glVertexAttrib1dvARB;
+#define glVertexAttrib1dvARB glad_glVertexAttrib1dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVNVPROC glad_glVertexAttrib1dvNV;
+#define glVertexAttrib1dvNV glad_glVertexAttrib1dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f;
+#define glVertexAttrib1f glad_glVertexAttrib1f
+GLAD_API_CALL PFNGLVERTEXATTRIB1FARBPROC glad_glVertexAttrib1fARB;
+#define glVertexAttrib1fARB glad_glVertexAttrib1fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1FNVPROC glad_glVertexAttrib1fNV;
+#define glVertexAttrib1fNV glad_glVertexAttrib1fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv;
+#define glVertexAttrib1fv glad_glVertexAttrib1fv
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVARBPROC glad_glVertexAttrib1fvARB;
+#define glVertexAttrib1fvARB glad_glVertexAttrib1fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVNVPROC glad_glVertexAttrib1fvNV;
+#define glVertexAttrib1fvNV glad_glVertexAttrib1fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s;
+#define glVertexAttrib1s glad_glVertexAttrib1s
+GLAD_API_CALL PFNGLVERTEXATTRIB1SARBPROC glad_glVertexAttrib1sARB;
+#define glVertexAttrib1sARB glad_glVertexAttrib1sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1SNVPROC glad_glVertexAttrib1sNV;
+#define glVertexAttrib1sNV glad_glVertexAttrib1sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv;
+#define glVertexAttrib1sv glad_glVertexAttrib1sv
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVARBPROC glad_glVertexAttrib1svARB;
+#define glVertexAttrib1svARB glad_glVertexAttrib1svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVNVPROC glad_glVertexAttrib1svNV;
+#define glVertexAttrib1svNV glad_glVertexAttrib1svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d;
+#define glVertexAttrib2d glad_glVertexAttrib2d
+GLAD_API_CALL PFNGLVERTEXATTRIB2DARBPROC glad_glVertexAttrib2dARB;
+#define glVertexAttrib2dARB glad_glVertexAttrib2dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2DNVPROC glad_glVertexAttrib2dNV;
+#define glVertexAttrib2dNV glad_glVertexAttrib2dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv;
+#define glVertexAttrib2dv glad_glVertexAttrib2dv
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVARBPROC glad_glVertexAttrib2dvARB;
+#define glVertexAttrib2dvARB glad_glVertexAttrib2dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVNVPROC glad_glVertexAttrib2dvNV;
+#define glVertexAttrib2dvNV glad_glVertexAttrib2dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f;
+#define glVertexAttrib2f glad_glVertexAttrib2f
+GLAD_API_CALL PFNGLVERTEXATTRIB2FARBPROC glad_glVertexAttrib2fARB;
+#define glVertexAttrib2fARB glad_glVertexAttrib2fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2FNVPROC glad_glVertexAttrib2fNV;
+#define glVertexAttrib2fNV glad_glVertexAttrib2fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv;
+#define glVertexAttrib2fv glad_glVertexAttrib2fv
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVARBPROC glad_glVertexAttrib2fvARB;
+#define glVertexAttrib2fvARB glad_glVertexAttrib2fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVNVPROC glad_glVertexAttrib2fvNV;
+#define glVertexAttrib2fvNV glad_glVertexAttrib2fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s;
+#define glVertexAttrib2s glad_glVertexAttrib2s
+GLAD_API_CALL PFNGLVERTEXATTRIB2SARBPROC glad_glVertexAttrib2sARB;
+#define glVertexAttrib2sARB glad_glVertexAttrib2sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2SNVPROC glad_glVertexAttrib2sNV;
+#define glVertexAttrib2sNV glad_glVertexAttrib2sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv;
+#define glVertexAttrib2sv glad_glVertexAttrib2sv
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVARBPROC glad_glVertexAttrib2svARB;
+#define glVertexAttrib2svARB glad_glVertexAttrib2svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVNVPROC glad_glVertexAttrib2svNV;
+#define glVertexAttrib2svNV glad_glVertexAttrib2svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d;
+#define glVertexAttrib3d glad_glVertexAttrib3d
+GLAD_API_CALL PFNGLVERTEXATTRIB3DARBPROC glad_glVertexAttrib3dARB;
+#define glVertexAttrib3dARB glad_glVertexAttrib3dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3DNVPROC glad_glVertexAttrib3dNV;
+#define glVertexAttrib3dNV glad_glVertexAttrib3dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv;
+#define glVertexAttrib3dv glad_glVertexAttrib3dv
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVARBPROC glad_glVertexAttrib3dvARB;
+#define glVertexAttrib3dvARB glad_glVertexAttrib3dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVNVPROC glad_glVertexAttrib3dvNV;
+#define glVertexAttrib3dvNV glad_glVertexAttrib3dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f;
+#define glVertexAttrib3f glad_glVertexAttrib3f
+GLAD_API_CALL PFNGLVERTEXATTRIB3FARBPROC glad_glVertexAttrib3fARB;
+#define glVertexAttrib3fARB glad_glVertexAttrib3fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3FNVPROC glad_glVertexAttrib3fNV;
+#define glVertexAttrib3fNV glad_glVertexAttrib3fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv;
+#define glVertexAttrib3fv glad_glVertexAttrib3fv
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVARBPROC glad_glVertexAttrib3fvARB;
+#define glVertexAttrib3fvARB glad_glVertexAttrib3fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVNVPROC glad_glVertexAttrib3fvNV;
+#define glVertexAttrib3fvNV glad_glVertexAttrib3fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s;
+#define glVertexAttrib3s glad_glVertexAttrib3s
+GLAD_API_CALL PFNGLVERTEXATTRIB3SARBPROC glad_glVertexAttrib3sARB;
+#define glVertexAttrib3sARB glad_glVertexAttrib3sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3SNVPROC glad_glVertexAttrib3sNV;
+#define glVertexAttrib3sNV glad_glVertexAttrib3sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv;
+#define glVertexAttrib3sv glad_glVertexAttrib3sv
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVARBPROC glad_glVertexAttrib3svARB;
+#define glVertexAttrib3svARB glad_glVertexAttrib3svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVNVPROC glad_glVertexAttrib3svNV;
+#define glVertexAttrib3svNV glad_glVertexAttrib3svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv;
+#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NBVARBPROC glad_glVertexAttrib4NbvARB;
+#define glVertexAttrib4NbvARB glad_glVertexAttrib4NbvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv;
+#define glVertexAttrib4Niv glad_glVertexAttrib4Niv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NIVARBPROC glad_glVertexAttrib4NivARB;
+#define glVertexAttrib4NivARB glad_glVertexAttrib4NivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv;
+#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NSVARBPROC glad_glVertexAttrib4NsvARB;
+#define glVertexAttrib4NsvARB glad_glVertexAttrib4NsvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub;
+#define glVertexAttrib4Nub glad_glVertexAttrib4Nub
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBARBPROC glad_glVertexAttrib4NubARB;
+#define glVertexAttrib4NubARB glad_glVertexAttrib4NubARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv;
+#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVARBPROC glad_glVertexAttrib4NubvARB;
+#define glVertexAttrib4NubvARB glad_glVertexAttrib4NubvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv;
+#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVARBPROC glad_glVertexAttrib4NuivARB;
+#define glVertexAttrib4NuivARB glad_glVertexAttrib4NuivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv;
+#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVARBPROC glad_glVertexAttrib4NusvARB;
+#define glVertexAttrib4NusvARB glad_glVertexAttrib4NusvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv;
+#define glVertexAttrib4bv glad_glVertexAttrib4bv
+GLAD_API_CALL PFNGLVERTEXATTRIB4BVARBPROC glad_glVertexAttrib4bvARB;
+#define glVertexAttrib4bvARB glad_glVertexAttrib4bvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d;
+#define glVertexAttrib4d glad_glVertexAttrib4d
+GLAD_API_CALL PFNGLVERTEXATTRIB4DARBPROC glad_glVertexAttrib4dARB;
+#define glVertexAttrib4dARB glad_glVertexAttrib4dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DNVPROC glad_glVertexAttrib4dNV;
+#define glVertexAttrib4dNV glad_glVertexAttrib4dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv;
+#define glVertexAttrib4dv glad_glVertexAttrib4dv
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVARBPROC glad_glVertexAttrib4dvARB;
+#define glVertexAttrib4dvARB glad_glVertexAttrib4dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVNVPROC glad_glVertexAttrib4dvNV;
+#define glVertexAttrib4dvNV glad_glVertexAttrib4dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f;
+#define glVertexAttrib4f glad_glVertexAttrib4f
+GLAD_API_CALL PFNGLVERTEXATTRIB4FARBPROC glad_glVertexAttrib4fARB;
+#define glVertexAttrib4fARB glad_glVertexAttrib4fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4FNVPROC glad_glVertexAttrib4fNV;
+#define glVertexAttrib4fNV glad_glVertexAttrib4fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv;
+#define glVertexAttrib4fv glad_glVertexAttrib4fv
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVARBPROC glad_glVertexAttrib4fvARB;
+#define glVertexAttrib4fvARB glad_glVertexAttrib4fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVNVPROC glad_glVertexAttrib4fvNV;
+#define glVertexAttrib4fvNV glad_glVertexAttrib4fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv;
+#define glVertexAttrib4iv glad_glVertexAttrib4iv
+GLAD_API_CALL PFNGLVERTEXATTRIB4IVARBPROC glad_glVertexAttrib4ivARB;
+#define glVertexAttrib4ivARB glad_glVertexAttrib4ivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s;
+#define glVertexAttrib4s glad_glVertexAttrib4s
+GLAD_API_CALL PFNGLVERTEXATTRIB4SARBPROC glad_glVertexAttrib4sARB;
+#define glVertexAttrib4sARB glad_glVertexAttrib4sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SNVPROC glad_glVertexAttrib4sNV;
+#define glVertexAttrib4sNV glad_glVertexAttrib4sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv;
+#define glVertexAttrib4sv glad_glVertexAttrib4sv
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVARBPROC glad_glVertexAttrib4svARB;
+#define glVertexAttrib4svARB glad_glVertexAttrib4svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVNVPROC glad_glVertexAttrib4svNV;
+#define glVertexAttrib4svNV glad_glVertexAttrib4svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBNVPROC glad_glVertexAttrib4ubNV;
+#define glVertexAttrib4ubNV glad_glVertexAttrib4ubNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv;
+#define glVertexAttrib4ubv glad_glVertexAttrib4ubv
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVARBPROC glad_glVertexAttrib4ubvARB;
+#define glVertexAttrib4ubvARB glad_glVertexAttrib4ubvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVNVPROC glad_glVertexAttrib4ubvNV;
+#define glVertexAttrib4ubvNV glad_glVertexAttrib4ubvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv;
+#define glVertexAttrib4uiv glad_glVertexAttrib4uiv
+GLAD_API_CALL PFNGLVERTEXATTRIB4UIVARBPROC glad_glVertexAttrib4uivARB;
+#define glVertexAttrib4uivARB glad_glVertexAttrib4uivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv;
+#define glVertexAttrib4usv glad_glVertexAttrib4usv
+GLAD_API_CALL PFNGLVERTEXATTRIB4USVARBPROC glad_glVertexAttrib4usvARB;
+#define glVertexAttrib4usvARB glad_glVertexAttrib4usvARB
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer;
+#define glVertexAttribPointer glad_glVertexAttribPointer
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERARBPROC glad_glVertexAttribPointerARB;
+#define glVertexAttribPointerARB glad_glVertexAttribPointerARB
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERNVPROC glad_glVertexAttribPointerNV;
+#define glVertexAttribPointerNV glad_glVertexAttribPointerNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1DVNVPROC glad_glVertexAttribs1dvNV;
+#define glVertexAttribs1dvNV glad_glVertexAttribs1dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1FVNVPROC glad_glVertexAttribs1fvNV;
+#define glVertexAttribs1fvNV glad_glVertexAttribs1fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1SVNVPROC glad_glVertexAttribs1svNV;
+#define glVertexAttribs1svNV glad_glVertexAttribs1svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2DVNVPROC glad_glVertexAttribs2dvNV;
+#define glVertexAttribs2dvNV glad_glVertexAttribs2dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2FVNVPROC glad_glVertexAttribs2fvNV;
+#define glVertexAttribs2fvNV glad_glVertexAttribs2fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2SVNVPROC glad_glVertexAttribs2svNV;
+#define glVertexAttribs2svNV glad_glVertexAttribs2svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3DVNVPROC glad_glVertexAttribs3dvNV;
+#define glVertexAttribs3dvNV glad_glVertexAttribs3dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3FVNVPROC glad_glVertexAttribs3fvNV;
+#define glVertexAttribs3fvNV glad_glVertexAttribs3fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3SVNVPROC glad_glVertexAttribs3svNV;
+#define glVertexAttribs3svNV glad_glVertexAttribs3svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4DVNVPROC glad_glVertexAttribs4dvNV;
+#define glVertexAttribs4dvNV glad_glVertexAttribs4dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4FVNVPROC glad_glVertexAttribs4fvNV;
+#define glVertexAttribs4fvNV glad_glVertexAttribs4fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4SVNVPROC glad_glVertexAttribs4svNV;
+#define glVertexAttribs4svNV glad_glVertexAttribs4svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4UBVNVPROC glad_glVertexAttribs4ubvNV;
+#define glVertexAttribs4ubvNV glad_glVertexAttribs4ubvNV
+GLAD_API_CALL PFNGLVERTEXPOINTERPROC glad_glVertexPointer;
+#define glVertexPointer glad_glVertexPointer
+GLAD_API_CALL PFNGLVERTEXPOINTEREXTPROC glad_glVertexPointerEXT;
+#define glVertexPointerEXT glad_glVertexPointerEXT
+GLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport;
+#define glViewport glad_glViewport
+GLAD_API_CALL PFNGLALPHAFUNCXPROC glad_glAlphaFuncx;
+#define glAlphaFuncx glad_glAlphaFuncx
+GLAD_API_CALL PFNGLBINDFRAMEBUFFEROESPROC glad_glBindFramebufferOES;
+#define glBindFramebufferOES glad_glBindFramebufferOES
+GLAD_API_CALL PFNGLBINDRENDERBUFFEROESPROC glad_glBindRenderbufferOES;
+#define glBindRenderbufferOES glad_glBindRenderbufferOES
+GLAD_API_CALL PFNGLBLENDEQUATIONOESPROC glad_glBlendEquationOES;
+#define glBlendEquationOES glad_glBlendEquationOES
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEOESPROC glad_glBlendEquationSeparateOES;
+#define glBlendEquationSeparateOES glad_glBlendEquationSeparateOES
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEOESPROC glad_glBlendFuncSeparateOES;
+#define glBlendFuncSeparateOES glad_glBlendFuncSeparateOES
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSOESPROC glad_glCheckFramebufferStatusOES;
+#define glCheckFramebufferStatusOES glad_glCheckFramebufferStatusOES
+GLAD_API_CALL PFNGLCLEARCOLORXPROC glad_glClearColorx;
+#define glClearColorx glad_glClearColorx
+GLAD_API_CALL PFNGLCLEARDEPTHFPROC glad_glClearDepthf;
+#define glClearDepthf glad_glClearDepthf
+GLAD_API_CALL PFNGLCLEARDEPTHFOESPROC glad_glClearDepthfOES;
+#define glClearDepthfOES glad_glClearDepthfOES
+GLAD_API_CALL PFNGLCLEARDEPTHXPROC glad_glClearDepthx;
+#define glClearDepthx glad_glClearDepthx
+GLAD_API_CALL PFNGLCLIPPLANEFPROC glad_glClipPlanef;
+#define glClipPlanef glad_glClipPlanef
+GLAD_API_CALL PFNGLCLIPPLANEFOESPROC glad_glClipPlanefOES;
+#define glClipPlanefOES glad_glClipPlanefOES
+GLAD_API_CALL PFNGLCLIPPLANEXPROC glad_glClipPlanex;
+#define glClipPlanex glad_glClipPlanex
+GLAD_API_CALL PFNGLCOLOR4XPROC glad_glColor4x;
+#define glColor4x glad_glColor4x
+GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D;
+#define glCompressedTexImage2D glad_glCompressedTexImage2D
+GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D;
+#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSOESPROC glad_glDeleteFramebuffersOES;
+#define glDeleteFramebuffersOES glad_glDeleteFramebuffersOES
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSOESPROC glad_glDeleteRenderbuffersOES;
+#define glDeleteRenderbuffersOES glad_glDeleteRenderbuffersOES
+GLAD_API_CALL PFNGLDEPTHRANGEFPROC glad_glDepthRangef;
+#define glDepthRangef glad_glDepthRangef
+GLAD_API_CALL PFNGLDEPTHRANGEFOESPROC glad_glDepthRangefOES;
+#define glDepthRangefOES glad_glDepthRangefOES
+GLAD_API_CALL PFNGLDEPTHRANGEXPROC glad_glDepthRangex;
+#define glDepthRangex glad_glDepthRangex
+GLAD_API_CALL PFNGLFOGXPROC glad_glFogx;
+#define glFogx glad_glFogx
+GLAD_API_CALL PFNGLFOGXVPROC glad_glFogxv;
+#define glFogxv glad_glFogxv
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFEROESPROC glad_glFramebufferRenderbufferOES;
+#define glFramebufferRenderbufferOES glad_glFramebufferRenderbufferOES
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DOESPROC glad_glFramebufferTexture2DOES;
+#define glFramebufferTexture2DOES glad_glFramebufferTexture2DOES
+GLAD_API_CALL PFNGLFRUSTUMFPROC glad_glFrustumf;
+#define glFrustumf glad_glFrustumf
+GLAD_API_CALL PFNGLFRUSTUMFOESPROC glad_glFrustumfOES;
+#define glFrustumfOES glad_glFrustumfOES
+GLAD_API_CALL PFNGLFRUSTUMXPROC glad_glFrustumx;
+#define glFrustumx glad_glFrustumx
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSOESPROC glad_glGenFramebuffersOES;
+#define glGenFramebuffersOES glad_glGenFramebuffersOES
+GLAD_API_CALL PFNGLGENRENDERBUFFERSOESPROC glad_glGenRenderbuffersOES;
+#define glGenRenderbuffersOES glad_glGenRenderbuffersOES
+GLAD_API_CALL PFNGLGENERATEMIPMAPOESPROC glad_glGenerateMipmapOES;
+#define glGenerateMipmapOES glad_glGenerateMipmapOES
+GLAD_API_CALL PFNGLGETCLIPPLANEFPROC glad_glGetClipPlanef;
+#define glGetClipPlanef glad_glGetClipPlanef
+GLAD_API_CALL PFNGLGETCLIPPLANEFOESPROC glad_glGetClipPlanefOES;
+#define glGetClipPlanefOES glad_glGetClipPlanefOES
+GLAD_API_CALL PFNGLGETCLIPPLANEXPROC glad_glGetClipPlanex;
+#define glGetClipPlanex glad_glGetClipPlanex
+GLAD_API_CALL PFNGLGETFIXEDVPROC glad_glGetFixedv;
+#define glGetFixedv glad_glGetFixedv
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC glad_glGetFramebufferAttachmentParameterivOES;
+#define glGetFramebufferAttachmentParameterivOES glad_glGetFramebufferAttachmentParameterivOES
+GLAD_API_CALL PFNGLGETLIGHTXVPROC glad_glGetLightxv;
+#define glGetLightxv glad_glGetLightxv
+GLAD_API_CALL PFNGLGETMATERIALXVPROC glad_glGetMaterialxv;
+#define glGetMaterialxv glad_glGetMaterialxv
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVOESPROC glad_glGetRenderbufferParameterivOES;
+#define glGetRenderbufferParameterivOES glad_glGetRenderbufferParameterivOES
+GLAD_API_CALL PFNGLGETTEXENVXVPROC glad_glGetTexEnvxv;
+#define glGetTexEnvxv glad_glGetTexEnvxv
+GLAD_API_CALL PFNGLGETTEXPARAMETERXVPROC glad_glGetTexParameterxv;
+#define glGetTexParameterxv glad_glGetTexParameterxv
+GLAD_API_CALL PFNGLISFRAMEBUFFEROESPROC glad_glIsFramebufferOES;
+#define glIsFramebufferOES glad_glIsFramebufferOES
+GLAD_API_CALL PFNGLISRENDERBUFFEROESPROC glad_glIsRenderbufferOES;
+#define glIsRenderbufferOES glad_glIsRenderbufferOES
+GLAD_API_CALL PFNGLLIGHTMODELXPROC glad_glLightModelx;
+#define glLightModelx glad_glLightModelx
+GLAD_API_CALL PFNGLLIGHTMODELXVPROC glad_glLightModelxv;
+#define glLightModelxv glad_glLightModelxv
+GLAD_API_CALL PFNGLLIGHTXPROC glad_glLightx;
+#define glLightx glad_glLightx
+GLAD_API_CALL PFNGLLIGHTXVPROC glad_glLightxv;
+#define glLightxv glad_glLightxv
+GLAD_API_CALL PFNGLLINEWIDTHXPROC glad_glLineWidthx;
+#define glLineWidthx glad_glLineWidthx
+GLAD_API_CALL PFNGLLOADMATRIXXPROC glad_glLoadMatrixx;
+#define glLoadMatrixx glad_glLoadMatrixx
+GLAD_API_CALL PFNGLMATERIALXPROC glad_glMaterialx;
+#define glMaterialx glad_glMaterialx
+GLAD_API_CALL PFNGLMATERIALXVPROC glad_glMaterialxv;
+#define glMaterialxv glad_glMaterialxv
+GLAD_API_CALL PFNGLMULTMATRIXXPROC glad_glMultMatrixx;
+#define glMultMatrixx glad_glMultMatrixx
+GLAD_API_CALL PFNGLMULTITEXCOORD4XPROC glad_glMultiTexCoord4x;
+#define glMultiTexCoord4x glad_glMultiTexCoord4x
+GLAD_API_CALL PFNGLNORMAL3XPROC glad_glNormal3x;
+#define glNormal3x glad_glNormal3x
+GLAD_API_CALL PFNGLORTHOFPROC glad_glOrthof;
+#define glOrthof glad_glOrthof
+GLAD_API_CALL PFNGLORTHOFOESPROC glad_glOrthofOES;
+#define glOrthofOES glad_glOrthofOES
+GLAD_API_CALL PFNGLORTHOXPROC glad_glOrthox;
+#define glOrthox glad_glOrthox
+GLAD_API_CALL PFNGLPOINTPARAMETERFPROC glad_glPointParameterf;
+#define glPointParameterf glad_glPointParameterf
+GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv;
+#define glPointParameterfv glad_glPointParameterfv
+GLAD_API_CALL PFNGLPOINTPARAMETERXPROC glad_glPointParameterx;
+#define glPointParameterx glad_glPointParameterx
+GLAD_API_CALL PFNGLPOINTPARAMETERXVPROC glad_glPointParameterxv;
+#define glPointParameterxv glad_glPointParameterxv
+GLAD_API_CALL PFNGLPOINTSIZEXPROC glad_glPointSizex;
+#define glPointSizex glad_glPointSizex
+GLAD_API_CALL PFNGLPOLYGONOFFSETXPROC glad_glPolygonOffsetx;
+#define glPolygonOffsetx glad_glPolygonOffsetx
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEOESPROC glad_glRenderbufferStorageOES;
+#define glRenderbufferStorageOES glad_glRenderbufferStorageOES
+GLAD_API_CALL PFNGLROTATEXPROC glad_glRotatex;
+#define glRotatex glad_glRotatex
+GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage;
+#define glSampleCoverage glad_glSampleCoverage
+GLAD_API_CALL PFNGLSAMPLECOVERAGEXPROC glad_glSampleCoveragex;
+#define glSampleCoveragex glad_glSampleCoveragex
+GLAD_API_CALL PFNGLSCALEXPROC glad_glScalex;
+#define glScalex glad_glScalex
+GLAD_API_CALL PFNGLTEXENVXPROC glad_glTexEnvx;
+#define glTexEnvx glad_glTexEnvx
+GLAD_API_CALL PFNGLTEXENVXVPROC glad_glTexEnvxv;
+#define glTexEnvxv glad_glTexEnvxv
+GLAD_API_CALL PFNGLTEXPARAMETERXPROC glad_glTexParameterx;
+#define glTexParameterx glad_glTexParameterx
+GLAD_API_CALL PFNGLTEXPARAMETERXVPROC glad_glTexParameterxv;
+#define glTexParameterxv glad_glTexParameterxv
+GLAD_API_CALL PFNGLTRANSLATEXPROC glad_glTranslatex;
+#define glTranslatex glad_glTranslatex
+
+
+
+
+
+GLAD_API_CALL int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr);
+GLAD_API_CALL int gladLoadGL( GLADloadfunc load);
+
+GLAD_API_CALL int gladLoadGLES1UserPtr( GLADuserptrloadfunc load, void *userptr);
+GLAD_API_CALL int gladLoadGLES1( GLADloadfunc load);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Source */
+#ifdef GLAD_GL_IMPLEMENTATION
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef GLAD_IMPL_UTIL_C_
+#define GLAD_IMPL_UTIL_C_
+
+#ifdef _MSC_VER
+#define GLAD_IMPL_UTIL_SSCANF sscanf_s
+#else
+#define GLAD_IMPL_UTIL_SSCANF sscanf
+#endif
+
+#endif /* GLAD_IMPL_UTIL_C_ */
+
+
+int GLAD_GL_VERSION_1_0 = 0;
+int GLAD_GL_VERSION_1_1 = 0;
+int GLAD_GL_VERSION_ES_CM_1_0 = 0;
+int GLAD_GL_ARB_copy_buffer = 0;
+int GLAD_GL_ARB_fragment_shader = 0;
+int GLAD_GL_ARB_framebuffer_object = 0;
+int GLAD_GL_ARB_geometry_shader4 = 0;
+int GLAD_GL_ARB_get_program_binary = 0;
+int GLAD_GL_ARB_imaging = 0;
+int GLAD_GL_ARB_multitexture = 0;
+int GLAD_GL_ARB_separate_shader_objects = 0;
+int GLAD_GL_ARB_shader_objects = 0;
+int GLAD_GL_ARB_shading_language_100 = 0;
+int GLAD_GL_ARB_texture_non_power_of_two = 0;
+int GLAD_GL_ARB_vertex_buffer_object = 0;
+int GLAD_GL_ARB_vertex_program = 0;
+int GLAD_GL_ARB_vertex_shader = 0;
+int GLAD_GL_EXT_blend_equation_separate = 0;
+int GLAD_GL_EXT_blend_func_separate = 0;
+int GLAD_GL_EXT_blend_minmax = 0;
+int GLAD_GL_EXT_blend_subtract = 0;
+int GLAD_GL_EXT_copy_texture = 0;
+int GLAD_GL_EXT_framebuffer_blit = 0;
+int GLAD_GL_EXT_framebuffer_multisample = 0;
+int GLAD_GL_EXT_framebuffer_object = 0;
+int GLAD_GL_EXT_geometry_shader4 = 0;
+int GLAD_GL_EXT_packed_depth_stencil = 0;
+int GLAD_GL_EXT_subtexture = 0;
+int GLAD_GL_EXT_texture_array = 0;
+int GLAD_GL_EXT_texture_object = 0;
+int GLAD_GL_EXT_texture_sRGB = 0;
+int GLAD_GL_EXT_vertex_array = 0;
+int GLAD_GL_INGR_blend_func_separate = 0;
+int GLAD_GL_KHR_debug = 0;
+int GLAD_GL_NV_geometry_program4 = 0;
+int GLAD_GL_NV_vertex_program = 0;
+int GLAD_GL_SGIS_texture_edge_clamp = 0;
+int GLAD_GL_EXT_sRGB = 0;
+int GLAD_GL_OES_blend_equation_separate = 0;
+int GLAD_GL_OES_blend_func_separate = 0;
+int GLAD_GL_OES_blend_subtract = 0;
+int GLAD_GL_OES_framebuffer_object = 0;
+int GLAD_GL_OES_packed_depth_stencil = 0;
+int GLAD_GL_OES_single_precision = 0;
+int GLAD_GL_OES_texture_npot = 0;
+
+
+
+PFNGLACCUMPROC glad_glAccum = NULL;
+PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram = NULL;
+PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL;
+PFNGLACTIVETEXTUREARBPROC glad_glActiveTextureARB = NULL;
+PFNGLALPHAFUNCPROC glad_glAlphaFunc = NULL;
+PFNGLAREPROGRAMSRESIDENTNVPROC glad_glAreProgramsResidentNV = NULL;
+PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident = NULL;
+PFNGLARETEXTURESRESIDENTEXTPROC glad_glAreTexturesResidentEXT = NULL;
+PFNGLARRAYELEMENTPROC glad_glArrayElement = NULL;
+PFNGLARRAYELEMENTEXTPROC glad_glArrayElementEXT = NULL;
+PFNGLATTACHOBJECTARBPROC glad_glAttachObjectARB = NULL;
+PFNGLATTACHSHADERPROC glad_glAttachShader = NULL;
+PFNGLBEGINPROC glad_glBegin = NULL;
+PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL;
+PFNGLBINDATTRIBLOCATIONARBPROC glad_glBindAttribLocationARB = NULL;
+PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL;
+PFNGLBINDBUFFERARBPROC glad_glBindBufferARB = NULL;
+PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL;
+PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT = NULL;
+PFNGLBINDPROGRAMARBPROC glad_glBindProgramARB = NULL;
+PFNGLBINDPROGRAMNVPROC glad_glBindProgramNV = NULL;
+PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline = NULL;
+PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL;
+PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT = NULL;
+PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL;
+PFNGLBINDTEXTUREEXTPROC glad_glBindTextureEXT = NULL;
+PFNGLBITMAPPROC glad_glBitmap = NULL;
+PFNGLBLENDCOLORPROC glad_glBlendColor = NULL;
+PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL;
+PFNGLBLENDEQUATIONEXTPROC glad_glBlendEquationEXT = NULL;
+PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL;
+PFNGLBLENDEQUATIONSEPARATEEXTPROC glad_glBlendEquationSeparateEXT = NULL;
+PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL;
+PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL;
+PFNGLBLENDFUNCSEPARATEEXTPROC glad_glBlendFuncSeparateEXT = NULL;
+PFNGLBLENDFUNCSEPARATEINGRPROC glad_glBlendFuncSeparateINGR = NULL;
+PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL;
+PFNGLBLITFRAMEBUFFEREXTPROC glad_glBlitFramebufferEXT = NULL;
+PFNGLBUFFERDATAPROC glad_glBufferData = NULL;
+PFNGLBUFFERDATAARBPROC glad_glBufferDataARB = NULL;
+PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL;
+PFNGLBUFFERSUBDATAARBPROC glad_glBufferSubDataARB = NULL;
+PFNGLCALLLISTPROC glad_glCallList = NULL;
+PFNGLCALLLISTSPROC glad_glCallLists = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT = NULL;
+PFNGLCLEARPROC glad_glClear = NULL;
+PFNGLCLEARACCUMPROC glad_glClearAccum = NULL;
+PFNGLCLEARCOLORPROC glad_glClearColor = NULL;
+PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL;
+PFNGLCLEARINDEXPROC glad_glClearIndex = NULL;
+PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL;
+PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture = NULL;
+PFNGLCLIENTACTIVETEXTUREARBPROC glad_glClientActiveTextureARB = NULL;
+PFNGLCLIPPLANEPROC glad_glClipPlane = NULL;
+PFNGLCOLOR3BPROC glad_glColor3b = NULL;
+PFNGLCOLOR3BVPROC glad_glColor3bv = NULL;
+PFNGLCOLOR3DPROC glad_glColor3d = NULL;
+PFNGLCOLOR3DVPROC glad_glColor3dv = NULL;
+PFNGLCOLOR3FPROC glad_glColor3f = NULL;
+PFNGLCOLOR3FVPROC glad_glColor3fv = NULL;
+PFNGLCOLOR3IPROC glad_glColor3i = NULL;
+PFNGLCOLOR3IVPROC glad_glColor3iv = NULL;
+PFNGLCOLOR3SPROC glad_glColor3s = NULL;
+PFNGLCOLOR3SVPROC glad_glColor3sv = NULL;
+PFNGLCOLOR3UBPROC glad_glColor3ub = NULL;
+PFNGLCOLOR3UBVPROC glad_glColor3ubv = NULL;
+PFNGLCOLOR3UIPROC glad_glColor3ui = NULL;
+PFNGLCOLOR3UIVPROC glad_glColor3uiv = NULL;
+PFNGLCOLOR3USPROC glad_glColor3us = NULL;
+PFNGLCOLOR3USVPROC glad_glColor3usv = NULL;
+PFNGLCOLOR4BPROC glad_glColor4b = NULL;
+PFNGLCOLOR4BVPROC glad_glColor4bv = NULL;
+PFNGLCOLOR4DPROC glad_glColor4d = NULL;
+PFNGLCOLOR4DVPROC glad_glColor4dv = NULL;
+PFNGLCOLOR4FPROC glad_glColor4f = NULL;
+PFNGLCOLOR4FVPROC glad_glColor4fv = NULL;
+PFNGLCOLOR4IPROC glad_glColor4i = NULL;
+PFNGLCOLOR4IVPROC glad_glColor4iv = NULL;
+PFNGLCOLOR4SPROC glad_glColor4s = NULL;
+PFNGLCOLOR4SVPROC glad_glColor4sv = NULL;
+PFNGLCOLOR4UBPROC glad_glColor4ub = NULL;
+PFNGLCOLOR4UBVPROC glad_glColor4ubv = NULL;
+PFNGLCOLOR4UIPROC glad_glColor4ui = NULL;
+PFNGLCOLOR4UIVPROC glad_glColor4uiv = NULL;
+PFNGLCOLOR4USPROC glad_glColor4us = NULL;
+PFNGLCOLOR4USVPROC glad_glColor4usv = NULL;
+PFNGLCOLORMASKPROC glad_glColorMask = NULL;
+PFNGLCOLORMATERIALPROC glad_glColorMaterial = NULL;
+PFNGLCOLORPOINTERPROC glad_glColorPointer = NULL;
+PFNGLCOLORPOINTEREXTPROC glad_glColorPointerEXT = NULL;
+PFNGLCOLORSUBTABLEPROC glad_glColorSubTable = NULL;
+PFNGLCOLORTABLEPROC glad_glColorTable = NULL;
+PFNGLCOLORTABLEPARAMETERFVPROC glad_glColorTableParameterfv = NULL;
+PFNGLCOLORTABLEPARAMETERIVPROC glad_glColorTableParameteriv = NULL;
+PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL;
+PFNGLCOMPILESHADERARBPROC glad_glCompileShaderARB = NULL;
+PFNGLCONVOLUTIONFILTER1DPROC glad_glConvolutionFilter1D = NULL;
+PFNGLCONVOLUTIONFILTER2DPROC glad_glConvolutionFilter2D = NULL;
+PFNGLCONVOLUTIONPARAMETERFPROC glad_glConvolutionParameterf = NULL;
+PFNGLCONVOLUTIONPARAMETERFVPROC glad_glConvolutionParameterfv = NULL;
+PFNGLCONVOLUTIONPARAMETERIPROC glad_glConvolutionParameteri = NULL;
+PFNGLCONVOLUTIONPARAMETERIVPROC glad_glConvolutionParameteriv = NULL;
+PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL;
+PFNGLCOPYCOLORSUBTABLEPROC glad_glCopyColorSubTable = NULL;
+PFNGLCOPYCOLORTABLEPROC glad_glCopyColorTable = NULL;
+PFNGLCOPYCONVOLUTIONFILTER1DPROC glad_glCopyConvolutionFilter1D = NULL;
+PFNGLCOPYCONVOLUTIONFILTER2DPROC glad_glCopyConvolutionFilter2D = NULL;
+PFNGLCOPYPIXELSPROC glad_glCopyPixels = NULL;
+PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL;
+PFNGLCOPYTEXIMAGE1DEXTPROC glad_glCopyTexImage1DEXT = NULL;
+PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL;
+PFNGLCOPYTEXIMAGE2DEXTPROC glad_glCopyTexImage2DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL;
+PFNGLCOPYTEXSUBIMAGE1DEXTPROC glad_glCopyTexSubImage1DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL;
+PFNGLCOPYTEXSUBIMAGE2DEXTPROC glad_glCopyTexSubImage2DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL;
+PFNGLCOPYTEXSUBIMAGE3DEXTPROC glad_glCopyTexSubImage3DEXT = NULL;
+PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL;
+PFNGLCREATEPROGRAMOBJECTARBPROC glad_glCreateProgramObjectARB = NULL;
+PFNGLCREATESHADERPROC glad_glCreateShader = NULL;
+PFNGLCREATESHADEROBJECTARBPROC glad_glCreateShaderObjectARB = NULL;
+PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv = NULL;
+PFNGLCULLFACEPROC glad_glCullFace = NULL;
+PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback = NULL;
+PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl = NULL;
+PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert = NULL;
+PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL;
+PFNGLDELETEBUFFERSARBPROC glad_glDeleteBuffersARB = NULL;
+PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL;
+PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT = NULL;
+PFNGLDELETELISTSPROC glad_glDeleteLists = NULL;
+PFNGLDELETEOBJECTARBPROC glad_glDeleteObjectARB = NULL;
+PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines = NULL;
+PFNGLDELETEPROGRAMSARBPROC glad_glDeleteProgramsARB = NULL;
+PFNGLDELETEPROGRAMSNVPROC glad_glDeleteProgramsNV = NULL;
+PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL;
+PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT = NULL;
+PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL;
+PFNGLDELETETEXTURESEXTPROC glad_glDeleteTexturesEXT = NULL;
+PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL;
+PFNGLDEPTHMASKPROC glad_glDepthMask = NULL;
+PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL;
+PFNGLDETACHOBJECTARBPROC glad_glDetachObjectARB = NULL;
+PFNGLDETACHSHADERPROC glad_glDetachShader = NULL;
+PFNGLDISABLEPROC glad_glDisable = NULL;
+PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState = NULL;
+PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL;
+PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glad_glDisableVertexAttribArrayARB = NULL;
+PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL;
+PFNGLDRAWARRAYSEXTPROC glad_glDrawArraysEXT = NULL;
+PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL;
+PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL;
+PFNGLDRAWPIXELSPROC glad_glDrawPixels = NULL;
+PFNGLEDGEFLAGPROC glad_glEdgeFlag = NULL;
+PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer = NULL;
+PFNGLEDGEFLAGPOINTEREXTPROC glad_glEdgeFlagPointerEXT = NULL;
+PFNGLEDGEFLAGVPROC glad_glEdgeFlagv = NULL;
+PFNGLENABLEPROC glad_glEnable = NULL;
+PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState = NULL;
+PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL;
+PFNGLENABLEVERTEXATTRIBARRAYARBPROC glad_glEnableVertexAttribArrayARB = NULL;
+PFNGLENDPROC glad_glEnd = NULL;
+PFNGLENDLISTPROC glad_glEndList = NULL;
+PFNGLEVALCOORD1DPROC glad_glEvalCoord1d = NULL;
+PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv = NULL;
+PFNGLEVALCOORD1FPROC glad_glEvalCoord1f = NULL;
+PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv = NULL;
+PFNGLEVALCOORD2DPROC glad_glEvalCoord2d = NULL;
+PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv = NULL;
+PFNGLEVALCOORD2FPROC glad_glEvalCoord2f = NULL;
+PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv = NULL;
+PFNGLEVALMESH1PROC glad_glEvalMesh1 = NULL;
+PFNGLEVALMESH2PROC glad_glEvalMesh2 = NULL;
+PFNGLEVALPOINT1PROC glad_glEvalPoint1 = NULL;
+PFNGLEVALPOINT2PROC glad_glEvalPoint2 = NULL;
+PFNGLEXECUTEPROGRAMNVPROC glad_glExecuteProgramNV = NULL;
+PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer = NULL;
+PFNGLFINISHPROC glad_glFinish = NULL;
+PFNGLFLUSHPROC glad_glFlush = NULL;
+PFNGLFOGFPROC glad_glFogf = NULL;
+PFNGLFOGFVPROC glad_glFogfv = NULL;
+PFNGLFOGIPROC glad_glFogi = NULL;
+PFNGLFOGIVPROC glad_glFogiv = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREARBPROC glad_glFramebufferTextureARB = NULL;
+PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREFACEARBPROC glad_glFramebufferTextureFaceARB = NULL;
+PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC glad_glFramebufferTextureFaceEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERARBPROC glad_glFramebufferTextureLayerARB = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC glad_glFramebufferTextureLayerEXT = NULL;
+PFNGLFRONTFACEPROC glad_glFrontFace = NULL;
+PFNGLFRUSTUMPROC glad_glFrustum = NULL;
+PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL;
+PFNGLGENBUFFERSARBPROC glad_glGenBuffersARB = NULL;
+PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL;
+PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT = NULL;
+PFNGLGENLISTSPROC glad_glGenLists = NULL;
+PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines = NULL;
+PFNGLGENPROGRAMSARBPROC glad_glGenProgramsARB = NULL;
+PFNGLGENPROGRAMSNVPROC glad_glGenProgramsNV = NULL;
+PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL;
+PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT = NULL;
+PFNGLGENTEXTURESPROC glad_glGenTextures = NULL;
+PFNGLGENTEXTURESEXTPROC glad_glGenTexturesEXT = NULL;
+PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL;
+PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT = NULL;
+PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL;
+PFNGLGETACTIVEATTRIBARBPROC glad_glGetActiveAttribARB = NULL;
+PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL;
+PFNGLGETACTIVEUNIFORMARBPROC glad_glGetActiveUniformARB = NULL;
+PFNGLGETATTACHEDOBJECTSARBPROC glad_glGetAttachedObjectsARB = NULL;
+PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL;
+PFNGLGETATTRIBLOCATIONARBPROC glad_glGetAttribLocationARB = NULL;
+PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL;
+PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL;
+PFNGLGETBUFFERPARAMETERIVARBPROC glad_glGetBufferParameterivARB = NULL;
+PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL;
+PFNGLGETBUFFERPOINTERVARBPROC glad_glGetBufferPointervARB = NULL;
+PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL;
+PFNGLGETBUFFERSUBDATAARBPROC glad_glGetBufferSubDataARB = NULL;
+PFNGLGETCLIPPLANEPROC glad_glGetClipPlane = NULL;
+PFNGLGETCOLORTABLEPROC glad_glGetColorTable = NULL;
+PFNGLGETCOLORTABLEPARAMETERFVPROC glad_glGetColorTableParameterfv = NULL;
+PFNGLGETCOLORTABLEPARAMETERIVPROC glad_glGetColorTableParameteriv = NULL;
+PFNGLGETCONVOLUTIONFILTERPROC glad_glGetConvolutionFilter = NULL;
+PFNGLGETCONVOLUTIONPARAMETERFVPROC glad_glGetConvolutionParameterfv = NULL;
+PFNGLGETCONVOLUTIONPARAMETERIVPROC glad_glGetConvolutionParameteriv = NULL;
+PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog = NULL;
+PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL;
+PFNGLGETERRORPROC glad_glGetError = NULL;
+PFNGLGETFLOATVPROC glad_glGetFloatv = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT = NULL;
+PFNGLGETHANDLEARBPROC glad_glGetHandleARB = NULL;
+PFNGLGETHISTOGRAMPROC glad_glGetHistogram = NULL;
+PFNGLGETHISTOGRAMPARAMETERFVPROC glad_glGetHistogramParameterfv = NULL;
+PFNGLGETHISTOGRAMPARAMETERIVPROC glad_glGetHistogramParameteriv = NULL;
+PFNGLGETINFOLOGARBPROC glad_glGetInfoLogARB = NULL;
+PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL;
+PFNGLGETLIGHTFVPROC glad_glGetLightfv = NULL;
+PFNGLGETLIGHTIVPROC glad_glGetLightiv = NULL;
+PFNGLGETMAPDVPROC glad_glGetMapdv = NULL;
+PFNGLGETMAPFVPROC glad_glGetMapfv = NULL;
+PFNGLGETMAPIVPROC glad_glGetMapiv = NULL;
+PFNGLGETMATERIALFVPROC glad_glGetMaterialfv = NULL;
+PFNGLGETMATERIALIVPROC glad_glGetMaterialiv = NULL;
+PFNGLGETMINMAXPROC glad_glGetMinmax = NULL;
+PFNGLGETMINMAXPARAMETERFVPROC glad_glGetMinmaxParameterfv = NULL;
+PFNGLGETMINMAXPARAMETERIVPROC glad_glGetMinmaxParameteriv = NULL;
+PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel = NULL;
+PFNGLGETOBJECTPARAMETERFVARBPROC glad_glGetObjectParameterfvARB = NULL;
+PFNGLGETOBJECTPARAMETERIVARBPROC glad_glGetObjectParameterivARB = NULL;
+PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel = NULL;
+PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv = NULL;
+PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv = NULL;
+PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv = NULL;
+PFNGLGETPOINTERVPROC glad_glGetPointerv = NULL;
+PFNGLGETPOINTERVEXTPROC glad_glGetPointervEXT = NULL;
+PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple = NULL;
+PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary = NULL;
+PFNGLGETPROGRAMENVPARAMETERDVARBPROC glad_glGetProgramEnvParameterdvARB = NULL;
+PFNGLGETPROGRAMENVPARAMETERFVARBPROC glad_glGetProgramEnvParameterfvARB = NULL;
+PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glad_glGetProgramLocalParameterdvARB = NULL;
+PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glad_glGetProgramLocalParameterfvARB = NULL;
+PFNGLGETPROGRAMPARAMETERDVNVPROC glad_glGetProgramParameterdvNV = NULL;
+PFNGLGETPROGRAMPARAMETERFVNVPROC glad_glGetProgramParameterfvNV = NULL;
+PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog = NULL;
+PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv = NULL;
+PFNGLGETPROGRAMSTRINGARBPROC glad_glGetProgramStringARB = NULL;
+PFNGLGETPROGRAMSTRINGNVPROC glad_glGetProgramStringNV = NULL;
+PFNGLGETPROGRAMIVARBPROC glad_glGetProgramivARB = NULL;
+PFNGLGETPROGRAMIVNVPROC glad_glGetProgramivNV = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT = NULL;
+PFNGLGETSEPARABLEFILTERPROC glad_glGetSeparableFilter = NULL;
+PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL;
+PFNGLGETSHADERSOURCEARBPROC glad_glGetShaderSourceARB = NULL;
+PFNGLGETSTRINGPROC glad_glGetString = NULL;
+PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv = NULL;
+PFNGLGETTEXENVIVPROC glad_glGetTexEnviv = NULL;
+PFNGLGETTEXGENDVPROC glad_glGetTexGendv = NULL;
+PFNGLGETTEXGENFVPROC glad_glGetTexGenfv = NULL;
+PFNGLGETTEXGENIVPROC glad_glGetTexGeniv = NULL;
+PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL;
+PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL;
+PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL;
+PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL;
+PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL;
+PFNGLGETTRACKMATRIXIVNVPROC glad_glGetTrackMatrixivNV = NULL;
+PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL;
+PFNGLGETUNIFORMLOCATIONARBPROC glad_glGetUniformLocationARB = NULL;
+PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL;
+PFNGLGETUNIFORMFVARBPROC glad_glGetUniformfvARB = NULL;
+PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL;
+PFNGLGETUNIFORMIVARBPROC glad_glGetUniformivARB = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVARBPROC glad_glGetVertexAttribPointervARB = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVNVPROC glad_glGetVertexAttribPointervNV = NULL;
+PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL;
+PFNGLGETVERTEXATTRIBDVARBPROC glad_glGetVertexAttribdvARB = NULL;
+PFNGLGETVERTEXATTRIBDVNVPROC glad_glGetVertexAttribdvNV = NULL;
+PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL;
+PFNGLGETVERTEXATTRIBFVARBPROC glad_glGetVertexAttribfvARB = NULL;
+PFNGLGETVERTEXATTRIBFVNVPROC glad_glGetVertexAttribfvNV = NULL;
+PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL;
+PFNGLGETVERTEXATTRIBIVARBPROC glad_glGetVertexAttribivARB = NULL;
+PFNGLGETVERTEXATTRIBIVNVPROC glad_glGetVertexAttribivNV = NULL;
+PFNGLHINTPROC glad_glHint = NULL;
+PFNGLHISTOGRAMPROC glad_glHistogram = NULL;
+PFNGLINDEXMASKPROC glad_glIndexMask = NULL;
+PFNGLINDEXPOINTERPROC glad_glIndexPointer = NULL;
+PFNGLINDEXPOINTEREXTPROC glad_glIndexPointerEXT = NULL;
+PFNGLINDEXDPROC glad_glIndexd = NULL;
+PFNGLINDEXDVPROC glad_glIndexdv = NULL;
+PFNGLINDEXFPROC glad_glIndexf = NULL;
+PFNGLINDEXFVPROC glad_glIndexfv = NULL;
+PFNGLINDEXIPROC glad_glIndexi = NULL;
+PFNGLINDEXIVPROC glad_glIndexiv = NULL;
+PFNGLINDEXSPROC glad_glIndexs = NULL;
+PFNGLINDEXSVPROC glad_glIndexsv = NULL;
+PFNGLINDEXUBPROC glad_glIndexub = NULL;
+PFNGLINDEXUBVPROC glad_glIndexubv = NULL;
+PFNGLINITNAMESPROC glad_glInitNames = NULL;
+PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays = NULL;
+PFNGLISBUFFERPROC glad_glIsBuffer = NULL;
+PFNGLISBUFFERARBPROC glad_glIsBufferARB = NULL;
+PFNGLISENABLEDPROC glad_glIsEnabled = NULL;
+PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL;
+PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT = NULL;
+PFNGLISLISTPROC glad_glIsList = NULL;
+PFNGLISPROGRAMARBPROC glad_glIsProgramARB = NULL;
+PFNGLISPROGRAMNVPROC glad_glIsProgramNV = NULL;
+PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline = NULL;
+PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL;
+PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT = NULL;
+PFNGLISTEXTUREPROC glad_glIsTexture = NULL;
+PFNGLISTEXTUREEXTPROC glad_glIsTextureEXT = NULL;
+PFNGLLIGHTMODELFPROC glad_glLightModelf = NULL;
+PFNGLLIGHTMODELFVPROC glad_glLightModelfv = NULL;
+PFNGLLIGHTMODELIPROC glad_glLightModeli = NULL;
+PFNGLLIGHTMODELIVPROC glad_glLightModeliv = NULL;
+PFNGLLIGHTFPROC glad_glLightf = NULL;
+PFNGLLIGHTFVPROC glad_glLightfv = NULL;
+PFNGLLIGHTIPROC glad_glLighti = NULL;
+PFNGLLIGHTIVPROC glad_glLightiv = NULL;
+PFNGLLINESTIPPLEPROC glad_glLineStipple = NULL;
+PFNGLLINEWIDTHPROC glad_glLineWidth = NULL;
+PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL;
+PFNGLLINKPROGRAMARBPROC glad_glLinkProgramARB = NULL;
+PFNGLLISTBASEPROC glad_glListBase = NULL;
+PFNGLLOADIDENTITYPROC glad_glLoadIdentity = NULL;
+PFNGLLOADMATRIXDPROC glad_glLoadMatrixd = NULL;
+PFNGLLOADMATRIXFPROC glad_glLoadMatrixf = NULL;
+PFNGLLOADNAMEPROC glad_glLoadName = NULL;
+PFNGLLOADPROGRAMNVPROC glad_glLoadProgramNV = NULL;
+PFNGLLOGICOPPROC glad_glLogicOp = NULL;
+PFNGLMAP1DPROC glad_glMap1d = NULL;
+PFNGLMAP1FPROC glad_glMap1f = NULL;
+PFNGLMAP2DPROC glad_glMap2d = NULL;
+PFNGLMAP2FPROC glad_glMap2f = NULL;
+PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL;
+PFNGLMAPBUFFERARBPROC glad_glMapBufferARB = NULL;
+PFNGLMAPGRID1DPROC glad_glMapGrid1d = NULL;
+PFNGLMAPGRID1FPROC glad_glMapGrid1f = NULL;
+PFNGLMAPGRID2DPROC glad_glMapGrid2d = NULL;
+PFNGLMAPGRID2FPROC glad_glMapGrid2f = NULL;
+PFNGLMATERIALFPROC glad_glMaterialf = NULL;
+PFNGLMATERIALFVPROC glad_glMaterialfv = NULL;
+PFNGLMATERIALIPROC glad_glMateriali = NULL;
+PFNGLMATERIALIVPROC glad_glMaterialiv = NULL;
+PFNGLMATRIXMODEPROC glad_glMatrixMode = NULL;
+PFNGLMINMAXPROC glad_glMinmax = NULL;
+PFNGLMULTMATRIXDPROC glad_glMultMatrixd = NULL;
+PFNGLMULTMATRIXFPROC glad_glMultMatrixf = NULL;
+PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d = NULL;
+PFNGLMULTITEXCOORD1DARBPROC glad_glMultiTexCoord1dARB = NULL;
+PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv = NULL;
+PFNGLMULTITEXCOORD1DVARBPROC glad_glMultiTexCoord1dvARB = NULL;
+PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f = NULL;
+PFNGLMULTITEXCOORD1FARBPROC glad_glMultiTexCoord1fARB = NULL;
+PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv = NULL;
+PFNGLMULTITEXCOORD1FVARBPROC glad_glMultiTexCoord1fvARB = NULL;
+PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i = NULL;
+PFNGLMULTITEXCOORD1IARBPROC glad_glMultiTexCoord1iARB = NULL;
+PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv = NULL;
+PFNGLMULTITEXCOORD1IVARBPROC glad_glMultiTexCoord1ivARB = NULL;
+PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s = NULL;
+PFNGLMULTITEXCOORD1SARBPROC glad_glMultiTexCoord1sARB = NULL;
+PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv = NULL;
+PFNGLMULTITEXCOORD1SVARBPROC glad_glMultiTexCoord1svARB = NULL;
+PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d = NULL;
+PFNGLMULTITEXCOORD2DARBPROC glad_glMultiTexCoord2dARB = NULL;
+PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv = NULL;
+PFNGLMULTITEXCOORD2DVARBPROC glad_glMultiTexCoord2dvARB = NULL;
+PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f = NULL;
+PFNGLMULTITEXCOORD2FARBPROC glad_glMultiTexCoord2fARB = NULL;
+PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv = NULL;
+PFNGLMULTITEXCOORD2FVARBPROC glad_glMultiTexCoord2fvARB = NULL;
+PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i = NULL;
+PFNGLMULTITEXCOORD2IARBPROC glad_glMultiTexCoord2iARB = NULL;
+PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv = NULL;
+PFNGLMULTITEXCOORD2IVARBPROC glad_glMultiTexCoord2ivARB = NULL;
+PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s = NULL;
+PFNGLMULTITEXCOORD2SARBPROC glad_glMultiTexCoord2sARB = NULL;
+PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv = NULL;
+PFNGLMULTITEXCOORD2SVARBPROC glad_glMultiTexCoord2svARB = NULL;
+PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d = NULL;
+PFNGLMULTITEXCOORD3DARBPROC glad_glMultiTexCoord3dARB = NULL;
+PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv = NULL;
+PFNGLMULTITEXCOORD3DVARBPROC glad_glMultiTexCoord3dvARB = NULL;
+PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f = NULL;
+PFNGLMULTITEXCOORD3FARBPROC glad_glMultiTexCoord3fARB = NULL;
+PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv = NULL;
+PFNGLMULTITEXCOORD3FVARBPROC glad_glMultiTexCoord3fvARB = NULL;
+PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i = NULL;
+PFNGLMULTITEXCOORD3IARBPROC glad_glMultiTexCoord3iARB = NULL;
+PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv = NULL;
+PFNGLMULTITEXCOORD3IVARBPROC glad_glMultiTexCoord3ivARB = NULL;
+PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s = NULL;
+PFNGLMULTITEXCOORD3SARBPROC glad_glMultiTexCoord3sARB = NULL;
+PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv = NULL;
+PFNGLMULTITEXCOORD3SVARBPROC glad_glMultiTexCoord3svARB = NULL;
+PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d = NULL;
+PFNGLMULTITEXCOORD4DARBPROC glad_glMultiTexCoord4dARB = NULL;
+PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv = NULL;
+PFNGLMULTITEXCOORD4DVARBPROC glad_glMultiTexCoord4dvARB = NULL;
+PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f = NULL;
+PFNGLMULTITEXCOORD4FARBPROC glad_glMultiTexCoord4fARB = NULL;
+PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv = NULL;
+PFNGLMULTITEXCOORD4FVARBPROC glad_glMultiTexCoord4fvARB = NULL;
+PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i = NULL;
+PFNGLMULTITEXCOORD4IARBPROC glad_glMultiTexCoord4iARB = NULL;
+PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv = NULL;
+PFNGLMULTITEXCOORD4IVARBPROC glad_glMultiTexCoord4ivARB = NULL;
+PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s = NULL;
+PFNGLMULTITEXCOORD4SARBPROC glad_glMultiTexCoord4sARB = NULL;
+PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv = NULL;
+PFNGLMULTITEXCOORD4SVARBPROC glad_glMultiTexCoord4svARB = NULL;
+PFNGLNEWLISTPROC glad_glNewList = NULL;
+PFNGLNORMAL3BPROC glad_glNormal3b = NULL;
+PFNGLNORMAL3BVPROC glad_glNormal3bv = NULL;
+PFNGLNORMAL3DPROC glad_glNormal3d = NULL;
+PFNGLNORMAL3DVPROC glad_glNormal3dv = NULL;
+PFNGLNORMAL3FPROC glad_glNormal3f = NULL;
+PFNGLNORMAL3FVPROC glad_glNormal3fv = NULL;
+PFNGLNORMAL3IPROC glad_glNormal3i = NULL;
+PFNGLNORMAL3IVPROC glad_glNormal3iv = NULL;
+PFNGLNORMAL3SPROC glad_glNormal3s = NULL;
+PFNGLNORMAL3SVPROC glad_glNormal3sv = NULL;
+PFNGLNORMALPOINTERPROC glad_glNormalPointer = NULL;
+PFNGLNORMALPOINTEREXTPROC glad_glNormalPointerEXT = NULL;
+PFNGLOBJECTLABELPROC glad_glObjectLabel = NULL;
+PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel = NULL;
+PFNGLORTHOPROC glad_glOrtho = NULL;
+PFNGLPASSTHROUGHPROC glad_glPassThrough = NULL;
+PFNGLPIXELMAPFVPROC glad_glPixelMapfv = NULL;
+PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv = NULL;
+PFNGLPIXELMAPUSVPROC glad_glPixelMapusv = NULL;
+PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL;
+PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL;
+PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf = NULL;
+PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi = NULL;
+PFNGLPIXELZOOMPROC glad_glPixelZoom = NULL;
+PFNGLPOINTSIZEPROC glad_glPointSize = NULL;
+PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL;
+PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL;
+PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple = NULL;
+PFNGLPOPATTRIBPROC glad_glPopAttrib = NULL;
+PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib = NULL;
+PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup = NULL;
+PFNGLPOPMATRIXPROC glad_glPopMatrix = NULL;
+PFNGLPOPNAMEPROC glad_glPopName = NULL;
+PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures = NULL;
+PFNGLPRIORITIZETEXTURESEXTPROC glad_glPrioritizeTexturesEXT = NULL;
+PFNGLPROGRAMBINARYPROC glad_glProgramBinary = NULL;
+PFNGLPROGRAMENVPARAMETER4DARBPROC glad_glProgramEnvParameter4dARB = NULL;
+PFNGLPROGRAMENVPARAMETER4DVARBPROC glad_glProgramEnvParameter4dvARB = NULL;
+PFNGLPROGRAMENVPARAMETER4FARBPROC glad_glProgramEnvParameter4fARB = NULL;
+PFNGLPROGRAMENVPARAMETER4FVARBPROC glad_glProgramEnvParameter4fvARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4DARBPROC glad_glProgramLocalParameter4dARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glad_glProgramLocalParameter4dvARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4FARBPROC glad_glProgramLocalParameter4fARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glad_glProgramLocalParameter4fvARB = NULL;
+PFNGLPROGRAMPARAMETER4DNVPROC glad_glProgramParameter4dNV = NULL;
+PFNGLPROGRAMPARAMETER4DVNVPROC glad_glProgramParameter4dvNV = NULL;
+PFNGLPROGRAMPARAMETER4FNVPROC glad_glProgramParameter4fNV = NULL;
+PFNGLPROGRAMPARAMETER4FVNVPROC glad_glProgramParameter4fvNV = NULL;
+PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri = NULL;
+PFNGLPROGRAMPARAMETERIARBPROC glad_glProgramParameteriARB = NULL;
+PFNGLPROGRAMPARAMETERIEXTPROC glad_glProgramParameteriEXT = NULL;
+PFNGLPROGRAMPARAMETERS4DVNVPROC glad_glProgramParameters4dvNV = NULL;
+PFNGLPROGRAMPARAMETERS4FVNVPROC glad_glProgramParameters4fvNV = NULL;
+PFNGLPROGRAMSTRINGARBPROC glad_glProgramStringARB = NULL;
+PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d = NULL;
+PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv = NULL;
+PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f = NULL;
+PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv = NULL;
+PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i = NULL;
+PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv = NULL;
+PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui = NULL;
+PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv = NULL;
+PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d = NULL;
+PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv = NULL;
+PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f = NULL;
+PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv = NULL;
+PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i = NULL;
+PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv = NULL;
+PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui = NULL;
+PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv = NULL;
+PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d = NULL;
+PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv = NULL;
+PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f = NULL;
+PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv = NULL;
+PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i = NULL;
+PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv = NULL;
+PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui = NULL;
+PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv = NULL;
+PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d = NULL;
+PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv = NULL;
+PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f = NULL;
+PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv = NULL;
+PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i = NULL;
+PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv = NULL;
+PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui = NULL;
+PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv = NULL;
+PFNGLPROGRAMVERTEXLIMITNVPROC glad_glProgramVertexLimitNV = NULL;
+PFNGLPUSHATTRIBPROC glad_glPushAttrib = NULL;
+PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib = NULL;
+PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup = NULL;
+PFNGLPUSHMATRIXPROC glad_glPushMatrix = NULL;
+PFNGLPUSHNAMEPROC glad_glPushName = NULL;
+PFNGLRASTERPOS2DPROC glad_glRasterPos2d = NULL;
+PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv = NULL;
+PFNGLRASTERPOS2FPROC glad_glRasterPos2f = NULL;
+PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv = NULL;
+PFNGLRASTERPOS2IPROC glad_glRasterPos2i = NULL;
+PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv = NULL;
+PFNGLRASTERPOS2SPROC glad_glRasterPos2s = NULL;
+PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv = NULL;
+PFNGLRASTERPOS3DPROC glad_glRasterPos3d = NULL;
+PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv = NULL;
+PFNGLRASTERPOS3FPROC glad_glRasterPos3f = NULL;
+PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv = NULL;
+PFNGLRASTERPOS3IPROC glad_glRasterPos3i = NULL;
+PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv = NULL;
+PFNGLRASTERPOS3SPROC glad_glRasterPos3s = NULL;
+PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv = NULL;
+PFNGLRASTERPOS4DPROC glad_glRasterPos4d = NULL;
+PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv = NULL;
+PFNGLRASTERPOS4FPROC glad_glRasterPos4f = NULL;
+PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv = NULL;
+PFNGLRASTERPOS4IPROC glad_glRasterPos4i = NULL;
+PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv = NULL;
+PFNGLRASTERPOS4SPROC glad_glRasterPos4s = NULL;
+PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv = NULL;
+PFNGLREADBUFFERPROC glad_glReadBuffer = NULL;
+PFNGLREADPIXELSPROC glad_glReadPixels = NULL;
+PFNGLRECTDPROC glad_glRectd = NULL;
+PFNGLRECTDVPROC glad_glRectdv = NULL;
+PFNGLRECTFPROC glad_glRectf = NULL;
+PFNGLRECTFVPROC glad_glRectfv = NULL;
+PFNGLRECTIPROC glad_glRecti = NULL;
+PFNGLRECTIVPROC glad_glRectiv = NULL;
+PFNGLRECTSPROC glad_glRects = NULL;
+PFNGLRECTSVPROC glad_glRectsv = NULL;
+PFNGLRENDERMODEPROC glad_glRenderMode = NULL;
+PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL;
+PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT = NULL;
+PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL;
+PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glRenderbufferStorageMultisampleEXT = NULL;
+PFNGLREQUESTRESIDENTPROGRAMSNVPROC glad_glRequestResidentProgramsNV = NULL;
+PFNGLRESETHISTOGRAMPROC glad_glResetHistogram = NULL;
+PFNGLRESETMINMAXPROC glad_glResetMinmax = NULL;
+PFNGLROTATEDPROC glad_glRotated = NULL;
+PFNGLROTATEFPROC glad_glRotatef = NULL;
+PFNGLSCALEDPROC glad_glScaled = NULL;
+PFNGLSCALEFPROC glad_glScalef = NULL;
+PFNGLSCISSORPROC glad_glScissor = NULL;
+PFNGLSELECTBUFFERPROC glad_glSelectBuffer = NULL;
+PFNGLSEPARABLEFILTER2DPROC glad_glSeparableFilter2D = NULL;
+PFNGLSHADEMODELPROC glad_glShadeModel = NULL;
+PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL;
+PFNGLSHADERSOURCEARBPROC glad_glShaderSourceARB = NULL;
+PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL;
+PFNGLSTENCILMASKPROC glad_glStencilMask = NULL;
+PFNGLSTENCILOPPROC glad_glStencilOp = NULL;
+PFNGLTEXCOORD1DPROC glad_glTexCoord1d = NULL;
+PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv = NULL;
+PFNGLTEXCOORD1FPROC glad_glTexCoord1f = NULL;
+PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv = NULL;
+PFNGLTEXCOORD1IPROC glad_glTexCoord1i = NULL;
+PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv = NULL;
+PFNGLTEXCOORD1SPROC glad_glTexCoord1s = NULL;
+PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv = NULL;
+PFNGLTEXCOORD2DPROC glad_glTexCoord2d = NULL;
+PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv = NULL;
+PFNGLTEXCOORD2FPROC glad_glTexCoord2f = NULL;
+PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv = NULL;
+PFNGLTEXCOORD2IPROC glad_glTexCoord2i = NULL;
+PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv = NULL;
+PFNGLTEXCOORD2SPROC glad_glTexCoord2s = NULL;
+PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv = NULL;
+PFNGLTEXCOORD3DPROC glad_glTexCoord3d = NULL;
+PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv = NULL;
+PFNGLTEXCOORD3FPROC glad_glTexCoord3f = NULL;
+PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv = NULL;
+PFNGLTEXCOORD3IPROC glad_glTexCoord3i = NULL;
+PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv = NULL;
+PFNGLTEXCOORD3SPROC glad_glTexCoord3s = NULL;
+PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv = NULL;
+PFNGLTEXCOORD4DPROC glad_glTexCoord4d = NULL;
+PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv = NULL;
+PFNGLTEXCOORD4FPROC glad_glTexCoord4f = NULL;
+PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv = NULL;
+PFNGLTEXCOORD4IPROC glad_glTexCoord4i = NULL;
+PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv = NULL;
+PFNGLTEXCOORD4SPROC glad_glTexCoord4s = NULL;
+PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv = NULL;
+PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer = NULL;
+PFNGLTEXCOORDPOINTEREXTPROC glad_glTexCoordPointerEXT = NULL;
+PFNGLTEXENVFPROC glad_glTexEnvf = NULL;
+PFNGLTEXENVFVPROC glad_glTexEnvfv = NULL;
+PFNGLTEXENVIPROC glad_glTexEnvi = NULL;
+PFNGLTEXENVIVPROC glad_glTexEnviv = NULL;
+PFNGLTEXGENDPROC glad_glTexGend = NULL;
+PFNGLTEXGENDVPROC glad_glTexGendv = NULL;
+PFNGLTEXGENFPROC glad_glTexGenf = NULL;
+PFNGLTEXGENFVPROC glad_glTexGenfv = NULL;
+PFNGLTEXGENIPROC glad_glTexGeni = NULL;
+PFNGLTEXGENIVPROC glad_glTexGeniv = NULL;
+PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL;
+PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL;
+PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL;
+PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL;
+PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL;
+PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL;
+PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL;
+PFNGLTEXSUBIMAGE1DEXTPROC glad_glTexSubImage1DEXT = NULL;
+PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL;
+PFNGLTEXSUBIMAGE2DEXTPROC glad_glTexSubImage2DEXT = NULL;
+PFNGLTRACKMATRIXNVPROC glad_glTrackMatrixNV = NULL;
+PFNGLTRANSLATEDPROC glad_glTranslated = NULL;
+PFNGLTRANSLATEFPROC glad_glTranslatef = NULL;
+PFNGLUNIFORM1FPROC glad_glUniform1f = NULL;
+PFNGLUNIFORM1FARBPROC glad_glUniform1fARB = NULL;
+PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL;
+PFNGLUNIFORM1FVARBPROC glad_glUniform1fvARB = NULL;
+PFNGLUNIFORM1IPROC glad_glUniform1i = NULL;
+PFNGLUNIFORM1IARBPROC glad_glUniform1iARB = NULL;
+PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL;
+PFNGLUNIFORM1IVARBPROC glad_glUniform1ivARB = NULL;
+PFNGLUNIFORM2FPROC glad_glUniform2f = NULL;
+PFNGLUNIFORM2FARBPROC glad_glUniform2fARB = NULL;
+PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL;
+PFNGLUNIFORM2FVARBPROC glad_glUniform2fvARB = NULL;
+PFNGLUNIFORM2IPROC glad_glUniform2i = NULL;
+PFNGLUNIFORM2IARBPROC glad_glUniform2iARB = NULL;
+PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL;
+PFNGLUNIFORM2IVARBPROC glad_glUniform2ivARB = NULL;
+PFNGLUNIFORM3FPROC glad_glUniform3f = NULL;
+PFNGLUNIFORM3FARBPROC glad_glUniform3fARB = NULL;
+PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL;
+PFNGLUNIFORM3FVARBPROC glad_glUniform3fvARB = NULL;
+PFNGLUNIFORM3IPROC glad_glUniform3i = NULL;
+PFNGLUNIFORM3IARBPROC glad_glUniform3iARB = NULL;
+PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL;
+PFNGLUNIFORM3IVARBPROC glad_glUniform3ivARB = NULL;
+PFNGLUNIFORM4FPROC glad_glUniform4f = NULL;
+PFNGLUNIFORM4FARBPROC glad_glUniform4fARB = NULL;
+PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL;
+PFNGLUNIFORM4FVARBPROC glad_glUniform4fvARB = NULL;
+PFNGLUNIFORM4IPROC glad_glUniform4i = NULL;
+PFNGLUNIFORM4IARBPROC glad_glUniform4iARB = NULL;
+PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL;
+PFNGLUNIFORM4IVARBPROC glad_glUniform4ivARB = NULL;
+PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL;
+PFNGLUNIFORMMATRIX2FVARBPROC glad_glUniformMatrix2fvARB = NULL;
+PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL;
+PFNGLUNIFORMMATRIX3FVARBPROC glad_glUniformMatrix3fvARB = NULL;
+PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL;
+PFNGLUNIFORMMATRIX4FVARBPROC glad_glUniformMatrix4fvARB = NULL;
+PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL;
+PFNGLUNMAPBUFFERARBPROC glad_glUnmapBufferARB = NULL;
+PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL;
+PFNGLUSEPROGRAMOBJECTARBPROC glad_glUseProgramObjectARB = NULL;
+PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages = NULL;
+PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL;
+PFNGLVALIDATEPROGRAMARBPROC glad_glValidateProgramARB = NULL;
+PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline = NULL;
+PFNGLVERTEX2DPROC glad_glVertex2d = NULL;
+PFNGLVERTEX2DVPROC glad_glVertex2dv = NULL;
+PFNGLVERTEX2FPROC glad_glVertex2f = NULL;
+PFNGLVERTEX2FVPROC glad_glVertex2fv = NULL;
+PFNGLVERTEX2IPROC glad_glVertex2i = NULL;
+PFNGLVERTEX2IVPROC glad_glVertex2iv = NULL;
+PFNGLVERTEX2SPROC glad_glVertex2s = NULL;
+PFNGLVERTEX2SVPROC glad_glVertex2sv = NULL;
+PFNGLVERTEX3DPROC glad_glVertex3d = NULL;
+PFNGLVERTEX3DVPROC glad_glVertex3dv = NULL;
+PFNGLVERTEX3FPROC glad_glVertex3f = NULL;
+PFNGLVERTEX3FVPROC glad_glVertex3fv = NULL;
+PFNGLVERTEX3IPROC glad_glVertex3i = NULL;
+PFNGLVERTEX3IVPROC glad_glVertex3iv = NULL;
+PFNGLVERTEX3SPROC glad_glVertex3s = NULL;
+PFNGLVERTEX3SVPROC glad_glVertex3sv = NULL;
+PFNGLVERTEX4DPROC glad_glVertex4d = NULL;
+PFNGLVERTEX4DVPROC glad_glVertex4dv = NULL;
+PFNGLVERTEX4FPROC glad_glVertex4f = NULL;
+PFNGLVERTEX4FVPROC glad_glVertex4fv = NULL;
+PFNGLVERTEX4IPROC glad_glVertex4i = NULL;
+PFNGLVERTEX4IVPROC glad_glVertex4iv = NULL;
+PFNGLVERTEX4SPROC glad_glVertex4s = NULL;
+PFNGLVERTEX4SVPROC glad_glVertex4sv = NULL;
+PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL;
+PFNGLVERTEXATTRIB1DARBPROC glad_glVertexAttrib1dARB = NULL;
+PFNGLVERTEXATTRIB1DNVPROC glad_glVertexAttrib1dNV = NULL;
+PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL;
+PFNGLVERTEXATTRIB1DVARBPROC glad_glVertexAttrib1dvARB = NULL;
+PFNGLVERTEXATTRIB1DVNVPROC glad_glVertexAttrib1dvNV = NULL;
+PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL;
+PFNGLVERTEXATTRIB1FARBPROC glad_glVertexAttrib1fARB = NULL;
+PFNGLVERTEXATTRIB1FNVPROC glad_glVertexAttrib1fNV = NULL;
+PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL;
+PFNGLVERTEXATTRIB1FVARBPROC glad_glVertexAttrib1fvARB = NULL;
+PFNGLVERTEXATTRIB1FVNVPROC glad_glVertexAttrib1fvNV = NULL;
+PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL;
+PFNGLVERTEXATTRIB1SARBPROC glad_glVertexAttrib1sARB = NULL;
+PFNGLVERTEXATTRIB1SNVPROC glad_glVertexAttrib1sNV = NULL;
+PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL;
+PFNGLVERTEXATTRIB1SVARBPROC glad_glVertexAttrib1svARB = NULL;
+PFNGLVERTEXATTRIB1SVNVPROC glad_glVertexAttrib1svNV = NULL;
+PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL;
+PFNGLVERTEXATTRIB2DARBPROC glad_glVertexAttrib2dARB = NULL;
+PFNGLVERTEXATTRIB2DNVPROC glad_glVertexAttrib2dNV = NULL;
+PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL;
+PFNGLVERTEXATTRIB2DVARBPROC glad_glVertexAttrib2dvARB = NULL;
+PFNGLVERTEXATTRIB2DVNVPROC glad_glVertexAttrib2dvNV = NULL;
+PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL;
+PFNGLVERTEXATTRIB2FARBPROC glad_glVertexAttrib2fARB = NULL;
+PFNGLVERTEXATTRIB2FNVPROC glad_glVertexAttrib2fNV = NULL;
+PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL;
+PFNGLVERTEXATTRIB2FVARBPROC glad_glVertexAttrib2fvARB = NULL;
+PFNGLVERTEXATTRIB2FVNVPROC glad_glVertexAttrib2fvNV = NULL;
+PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL;
+PFNGLVERTEXATTRIB2SARBPROC glad_glVertexAttrib2sARB = NULL;
+PFNGLVERTEXATTRIB2SNVPROC glad_glVertexAttrib2sNV = NULL;
+PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL;
+PFNGLVERTEXATTRIB2SVARBPROC glad_glVertexAttrib2svARB = NULL;
+PFNGLVERTEXATTRIB2SVNVPROC glad_glVertexAttrib2svNV = NULL;
+PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL;
+PFNGLVERTEXATTRIB3DARBPROC glad_glVertexAttrib3dARB = NULL;
+PFNGLVERTEXATTRIB3DNVPROC glad_glVertexAttrib3dNV = NULL;
+PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL;
+PFNGLVERTEXATTRIB3DVARBPROC glad_glVertexAttrib3dvARB = NULL;
+PFNGLVERTEXATTRIB3DVNVPROC glad_glVertexAttrib3dvNV = NULL;
+PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL;
+PFNGLVERTEXATTRIB3FARBPROC glad_glVertexAttrib3fARB = NULL;
+PFNGLVERTEXATTRIB3FNVPROC glad_glVertexAttrib3fNV = NULL;
+PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL;
+PFNGLVERTEXATTRIB3FVARBPROC glad_glVertexAttrib3fvARB = NULL;
+PFNGLVERTEXATTRIB3FVNVPROC glad_glVertexAttrib3fvNV = NULL;
+PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL;
+PFNGLVERTEXATTRIB3SARBPROC glad_glVertexAttrib3sARB = NULL;
+PFNGLVERTEXATTRIB3SNVPROC glad_glVertexAttrib3sNV = NULL;
+PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL;
+PFNGLVERTEXATTRIB3SVARBPROC glad_glVertexAttrib3svARB = NULL;
+PFNGLVERTEXATTRIB3SVNVPROC glad_glVertexAttrib3svNV = NULL;
+PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL;
+PFNGLVERTEXATTRIB4NBVARBPROC glad_glVertexAttrib4NbvARB = NULL;
+PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL;
+PFNGLVERTEXATTRIB4NIVARBPROC glad_glVertexAttrib4NivARB = NULL;
+PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL;
+PFNGLVERTEXATTRIB4NSVARBPROC glad_glVertexAttrib4NsvARB = NULL;
+PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL;
+PFNGLVERTEXATTRIB4NUBARBPROC glad_glVertexAttrib4NubARB = NULL;
+PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL;
+PFNGLVERTEXATTRIB4NUBVARBPROC glad_glVertexAttrib4NubvARB = NULL;
+PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL;
+PFNGLVERTEXATTRIB4NUIVARBPROC glad_glVertexAttrib4NuivARB = NULL;
+PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL;
+PFNGLVERTEXATTRIB4NUSVARBPROC glad_glVertexAttrib4NusvARB = NULL;
+PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL;
+PFNGLVERTEXATTRIB4BVARBPROC glad_glVertexAttrib4bvARB = NULL;
+PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL;
+PFNGLVERTEXATTRIB4DARBPROC glad_glVertexAttrib4dARB = NULL;
+PFNGLVERTEXATTRIB4DNVPROC glad_glVertexAttrib4dNV = NULL;
+PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL;
+PFNGLVERTEXATTRIB4DVARBPROC glad_glVertexAttrib4dvARB = NULL;
+PFNGLVERTEXATTRIB4DVNVPROC glad_glVertexAttrib4dvNV = NULL;
+PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL;
+PFNGLVERTEXATTRIB4FARBPROC glad_glVertexAttrib4fARB = NULL;
+PFNGLVERTEXATTRIB4FNVPROC glad_glVertexAttrib4fNV = NULL;
+PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL;
+PFNGLVERTEXATTRIB4FVARBPROC glad_glVertexAttrib4fvARB = NULL;
+PFNGLVERTEXATTRIB4FVNVPROC glad_glVertexAttrib4fvNV = NULL;
+PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL;
+PFNGLVERTEXATTRIB4IVARBPROC glad_glVertexAttrib4ivARB = NULL;
+PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL;
+PFNGLVERTEXATTRIB4SARBPROC glad_glVertexAttrib4sARB = NULL;
+PFNGLVERTEXATTRIB4SNVPROC glad_glVertexAttrib4sNV = NULL;
+PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL;
+PFNGLVERTEXATTRIB4SVARBPROC glad_glVertexAttrib4svARB = NULL;
+PFNGLVERTEXATTRIB4SVNVPROC glad_glVertexAttrib4svNV = NULL;
+PFNGLVERTEXATTRIB4UBNVPROC glad_glVertexAttrib4ubNV = NULL;
+PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL;
+PFNGLVERTEXATTRIB4UBVARBPROC glad_glVertexAttrib4ubvARB = NULL;
+PFNGLVERTEXATTRIB4UBVNVPROC glad_glVertexAttrib4ubvNV = NULL;
+PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL;
+PFNGLVERTEXATTRIB4UIVARBPROC glad_glVertexAttrib4uivARB = NULL;
+PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL;
+PFNGLVERTEXATTRIB4USVARBPROC glad_glVertexAttrib4usvARB = NULL;
+PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL;
+PFNGLVERTEXATTRIBPOINTERARBPROC glad_glVertexAttribPointerARB = NULL;
+PFNGLVERTEXATTRIBPOINTERNVPROC glad_glVertexAttribPointerNV = NULL;
+PFNGLVERTEXATTRIBS1DVNVPROC glad_glVertexAttribs1dvNV = NULL;
+PFNGLVERTEXATTRIBS1FVNVPROC glad_glVertexAttribs1fvNV = NULL;
+PFNGLVERTEXATTRIBS1SVNVPROC glad_glVertexAttribs1svNV = NULL;
+PFNGLVERTEXATTRIBS2DVNVPROC glad_glVertexAttribs2dvNV = NULL;
+PFNGLVERTEXATTRIBS2FVNVPROC glad_glVertexAttribs2fvNV = NULL;
+PFNGLVERTEXATTRIBS2SVNVPROC glad_glVertexAttribs2svNV = NULL;
+PFNGLVERTEXATTRIBS3DVNVPROC glad_glVertexAttribs3dvNV = NULL;
+PFNGLVERTEXATTRIBS3FVNVPROC glad_glVertexAttribs3fvNV = NULL;
+PFNGLVERTEXATTRIBS3SVNVPROC glad_glVertexAttribs3svNV = NULL;
+PFNGLVERTEXATTRIBS4DVNVPROC glad_glVertexAttribs4dvNV = NULL;
+PFNGLVERTEXATTRIBS4FVNVPROC glad_glVertexAttribs4fvNV = NULL;
+PFNGLVERTEXATTRIBS4SVNVPROC glad_glVertexAttribs4svNV = NULL;
+PFNGLVERTEXATTRIBS4UBVNVPROC glad_glVertexAttribs4ubvNV = NULL;
+PFNGLVERTEXPOINTERPROC glad_glVertexPointer = NULL;
+PFNGLVERTEXPOINTEREXTPROC glad_glVertexPointerEXT = NULL;
+PFNGLVIEWPORTPROC glad_glViewport = NULL;
+PFNGLALPHAFUNCXPROC glad_glAlphaFuncx = NULL;
+PFNGLBINDFRAMEBUFFEROESPROC glad_glBindFramebufferOES = NULL;
+PFNGLBINDRENDERBUFFEROESPROC glad_glBindRenderbufferOES = NULL;
+PFNGLBLENDEQUATIONOESPROC glad_glBlendEquationOES = NULL;
+PFNGLBLENDEQUATIONSEPARATEOESPROC glad_glBlendEquationSeparateOES = NULL;
+PFNGLBLENDFUNCSEPARATEOESPROC glad_glBlendFuncSeparateOES = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSOESPROC glad_glCheckFramebufferStatusOES = NULL;
+PFNGLCLEARCOLORXPROC glad_glClearColorx = NULL;
+PFNGLCLEARDEPTHFPROC glad_glClearDepthf = NULL;
+PFNGLCLEARDEPTHFOESPROC glad_glClearDepthfOES = NULL;
+PFNGLCLEARDEPTHXPROC glad_glClearDepthx = NULL;
+PFNGLCLIPPLANEFPROC glad_glClipPlanef = NULL;
+PFNGLCLIPPLANEFOESPROC glad_glClipPlanefOES = NULL;
+PFNGLCLIPPLANEXPROC glad_glClipPlanex = NULL;
+PFNGLCOLOR4XPROC glad_glColor4x = NULL;
+PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL;
+PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL;
+PFNGLDELETEFRAMEBUFFERSOESPROC glad_glDeleteFramebuffersOES = NULL;
+PFNGLDELETERENDERBUFFERSOESPROC glad_glDeleteRenderbuffersOES = NULL;
+PFNGLDEPTHRANGEFPROC glad_glDepthRangef = NULL;
+PFNGLDEPTHRANGEFOESPROC glad_glDepthRangefOES = NULL;
+PFNGLDEPTHRANGEXPROC glad_glDepthRangex = NULL;
+PFNGLFOGXPROC glad_glFogx = NULL;
+PFNGLFOGXVPROC glad_glFogxv = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFEROESPROC glad_glFramebufferRenderbufferOES = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DOESPROC glad_glFramebufferTexture2DOES = NULL;
+PFNGLFRUSTUMFPROC glad_glFrustumf = NULL;
+PFNGLFRUSTUMFOESPROC glad_glFrustumfOES = NULL;
+PFNGLFRUSTUMXPROC glad_glFrustumx = NULL;
+PFNGLGENFRAMEBUFFERSOESPROC glad_glGenFramebuffersOES = NULL;
+PFNGLGENRENDERBUFFERSOESPROC glad_glGenRenderbuffersOES = NULL;
+PFNGLGENERATEMIPMAPOESPROC glad_glGenerateMipmapOES = NULL;
+PFNGLGETCLIPPLANEFPROC glad_glGetClipPlanef = NULL;
+PFNGLGETCLIPPLANEFOESPROC glad_glGetClipPlanefOES = NULL;
+PFNGLGETCLIPPLANEXPROC glad_glGetClipPlanex = NULL;
+PFNGLGETFIXEDVPROC glad_glGetFixedv = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC glad_glGetFramebufferAttachmentParameterivOES = NULL;
+PFNGLGETLIGHTXVPROC glad_glGetLightxv = NULL;
+PFNGLGETMATERIALXVPROC glad_glGetMaterialxv = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVOESPROC glad_glGetRenderbufferParameterivOES = NULL;
+PFNGLGETTEXENVXVPROC glad_glGetTexEnvxv = NULL;
+PFNGLGETTEXPARAMETERXVPROC glad_glGetTexParameterxv = NULL;
+PFNGLISFRAMEBUFFEROESPROC glad_glIsFramebufferOES = NULL;
+PFNGLISRENDERBUFFEROESPROC glad_glIsRenderbufferOES = NULL;
+PFNGLLIGHTMODELXPROC glad_glLightModelx = NULL;
+PFNGLLIGHTMODELXVPROC glad_glLightModelxv = NULL;
+PFNGLLIGHTXPROC glad_glLightx = NULL;
+PFNGLLIGHTXVPROC glad_glLightxv = NULL;
+PFNGLLINEWIDTHXPROC glad_glLineWidthx = NULL;
+PFNGLLOADMATRIXXPROC glad_glLoadMatrixx = NULL;
+PFNGLMATERIALXPROC glad_glMaterialx = NULL;
+PFNGLMATERIALXVPROC glad_glMaterialxv = NULL;
+PFNGLMULTMATRIXXPROC glad_glMultMatrixx = NULL;
+PFNGLMULTITEXCOORD4XPROC glad_glMultiTexCoord4x = NULL;
+PFNGLNORMAL3XPROC glad_glNormal3x = NULL;
+PFNGLORTHOFPROC glad_glOrthof = NULL;
+PFNGLORTHOFOESPROC glad_glOrthofOES = NULL;
+PFNGLORTHOXPROC glad_glOrthox = NULL;
+PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL;
+PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL;
+PFNGLPOINTPARAMETERXPROC glad_glPointParameterx = NULL;
+PFNGLPOINTPARAMETERXVPROC glad_glPointParameterxv = NULL;
+PFNGLPOINTSIZEXPROC glad_glPointSizex = NULL;
+PFNGLPOLYGONOFFSETXPROC glad_glPolygonOffsetx = NULL;
+PFNGLRENDERBUFFERSTORAGEOESPROC glad_glRenderbufferStorageOES = NULL;
+PFNGLROTATEXPROC glad_glRotatex = NULL;
+PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL;
+PFNGLSAMPLECOVERAGEXPROC glad_glSampleCoveragex = NULL;
+PFNGLSCALEXPROC glad_glScalex = NULL;
+PFNGLTEXENVXPROC glad_glTexEnvx = NULL;
+PFNGLTEXENVXVPROC glad_glTexEnvxv = NULL;
+PFNGLTEXPARAMETERXPROC glad_glTexParameterx = NULL;
+PFNGLTEXPARAMETERXVPROC glad_glTexParameterxv = NULL;
+PFNGLTRANSLATEXPROC glad_glTranslatex = NULL;
+
+
+static void glad_gl_load_GL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_VERSION_1_0) return;
+ glad_glAccum = (PFNGLACCUMPROC) load(userptr, "glAccum");
+ glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc");
+ glad_glBegin = (PFNGLBEGINPROC) load(userptr, "glBegin");
+ glad_glBitmap = (PFNGLBITMAPPROC) load(userptr, "glBitmap");
+ glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc");
+ glad_glCallList = (PFNGLCALLLISTPROC) load(userptr, "glCallList");
+ glad_glCallLists = (PFNGLCALLLISTSPROC) load(userptr, "glCallLists");
+ glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear");
+ glad_glClearAccum = (PFNGLCLEARACCUMPROC) load(userptr, "glClearAccum");
+ glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor");
+ glad_glClearDepth = (PFNGLCLEARDEPTHPROC) load(userptr, "glClearDepth");
+ glad_glClearIndex = (PFNGLCLEARINDEXPROC) load(userptr, "glClearIndex");
+ glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil");
+ glad_glClipPlane = (PFNGLCLIPPLANEPROC) load(userptr, "glClipPlane");
+ glad_glColor3b = (PFNGLCOLOR3BPROC) load(userptr, "glColor3b");
+ glad_glColor3bv = (PFNGLCOLOR3BVPROC) load(userptr, "glColor3bv");
+ glad_glColor3d = (PFNGLCOLOR3DPROC) load(userptr, "glColor3d");
+ glad_glColor3dv = (PFNGLCOLOR3DVPROC) load(userptr, "glColor3dv");
+ glad_glColor3f = (PFNGLCOLOR3FPROC) load(userptr, "glColor3f");
+ glad_glColor3fv = (PFNGLCOLOR3FVPROC) load(userptr, "glColor3fv");
+ glad_glColor3i = (PFNGLCOLOR3IPROC) load(userptr, "glColor3i");
+ glad_glColor3iv = (PFNGLCOLOR3IVPROC) load(userptr, "glColor3iv");
+ glad_glColor3s = (PFNGLCOLOR3SPROC) load(userptr, "glColor3s");
+ glad_glColor3sv = (PFNGLCOLOR3SVPROC) load(userptr, "glColor3sv");
+ glad_glColor3ub = (PFNGLCOLOR3UBPROC) load(userptr, "glColor3ub");
+ glad_glColor3ubv = (PFNGLCOLOR3UBVPROC) load(userptr, "glColor3ubv");
+ glad_glColor3ui = (PFNGLCOLOR3UIPROC) load(userptr, "glColor3ui");
+ glad_glColor3uiv = (PFNGLCOLOR3UIVPROC) load(userptr, "glColor3uiv");
+ glad_glColor3us = (PFNGLCOLOR3USPROC) load(userptr, "glColor3us");
+ glad_glColor3usv = (PFNGLCOLOR3USVPROC) load(userptr, "glColor3usv");
+ glad_glColor4b = (PFNGLCOLOR4BPROC) load(userptr, "glColor4b");
+ glad_glColor4bv = (PFNGLCOLOR4BVPROC) load(userptr, "glColor4bv");
+ glad_glColor4d = (PFNGLCOLOR4DPROC) load(userptr, "glColor4d");
+ glad_glColor4dv = (PFNGLCOLOR4DVPROC) load(userptr, "glColor4dv");
+ glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f");
+ glad_glColor4fv = (PFNGLCOLOR4FVPROC) load(userptr, "glColor4fv");
+ glad_glColor4i = (PFNGLCOLOR4IPROC) load(userptr, "glColor4i");
+ glad_glColor4iv = (PFNGLCOLOR4IVPROC) load(userptr, "glColor4iv");
+ glad_glColor4s = (PFNGLCOLOR4SPROC) load(userptr, "glColor4s");
+ glad_glColor4sv = (PFNGLCOLOR4SVPROC) load(userptr, "glColor4sv");
+ glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub");
+ glad_glColor4ubv = (PFNGLCOLOR4UBVPROC) load(userptr, "glColor4ubv");
+ glad_glColor4ui = (PFNGLCOLOR4UIPROC) load(userptr, "glColor4ui");
+ glad_glColor4uiv = (PFNGLCOLOR4UIVPROC) load(userptr, "glColor4uiv");
+ glad_glColor4us = (PFNGLCOLOR4USPROC) load(userptr, "glColor4us");
+ glad_glColor4usv = (PFNGLCOLOR4USVPROC) load(userptr, "glColor4usv");
+ glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask");
+ glad_glColorMaterial = (PFNGLCOLORMATERIALPROC) load(userptr, "glColorMaterial");
+ glad_glCopyPixels = (PFNGLCOPYPIXELSPROC) load(userptr, "glCopyPixels");
+ glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace");
+ glad_glDeleteLists = (PFNGLDELETELISTSPROC) load(userptr, "glDeleteLists");
+ glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc");
+ glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask");
+ glad_glDepthRange = (PFNGLDEPTHRANGEPROC) load(userptr, "glDepthRange");
+ glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable");
+ glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC) load(userptr, "glDrawBuffer");
+ glad_glDrawPixels = (PFNGLDRAWPIXELSPROC) load(userptr, "glDrawPixels");
+ glad_glEdgeFlag = (PFNGLEDGEFLAGPROC) load(userptr, "glEdgeFlag");
+ glad_glEdgeFlagv = (PFNGLEDGEFLAGVPROC) load(userptr, "glEdgeFlagv");
+ glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable");
+ glad_glEnd = (PFNGLENDPROC) load(userptr, "glEnd");
+ glad_glEndList = (PFNGLENDLISTPROC) load(userptr, "glEndList");
+ glad_glEvalCoord1d = (PFNGLEVALCOORD1DPROC) load(userptr, "glEvalCoord1d");
+ glad_glEvalCoord1dv = (PFNGLEVALCOORD1DVPROC) load(userptr, "glEvalCoord1dv");
+ glad_glEvalCoord1f = (PFNGLEVALCOORD1FPROC) load(userptr, "glEvalCoord1f");
+ glad_glEvalCoord1fv = (PFNGLEVALCOORD1FVPROC) load(userptr, "glEvalCoord1fv");
+ glad_glEvalCoord2d = (PFNGLEVALCOORD2DPROC) load(userptr, "glEvalCoord2d");
+ glad_glEvalCoord2dv = (PFNGLEVALCOORD2DVPROC) load(userptr, "glEvalCoord2dv");
+ glad_glEvalCoord2f = (PFNGLEVALCOORD2FPROC) load(userptr, "glEvalCoord2f");
+ glad_glEvalCoord2fv = (PFNGLEVALCOORD2FVPROC) load(userptr, "glEvalCoord2fv");
+ glad_glEvalMesh1 = (PFNGLEVALMESH1PROC) load(userptr, "glEvalMesh1");
+ glad_glEvalMesh2 = (PFNGLEVALMESH2PROC) load(userptr, "glEvalMesh2");
+ glad_glEvalPoint1 = (PFNGLEVALPOINT1PROC) load(userptr, "glEvalPoint1");
+ glad_glEvalPoint2 = (PFNGLEVALPOINT2PROC) load(userptr, "glEvalPoint2");
+ glad_glFeedbackBuffer = (PFNGLFEEDBACKBUFFERPROC) load(userptr, "glFeedbackBuffer");
+ glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish");
+ glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush");
+ glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf");
+ glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv");
+ glad_glFogi = (PFNGLFOGIPROC) load(userptr, "glFogi");
+ glad_glFogiv = (PFNGLFOGIVPROC) load(userptr, "glFogiv");
+ glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace");
+ glad_glFrustum = (PFNGLFRUSTUMPROC) load(userptr, "glFrustum");
+ glad_glGenLists = (PFNGLGENLISTSPROC) load(userptr, "glGenLists");
+ glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv");
+ glad_glGetClipPlane = (PFNGLGETCLIPPLANEPROC) load(userptr, "glGetClipPlane");
+ glad_glGetDoublev = (PFNGLGETDOUBLEVPROC) load(userptr, "glGetDoublev");
+ glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError");
+ glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv");
+ glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv");
+ glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv");
+ glad_glGetLightiv = (PFNGLGETLIGHTIVPROC) load(userptr, "glGetLightiv");
+ glad_glGetMapdv = (PFNGLGETMAPDVPROC) load(userptr, "glGetMapdv");
+ glad_glGetMapfv = (PFNGLGETMAPFVPROC) load(userptr, "glGetMapfv");
+ glad_glGetMapiv = (PFNGLGETMAPIVPROC) load(userptr, "glGetMapiv");
+ glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv");
+ glad_glGetMaterialiv = (PFNGLGETMATERIALIVPROC) load(userptr, "glGetMaterialiv");
+ glad_glGetPixelMapfv = (PFNGLGETPIXELMAPFVPROC) load(userptr, "glGetPixelMapfv");
+ glad_glGetPixelMapuiv = (PFNGLGETPIXELMAPUIVPROC) load(userptr, "glGetPixelMapuiv");
+ glad_glGetPixelMapusv = (PFNGLGETPIXELMAPUSVPROC) load(userptr, "glGetPixelMapusv");
+ glad_glGetPolygonStipple = (PFNGLGETPOLYGONSTIPPLEPROC) load(userptr, "glGetPolygonStipple");
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv");
+ glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv");
+ glad_glGetTexGendv = (PFNGLGETTEXGENDVPROC) load(userptr, "glGetTexGendv");
+ glad_glGetTexGenfv = (PFNGLGETTEXGENFVPROC) load(userptr, "glGetTexGenfv");
+ glad_glGetTexGeniv = (PFNGLGETTEXGENIVPROC) load(userptr, "glGetTexGeniv");
+ glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC) load(userptr, "glGetTexImage");
+ glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load(userptr, "glGetTexLevelParameterfv");
+ glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load(userptr, "glGetTexLevelParameteriv");
+ glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv");
+ glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv");
+ glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint");
+ glad_glIndexMask = (PFNGLINDEXMASKPROC) load(userptr, "glIndexMask");
+ glad_glIndexd = (PFNGLINDEXDPROC) load(userptr, "glIndexd");
+ glad_glIndexdv = (PFNGLINDEXDVPROC) load(userptr, "glIndexdv");
+ glad_glIndexf = (PFNGLINDEXFPROC) load(userptr, "glIndexf");
+ glad_glIndexfv = (PFNGLINDEXFVPROC) load(userptr, "glIndexfv");
+ glad_glIndexi = (PFNGLINDEXIPROC) load(userptr, "glIndexi");
+ glad_glIndexiv = (PFNGLINDEXIVPROC) load(userptr, "glIndexiv");
+ glad_glIndexs = (PFNGLINDEXSPROC) load(userptr, "glIndexs");
+ glad_glIndexsv = (PFNGLINDEXSVPROC) load(userptr, "glIndexsv");
+ glad_glInitNames = (PFNGLINITNAMESPROC) load(userptr, "glInitNames");
+ glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled");
+ glad_glIsList = (PFNGLISLISTPROC) load(userptr, "glIsList");
+ glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf");
+ glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv");
+ glad_glLightModeli = (PFNGLLIGHTMODELIPROC) load(userptr, "glLightModeli");
+ glad_glLightModeliv = (PFNGLLIGHTMODELIVPROC) load(userptr, "glLightModeliv");
+ glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf");
+ glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv");
+ glad_glLighti = (PFNGLLIGHTIPROC) load(userptr, "glLighti");
+ glad_glLightiv = (PFNGLLIGHTIVPROC) load(userptr, "glLightiv");
+ glad_glLineStipple = (PFNGLLINESTIPPLEPROC) load(userptr, "glLineStipple");
+ glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth");
+ glad_glListBase = (PFNGLLISTBASEPROC) load(userptr, "glListBase");
+ glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity");
+ glad_glLoadMatrixd = (PFNGLLOADMATRIXDPROC) load(userptr, "glLoadMatrixd");
+ glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf");
+ glad_glLoadName = (PFNGLLOADNAMEPROC) load(userptr, "glLoadName");
+ glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp");
+ glad_glMap1d = (PFNGLMAP1DPROC) load(userptr, "glMap1d");
+ glad_glMap1f = (PFNGLMAP1FPROC) load(userptr, "glMap1f");
+ glad_glMap2d = (PFNGLMAP2DPROC) load(userptr, "glMap2d");
+ glad_glMap2f = (PFNGLMAP2FPROC) load(userptr, "glMap2f");
+ glad_glMapGrid1d = (PFNGLMAPGRID1DPROC) load(userptr, "glMapGrid1d");
+ glad_glMapGrid1f = (PFNGLMAPGRID1FPROC) load(userptr, "glMapGrid1f");
+ glad_glMapGrid2d = (PFNGLMAPGRID2DPROC) load(userptr, "glMapGrid2d");
+ glad_glMapGrid2f = (PFNGLMAPGRID2FPROC) load(userptr, "glMapGrid2f");
+ glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf");
+ glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv");
+ glad_glMateriali = (PFNGLMATERIALIPROC) load(userptr, "glMateriali");
+ glad_glMaterialiv = (PFNGLMATERIALIVPROC) load(userptr, "glMaterialiv");
+ glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode");
+ glad_glMultMatrixd = (PFNGLMULTMATRIXDPROC) load(userptr, "glMultMatrixd");
+ glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf");
+ glad_glNewList = (PFNGLNEWLISTPROC) load(userptr, "glNewList");
+ glad_glNormal3b = (PFNGLNORMAL3BPROC) load(userptr, "glNormal3b");
+ glad_glNormal3bv = (PFNGLNORMAL3BVPROC) load(userptr, "glNormal3bv");
+ glad_glNormal3d = (PFNGLNORMAL3DPROC) load(userptr, "glNormal3d");
+ glad_glNormal3dv = (PFNGLNORMAL3DVPROC) load(userptr, "glNormal3dv");
+ glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f");
+ glad_glNormal3fv = (PFNGLNORMAL3FVPROC) load(userptr, "glNormal3fv");
+ glad_glNormal3i = (PFNGLNORMAL3IPROC) load(userptr, "glNormal3i");
+ glad_glNormal3iv = (PFNGLNORMAL3IVPROC) load(userptr, "glNormal3iv");
+ glad_glNormal3s = (PFNGLNORMAL3SPROC) load(userptr, "glNormal3s");
+ glad_glNormal3sv = (PFNGLNORMAL3SVPROC) load(userptr, "glNormal3sv");
+ glad_glOrtho = (PFNGLORTHOPROC) load(userptr, "glOrtho");
+ glad_glPassThrough = (PFNGLPASSTHROUGHPROC) load(userptr, "glPassThrough");
+ glad_glPixelMapfv = (PFNGLPIXELMAPFVPROC) load(userptr, "glPixelMapfv");
+ glad_glPixelMapuiv = (PFNGLPIXELMAPUIVPROC) load(userptr, "glPixelMapuiv");
+ glad_glPixelMapusv = (PFNGLPIXELMAPUSVPROC) load(userptr, "glPixelMapusv");
+ glad_glPixelStoref = (PFNGLPIXELSTOREFPROC) load(userptr, "glPixelStoref");
+ glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei");
+ glad_glPixelTransferf = (PFNGLPIXELTRANSFERFPROC) load(userptr, "glPixelTransferf");
+ glad_glPixelTransferi = (PFNGLPIXELTRANSFERIPROC) load(userptr, "glPixelTransferi");
+ glad_glPixelZoom = (PFNGLPIXELZOOMPROC) load(userptr, "glPixelZoom");
+ glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize");
+ glad_glPolygonMode = (PFNGLPOLYGONMODEPROC) load(userptr, "glPolygonMode");
+ glad_glPolygonStipple = (PFNGLPOLYGONSTIPPLEPROC) load(userptr, "glPolygonStipple");
+ glad_glPopAttrib = (PFNGLPOPATTRIBPROC) load(userptr, "glPopAttrib");
+ glad_glPopMatrix = (PFNGLPOPMATRIXPROC) load(userptr, "glPopMatrix");
+ glad_glPopName = (PFNGLPOPNAMEPROC) load(userptr, "glPopName");
+ glad_glPushAttrib = (PFNGLPUSHATTRIBPROC) load(userptr, "glPushAttrib");
+ glad_glPushMatrix = (PFNGLPUSHMATRIXPROC) load(userptr, "glPushMatrix");
+ glad_glPushName = (PFNGLPUSHNAMEPROC) load(userptr, "glPushName");
+ glad_glRasterPos2d = (PFNGLRASTERPOS2DPROC) load(userptr, "glRasterPos2d");
+ glad_glRasterPos2dv = (PFNGLRASTERPOS2DVPROC) load(userptr, "glRasterPos2dv");
+ glad_glRasterPos2f = (PFNGLRASTERPOS2FPROC) load(userptr, "glRasterPos2f");
+ glad_glRasterPos2fv = (PFNGLRASTERPOS2FVPROC) load(userptr, "glRasterPos2fv");
+ glad_glRasterPos2i = (PFNGLRASTERPOS2IPROC) load(userptr, "glRasterPos2i");
+ glad_glRasterPos2iv = (PFNGLRASTERPOS2IVPROC) load(userptr, "glRasterPos2iv");
+ glad_glRasterPos2s = (PFNGLRASTERPOS2SPROC) load(userptr, "glRasterPos2s");
+ glad_glRasterPos2sv = (PFNGLRASTERPOS2SVPROC) load(userptr, "glRasterPos2sv");
+ glad_glRasterPos3d = (PFNGLRASTERPOS3DPROC) load(userptr, "glRasterPos3d");
+ glad_glRasterPos3dv = (PFNGLRASTERPOS3DVPROC) load(userptr, "glRasterPos3dv");
+ glad_glRasterPos3f = (PFNGLRASTERPOS3FPROC) load(userptr, "glRasterPos3f");
+ glad_glRasterPos3fv = (PFNGLRASTERPOS3FVPROC) load(userptr, "glRasterPos3fv");
+ glad_glRasterPos3i = (PFNGLRASTERPOS3IPROC) load(userptr, "glRasterPos3i");
+ glad_glRasterPos3iv = (PFNGLRASTERPOS3IVPROC) load(userptr, "glRasterPos3iv");
+ glad_glRasterPos3s = (PFNGLRASTERPOS3SPROC) load(userptr, "glRasterPos3s");
+ glad_glRasterPos3sv = (PFNGLRASTERPOS3SVPROC) load(userptr, "glRasterPos3sv");
+ glad_glRasterPos4d = (PFNGLRASTERPOS4DPROC) load(userptr, "glRasterPos4d");
+ glad_glRasterPos4dv = (PFNGLRASTERPOS4DVPROC) load(userptr, "glRasterPos4dv");
+ glad_glRasterPos4f = (PFNGLRASTERPOS4FPROC) load(userptr, "glRasterPos4f");
+ glad_glRasterPos4fv = (PFNGLRASTERPOS4FVPROC) load(userptr, "glRasterPos4fv");
+ glad_glRasterPos4i = (PFNGLRASTERPOS4IPROC) load(userptr, "glRasterPos4i");
+ glad_glRasterPos4iv = (PFNGLRASTERPOS4IVPROC) load(userptr, "glRasterPos4iv");
+ glad_glRasterPos4s = (PFNGLRASTERPOS4SPROC) load(userptr, "glRasterPos4s");
+ glad_glRasterPos4sv = (PFNGLRASTERPOS4SVPROC) load(userptr, "glRasterPos4sv");
+ glad_glReadBuffer = (PFNGLREADBUFFERPROC) load(userptr, "glReadBuffer");
+ glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels");
+ glad_glRectd = (PFNGLRECTDPROC) load(userptr, "glRectd");
+ glad_glRectdv = (PFNGLRECTDVPROC) load(userptr, "glRectdv");
+ glad_glRectf = (PFNGLRECTFPROC) load(userptr, "glRectf");
+ glad_glRectfv = (PFNGLRECTFVPROC) load(userptr, "glRectfv");
+ glad_glRecti = (PFNGLRECTIPROC) load(userptr, "glRecti");
+ glad_glRectiv = (PFNGLRECTIVPROC) load(userptr, "glRectiv");
+ glad_glRects = (PFNGLRECTSPROC) load(userptr, "glRects");
+ glad_glRectsv = (PFNGLRECTSVPROC) load(userptr, "glRectsv");
+ glad_glRenderMode = (PFNGLRENDERMODEPROC) load(userptr, "glRenderMode");
+ glad_glRotated = (PFNGLROTATEDPROC) load(userptr, "glRotated");
+ glad_glRotatef = (PFNGLROTATEFPROC) load(userptr, "glRotatef");
+ glad_glScaled = (PFNGLSCALEDPROC) load(userptr, "glScaled");
+ glad_glScalef = (PFNGLSCALEFPROC) load(userptr, "glScalef");
+ glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor");
+ glad_glSelectBuffer = (PFNGLSELECTBUFFERPROC) load(userptr, "glSelectBuffer");
+ glad_glShadeModel = (PFNGLSHADEMODELPROC) load(userptr, "glShadeModel");
+ glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc");
+ glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask");
+ glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp");
+ glad_glTexCoord1d = (PFNGLTEXCOORD1DPROC) load(userptr, "glTexCoord1d");
+ glad_glTexCoord1dv = (PFNGLTEXCOORD1DVPROC) load(userptr, "glTexCoord1dv");
+ glad_glTexCoord1f = (PFNGLTEXCOORD1FPROC) load(userptr, "glTexCoord1f");
+ glad_glTexCoord1fv = (PFNGLTEXCOORD1FVPROC) load(userptr, "glTexCoord1fv");
+ glad_glTexCoord1i = (PFNGLTEXCOORD1IPROC) load(userptr, "glTexCoord1i");
+ glad_glTexCoord1iv = (PFNGLTEXCOORD1IVPROC) load(userptr, "glTexCoord1iv");
+ glad_glTexCoord1s = (PFNGLTEXCOORD1SPROC) load(userptr, "glTexCoord1s");
+ glad_glTexCoord1sv = (PFNGLTEXCOORD1SVPROC) load(userptr, "glTexCoord1sv");
+ glad_glTexCoord2d = (PFNGLTEXCOORD2DPROC) load(userptr, "glTexCoord2d");
+ glad_glTexCoord2dv = (PFNGLTEXCOORD2DVPROC) load(userptr, "glTexCoord2dv");
+ glad_glTexCoord2f = (PFNGLTEXCOORD2FPROC) load(userptr, "glTexCoord2f");
+ glad_glTexCoord2fv = (PFNGLTEXCOORD2FVPROC) load(userptr, "glTexCoord2fv");
+ glad_glTexCoord2i = (PFNGLTEXCOORD2IPROC) load(userptr, "glTexCoord2i");
+ glad_glTexCoord2iv = (PFNGLTEXCOORD2IVPROC) load(userptr, "glTexCoord2iv");
+ glad_glTexCoord2s = (PFNGLTEXCOORD2SPROC) load(userptr, "glTexCoord2s");
+ glad_glTexCoord2sv = (PFNGLTEXCOORD2SVPROC) load(userptr, "glTexCoord2sv");
+ glad_glTexCoord3d = (PFNGLTEXCOORD3DPROC) load(userptr, "glTexCoord3d");
+ glad_glTexCoord3dv = (PFNGLTEXCOORD3DVPROC) load(userptr, "glTexCoord3dv");
+ glad_glTexCoord3f = (PFNGLTEXCOORD3FPROC) load(userptr, "glTexCoord3f");
+ glad_glTexCoord3fv = (PFNGLTEXCOORD3FVPROC) load(userptr, "glTexCoord3fv");
+ glad_glTexCoord3i = (PFNGLTEXCOORD3IPROC) load(userptr, "glTexCoord3i");
+ glad_glTexCoord3iv = (PFNGLTEXCOORD3IVPROC) load(userptr, "glTexCoord3iv");
+ glad_glTexCoord3s = (PFNGLTEXCOORD3SPROC) load(userptr, "glTexCoord3s");
+ glad_glTexCoord3sv = (PFNGLTEXCOORD3SVPROC) load(userptr, "glTexCoord3sv");
+ glad_glTexCoord4d = (PFNGLTEXCOORD4DPROC) load(userptr, "glTexCoord4d");
+ glad_glTexCoord4dv = (PFNGLTEXCOORD4DVPROC) load(userptr, "glTexCoord4dv");
+ glad_glTexCoord4f = (PFNGLTEXCOORD4FPROC) load(userptr, "glTexCoord4f");
+ glad_glTexCoord4fv = (PFNGLTEXCOORD4FVPROC) load(userptr, "glTexCoord4fv");
+ glad_glTexCoord4i = (PFNGLTEXCOORD4IPROC) load(userptr, "glTexCoord4i");
+ glad_glTexCoord4iv = (PFNGLTEXCOORD4IVPROC) load(userptr, "glTexCoord4iv");
+ glad_glTexCoord4s = (PFNGLTEXCOORD4SPROC) load(userptr, "glTexCoord4s");
+ glad_glTexCoord4sv = (PFNGLTEXCOORD4SVPROC) load(userptr, "glTexCoord4sv");
+ glad_glTexEnvf = (PFNGLTEXENVFPROC) load(userptr, "glTexEnvf");
+ glad_glTexEnvfv = (PFNGLTEXENVFVPROC) load(userptr, "glTexEnvfv");
+ glad_glTexEnvi = (PFNGLTEXENVIPROC) load(userptr, "glTexEnvi");
+ glad_glTexEnviv = (PFNGLTEXENVIVPROC) load(userptr, "glTexEnviv");
+ glad_glTexGend = (PFNGLTEXGENDPROC) load(userptr, "glTexGend");
+ glad_glTexGendv = (PFNGLTEXGENDVPROC) load(userptr, "glTexGendv");
+ glad_glTexGenf = (PFNGLTEXGENFPROC) load(userptr, "glTexGenf");
+ glad_glTexGenfv = (PFNGLTEXGENFVPROC) load(userptr, "glTexGenfv");
+ glad_glTexGeni = (PFNGLTEXGENIPROC) load(userptr, "glTexGeni");
+ glad_glTexGeniv = (PFNGLTEXGENIVPROC) load(userptr, "glTexGeniv");
+ glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC) load(userptr, "glTexImage1D");
+ glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D");
+ glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf");
+ glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv");
+ glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri");
+ glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv");
+ glad_glTranslated = (PFNGLTRANSLATEDPROC) load(userptr, "glTranslated");
+ glad_glTranslatef = (PFNGLTRANSLATEFPROC) load(userptr, "glTranslatef");
+ glad_glVertex2d = (PFNGLVERTEX2DPROC) load(userptr, "glVertex2d");
+ glad_glVertex2dv = (PFNGLVERTEX2DVPROC) load(userptr, "glVertex2dv");
+ glad_glVertex2f = (PFNGLVERTEX2FPROC) load(userptr, "glVertex2f");
+ glad_glVertex2fv = (PFNGLVERTEX2FVPROC) load(userptr, "glVertex2fv");
+ glad_glVertex2i = (PFNGLVERTEX2IPROC) load(userptr, "glVertex2i");
+ glad_glVertex2iv = (PFNGLVERTEX2IVPROC) load(userptr, "glVertex2iv");
+ glad_glVertex2s = (PFNGLVERTEX2SPROC) load(userptr, "glVertex2s");
+ glad_glVertex2sv = (PFNGLVERTEX2SVPROC) load(userptr, "glVertex2sv");
+ glad_glVertex3d = (PFNGLVERTEX3DPROC) load(userptr, "glVertex3d");
+ glad_glVertex3dv = (PFNGLVERTEX3DVPROC) load(userptr, "glVertex3dv");
+ glad_glVertex3f = (PFNGLVERTEX3FPROC) load(userptr, "glVertex3f");
+ glad_glVertex3fv = (PFNGLVERTEX3FVPROC) load(userptr, "glVertex3fv");
+ glad_glVertex3i = (PFNGLVERTEX3IPROC) load(userptr, "glVertex3i");
+ glad_glVertex3iv = (PFNGLVERTEX3IVPROC) load(userptr, "glVertex3iv");
+ glad_glVertex3s = (PFNGLVERTEX3SPROC) load(userptr, "glVertex3s");
+ glad_glVertex3sv = (PFNGLVERTEX3SVPROC) load(userptr, "glVertex3sv");
+ glad_glVertex4d = (PFNGLVERTEX4DPROC) load(userptr, "glVertex4d");
+ glad_glVertex4dv = (PFNGLVERTEX4DVPROC) load(userptr, "glVertex4dv");
+ glad_glVertex4f = (PFNGLVERTEX4FPROC) load(userptr, "glVertex4f");
+ glad_glVertex4fv = (PFNGLVERTEX4FVPROC) load(userptr, "glVertex4fv");
+ glad_glVertex4i = (PFNGLVERTEX4IPROC) load(userptr, "glVertex4i");
+ glad_glVertex4iv = (PFNGLVERTEX4IVPROC) load(userptr, "glVertex4iv");
+ glad_glVertex4s = (PFNGLVERTEX4SPROC) load(userptr, "glVertex4s");
+ glad_glVertex4sv = (PFNGLVERTEX4SVPROC) load(userptr, "glVertex4sv");
+ glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport");
+}
+static void glad_gl_load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_VERSION_1_1) return;
+ glad_glAreTexturesResident = (PFNGLARETEXTURESRESIDENTPROC) load(userptr, "glAreTexturesResident");
+ glad_glArrayElement = (PFNGLARRAYELEMENTPROC) load(userptr, "glArrayElement");
+ glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture");
+ glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer");
+ glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D");
+ glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D");
+ glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D");
+ glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D");
+ glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures");
+ glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState");
+ glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays");
+ glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements");
+ glad_glEdgeFlagPointer = (PFNGLEDGEFLAGPOINTERPROC) load(userptr, "glEdgeFlagPointer");
+ glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState");
+ glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glIndexPointer = (PFNGLINDEXPOINTERPROC) load(userptr, "glIndexPointer");
+ glad_glIndexub = (PFNGLINDEXUBPROC) load(userptr, "glIndexub");
+ glad_glIndexubv = (PFNGLINDEXUBVPROC) load(userptr, "glIndexubv");
+ glad_glInterleavedArrays = (PFNGLINTERLEAVEDARRAYSPROC) load(userptr, "glInterleavedArrays");
+ glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture");
+ glad_glNormalPointer = (PFNGLNORMALPOINTERPROC) load(userptr, "glNormalPointer");
+ glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset");
+ glad_glPopClientAttrib = (PFNGLPOPCLIENTATTRIBPROC) load(userptr, "glPopClientAttrib");
+ glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(userptr, "glPrioritizeTextures");
+ glad_glPushClientAttrib = (PFNGLPUSHCLIENTATTRIBPROC) load(userptr, "glPushClientAttrib");
+ glad_glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load(userptr, "glTexCoordPointer");
+ glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D");
+ glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D");
+ glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer");
+}
+static void glad_gl_load_GL_VERSION_ES_CM_1_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_VERSION_ES_CM_1_0) return;
+ glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture");
+ glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc");
+ glad_glAlphaFuncx = (PFNGLALPHAFUNCXPROC) load(userptr, "glAlphaFuncx");
+ glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer");
+ glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture");
+ glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc");
+ glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData");
+ glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData");
+ glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear");
+ glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor");
+ glad_glClearColorx = (PFNGLCLEARCOLORXPROC) load(userptr, "glClearColorx");
+ glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf");
+ glad_glClearDepthx = (PFNGLCLEARDEPTHXPROC) load(userptr, "glClearDepthx");
+ glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil");
+ glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture");
+ glad_glClipPlanef = (PFNGLCLIPPLANEFPROC) load(userptr, "glClipPlanef");
+ glad_glClipPlanex = (PFNGLCLIPPLANEXPROC) load(userptr, "glClipPlanex");
+ glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f");
+ glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub");
+ glad_glColor4x = (PFNGLCOLOR4XPROC) load(userptr, "glColor4x");
+ glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask");
+ glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer");
+ glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D");
+ glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D");
+ glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D");
+ glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D");
+ glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace");
+ glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers");
+ glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures");
+ glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc");
+ glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask");
+ glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef");
+ glad_glDepthRangex = (PFNGLDEPTHRANGEXPROC) load(userptr, "glDepthRangex");
+ glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable");
+ glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState");
+ glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays");
+ glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements");
+ glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable");
+ glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState");
+ glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish");
+ glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush");
+ glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf");
+ glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv");
+ glad_glFogx = (PFNGLFOGXPROC) load(userptr, "glFogx");
+ glad_glFogxv = (PFNGLFOGXVPROC) load(userptr, "glFogxv");
+ glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace");
+ glad_glFrustumf = (PFNGLFRUSTUMFPROC) load(userptr, "glFrustumf");
+ glad_glFrustumx = (PFNGLFRUSTUMXPROC) load(userptr, "glFrustumx");
+ glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers");
+ glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures");
+ glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv");
+ glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv");
+ glad_glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC) load(userptr, "glGetClipPlanef");
+ glad_glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC) load(userptr, "glGetClipPlanex");
+ glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError");
+ glad_glGetFixedv = (PFNGLGETFIXEDVPROC) load(userptr, "glGetFixedv");
+ glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv");
+ glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv");
+ glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv");
+ glad_glGetLightxv = (PFNGLGETLIGHTXVPROC) load(userptr, "glGetLightxv");
+ glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv");
+ glad_glGetMaterialxv = (PFNGLGETMATERIALXVPROC) load(userptr, "glGetMaterialxv");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv");
+ glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv");
+ glad_glGetTexEnvxv = (PFNGLGETTEXENVXVPROC) load(userptr, "glGetTexEnvxv");
+ glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv");
+ glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv");
+ glad_glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC) load(userptr, "glGetTexParameterxv");
+ glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint");
+ glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer");
+ glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled");
+ glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture");
+ glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf");
+ glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv");
+ glad_glLightModelx = (PFNGLLIGHTMODELXPROC) load(userptr, "glLightModelx");
+ glad_glLightModelxv = (PFNGLLIGHTMODELXVPROC) load(userptr, "glLightModelxv");
+ glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf");
+ glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv");
+ glad_glLightx = (PFNGLLIGHTXPROC) load(userptr, "glLightx");
+ glad_glLightxv = (PFNGLLIGHTXVPROC) load(userptr, "glLightxv");
+ glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth");
+ glad_glLineWidthx = (PFNGLLINEWIDTHXPROC) load(userptr, "glLineWidthx");
+ glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity");
+ glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf");
+ glad_glLoadMatrixx = (PFNGLLOADMATRIXXPROC) load(userptr, "glLoadMatrixx");
+ glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp");
+ glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf");
+ glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv");
+ glad_glMaterialx = (PFNGLMATERIALXPROC) load(userptr, "glMaterialx");
+ glad_glMaterialxv = (PFNGLMATERIALXVPROC) load(userptr, "glMaterialxv");
+ glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode");
+ glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf");
+ glad_glMultMatrixx = (PFNGLMULTMATRIXXPROC) load(userptr, "glMultMatrixx");
+ glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f");
+ glad_glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC) load(userptr, "glMultiTexCoord4x");
+ glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f");
+ glad_glNormal3x = (PFNGLNORMAL3XPROC) load(userptr, "glNormal3x");
+ glad_glNormalPointer = (PFNGLNORMALPOINTERPROC) load(userptr, "glNormalPointer");
+ glad_glOrthof = (PFNGLORTHOFPROC) load(userptr, "glOrthof");
+ glad_glOrthox = (PFNGLORTHOXPROC) load(userptr, "glOrthox");
+ glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei");
+ glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(userptr, "glPointParameterf");
+ glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(userptr, "glPointParameterfv");
+ glad_glPointParameterx = (PFNGLPOINTPARAMETERXPROC) load(userptr, "glPointParameterx");
+ glad_glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC) load(userptr, "glPointParameterxv");
+ glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize");
+ glad_glPointSizex = (PFNGLPOINTSIZEXPROC) load(userptr, "glPointSizex");
+ glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset");
+ glad_glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC) load(userptr, "glPolygonOffsetx");
+ glad_glPopMatrix = (PFNGLPOPMATRIXPROC) load(userptr, "glPopMatrix");
+ glad_glPushMatrix = (PFNGLPUSHMATRIXPROC) load(userptr, "glPushMatrix");
+ glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels");
+ glad_glRotatef = (PFNGLROTATEFPROC) load(userptr, "glRotatef");
+ glad_glRotatex = (PFNGLROTATEXPROC) load(userptr, "glRotatex");
+ glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage");
+ glad_glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC) load(userptr, "glSampleCoveragex");
+ glad_glScalef = (PFNGLSCALEFPROC) load(userptr, "glScalef");
+ glad_glScalex = (PFNGLSCALEXPROC) load(userptr, "glScalex");
+ glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor");
+ glad_glShadeModel = (PFNGLSHADEMODELPROC) load(userptr, "glShadeModel");
+ glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc");
+ glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask");
+ glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp");
+ glad_glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load(userptr, "glTexCoordPointer");
+ glad_glTexEnvf = (PFNGLTEXENVFPROC) load(userptr, "glTexEnvf");
+ glad_glTexEnvfv = (PFNGLTEXENVFVPROC) load(userptr, "glTexEnvfv");
+ glad_glTexEnvi = (PFNGLTEXENVIPROC) load(userptr, "glTexEnvi");
+ glad_glTexEnviv = (PFNGLTEXENVIVPROC) load(userptr, "glTexEnviv");
+ glad_glTexEnvx = (PFNGLTEXENVXPROC) load(userptr, "glTexEnvx");
+ glad_glTexEnvxv = (PFNGLTEXENVXVPROC) load(userptr, "glTexEnvxv");
+ glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D");
+ glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf");
+ glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv");
+ glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri");
+ glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv");
+ glad_glTexParameterx = (PFNGLTEXPARAMETERXPROC) load(userptr, "glTexParameterx");
+ glad_glTexParameterxv = (PFNGLTEXPARAMETERXVPROC) load(userptr, "glTexParameterxv");
+ glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D");
+ glad_glTranslatef = (PFNGLTRANSLATEFPROC) load(userptr, "glTranslatef");
+ glad_glTranslatex = (PFNGLTRANSLATEXPROC) load(userptr, "glTranslatex");
+ glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer");
+ glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport");
+}
+static void glad_gl_load_GL_ARB_copy_buffer( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_copy_buffer) return;
+ glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData");
+}
+static void glad_gl_load_GL_ARB_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_framebuffer_object) return;
+ glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer");
+ glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer");
+ glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer");
+ glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus");
+ glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers");
+ glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers");
+ glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer");
+ glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D");
+ glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D");
+ glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D");
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers");
+ glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers");
+ glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap");
+ glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv");
+ glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv");
+ glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer");
+ glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer");
+ glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage");
+ glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample");
+}
+static void glad_gl_load_GL_ARB_geometry_shader4( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_geometry_shader4) return;
+ glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture");
+ glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC) load(userptr, "glFramebufferTextureARB");
+ glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB");
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) load(userptr, "glFramebufferTextureLayerARB");
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+ glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC) load(userptr, "glProgramParameteriARB");
+}
+static void glad_gl_load_GL_ARB_get_program_binary( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_get_program_binary) return;
+ glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary");
+ glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary");
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+}
+static void glad_gl_load_GL_ARB_imaging( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_imaging) return;
+ glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor");
+ glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation");
+ glad_glColorSubTable = (PFNGLCOLORSUBTABLEPROC) load(userptr, "glColorSubTable");
+ glad_glColorTable = (PFNGLCOLORTABLEPROC) load(userptr, "glColorTable");
+ glad_glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC) load(userptr, "glColorTableParameterfv");
+ glad_glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC) load(userptr, "glColorTableParameteriv");
+ glad_glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC) load(userptr, "glConvolutionFilter1D");
+ glad_glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC) load(userptr, "glConvolutionFilter2D");
+ glad_glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC) load(userptr, "glConvolutionParameterf");
+ glad_glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC) load(userptr, "glConvolutionParameterfv");
+ glad_glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC) load(userptr, "glConvolutionParameteri");
+ glad_glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC) load(userptr, "glConvolutionParameteriv");
+ glad_glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC) load(userptr, "glCopyColorSubTable");
+ glad_glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC) load(userptr, "glCopyColorTable");
+ glad_glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC) load(userptr, "glCopyConvolutionFilter1D");
+ glad_glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC) load(userptr, "glCopyConvolutionFilter2D");
+ glad_glGetColorTable = (PFNGLGETCOLORTABLEPROC) load(userptr, "glGetColorTable");
+ glad_glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC) load(userptr, "glGetColorTableParameterfv");
+ glad_glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC) load(userptr, "glGetColorTableParameteriv");
+ glad_glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC) load(userptr, "glGetConvolutionFilter");
+ glad_glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC) load(userptr, "glGetConvolutionParameterfv");
+ glad_glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC) load(userptr, "glGetConvolutionParameteriv");
+ glad_glGetHistogram = (PFNGLGETHISTOGRAMPROC) load(userptr, "glGetHistogram");
+ glad_glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC) load(userptr, "glGetHistogramParameterfv");
+ glad_glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC) load(userptr, "glGetHistogramParameteriv");
+ glad_glGetMinmax = (PFNGLGETMINMAXPROC) load(userptr, "glGetMinmax");
+ glad_glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC) load(userptr, "glGetMinmaxParameterfv");
+ glad_glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC) load(userptr, "glGetMinmaxParameteriv");
+ glad_glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC) load(userptr, "glGetSeparableFilter");
+ glad_glHistogram = (PFNGLHISTOGRAMPROC) load(userptr, "glHistogram");
+ glad_glMinmax = (PFNGLMINMAXPROC) load(userptr, "glMinmax");
+ glad_glResetHistogram = (PFNGLRESETHISTOGRAMPROC) load(userptr, "glResetHistogram");
+ glad_glResetMinmax = (PFNGLRESETMINMAXPROC) load(userptr, "glResetMinmax");
+ glad_glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC) load(userptr, "glSeparableFilter2D");
+}
+static void glad_gl_load_GL_ARB_multitexture( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_multitexture) return;
+ glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture");
+ glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) load(userptr, "glActiveTextureARB");
+ glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture");
+ glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) load(userptr, "glClientActiveTextureARB");
+ glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC) load(userptr, "glMultiTexCoord1d");
+ glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC) load(userptr, "glMultiTexCoord1dARB");
+ glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC) load(userptr, "glMultiTexCoord1dv");
+ glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC) load(userptr, "glMultiTexCoord1dvARB");
+ glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC) load(userptr, "glMultiTexCoord1f");
+ glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC) load(userptr, "glMultiTexCoord1fARB");
+ glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC) load(userptr, "glMultiTexCoord1fv");
+ glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC) load(userptr, "glMultiTexCoord1fvARB");
+ glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC) load(userptr, "glMultiTexCoord1i");
+ glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC) load(userptr, "glMultiTexCoord1iARB");
+ glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC) load(userptr, "glMultiTexCoord1iv");
+ glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC) load(userptr, "glMultiTexCoord1ivARB");
+ glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC) load(userptr, "glMultiTexCoord1s");
+ glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC) load(userptr, "glMultiTexCoord1sARB");
+ glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC) load(userptr, "glMultiTexCoord1sv");
+ glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC) load(userptr, "glMultiTexCoord1svARB");
+ glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC) load(userptr, "glMultiTexCoord2d");
+ glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC) load(userptr, "glMultiTexCoord2dARB");
+ glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC) load(userptr, "glMultiTexCoord2dv");
+ glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC) load(userptr, "glMultiTexCoord2dvARB");
+ glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) load(userptr, "glMultiTexCoord2f");
+ glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) load(userptr, "glMultiTexCoord2fARB");
+ glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) load(userptr, "glMultiTexCoord2fv");
+ glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC) load(userptr, "glMultiTexCoord2fvARB");
+ glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC) load(userptr, "glMultiTexCoord2i");
+ glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC) load(userptr, "glMultiTexCoord2iARB");
+ glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC) load(userptr, "glMultiTexCoord2iv");
+ glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC) load(userptr, "glMultiTexCoord2ivARB");
+ glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC) load(userptr, "glMultiTexCoord2s");
+ glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC) load(userptr, "glMultiTexCoord2sARB");
+ glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC) load(userptr, "glMultiTexCoord2sv");
+ glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC) load(userptr, "glMultiTexCoord2svARB");
+ glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC) load(userptr, "glMultiTexCoord3d");
+ glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC) load(userptr, "glMultiTexCoord3dARB");
+ glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC) load(userptr, "glMultiTexCoord3dv");
+ glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC) load(userptr, "glMultiTexCoord3dvARB");
+ glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC) load(userptr, "glMultiTexCoord3f");
+ glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC) load(userptr, "glMultiTexCoord3fARB");
+ glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC) load(userptr, "glMultiTexCoord3fv");
+ glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC) load(userptr, "glMultiTexCoord3fvARB");
+ glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC) load(userptr, "glMultiTexCoord3i");
+ glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC) load(userptr, "glMultiTexCoord3iARB");
+ glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC) load(userptr, "glMultiTexCoord3iv");
+ glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC) load(userptr, "glMultiTexCoord3ivARB");
+ glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC) load(userptr, "glMultiTexCoord3s");
+ glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC) load(userptr, "glMultiTexCoord3sARB");
+ glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC) load(userptr, "glMultiTexCoord3sv");
+ glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC) load(userptr, "glMultiTexCoord3svARB");
+ glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC) load(userptr, "glMultiTexCoord4d");
+ glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC) load(userptr, "glMultiTexCoord4dARB");
+ glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC) load(userptr, "glMultiTexCoord4dv");
+ glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC) load(userptr, "glMultiTexCoord4dvARB");
+ glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f");
+ glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC) load(userptr, "glMultiTexCoord4fARB");
+ glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC) load(userptr, "glMultiTexCoord4fv");
+ glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC) load(userptr, "glMultiTexCoord4fvARB");
+ glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC) load(userptr, "glMultiTexCoord4i");
+ glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC) load(userptr, "glMultiTexCoord4iARB");
+ glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC) load(userptr, "glMultiTexCoord4iv");
+ glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC) load(userptr, "glMultiTexCoord4ivARB");
+ glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC) load(userptr, "glMultiTexCoord4s");
+ glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC) load(userptr, "glMultiTexCoord4sARB");
+ glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC) load(userptr, "glMultiTexCoord4sv");
+ glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC) load(userptr, "glMultiTexCoord4svARB");
+}
+static void glad_gl_load_GL_ARB_separate_shader_objects( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_separate_shader_objects) return;
+ glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram");
+ glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(userptr, "glBindProgramPipeline");
+ glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(userptr, "glCreateShaderProgramv");
+ glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(userptr, "glDeleteProgramPipelines");
+ glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(userptr, "glGenProgramPipelines");
+ glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(userptr, "glGetProgramPipelineInfoLog");
+ glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(userptr, "glGetProgramPipelineiv");
+ glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(userptr, "glIsProgramPipeline");
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+ glad_glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load(userptr, "glProgramUniform1d");
+ glad_glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load(userptr, "glProgramUniform1dv");
+ glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(userptr, "glProgramUniform1f");
+ glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(userptr, "glProgramUniform1fv");
+ glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(userptr, "glProgramUniform1i");
+ glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(userptr, "glProgramUniform1iv");
+ glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(userptr, "glProgramUniform1ui");
+ glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(userptr, "glProgramUniform1uiv");
+ glad_glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load(userptr, "glProgramUniform2d");
+ glad_glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load(userptr, "glProgramUniform2dv");
+ glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(userptr, "glProgramUniform2f");
+ glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(userptr, "glProgramUniform2fv");
+ glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(userptr, "glProgramUniform2i");
+ glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(userptr, "glProgramUniform2iv");
+ glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(userptr, "glProgramUniform2ui");
+ glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(userptr, "glProgramUniform2uiv");
+ glad_glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load(userptr, "glProgramUniform3d");
+ glad_glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load(userptr, "glProgramUniform3dv");
+ glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(userptr, "glProgramUniform3f");
+ glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(userptr, "glProgramUniform3fv");
+ glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(userptr, "glProgramUniform3i");
+ glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(userptr, "glProgramUniform3iv");
+ glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(userptr, "glProgramUniform3ui");
+ glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(userptr, "glProgramUniform3uiv");
+ glad_glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load(userptr, "glProgramUniform4d");
+ glad_glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load(userptr, "glProgramUniform4dv");
+ glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(userptr, "glProgramUniform4f");
+ glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(userptr, "glProgramUniform4fv");
+ glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(userptr, "glProgramUniform4i");
+ glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(userptr, "glProgramUniform4iv");
+ glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(userptr, "glProgramUniform4ui");
+ glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(userptr, "glProgramUniform4uiv");
+ glad_glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load(userptr, "glProgramUniformMatrix2dv");
+ glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(userptr, "glProgramUniformMatrix2fv");
+ glad_glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load(userptr, "glProgramUniformMatrix2x3dv");
+ glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(userptr, "glProgramUniformMatrix2x3fv");
+ glad_glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load(userptr, "glProgramUniformMatrix2x4dv");
+ glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(userptr, "glProgramUniformMatrix2x4fv");
+ glad_glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load(userptr, "glProgramUniformMatrix3dv");
+ glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(userptr, "glProgramUniformMatrix3fv");
+ glad_glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load(userptr, "glProgramUniformMatrix3x2dv");
+ glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(userptr, "glProgramUniformMatrix3x2fv");
+ glad_glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load(userptr, "glProgramUniformMatrix3x4dv");
+ glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(userptr, "glProgramUniformMatrix3x4fv");
+ glad_glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load(userptr, "glProgramUniformMatrix4dv");
+ glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(userptr, "glProgramUniformMatrix4fv");
+ glad_glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load(userptr, "glProgramUniformMatrix4x2dv");
+ glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(userptr, "glProgramUniformMatrix4x2fv");
+ glad_glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load(userptr, "glProgramUniformMatrix4x3dv");
+ glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(userptr, "glProgramUniformMatrix4x3fv");
+ glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages");
+ glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline");
+}
+static void glad_gl_load_GL_ARB_shader_objects( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_shader_objects) return;
+ glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) load(userptr, "glAttachObjectARB");
+ glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader");
+ glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader");
+ glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) load(userptr, "glCompileShaderARB");
+ glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram");
+ glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) load(userptr, "glCreateProgramObjectARB");
+ glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader");
+ glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) load(userptr, "glCreateShaderObjectARB");
+ glad_glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) load(userptr, "glDeleteObjectARB");
+ glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) load(userptr, "glDetachObjectARB");
+ glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader");
+ glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform");
+ glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) load(userptr, "glGetActiveUniformARB");
+ glad_glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) load(userptr, "glGetAttachedObjectsARB");
+ glad_glGetHandleARB = (PFNGLGETHANDLEARBPROC) load(userptr, "glGetHandleARB");
+ glad_glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) load(userptr, "glGetInfoLogARB");
+ glad_glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) load(userptr, "glGetObjectParameterfvARB");
+ glad_glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) load(userptr, "glGetObjectParameterivARB");
+ glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource");
+ glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) load(userptr, "glGetShaderSourceARB");
+ glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation");
+ glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) load(userptr, "glGetUniformLocationARB");
+ glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv");
+ glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) load(userptr, "glGetUniformfvARB");
+ glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv");
+ glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) load(userptr, "glGetUniformivARB");
+ glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram");
+ glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) load(userptr, "glLinkProgramARB");
+ glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource");
+ glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) load(userptr, "glShaderSourceARB");
+ glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f");
+ glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC) load(userptr, "glUniform1fARB");
+ glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv");
+ glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) load(userptr, "glUniform1fvARB");
+ glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i");
+ glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC) load(userptr, "glUniform1iARB");
+ glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv");
+ glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) load(userptr, "glUniform1ivARB");
+ glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f");
+ glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC) load(userptr, "glUniform2fARB");
+ glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv");
+ glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) load(userptr, "glUniform2fvARB");
+ glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i");
+ glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC) load(userptr, "glUniform2iARB");
+ glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv");
+ glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) load(userptr, "glUniform2ivARB");
+ glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f");
+ glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC) load(userptr, "glUniform3fARB");
+ glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv");
+ glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) load(userptr, "glUniform3fvARB");
+ glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i");
+ glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC) load(userptr, "glUniform3iARB");
+ glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv");
+ glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) load(userptr, "glUniform3ivARB");
+ glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f");
+ glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC) load(userptr, "glUniform4fARB");
+ glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv");
+ glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) load(userptr, "glUniform4fvARB");
+ glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i");
+ glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC) load(userptr, "glUniform4iARB");
+ glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv");
+ glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) load(userptr, "glUniform4ivARB");
+ glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv");
+ glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) load(userptr, "glUniformMatrix2fvARB");
+ glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv");
+ glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) load(userptr, "glUniformMatrix3fvARB");
+ glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv");
+ glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) load(userptr, "glUniformMatrix4fvARB");
+ glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram");
+ glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) load(userptr, "glUseProgramObjectARB");
+ glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram");
+ glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) load(userptr, "glValidateProgramARB");
+}
+static void glad_gl_load_GL_ARB_vertex_buffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_vertex_buffer_object) return;
+ glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer");
+ glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC) load(userptr, "glBindBufferARB");
+ glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData");
+ glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC) load(userptr, "glBufferDataARB");
+ glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData");
+ glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) load(userptr, "glBufferSubDataARB");
+ glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers");
+ glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) load(userptr, "glDeleteBuffersARB");
+ glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers");
+ glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) load(userptr, "glGenBuffersARB");
+ glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv");
+ glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) load(userptr, "glGetBufferParameterivARB");
+ glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv");
+ glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) load(userptr, "glGetBufferPointervARB");
+ glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData");
+ glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) load(userptr, "glGetBufferSubDataARB");
+ glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer");
+ glad_glIsBufferARB = (PFNGLISBUFFERARBPROC) load(userptr, "glIsBufferARB");
+ glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer");
+ glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) load(userptr, "glMapBufferARB");
+ glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer");
+ glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC) load(userptr, "glUnmapBufferARB");
+}
+static void glad_gl_load_GL_ARB_vertex_program( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_vertex_program) return;
+ glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB");
+ glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB");
+ glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray");
+ glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB");
+ glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray");
+ glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB");
+ glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB");
+ glad_glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) load(userptr, "glGetProgramEnvParameterdvARB");
+ glad_glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) load(userptr, "glGetProgramEnvParameterfvARB");
+ glad_glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) load(userptr, "glGetProgramLocalParameterdvARB");
+ glad_glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) load(userptr, "glGetProgramLocalParameterfvARB");
+ glad_glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) load(userptr, "glGetProgramStringARB");
+ glad_glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) load(userptr, "glGetProgramivARB");
+ glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv");
+ glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB");
+ glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv");
+ glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB");
+ glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv");
+ glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB");
+ glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv");
+ glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB");
+ glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB");
+ glad_glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) load(userptr, "glProgramEnvParameter4dARB");
+ glad_glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) load(userptr, "glProgramEnvParameter4dvARB");
+ glad_glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) load(userptr, "glProgramEnvParameter4fARB");
+ glad_glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) load(userptr, "glProgramEnvParameter4fvARB");
+ glad_glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) load(userptr, "glProgramLocalParameter4dARB");
+ glad_glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) load(userptr, "glProgramLocalParameter4dvARB");
+ glad_glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) load(userptr, "glProgramLocalParameter4fARB");
+ glad_glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) load(userptr, "glProgramLocalParameter4fvARB");
+ glad_glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) load(userptr, "glProgramStringARB");
+ glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d");
+ glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB");
+ glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv");
+ glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB");
+ glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f");
+ glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB");
+ glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv");
+ glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB");
+ glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s");
+ glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB");
+ glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv");
+ glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB");
+ glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d");
+ glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB");
+ glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv");
+ glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB");
+ glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f");
+ glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB");
+ glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv");
+ glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB");
+ glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s");
+ glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB");
+ glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv");
+ glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB");
+ glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d");
+ glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB");
+ glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv");
+ glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB");
+ glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f");
+ glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB");
+ glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv");
+ glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB");
+ glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s");
+ glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB");
+ glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv");
+ glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB");
+ glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv");
+ glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB");
+ glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv");
+ glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB");
+ glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv");
+ glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB");
+ glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub");
+ glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB");
+ glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv");
+ glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB");
+ glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv");
+ glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB");
+ glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv");
+ glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB");
+ glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv");
+ glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB");
+ glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d");
+ glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB");
+ glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv");
+ glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB");
+ glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f");
+ glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB");
+ glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv");
+ glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB");
+ glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv");
+ glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB");
+ glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s");
+ glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB");
+ glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv");
+ glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB");
+ glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv");
+ glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB");
+ glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv");
+ glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB");
+ glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv");
+ glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB");
+ glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer");
+ glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB");
+}
+static void glad_gl_load_GL_ARB_vertex_shader( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_vertex_shader) return;
+ glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation");
+ glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) load(userptr, "glBindAttribLocationARB");
+ glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray");
+ glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB");
+ glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray");
+ glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB");
+ glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib");
+ glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) load(userptr, "glGetActiveAttribARB");
+ glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation");
+ glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) load(userptr, "glGetAttribLocationARB");
+ glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv");
+ glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB");
+ glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv");
+ glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB");
+ glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv");
+ glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB");
+ glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv");
+ glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB");
+ glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d");
+ glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB");
+ glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv");
+ glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB");
+ glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f");
+ glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB");
+ glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv");
+ glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB");
+ glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s");
+ glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB");
+ glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv");
+ glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB");
+ glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d");
+ glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB");
+ glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv");
+ glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB");
+ glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f");
+ glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB");
+ glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv");
+ glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB");
+ glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s");
+ glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB");
+ glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv");
+ glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB");
+ glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d");
+ glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB");
+ glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv");
+ glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB");
+ glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f");
+ glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB");
+ glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv");
+ glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB");
+ glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s");
+ glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB");
+ glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv");
+ glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB");
+ glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv");
+ glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB");
+ glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv");
+ glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB");
+ glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv");
+ glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB");
+ glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub");
+ glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB");
+ glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv");
+ glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB");
+ glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv");
+ glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB");
+ glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv");
+ glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB");
+ glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv");
+ glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB");
+ glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d");
+ glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB");
+ glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv");
+ glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB");
+ glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f");
+ glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB");
+ glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv");
+ glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB");
+ glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv");
+ glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB");
+ glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s");
+ glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB");
+ glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv");
+ glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB");
+ glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv");
+ glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB");
+ glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv");
+ glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB");
+ glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv");
+ glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB");
+ glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer");
+ glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB");
+}
+static void glad_gl_load_GL_EXT_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_blend_equation_separate) return;
+ glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate");
+ glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC) load(userptr, "glBlendEquationSeparateEXT");
+}
+static void glad_gl_load_GL_EXT_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_blend_func_separate) return;
+ glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate");
+ glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) load(userptr, "glBlendFuncSeparateEXT");
+}
+static void glad_gl_load_GL_EXT_blend_minmax( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_blend_minmax) return;
+ glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation");
+ glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC) load(userptr, "glBlendEquationEXT");
+}
+static void glad_gl_load_GL_EXT_copy_texture( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_copy_texture) return;
+ glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D");
+ glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC) load(userptr, "glCopyTexImage1DEXT");
+ glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D");
+ glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC) load(userptr, "glCopyTexImage2DEXT");
+ glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D");
+ glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC) load(userptr, "glCopyTexSubImage1DEXT");
+ glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D");
+ glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC) load(userptr, "glCopyTexSubImage2DEXT");
+ glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D");
+ glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC) load(userptr, "glCopyTexSubImage3DEXT");
+}
+static void glad_gl_load_GL_EXT_framebuffer_blit( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_framebuffer_blit) return;
+ glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer");
+ glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) load(userptr, "glBlitFramebufferEXT");
+}
+static void glad_gl_load_GL_EXT_framebuffer_multisample( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_framebuffer_multisample) return;
+ glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample");
+ glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) load(userptr, "glRenderbufferStorageMultisampleEXT");
+}
+static void glad_gl_load_GL_EXT_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_framebuffer_object) return;
+ glad_glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) load(userptr, "glBindFramebufferEXT");
+ glad_glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) load(userptr, "glBindRenderbufferEXT");
+ glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus");
+ glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) load(userptr, "glCheckFramebufferStatusEXT");
+ glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers");
+ glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) load(userptr, "glDeleteFramebuffersEXT");
+ glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers");
+ glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) load(userptr, "glDeleteRenderbuffersEXT");
+ glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer");
+ glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) load(userptr, "glFramebufferRenderbufferEXT");
+ glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D");
+ glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) load(userptr, "glFramebufferTexture1DEXT");
+ glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D");
+ glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) load(userptr, "glFramebufferTexture2DEXT");
+ glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D");
+ glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) load(userptr, "glFramebufferTexture3DEXT");
+ glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers");
+ glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) load(userptr, "glGenFramebuffersEXT");
+ glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers");
+ glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) load(userptr, "glGenRenderbuffersEXT");
+ glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap");
+ glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) load(userptr, "glGenerateMipmapEXT");
+ glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv");
+ glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) load(userptr, "glGetFramebufferAttachmentParameterivEXT");
+ glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv");
+ glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetRenderbufferParameterivEXT");
+ glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer");
+ glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) load(userptr, "glIsFramebufferEXT");
+ glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer");
+ glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) load(userptr, "glIsRenderbufferEXT");
+ glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage");
+ glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) load(userptr, "glRenderbufferStorageEXT");
+}
+static void glad_gl_load_GL_EXT_geometry_shader4( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_geometry_shader4) return;
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+ glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC) load(userptr, "glProgramParameteriEXT");
+}
+static void glad_gl_load_GL_EXT_subtexture( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_subtexture) return;
+ glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D");
+ glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC) load(userptr, "glTexSubImage1DEXT");
+ glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D");
+ glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC) load(userptr, "glTexSubImage2DEXT");
+}
+static void glad_gl_load_GL_EXT_texture_array( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_texture_array) return;
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT");
+}
+static void glad_gl_load_GL_EXT_texture_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_texture_object) return;
+ glad_glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC) load(userptr, "glAreTexturesResidentEXT");
+ glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture");
+ glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC) load(userptr, "glBindTextureEXT");
+ glad_glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC) load(userptr, "glDeleteTexturesEXT");
+ glad_glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC) load(userptr, "glGenTexturesEXT");
+ glad_glIsTextureEXT = (PFNGLISTEXTUREEXTPROC) load(userptr, "glIsTextureEXT");
+ glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(userptr, "glPrioritizeTextures");
+ glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC) load(userptr, "glPrioritizeTexturesEXT");
+}
+static void glad_gl_load_GL_EXT_vertex_array( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_vertex_array) return;
+ glad_glArrayElement = (PFNGLARRAYELEMENTPROC) load(userptr, "glArrayElement");
+ glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC) load(userptr, "glArrayElementEXT");
+ glad_glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC) load(userptr, "glColorPointerEXT");
+ glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays");
+ glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC) load(userptr, "glDrawArraysEXT");
+ glad_glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC) load(userptr, "glEdgeFlagPointerEXT");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC) load(userptr, "glGetPointervEXT");
+ glad_glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC) load(userptr, "glIndexPointerEXT");
+ glad_glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC) load(userptr, "glNormalPointerEXT");
+ glad_glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC) load(userptr, "glTexCoordPointerEXT");
+ glad_glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC) load(userptr, "glVertexPointerEXT");
+}
+static void glad_gl_load_GL_INGR_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_INGR_blend_func_separate) return;
+ glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate");
+ glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC) load(userptr, "glBlendFuncSeparateINGR");
+}
+static void glad_gl_load_GL_KHR_debug( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_KHR_debug) return;
+ glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback");
+ glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl");
+ glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert");
+ glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog");
+ glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel");
+ glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel");
+ glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel");
+ glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup");
+ glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup");
+}
+static void glad_gl_load_GL_NV_geometry_program4( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_NV_geometry_program4) return;
+ glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture");
+ glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC) load(userptr, "glFramebufferTextureEXT");
+ glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB");
+ glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) load(userptr, "glFramebufferTextureFaceEXT");
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT");
+ glad_glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC) load(userptr, "glProgramVertexLimitNV");
+}
+static void glad_gl_load_GL_NV_vertex_program( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_NV_vertex_program) return;
+ glad_glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC) load(userptr, "glAreProgramsResidentNV");
+ glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB");
+ glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC) load(userptr, "glBindProgramNV");
+ glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB");
+ glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC) load(userptr, "glDeleteProgramsNV");
+ glad_glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC) load(userptr, "glExecuteProgramNV");
+ glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB");
+ glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC) load(userptr, "glGenProgramsNV");
+ glad_glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC) load(userptr, "glGetProgramParameterdvNV");
+ glad_glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC) load(userptr, "glGetProgramParameterfvNV");
+ glad_glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC) load(userptr, "glGetProgramStringNV");
+ glad_glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC) load(userptr, "glGetProgramivNV");
+ glad_glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC) load(userptr, "glGetTrackMatrixivNV");
+ glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv");
+ glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC) load(userptr, "glGetVertexAttribPointervNV");
+ glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv");
+ glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) load(userptr, "glGetVertexAttribdvNV");
+ glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv");
+ glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) load(userptr, "glGetVertexAttribfvNV");
+ glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv");
+ glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) load(userptr, "glGetVertexAttribivNV");
+ glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB");
+ glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC) load(userptr, "glIsProgramNV");
+ glad_glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC) load(userptr, "glLoadProgramNV");
+ glad_glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC) load(userptr, "glProgramParameter4dNV");
+ glad_glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC) load(userptr, "glProgramParameter4dvNV");
+ glad_glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC) load(userptr, "glProgramParameter4fNV");
+ glad_glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC) load(userptr, "glProgramParameter4fvNV");
+ glad_glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC) load(userptr, "glProgramParameters4dvNV");
+ glad_glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC) load(userptr, "glProgramParameters4fvNV");
+ glad_glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC) load(userptr, "glRequestResidentProgramsNV");
+ glad_glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC) load(userptr, "glTrackMatrixNV");
+ glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d");
+ glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC) load(userptr, "glVertexAttrib1dNV");
+ glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv");
+ glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC) load(userptr, "glVertexAttrib1dvNV");
+ glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f");
+ glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC) load(userptr, "glVertexAttrib1fNV");
+ glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv");
+ glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC) load(userptr, "glVertexAttrib1fvNV");
+ glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s");
+ glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC) load(userptr, "glVertexAttrib1sNV");
+ glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv");
+ glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC) load(userptr, "glVertexAttrib1svNV");
+ glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d");
+ glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC) load(userptr, "glVertexAttrib2dNV");
+ glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv");
+ glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC) load(userptr, "glVertexAttrib2dvNV");
+ glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f");
+ glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC) load(userptr, "glVertexAttrib2fNV");
+ glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv");
+ glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC) load(userptr, "glVertexAttrib2fvNV");
+ glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s");
+ glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC) load(userptr, "glVertexAttrib2sNV");
+ glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv");
+ glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC) load(userptr, "glVertexAttrib2svNV");
+ glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d");
+ glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC) load(userptr, "glVertexAttrib3dNV");
+ glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv");
+ glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC) load(userptr, "glVertexAttrib3dvNV");
+ glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f");
+ glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC) load(userptr, "glVertexAttrib3fNV");
+ glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv");
+ glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC) load(userptr, "glVertexAttrib3fvNV");
+ glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s");
+ glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC) load(userptr, "glVertexAttrib3sNV");
+ glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv");
+ glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC) load(userptr, "glVertexAttrib3svNV");
+ glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub");
+ glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv");
+ glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d");
+ glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC) load(userptr, "glVertexAttrib4dNV");
+ glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv");
+ glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC) load(userptr, "glVertexAttrib4dvNV");
+ glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f");
+ glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC) load(userptr, "glVertexAttrib4fNV");
+ glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv");
+ glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC) load(userptr, "glVertexAttrib4fvNV");
+ glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s");
+ glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC) load(userptr, "glVertexAttrib4sNV");
+ glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv");
+ glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC) load(userptr, "glVertexAttrib4svNV");
+ glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC) load(userptr, "glVertexAttrib4ubNV");
+ glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC) load(userptr, "glVertexAttrib4ubvNV");
+ glad_glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC) load(userptr, "glVertexAttribPointerNV");
+ glad_glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC) load(userptr, "glVertexAttribs1dvNV");
+ glad_glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC) load(userptr, "glVertexAttribs1fvNV");
+ glad_glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC) load(userptr, "glVertexAttribs1svNV");
+ glad_glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC) load(userptr, "glVertexAttribs2dvNV");
+ glad_glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC) load(userptr, "glVertexAttribs2fvNV");
+ glad_glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC) load(userptr, "glVertexAttribs2svNV");
+ glad_glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC) load(userptr, "glVertexAttribs3dvNV");
+ glad_glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC) load(userptr, "glVertexAttribs3fvNV");
+ glad_glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC) load(userptr, "glVertexAttribs3svNV");
+ glad_glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC) load(userptr, "glVertexAttribs4dvNV");
+ glad_glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC) load(userptr, "glVertexAttribs4fvNV");
+ glad_glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC) load(userptr, "glVertexAttribs4svNV");
+ glad_glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC) load(userptr, "glVertexAttribs4ubvNV");
+}
+static void glad_gl_load_GL_OES_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_blend_equation_separate) return;
+ glad_glBlendEquationSeparateOES = (PFNGLBLENDEQUATIONSEPARATEOESPROC) load(userptr, "glBlendEquationSeparateOES");
+}
+static void glad_gl_load_GL_OES_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_blend_func_separate) return;
+ glad_glBlendFuncSeparateOES = (PFNGLBLENDFUNCSEPARATEOESPROC) load(userptr, "glBlendFuncSeparateOES");
+}
+static void glad_gl_load_GL_OES_blend_subtract( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_blend_subtract) return;
+ glad_glBlendEquationOES = (PFNGLBLENDEQUATIONOESPROC) load(userptr, "glBlendEquationOES");
+}
+static void glad_gl_load_GL_OES_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_framebuffer_object) return;
+ glad_glBindFramebufferOES = (PFNGLBINDFRAMEBUFFEROESPROC) load(userptr, "glBindFramebufferOES");
+ glad_glBindRenderbufferOES = (PFNGLBINDRENDERBUFFEROESPROC) load(userptr, "glBindRenderbufferOES");
+ glad_glCheckFramebufferStatusOES = (PFNGLCHECKFRAMEBUFFERSTATUSOESPROC) load(userptr, "glCheckFramebufferStatusOES");
+ glad_glDeleteFramebuffersOES = (PFNGLDELETEFRAMEBUFFERSOESPROC) load(userptr, "glDeleteFramebuffersOES");
+ glad_glDeleteRenderbuffersOES = (PFNGLDELETERENDERBUFFERSOESPROC) load(userptr, "glDeleteRenderbuffersOES");
+ glad_glFramebufferRenderbufferOES = (PFNGLFRAMEBUFFERRENDERBUFFEROESPROC) load(userptr, "glFramebufferRenderbufferOES");
+ glad_glFramebufferTexture2DOES = (PFNGLFRAMEBUFFERTEXTURE2DOESPROC) load(userptr, "glFramebufferTexture2DOES");
+ glad_glGenFramebuffersOES = (PFNGLGENFRAMEBUFFERSOESPROC) load(userptr, "glGenFramebuffersOES");
+ glad_glGenRenderbuffersOES = (PFNGLGENRENDERBUFFERSOESPROC) load(userptr, "glGenRenderbuffersOES");
+ glad_glGenerateMipmapOES = (PFNGLGENERATEMIPMAPOESPROC) load(userptr, "glGenerateMipmapOES");
+ glad_glGetFramebufferAttachmentParameterivOES = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC) load(userptr, "glGetFramebufferAttachmentParameterivOES");
+ glad_glGetRenderbufferParameterivOES = (PFNGLGETRENDERBUFFERPARAMETERIVOESPROC) load(userptr, "glGetRenderbufferParameterivOES");
+ glad_glIsFramebufferOES = (PFNGLISFRAMEBUFFEROESPROC) load(userptr, "glIsFramebufferOES");
+ glad_glIsRenderbufferOES = (PFNGLISRENDERBUFFEROESPROC) load(userptr, "glIsRenderbufferOES");
+ glad_glRenderbufferStorageOES = (PFNGLRENDERBUFFERSTORAGEOESPROC) load(userptr, "glRenderbufferStorageOES");
+}
+static void glad_gl_load_GL_OES_single_precision( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_single_precision) return;
+ glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf");
+ glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC) load(userptr, "glClearDepthfOES");
+ glad_glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC) load(userptr, "glClipPlanefOES");
+ glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef");
+ glad_glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC) load(userptr, "glDepthRangefOES");
+ glad_glFrustumfOES = (PFNGLFRUSTUMFOESPROC) load(userptr, "glFrustumfOES");
+ glad_glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC) load(userptr, "glGetClipPlanefOES");
+ glad_glOrthofOES = (PFNGLORTHOFOESPROC) load(userptr, "glOrthofOES");
+}
+
+
+static void glad_gl_resolve_aliases(void) {
+ if (glad_glActiveTexture == NULL && glad_glActiveTextureARB != NULL) glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC)glad_glActiveTextureARB;
+ if (glad_glActiveTextureARB == NULL && glad_glActiveTexture != NULL) glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glad_glActiveTexture;
+ if (glad_glArrayElement == NULL && glad_glArrayElementEXT != NULL) glad_glArrayElement = (PFNGLARRAYELEMENTPROC)glad_glArrayElementEXT;
+ if (glad_glArrayElementEXT == NULL && glad_glArrayElement != NULL) glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glad_glArrayElement;
+ if (glad_glAttachObjectARB == NULL && glad_glAttachShader != NULL) glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glad_glAttachShader;
+ if (glad_glAttachShader == NULL && glad_glAttachObjectARB != NULL) glad_glAttachShader = (PFNGLATTACHSHADERPROC)glad_glAttachObjectARB;
+ if (glad_glBindAttribLocation == NULL && glad_glBindAttribLocationARB != NULL) glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glad_glBindAttribLocationARB;
+ if (glad_glBindAttribLocationARB == NULL && glad_glBindAttribLocation != NULL) glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glad_glBindAttribLocation;
+ if (glad_glBindBuffer == NULL && glad_glBindBufferARB != NULL) glad_glBindBuffer = (PFNGLBINDBUFFERPROC)glad_glBindBufferARB;
+ if (glad_glBindBufferARB == NULL && glad_glBindBuffer != NULL) glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glad_glBindBuffer;
+ if (glad_glBindProgramARB == NULL && glad_glBindProgramNV != NULL) glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glad_glBindProgramNV;
+ if (glad_glBindProgramNV == NULL && glad_glBindProgramARB != NULL) glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glad_glBindProgramARB;
+ if (glad_glBindTexture == NULL && glad_glBindTextureEXT != NULL) glad_glBindTexture = (PFNGLBINDTEXTUREPROC)glad_glBindTextureEXT;
+ if (glad_glBindTextureEXT == NULL && glad_glBindTexture != NULL) glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glad_glBindTexture;
+ if (glad_glBlendEquation == NULL && glad_glBlendEquationEXT != NULL) glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC)glad_glBlendEquationEXT;
+ if (glad_glBlendEquationEXT == NULL && glad_glBlendEquation != NULL) glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glad_glBlendEquation;
+ if (glad_glBlendEquationSeparate == NULL && glad_glBlendEquationSeparateEXT != NULL) glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glad_glBlendEquationSeparateEXT;
+ if (glad_glBlendEquationSeparateEXT == NULL && glad_glBlendEquationSeparate != NULL) glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glad_glBlendEquationSeparate;
+ if (glad_glBlendFuncSeparate == NULL && glad_glBlendFuncSeparateINGR != NULL) glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glad_glBlendFuncSeparateINGR;
+ if (glad_glBlendFuncSeparate == NULL && glad_glBlendFuncSeparateEXT != NULL) glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glad_glBlendFuncSeparateEXT;
+ if (glad_glBlendFuncSeparateEXT == NULL && glad_glBlendFuncSeparate != NULL) glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glad_glBlendFuncSeparate;
+ if (glad_glBlendFuncSeparateEXT == NULL && glad_glBlendFuncSeparateINGR != NULL) glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glad_glBlendFuncSeparateINGR;
+ if (glad_glBlendFuncSeparateINGR == NULL && glad_glBlendFuncSeparate != NULL) glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC)glad_glBlendFuncSeparate;
+ if (glad_glBlendFuncSeparateINGR == NULL && glad_glBlendFuncSeparateEXT != NULL) glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC)glad_glBlendFuncSeparateEXT;
+ if (glad_glBlitFramebuffer == NULL && glad_glBlitFramebufferEXT != NULL) glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glad_glBlitFramebufferEXT;
+ if (glad_glBlitFramebufferEXT == NULL && glad_glBlitFramebuffer != NULL) glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glad_glBlitFramebuffer;
+ if (glad_glBufferData == NULL && glad_glBufferDataARB != NULL) glad_glBufferData = (PFNGLBUFFERDATAPROC)glad_glBufferDataARB;
+ if (glad_glBufferDataARB == NULL && glad_glBufferData != NULL) glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glad_glBufferData;
+ if (glad_glBufferSubData == NULL && glad_glBufferSubDataARB != NULL) glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glad_glBufferSubDataARB;
+ if (glad_glBufferSubDataARB == NULL && glad_glBufferSubData != NULL) glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glad_glBufferSubData;
+ if (glad_glCheckFramebufferStatus == NULL && glad_glCheckFramebufferStatusEXT != NULL) glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glad_glCheckFramebufferStatusEXT;
+ if (glad_glCheckFramebufferStatusEXT == NULL && glad_glCheckFramebufferStatus != NULL) glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glad_glCheckFramebufferStatus;
+ if (glad_glClearDepthf == NULL && glad_glClearDepthfOES != NULL) glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC)glad_glClearDepthfOES;
+ if (glad_glClearDepthfOES == NULL && glad_glClearDepthf != NULL) glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)glad_glClearDepthf;
+ if (glad_glClientActiveTexture == NULL && glad_glClientActiveTextureARB != NULL) glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glad_glClientActiveTextureARB;
+ if (glad_glClientActiveTextureARB == NULL && glad_glClientActiveTexture != NULL) glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glad_glClientActiveTexture;
+ if (glad_glCompileShader == NULL && glad_glCompileShaderARB != NULL) glad_glCompileShader = (PFNGLCOMPILESHADERPROC)glad_glCompileShaderARB;
+ if (glad_glCompileShaderARB == NULL && glad_glCompileShader != NULL) glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glad_glCompileShader;
+ if (glad_glCopyTexImage1D == NULL && glad_glCopyTexImage1DEXT != NULL) glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC)glad_glCopyTexImage1DEXT;
+ if (glad_glCopyTexImage1DEXT == NULL && glad_glCopyTexImage1D != NULL) glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glad_glCopyTexImage1D;
+ if (glad_glCopyTexImage2D == NULL && glad_glCopyTexImage2DEXT != NULL) glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)glad_glCopyTexImage2DEXT;
+ if (glad_glCopyTexImage2DEXT == NULL && glad_glCopyTexImage2D != NULL) glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glad_glCopyTexImage2D;
+ if (glad_glCopyTexSubImage1D == NULL && glad_glCopyTexSubImage1DEXT != NULL) glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC)glad_glCopyTexSubImage1DEXT;
+ if (glad_glCopyTexSubImage1DEXT == NULL && glad_glCopyTexSubImage1D != NULL) glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glad_glCopyTexSubImage1D;
+ if (glad_glCopyTexSubImage2D == NULL && glad_glCopyTexSubImage2DEXT != NULL) glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)glad_glCopyTexSubImage2DEXT;
+ if (glad_glCopyTexSubImage2DEXT == NULL && glad_glCopyTexSubImage2D != NULL) glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glad_glCopyTexSubImage2D;
+ if (glad_glCopyTexSubImage3D == NULL && glad_glCopyTexSubImage3DEXT != NULL) glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glad_glCopyTexSubImage3DEXT;
+ if (glad_glCopyTexSubImage3DEXT == NULL && glad_glCopyTexSubImage3D != NULL) glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glad_glCopyTexSubImage3D;
+ if (glad_glCreateProgram == NULL && glad_glCreateProgramObjectARB != NULL) glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC)glad_glCreateProgramObjectARB;
+ if (glad_glCreateProgramObjectARB == NULL && glad_glCreateProgram != NULL) glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glad_glCreateProgram;
+ if (glad_glCreateShader == NULL && glad_glCreateShaderObjectARB != NULL) glad_glCreateShader = (PFNGLCREATESHADERPROC)glad_glCreateShaderObjectARB;
+ if (glad_glCreateShaderObjectARB == NULL && glad_glCreateShader != NULL) glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glad_glCreateShader;
+ if (glad_glDeleteBuffers == NULL && glad_glDeleteBuffersARB != NULL) glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glad_glDeleteBuffersARB;
+ if (glad_glDeleteBuffersARB == NULL && glad_glDeleteBuffers != NULL) glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glad_glDeleteBuffers;
+ if (glad_glDeleteFramebuffers == NULL && glad_glDeleteFramebuffersEXT != NULL) glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glad_glDeleteFramebuffersEXT;
+ if (glad_glDeleteFramebuffersEXT == NULL && glad_glDeleteFramebuffers != NULL) glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glad_glDeleteFramebuffers;
+ if (glad_glDeleteProgramsARB == NULL && glad_glDeleteProgramsNV != NULL) glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glad_glDeleteProgramsNV;
+ if (glad_glDeleteProgramsNV == NULL && glad_glDeleteProgramsARB != NULL) glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glad_glDeleteProgramsARB;
+ if (glad_glDeleteRenderbuffers == NULL && glad_glDeleteRenderbuffersEXT != NULL) glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glad_glDeleteRenderbuffersEXT;
+ if (glad_glDeleteRenderbuffersEXT == NULL && glad_glDeleteRenderbuffers != NULL) glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glad_glDeleteRenderbuffers;
+ if (glad_glDepthRangef == NULL && glad_glDepthRangefOES != NULL) glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC)glad_glDepthRangefOES;
+ if (glad_glDepthRangefOES == NULL && glad_glDepthRangef != NULL) glad_glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)glad_glDepthRangef;
+ if (glad_glDetachObjectARB == NULL && glad_glDetachShader != NULL) glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glad_glDetachShader;
+ if (glad_glDetachShader == NULL && glad_glDetachObjectARB != NULL) glad_glDetachShader = (PFNGLDETACHSHADERPROC)glad_glDetachObjectARB;
+ if (glad_glDisableVertexAttribArray == NULL && glad_glDisableVertexAttribArrayARB != NULL) glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glad_glDisableVertexAttribArrayARB;
+ if (glad_glDisableVertexAttribArrayARB == NULL && glad_glDisableVertexAttribArray != NULL) glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glad_glDisableVertexAttribArray;
+ if (glad_glDrawArrays == NULL && glad_glDrawArraysEXT != NULL) glad_glDrawArrays = (PFNGLDRAWARRAYSPROC)glad_glDrawArraysEXT;
+ if (glad_glDrawArraysEXT == NULL && glad_glDrawArrays != NULL) glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glad_glDrawArrays;
+ if (glad_glEnableVertexAttribArray == NULL && glad_glEnableVertexAttribArrayARB != NULL) glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glad_glEnableVertexAttribArrayARB;
+ if (glad_glEnableVertexAttribArrayARB == NULL && glad_glEnableVertexAttribArray != NULL) glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glad_glEnableVertexAttribArray;
+ if (glad_glFramebufferRenderbuffer == NULL && glad_glFramebufferRenderbufferEXT != NULL) glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glad_glFramebufferRenderbufferEXT;
+ if (glad_glFramebufferRenderbufferEXT == NULL && glad_glFramebufferRenderbuffer != NULL) glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glad_glFramebufferRenderbuffer;
+ if (glad_glFramebufferTexture == NULL && glad_glFramebufferTextureEXT != NULL) glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glad_glFramebufferTextureEXT;
+ if (glad_glFramebufferTexture == NULL && glad_glFramebufferTextureARB != NULL) glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glad_glFramebufferTextureARB;
+ if (glad_glFramebufferTexture1D == NULL && glad_glFramebufferTexture1DEXT != NULL) glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glad_glFramebufferTexture1DEXT;
+ if (glad_glFramebufferTexture1DEXT == NULL && glad_glFramebufferTexture1D != NULL) glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glad_glFramebufferTexture1D;
+ if (glad_glFramebufferTexture2D == NULL && glad_glFramebufferTexture2DEXT != NULL) glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glad_glFramebufferTexture2DEXT;
+ if (glad_glFramebufferTexture2DEXT == NULL && glad_glFramebufferTexture2D != NULL) glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glad_glFramebufferTexture2D;
+ if (glad_glFramebufferTexture3D == NULL && glad_glFramebufferTexture3DEXT != NULL) glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glad_glFramebufferTexture3DEXT;
+ if (glad_glFramebufferTexture3DEXT == NULL && glad_glFramebufferTexture3D != NULL) glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glad_glFramebufferTexture3D;
+ if (glad_glFramebufferTextureARB == NULL && glad_glFramebufferTextureEXT != NULL) glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glad_glFramebufferTextureEXT;
+ if (glad_glFramebufferTextureARB == NULL && glad_glFramebufferTexture != NULL) glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glad_glFramebufferTexture;
+ if (glad_glFramebufferTextureEXT == NULL && glad_glFramebufferTexture != NULL) glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glad_glFramebufferTexture;
+ if (glad_glFramebufferTextureEXT == NULL && glad_glFramebufferTextureARB != NULL) glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glad_glFramebufferTextureARB;
+ if (glad_glFramebufferTextureFaceARB == NULL && glad_glFramebufferTextureFaceEXT != NULL) glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glad_glFramebufferTextureFaceEXT;
+ if (glad_glFramebufferTextureFaceEXT == NULL && glad_glFramebufferTextureFaceARB != NULL) glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glad_glFramebufferTextureFaceARB;
+ if (glad_glFramebufferTextureLayer == NULL && glad_glFramebufferTextureLayerARB != NULL) glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glad_glFramebufferTextureLayerARB;
+ if (glad_glFramebufferTextureLayer == NULL && glad_glFramebufferTextureLayerEXT != NULL) glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glad_glFramebufferTextureLayerEXT;
+ if (glad_glFramebufferTextureLayerARB == NULL && glad_glFramebufferTextureLayerEXT != NULL) glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glad_glFramebufferTextureLayerEXT;
+ if (glad_glFramebufferTextureLayerARB == NULL && glad_glFramebufferTextureLayer != NULL) glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glad_glFramebufferTextureLayer;
+ if (glad_glFramebufferTextureLayerEXT == NULL && glad_glFramebufferTextureLayerARB != NULL) glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glad_glFramebufferTextureLayerARB;
+ if (glad_glFramebufferTextureLayerEXT == NULL && glad_glFramebufferTextureLayer != NULL) glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glad_glFramebufferTextureLayer;
+ if (glad_glGenBuffers == NULL && glad_glGenBuffersARB != NULL) glad_glGenBuffers = (PFNGLGENBUFFERSPROC)glad_glGenBuffersARB;
+ if (glad_glGenBuffersARB == NULL && glad_glGenBuffers != NULL) glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glad_glGenBuffers;
+ if (glad_glGenerateMipmap == NULL && glad_glGenerateMipmapEXT != NULL) glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glad_glGenerateMipmapEXT;
+ if (glad_glGenerateMipmapEXT == NULL && glad_glGenerateMipmap != NULL) glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glad_glGenerateMipmap;
+ if (glad_glGenFramebuffers == NULL && glad_glGenFramebuffersEXT != NULL) glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glad_glGenFramebuffersEXT;
+ if (glad_glGenFramebuffersEXT == NULL && glad_glGenFramebuffers != NULL) glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glad_glGenFramebuffers;
+ if (glad_glGenProgramsARB == NULL && glad_glGenProgramsNV != NULL) glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glad_glGenProgramsNV;
+ if (glad_glGenProgramsNV == NULL && glad_glGenProgramsARB != NULL) glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glad_glGenProgramsARB;
+ if (glad_glGenRenderbuffers == NULL && glad_glGenRenderbuffersEXT != NULL) glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glad_glGenRenderbuffersEXT;
+ if (glad_glGenRenderbuffersEXT == NULL && glad_glGenRenderbuffers != NULL) glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glad_glGenRenderbuffers;
+ if (glad_glGetActiveAttrib == NULL && glad_glGetActiveAttribARB != NULL) glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glad_glGetActiveAttribARB;
+ if (glad_glGetActiveAttribARB == NULL && glad_glGetActiveAttrib != NULL) glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glad_glGetActiveAttrib;
+ if (glad_glGetActiveUniform == NULL && glad_glGetActiveUniformARB != NULL) glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glad_glGetActiveUniformARB;
+ if (glad_glGetActiveUniformARB == NULL && glad_glGetActiveUniform != NULL) glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glad_glGetActiveUniform;
+ if (glad_glGetAttribLocation == NULL && glad_glGetAttribLocationARB != NULL) glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glad_glGetAttribLocationARB;
+ if (glad_glGetAttribLocationARB == NULL && glad_glGetAttribLocation != NULL) glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glad_glGetAttribLocation;
+ if (glad_glGetBufferParameteriv == NULL && glad_glGetBufferParameterivARB != NULL) glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glad_glGetBufferParameterivARB;
+ if (glad_glGetBufferParameterivARB == NULL && glad_glGetBufferParameteriv != NULL) glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glad_glGetBufferParameteriv;
+ if (glad_glGetBufferPointerv == NULL && glad_glGetBufferPointervARB != NULL) glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glad_glGetBufferPointervARB;
+ if (glad_glGetBufferPointervARB == NULL && glad_glGetBufferPointerv != NULL) glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glad_glGetBufferPointerv;
+ if (glad_glGetBufferSubData == NULL && glad_glGetBufferSubDataARB != NULL) glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glad_glGetBufferSubDataARB;
+ if (glad_glGetBufferSubDataARB == NULL && glad_glGetBufferSubData != NULL) glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glad_glGetBufferSubData;
+ if (glad_glGetFramebufferAttachmentParameteriv == NULL && glad_glGetFramebufferAttachmentParameterivEXT != NULL) glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glad_glGetFramebufferAttachmentParameterivEXT;
+ if (glad_glGetFramebufferAttachmentParameterivEXT == NULL && glad_glGetFramebufferAttachmentParameteriv != NULL) glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glad_glGetFramebufferAttachmentParameteriv;
+ if (glad_glGetPointerv == NULL && glad_glGetPointervEXT != NULL) glad_glGetPointerv = (PFNGLGETPOINTERVPROC)glad_glGetPointervEXT;
+ if (glad_glGetPointervEXT == NULL && glad_glGetPointerv != NULL) glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC)glad_glGetPointerv;
+ if (glad_glGetRenderbufferParameteriv == NULL && glad_glGetRenderbufferParameterivEXT != NULL) glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glad_glGetRenderbufferParameterivEXT;
+ if (glad_glGetRenderbufferParameterivEXT == NULL && glad_glGetRenderbufferParameteriv != NULL) glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glad_glGetRenderbufferParameteriv;
+ if (glad_glGetShaderSource == NULL && glad_glGetShaderSourceARB != NULL) glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glad_glGetShaderSourceARB;
+ if (glad_glGetShaderSourceARB == NULL && glad_glGetShaderSource != NULL) glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glad_glGetShaderSource;
+ if (glad_glGetUniformfv == NULL && glad_glGetUniformfvARB != NULL) glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glad_glGetUniformfvARB;
+ if (glad_glGetUniformfvARB == NULL && glad_glGetUniformfv != NULL) glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glad_glGetUniformfv;
+ if (glad_glGetUniformiv == NULL && glad_glGetUniformivARB != NULL) glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glad_glGetUniformivARB;
+ if (glad_glGetUniformivARB == NULL && glad_glGetUniformiv != NULL) glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glad_glGetUniformiv;
+ if (glad_glGetUniformLocation == NULL && glad_glGetUniformLocationARB != NULL) glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glad_glGetUniformLocationARB;
+ if (glad_glGetUniformLocationARB == NULL && glad_glGetUniformLocation != NULL) glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glad_glGetUniformLocation;
+ if (glad_glGetVertexAttribdv == NULL && glad_glGetVertexAttribdvARB != NULL) glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glad_glGetVertexAttribdvARB;
+ if (glad_glGetVertexAttribdv == NULL && glad_glGetVertexAttribdvNV != NULL) glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glad_glGetVertexAttribdvNV;
+ if (glad_glGetVertexAttribdvARB == NULL && glad_glGetVertexAttribdv != NULL) glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glad_glGetVertexAttribdv;
+ if (glad_glGetVertexAttribdvARB == NULL && glad_glGetVertexAttribdvNV != NULL) glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glad_glGetVertexAttribdvNV;
+ if (glad_glGetVertexAttribdvNV == NULL && glad_glGetVertexAttribdv != NULL) glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glad_glGetVertexAttribdv;
+ if (glad_glGetVertexAttribdvNV == NULL && glad_glGetVertexAttribdvARB != NULL) glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glad_glGetVertexAttribdvARB;
+ if (glad_glGetVertexAttribfv == NULL && glad_glGetVertexAttribfvARB != NULL) glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glad_glGetVertexAttribfvARB;
+ if (glad_glGetVertexAttribfv == NULL && glad_glGetVertexAttribfvNV != NULL) glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glad_glGetVertexAttribfvNV;
+ if (glad_glGetVertexAttribfvARB == NULL && glad_glGetVertexAttribfv != NULL) glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glad_glGetVertexAttribfv;
+ if (glad_glGetVertexAttribfvARB == NULL && glad_glGetVertexAttribfvNV != NULL) glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glad_glGetVertexAttribfvNV;
+ if (glad_glGetVertexAttribfvNV == NULL && glad_glGetVertexAttribfvARB != NULL) glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glad_glGetVertexAttribfvARB;
+ if (glad_glGetVertexAttribfvNV == NULL && glad_glGetVertexAttribfv != NULL) glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glad_glGetVertexAttribfv;
+ if (glad_glGetVertexAttribiv == NULL && glad_glGetVertexAttribivNV != NULL) glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glad_glGetVertexAttribivNV;
+ if (glad_glGetVertexAttribiv == NULL && glad_glGetVertexAttribivARB != NULL) glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glad_glGetVertexAttribivARB;
+ if (glad_glGetVertexAttribivARB == NULL && glad_glGetVertexAttribivNV != NULL) glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glad_glGetVertexAttribivNV;
+ if (glad_glGetVertexAttribivARB == NULL && glad_glGetVertexAttribiv != NULL) glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glad_glGetVertexAttribiv;
+ if (glad_glGetVertexAttribivNV == NULL && glad_glGetVertexAttribiv != NULL) glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glad_glGetVertexAttribiv;
+ if (glad_glGetVertexAttribivNV == NULL && glad_glGetVertexAttribivARB != NULL) glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glad_glGetVertexAttribivARB;
+ if (glad_glGetVertexAttribPointerv == NULL && glad_glGetVertexAttribPointervNV != NULL) glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glad_glGetVertexAttribPointervNV;
+ if (glad_glGetVertexAttribPointerv == NULL && glad_glGetVertexAttribPointervARB != NULL) glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glad_glGetVertexAttribPointervARB;
+ if (glad_glGetVertexAttribPointervARB == NULL && glad_glGetVertexAttribPointervNV != NULL) glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glad_glGetVertexAttribPointervNV;
+ if (glad_glGetVertexAttribPointervARB == NULL && glad_glGetVertexAttribPointerv != NULL) glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glad_glGetVertexAttribPointerv;
+ if (glad_glGetVertexAttribPointervNV == NULL && glad_glGetVertexAttribPointerv != NULL) glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glad_glGetVertexAttribPointerv;
+ if (glad_glGetVertexAttribPointervNV == NULL && glad_glGetVertexAttribPointervARB != NULL) glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glad_glGetVertexAttribPointervARB;
+ if (glad_glIsBuffer == NULL && glad_glIsBufferARB != NULL) glad_glIsBuffer = (PFNGLISBUFFERPROC)glad_glIsBufferARB;
+ if (glad_glIsBufferARB == NULL && glad_glIsBuffer != NULL) glad_glIsBufferARB = (PFNGLISBUFFERARBPROC)glad_glIsBuffer;
+ if (glad_glIsFramebuffer == NULL && glad_glIsFramebufferEXT != NULL) glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glad_glIsFramebufferEXT;
+ if (glad_glIsFramebufferEXT == NULL && glad_glIsFramebuffer != NULL) glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glad_glIsFramebuffer;
+ if (glad_glIsProgramARB == NULL && glad_glIsProgramNV != NULL) glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC)glad_glIsProgramNV;
+ if (glad_glIsProgramNV == NULL && glad_glIsProgramARB != NULL) glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC)glad_glIsProgramARB;
+ if (glad_glIsRenderbuffer == NULL && glad_glIsRenderbufferEXT != NULL) glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glad_glIsRenderbufferEXT;
+ if (glad_glIsRenderbufferEXT == NULL && glad_glIsRenderbuffer != NULL) glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glad_glIsRenderbuffer;
+ if (glad_glLinkProgram == NULL && glad_glLinkProgramARB != NULL) glad_glLinkProgram = (PFNGLLINKPROGRAMPROC)glad_glLinkProgramARB;
+ if (glad_glLinkProgramARB == NULL && glad_glLinkProgram != NULL) glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glad_glLinkProgram;
+ if (glad_glMapBuffer == NULL && glad_glMapBufferARB != NULL) glad_glMapBuffer = (PFNGLMAPBUFFERPROC)glad_glMapBufferARB;
+ if (glad_glMapBufferARB == NULL && glad_glMapBuffer != NULL) glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glad_glMapBuffer;
+ if (glad_glMultiTexCoord1d == NULL && glad_glMultiTexCoord1dARB != NULL) glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glad_glMultiTexCoord1dARB;
+ if (glad_glMultiTexCoord1dARB == NULL && glad_glMultiTexCoord1d != NULL) glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glad_glMultiTexCoord1d;
+ if (glad_glMultiTexCoord1dv == NULL && glad_glMultiTexCoord1dvARB != NULL) glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glad_glMultiTexCoord1dvARB;
+ if (glad_glMultiTexCoord1dvARB == NULL && glad_glMultiTexCoord1dv != NULL) glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glad_glMultiTexCoord1dv;
+ if (glad_glMultiTexCoord1f == NULL && glad_glMultiTexCoord1fARB != NULL) glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glad_glMultiTexCoord1fARB;
+ if (glad_glMultiTexCoord1fARB == NULL && glad_glMultiTexCoord1f != NULL) glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glad_glMultiTexCoord1f;
+ if (glad_glMultiTexCoord1fv == NULL && glad_glMultiTexCoord1fvARB != NULL) glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glad_glMultiTexCoord1fvARB;
+ if (glad_glMultiTexCoord1fvARB == NULL && glad_glMultiTexCoord1fv != NULL) glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glad_glMultiTexCoord1fv;
+ if (glad_glMultiTexCoord1i == NULL && glad_glMultiTexCoord1iARB != NULL) glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glad_glMultiTexCoord1iARB;
+ if (glad_glMultiTexCoord1iARB == NULL && glad_glMultiTexCoord1i != NULL) glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glad_glMultiTexCoord1i;
+ if (glad_glMultiTexCoord1iv == NULL && glad_glMultiTexCoord1ivARB != NULL) glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glad_glMultiTexCoord1ivARB;
+ if (glad_glMultiTexCoord1ivARB == NULL && glad_glMultiTexCoord1iv != NULL) glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glad_glMultiTexCoord1iv;
+ if (glad_glMultiTexCoord1s == NULL && glad_glMultiTexCoord1sARB != NULL) glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glad_glMultiTexCoord1sARB;
+ if (glad_glMultiTexCoord1sARB == NULL && glad_glMultiTexCoord1s != NULL) glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glad_glMultiTexCoord1s;
+ if (glad_glMultiTexCoord1sv == NULL && glad_glMultiTexCoord1svARB != NULL) glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glad_glMultiTexCoord1svARB;
+ if (glad_glMultiTexCoord1svARB == NULL && glad_glMultiTexCoord1sv != NULL) glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glad_glMultiTexCoord1sv;
+ if (glad_glMultiTexCoord2d == NULL && glad_glMultiTexCoord2dARB != NULL) glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glad_glMultiTexCoord2dARB;
+ if (glad_glMultiTexCoord2dARB == NULL && glad_glMultiTexCoord2d != NULL) glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glad_glMultiTexCoord2d;
+ if (glad_glMultiTexCoord2dv == NULL && glad_glMultiTexCoord2dvARB != NULL) glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glad_glMultiTexCoord2dvARB;
+ if (glad_glMultiTexCoord2dvARB == NULL && glad_glMultiTexCoord2dv != NULL) glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glad_glMultiTexCoord2dv;
+ if (glad_glMultiTexCoord2f == NULL && glad_glMultiTexCoord2fARB != NULL) glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glad_glMultiTexCoord2fARB;
+ if (glad_glMultiTexCoord2fARB == NULL && glad_glMultiTexCoord2f != NULL) glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glad_glMultiTexCoord2f;
+ if (glad_glMultiTexCoord2fv == NULL && glad_glMultiTexCoord2fvARB != NULL) glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glad_glMultiTexCoord2fvARB;
+ if (glad_glMultiTexCoord2fvARB == NULL && glad_glMultiTexCoord2fv != NULL) glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glad_glMultiTexCoord2fv;
+ if (glad_glMultiTexCoord2i == NULL && glad_glMultiTexCoord2iARB != NULL) glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glad_glMultiTexCoord2iARB;
+ if (glad_glMultiTexCoord2iARB == NULL && glad_glMultiTexCoord2i != NULL) glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glad_glMultiTexCoord2i;
+ if (glad_glMultiTexCoord2iv == NULL && glad_glMultiTexCoord2ivARB != NULL) glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glad_glMultiTexCoord2ivARB;
+ if (glad_glMultiTexCoord2ivARB == NULL && glad_glMultiTexCoord2iv != NULL) glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glad_glMultiTexCoord2iv;
+ if (glad_glMultiTexCoord2s == NULL && glad_glMultiTexCoord2sARB != NULL) glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glad_glMultiTexCoord2sARB;
+ if (glad_glMultiTexCoord2sARB == NULL && glad_glMultiTexCoord2s != NULL) glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glad_glMultiTexCoord2s;
+ if (glad_glMultiTexCoord2sv == NULL && glad_glMultiTexCoord2svARB != NULL) glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glad_glMultiTexCoord2svARB;
+ if (glad_glMultiTexCoord2svARB == NULL && glad_glMultiTexCoord2sv != NULL) glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glad_glMultiTexCoord2sv;
+ if (glad_glMultiTexCoord3d == NULL && glad_glMultiTexCoord3dARB != NULL) glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glad_glMultiTexCoord3dARB;
+ if (glad_glMultiTexCoord3dARB == NULL && glad_glMultiTexCoord3d != NULL) glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glad_glMultiTexCoord3d;
+ if (glad_glMultiTexCoord3dv == NULL && glad_glMultiTexCoord3dvARB != NULL) glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glad_glMultiTexCoord3dvARB;
+ if (glad_glMultiTexCoord3dvARB == NULL && glad_glMultiTexCoord3dv != NULL) glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glad_glMultiTexCoord3dv;
+ if (glad_glMultiTexCoord3f == NULL && glad_glMultiTexCoord3fARB != NULL) glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glad_glMultiTexCoord3fARB;
+ if (glad_glMultiTexCoord3fARB == NULL && glad_glMultiTexCoord3f != NULL) glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glad_glMultiTexCoord3f;
+ if (glad_glMultiTexCoord3fv == NULL && glad_glMultiTexCoord3fvARB != NULL) glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glad_glMultiTexCoord3fvARB;
+ if (glad_glMultiTexCoord3fvARB == NULL && glad_glMultiTexCoord3fv != NULL) glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glad_glMultiTexCoord3fv;
+ if (glad_glMultiTexCoord3i == NULL && glad_glMultiTexCoord3iARB != NULL) glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glad_glMultiTexCoord3iARB;
+ if (glad_glMultiTexCoord3iARB == NULL && glad_glMultiTexCoord3i != NULL) glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glad_glMultiTexCoord3i;
+ if (glad_glMultiTexCoord3iv == NULL && glad_glMultiTexCoord3ivARB != NULL) glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glad_glMultiTexCoord3ivARB;
+ if (glad_glMultiTexCoord3ivARB == NULL && glad_glMultiTexCoord3iv != NULL) glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glad_glMultiTexCoord3iv;
+ if (glad_glMultiTexCoord3s == NULL && glad_glMultiTexCoord3sARB != NULL) glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glad_glMultiTexCoord3sARB;
+ if (glad_glMultiTexCoord3sARB == NULL && glad_glMultiTexCoord3s != NULL) glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glad_glMultiTexCoord3s;
+ if (glad_glMultiTexCoord3sv == NULL && glad_glMultiTexCoord3svARB != NULL) glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glad_glMultiTexCoord3svARB;
+ if (glad_glMultiTexCoord3svARB == NULL && glad_glMultiTexCoord3sv != NULL) glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glad_glMultiTexCoord3sv;
+ if (glad_glMultiTexCoord4d == NULL && glad_glMultiTexCoord4dARB != NULL) glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glad_glMultiTexCoord4dARB;
+ if (glad_glMultiTexCoord4dARB == NULL && glad_glMultiTexCoord4d != NULL) glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glad_glMultiTexCoord4d;
+ if (glad_glMultiTexCoord4dv == NULL && glad_glMultiTexCoord4dvARB != NULL) glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glad_glMultiTexCoord4dvARB;
+ if (glad_glMultiTexCoord4dvARB == NULL && glad_glMultiTexCoord4dv != NULL) glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glad_glMultiTexCoord4dv;
+ if (glad_glMultiTexCoord4f == NULL && glad_glMultiTexCoord4fARB != NULL) glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glad_glMultiTexCoord4fARB;
+ if (glad_glMultiTexCoord4fARB == NULL && glad_glMultiTexCoord4f != NULL) glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glad_glMultiTexCoord4f;
+ if (glad_glMultiTexCoord4fv == NULL && glad_glMultiTexCoord4fvARB != NULL) glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glad_glMultiTexCoord4fvARB;
+ if (glad_glMultiTexCoord4fvARB == NULL && glad_glMultiTexCoord4fv != NULL) glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glad_glMultiTexCoord4fv;
+ if (glad_glMultiTexCoord4i == NULL && glad_glMultiTexCoord4iARB != NULL) glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glad_glMultiTexCoord4iARB;
+ if (glad_glMultiTexCoord4iARB == NULL && glad_glMultiTexCoord4i != NULL) glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glad_glMultiTexCoord4i;
+ if (glad_glMultiTexCoord4iv == NULL && glad_glMultiTexCoord4ivARB != NULL) glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glad_glMultiTexCoord4ivARB;
+ if (glad_glMultiTexCoord4ivARB == NULL && glad_glMultiTexCoord4iv != NULL) glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glad_glMultiTexCoord4iv;
+ if (glad_glMultiTexCoord4s == NULL && glad_glMultiTexCoord4sARB != NULL) glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glad_glMultiTexCoord4sARB;
+ if (glad_glMultiTexCoord4sARB == NULL && glad_glMultiTexCoord4s != NULL) glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glad_glMultiTexCoord4s;
+ if (glad_glMultiTexCoord4sv == NULL && glad_glMultiTexCoord4svARB != NULL) glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glad_glMultiTexCoord4svARB;
+ if (glad_glMultiTexCoord4svARB == NULL && glad_glMultiTexCoord4sv != NULL) glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glad_glMultiTexCoord4sv;
+ if (glad_glPrioritizeTextures == NULL && glad_glPrioritizeTexturesEXT != NULL) glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC)glad_glPrioritizeTexturesEXT;
+ if (glad_glPrioritizeTexturesEXT == NULL && glad_glPrioritizeTextures != NULL) glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glad_glPrioritizeTextures;
+ if (glad_glProgramParameteri == NULL && glad_glProgramParameteriARB != NULL) glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glad_glProgramParameteriARB;
+ if (glad_glProgramParameteri == NULL && glad_glProgramParameteriEXT != NULL) glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glad_glProgramParameteriEXT;
+ if (glad_glProgramParameteriARB == NULL && glad_glProgramParameteri != NULL) glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glad_glProgramParameteri;
+ if (glad_glProgramParameteriARB == NULL && glad_glProgramParameteriEXT != NULL) glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glad_glProgramParameteriEXT;
+ if (glad_glProgramParameteriEXT == NULL && glad_glProgramParameteriARB != NULL) glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glad_glProgramParameteriARB;
+ if (glad_glProgramParameteriEXT == NULL && glad_glProgramParameteri != NULL) glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glad_glProgramParameteri;
+ if (glad_glRenderbufferStorage == NULL && glad_glRenderbufferStorageEXT != NULL) glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glad_glRenderbufferStorageEXT;
+ if (glad_glRenderbufferStorageEXT == NULL && glad_glRenderbufferStorage != NULL) glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glad_glRenderbufferStorage;
+ if (glad_glRenderbufferStorageMultisample == NULL && glad_glRenderbufferStorageMultisampleEXT != NULL) glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glad_glRenderbufferStorageMultisampleEXT;
+ if (glad_glRenderbufferStorageMultisampleEXT == NULL && glad_glRenderbufferStorageMultisample != NULL) glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glad_glRenderbufferStorageMultisample;
+ if (glad_glShaderSource == NULL && glad_glShaderSourceARB != NULL) glad_glShaderSource = (PFNGLSHADERSOURCEPROC)glad_glShaderSourceARB;
+ if (glad_glShaderSourceARB == NULL && glad_glShaderSource != NULL) glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glad_glShaderSource;
+ if (glad_glTexSubImage1D == NULL && glad_glTexSubImage1DEXT != NULL) glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)glad_glTexSubImage1DEXT;
+ if (glad_glTexSubImage1DEXT == NULL && glad_glTexSubImage1D != NULL) glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glad_glTexSubImage1D;
+ if (glad_glTexSubImage2D == NULL && glad_glTexSubImage2DEXT != NULL) glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)glad_glTexSubImage2DEXT;
+ if (glad_glTexSubImage2DEXT == NULL && glad_glTexSubImage2D != NULL) glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glad_glTexSubImage2D;
+ if (glad_glUniform1f == NULL && glad_glUniform1fARB != NULL) glad_glUniform1f = (PFNGLUNIFORM1FPROC)glad_glUniform1fARB;
+ if (glad_glUniform1fARB == NULL && glad_glUniform1f != NULL) glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glad_glUniform1f;
+ if (glad_glUniform1fv == NULL && glad_glUniform1fvARB != NULL) glad_glUniform1fv = (PFNGLUNIFORM1FVPROC)glad_glUniform1fvARB;
+ if (glad_glUniform1fvARB == NULL && glad_glUniform1fv != NULL) glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glad_glUniform1fv;
+ if (glad_glUniform1i == NULL && glad_glUniform1iARB != NULL) glad_glUniform1i = (PFNGLUNIFORM1IPROC)glad_glUniform1iARB;
+ if (glad_glUniform1iARB == NULL && glad_glUniform1i != NULL) glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glad_glUniform1i;
+ if (glad_glUniform1iv == NULL && glad_glUniform1ivARB != NULL) glad_glUniform1iv = (PFNGLUNIFORM1IVPROC)glad_glUniform1ivARB;
+ if (glad_glUniform1ivARB == NULL && glad_glUniform1iv != NULL) glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glad_glUniform1iv;
+ if (glad_glUniform2f == NULL && glad_glUniform2fARB != NULL) glad_glUniform2f = (PFNGLUNIFORM2FPROC)glad_glUniform2fARB;
+ if (glad_glUniform2fARB == NULL && glad_glUniform2f != NULL) glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glad_glUniform2f;
+ if (glad_glUniform2fv == NULL && glad_glUniform2fvARB != NULL) glad_glUniform2fv = (PFNGLUNIFORM2FVPROC)glad_glUniform2fvARB;
+ if (glad_glUniform2fvARB == NULL && glad_glUniform2fv != NULL) glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glad_glUniform2fv;
+ if (glad_glUniform2i == NULL && glad_glUniform2iARB != NULL) glad_glUniform2i = (PFNGLUNIFORM2IPROC)glad_glUniform2iARB;
+ if (glad_glUniform2iARB == NULL && glad_glUniform2i != NULL) glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glad_glUniform2i;
+ if (glad_glUniform2iv == NULL && glad_glUniform2ivARB != NULL) glad_glUniform2iv = (PFNGLUNIFORM2IVPROC)glad_glUniform2ivARB;
+ if (glad_glUniform2ivARB == NULL && glad_glUniform2iv != NULL) glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glad_glUniform2iv;
+ if (glad_glUniform3f == NULL && glad_glUniform3fARB != NULL) glad_glUniform3f = (PFNGLUNIFORM3FPROC)glad_glUniform3fARB;
+ if (glad_glUniform3fARB == NULL && glad_glUniform3f != NULL) glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glad_glUniform3f;
+ if (glad_glUniform3fv == NULL && glad_glUniform3fvARB != NULL) glad_glUniform3fv = (PFNGLUNIFORM3FVPROC)glad_glUniform3fvARB;
+ if (glad_glUniform3fvARB == NULL && glad_glUniform3fv != NULL) glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glad_glUniform3fv;
+ if (glad_glUniform3i == NULL && glad_glUniform3iARB != NULL) glad_glUniform3i = (PFNGLUNIFORM3IPROC)glad_glUniform3iARB;
+ if (glad_glUniform3iARB == NULL && glad_glUniform3i != NULL) glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glad_glUniform3i;
+ if (glad_glUniform3iv == NULL && glad_glUniform3ivARB != NULL) glad_glUniform3iv = (PFNGLUNIFORM3IVPROC)glad_glUniform3ivARB;
+ if (glad_glUniform3ivARB == NULL && glad_glUniform3iv != NULL) glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glad_glUniform3iv;
+ if (glad_glUniform4f == NULL && glad_glUniform4fARB != NULL) glad_glUniform4f = (PFNGLUNIFORM4FPROC)glad_glUniform4fARB;
+ if (glad_glUniform4fARB == NULL && glad_glUniform4f != NULL) glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glad_glUniform4f;
+ if (glad_glUniform4fv == NULL && glad_glUniform4fvARB != NULL) glad_glUniform4fv = (PFNGLUNIFORM4FVPROC)glad_glUniform4fvARB;
+ if (glad_glUniform4fvARB == NULL && glad_glUniform4fv != NULL) glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glad_glUniform4fv;
+ if (glad_glUniform4i == NULL && glad_glUniform4iARB != NULL) glad_glUniform4i = (PFNGLUNIFORM4IPROC)glad_glUniform4iARB;
+ if (glad_glUniform4iARB == NULL && glad_glUniform4i != NULL) glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glad_glUniform4i;
+ if (glad_glUniform4iv == NULL && glad_glUniform4ivARB != NULL) glad_glUniform4iv = (PFNGLUNIFORM4IVPROC)glad_glUniform4ivARB;
+ if (glad_glUniform4ivARB == NULL && glad_glUniform4iv != NULL) glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glad_glUniform4iv;
+ if (glad_glUniformMatrix2fv == NULL && glad_glUniformMatrix2fvARB != NULL) glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glad_glUniformMatrix2fvARB;
+ if (glad_glUniformMatrix2fvARB == NULL && glad_glUniformMatrix2fv != NULL) glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glad_glUniformMatrix2fv;
+ if (glad_glUniformMatrix3fv == NULL && glad_glUniformMatrix3fvARB != NULL) glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glad_glUniformMatrix3fvARB;
+ if (glad_glUniformMatrix3fvARB == NULL && glad_glUniformMatrix3fv != NULL) glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glad_glUniformMatrix3fv;
+ if (glad_glUniformMatrix4fv == NULL && glad_glUniformMatrix4fvARB != NULL) glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glad_glUniformMatrix4fvARB;
+ if (glad_glUniformMatrix4fvARB == NULL && glad_glUniformMatrix4fv != NULL) glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glad_glUniformMatrix4fv;
+ if (glad_glUnmapBuffer == NULL && glad_glUnmapBufferARB != NULL) glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glad_glUnmapBufferARB;
+ if (glad_glUnmapBufferARB == NULL && glad_glUnmapBuffer != NULL) glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glad_glUnmapBuffer;
+ if (glad_glUseProgram == NULL && glad_glUseProgramObjectARB != NULL) glad_glUseProgram = (PFNGLUSEPROGRAMPROC)glad_glUseProgramObjectARB;
+ if (glad_glUseProgramObjectARB == NULL && glad_glUseProgram != NULL) glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glad_glUseProgram;
+ if (glad_glValidateProgram == NULL && glad_glValidateProgramARB != NULL) glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glad_glValidateProgramARB;
+ if (glad_glValidateProgramARB == NULL && glad_glValidateProgram != NULL) glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glad_glValidateProgram;
+ if (glad_glVertexAttrib1d == NULL && glad_glVertexAttrib1dNV != NULL) glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glad_glVertexAttrib1dNV;
+ if (glad_glVertexAttrib1d == NULL && glad_glVertexAttrib1dARB != NULL) glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glad_glVertexAttrib1dARB;
+ if (glad_glVertexAttrib1dARB == NULL && glad_glVertexAttrib1dNV != NULL) glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glad_glVertexAttrib1dNV;
+ if (glad_glVertexAttrib1dARB == NULL && glad_glVertexAttrib1d != NULL) glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glad_glVertexAttrib1d;
+ if (glad_glVertexAttrib1dNV == NULL && glad_glVertexAttrib1d != NULL) glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glad_glVertexAttrib1d;
+ if (glad_glVertexAttrib1dNV == NULL && glad_glVertexAttrib1dARB != NULL) glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glad_glVertexAttrib1dARB;
+ if (glad_glVertexAttrib1dv == NULL && glad_glVertexAttrib1dvARB != NULL) glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glad_glVertexAttrib1dvARB;
+ if (glad_glVertexAttrib1dv == NULL && glad_glVertexAttrib1dvNV != NULL) glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glad_glVertexAttrib1dvNV;
+ if (glad_glVertexAttrib1dvARB == NULL && glad_glVertexAttrib1dvNV != NULL) glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glad_glVertexAttrib1dvNV;
+ if (glad_glVertexAttrib1dvARB == NULL && glad_glVertexAttrib1dv != NULL) glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glad_glVertexAttrib1dv;
+ if (glad_glVertexAttrib1dvNV == NULL && glad_glVertexAttrib1dvARB != NULL) glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glad_glVertexAttrib1dvARB;
+ if (glad_glVertexAttrib1dvNV == NULL && glad_glVertexAttrib1dv != NULL) glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glad_glVertexAttrib1dv;
+ if (glad_glVertexAttrib1f == NULL && glad_glVertexAttrib1fNV != NULL) glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glad_glVertexAttrib1fNV;
+ if (glad_glVertexAttrib1f == NULL && glad_glVertexAttrib1fARB != NULL) glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glad_glVertexAttrib1fARB;
+ if (glad_glVertexAttrib1fARB == NULL && glad_glVertexAttrib1fNV != NULL) glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glad_glVertexAttrib1fNV;
+ if (glad_glVertexAttrib1fARB == NULL && glad_glVertexAttrib1f != NULL) glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glad_glVertexAttrib1f;
+ if (glad_glVertexAttrib1fNV == NULL && glad_glVertexAttrib1fARB != NULL) glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glad_glVertexAttrib1fARB;
+ if (glad_glVertexAttrib1fNV == NULL && glad_glVertexAttrib1f != NULL) glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glad_glVertexAttrib1f;
+ if (glad_glVertexAttrib1fv == NULL && glad_glVertexAttrib1fvARB != NULL) glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glad_glVertexAttrib1fvARB;
+ if (glad_glVertexAttrib1fv == NULL && glad_glVertexAttrib1fvNV != NULL) glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glad_glVertexAttrib1fvNV;
+ if (glad_glVertexAttrib1fvARB == NULL && glad_glVertexAttrib1fvNV != NULL) glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glad_glVertexAttrib1fvNV;
+ if (glad_glVertexAttrib1fvARB == NULL && glad_glVertexAttrib1fv != NULL) glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glad_glVertexAttrib1fv;
+ if (glad_glVertexAttrib1fvNV == NULL && glad_glVertexAttrib1fvARB != NULL) glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glad_glVertexAttrib1fvARB;
+ if (glad_glVertexAttrib1fvNV == NULL && glad_glVertexAttrib1fv != NULL) glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glad_glVertexAttrib1fv;
+ if (glad_glVertexAttrib1s == NULL && glad_glVertexAttrib1sNV != NULL) glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glad_glVertexAttrib1sNV;
+ if (glad_glVertexAttrib1s == NULL && glad_glVertexAttrib1sARB != NULL) glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glad_glVertexAttrib1sARB;
+ if (glad_glVertexAttrib1sARB == NULL && glad_glVertexAttrib1sNV != NULL) glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glad_glVertexAttrib1sNV;
+ if (glad_glVertexAttrib1sARB == NULL && glad_glVertexAttrib1s != NULL) glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glad_glVertexAttrib1s;
+ if (glad_glVertexAttrib1sNV == NULL && glad_glVertexAttrib1s != NULL) glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glad_glVertexAttrib1s;
+ if (glad_glVertexAttrib1sNV == NULL && glad_glVertexAttrib1sARB != NULL) glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glad_glVertexAttrib1sARB;
+ if (glad_glVertexAttrib1sv == NULL && glad_glVertexAttrib1svNV != NULL) glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glad_glVertexAttrib1svNV;
+ if (glad_glVertexAttrib1sv == NULL && glad_glVertexAttrib1svARB != NULL) glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glad_glVertexAttrib1svARB;
+ if (glad_glVertexAttrib1svARB == NULL && glad_glVertexAttrib1svNV != NULL) glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glad_glVertexAttrib1svNV;
+ if (glad_glVertexAttrib1svARB == NULL && glad_glVertexAttrib1sv != NULL) glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glad_glVertexAttrib1sv;
+ if (glad_glVertexAttrib1svNV == NULL && glad_glVertexAttrib1svARB != NULL) glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glad_glVertexAttrib1svARB;
+ if (glad_glVertexAttrib1svNV == NULL && glad_glVertexAttrib1sv != NULL) glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glad_glVertexAttrib1sv;
+ if (glad_glVertexAttrib2d == NULL && glad_glVertexAttrib2dARB != NULL) glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glad_glVertexAttrib2dARB;
+ if (glad_glVertexAttrib2d == NULL && glad_glVertexAttrib2dNV != NULL) glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glad_glVertexAttrib2dNV;
+ if (glad_glVertexAttrib2dARB == NULL && glad_glVertexAttrib2d != NULL) glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glad_glVertexAttrib2d;
+ if (glad_glVertexAttrib2dARB == NULL && glad_glVertexAttrib2dNV != NULL) glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glad_glVertexAttrib2dNV;
+ if (glad_glVertexAttrib2dNV == NULL && glad_glVertexAttrib2dARB != NULL) glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glad_glVertexAttrib2dARB;
+ if (glad_glVertexAttrib2dNV == NULL && glad_glVertexAttrib2d != NULL) glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glad_glVertexAttrib2d;
+ if (glad_glVertexAttrib2dv == NULL && glad_glVertexAttrib2dvARB != NULL) glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glad_glVertexAttrib2dvARB;
+ if (glad_glVertexAttrib2dv == NULL && glad_glVertexAttrib2dvNV != NULL) glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glad_glVertexAttrib2dvNV;
+ if (glad_glVertexAttrib2dvARB == NULL && glad_glVertexAttrib2dv != NULL) glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glad_glVertexAttrib2dv;
+ if (glad_glVertexAttrib2dvARB == NULL && glad_glVertexAttrib2dvNV != NULL) glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glad_glVertexAttrib2dvNV;
+ if (glad_glVertexAttrib2dvNV == NULL && glad_glVertexAttrib2dv != NULL) glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glad_glVertexAttrib2dv;
+ if (glad_glVertexAttrib2dvNV == NULL && glad_glVertexAttrib2dvARB != NULL) glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glad_glVertexAttrib2dvARB;
+ if (glad_glVertexAttrib2f == NULL && glad_glVertexAttrib2fARB != NULL) glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glad_glVertexAttrib2fARB;
+ if (glad_glVertexAttrib2f == NULL && glad_glVertexAttrib2fNV != NULL) glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glad_glVertexAttrib2fNV;
+ if (glad_glVertexAttrib2fARB == NULL && glad_glVertexAttrib2fNV != NULL) glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glad_glVertexAttrib2fNV;
+ if (glad_glVertexAttrib2fARB == NULL && glad_glVertexAttrib2f != NULL) glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glad_glVertexAttrib2f;
+ if (glad_glVertexAttrib2fNV == NULL && glad_glVertexAttrib2fARB != NULL) glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glad_glVertexAttrib2fARB;
+ if (glad_glVertexAttrib2fNV == NULL && glad_glVertexAttrib2f != NULL) glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glad_glVertexAttrib2f;
+ if (glad_glVertexAttrib2fv == NULL && glad_glVertexAttrib2fvNV != NULL) glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glad_glVertexAttrib2fvNV;
+ if (glad_glVertexAttrib2fv == NULL && glad_glVertexAttrib2fvARB != NULL) glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glad_glVertexAttrib2fvARB;
+ if (glad_glVertexAttrib2fvARB == NULL && glad_glVertexAttrib2fvNV != NULL) glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glad_glVertexAttrib2fvNV;
+ if (glad_glVertexAttrib2fvARB == NULL && glad_glVertexAttrib2fv != NULL) glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glad_glVertexAttrib2fv;
+ if (glad_glVertexAttrib2fvNV == NULL && glad_glVertexAttrib2fvARB != NULL) glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glad_glVertexAttrib2fvARB;
+ if (glad_glVertexAttrib2fvNV == NULL && glad_glVertexAttrib2fv != NULL) glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glad_glVertexAttrib2fv;
+ if (glad_glVertexAttrib2s == NULL && glad_glVertexAttrib2sARB != NULL) glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glad_glVertexAttrib2sARB;
+ if (glad_glVertexAttrib2s == NULL && glad_glVertexAttrib2sNV != NULL) glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glad_glVertexAttrib2sNV;
+ if (glad_glVertexAttrib2sARB == NULL && glad_glVertexAttrib2s != NULL) glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glad_glVertexAttrib2s;
+ if (glad_glVertexAttrib2sARB == NULL && glad_glVertexAttrib2sNV != NULL) glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glad_glVertexAttrib2sNV;
+ if (glad_glVertexAttrib2sNV == NULL && glad_glVertexAttrib2sARB != NULL) glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glad_glVertexAttrib2sARB;
+ if (glad_glVertexAttrib2sNV == NULL && glad_glVertexAttrib2s != NULL) glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glad_glVertexAttrib2s;
+ if (glad_glVertexAttrib2sv == NULL && glad_glVertexAttrib2svARB != NULL) glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glad_glVertexAttrib2svARB;
+ if (glad_glVertexAttrib2sv == NULL && glad_glVertexAttrib2svNV != NULL) glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glad_glVertexAttrib2svNV;
+ if (glad_glVertexAttrib2svARB == NULL && glad_glVertexAttrib2sv != NULL) glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glad_glVertexAttrib2sv;
+ if (glad_glVertexAttrib2svARB == NULL && glad_glVertexAttrib2svNV != NULL) glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glad_glVertexAttrib2svNV;
+ if (glad_glVertexAttrib2svNV == NULL && glad_glVertexAttrib2sv != NULL) glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glad_glVertexAttrib2sv;
+ if (glad_glVertexAttrib2svNV == NULL && glad_glVertexAttrib2svARB != NULL) glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glad_glVertexAttrib2svARB;
+ if (glad_glVertexAttrib3d == NULL && glad_glVertexAttrib3dARB != NULL) glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glad_glVertexAttrib3dARB;
+ if (glad_glVertexAttrib3d == NULL && glad_glVertexAttrib3dNV != NULL) glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glad_glVertexAttrib3dNV;
+ if (glad_glVertexAttrib3dARB == NULL && glad_glVertexAttrib3d != NULL) glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glad_glVertexAttrib3d;
+ if (glad_glVertexAttrib3dARB == NULL && glad_glVertexAttrib3dNV != NULL) glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glad_glVertexAttrib3dNV;
+ if (glad_glVertexAttrib3dNV == NULL && glad_glVertexAttrib3dARB != NULL) glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glad_glVertexAttrib3dARB;
+ if (glad_glVertexAttrib3dNV == NULL && glad_glVertexAttrib3d != NULL) glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glad_glVertexAttrib3d;
+ if (glad_glVertexAttrib3dv == NULL && glad_glVertexAttrib3dvARB != NULL) glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glad_glVertexAttrib3dvARB;
+ if (glad_glVertexAttrib3dv == NULL && glad_glVertexAttrib3dvNV != NULL) glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glad_glVertexAttrib3dvNV;
+ if (glad_glVertexAttrib3dvARB == NULL && glad_glVertexAttrib3dv != NULL) glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glad_glVertexAttrib3dv;
+ if (glad_glVertexAttrib3dvARB == NULL && glad_glVertexAttrib3dvNV != NULL) glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glad_glVertexAttrib3dvNV;
+ if (glad_glVertexAttrib3dvNV == NULL && glad_glVertexAttrib3dv != NULL) glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glad_glVertexAttrib3dv;
+ if (glad_glVertexAttrib3dvNV == NULL && glad_glVertexAttrib3dvARB != NULL) glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glad_glVertexAttrib3dvARB;
+ if (glad_glVertexAttrib3f == NULL && glad_glVertexAttrib3fARB != NULL) glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glad_glVertexAttrib3fARB;
+ if (glad_glVertexAttrib3f == NULL && glad_glVertexAttrib3fNV != NULL) glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glad_glVertexAttrib3fNV;
+ if (glad_glVertexAttrib3fARB == NULL && glad_glVertexAttrib3f != NULL) glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glad_glVertexAttrib3f;
+ if (glad_glVertexAttrib3fARB == NULL && glad_glVertexAttrib3fNV != NULL) glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glad_glVertexAttrib3fNV;
+ if (glad_glVertexAttrib3fNV == NULL && glad_glVertexAttrib3f != NULL) glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glad_glVertexAttrib3f;
+ if (glad_glVertexAttrib3fNV == NULL && glad_glVertexAttrib3fARB != NULL) glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glad_glVertexAttrib3fARB;
+ if (glad_glVertexAttrib3fv == NULL && glad_glVertexAttrib3fvNV != NULL) glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glad_glVertexAttrib3fvNV;
+ if (glad_glVertexAttrib3fv == NULL && glad_glVertexAttrib3fvARB != NULL) glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glad_glVertexAttrib3fvARB;
+ if (glad_glVertexAttrib3fvARB == NULL && glad_glVertexAttrib3fvNV != NULL) glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glad_glVertexAttrib3fvNV;
+ if (glad_glVertexAttrib3fvARB == NULL && glad_glVertexAttrib3fv != NULL) glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glad_glVertexAttrib3fv;
+ if (glad_glVertexAttrib3fvNV == NULL && glad_glVertexAttrib3fv != NULL) glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glad_glVertexAttrib3fv;
+ if (glad_glVertexAttrib3fvNV == NULL && glad_glVertexAttrib3fvARB != NULL) glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glad_glVertexAttrib3fvARB;
+ if (glad_glVertexAttrib3s == NULL && glad_glVertexAttrib3sARB != NULL) glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glad_glVertexAttrib3sARB;
+ if (glad_glVertexAttrib3s == NULL && glad_glVertexAttrib3sNV != NULL) glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glad_glVertexAttrib3sNV;
+ if (glad_glVertexAttrib3sARB == NULL && glad_glVertexAttrib3s != NULL) glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glad_glVertexAttrib3s;
+ if (glad_glVertexAttrib3sARB == NULL && glad_glVertexAttrib3sNV != NULL) glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glad_glVertexAttrib3sNV;
+ if (glad_glVertexAttrib3sNV == NULL && glad_glVertexAttrib3sARB != NULL) glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glad_glVertexAttrib3sARB;
+ if (glad_glVertexAttrib3sNV == NULL && glad_glVertexAttrib3s != NULL) glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glad_glVertexAttrib3s;
+ if (glad_glVertexAttrib3sv == NULL && glad_glVertexAttrib3svARB != NULL) glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glad_glVertexAttrib3svARB;
+ if (glad_glVertexAttrib3sv == NULL && glad_glVertexAttrib3svNV != NULL) glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glad_glVertexAttrib3svNV;
+ if (glad_glVertexAttrib3svARB == NULL && glad_glVertexAttrib3sv != NULL) glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glad_glVertexAttrib3sv;
+ if (glad_glVertexAttrib3svARB == NULL && glad_glVertexAttrib3svNV != NULL) glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glad_glVertexAttrib3svNV;
+ if (glad_glVertexAttrib3svNV == NULL && glad_glVertexAttrib3sv != NULL) glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glad_glVertexAttrib3sv;
+ if (glad_glVertexAttrib3svNV == NULL && glad_glVertexAttrib3svARB != NULL) glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glad_glVertexAttrib3svARB;
+ if (glad_glVertexAttrib4bv == NULL && glad_glVertexAttrib4bvARB != NULL) glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glad_glVertexAttrib4bvARB;
+ if (glad_glVertexAttrib4bvARB == NULL && glad_glVertexAttrib4bv != NULL) glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glad_glVertexAttrib4bv;
+ if (glad_glVertexAttrib4d == NULL && glad_glVertexAttrib4dNV != NULL) glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glad_glVertexAttrib4dNV;
+ if (glad_glVertexAttrib4d == NULL && glad_glVertexAttrib4dARB != NULL) glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glad_glVertexAttrib4dARB;
+ if (glad_glVertexAttrib4dARB == NULL && glad_glVertexAttrib4dNV != NULL) glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glad_glVertexAttrib4dNV;
+ if (glad_glVertexAttrib4dARB == NULL && glad_glVertexAttrib4d != NULL) glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glad_glVertexAttrib4d;
+ if (glad_glVertexAttrib4dNV == NULL && glad_glVertexAttrib4d != NULL) glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glad_glVertexAttrib4d;
+ if (glad_glVertexAttrib4dNV == NULL && glad_glVertexAttrib4dARB != NULL) glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glad_glVertexAttrib4dARB;
+ if (glad_glVertexAttrib4dv == NULL && glad_glVertexAttrib4dvNV != NULL) glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glad_glVertexAttrib4dvNV;
+ if (glad_glVertexAttrib4dv == NULL && glad_glVertexAttrib4dvARB != NULL) glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glad_glVertexAttrib4dvARB;
+ if (glad_glVertexAttrib4dvARB == NULL && glad_glVertexAttrib4dvNV != NULL) glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glad_glVertexAttrib4dvNV;
+ if (glad_glVertexAttrib4dvARB == NULL && glad_glVertexAttrib4dv != NULL) glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glad_glVertexAttrib4dv;
+ if (glad_glVertexAttrib4dvNV == NULL && glad_glVertexAttrib4dvARB != NULL) glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glad_glVertexAttrib4dvARB;
+ if (glad_glVertexAttrib4dvNV == NULL && glad_glVertexAttrib4dv != NULL) glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glad_glVertexAttrib4dv;
+ if (glad_glVertexAttrib4f == NULL && glad_glVertexAttrib4fNV != NULL) glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glad_glVertexAttrib4fNV;
+ if (glad_glVertexAttrib4f == NULL && glad_glVertexAttrib4fARB != NULL) glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glad_glVertexAttrib4fARB;
+ if (glad_glVertexAttrib4fARB == NULL && glad_glVertexAttrib4f != NULL) glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glad_glVertexAttrib4f;
+ if (glad_glVertexAttrib4fARB == NULL && glad_glVertexAttrib4fNV != NULL) glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glad_glVertexAttrib4fNV;
+ if (glad_glVertexAttrib4fNV == NULL && glad_glVertexAttrib4f != NULL) glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glad_glVertexAttrib4f;
+ if (glad_glVertexAttrib4fNV == NULL && glad_glVertexAttrib4fARB != NULL) glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glad_glVertexAttrib4fARB;
+ if (glad_glVertexAttrib4fv == NULL && glad_glVertexAttrib4fvARB != NULL) glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glad_glVertexAttrib4fvARB;
+ if (glad_glVertexAttrib4fv == NULL && glad_glVertexAttrib4fvNV != NULL) glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glad_glVertexAttrib4fvNV;
+ if (glad_glVertexAttrib4fvARB == NULL && glad_glVertexAttrib4fv != NULL) glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glad_glVertexAttrib4fv;
+ if (glad_glVertexAttrib4fvARB == NULL && glad_glVertexAttrib4fvNV != NULL) glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glad_glVertexAttrib4fvNV;
+ if (glad_glVertexAttrib4fvNV == NULL && glad_glVertexAttrib4fv != NULL) glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glad_glVertexAttrib4fv;
+ if (glad_glVertexAttrib4fvNV == NULL && glad_glVertexAttrib4fvARB != NULL) glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glad_glVertexAttrib4fvARB;
+ if (glad_glVertexAttrib4iv == NULL && glad_glVertexAttrib4ivARB != NULL) glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glad_glVertexAttrib4ivARB;
+ if (glad_glVertexAttrib4ivARB == NULL && glad_glVertexAttrib4iv != NULL) glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glad_glVertexAttrib4iv;
+ if (glad_glVertexAttrib4Nbv == NULL && glad_glVertexAttrib4NbvARB != NULL) glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glad_glVertexAttrib4NbvARB;
+ if (glad_glVertexAttrib4NbvARB == NULL && glad_glVertexAttrib4Nbv != NULL) glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glad_glVertexAttrib4Nbv;
+ if (glad_glVertexAttrib4Niv == NULL && glad_glVertexAttrib4NivARB != NULL) glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glad_glVertexAttrib4NivARB;
+ if (glad_glVertexAttrib4NivARB == NULL && glad_glVertexAttrib4Niv != NULL) glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glad_glVertexAttrib4Niv;
+ if (glad_glVertexAttrib4Nsv == NULL && glad_glVertexAttrib4NsvARB != NULL) glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glad_glVertexAttrib4NsvARB;
+ if (glad_glVertexAttrib4NsvARB == NULL && glad_glVertexAttrib4Nsv != NULL) glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glad_glVertexAttrib4Nsv;
+ if (glad_glVertexAttrib4Nub == NULL && glad_glVertexAttrib4ubNV != NULL) glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glad_glVertexAttrib4ubNV;
+ if (glad_glVertexAttrib4Nub == NULL && glad_glVertexAttrib4NubARB != NULL) glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glad_glVertexAttrib4NubARB;
+ if (glad_glVertexAttrib4NubARB == NULL && glad_glVertexAttrib4Nub != NULL) glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glad_glVertexAttrib4Nub;
+ if (glad_glVertexAttrib4NubARB == NULL && glad_glVertexAttrib4ubNV != NULL) glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glad_glVertexAttrib4ubNV;
+ if (glad_glVertexAttrib4Nubv == NULL && glad_glVertexAttrib4ubvNV != NULL) glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glad_glVertexAttrib4ubvNV;
+ if (glad_glVertexAttrib4Nubv == NULL && glad_glVertexAttrib4NubvARB != NULL) glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glad_glVertexAttrib4NubvARB;
+ if (glad_glVertexAttrib4NubvARB == NULL && glad_glVertexAttrib4ubvNV != NULL) glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glad_glVertexAttrib4ubvNV;
+ if (glad_glVertexAttrib4NubvARB == NULL && glad_glVertexAttrib4Nubv != NULL) glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glad_glVertexAttrib4Nubv;
+ if (glad_glVertexAttrib4Nuiv == NULL && glad_glVertexAttrib4NuivARB != NULL) glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glad_glVertexAttrib4NuivARB;
+ if (glad_glVertexAttrib4NuivARB == NULL && glad_glVertexAttrib4Nuiv != NULL) glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glad_glVertexAttrib4Nuiv;
+ if (glad_glVertexAttrib4Nusv == NULL && glad_glVertexAttrib4NusvARB != NULL) glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glad_glVertexAttrib4NusvARB;
+ if (glad_glVertexAttrib4NusvARB == NULL && glad_glVertexAttrib4Nusv != NULL) glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glad_glVertexAttrib4Nusv;
+ if (glad_glVertexAttrib4s == NULL && glad_glVertexAttrib4sNV != NULL) glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glad_glVertexAttrib4sNV;
+ if (glad_glVertexAttrib4s == NULL && glad_glVertexAttrib4sARB != NULL) glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glad_glVertexAttrib4sARB;
+ if (glad_glVertexAttrib4sARB == NULL && glad_glVertexAttrib4sNV != NULL) glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glad_glVertexAttrib4sNV;
+ if (glad_glVertexAttrib4sARB == NULL && glad_glVertexAttrib4s != NULL) glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glad_glVertexAttrib4s;
+ if (glad_glVertexAttrib4sNV == NULL && glad_glVertexAttrib4s != NULL) glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glad_glVertexAttrib4s;
+ if (glad_glVertexAttrib4sNV == NULL && glad_glVertexAttrib4sARB != NULL) glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glad_glVertexAttrib4sARB;
+ if (glad_glVertexAttrib4sv == NULL && glad_glVertexAttrib4svARB != NULL) glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glad_glVertexAttrib4svARB;
+ if (glad_glVertexAttrib4sv == NULL && glad_glVertexAttrib4svNV != NULL) glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glad_glVertexAttrib4svNV;
+ if (glad_glVertexAttrib4svARB == NULL && glad_glVertexAttrib4sv != NULL) glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glad_glVertexAttrib4sv;
+ if (glad_glVertexAttrib4svARB == NULL && glad_glVertexAttrib4svNV != NULL) glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glad_glVertexAttrib4svNV;
+ if (glad_glVertexAttrib4svNV == NULL && glad_glVertexAttrib4svARB != NULL) glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glad_glVertexAttrib4svARB;
+ if (glad_glVertexAttrib4svNV == NULL && glad_glVertexAttrib4sv != NULL) glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glad_glVertexAttrib4sv;
+ if (glad_glVertexAttrib4ubNV == NULL && glad_glVertexAttrib4Nub != NULL) glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glad_glVertexAttrib4Nub;
+ if (glad_glVertexAttrib4ubNV == NULL && glad_glVertexAttrib4NubARB != NULL) glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glad_glVertexAttrib4NubARB;
+ if (glad_glVertexAttrib4ubv == NULL && glad_glVertexAttrib4ubvARB != NULL) glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glad_glVertexAttrib4ubvARB;
+ if (glad_glVertexAttrib4ubvARB == NULL && glad_glVertexAttrib4ubv != NULL) glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glad_glVertexAttrib4ubv;
+ if (glad_glVertexAttrib4ubvNV == NULL && glad_glVertexAttrib4Nubv != NULL) glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glad_glVertexAttrib4Nubv;
+ if (glad_glVertexAttrib4ubvNV == NULL && glad_glVertexAttrib4NubvARB != NULL) glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glad_glVertexAttrib4NubvARB;
+ if (glad_glVertexAttrib4uiv == NULL && glad_glVertexAttrib4uivARB != NULL) glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glad_glVertexAttrib4uivARB;
+ if (glad_glVertexAttrib4uivARB == NULL && glad_glVertexAttrib4uiv != NULL) glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glad_glVertexAttrib4uiv;
+ if (glad_glVertexAttrib4usv == NULL && glad_glVertexAttrib4usvARB != NULL) glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glad_glVertexAttrib4usvARB;
+ if (glad_glVertexAttrib4usvARB == NULL && glad_glVertexAttrib4usv != NULL) glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glad_glVertexAttrib4usv;
+ if (glad_glVertexAttribPointer == NULL && glad_glVertexAttribPointerARB != NULL) glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glad_glVertexAttribPointerARB;
+ if (glad_glVertexAttribPointerARB == NULL && glad_glVertexAttribPointer != NULL) glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glad_glVertexAttribPointer;
+}
+
+#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0)
+#define GLAD_GL_IS_SOME_NEW_VERSION 1
+#else
+#define GLAD_GL_IS_SOME_NEW_VERSION 0
+#endif
+
+static int glad_gl_get_extensions( int version, const char **out_exts, unsigned int *out_num_exts_i, char ***out_exts_i) {
+#if GLAD_GL_IS_SOME_NEW_VERSION
+ if(GLAD_VERSION_MAJOR(version) < 3) {
+#else
+ (void) version;
+ (void) out_num_exts_i;
+ (void) out_exts_i;
+#endif
+ if (glad_glGetString == NULL) {
+ return 0;
+ }
+ *out_exts = (const char *)glad_glGetString(GL_EXTENSIONS);
+#if GLAD_GL_IS_SOME_NEW_VERSION
+ } else {
+ unsigned int index = 0;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (glad_glGetStringi == NULL || glad_glGetIntegerv == NULL) {
+ return 0;
+ }
+ glad_glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i);
+ if (num_exts_i > 0) {
+ exts_i = (char **) malloc(num_exts_i * (sizeof *exts_i));
+ }
+ if (exts_i == NULL) {
+ return 0;
+ }
+ for(index = 0; index < num_exts_i; index++) {
+ const char *gl_str_tmp = (const char*) glad_glGetStringi(GL_EXTENSIONS, index);
+ size_t len = strlen(gl_str_tmp) + 1;
+
+ char *local_str = (char*) malloc(len * sizeof(char));
+ if(local_str != NULL) {
+ memcpy(local_str, gl_str_tmp, len * sizeof(char));
+ }
+
+ exts_i[index] = local_str;
+ }
+
+ *out_num_exts_i = num_exts_i;
+ *out_exts_i = exts_i;
+ }
+#endif
+ return 1;
+}
+static void glad_gl_free_extensions(char **exts_i, unsigned int num_exts_i) {
+ if (exts_i != NULL) {
+ unsigned int index;
+ for(index = 0; index < num_exts_i; index++) {
+ free((void *) (exts_i[index]));
+ }
+ free((void *)exts_i);
+ exts_i = NULL;
+ }
+}
+static int glad_gl_has_extension(int version, const char *exts, unsigned int num_exts_i, char **exts_i, const char *ext) {
+ if(GLAD_VERSION_MAJOR(version) < 3 || !GLAD_GL_IS_SOME_NEW_VERSION) {
+ const char *extensions;
+ const char *loc;
+ const char *terminator;
+ extensions = exts;
+ if(extensions == NULL || ext == NULL) {
+ return 0;
+ }
+ while(1) {
+ loc = strstr(extensions, ext);
+ if(loc == NULL) {
+ return 0;
+ }
+ terminator = loc + strlen(ext);
+ if((loc == extensions || *(loc - 1) == ' ') &&
+ (*terminator == ' ' || *terminator == '\0')) {
+ return 1;
+ }
+ extensions = terminator;
+ }
+ } else {
+ unsigned int index;
+ for(index = 0; index < num_exts_i; index++) {
+ const char *e = exts_i[index];
+ if(strcmp(e, ext) == 0) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const char* name) {
+ return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);
+}
+
+static int glad_gl_find_extensions_gl( int version) {
+ const char *exts = NULL;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (!glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0;
+
+ GLAD_GL_ARB_copy_buffer = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_copy_buffer");
+ GLAD_GL_ARB_fragment_shader = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_fragment_shader");
+ GLAD_GL_ARB_framebuffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_framebuffer_object");
+ GLAD_GL_ARB_geometry_shader4 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_geometry_shader4");
+ GLAD_GL_ARB_get_program_binary = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_get_program_binary");
+ GLAD_GL_ARB_imaging = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_imaging");
+ GLAD_GL_ARB_multitexture = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_multitexture");
+ GLAD_GL_ARB_separate_shader_objects = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_separate_shader_objects");
+ GLAD_GL_ARB_shader_objects = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_objects");
+ GLAD_GL_ARB_shading_language_100 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shading_language_100");
+ GLAD_GL_ARB_texture_non_power_of_two = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_non_power_of_two");
+ GLAD_GL_ARB_vertex_buffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_buffer_object");
+ GLAD_GL_ARB_vertex_program = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_program");
+ GLAD_GL_ARB_vertex_shader = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_shader");
+ GLAD_GL_EXT_blend_equation_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_equation_separate");
+ GLAD_GL_EXT_blend_func_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_func_separate");
+ GLAD_GL_EXT_blend_minmax = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_minmax");
+ GLAD_GL_EXT_blend_subtract = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_subtract");
+ GLAD_GL_EXT_copy_texture = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_copy_texture");
+ GLAD_GL_EXT_framebuffer_blit = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_blit");
+ GLAD_GL_EXT_framebuffer_multisample = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_multisample");
+ GLAD_GL_EXT_framebuffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_object");
+ GLAD_GL_EXT_geometry_shader4 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_geometry_shader4");
+ GLAD_GL_EXT_packed_depth_stencil = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_packed_depth_stencil");
+ GLAD_GL_EXT_subtexture = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_subtexture");
+ GLAD_GL_EXT_texture_array = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_array");
+ GLAD_GL_EXT_texture_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_object");
+ GLAD_GL_EXT_texture_sRGB = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_sRGB");
+ GLAD_GL_EXT_vertex_array = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_vertex_array");
+ GLAD_GL_INGR_blend_func_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_INGR_blend_func_separate");
+ GLAD_GL_KHR_debug = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_debug");
+ GLAD_GL_NV_geometry_program4 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_NV_geometry_program4");
+ GLAD_GL_NV_vertex_program = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_NV_vertex_program");
+ GLAD_GL_SGIS_texture_edge_clamp = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_SGIS_texture_edge_clamp") | glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_edge_clamp");
+ GLAD_GL_OES_single_precision = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision");
+
+ glad_gl_free_extensions(exts_i, num_exts_i);
+
+ return 1;
+}
+
+static int glad_gl_find_core_gl(void) {
+ int i, major, minor;
+ const char* version;
+ const char* prefixes[] = {
+ "OpenGL ES-CM ",
+ "OpenGL ES-CL ",
+ "OpenGL ES ",
+ NULL
+ };
+ version = (const char*) glad_glGetString(GL_VERSION);
+ if (!version) return 0;
+ for (i = 0; prefixes[i]; i++) {
+ const size_t length = strlen(prefixes[i]);
+ if (strncmp(version, prefixes[i], length) == 0) {
+ version += length;
+ break;
+ }
+ }
+
+ GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor);
+
+ GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
+ GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;
+
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) {
+ int version;
+
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ if(glad_glGetString == NULL) return 0;
+ if(glad_glGetString(GL_VERSION) == NULL) return 0;
+ version = glad_gl_find_core_gl();
+
+ glad_gl_load_GL_VERSION_1_0(load, userptr);
+ glad_gl_load_GL_VERSION_1_1(load, userptr);
+
+ if (!glad_gl_find_extensions_gl(version)) return 0;
+ glad_gl_load_GL_ARB_copy_buffer(load, userptr);
+ glad_gl_load_GL_ARB_framebuffer_object(load, userptr);
+ glad_gl_load_GL_ARB_geometry_shader4(load, userptr);
+ glad_gl_load_GL_ARB_get_program_binary(load, userptr);
+ glad_gl_load_GL_ARB_imaging(load, userptr);
+ glad_gl_load_GL_ARB_multitexture(load, userptr);
+ glad_gl_load_GL_ARB_separate_shader_objects(load, userptr);
+ glad_gl_load_GL_ARB_shader_objects(load, userptr);
+ glad_gl_load_GL_ARB_vertex_buffer_object(load, userptr);
+ glad_gl_load_GL_ARB_vertex_program(load, userptr);
+ glad_gl_load_GL_ARB_vertex_shader(load, userptr);
+ glad_gl_load_GL_EXT_blend_equation_separate(load, userptr);
+ glad_gl_load_GL_EXT_blend_func_separate(load, userptr);
+ glad_gl_load_GL_EXT_blend_minmax(load, userptr);
+ glad_gl_load_GL_EXT_copy_texture(load, userptr);
+ glad_gl_load_GL_EXT_framebuffer_blit(load, userptr);
+ glad_gl_load_GL_EXT_framebuffer_multisample(load, userptr);
+ glad_gl_load_GL_EXT_framebuffer_object(load, userptr);
+ glad_gl_load_GL_EXT_geometry_shader4(load, userptr);
+ glad_gl_load_GL_EXT_subtexture(load, userptr);
+ glad_gl_load_GL_EXT_texture_array(load, userptr);
+ glad_gl_load_GL_EXT_texture_object(load, userptr);
+ glad_gl_load_GL_EXT_vertex_array(load, userptr);
+ glad_gl_load_GL_INGR_blend_func_separate(load, userptr);
+ glad_gl_load_GL_KHR_debug(load, userptr);
+ glad_gl_load_GL_NV_geometry_program4(load, userptr);
+ glad_gl_load_GL_NV_vertex_program(load, userptr);
+ glad_gl_load_GL_OES_single_precision(load, userptr);
+
+
+ glad_gl_resolve_aliases();
+
+ return version;
+}
+
+
+int gladLoadGL( GLADloadfunc load) {
+ return gladLoadGLUserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+static int glad_gl_find_extensions_gles1( int version) {
+ const char *exts = NULL;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (!glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0;
+
+ GLAD_GL_EXT_blend_minmax = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_minmax");
+ GLAD_GL_KHR_debug = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_debug");
+ GLAD_GL_EXT_sRGB = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_sRGB");
+ GLAD_GL_OES_blend_equation_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_equation_separate");
+ GLAD_GL_OES_blend_func_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_func_separate");
+ GLAD_GL_OES_blend_subtract = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_subtract");
+ GLAD_GL_OES_framebuffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_framebuffer_object");
+ GLAD_GL_OES_packed_depth_stencil = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_packed_depth_stencil");
+ GLAD_GL_OES_single_precision = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision");
+ GLAD_GL_OES_texture_npot = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_texture_npot");
+
+ glad_gl_free_extensions(exts_i, num_exts_i);
+
+ return 1;
+}
+
+static int glad_gl_find_core_gles1(void) {
+ int i, major, minor;
+ const char* version;
+ const char* prefixes[] = {
+ "OpenGL ES-CM ",
+ "OpenGL ES-CL ",
+ "OpenGL ES ",
+ NULL
+ };
+ version = (const char*) glad_glGetString(GL_VERSION);
+ if (!version) return 0;
+ for (i = 0; prefixes[i]; i++) {
+ const size_t length = strlen(prefixes[i]);
+ if (strncmp(version, prefixes[i], length) == 0) {
+ version += length;
+ break;
+ }
+ }
+
+ GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor);
+
+ GLAD_GL_VERSION_ES_CM_1_0 = (major == 1 && minor >= 0) || major > 1;
+
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+int gladLoadGLES1UserPtr( GLADuserptrloadfunc load, void *userptr) {
+ int version;
+
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ if(glad_glGetString == NULL) return 0;
+ if(glad_glGetString(GL_VERSION) == NULL) return 0;
+ version = glad_gl_find_core_gles1();
+
+ glad_gl_load_GL_VERSION_ES_CM_1_0(load, userptr);
+
+ if (!glad_gl_find_extensions_gles1(version)) return 0;
+ glad_gl_load_GL_EXT_blend_minmax(load, userptr);
+ glad_gl_load_GL_KHR_debug(load, userptr);
+ glad_gl_load_GL_OES_blend_equation_separate(load, userptr);
+ glad_gl_load_GL_OES_blend_func_separate(load, userptr);
+ glad_gl_load_GL_OES_blend_subtract(load, userptr);
+ glad_gl_load_GL_OES_framebuffer_object(load, userptr);
+ glad_gl_load_GL_OES_single_precision(load, userptr);
+
+
+ glad_gl_resolve_aliases();
+
+ return version;
+}
+
+
+int gladLoadGLES1( GLADloadfunc load) {
+ return gladLoadGLES1UserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+
+
+
+
+
+#endif /* GLAD_GL_IMPLEMENTATION */
+
diff --git a/examples/android/app/src/main/assets/sansation.ttf b/examples/android/app/src/main/assets/sansation.ttf
deleted file mode 100644
index d85fbc8..0000000
--- a/examples/android/app/src/main/assets/sansation.ttf
+++ /dev/null
Binary files differ
diff --git a/examples/android/app/src/main/assets/tuffy.ttf b/examples/android/app/src/main/assets/tuffy.ttf
new file mode 100755
index 0000000..8ea6470
--- /dev/null
+++ b/examples/android/app/src/main/assets/tuffy.ttf
Binary files differ
diff --git a/examples/android/app/src/main/jni/main.cpp b/examples/android/app/src/main/jni/main.cpp
index edf67b4..10240e3 100644
--- a/examples/android/app/src/main/jni/main.cpp
+++ b/examples/android/app/src/main/jni/main.cpp
@@ -91,21 +91,13 @@ int main(int argc, char *argv[])
image.setOrigin(texture.getSize().x/2, texture.getSize().y/2);
sf::Font font;
- if (!font.loadFromFile("sansation.ttf"))
+ if (!font.loadFromFile("tuffy.ttf"))
return EXIT_FAILURE;
sf::Text text("Tap anywhere to move the logo.", font, 64);
text.setFillColor(sf::Color::Black);
text.setPosition(10, 10);
- // Loading canary.wav fails for me for now; haven't had time to test why
-
- /*sf::Music music;
- if(!music.openFromFile("canary.wav"))
- return EXIT_FAILURE;
-
- music.play();*/
-
sf::View view = window.getDefaultView();
sf::Color background = sf::Color::White;
diff --git a/examples/asset_licenses.md b/examples/asset_licenses.md
new file mode 100644
index 0000000..989917d
--- /dev/null
+++ b/examples/asset_licenses.md
@@ -0,0 +1,26 @@
+# Assets used by SFML's example projects.
+
+All assets are under public domain (CC0):
+
+| Name | Author | Link |
+| ------------------------------- | ------------------------- | -------------------------- |
+| Tuffy 1.1 font | Thatcher Ulrich | [Ulrich's fonts][1] |
+| sounds/resources/doodle_pop.ogg | MrZeusTheCoder | [public-domain][2] |
+| tennis/resources/ball.wav | MrZeusTheCoder | [public-domain][2] |
+| opengl/resources/background.jpg | Nidhoggn | [Open Game Art][3] |
+| shader/resources/background.jpg | Arcana Dea | [Public Domain Images][4] |
+| shader/resources/devices.png | Kenny.nl | [Game Icons Pack][5] |
+| sound/resources/ding.flac | Kenny.nl | [Interface Sounds Pack][6] |
+| sound/resources/ding.mp3 | Kenny.nl | [Interface Sounds Pack][6] |
+| win32/resources/image1.jpg | Kenny.nl | [Toon Character Pack][7] |
+| win32/resources/image2.jpg | Kenny.nl | [Toon Character Pack][7] |
+| sound/resources/killdeer.wav | US National Park Services | [Bird sounds][8] |
+
+[1]: http://tulrich.com/fonts/
+[2]: https://github.com/MrZeusTheCoder/public-domain
+[3]: https://opengameart.org/content/backgrounds-3
+[4]: https://www.publicdomainpictures.net/en/view-image.php?image=10979&picture=monarch-butterfly
+[5]: https://www.kenney.nl/assets/game-icons
+[6]: https://www.kenney.nl/assets/interface-sounds
+[7]: https://www.kenney.nl/assets/toon-characters-1
+[8]: https://www.nps.gov/subjects/sound/sounds-killdeer.htm \ No newline at end of file
diff --git a/examples/assets/LaunchScreen.storyboard b/examples/assets/LaunchScreen.storyboard
new file mode 100644
index 0000000..e2c2d2c
--- /dev/null
+++ b/examples/assets/LaunchScreen.storyboard
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
+ <device id="ipad9_7" orientation="landscape">
+ <adaptation id="fullscreen"/>
+ </device>
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
+ <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="EHf-IW-A2E">
+ <objects>
+ <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+ <rect key="frame" x="0.0" y="0.0" width="1024" height="768"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="logo.png" translatesAutoresizingMaskIntoConstraints="NO" id="HXY-06-8aG">
+ <rect key="frame" x="0.0" y="0.0" width="1024" height="768"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </imageView>
+ </subviews>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ <viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
+ </view>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="52" y="374.66266866566718"/>
+ </scene>
+ </scenes>
+ <resources>
+ <image name="logo.png" width="512" height="512"/>
+ </resources>
+</document>
diff --git a/examples/assets/icon.icns b/examples/assets/icon.icns
new file mode 100644
index 0000000..cb95460
--- /dev/null
+++ b/examples/assets/icon.icns
Binary files differ
diff --git a/examples/assets/info.plist b/examples/assets/info.plist
new file mode 100644
index 0000000..655be45
--- /dev/null
+++ b/examples/assets/info.plist
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleIconFile</key>
+ <string>icon.icns</string>
+ <key>UILaunchStoryboardName</key>
+ <string>LaunchScreen</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleGetInfoString</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>org.sfml-dev.$(EXECUTABLE_NAME)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleLongVersionString</key>
+ <string>2.6.1</string>
+ <key>CFBundleName</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string></string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string></string>
+ <key>CSResourcesFileMapped</key>
+ <true/>
+ <key>NSHumanReadableCopyright</key>
+ <string></string>
+</dict>
+</plist>
diff --git a/examples/assets/logo.png b/examples/assets/logo.png
new file mode 100644
index 0000000..7b04c41
--- /dev/null
+++ b/examples/assets/logo.png
Binary files differ
diff --git a/examples/cocoa/CMakeLists.txt b/examples/cocoa/CMakeLists.txt
index dfa46be..3d91644 100644
--- a/examples/cocoa/CMakeLists.txt
+++ b/examples/cocoa/CMakeLists.txt
@@ -39,9 +39,9 @@ set(SRC ${SRCROOT}/CocoaAppDelegate.h
compile_xib(INPUT "${SRCROOT}/MainMenu.xib" OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/MainMenu.nib")
# all resource files
-set(RESOURCES ${SRCROOT}/resources/logo.png
- ${SRCROOT}/resources/icon.icns
- ${SRCROOT}/resources/sansation.ttf
+set(RESOURCES ${SRCROOT}/resources/icon.icns
+ ${SRCROOT}/resources/tuffy.ttf
+ ${SRCROOT}/resources/logo.png
${SRCROOT}/resources/blue.png
${SRCROOT}/resources/green.png
${SRCROOT}/resources/red.png
diff --git a/examples/cocoa/CocoaAppDelegate.h b/examples/cocoa/CocoaAppDelegate.h
index 9dab138..999871d 100644
--- a/examples/cocoa/CocoaAppDelegate.h
+++ b/examples/cocoa/CocoaAppDelegate.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/examples/cocoa/CocoaAppDelegate.mm b/examples/cocoa/CocoaAppDelegate.mm
index a58ca87..d9b6078 100644
--- a/examples/cocoa/CocoaAppDelegate.mm
+++ b/examples/cocoa/CocoaAppDelegate.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -31,6 +31,14 @@
#define GREEN @"Green"
#define RED @"Red"
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
// Our PIMPL
struct SFMLmainWindow
{
@@ -48,13 +56,13 @@ struct SFMLmainWindow
sf::FloatRect rect = sprite.getLocalBounds();
sf::Vector2f size(rect.width, rect.height);
sprite.setOrigin(size / 2.f);
- sprite.scale(0.3, 0.3);
+ sprite.scale(0.3f, 0.3f);
unsigned int ww = renderWindow.getSize().x;
unsigned int wh = renderWindow.getSize().y;
sprite.setPosition(sf::Vector2f(ww, wh) / 2.f);
- if (!font.loadFromFile(resPath + "/sansation.ttf"))
+ if (!font.loadFromFile(resPath + "/tuffy.ttf"))
NSLog(@"Couldn't load the font");
text.setFillColor(sf::Color::White);
@@ -117,7 +125,7 @@ struct SFMLmainWindow
self.visible = YES;
// Launch the timer to periodically display our stuff into the Cocoa view.
- self.renderTimer = [NSTimer timerWithTimeInterval:1.f/60.f
+ self.renderTimer = [NSTimer timerWithTimeInterval:1.0/60.0
target:self
selector:@selector(renderMainWindow:)
userInfo:nil
@@ -148,7 +156,7 @@ struct SFMLmainWindow
self.sfmlView = nil;
self.textField = nil;
- delete (SFMLmainWindow*) self.mainWindow;
+ delete static_cast<SFMLmainWindow*>(self.mainWindow);
self.mainWindow = 0;
self.renderTimer = nil;
diff --git a/examples/cocoa/NSString+stdstring.h b/examples/cocoa/NSString+stdstring.h
index cce9bd8..41b3d41 100644
--- a/examples/cocoa/NSString+stdstring.h
+++ b/examples/cocoa/NSString+stdstring.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/examples/cocoa/NSString+stdstring.mm b/examples/cocoa/NSString+stdstring.mm
index 92b7984..331af6e 100644
--- a/examples/cocoa/NSString+stdstring.mm
+++ b/examples/cocoa/NSString+stdstring.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -42,8 +42,8 @@
+(id)stringWithstdwstring:(const std::wstring&)string
{
- char* data = (char*)string.data();
- unsigned size = string.size() * sizeof(wchar_t);
+ const void* data = static_cast<const void*>(string.data());
+ unsigned size = static_cast<unsigned>(string.size() * sizeof(wchar_t));
NSString* str = [[[NSString alloc] initWithBytes:data length:size
encoding:NSUTF32LittleEndianStringEncoding] autorelease];
@@ -67,7 +67,7 @@
// According to Wikipedia, Mac OS X is Little Endian on x86 and x86-64
// https://en.wikipedia.org/wiki/Endianness
NSData* asData = [self dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
- return std::wstring((wchar_t*)[asData bytes], [asData length] / sizeof(wchar_t));
+ return std::wstring(static_cast<const wchar_t*>([asData bytes]), [asData length] / sizeof(wchar_t));
}
@end
diff --git a/examples/cocoa/main.m b/examples/cocoa/main.m
index b7aa944..e572094 100644
--- a/examples/cocoa/main.m
+++ b/examples/cocoa/main.m
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/examples/cocoa/resources/Cocoa-Info.plist b/examples/cocoa/resources/Cocoa-Info.plist
index 1348f3c..aad7102 100644
--- a/examples/cocoa/resources/Cocoa-Info.plist
+++ b/examples/cocoa/resources/Cocoa-Info.plist
@@ -25,7 +25,7 @@
<key>LSMinimumSystemVersion</key>
<string>10.6</string>
<key>NSHumanReadableCopyright</key>
- <string>Copyright Ā© 2007-2018 Marco Antognini and Laurent Gomila. Shared under zlib/libpng License.</string>
+ <string>Copyright Ā© 2007-2023 Marco Antognini and Laurent Gomila. Shared under zlib/libpng License.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
diff --git a/examples/cocoa/resources/sansation.ttf b/examples/cocoa/resources/sansation.ttf
deleted file mode 100644
index d85fbc8..0000000
--- a/examples/cocoa/resources/sansation.ttf
+++ /dev/null
Binary files differ
diff --git a/examples/cocoa/resources/tuffy.ttf b/examples/cocoa/resources/tuffy.ttf
new file mode 100755
index 0000000..8ea6470
--- /dev/null
+++ b/examples/cocoa/resources/tuffy.ttf
Binary files differ
diff --git a/examples/iOS/CMakeLists.txt b/examples/iOS/CMakeLists.txt
deleted file mode 100644
index 24aca5f..0000000
--- a/examples/iOS/CMakeLists.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-
-set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/iOS)
-set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
-
-# All source files
-set(SRC ${SRCROOT}/main.cpp)
-
-set(RESOURCES
- ${SRCROOT}/resources/canary.wav
- ${SRCROOT}/resources/image.png
- ${SRCROOT}/resources/orchestral.ogg
- ${SRCROOT}/resources/sansation.ttf)
-
-set_source_files_properties( ${RESOURCES} PROPERTIES
- MACOSX_PACKAGE_LOCATION Resources )
-
-# Define the window target
-sfml_add_example(ios_demo GUI_APP
- SOURCES ${SRC} ${RESOURCES}
- DEPENDS sfml-window sfml-system sfml-graphics sfml-audio
- "-framework OpenGLES")
-
-# The app needs an identifier and signing to work correctly
-sfml_set_xcode_property(ios_demo CODE_SIGN_IDENTITY "iPhone Developer")
-set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.sfml.ios_demo")
diff --git a/examples/iOS/main.cpp b/examples/iOS/main.cpp
deleted file mode 100644
index 473b2b9..0000000
--- a/examples/iOS/main.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-////////////////////////////////////////////////////////////
-// Headers
-////////////////////////////////////////////////////////////
-#include <SFML/Graphics.hpp>
-#include <SFML/Audio.hpp>
-#include <SFML/Main.hpp>
-
-
-////////////////////////////////////////////////////////////
-/// Entry point of application
-///
-/// \return Application exit code
-///
-////////////////////////////////////////////////////////////
-int main()
-{
- sf::RenderWindow window(sf::VideoMode::getDesktopMode(), "");
-
- sf::Texture texture;
- if(!texture.loadFromFile("image.png"))
- return EXIT_FAILURE;
-
- sf::Sprite image(texture);
- image.setPosition(0, 0);
- image.setOrigin(texture.getSize().x/2, texture.getSize().y/2);
-
- sf::Music music;
- if(!music.openFromFile("canary.wav"))
- return EXIT_FAILURE;
-
- music.play();
-
- sf::View view = window.getDefaultView();
-
- while (window.isOpen())
- {
- sf::Event event;
-
- while (window.pollEvent(event))
- {
- switch (event.type)
- {
- case sf::Event::Closed:
- window.close();
- break;
- case sf::Event::Resized:
- view.setSize(event.size.width, event.size.height);
- view.setCenter(event.size.width/2, event.size.height/2);
- window.setView(view);
- break;
- case sf::Event::TouchBegan:
- if (event.touch.finger == 0)
- {
- image.setPosition(event.touch.x, event.touch.y);
- }
- break;
- }
- }
-
- window.clear(sf::Color::White);
- window.draw(image);
- window.display();
- }
-}
-
diff --git a/examples/iOS/resources/image.png b/examples/iOS/resources/image.png
deleted file mode 100644
index 29ba010..0000000
--- a/examples/iOS/resources/image.png
+++ /dev/null
Binary files differ
diff --git a/examples/iOS/resources/sansation.ttf b/examples/iOS/resources/sansation.ttf
deleted file mode 100644
index d85fbc8..0000000
--- a/examples/iOS/resources/sansation.ttf
+++ /dev/null
Binary files differ
diff --git a/examples/island/CMakeLists.txt b/examples/island/CMakeLists.txt
index 38428e3..71a865d 100644
--- a/examples/island/CMakeLists.txt
+++ b/examples/island/CMakeLists.txt
@@ -7,5 +7,8 @@ set(SRC ${SRCROOT}/Island.cpp)
# define the island target
sfml_add_example(island GUI_APP
SOURCES ${SRC}
- DEPENDS sfml-graphics sfml-window sfml-system
- RESOURCES_DIR resources) \ No newline at end of file
+ DEPENDS sfml-graphics
+ RESOURCES_DIR resources)
+
+# external dependency headers
+target_include_directories(island SYSTEM PRIVATE ${PROJECT_SOURCE_DIR}/examples/island) \ No newline at end of file
diff --git a/examples/island/Island.cpp b/examples/island/Island.cpp
index 50a8f1e..1ec46cb 100644
--- a/examples/island/Island.cpp
+++ b/examples/island/Island.cpp
@@ -3,7 +3,7 @@
// Headers
////////////////////////////////////////////////////////////
#define STB_PERLIN_IMPLEMENTATION
-#include "stb_perlin.h"
+#include <stb_perlin.h>
#include <SFML/Graphics.hpp>
#include <vector>
#include <deque>
@@ -85,7 +85,7 @@ int main()
window.setVerticalSyncEnabled(true);
sf::Font font;
- if (!font.loadFromFile("resources/sansation.ttf"))
+ if (!font.loadFromFile("resources/tuffy.ttf"))
return EXIT_FAILURE;
// Create all of our graphics resources
@@ -273,10 +273,10 @@ float getElevation(float x, float y)
for (int i = 0; i < perlinOctaves; i++)
{
elevation += stb_perlin_noise3(
- x * perlinFrequency * std::pow(perlinFrequencyBase, i),
- y * perlinFrequency * std::pow(perlinFrequencyBase, i),
+ x * perlinFrequency * static_cast<float>(std::pow(perlinFrequencyBase, i)),
+ y * perlinFrequency * static_cast<float>(std::pow(perlinFrequencyBase, i)),
0, 0, 0, 0
- ) * std::pow(perlinFrequencyBase, -i);
+ ) * static_cast<float>(std::pow(perlinFrequencyBase, -i));
}
elevation = (elevation + 1.f) / 2.f;
@@ -288,6 +288,11 @@ float getElevation(float x, float y)
return elevation;
}
+float getElevation(unsigned int x, unsigned int y)
+{
+ return getElevation(static_cast<float>(x), static_cast<float>(y));
+}
+
////////////////////////////////////////////////////////////
/// Get the terrain moisture at the given coordinates.
@@ -307,21 +312,33 @@ float getMoisture(float x, float y)
return (moisture + 1.f) / 2.f;
}
+float getMoisture(unsigned int x, unsigned int y)
+{
+ return getMoisture(static_cast<float>(x), static_cast<float>(y));
+}
+
////////////////////////////////////////////////////////////
/// Get the lowlands terrain color for the given moisture.
///
////////////////////////////////////////////////////////////
+sf::Color colorFromFloats(float r, float g, float b)
+{
+ return sf::Color(static_cast<sf::Uint8>(r),
+ static_cast<sf::Uint8>(g),
+ static_cast<sf::Uint8>(b));
+}
+
sf::Color getLowlandsTerrainColor(float moisture)
{
sf::Color color =
- moisture < 0.27f ? sf::Color(240, 240, 180) :
- moisture < 0.3f ? sf::Color(240 - 240 * (moisture - 0.27f) / 0.03f, 240 - 40 * (moisture - 0.27f) / 0.03f, 180 - 180 * (moisture - 0.27f) / 0.03f) :
- moisture < 0.4f ? sf::Color(0, 200, 0) :
- moisture < 0.48f ? sf::Color(0, 200 - 40 * (moisture - 0.4f) / 0.08f, 0) :
- moisture < 0.6f ? sf::Color(0, 160, 0) :
- moisture < 0.7f ? sf::Color(34 * (moisture - 0.6f) / 0.1f, 160 - 60 * (moisture - 0.6f) / 0.1f, 34 * (moisture - 0.6f) / 0.1f) :
- sf::Color(34, 100, 34);
+ moisture < 0.27f ? colorFromFloats(240, 240, 180) :
+ moisture < 0.3f ? colorFromFloats(240 - (240 * (moisture - 0.27f) / 0.03f), 240 - (40 * (moisture - 0.27f) / 0.03f), 180 - (180 * (moisture - 0.27f) / 0.03f)) :
+ moisture < 0.4f ? colorFromFloats(0, 200, 0) :
+ moisture < 0.48f ? colorFromFloats(0, 200 - (40 * (moisture - 0.4f) / 0.08f), 0) :
+ moisture < 0.6f ? colorFromFloats(0, 160, 0) :
+ moisture < 0.7f ? colorFromFloats((34 * (moisture - 0.6f) / 0.1f), 160 - (60 * (moisture - 0.6f) / 0.1f), (34 * (moisture - 0.6f) / 0.1f)) :
+ colorFromFloats(34, 100, 34);
return color;
}
@@ -338,13 +355,13 @@ sf::Color getHighlandsTerrainColor(float elevation, float moisture)
sf::Color color =
moisture < 0.6f ? sf::Color(112, 128, 144) :
- sf::Color(112 + 110 * (moisture - 0.6f) / 0.4f, 128 + 56 * (moisture - 0.6f) / 0.4f, 144 - 9 * (moisture - 0.6f) / 0.4f);
+ colorFromFloats(112 + (110 * (moisture - 0.6f) / 0.4f), 128 + (56 * (moisture - 0.6f) / 0.4f), 144 - (9 * (moisture - 0.6f) / 0.4f));
float factor = std::min((elevation - 0.4f) / 0.1f, 1.f);
- color.r = lowlandsColor.r * (1.f - factor) + color.r * factor;
- color.g = lowlandsColor.g * (1.f - factor) + color.g * factor;
- color.b = lowlandsColor.b * (1.f - factor) + color.b * factor;
+ color.r = static_cast<sf::Uint8>(lowlandsColor.r * (1.f - factor) + color.r * factor);
+ color.g = static_cast<sf::Uint8>(lowlandsColor.g * (1.f - factor) + color.g * factor);
+ color.b = static_cast<sf::Uint8>(lowlandsColor.b * (1.f - factor) + color.b * factor);
return color;
}
@@ -363,9 +380,9 @@ sf::Color getSnowcapTerrainColor(float elevation, float moisture)
float factor = std::min((elevation - snowcapHeight) / 0.05f, 1.f);
- color.r = highlandsColor.r * (1.f - factor) + color.r * factor;
- color.g = highlandsColor.g * (1.f - factor) + color.g * factor;
- color.b = highlandsColor.b * (1.f - factor) + color.b * factor;
+ color.r = static_cast<sf::Uint8>(highlandsColor.r * (1.f - factor) + color.r * factor);
+ color.g = static_cast<sf::Uint8>(highlandsColor.g * (1.f - factor) + color.g * factor);
+ color.b = static_cast<sf::Uint8>(highlandsColor.b * (1.f - factor) + color.b * factor);
return color;
}
@@ -379,9 +396,9 @@ sf::Color getSnowcapTerrainColor(float elevation, float moisture)
sf::Color getTerrainColor(float elevation, float moisture)
{
sf::Color color =
- elevation < 0.11f ? sf::Color(0, 0, elevation / 0.11f * 74.f + 181.0f) :
- elevation < 0.14f ? sf::Color(std::pow((elevation - 0.11f) / 0.03f, 0.3f) * 48.f, std::pow((elevation - 0.11f) / 0.03f, 0.3f) * 48.f, 255) :
- elevation < 0.16f ? sf::Color((elevation - 0.14f) * 128.f / 0.02f + 48.f, (elevation - 0.14f) * 128.f / 0.02f + 48.f, 127.0f + (0.16f - elevation) * 128.f / 0.02f) :
+ elevation < 0.11f ? sf::Color(0, 0, static_cast<sf::Uint8>(elevation / 0.11f * 74.f + 181.0f)) :
+ elevation < 0.14f ? sf::Color(static_cast<sf::Uint8>(std::pow((elevation - 0.11f) / 0.03f, 0.3f) * 48.f), static_cast<sf::Uint8>(std::pow((elevation - 0.11f) / 0.03f, 0.3f) * 48.f), 255) :
+ elevation < 0.16f ? sf::Color(static_cast<sf::Uint8>((elevation - 0.14f) * 128.f / 0.02f + 48.f), static_cast<sf::Uint8>((elevation - 0.14f) * 128.f / 0.02f + 48.f), static_cast<sf::Uint8>(127.0f + (0.16f - elevation) * 128.f / 0.02f)) :
elevation < 0.17f ? sf::Color(240, 230, 140) :
elevation < 0.4f ? getLowlandsTerrainColor(moisture) :
elevation < snowcapHeight ? getHighlandsTerrainColor(elevation, moisture) :
@@ -397,7 +414,7 @@ sf::Color getTerrainColor(float elevation, float moisture)
/// of the 4 adjacent neighbours.
///
////////////////////////////////////////////////////////////
-sf::Vector2f computeNormal(int x, int y, float left, float right, float bottom, float top)
+sf::Vector2f computeNormal(float left, float right, float bottom, float top)
{
sf::Vector3f deltaX(1, 0, (std::pow(right, heightFlatten) - std::pow(left, heightFlatten)) * heightFactor);
sf::Vector3f deltaY(0, 1, (std::pow(top, heightFlatten) - std::pow(bottom, heightFlatten)) * heightFactor);
@@ -438,9 +455,9 @@ void processWorkItem(std::vector<sf::Vertex>& vertices, const WorkItem& workItem
for (unsigned int y = rowStart; y < rowEnd; y++)
{
- for (int x = 0; x < resolutionX; x++)
+ for (unsigned int x = 0; x < resolutionX; x++)
{
- int arrayIndexBase = ((y - rowStart) * resolutionX + x) * 6;
+ unsigned int arrayIndexBase = ((y - rowStart) * resolutionX + x) * 6;
// Top left corner (first triangle)
if (x > 0)
@@ -453,9 +470,9 @@ void processWorkItem(std::vector<sf::Vertex>& vertices, const WorkItem& workItem
}
else
{
- vertices[arrayIndexBase + 0].position = sf::Vector2f(x * scalingFactorX, y * scalingFactorY);
+ vertices[arrayIndexBase + 0].position = sf::Vector2f(static_cast<float>(x) * scalingFactorX, static_cast<float>(y) * scalingFactorY);
vertices[arrayIndexBase + 0].color = getTerrainColor(getElevation(x, y), getMoisture(x, y));
- vertices[arrayIndexBase + 0].texCoords = computeNormal(x, y, getElevation(x - 1, y), getElevation(x + 1, y), getElevation(x, y + 1), getElevation(x, y - 1));
+ vertices[arrayIndexBase + 0].texCoords = computeNormal(getElevation(x - 1, y), getElevation(x + 1, y), getElevation(x, y + 1), getElevation(x, y - 1));
}
// Bottom left corner (first triangle)
@@ -465,15 +482,15 @@ void processWorkItem(std::vector<sf::Vertex>& vertices, const WorkItem& workItem
}
else
{
- vertices[arrayIndexBase + 1].position = sf::Vector2f(x * scalingFactorX, (y + 1) * scalingFactorY);
+ vertices[arrayIndexBase + 1].position = sf::Vector2f(static_cast<float>(x) * scalingFactorX, static_cast<float>(y + 1) * scalingFactorY);
vertices[arrayIndexBase + 1].color = getTerrainColor(getElevation(x, y + 1), getMoisture(x, y + 1));
- vertices[arrayIndexBase + 1].texCoords = computeNormal(x, y + 1, getElevation(x - 1, y + 1), getElevation(x + 1, y + 1), getElevation(x, y + 2), getElevation(x, y));
+ vertices[arrayIndexBase + 1].texCoords = computeNormal(getElevation(x - 1, y + 1), getElevation(x + 1, y + 1), getElevation(x, y + 2), getElevation(x, y));
}
// Bottom right corner (first triangle)
- vertices[arrayIndexBase + 2].position = sf::Vector2f((x + 1) * scalingFactorX, (y + 1) * scalingFactorY);
+ vertices[arrayIndexBase + 2].position = sf::Vector2f(static_cast<float>(x + 1) * scalingFactorX, static_cast<float>(y + 1) * scalingFactorY);
vertices[arrayIndexBase + 2].color = getTerrainColor(getElevation(x + 1, y + 1), getMoisture(x + 1, y + 1));
- vertices[arrayIndexBase + 2].texCoords = computeNormal(x + 1, y + 1, getElevation(x, y + 1), getElevation(x + 2, y + 1), getElevation(x + 1, y + 2), getElevation(x + 1, y));
+ vertices[arrayIndexBase + 2].texCoords = computeNormal(getElevation(x, y + 1), getElevation(x + 2, y + 1), getElevation(x + 1, y + 2), getElevation(x + 1, y));
// Top left corner (second triangle)
vertices[arrayIndexBase + 3] = vertices[arrayIndexBase + 0];
@@ -488,9 +505,9 @@ void processWorkItem(std::vector<sf::Vertex>& vertices, const WorkItem& workItem
}
else
{
- vertices[arrayIndexBase + 5].position = sf::Vector2f((x + 1) * scalingFactorX, y * scalingFactorY);
+ vertices[arrayIndexBase + 5].position = sf::Vector2f(static_cast<float>(x + 1) * scalingFactorX, static_cast<float>(y) * scalingFactorY);
vertices[arrayIndexBase + 5].color = getTerrainColor(getElevation(x + 1, y), getMoisture(x + 1, y));
- vertices[arrayIndexBase + 5].texCoords = computeNormal(x + 1, y, getElevation(x, y), getElevation(x + 2, y), getElevation(x + 1, y + 1), getElevation(x + 1, y - 1));
+ vertices[arrayIndexBase + 5].texCoords = computeNormal(getElevation(x, y), getElevation(x + 2, y), getElevation(x + 1, y + 1), getElevation(x + 1, y - 1));
}
}
}
diff --git a/examples/island/resources/sansation.ttf b/examples/island/resources/sansation.ttf
deleted file mode 100644
index d85fbc8..0000000
--- a/examples/island/resources/sansation.ttf
+++ /dev/null
Binary files differ
diff --git a/examples/island/resources/tuffy.ttf b/examples/island/resources/tuffy.ttf
new file mode 100755
index 0000000..8ea6470
--- /dev/null
+++ b/examples/island/resources/tuffy.ttf
Binary files differ
diff --git a/examples/joystick/CMakeLists.txt b/examples/joystick/CMakeLists.txt
index f04dc7f..8d92f03 100644
--- a/examples/joystick/CMakeLists.txt
+++ b/examples/joystick/CMakeLists.txt
@@ -7,5 +7,5 @@ set(SRC ${SRCROOT}/Joystick.cpp)
# define the joystick target
sfml_add_example(joystick GUI_APP
SOURCES ${SRC}
- DEPENDS sfml-graphics sfml-window sfml-system
+ DEPENDS sfml-graphics
RESOURCES_DIR resources)
diff --git a/examples/joystick/Joystick.cpp b/examples/joystick/Joystick.cpp
index 0ff7cf9..d3a635f 100644
--- a/examples/joystick/Joystick.cpp
+++ b/examples/joystick/Joystick.cpp
@@ -88,12 +88,12 @@ namespace
int main()
{
// Create the window of the application
- sf::RenderWindow window(sf::VideoMode(400, 680), "Joystick", sf::Style::Close);
+ sf::RenderWindow window(sf::VideoMode(400, 775), "Joystick", sf::Style::Close);
window.setVerticalSyncEnabled(true);
// Load the text font
sf::Font font;
- if (!font.loadFromFile("resources/sansation.ttf"))
+ if (!font.loadFromFile("resources/tuffy.ttf"))
return EXIT_FAILURE;
// Set up our string conversion parameters
@@ -122,10 +122,10 @@ int main()
{
JoystickObject& object = texts[axislabels[i]];
- object.label.setPosition(5.f, 5.f + ((i + 4) * font.getLineSpacing(14)));
+ object.label.setPosition(5.f, 5.f + (static_cast<float>(i + 4) * font.getLineSpacing(14)));
object.label.setString(std::string(axislabels[i]) + ":");
- object.value.setPosition(80.f, 5.f + ((i + 4) * font.getLineSpacing(14)));
+ object.value.setPosition(80.f, 5.f + (static_cast<float>(i + 4) * font.getLineSpacing(14)));
object.value.setString("N/A");
}
@@ -135,10 +135,10 @@ int main()
sstr << "Button " << i;
JoystickObject& object = texts[sstr.str()];
- object.label.setPosition(5.f, 5.f + ((sf::Joystick::AxisCount + i + 4) * font.getLineSpacing(14)));
+ object.label.setPosition(5.f, 5.f + (static_cast<float>(sf::Joystick::AxisCount + i + 4) * font.getLineSpacing(14)));
object.label.setString(sstr.str() + ":");
- object.value.setPosition(80.f, 5.f + ((sf::Joystick::AxisCount + i + 4) * font.getLineSpacing(14)));
+ object.value.setPosition(80.f, 5.f + (static_cast<float>(sf::Joystick::AxisCount + i + 4) * font.getLineSpacing(14)));
object.value.setString("N/A");
}
diff --git a/examples/joystick/resources/sansation.ttf b/examples/joystick/resources/sansation.ttf
deleted file mode 100644
index d85fbc8..0000000
--- a/examples/joystick/resources/sansation.ttf
+++ /dev/null
Binary files differ
diff --git a/examples/joystick/resources/tuffy.ttf b/examples/joystick/resources/tuffy.ttf
new file mode 100755
index 0000000..8ea6470
--- /dev/null
+++ b/examples/joystick/resources/tuffy.ttf
Binary files differ
diff --git a/examples/opengl/CMakeLists.txt b/examples/opengl/CMakeLists.txt
index 9b8ad49..fe71b78 100644
--- a/examples/opengl/CMakeLists.txt
+++ b/examples/opengl/CMakeLists.txt
@@ -4,8 +4,19 @@ set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/opengl)
# all source files
set(SRC ${SRCROOT}/OpenGL.cpp)
+if (SFML_OS_IOS)
+ set(RESOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/resources/background.jpg
+ ${CMAKE_CURRENT_SOURCE_DIR}/resources/tuffy.ttf)
+ set_source_files_properties(${RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+endif()
+
# define the opengl target
sfml_add_example(opengl GUI_APP
SOURCES ${SRC}
- DEPENDS sfml-graphics OpenGL
+ BUNDLE_RESOURCES ${RESOURCES}
+ DEPENDS sfml-graphics
RESOURCES_DIR resources)
+
+# external dependency headers
+target_include_directories(opengl SYSTEM PRIVATE ${PROJECT_SOURCE_DIR}/examples/opengl) \ No newline at end of file
diff --git a/examples/opengl/OpenGL.cpp b/examples/opengl/OpenGL.cpp
index f2260d6..3f726fe 100644
--- a/examples/opengl/OpenGL.cpp
+++ b/examples/opengl/OpenGL.cpp
@@ -3,12 +3,26 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Graphics.hpp>
-#include <SFML/OpenGL.hpp>
+
+#define GLAD_GL_IMPLEMENTATION
+#include <gl.h>
+
+#ifdef SFML_SYSTEM_IOS
+#include <SFML/Main.hpp>
+#endif
#ifndef GL_SRGB8_ALPHA8
#define GL_SRGB8_ALPHA8 0x8C43
#endif
+std::string resourcesDir()
+{
+#ifdef SFML_SYSTEM_IOS
+ return "";
+#else
+ return "resources/";
+#endif
+}
////////////////////////////////////////////////////////////
/// Entry point of application
@@ -35,13 +49,13 @@ int main()
// Create a sprite for the background
sf::Texture backgroundTexture;
backgroundTexture.setSrgb(sRgb);
- if (!backgroundTexture.loadFromFile("resources/background.jpg"))
+ if (!backgroundTexture.loadFromFile(resourcesDir() + "background.jpg"))
return EXIT_FAILURE;
sf::Sprite background(backgroundTexture);
// Create some text to draw on top of our OpenGL object
sf::Font font;
- if (!font.loadFromFile("resources/sansation.ttf"))
+ if (!font.loadFromFile(resourcesDir() + "tuffy.ttf"))
return EXIT_FAILURE;
sf::Text text("SFML / OpenGL demo", font);
sf::Text sRgbInstructions("Press space to toggle sRGB conversion", font);
@@ -49,13 +63,13 @@ int main()
text.setFillColor(sf::Color(255, 255, 255, 170));
sRgbInstructions.setFillColor(sf::Color(255, 255, 255, 170));
mipmapInstructions.setFillColor(sf::Color(255, 255, 255, 170));
- text.setPosition(250.f, 450.f);
- sRgbInstructions.setPosition(150.f, 500.f);
- mipmapInstructions.setPosition(180.f, 550.f);
+ text.setPosition(280.f, 450.f);
+ sRgbInstructions.setPosition(175.f, 500.f);
+ mipmapInstructions.setPosition(200.f, 550.f);
// Load a texture to apply to our 3D cube
sf::Texture texture;
- if (!texture.loadFromFile("resources/texture.jpg"))
+ if (!texture.loadFromFile(resourcesDir() + "logo.png"))
return EXIT_FAILURE;
// Attempt to generate a mipmap for our cube texture
@@ -66,22 +80,37 @@ int main()
// Make the window the active window for OpenGL calls
window.setActive(true);
+ // Load OpenGL or OpenGL ES entry points using glad
+#ifdef SFML_OPENGL_ES
+ gladLoadGLES1(reinterpret_cast<GLADloadfunc>(sf::Context::getFunction));
+#else
+ gladLoadGL(reinterpret_cast<GLADloadfunc>(sf::Context::getFunction));
+#endif
+
// Enable Z-buffer read and write
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
+#ifdef SFML_OPENGL_ES
+ glClearDepthf(1.f);
+#else
glClearDepth(1.f);
+#endif
// Disable lighting
glDisable(GL_LIGHTING);
// Configure the viewport (the same size as the window)
- glViewport(0, 0, window.getSize().x, window.getSize().y);
+ glViewport(0, 0, static_cast<GLsizei>(window.getSize().x), static_cast<GLsizei>(window.getSize().y));
// Setup a perspective projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
- GLfloat ratio = static_cast<float>(window.getSize().x) / window.getSize().y;
+ GLfloat ratio = static_cast<float>(window.getSize().x) / static_cast<float>(window.getSize().y);
+#ifdef SFML_OPENGL_ES
+ glFrustumf(-ratio, ratio, -1.f, 1.f, 1.f, 500.f);
+#else
glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f);
+#endif
// Bind the texture
glEnable(GL_TEXTURE_2D);
@@ -180,7 +209,7 @@ int main()
if (mipmapEnabled)
{
// We simply reload the texture to disable mipmapping
- if (!texture.loadFromFile("resources/texture.jpg"))
+ if (!texture.loadFromFile(resourcesDir() + "logo.png"))
return EXIT_FAILURE;
mipmapEnabled = false;
@@ -203,13 +232,28 @@ int main()
// Adjust the viewport when the window is resized
if (event.type == sf::Event::Resized)
{
+ sf::Vector2u textureSize = backgroundTexture.getSize();
+
// Make the window the active window for OpenGL calls
window.setActive(true);
- glViewport(0, 0, event.size.width, event.size.height);
+ glViewport(0, 0, static_cast<GLsizei>(event.size.width), static_cast<GLsizei>(event.size.height));
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ GLfloat newRatio = static_cast<float>(event.size.width) / static_cast<float>(event.size.height);
+#ifdef SFML_OPENGL_ES
+ glFrustumf(-newRatio, newRatio, -1.f, 1.f, 1.f, 500.f);
+#else
+ glFrustum(-newRatio, newRatio, -1.f, 1.f, 1.f, 500.f);
+#endif
// Make the window no longer the active window for OpenGL calls
window.setActive(false);
+
+ sf::View view;
+ view.setSize(sf::Vector2f(textureSize));
+ view.setCenter(sf::Vector2f(textureSize) / 2.f);
+ window.setView(view);
}
}
@@ -224,9 +268,17 @@ int main()
// Clear the depth buffer
glClear(GL_DEPTH_BUFFER_BIT);
- // We get the position of the mouse cursor, so that we can move the box accordingly
- float x = sf::Mouse::getPosition(window).x * 200.f / window.getSize().x - 100.f;
- float y = -sf::Mouse::getPosition(window).y * 200.f / window.getSize().y + 100.f;
+ // We get the position of the mouse cursor (or touch), so that we can move the box accordingly
+ sf::Vector2i pos;
+
+ #ifdef SFML_SYSTEM_IOS
+ pos = sf::Touch::getPosition(0);
+ #else
+ pos = sf::Mouse::getPosition(window);
+ #endif
+
+ float x = static_cast<float>(pos.x) * 200.f / static_cast<float>(window.getSize().x) - 100.f;
+ float y = -static_cast<float>(pos.y) * 200.f / static_cast<float>(window.getSize().y) + 100.f;
// Apply some transformations
glMatrixMode(GL_MODELVIEW);
diff --git a/examples/opengl/gl.h b/examples/opengl/gl.h
new file mode 100644
index 0000000..54500f6
--- /dev/null
+++ b/examples/opengl/gl.h
@@ -0,0 +1,7837 @@
+/**
+ * Loader generated by glad 2.0.0-beta on Wed Jul 17 01:48:58 2019
+ *
+ * Generator: C/C++
+ * Specification: gl
+ * Extensions: 42
+ *
+ * APIs:
+ * - gl:compatibility=1.1
+ * - gles1:common=1.0
+ *
+ * Options:
+ * - MX_GLOBAL = False
+ * - ON_DEMAND = False
+ * - LOADER = False
+ * - ALIAS = True
+ * - HEADER_ONLY = True
+ * - DEBUG = False
+ * - MX = False
+ *
+ * Commandline:
+ * --merge --api='gl:compatibility=1.1,gles1:common=1.0' --extensions='GL_ARB_copy_buffer,GL_ARB_fragment_shader,GL_ARB_framebuffer_object,GL_ARB_geometry_shader4,GL_ARB_get_program_binary,GL_ARB_imaging,GL_ARB_multitexture,GL_ARB_separate_shader_objects,GL_ARB_shader_objects,GL_ARB_shading_language_100,GL_ARB_texture_non_power_of_two,GL_ARB_vertex_buffer_object,GL_ARB_vertex_program,GL_ARB_vertex_shader,GL_EXT_blend_equation_separate,GL_EXT_blend_func_separate,GL_EXT_blend_minmax,GL_EXT_blend_subtract,GL_EXT_copy_texture,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_EXT_geometry_shader4,GL_EXT_packed_depth_stencil,GL_EXT_subtexture,GL_EXT_texture_array,GL_EXT_texture_object,GL_EXT_texture_sRGB,GL_EXT_vertex_array,GL_INGR_blend_func_separate,GL_KHR_debug,GL_NV_geometry_program4,GL_NV_vertex_program,GL_SGIS_texture_edge_clamp,GL_EXT_sRGB,GL_OES_blend_equation_separate,GL_OES_blend_func_separate,GL_OES_blend_subtract,GL_OES_framebuffer_object,GL_OES_packed_depth_stencil,GL_OES_single_precision,GL_OES_texture_npot' c --alias --header-only
+ *
+ * Online:
+ * http://glad.sh/#api=gl%3Acompatibility%3D1.1%2Cgles1%3Acommon%3D1.0&extensions=GL_ARB_copy_buffer%2CGL_ARB_fragment_shader%2CGL_ARB_framebuffer_object%2CGL_ARB_geometry_shader4%2CGL_ARB_get_program_binary%2CGL_ARB_imaging%2CGL_ARB_multitexture%2CGL_ARB_separate_shader_objects%2CGL_ARB_shader_objects%2CGL_ARB_shading_language_100%2CGL_ARB_texture_non_power_of_two%2CGL_ARB_vertex_buffer_object%2CGL_ARB_vertex_program%2CGL_ARB_vertex_shader%2CGL_EXT_blend_equation_separate%2CGL_EXT_blend_func_separate%2CGL_EXT_blend_minmax%2CGL_EXT_blend_subtract%2CGL_EXT_copy_texture%2CGL_EXT_framebuffer_blit%2CGL_EXT_framebuffer_multisample%2CGL_EXT_framebuffer_object%2CGL_EXT_geometry_shader4%2CGL_EXT_packed_depth_stencil%2CGL_EXT_subtexture%2CGL_EXT_texture_array%2CGL_EXT_texture_object%2CGL_EXT_texture_sRGB%2CGL_EXT_vertex_array%2CGL_INGR_blend_func_separate%2CGL_KHR_debug%2CGL_NV_geometry_program4%2CGL_NV_vertex_program%2CGL_SGIS_texture_edge_clamp%2CGL_EXT_sRGB%2CGL_OES_blend_equation_separate%2CGL_OES_blend_func_separate%2CGL_OES_blend_subtract%2CGL_OES_framebuffer_object%2CGL_OES_packed_depth_stencil%2CGL_OES_single_precision%2CGL_OES_texture_npot&generator=c&options=MERGE%2CALIAS%2CHEADER_ONLY
+ *
+ */
+
+#ifndef GLAD_GL_H_
+#define GLAD_GL_H_
+
+#ifdef __gl_h_
+ #error OpenGL header already included (API: gl), remove previous include!
+#endif
+#define __gl_h_ 1
+
+
+#define GLAD_GL
+#define GLAD_OPTION_GL_ALIAS
+#define GLAD_OPTION_GL_HEADER_ONLY
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef GLAD_PLATFORM_H_
+#define GLAD_PLATFORM_H_
+
+#ifndef GLAD_PLATFORM_WIN32
+ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)
+ #define GLAD_PLATFORM_WIN32 1
+ #else
+ #define GLAD_PLATFORM_WIN32 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_APPLE
+ #ifdef __APPLE__
+ #define GLAD_PLATFORM_APPLE 1
+ #else
+ #define GLAD_PLATFORM_APPLE 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_EMSCRIPTEN
+ #ifdef __EMSCRIPTEN__
+ #define GLAD_PLATFORM_EMSCRIPTEN 1
+ #else
+ #define GLAD_PLATFORM_EMSCRIPTEN 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_UWP
+ #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY)
+ #ifdef __has_include
+ #if __has_include(<winapifamily.h>)
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #endif
+
+ #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY
+ #include <winapifamily.h>
+ #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ #define GLAD_PLATFORM_UWP 1
+ #endif
+ #endif
+
+ #ifndef GLAD_PLATFORM_UWP
+ #define GLAD_PLATFORM_UWP 0
+ #endif
+#endif
+
+#ifdef __GNUC__
+ #define GLAD_GNUC_EXTENSION __extension__
+#else
+ #define GLAD_GNUC_EXTENSION
+#endif
+
+#ifndef GLAD_API_CALL
+ #if defined(GLAD_API_CALL_EXPORT)
+ #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__)
+ #if defined(GLAD_API_CALL_EXPORT_BUILD)
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllexport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllexport) extern
+ #endif
+ #else
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllimport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllimport) extern
+ #endif
+ #endif
+ #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD)
+ #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+#endif
+
+#ifdef APIENTRY
+ #define GLAD_API_PTR APIENTRY
+#elif GLAD_PLATFORM_WIN32
+ #define GLAD_API_PTR __stdcall
+#else
+ #define GLAD_API_PTR
+#endif
+
+#ifndef GLAPI
+#define GLAPI GLAD_API_CALL
+#endif
+
+#ifndef GLAPIENTRY
+#define GLAPIENTRY GLAD_API_PTR
+#endif
+
+#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor)
+#define GLAD_VERSION_MAJOR(version) (version / 10000)
+#define GLAD_VERSION_MINOR(version) (version % 10000)
+
+#define GLAD_GENERATOR_VERSION "2.0.0-beta"
+
+typedef void (*GLADapiproc)(void);
+
+typedef GLADapiproc (*GLADloadfunc)(const char *name);
+typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name);
+
+typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...);
+typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...);
+
+#endif /* GLAD_PLATFORM_H_ */
+
+#define GL_2D 0x0600
+#define GL_2_BYTES 0x1407
+#define GL_3D 0x0601
+#define GL_3D_COLOR 0x0602
+#define GL_3D_COLOR_TEXTURE 0x0603
+#define GL_3_BYTES 0x1408
+#define GL_4D_COLOR_TEXTURE 0x0604
+#define GL_4_BYTES 0x1409
+#define GL_ACCUM 0x0100
+#define GL_ACCUM_ALPHA_BITS 0x0D5B
+#define GL_ACCUM_BLUE_BITS 0x0D5A
+#define GL_ACCUM_BUFFER_BIT 0x00000200
+#define GL_ACCUM_CLEAR_VALUE 0x0B80
+#define GL_ACCUM_GREEN_BITS 0x0D59
+#define GL_ACCUM_RED_BITS 0x0D58
+#define GL_ACTIVE_PROGRAM 0x8259
+#define GL_ACTIVE_TEXTURE_ARB 0x84E0
+#define GL_ADD 0x0104
+#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF
+#define GL_ALL_SHADER_BITS 0xFFFFFFFF
+#define GL_ALPHA 0x1906
+#define GL_ALPHA12 0x803D
+#define GL_ALPHA16 0x803E
+#define GL_ALPHA4 0x803B
+#define GL_ALPHA8 0x803C
+#define GL_ALPHA_BIAS 0x0D1D
+#define GL_ALPHA_BITS 0x0D55
+#define GL_ALPHA_SCALE 0x0D1C
+#define GL_ALPHA_TEST 0x0BC0
+#define GL_ALPHA_TEST_FUNC 0x0BC1
+#define GL_ALPHA_TEST_REF 0x0BC2
+#define GL_ALWAYS 0x0207
+#define GL_AMBIENT 0x1200
+#define GL_AMBIENT_AND_DIFFUSE 0x1602
+#define GL_AND 0x1501
+#define GL_AND_INVERTED 0x1504
+#define GL_AND_REVERSE 0x1502
+#define GL_ARRAY_BUFFER_ARB 0x8892
+#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894
+#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645
+#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623
+#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624
+#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625
+#define GL_ATTRIB_STACK_DEPTH 0x0BB0
+#define GL_AUTO_NORMAL 0x0D80
+#define GL_AUX0 0x0409
+#define GL_AUX1 0x040A
+#define GL_AUX2 0x040B
+#define GL_AUX3 0x040C
+#define GL_AUX_BUFFERS 0x0C00
+#define GL_BACK 0x0405
+#define GL_BACK_LEFT 0x0402
+#define GL_BACK_RIGHT 0x0403
+#define GL_BITMAP 0x1A00
+#define GL_BITMAP_TOKEN 0x0704
+#define GL_BLEND 0x0BE2
+#define GL_BLEND_COLOR 0x8005
+#define GL_BLEND_DST 0x0BE0
+#define GL_BLEND_DST_ALPHA_EXT 0x80CA
+#define GL_BLEND_DST_RGB_EXT 0x80C8
+#define GL_BLEND_EQUATION 0x8009
+#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D
+#define GL_BLEND_EQUATION_EXT 0x8009
+#define GL_BLEND_EQUATION_RGB_EXT 0x8009
+#define GL_BLEND_SRC 0x0BE1
+#define GL_BLEND_SRC_ALPHA_EXT 0x80CB
+#define GL_BLEND_SRC_RGB_EXT 0x80C9
+#define GL_BLUE 0x1905
+#define GL_BLUE_BIAS 0x0D1B
+#define GL_BLUE_BITS 0x0D54
+#define GL_BLUE_SCALE 0x0D1A
+#define GL_BOOL_ARB 0x8B56
+#define GL_BOOL_VEC2_ARB 0x8B57
+#define GL_BOOL_VEC3_ARB 0x8B58
+#define GL_BOOL_VEC4_ARB 0x8B59
+#define GL_BUFFER 0x82E0
+#define GL_BUFFER_ACCESS_ARB 0x88BB
+#define GL_BUFFER_MAPPED_ARB 0x88BC
+#define GL_BUFFER_MAP_POINTER_ARB 0x88BD
+#define GL_BUFFER_SIZE_ARB 0x8764
+#define GL_BUFFER_USAGE_ARB 0x8765
+#define GL_BYTE 0x1400
+#define GL_C3F_V3F 0x2A24
+#define GL_C4F_N3F_V3F 0x2A26
+#define GL_C4UB_V2F 0x2A22
+#define GL_C4UB_V3F 0x2A23
+#define GL_CCW 0x0901
+#define GL_CLAMP 0x2900
+#define GL_CLAMP_TO_EDGE_SGIS 0x812F
+#define GL_CLEAR 0x1500
+#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
+#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF
+#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1
+#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
+#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
+#define GL_CLIP_PLANE0 0x3000
+#define GL_CLIP_PLANE1 0x3001
+#define GL_CLIP_PLANE2 0x3002
+#define GL_CLIP_PLANE3 0x3003
+#define GL_CLIP_PLANE4 0x3004
+#define GL_CLIP_PLANE5 0x3005
+#define GL_COEFF 0x0A00
+#define GL_COLOR 0x1800
+#define GL_COLOR_ARRAY 0x8076
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
+#define GL_COLOR_ARRAY_COUNT_EXT 0x8084
+#define GL_COLOR_ARRAY_EXT 0x8076
+#define GL_COLOR_ARRAY_POINTER 0x8090
+#define GL_COLOR_ARRAY_POINTER_EXT 0x8090
+#define GL_COLOR_ARRAY_SIZE 0x8081
+#define GL_COLOR_ARRAY_SIZE_EXT 0x8081
+#define GL_COLOR_ARRAY_STRIDE 0x8083
+#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083
+#define GL_COLOR_ARRAY_TYPE 0x8082
+#define GL_COLOR_ARRAY_TYPE_EXT 0x8082
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT13_EXT 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
+#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_INDEX 0x1900
+#define GL_COLOR_INDEXES 0x1603
+#define GL_COLOR_LOGIC_OP 0x0BF2
+#define GL_COLOR_MATERIAL 0x0B57
+#define GL_COLOR_MATERIAL_FACE 0x0B55
+#define GL_COLOR_MATERIAL_PARAMETER 0x0B56
+#define GL_COLOR_MATRIX 0x80B1
+#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2
+#define GL_COLOR_SUM_ARB 0x8458
+#define GL_COLOR_TABLE 0x80D0
+#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD
+#define GL_COLOR_TABLE_BIAS 0x80D7
+#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC
+#define GL_COLOR_TABLE_FORMAT 0x80D8
+#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB
+#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF
+#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE
+#define GL_COLOR_TABLE_RED_SIZE 0x80DA
+#define GL_COLOR_TABLE_SCALE 0x80D6
+#define GL_COLOR_TABLE_WIDTH 0x80D9
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E
+#define GL_COMPILE 0x1300
+#define GL_COMPILE_AND_EXECUTE 0x1301
+#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B
+#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A
+#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
+#define GL_COMPRESSED_SRGB_EXT 0x8C48
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_CONSTANT_ATTENUATION 0x1207
+#define GL_CONSTANT_BORDER 0x8151
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
+#define GL_CONVOLUTION_1D 0x8010
+#define GL_CONVOLUTION_2D 0x8011
+#define GL_CONVOLUTION_BORDER_COLOR 0x8154
+#define GL_CONVOLUTION_BORDER_MODE 0x8013
+#define GL_CONVOLUTION_FILTER_BIAS 0x8015
+#define GL_CONVOLUTION_FILTER_SCALE 0x8014
+#define GL_CONVOLUTION_FORMAT 0x8017
+#define GL_CONVOLUTION_HEIGHT 0x8019
+#define GL_CONVOLUTION_WIDTH 0x8018
+#define GL_COPY 0x1503
+#define GL_COPY_INVERTED 0x150C
+#define GL_COPY_PIXEL_TOKEN 0x0706
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#define GL_CULL_FACE 0x0B44
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_CURRENT_ATTRIB_NV 0x8626
+#define GL_CURRENT_BIT 0x00000001
+#define GL_CURRENT_COLOR 0x0B00
+#define GL_CURRENT_INDEX 0x0B01
+#define GL_CURRENT_MATRIX_ARB 0x8641
+#define GL_CURRENT_MATRIX_NV 0x8641
+#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
+#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640
+#define GL_CURRENT_NORMAL 0x0B02
+#define GL_CURRENT_RASTER_COLOR 0x0B04
+#define GL_CURRENT_RASTER_DISTANCE 0x0B09
+#define GL_CURRENT_RASTER_INDEX 0x0B05
+#define GL_CURRENT_RASTER_POSITION 0x0B07
+#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08
+#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06
+#define GL_CURRENT_TEXTURE_COORDS 0x0B03
+#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
+#define GL_CW 0x0900
+#define GL_DEBUG_CALLBACK_FUNCTION 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
+#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
+#define GL_DEBUG_LOGGED_MESSAGES 0x9145
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
+#define GL_DEBUG_OUTPUT 0x92E0
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
+#define GL_DEBUG_SEVERITY_HIGH 0x9146
+#define GL_DEBUG_SEVERITY_LOW 0x9148
+#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
+#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
+#define GL_DEBUG_SOURCE_API 0x8246
+#define GL_DEBUG_SOURCE_APPLICATION 0x824A
+#define GL_DEBUG_SOURCE_OTHER 0x824B
+#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
+#define GL_DEBUG_TYPE_ERROR 0x824C
+#define GL_DEBUG_TYPE_MARKER 0x8268
+#define GL_DEBUG_TYPE_OTHER 0x8251
+#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
+#define GL_DEBUG_TYPE_POP_GROUP 0x826A
+#define GL_DEBUG_TYPE_PORTABILITY 0x824F
+#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
+#define GL_DECAL 0x2101
+#define GL_DECR 0x1E03
+#define GL_DEPTH 0x1801
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_DEPTH24_STENCIL8_EXT 0x88F0
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_DEPTH_ATTACHMENT_EXT 0x8D00
+#define GL_DEPTH_BIAS 0x0D1F
+#define GL_DEPTH_BITS 0x0D56
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_SCALE 0x0D1E
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_DEPTH_STENCIL_EXT 0x84F9
+#define GL_DEPTH_TEST 0x0B71
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DIFFUSE 0x1201
+#define GL_DISPLAY_LIST 0x82E7
+#define GL_DITHER 0x0BD0
+#define GL_DOMAIN 0x0A02
+#define GL_DONT_CARE 0x1100
+#define GL_DOUBLE 0x140A
+#define GL_DOUBLEBUFFER 0x0C32
+#define GL_DRAW_BUFFER 0x0C01
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
+#define GL_DRAW_PIXEL_TOKEN 0x0705
+#define GL_DST_ALPHA 0x0304
+#define GL_DST_COLOR 0x0306
+#define GL_DYNAMIC_COPY_ARB 0x88EA
+#define GL_DYNAMIC_DRAW_ARB 0x88E8
+#define GL_DYNAMIC_READ_ARB 0x88E9
+#define GL_EDGE_FLAG 0x0B43
+#define GL_EDGE_FLAG_ARRAY 0x8079
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B
+#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D
+#define GL_EDGE_FLAG_ARRAY_EXT 0x8079
+#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
+#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093
+#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C
+#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C
+#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
+#define GL_EMISSION 0x1600
+#define GL_ENABLE_BIT 0x00002000
+#define GL_EQUAL 0x0202
+#define GL_EQUIV 0x1509
+#define GL_EVAL_BIT 0x00010000
+#define GL_EXP 0x0800
+#define GL_EXP2 0x0801
+#define GL_EXTENSIONS 0x1F03
+#define GL_EYE_LINEAR 0x2400
+#define GL_EYE_PLANE 0x2502
+#define GL_FALSE 0
+#define GL_FASTEST 0x1101
+#define GL_FEEDBACK 0x1C01
+#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0
+#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1
+#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2
+#define GL_FILL 0x1B02
+#define GL_FLAT 0x1D00
+#define GL_FLOAT 0x1406
+#define GL_FLOAT_MAT2_ARB 0x8B5A
+#define GL_FLOAT_MAT3_ARB 0x8B5B
+#define GL_FLOAT_MAT4_ARB 0x8B5C
+#define GL_FLOAT_VEC2_ARB 0x8B50
+#define GL_FLOAT_VEC3_ARB 0x8B51
+#define GL_FLOAT_VEC4_ARB 0x8B52
+#define GL_FOG 0x0B60
+#define GL_FOG_BIT 0x00000080
+#define GL_FOG_COLOR 0x0B66
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D
+#define GL_FOG_DENSITY 0x0B62
+#define GL_FOG_END 0x0B64
+#define GL_FOG_HINT 0x0C54
+#define GL_FOG_INDEX 0x0B61
+#define GL_FOG_MODE 0x0B65
+#define GL_FOG_START 0x0B63
+#define GL_FRAGMENT_SHADER_ARB 0x8B30
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_EXT 0x8D40
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
+#define GL_FRONT 0x0404
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_FRONT_FACE 0x0B46
+#define GL_FRONT_LEFT 0x0400
+#define GL_FRONT_RIGHT 0x0401
+#define GL_FUNC_ADD 0x8006
+#define GL_FUNC_ADD_EXT 0x8006
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_SUBTRACT_EXT 0x800A
+#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB
+#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB
+#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC
+#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC
+#define GL_GEOMETRY_PROGRAM_NV 0x8C26
+#define GL_GEOMETRY_SHADER_ARB 0x8DD9
+#define GL_GEOMETRY_SHADER_BIT 0x00000004
+#define GL_GEOMETRY_SHADER_EXT 0x8DD9
+#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA
+#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA
+#define GL_GEQUAL 0x0206
+#define GL_GREATER 0x0204
+#define GL_GREEN 0x1904
+#define GL_GREEN_BIAS 0x0D19
+#define GL_GREEN_BITS 0x0D53
+#define GL_GREEN_SCALE 0x0D18
+#define GL_HINT_BIT 0x00008000
+#define GL_HISTOGRAM 0x8024
+#define GL_HISTOGRAM_ALPHA_SIZE 0x802B
+#define GL_HISTOGRAM_BLUE_SIZE 0x802A
+#define GL_HISTOGRAM_FORMAT 0x8027
+#define GL_HISTOGRAM_GREEN_SIZE 0x8029
+#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C
+#define GL_HISTOGRAM_RED_SIZE 0x8028
+#define GL_HISTOGRAM_SINK 0x802D
+#define GL_HISTOGRAM_WIDTH 0x8026
+#define GL_IDENTITY_NV 0x862A
+#define GL_INCR 0x1E02
+#define GL_INDEX 0x8222
+#define GL_INDEX_ARRAY 0x8077
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
+#define GL_INDEX_ARRAY_COUNT_EXT 0x8087
+#define GL_INDEX_ARRAY_EXT 0x8077
+#define GL_INDEX_ARRAY_POINTER 0x8091
+#define GL_INDEX_ARRAY_POINTER_EXT 0x8091
+#define GL_INDEX_ARRAY_STRIDE 0x8086
+#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086
+#define GL_INDEX_ARRAY_TYPE 0x8085
+#define GL_INDEX_ARRAY_TYPE_EXT 0x8085
+#define GL_INDEX_BITS 0x0D51
+#define GL_INDEX_CLEAR_VALUE 0x0C20
+#define GL_INDEX_LOGIC_OP 0x0BF1
+#define GL_INDEX_MODE 0x0C30
+#define GL_INDEX_OFFSET 0x0D13
+#define GL_INDEX_SHIFT 0x0D12
+#define GL_INDEX_WRITEMASK 0x0C21
+#define GL_INT 0x1404
+#define GL_INTENSITY 0x8049
+#define GL_INTENSITY12 0x804C
+#define GL_INTENSITY16 0x804D
+#define GL_INTENSITY4 0x804A
+#define GL_INTENSITY8 0x804B
+#define GL_INT_VEC2_ARB 0x8B53
+#define GL_INT_VEC3_ARB 0x8B54
+#define GL_INT_VEC4_ARB 0x8B55
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
+#define GL_INVALID_OPERATION 0x0502
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVERSE_NV 0x862B
+#define GL_INVERSE_TRANSPOSE_NV 0x862D
+#define GL_INVERT 0x150A
+#define GL_KEEP 0x1E00
+#define GL_LEFT 0x0406
+#define GL_LEQUAL 0x0203
+#define GL_LESS 0x0201
+#define GL_LIGHT0 0x4000
+#define GL_LIGHT1 0x4001
+#define GL_LIGHT2 0x4002
+#define GL_LIGHT3 0x4003
+#define GL_LIGHT4 0x4004
+#define GL_LIGHT5 0x4005
+#define GL_LIGHT6 0x4006
+#define GL_LIGHT7 0x4007
+#define GL_LIGHTING 0x0B50
+#define GL_LIGHTING_BIT 0x00000040
+#define GL_LIGHT_MODEL_AMBIENT 0x0B53
+#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
+#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
+#define GL_LINE 0x1B01
+#define GL_LINEAR 0x2601
+#define GL_LINEAR_ATTENUATION 0x1208
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_LINES 0x0001
+#define GL_LINES_ADJACENCY_ARB 0x000A
+#define GL_LINES_ADJACENCY_EXT 0x000A
+#define GL_LINE_BIT 0x00000004
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_RESET_TOKEN 0x0707
+#define GL_LINE_SMOOTH 0x0B20
+#define GL_LINE_SMOOTH_HINT 0x0C52
+#define GL_LINE_STIPPLE 0x0B24
+#define GL_LINE_STIPPLE_PATTERN 0x0B25
+#define GL_LINE_STIPPLE_REPEAT 0x0B26
+#define GL_LINE_STRIP 0x0003
+#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B
+#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B
+#define GL_LINE_TOKEN 0x0702
+#define GL_LINE_WIDTH 0x0B21
+#define GL_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_LINE_WIDTH_RANGE 0x0B22
+#define GL_LIST_BASE 0x0B32
+#define GL_LIST_BIT 0x00020000
+#define GL_LIST_INDEX 0x0B33
+#define GL_LIST_MODE 0x0B30
+#define GL_LOAD 0x0101
+#define GL_LOGIC_OP 0x0BF1
+#define GL_LOGIC_OP_MODE 0x0BF0
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE12 0x8041
+#define GL_LUMINANCE12_ALPHA12 0x8047
+#define GL_LUMINANCE12_ALPHA4 0x8046
+#define GL_LUMINANCE16 0x8042
+#define GL_LUMINANCE16_ALPHA16 0x8048
+#define GL_LUMINANCE4 0x803F
+#define GL_LUMINANCE4_ALPHA4 0x8043
+#define GL_LUMINANCE6_ALPHA2 0x8044
+#define GL_LUMINANCE8 0x8040
+#define GL_LUMINANCE8_ALPHA8 0x8045
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_MAP1_COLOR_4 0x0D90
+#define GL_MAP1_GRID_DOMAIN 0x0DD0
+#define GL_MAP1_GRID_SEGMENTS 0x0DD1
+#define GL_MAP1_INDEX 0x0D91
+#define GL_MAP1_NORMAL 0x0D92
+#define GL_MAP1_TEXTURE_COORD_1 0x0D93
+#define GL_MAP1_TEXTURE_COORD_2 0x0D94
+#define GL_MAP1_TEXTURE_COORD_3 0x0D95
+#define GL_MAP1_TEXTURE_COORD_4 0x0D96
+#define GL_MAP1_VERTEX_3 0x0D97
+#define GL_MAP1_VERTEX_4 0x0D98
+#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660
+#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A
+#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B
+#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C
+#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D
+#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E
+#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F
+#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661
+#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662
+#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663
+#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664
+#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665
+#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666
+#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667
+#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668
+#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669
+#define GL_MAP2_COLOR_4 0x0DB0
+#define GL_MAP2_GRID_DOMAIN 0x0DD2
+#define GL_MAP2_GRID_SEGMENTS 0x0DD3
+#define GL_MAP2_INDEX 0x0DB1
+#define GL_MAP2_NORMAL 0x0DB2
+#define GL_MAP2_TEXTURE_COORD_1 0x0DB3
+#define GL_MAP2_TEXTURE_COORD_2 0x0DB4
+#define GL_MAP2_TEXTURE_COORD_3 0x0DB5
+#define GL_MAP2_TEXTURE_COORD_4 0x0DB6
+#define GL_MAP2_VERTEX_3 0x0DB7
+#define GL_MAP2_VERTEX_4 0x0DB8
+#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670
+#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A
+#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B
+#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C
+#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D
+#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E
+#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F
+#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671
+#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672
+#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673
+#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674
+#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675
+#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676
+#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677
+#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678
+#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679
+#define GL_MAP_COLOR 0x0D10
+#define GL_MAP_STENCIL 0x0D11
+#define GL_MATRIX0_ARB 0x88C0
+#define GL_MATRIX0_NV 0x8630
+#define GL_MATRIX10_ARB 0x88CA
+#define GL_MATRIX11_ARB 0x88CB
+#define GL_MATRIX12_ARB 0x88CC
+#define GL_MATRIX13_ARB 0x88CD
+#define GL_MATRIX14_ARB 0x88CE
+#define GL_MATRIX15_ARB 0x88CF
+#define GL_MATRIX16_ARB 0x88D0
+#define GL_MATRIX17_ARB 0x88D1
+#define GL_MATRIX18_ARB 0x88D2
+#define GL_MATRIX19_ARB 0x88D3
+#define GL_MATRIX1_ARB 0x88C1
+#define GL_MATRIX1_NV 0x8631
+#define GL_MATRIX20_ARB 0x88D4
+#define GL_MATRIX21_ARB 0x88D5
+#define GL_MATRIX22_ARB 0x88D6
+#define GL_MATRIX23_ARB 0x88D7
+#define GL_MATRIX24_ARB 0x88D8
+#define GL_MATRIX25_ARB 0x88D9
+#define GL_MATRIX26_ARB 0x88DA
+#define GL_MATRIX27_ARB 0x88DB
+#define GL_MATRIX28_ARB 0x88DC
+#define GL_MATRIX29_ARB 0x88DD
+#define GL_MATRIX2_ARB 0x88C2
+#define GL_MATRIX2_NV 0x8632
+#define GL_MATRIX30_ARB 0x88DE
+#define GL_MATRIX31_ARB 0x88DF
+#define GL_MATRIX3_ARB 0x88C3
+#define GL_MATRIX3_NV 0x8633
+#define GL_MATRIX4_ARB 0x88C4
+#define GL_MATRIX4_NV 0x8634
+#define GL_MATRIX5_ARB 0x88C5
+#define GL_MATRIX5_NV 0x8635
+#define GL_MATRIX6_ARB 0x88C6
+#define GL_MATRIX6_NV 0x8636
+#define GL_MATRIX7_ARB 0x88C7
+#define GL_MATRIX7_NV 0x8637
+#define GL_MATRIX8_ARB 0x88C8
+#define GL_MATRIX9_ARB 0x88C9
+#define GL_MATRIX_MODE 0x0BA0
+#define GL_MAX 0x8008
+#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF
+#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35
+#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B
+#define GL_MAX_CLIP_PLANES 0x0D32
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D
+#define GL_MAX_CONVOLUTION_HEIGHT 0x801B
+#define GL_MAX_CONVOLUTION_WIDTH 0x801A
+#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
+#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
+#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
+#define GL_MAX_EVAL_ORDER 0x0D30
+#define GL_MAX_EXT 0x8008
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD
+#define GL_MAX_LABEL_LENGTH 0x82E8
+#define GL_MAX_LIGHTS 0x0D31
+#define GL_MAX_LIST_NESTING 0x0B31
+#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36
+#define GL_MAX_NAME_STACK_DEPTH 0x0D37
+#define GL_MAX_PIXEL_MAP_TABLE 0x0D34
+#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
+#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD
+#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
+#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1
+#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
+#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F
+#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
+#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
+#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
+#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
+#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
+#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
+#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27
+#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9
+#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5
+#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28
+#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
+#define GL_MAX_SAMPLES 0x8D57
+#define GL_MAX_SAMPLES_EXT 0x8D57
+#define GL_MAX_TEXTURE_COORDS_ARB 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39
+#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
+#define GL_MAX_TRACK_MATRICES_NV 0x862F
+#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B
+#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B
+#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_MIN 0x8007
+#define GL_MINMAX 0x802E
+#define GL_MINMAX_FORMAT 0x802F
+#define GL_MINMAX_SINK 0x8030
+#define GL_MIN_EXT 0x8007
+#define GL_MODELVIEW 0x1700
+#define GL_MODELVIEW_MATRIX 0x0BA6
+#define GL_MODELVIEW_PROJECTION_NV 0x8629
+#define GL_MODELVIEW_STACK_DEPTH 0x0BA3
+#define GL_MODULATE 0x2100
+#define GL_MULT 0x0103
+#define GL_N3F_V3F 0x2A25
+#define GL_NAME_STACK_DEPTH 0x0D70
+#define GL_NAND 0x150E
+#define GL_NEAREST 0x2600
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_NEVER 0x0200
+#define GL_NICEST 0x1102
+#define GL_NONE 0
+#define GL_NOOP 0x1505
+#define GL_NOR 0x1508
+#define GL_NORMALIZE 0x0BA1
+#define GL_NORMAL_ARRAY 0x8075
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
+#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080
+#define GL_NORMAL_ARRAY_EXT 0x8075
+#define GL_NORMAL_ARRAY_POINTER 0x808F
+#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F
+#define GL_NORMAL_ARRAY_STRIDE 0x807F
+#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F
+#define GL_NORMAL_ARRAY_TYPE 0x807E
+#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E
+#define GL_NOTEQUAL 0x0205
+#define GL_NO_ERROR 0
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89
+#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A
+#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86
+#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
+#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85
+#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81
+#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80
+#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84
+#define GL_OBJECT_LINEAR 0x2401
+#define GL_OBJECT_LINK_STATUS_ARB 0x8B82
+#define GL_OBJECT_PLANE 0x2501
+#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88
+#define GL_OBJECT_SUBTYPE_ARB 0x8B4F
+#define GL_OBJECT_TYPE_ARB 0x8B4E
+#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83
+#define GL_ONE 1
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_OR 0x1507
+#define GL_ORDER 0x0A01
+#define GL_OR_INVERTED 0x150D
+#define GL_OR_REVERSE 0x150B
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_PACK_LSB_FIRST 0x0D01
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SWAP_BYTES 0x0D00
+#define GL_PASS_THROUGH_TOKEN 0x0700
+#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50
+#define GL_PIXEL_MAP_A_TO_A 0x0C79
+#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9
+#define GL_PIXEL_MAP_B_TO_B 0x0C78
+#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8
+#define GL_PIXEL_MAP_G_TO_G 0x0C77
+#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7
+#define GL_PIXEL_MAP_I_TO_A 0x0C75
+#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5
+#define GL_PIXEL_MAP_I_TO_B 0x0C74
+#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4
+#define GL_PIXEL_MAP_I_TO_G 0x0C73
+#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3
+#define GL_PIXEL_MAP_I_TO_I 0x0C70
+#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0
+#define GL_PIXEL_MAP_I_TO_R 0x0C72
+#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2
+#define GL_PIXEL_MAP_R_TO_R 0x0C76
+#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6
+#define GL_PIXEL_MAP_S_TO_S 0x0C71
+#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1
+#define GL_PIXEL_MODE_BIT 0x00000020
+#define GL_POINT 0x1B00
+#define GL_POINTS 0x0000
+#define GL_POINT_BIT 0x00000002
+#define GL_POINT_SIZE 0x0B11
+#define GL_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_POINT_SIZE_RANGE 0x0B12
+#define GL_POINT_SMOOTH 0x0B10
+#define GL_POINT_SMOOTH_HINT 0x0C51
+#define GL_POINT_TOKEN 0x0701
+#define GL_POLYGON 0x0009
+#define GL_POLYGON_BIT 0x00000008
+#define GL_POLYGON_MODE 0x0B40
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_POLYGON_OFFSET_LINE 0x2A02
+#define GL_POLYGON_OFFSET_POINT 0x2A01
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_SMOOTH 0x0B41
+#define GL_POLYGON_SMOOTH_HINT 0x0C53
+#define GL_POLYGON_STIPPLE 0x0B42
+#define GL_POLYGON_STIPPLE_BIT 0x00000010
+#define GL_POLYGON_TOKEN 0x0703
+#define GL_POSITION 0x1203
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5
+#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8
+#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4
+#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
+#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F
+#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
+#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E
+#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1
+#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
+#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D
+#define GL_POST_CONVOLUTION_RED_BIAS 0x8020
+#define GL_POST_CONVOLUTION_RED_SCALE 0x801C
+#define GL_PROGRAM 0x82E2
+#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0
+#define GL_PROGRAM_ATTRIBS_ARB 0x88AC
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINDING_ARB 0x8677
+#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B
+#define GL_PROGRAM_ERROR_POSITION_NV 0x864B
+#define GL_PROGRAM_ERROR_STRING_ARB 0x8874
+#define GL_PROGRAM_FORMAT_ARB 0x8876
+#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875
+#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0
+#define GL_PROGRAM_LENGTH_ARB 0x8627
+#define GL_PROGRAM_LENGTH_NV 0x8627
+#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
+#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE
+#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
+#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA
+#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
+#define GL_PROGRAM_OBJECT_ARB 0x8B40
+#define GL_PROGRAM_PARAMETERS_ARB 0x88A8
+#define GL_PROGRAM_PARAMETER_NV 0x8644
+#define GL_PROGRAM_PIPELINE 0x82E4
+#define GL_PROGRAM_PIPELINE_BINDING 0x825A
+#define GL_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_PROGRAM_POINT_SIZE_EXT 0x8642
+#define GL_PROGRAM_RESIDENT_NV 0x8647
+#define GL_PROGRAM_SEPARABLE 0x8258
+#define GL_PROGRAM_STRING_ARB 0x8628
+#define GL_PROGRAM_STRING_NV 0x8628
+#define GL_PROGRAM_TARGET_NV 0x8646
+#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4
+#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
+#define GL_PROJECTION 0x1701
+#define GL_PROJECTION_MATRIX 0x0BA7
+#define GL_PROJECTION_STACK_DEPTH 0x0BA4
+#define GL_PROXY_COLOR_TABLE 0x80D3
+#define GL_PROXY_HISTOGRAM 0x8025
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
+#define GL_PROXY_TEXTURE_1D 0x8063
+#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19
+#define GL_PROXY_TEXTURE_2D 0x8064
+#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B
+#define GL_Q 0x2003
+#define GL_QUADRATIC_ATTENUATION 0x1209
+#define GL_QUADS 0x0007
+#define GL_QUAD_STRIP 0x0008
+#define GL_QUERY 0x82E3
+#define GL_R 0x2002
+#define GL_R3_G3_B2 0x2A10
+#define GL_READ_BUFFER 0x0C02
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
+#define GL_READ_FRAMEBUFFER_EXT 0x8CA8
+#define GL_READ_ONLY_ARB 0x88B8
+#define GL_READ_WRITE_ARB 0x88BA
+#define GL_RED 0x1903
+#define GL_REDUCE 0x8016
+#define GL_RED_BIAS 0x0D15
+#define GL_RED_BITS 0x0D52
+#define GL_RED_SCALE 0x0D14
+#define GL_RENDER 0x1C00
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54
+#define GL_RENDERBUFFER_EXT 0x8D41
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
+#define GL_RENDERER 0x1F01
+#define GL_RENDER_MODE 0x0C40
+#define GL_REPEAT 0x2901
+#define GL_REPLACE 0x1E01
+#define GL_REPLICATE_BORDER 0x8153
+#define GL_RETURN 0x0102
+#define GL_RGB 0x1907
+#define GL_RGB10 0x8052
+#define GL_RGB10_A2 0x8059
+#define GL_RGB12 0x8053
+#define GL_RGB16 0x8054
+#define GL_RGB4 0x804F
+#define GL_RGB5 0x8050
+#define GL_RGB5_A1 0x8057
+#define GL_RGB8 0x8051
+#define GL_RGBA 0x1908
+#define GL_RGBA12 0x805A
+#define GL_RGBA16 0x805B
+#define GL_RGBA2 0x8055
+#define GL_RGBA4 0x8056
+#define GL_RGBA8 0x8058
+#define GL_RGBA_MODE 0x0C31
+#define GL_RIGHT 0x0407
+#define GL_S 0x2000
+#define GL_SAMPLER 0x82E6
+#define GL_SAMPLER_1D_ARB 0x8B5D
+#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61
+#define GL_SAMPLER_2D_ARB 0x8B5E
+#define GL_SAMPLER_2D_RECT_ARB 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
+#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62
+#define GL_SAMPLER_3D_ARB 0x8B5F
+#define GL_SAMPLER_CUBE_ARB 0x8B60
+#define GL_SCISSOR_BIT 0x00080000
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
+#define GL_SELECT 0x1C02
+#define GL_SELECTION_BUFFER_POINTER 0x0DF3
+#define GL_SELECTION_BUFFER_SIZE 0x0DF4
+#define GL_SEPARABLE_2D 0x8012
+#define GL_SET 0x150F
+#define GL_SHADER 0x82E1
+#define GL_SHADER_OBJECT_ARB 0x8B48
+#define GL_SHADE_MODEL 0x0B54
+#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
+#define GL_SHININESS 0x1601
+#define GL_SHORT 0x1402
+#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45
+#define GL_SLUMINANCE8_EXT 0x8C47
+#define GL_SLUMINANCE_ALPHA_EXT 0x8C44
+#define GL_SLUMINANCE_EXT 0x8C46
+#define GL_SMOOTH 0x1D01
+#define GL_SPECULAR 0x1202
+#define GL_SPHERE_MAP 0x2402
+#define GL_SPOT_CUTOFF 0x1206
+#define GL_SPOT_DIRECTION 0x1204
+#define GL_SPOT_EXPONENT 0x1205
+#define GL_SRC_ALPHA 0x0302
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_SRC_COLOR 0x0300
+#define GL_SRGB8_ALPHA8_EXT 0x8C43
+#define GL_SRGB8_EXT 0x8C41
+#define GL_SRGB_ALPHA_EXT 0x8C42
+#define GL_SRGB_EXT 0x8C40
+#define GL_STACK_OVERFLOW 0x0503
+#define GL_STACK_UNDERFLOW 0x0504
+#define GL_STATIC_COPY_ARB 0x88E6
+#define GL_STATIC_DRAW_ARB 0x88E4
+#define GL_STATIC_READ_ARB 0x88E5
+#define GL_STENCIL 0x1802
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_STENCIL_ATTACHMENT_EXT 0x8D20
+#define GL_STENCIL_BITS 0x0D57
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_INDEX 0x1901
+#define GL_STENCIL_INDEX1 0x8D46
+#define GL_STENCIL_INDEX16 0x8D49
+#define GL_STENCIL_INDEX16_EXT 0x8D49
+#define GL_STENCIL_INDEX1_EXT 0x8D46
+#define GL_STENCIL_INDEX4 0x8D47
+#define GL_STENCIL_INDEX4_EXT 0x8D47
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_STENCIL_INDEX8_EXT 0x8D48
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_TEST 0x0B90
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_STEREO 0x0C33
+#define GL_STREAM_COPY_ARB 0x88E2
+#define GL_STREAM_DRAW_ARB 0x88E0
+#define GL_STREAM_READ_ARB 0x88E1
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_T 0x2001
+#define GL_T2F_C3F_V3F 0x2A2A
+#define GL_T2F_C4F_N3F_V3F 0x2A2C
+#define GL_T2F_C4UB_V3F 0x2A29
+#define GL_T2F_N3F_V3F 0x2A2B
+#define GL_T2F_V3F 0x2A27
+#define GL_T4F_C4F_N3F_V4F 0x2A2D
+#define GL_T4F_V4F 0x2A28
+#define GL_TABLE_TOO_LARGE 0x8031
+#define GL_TESS_CONTROL_SHADER_BIT 0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010
+#define GL_TEXTURE 0x1702
+#define GL_TEXTURE0_ARB 0x84C0
+#define GL_TEXTURE10_ARB 0x84CA
+#define GL_TEXTURE11_ARB 0x84CB
+#define GL_TEXTURE12_ARB 0x84CC
+#define GL_TEXTURE13_ARB 0x84CD
+#define GL_TEXTURE14_ARB 0x84CE
+#define GL_TEXTURE15_ARB 0x84CF
+#define GL_TEXTURE16_ARB 0x84D0
+#define GL_TEXTURE17_ARB 0x84D1
+#define GL_TEXTURE18_ARB 0x84D2
+#define GL_TEXTURE19_ARB 0x84D3
+#define GL_TEXTURE1_ARB 0x84C1
+#define GL_TEXTURE20_ARB 0x84D4
+#define GL_TEXTURE21_ARB 0x84D5
+#define GL_TEXTURE22_ARB 0x84D6
+#define GL_TEXTURE23_ARB 0x84D7
+#define GL_TEXTURE24_ARB 0x84D8
+#define GL_TEXTURE25_ARB 0x84D9
+#define GL_TEXTURE26_ARB 0x84DA
+#define GL_TEXTURE27_ARB 0x84DB
+#define GL_TEXTURE28_ARB 0x84DC
+#define GL_TEXTURE29_ARB 0x84DD
+#define GL_TEXTURE2_ARB 0x84C2
+#define GL_TEXTURE30_ARB 0x84DE
+#define GL_TEXTURE31_ARB 0x84DF
+#define GL_TEXTURE3_ARB 0x84C3
+#define GL_TEXTURE4_ARB 0x84C4
+#define GL_TEXTURE5_ARB 0x84C5
+#define GL_TEXTURE6_ARB 0x84C6
+#define GL_TEXTURE7_ARB 0x84C7
+#define GL_TEXTURE8_ARB 0x84C8
+#define GL_TEXTURE9_ARB 0x84C9
+#define GL_TEXTURE_1D 0x0DE0
+#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18
+#define GL_TEXTURE_1D_BINDING_EXT 0x8068
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A
+#define GL_TEXTURE_2D_BINDING_EXT 0x8069
+#define GL_TEXTURE_3D_BINDING_EXT 0x806A
+#define GL_TEXTURE_ALPHA_SIZE 0x805F
+#define GL_TEXTURE_BINDING_1D 0x8068
+#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D
+#define GL_TEXTURE_BIT 0x00040000
+#define GL_TEXTURE_BLUE_SIZE 0x805E
+#define GL_TEXTURE_BORDER 0x1005
+#define GL_TEXTURE_BORDER_COLOR 0x1004
+#define GL_TEXTURE_COMPONENTS 0x1003
+#define GL_TEXTURE_COORD_ARRAY 0x8078
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A
+#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B
+#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078
+#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092
+#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
+#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088
+#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088
+#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A
+#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
+#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089
+#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089
+#define GL_TEXTURE_ENV 0x2300
+#define GL_TEXTURE_ENV_COLOR 0x2201
+#define GL_TEXTURE_ENV_MODE 0x2200
+#define GL_TEXTURE_GEN_MODE 0x2500
+#define GL_TEXTURE_GEN_Q 0x0C63
+#define GL_TEXTURE_GEN_R 0x0C62
+#define GL_TEXTURE_GEN_S 0x0C60
+#define GL_TEXTURE_GEN_T 0x0C61
+#define GL_TEXTURE_GREEN_SIZE 0x805D
+#define GL_TEXTURE_HEIGHT 0x1001
+#define GL_TEXTURE_INTENSITY_SIZE 0x8061
+#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
+#define GL_TEXTURE_LUMINANCE_SIZE 0x8060
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MATRIX 0x0BA8
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_PRIORITY 0x8066
+#define GL_TEXTURE_PRIORITY_EXT 0x8066
+#define GL_TEXTURE_RED_SIZE 0x805C
+#define GL_TEXTURE_RESIDENT 0x8067
+#define GL_TEXTURE_RESIDENT_EXT 0x8067
+#define GL_TEXTURE_STACK_DEPTH 0x0BA5
+#define GL_TEXTURE_STENCIL_SIZE 0x88F1
+#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1
+#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_TRACK_MATRIX_NV 0x8648
+#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649
+#define GL_TRANSFORM_BIT 0x00001000
+#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7
+#define GL_TRANSPOSE_NV 0x862C
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLES_ADJACENCY_ARB 0x000C
+#define GL_TRIANGLES_ADJACENCY_EXT 0x000C
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D
+#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D
+#define GL_TRUE 1
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_UNPACK_LSB_FIRST 0x0CF1
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SWAP_BYTES 0x0CF0
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_UNSIGNED_INT 0x1405
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_UNSIGNED_INT_24_8_EXT 0x84FA
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_V2F 0x2A20
+#define GL_V3F 0x2A21
+#define GL_VENDOR 0x1F00
+#define GL_VERSION 0x1F02
+#define GL_VERTEX_ARRAY 0x8074
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
+#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D
+#define GL_VERTEX_ARRAY_EXT 0x8074
+#define GL_VERTEX_ARRAY_POINTER 0x808E
+#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E
+#define GL_VERTEX_ARRAY_SIZE 0x807A
+#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A
+#define GL_VERTEX_ARRAY_STRIDE 0x807C
+#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C
+#define GL_VERTEX_ARRAY_TYPE 0x807B
+#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B
+#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650
+#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A
+#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B
+#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C
+#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D
+#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E
+#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F
+#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651
+#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652
+#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653
+#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654
+#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655
+#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656
+#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657
+#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658
+#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
+#define GL_VERTEX_PROGRAM_ARB 0x8620
+#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A
+#define GL_VERTEX_PROGRAM_NV 0x8620
+#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
+#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643
+#define GL_VERTEX_SHADER_ARB 0x8B31
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#define GL_VERTEX_STATE_PROGRAM_NV 0x8621
+#define GL_VIEWPORT 0x0BA2
+#define GL_VIEWPORT_BIT 0x00000800
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E
+#define GL_WRITE_ONLY_ARB 0x88B9
+#define GL_XOR 0x1506
+#define GL_ZERO 0
+#define GL_ZOOM_X 0x0D16
+#define GL_ZOOM_Y 0x0D17
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_ADD_SIGNED 0x8574
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_BLEND_DST_ALPHA_OES 0x80CA
+#define GL_BLEND_DST_RGB_OES 0x80C8
+#define GL_BLEND_EQUATION_ALPHA_OES 0x883D
+#define GL_BLEND_EQUATION_OES 0x8009
+#define GL_BLEND_EQUATION_RGB_OES 0x8009
+#define GL_BLEND_SRC_ALPHA_OES 0x80CB
+#define GL_BLEND_SRC_RGB_OES 0x80C9
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1
+#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898
+#define GL_COLOR_ATTACHMENT0_OES 0x8CE0
+#define GL_COMBINE 0x8570
+#define GL_COMBINE_ALPHA 0x8572
+#define GL_COMBINE_RGB 0x8571
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_CONSTANT 0x8576
+#define GL_DEPTH24_STENCIL8_OES 0x88F0
+#define GL_DEPTH_ATTACHMENT_OES 0x8D00
+#define GL_DEPTH_COMPONENT16_OES 0x81A5
+#define GL_DEPTH_STENCIL_OES 0x84F9
+#define GL_DOT3_RGB 0x86AE
+#define GL_DOT3_RGBA 0x86AF
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_FIXED 0x140C
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES 0x8CD2
+#define GL_FRAMEBUFFER_BINDING_OES 0x8CA6
+#define GL_FRAMEBUFFER_COMPLETE_OES 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES 0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES 0x8CDA
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES 0x8CD7
+#define GL_FRAMEBUFFER_OES 0x8D40
+#define GL_FRAMEBUFFER_UNSUPPORTED_OES 0x8CDD
+#define GL_FUNC_ADD_OES 0x8006
+#define GL_FUNC_REVERSE_SUBTRACT_OES 0x800B
+#define GL_FUNC_SUBTRACT_OES 0x800A
+#define GL_GENERATE_MIPMAP 0x8191
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_INTERPOLATE 0x8575
+#define GL_INVALID_FRAMEBUFFER_OPERATION_OES 0x0506
+#define GL_MAX_RENDERBUFFER_SIZE_OES 0x84E8
+#define GL_MAX_TEXTURE_UNITS 0x84E2
+#define GL_MULTISAMPLE 0x809D
+#define GL_NONE_OES 0
+#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_OPERAND0_ALPHA 0x8598
+#define GL_OPERAND0_RGB 0x8590
+#define GL_OPERAND1_ALPHA 0x8599
+#define GL_OPERAND1_RGB 0x8591
+#define GL_OPERAND2_ALPHA 0x859A
+#define GL_OPERAND2_RGB 0x8592
+#define GL_POINT_DISTANCE_ATTENUATION 0x8129
+#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128
+#define GL_POINT_SIZE_MAX 0x8127
+#define GL_POINT_SIZE_MIN 0x8126
+#define GL_PREVIOUS 0x8578
+#define GL_PRIMARY_COLOR 0x8577
+#define GL_RENDERBUFFER_ALPHA_SIZE_OES 0x8D53
+#define GL_RENDERBUFFER_BINDING_OES 0x8CA7
+#define GL_RENDERBUFFER_BLUE_SIZE_OES 0x8D52
+#define GL_RENDERBUFFER_DEPTH_SIZE_OES 0x8D54
+#define GL_RENDERBUFFER_GREEN_SIZE_OES 0x8D51
+#define GL_RENDERBUFFER_HEIGHT_OES 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_OES 0x8D44
+#define GL_RENDERBUFFER_OES 0x8D41
+#define GL_RENDERBUFFER_RED_SIZE_OES 0x8D50
+#define GL_RENDERBUFFER_STENCIL_SIZE_OES 0x8D55
+#define GL_RENDERBUFFER_WIDTH_OES 0x8D42
+#define GL_RESCALE_NORMAL 0x803A
+#define GL_RGB565_OES 0x8D62
+#define GL_RGB5_A1_OES 0x8057
+#define GL_RGBA4_OES 0x8056
+#define GL_RGB_SCALE 0x8573
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE 0x809F
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22
+#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12
+#define GL_SOURCE0_ALPHA 0x8588
+#define GL_SOURCE0_RGB 0x8580
+#define GL_SOURCE1_ALPHA 0x8589
+#define GL_SOURCE1_RGB 0x8581
+#define GL_SOURCE2_ALPHA 0x858A
+#define GL_SOURCE2_RGB 0x8582
+#define GL_SRC0_ALPHA 0x8588
+#define GL_SRC0_RGB 0x8580
+#define GL_SRC1_ALPHA 0x8589
+#define GL_SRC1_RGB 0x8581
+#define GL_SRC2_ALPHA 0x858A
+#define GL_SRC2_RGB 0x8582
+#define GL_STATIC_DRAW 0x88E4
+#define GL_STENCIL_ATTACHMENT_OES 0x8D20
+#define GL_SUBTRACT 0x84E7
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A
+#define GL_UNSIGNED_INT_24_8_OES 0x84FA
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_VERSION_ES_CL_1_0 1
+#define GL_VERSION_ES_CL_1_1 1
+#define GL_VERSION_ES_CM_1_1 1
+#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896
+
+
+#ifndef __khrplatform_h_
+#define __khrplatform_h_
+
+/*
+** Copyright (c) 2008-2018 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+/* Khronos platform-specific types and definitions.
+ *
+ * The master copy of khrplatform.h is maintained in the Khronos EGL
+ * Registry repository at https://github.com/KhronosGroup/EGL-Registry
+ * The last semantic modification to khrplatform.h was at commit ID:
+ * 67a3e0864c2d75ea5287b9f3d2eb74a745936692
+ *
+ * Adopters may modify this file to suit their platform. Adopters are
+ * encouraged to submit platform specific modifications to the Khronos
+ * group so that they can be included in future versions of this file.
+ * Please submit changes by filing pull requests or issues on
+ * the EGL Registry repository linked above.
+ *
+ *
+ * See the Implementer's Guidelines for information about where this file
+ * should be located on your system and for more details of its use:
+ * http://www.khronos.org/registry/implementers_guide.pdf
+ *
+ * This file should be included as
+ * #include <KHR/khrplatform.h>
+ * by Khronos client API header files that use its types and defines.
+ *
+ * The types in khrplatform.h should only be used to define API-specific types.
+ *
+ * Types defined in khrplatform.h:
+ * khronos_int8_t signed 8 bit
+ * khronos_uint8_t unsigned 8 bit
+ * khronos_int16_t signed 16 bit
+ * khronos_uint16_t unsigned 16 bit
+ * khronos_int32_t signed 32 bit
+ * khronos_uint32_t unsigned 32 bit
+ * khronos_int64_t signed 64 bit
+ * khronos_uint64_t unsigned 64 bit
+ * khronos_intptr_t signed same number of bits as a pointer
+ * khronos_uintptr_t unsigned same number of bits as a pointer
+ * khronos_ssize_t signed size
+ * khronos_usize_t unsigned size
+ * khronos_float_t signed 32 bit floating point
+ * khronos_time_ns_t unsigned 64 bit time in nanoseconds
+ * khronos_utime_nanoseconds_t unsigned time interval or absolute time in
+ * nanoseconds
+ * khronos_stime_nanoseconds_t signed time interval in nanoseconds
+ * khronos_boolean_enum_t enumerated boolean type. This should
+ * only be used as a base type when a client API's boolean type is
+ * an enum. Client APIs which use an integer or other type for
+ * booleans cannot use this as the base type for their boolean.
+ *
+ * Tokens defined in khrplatform.h:
+ *
+ * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
+ *
+ * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
+ * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
+ *
+ * Calling convention macros defined in this file:
+ * KHRONOS_APICALL
+ * KHRONOS_GLAD_API_PTR
+ * KHRONOS_APIATTRIBUTES
+ *
+ * These may be used in function prototypes as:
+ *
+ * KHRONOS_APICALL void KHRONOS_GLAD_API_PTR funcname(
+ * int arg1,
+ * int arg2) KHRONOS_APIATTRIBUTES;
+ */
+
+#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC)
+# define KHRONOS_STATIC 1
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APICALL
+ *-------------------------------------------------------------------------
+ * This precedes the return type of the function in the function prototype.
+ */
+#if defined(KHRONOS_STATIC)
+ /* If the preprocessor constant KHRONOS_STATIC is defined, make the
+ * header compatible with static linking. */
+# define KHRONOS_APICALL
+#elif defined(_WIN32)
+# define KHRONOS_APICALL __declspec(dllimport)
+#elif defined (__SYMBIAN32__)
+# define KHRONOS_APICALL IMPORT_C
+#elif defined(__ANDROID__)
+# define KHRONOS_APICALL __attribute__((visibility("default")))
+#else
+# define KHRONOS_APICALL
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_GLAD_API_PTR
+ *-------------------------------------------------------------------------
+ * This follows the return type of the function and precedes the function
+ * name in the function prototype.
+ */
+#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(KHRONOS_STATIC)
+ /* Win32 but not WinCE */
+# define KHRONOS_GLAD_API_PTR __stdcall
+#else
+# define KHRONOS_GLAD_API_PTR
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APIATTRIBUTES
+ *-------------------------------------------------------------------------
+ * This follows the closing parenthesis of the function prototype arguments.
+ */
+#if defined (__ARMCC_2__)
+#define KHRONOS_APIATTRIBUTES __softfp
+#else
+#define KHRONOS_APIATTRIBUTES
+#endif
+
+/*-------------------------------------------------------------------------
+ * basic type definitions
+ *-----------------------------------------------------------------------*/
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
+
+
+/*
+ * Using <stdint.h>
+ */
+#include <stdint.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(__VMS ) || defined(__sgi)
+
+/*
+ * Using <inttypes.h>
+ */
+#include <inttypes.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
+
+/*
+ * Win32
+ */
+typedef __int32 khronos_int32_t;
+typedef unsigned __int32 khronos_uint32_t;
+typedef __int64 khronos_int64_t;
+typedef unsigned __int64 khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(__sun__) || defined(__digital__)
+
+/*
+ * Sun or Digital
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#if defined(__arch64__) || defined(_LP64)
+typedef long int khronos_int64_t;
+typedef unsigned long int khronos_uint64_t;
+#else
+typedef long long int khronos_int64_t;
+typedef unsigned long long int khronos_uint64_t;
+#endif /* __arch64__ */
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif 0
+
+/*
+ * Hypothetical platform with no float or int64 support
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#define KHRONOS_SUPPORT_INT64 0
+#define KHRONOS_SUPPORT_FLOAT 0
+
+#else
+
+/*
+ * Generic fallback
+ */
+#include <stdint.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#endif
+
+
+/*
+ * Types that are (so far) the same on all platforms
+ */
+typedef signed char khronos_int8_t;
+typedef unsigned char khronos_uint8_t;
+typedef signed short int khronos_int16_t;
+typedef unsigned short int khronos_uint16_t;
+
+/*
+ * Types that differ between LLP64 and LP64 architectures - in LLP64,
+ * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
+ * to be the only LLP64 architecture in current use.
+ */
+#ifdef _WIN64
+typedef signed long long int khronos_intptr_t;
+typedef unsigned long long int khronos_uintptr_t;
+typedef signed long long int khronos_ssize_t;
+typedef unsigned long long int khronos_usize_t;
+#else
+typedef signed long int khronos_intptr_t;
+typedef unsigned long int khronos_uintptr_t;
+typedef signed long int khronos_ssize_t;
+typedef unsigned long int khronos_usize_t;
+#endif
+
+#if KHRONOS_SUPPORT_FLOAT
+/*
+ * Float type
+ */
+typedef float khronos_float_t;
+#endif
+
+#if KHRONOS_SUPPORT_INT64
+/* Time types
+ *
+ * These types can be used to represent a time interval in nanoseconds or
+ * an absolute Unadjusted System Time. Unadjusted System Time is the number
+ * of nanoseconds since some arbitrary system event (e.g. since the last
+ * time the system booted). The Unadjusted System Time is an unsigned
+ * 64 bit value that wraps back to 0 every 584 years. Time intervals
+ * may be either signed or unsigned.
+ */
+typedef khronos_uint64_t khronos_utime_nanoseconds_t;
+typedef khronos_int64_t khronos_stime_nanoseconds_t;
+#endif
+
+/*
+ * Dummy value used to pad enum types to 32 bits.
+ */
+#ifndef KHRONOS_MAX_ENUM
+#define KHRONOS_MAX_ENUM 0x7FFFFFFF
+#endif
+
+/*
+ * Enumerated boolean type
+ *
+ * Values other than zero should be considered to be true. Therefore
+ * comparisons should not be made against KHRONOS_TRUE.
+ */
+typedef enum {
+ KHRONOS_FALSE = 0,
+ KHRONOS_TRUE = 1,
+ KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
+} khronos_boolean_enum_t;
+
+#endif /* __khrplatform_h_ */
+typedef unsigned int GLenum;
+typedef unsigned char GLboolean;
+typedef unsigned int GLbitfield;
+typedef void GLvoid;
+typedef khronos_int8_t GLbyte;
+typedef khronos_uint8_t GLubyte;
+typedef khronos_int16_t GLshort;
+typedef khronos_uint16_t GLushort;
+typedef int GLint;
+typedef unsigned int GLuint;
+typedef khronos_int32_t GLclampx;
+typedef int GLsizei;
+typedef khronos_float_t GLfloat;
+typedef khronos_float_t GLclampf;
+typedef double GLdouble;
+typedef double GLclampd;
+typedef void *GLeglClientBufferEXT;
+typedef void *GLeglImageOES;
+typedef char GLchar;
+typedef char GLcharARB;
+#ifdef __APPLE__
+typedef void *GLhandleARB;
+#else
+typedef unsigned int GLhandleARB;
+#endif
+typedef khronos_uint16_t GLhalf;
+typedef khronos_uint16_t GLhalfARB;
+typedef khronos_int32_t GLfixed;
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_intptr_t GLintptr;
+#else
+typedef khronos_intptr_t GLintptr;
+#endif
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_intptr_t GLintptrARB;
+#else
+typedef khronos_intptr_t GLintptrARB;
+#endif
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_ssize_t GLsizeiptr;
+#else
+typedef khronos_ssize_t GLsizeiptr;
+#endif
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_ssize_t GLsizeiptrARB;
+#else
+typedef khronos_ssize_t GLsizeiptrARB;
+#endif
+typedef khronos_int64_t GLint64;
+typedef khronos_int64_t GLint64EXT;
+typedef khronos_uint64_t GLuint64;
+typedef khronos_uint64_t GLuint64EXT;
+typedef struct __GLsync *GLsync;
+struct _cl_context;
+struct _cl_event;
+typedef void ( *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+typedef void ( *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+typedef void ( *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+typedef void ( *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam);
+typedef unsigned short GLhalfNV;
+typedef GLintptr GLvdpauSurfaceNV;
+typedef void ( *GLVULKANPROCNV)(void);
+
+
+#define GL_VERSION_1_0 1
+GLAD_API_CALL int GLAD_GL_VERSION_1_0;
+#define GL_VERSION_1_1 1
+GLAD_API_CALL int GLAD_GL_VERSION_1_1;
+#define GL_VERSION_ES_CM_1_0 1
+GLAD_API_CALL int GLAD_GL_VERSION_ES_CM_1_0;
+#define GL_ARB_copy_buffer 1
+GLAD_API_CALL int GLAD_GL_ARB_copy_buffer;
+#define GL_ARB_fragment_shader 1
+GLAD_API_CALL int GLAD_GL_ARB_fragment_shader;
+#define GL_ARB_framebuffer_object 1
+GLAD_API_CALL int GLAD_GL_ARB_framebuffer_object;
+#define GL_ARB_geometry_shader4 1
+GLAD_API_CALL int GLAD_GL_ARB_geometry_shader4;
+#define GL_ARB_get_program_binary 1
+GLAD_API_CALL int GLAD_GL_ARB_get_program_binary;
+#define GL_ARB_imaging 1
+GLAD_API_CALL int GLAD_GL_ARB_imaging;
+#define GL_ARB_multitexture 1
+GLAD_API_CALL int GLAD_GL_ARB_multitexture;
+#define GL_ARB_separate_shader_objects 1
+GLAD_API_CALL int GLAD_GL_ARB_separate_shader_objects;
+#define GL_ARB_shader_objects 1
+GLAD_API_CALL int GLAD_GL_ARB_shader_objects;
+#define GL_ARB_shading_language_100 1
+GLAD_API_CALL int GLAD_GL_ARB_shading_language_100;
+#define GL_ARB_texture_non_power_of_two 1
+GLAD_API_CALL int GLAD_GL_ARB_texture_non_power_of_two;
+#define GL_ARB_vertex_buffer_object 1
+GLAD_API_CALL int GLAD_GL_ARB_vertex_buffer_object;
+#define GL_ARB_vertex_program 1
+GLAD_API_CALL int GLAD_GL_ARB_vertex_program;
+#define GL_ARB_vertex_shader 1
+GLAD_API_CALL int GLAD_GL_ARB_vertex_shader;
+#define GL_EXT_blend_equation_separate 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_equation_separate;
+#define GL_EXT_blend_func_separate 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_func_separate;
+#define GL_EXT_blend_minmax 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_minmax;
+#define GL_EXT_blend_subtract 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_subtract;
+#define GL_EXT_copy_texture 1
+GLAD_API_CALL int GLAD_GL_EXT_copy_texture;
+#define GL_EXT_framebuffer_blit 1
+GLAD_API_CALL int GLAD_GL_EXT_framebuffer_blit;
+#define GL_EXT_framebuffer_multisample 1
+GLAD_API_CALL int GLAD_GL_EXT_framebuffer_multisample;
+#define GL_EXT_framebuffer_object 1
+GLAD_API_CALL int GLAD_GL_EXT_framebuffer_object;
+#define GL_EXT_geometry_shader4 1
+GLAD_API_CALL int GLAD_GL_EXT_geometry_shader4;
+#define GL_EXT_packed_depth_stencil 1
+GLAD_API_CALL int GLAD_GL_EXT_packed_depth_stencil;
+#define GL_EXT_subtexture 1
+GLAD_API_CALL int GLAD_GL_EXT_subtexture;
+#define GL_EXT_texture_array 1
+GLAD_API_CALL int GLAD_GL_EXT_texture_array;
+#define GL_EXT_texture_object 1
+GLAD_API_CALL int GLAD_GL_EXT_texture_object;
+#define GL_EXT_texture_sRGB 1
+GLAD_API_CALL int GLAD_GL_EXT_texture_sRGB;
+#define GL_EXT_vertex_array 1
+GLAD_API_CALL int GLAD_GL_EXT_vertex_array;
+#define GL_INGR_blend_func_separate 1
+GLAD_API_CALL int GLAD_GL_INGR_blend_func_separate;
+#define GL_KHR_debug 1
+GLAD_API_CALL int GLAD_GL_KHR_debug;
+#define GL_NV_geometry_program4 1
+GLAD_API_CALL int GLAD_GL_NV_geometry_program4;
+#define GL_NV_vertex_program 1
+GLAD_API_CALL int GLAD_GL_NV_vertex_program;
+#define GL_SGIS_texture_edge_clamp 1
+GLAD_API_CALL int GLAD_GL_SGIS_texture_edge_clamp;
+#define GL_EXT_sRGB 1
+GLAD_API_CALL int GLAD_GL_EXT_sRGB;
+#define GL_OES_blend_equation_separate 1
+GLAD_API_CALL int GLAD_GL_OES_blend_equation_separate;
+#define GL_OES_blend_func_separate 1
+GLAD_API_CALL int GLAD_GL_OES_blend_func_separate;
+#define GL_OES_blend_subtract 1
+GLAD_API_CALL int GLAD_GL_OES_blend_subtract;
+#define GL_OES_framebuffer_object 1
+GLAD_API_CALL int GLAD_GL_OES_framebuffer_object;
+#define GL_OES_packed_depth_stencil 1
+GLAD_API_CALL int GLAD_GL_OES_packed_depth_stencil;
+#define GL_OES_single_precision 1
+GLAD_API_CALL int GLAD_GL_OES_single_precision;
+#define GL_OES_texture_npot 1
+GLAD_API_CALL int GLAD_GL_OES_texture_npot;
+
+
+typedef void (GLAD_API_PTR *PFNGLACCUMPROC)(GLenum op, GLfloat value);
+typedef void (GLAD_API_PTR *PFNGLACTIVESHADERPROGRAMPROC)(GLuint pipeline, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLALPHAFUNCPROC)(GLenum func, GLfloat ref);
+typedef GLboolean (GLAD_API_PTR *PFNGLAREPROGRAMSRESIDENTNVPROC)(GLsizei n, const GLuint * programs, GLboolean * residences);
+typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences);
+typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTEXTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences);
+typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTPROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTEXTPROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLATTACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB obj);
+typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLBEGINPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONARBPROC)(GLhandleARB programObj, GLuint index, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERARBPROC)(GLenum target, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMARBPROC)(GLenum target, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMNVPROC)(GLenum target, GLuint id);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREEXTPROC)(GLenum target, GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLBITMAPPROC)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap);
+typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONEXTPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEINGRPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage);
+typedef void (GLAD_API_PTR *PFNGLBUFFERDATAARBPROC)(GLenum target, GLsizeiptrARB size, const void * data, GLenum usage);
+typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data);
+typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCALLLISTPROC)(GLuint list);
+typedef void (GLAD_API_PTR *PFNGLCALLLISTSPROC)(GLsizei n, GLenum type, const void * lists);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLCLEARACCUMPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth);
+typedef void (GLAD_API_PTR *PFNGLCLEARINDEXPROC)(GLfloat c);
+typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s);
+typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEPROC)(GLenum plane, const GLdouble * equation);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3IPROC)(GLint red, GLint green, GLint blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UBVPROC)(const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UIVPROC)(const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3USVPROC)(const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4BPROC)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4DPROC)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4FPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4IPROC)(GLint red, GLint green, GLint blue, GLint alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4SPROC)(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UBPROC)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UBVPROC)(const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UIPROC)(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UIVPROC)(const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4USPROC)(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4USVPROC)(const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLORMATERIALPROC)(GLenum face, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLCOLORPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * table);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERARBPROC)(GLhandleARB shaderObj);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * image);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * image);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIPROC)(GLenum target, GLenum pname, GLint params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GLAD_API_PTR *PFNGLCOPYCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATEPROGRAMOBJECTARBPROC)(void);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATESHADEROBJECTARBPROC)(GLenum shaderType);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar *const* strings);
+typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void * userParam);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf);
+typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSARBPROC)(GLsizei n, const GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETELISTSPROC)(GLuint list, GLsizei range);
+typedef void (GLAD_API_PTR *PFNGLDELETEOBJECTARBPROC)(GLhandleARB obj);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint * pipelines);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSARBPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSNVPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESEXTPROC)(GLsizei n, const GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func);
+typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f);
+typedef void (GLAD_API_PTR *PFNGLDETACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB attachedObj);
+typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap);
+typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEPROC)(GLenum array);
+typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count);
+typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSEXTPROC)(GLenum mode, GLint first, GLsizei count);
+typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf);
+typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices);
+typedef void (GLAD_API_PTR *PFNGLDRAWPIXELSPROC)(GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPROC)(GLboolean flag);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTERPROC)(GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTEREXTPROC)(GLsizei stride, GLsizei count, const GLboolean * pointer);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGVPROC)(const GLboolean * flag);
+typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap);
+typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEPROC)(GLenum array);
+typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLENDPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLENDLISTPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DPROC)(GLdouble u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DVPROC)(const GLdouble * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FPROC)(GLfloat u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FVPROC)(const GLfloat * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DPROC)(GLdouble u, GLdouble v);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DVPROC)(const GLdouble * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FPROC)(GLfloat u, GLfloat v);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FVPROC)(const GLfloat * u);
+typedef void (GLAD_API_PTR *PFNGLEVALMESH1PROC)(GLenum mode, GLint i1, GLint i2);
+typedef void (GLAD_API_PTR *PFNGLEVALMESH2PROC)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+typedef void (GLAD_API_PTR *PFNGLEVALPOINT1PROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLEVALPOINT2PROC)(GLint i, GLint j);
+typedef void (GLAD_API_PTR *PFNGLEXECUTEPROGRAMNVPROC)(GLenum target, GLuint id, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLFEEDBACKBUFFERPROC)(GLsizei size, GLenum type, GLfloat * buffer);
+typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLFOGFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLFOGFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLFOGIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLFOGIVPROC)(GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLGENBUFFERSARBPROC)(GLsizei n, GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint * framebuffers);
+typedef GLuint (GLAD_API_PTR *PFNGLGENLISTSPROC)(GLsizei range);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSARBPROC)(GLsizei n, GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSNVPROC)(GLsizei n, GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLGENTEXTURESEXTPROC)(GLsizei n, GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPEXTPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETATTACHEDOBJECTSARBPROC)(GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj);
+typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVARBPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVARBPROC)(GLenum target, GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEPROC)(GLenum plane, GLdouble * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPROC)(GLenum target, GLenum format, GLenum type, void * table);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONFILTERPROC)(GLenum target, GLenum format, GLenum type, void * image);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog);
+typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data);
+typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLGETHANDLEARBPROC)(GLenum pname);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETINFOLOGARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog);
+typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTFVPROC)(GLenum light, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTIVPROC)(GLenum light, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETMAPDVPROC)(GLenum target, GLenum query, GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLGETMAPFVPROC)(GLenum target, GLenum query, GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLGETMAPIVPROC)(GLenum target, GLenum query, GLint * v);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALFVPROC)(GLenum face, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALIVPROC)(GLenum face, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERFVARBPROC)(GLhandleARB obj, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERIVARBPROC)(GLhandleARB obj, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPTRLABELPROC)(const void * ptr, GLsizei bufSize, GLsizei * length, GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPFVPROC)(GLenum map, GLfloat * values);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUIVPROC)(GLenum map, GLuint * values);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUSVPROC)(GLenum map, GLushort * values);
+typedef void (GLAD_API_PTR *PFNGLGETPOINTERVPROC)(GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETPOINTERVEXTPROC)(GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte * mask);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERDVNVPROC)(GLenum target, GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERFVNVPROC)(GLenum target, GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGARBPROC)(GLenum target, GLenum pname, void * string);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGNVPROC)(GLuint id, GLenum pname, GLubyte * program);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVARBPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVNVPROC)(GLuint id, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETSEPARABLEFILTERPROC)(GLenum target, GLenum format, GLenum type, void * row, void * column, void * span);
+typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source);
+typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source);
+typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENDVPROC)(GLenum coord, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENFVPROC)(GLenum coord, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENIVPROC)(GLenum coord, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTRACKMATRIXIVNVPROC)(GLenum target, GLuint address, GLenum pname, GLint * params);
+typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVARBPROC)(GLhandleARB programObj, GLint location, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVARBPROC)(GLhandleARB programObj, GLint location, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVARBPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVNVPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVARBPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVNVPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVARBPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVNVPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVARBPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVNVPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLHISTOGRAMPROC)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+typedef void (GLAD_API_PTR *PFNGLINDEXMASKPROC)(GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLINDEXPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLINDEXPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLINDEXDPROC)(GLdouble c);
+typedef void (GLAD_API_PTR *PFNGLINDEXDVPROC)(const GLdouble * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXFPROC)(GLfloat c);
+typedef void (GLAD_API_PTR *PFNGLINDEXFVPROC)(const GLfloat * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXIPROC)(GLint c);
+typedef void (GLAD_API_PTR *PFNGLINDEXIVPROC)(const GLint * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXSPROC)(GLshort c);
+typedef void (GLAD_API_PTR *PFNGLINDEXSVPROC)(const GLshort * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXUBPROC)(GLubyte c);
+typedef void (GLAD_API_PTR *PFNGLINDEXUBVPROC)(const GLubyte * c);
+typedef void (GLAD_API_PTR *PFNGLINITNAMESPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLINTERLEAVEDARRAYSPROC)(GLenum format, GLsizei stride, const void * pointer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERARBPROC)(GLuint buffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISLISTPROC)(GLuint list);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMARBPROC)(GLuint program);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMNVPROC)(GLuint id);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture);
+typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREEXTPROC)(GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIVPROC)(GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTFPROC)(GLenum light, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTFVPROC)(GLenum light, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTIPROC)(GLenum light, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTIVPROC)(GLenum light, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLLINESTIPPLEPROC)(GLint factor, GLushort pattern);
+typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width);
+typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLLISTBASEPROC)(GLuint base);
+typedef void (GLAD_API_PTR *PFNGLLOADIDENTITYPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXDPROC)(const GLdouble * m);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXFPROC)(const GLfloat * m);
+typedef void (GLAD_API_PTR *PFNGLLOADNAMEPROC)(GLuint name);
+typedef void (GLAD_API_PTR *PFNGLLOADPROGRAMNVPROC)(GLenum target, GLuint id, GLsizei len, const GLubyte * program);
+typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode);
+typedef void (GLAD_API_PTR *PFNGLMAP1DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points);
+typedef void (GLAD_API_PTR *PFNGLMAP1FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points);
+typedef void (GLAD_API_PTR *PFNGLMAP2DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points);
+typedef void (GLAD_API_PTR *PFNGLMAP2FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points);
+typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access);
+typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERARBPROC)(GLenum target, GLenum access);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID1DPROC)(GLint un, GLdouble u1, GLdouble u2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID1FPROC)(GLint un, GLfloat u1, GLfloat u2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID2DPROC)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID2FPROC)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLMATERIALFPROC)(GLenum face, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALFVPROC)(GLenum face, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLMATERIALIPROC)(GLenum face, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALIVPROC)(GLenum face, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLMATRIXMODEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLMINMAXPROC)(GLenum target, GLenum internalformat, GLboolean sink);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXDPROC)(const GLdouble * m);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXFPROC)(const GLfloat * m);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DPROC)(GLenum target, GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DARBPROC)(GLenum target, GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FPROC)(GLenum target, GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FARBPROC)(GLenum target, GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IPROC)(GLenum target, GLint s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IARBPROC)(GLenum target, GLint s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SPROC)(GLenum target, GLshort s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SARBPROC)(GLenum target, GLshort s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DPROC)(GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DARBPROC)(GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FPROC)(GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FARBPROC)(GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IPROC)(GLenum target, GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IARBPROC)(GLenum target, GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SPROC)(GLenum target, GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SARBPROC)(GLenum target, GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IPROC)(GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IARBPROC)(GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SPROC)(GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IARBPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLNEWLISTPROC)(GLuint list, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3BPROC)(GLbyte nx, GLbyte ny, GLbyte nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3DPROC)(GLdouble nx, GLdouble ny, GLdouble nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3FPROC)(GLfloat nx, GLfloat ny, GLfloat nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3IPROC)(GLint nx, GLint ny, GLint nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3SPROC)(GLshort nx, GLshort ny, GLshort nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLNORMALPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLNORMALPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELPROC)(const void * ptr, GLsizei length, const GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLORTHOPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+typedef void (GLAD_API_PTR *PFNGLPASSTHROUGHPROC)(GLfloat token);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPFVPROC)(GLenum map, GLsizei mapsize, const GLfloat * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPUIVPROC)(GLenum map, GLsizei mapsize, const GLuint * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPUSVPROC)(GLenum map, GLsizei mapsize, const GLushort * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLPIXELZOOMPROC)(GLfloat xfactor, GLfloat yfactor);
+typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONSTIPPLEPROC)(const GLubyte * mask);
+typedef void (GLAD_API_PTR *PFNGLPOPATTRIBPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPCLIENTATTRIBPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPMATRIXPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPNAMEPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESPROC)(GLsizei n, const GLuint * textures, const GLfloat * priorities);
+typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESEXTPROC)(GLsizei n, const GLuint * textures, const GLclampf * priorities);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLsizei length);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DNVPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DVNVPROC)(GLenum target, GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FNVPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FVNVPROC)(GLenum target, GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIARBPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIEXTPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4DVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4FVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMSTRINGARBPROC)(GLenum target, GLenum format, GLsizei len, const void * string);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DPROC)(GLuint program, GLint location, GLdouble v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FPROC)(GLuint program, GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IPROC)(GLuint program, GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIPROC)(GLuint program, GLint location, GLuint v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IPROC)(GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMVERTEXLIMITNVPROC)(GLenum target, GLint limit);
+typedef void (GLAD_API_PTR *PFNGLPUSHATTRIBPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message);
+typedef void (GLAD_API_PTR *PFNGLPUSHMATRIXPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPUSHNAMEPROC)(GLuint name);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DPROC)(GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FPROC)(GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IPROC)(GLint x, GLint y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SPROC)(GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IPROC)(GLint x, GLint y, GLint z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SPROC)(GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IPROC)(GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src);
+typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLRECTDPROC)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+typedef void (GLAD_API_PTR *PFNGLRECTDVPROC)(const GLdouble * v1, const GLdouble * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTFPROC)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+typedef void (GLAD_API_PTR *PFNGLRECTFVPROC)(const GLfloat * v1, const GLfloat * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTIPROC)(GLint x1, GLint y1, GLint x2, GLint y2);
+typedef void (GLAD_API_PTR *PFNGLRECTIVPROC)(const GLint * v1, const GLint * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTSPROC)(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+typedef void (GLAD_API_PTR *PFNGLRECTSVPROC)(const GLshort * v1, const GLshort * v2);
+typedef GLint (GLAD_API_PTR *PFNGLRENDERMODEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLREQUESTRESIDENTPROGRAMSNVPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLRESETHISTOGRAMPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLRESETMINMAXPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLROTATEDPROC)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLROTATEFPROC)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLSCALEDPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLSCALEFPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLSELECTBUFFERPROC)(GLsizei size, GLuint * buffer);
+typedef void (GLAD_API_PTR *PFNGLSEPARABLEFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * row, const void * column);
+typedef void (GLAD_API_PTR *PFNGLSHADEMODELPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length);
+typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEARBPROC)(GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint * length);
+typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DPROC)(GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FPROC)(GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IPROC)(GLint s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SPROC)(GLshort s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DPROC)(GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FPROC)(GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IPROC)(GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SPROC)(GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DPROC)(GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FPROC)(GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IPROC)(GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SPROC)(GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DPROC)(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FPROC)(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IPROC)(GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SPROC)(GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLTEXENVFPROC)(GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXENVIPROC)(GLenum target, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENDPROC)(GLenum coord, GLenum pname, GLdouble param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENDVPROC)(GLenum coord, GLenum pname, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENFPROC)(GLenum coord, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENFVPROC)(GLenum coord, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENIPROC)(GLenum coord, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENIVPROC)(GLenum coord, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTRACKMATRIXNVPROC)(GLenum target, GLuint address, GLenum matrix, GLenum transform);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEDPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEFPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FARBPROC)(GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IARBPROC)(GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FARBPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IARBPROC)(GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target);
+typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERARBPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMOBJECTARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2DPROC)(GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2FPROC)(GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2IPROC)(GLint x, GLint y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2SPROC)(GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3DPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3FPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3IPROC)(GLint x, GLint y, GLint z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3SPROC)(GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4IPROC)(GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DARBPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DNVPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FARBPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FNVPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SARBPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SNVPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DARBPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DNVPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FARBPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FNVPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SARBPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SNVPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVARBPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVARBPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBARBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVARBPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVARBPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVARBPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVARBPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVARBPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBNVPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVARBPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVNVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVARBPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVARBPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERARBPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERNVPROC)(GLuint index, GLint fsize, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4UBVNVPROC)(GLuint index, GLsizei count, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLALPHAFUNCXPROC)(GLenum func, GLfixed ref);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEROESPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEROESPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONOESPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEOESPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEOESPROC)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSOESPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLCLEARCOLORXPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat d);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFOESPROC)(GLclampf depth);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHXPROC)(GLfixed depth);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFPROC)(GLenum p, const GLfloat * eqn);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFOESPROC)(GLenum plane, const GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEXPROC)(GLenum plane, const GLfixed * equation);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4XPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSOESPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSOESPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFOESPROC)(GLclampf n, GLclampf f);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEXPROC)(GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLFOGXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLFOGXVPROC)(GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEROESPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DOESPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMFPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMXPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSOESPROC)(GLsizei n, GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSOESPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPOESPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFPROC)(GLenum plane, GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFOESPROC)(GLenum plane, GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEXPROC)(GLenum plane, GLfixed * equation);
+typedef void (GLAD_API_PTR *PFNGLGETFIXEDVPROC)(GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTXVPROC)(GLenum light, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALXVPROC)(GLenum face, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVOESPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVXVPROC)(GLenum target, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERXVPROC)(GLenum target, GLenum pname, GLfixed * params);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFEROESPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFEROESPROC)(GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELXVPROC)(GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTXPROC)(GLenum light, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTXVPROC)(GLenum light, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLLINEWIDTHXPROC)(GLfixed width);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXXPROC)(const GLfixed * m);
+typedef void (GLAD_API_PTR *PFNGLMATERIALXPROC)(GLenum face, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALXVPROC)(GLenum face, GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXXPROC)(const GLfixed * m);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4XPROC)(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3XPROC)(GLfixed nx, GLfixed ny, GLfixed nz);
+typedef void (GLAD_API_PTR *PFNGLORTHOFPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLORTHOFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLORTHOXPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERXVPROC)(GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLPOINTSIZEXPROC)(GLfixed size);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETXPROC)(GLfixed factor, GLfixed units);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEOESPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLROTATEXPROC)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert);
+typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEXPROC)(GLclampx value, GLboolean invert);
+typedef void (GLAD_API_PTR *PFNGLSCALEXPROC)(GLfixed x, GLfixed y, GLfixed z);
+typedef void (GLAD_API_PTR *PFNGLTEXENVXPROC)(GLenum target, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVXVPROC)(GLenum target, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERXPROC)(GLenum target, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERXVPROC)(GLenum target, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEXPROC)(GLfixed x, GLfixed y, GLfixed z);
+
+GLAD_API_CALL PFNGLACCUMPROC glad_glAccum;
+#define glAccum glad_glAccum
+GLAD_API_CALL PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram;
+#define glActiveShaderProgram glad_glActiveShaderProgram
+GLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture;
+#define glActiveTexture glad_glActiveTexture
+GLAD_API_CALL PFNGLACTIVETEXTUREARBPROC glad_glActiveTextureARB;
+#define glActiveTextureARB glad_glActiveTextureARB
+GLAD_API_CALL PFNGLALPHAFUNCPROC glad_glAlphaFunc;
+#define glAlphaFunc glad_glAlphaFunc
+GLAD_API_CALL PFNGLAREPROGRAMSRESIDENTNVPROC glad_glAreProgramsResidentNV;
+#define glAreProgramsResidentNV glad_glAreProgramsResidentNV
+GLAD_API_CALL PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident;
+#define glAreTexturesResident glad_glAreTexturesResident
+GLAD_API_CALL PFNGLARETEXTURESRESIDENTEXTPROC glad_glAreTexturesResidentEXT;
+#define glAreTexturesResidentEXT glad_glAreTexturesResidentEXT
+GLAD_API_CALL PFNGLARRAYELEMENTPROC glad_glArrayElement;
+#define glArrayElement glad_glArrayElement
+GLAD_API_CALL PFNGLARRAYELEMENTEXTPROC glad_glArrayElementEXT;
+#define glArrayElementEXT glad_glArrayElementEXT
+GLAD_API_CALL PFNGLATTACHOBJECTARBPROC glad_glAttachObjectARB;
+#define glAttachObjectARB glad_glAttachObjectARB
+GLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader;
+#define glAttachShader glad_glAttachShader
+GLAD_API_CALL PFNGLBEGINPROC glad_glBegin;
+#define glBegin glad_glBegin
+GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation;
+#define glBindAttribLocation glad_glBindAttribLocation
+GLAD_API_CALL PFNGLBINDATTRIBLOCATIONARBPROC glad_glBindAttribLocationARB;
+#define glBindAttribLocationARB glad_glBindAttribLocationARB
+GLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer;
+#define glBindBuffer glad_glBindBuffer
+GLAD_API_CALL PFNGLBINDBUFFERARBPROC glad_glBindBufferARB;
+#define glBindBufferARB glad_glBindBufferARB
+GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer;
+#define glBindFramebuffer glad_glBindFramebuffer
+GLAD_API_CALL PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT;
+#define glBindFramebufferEXT glad_glBindFramebufferEXT
+GLAD_API_CALL PFNGLBINDPROGRAMARBPROC glad_glBindProgramARB;
+#define glBindProgramARB glad_glBindProgramARB
+GLAD_API_CALL PFNGLBINDPROGRAMNVPROC glad_glBindProgramNV;
+#define glBindProgramNV glad_glBindProgramNV
+GLAD_API_CALL PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline;
+#define glBindProgramPipeline glad_glBindProgramPipeline
+GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer;
+#define glBindRenderbuffer glad_glBindRenderbuffer
+GLAD_API_CALL PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT;
+#define glBindRenderbufferEXT glad_glBindRenderbufferEXT
+GLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture;
+#define glBindTexture glad_glBindTexture
+GLAD_API_CALL PFNGLBINDTEXTUREEXTPROC glad_glBindTextureEXT;
+#define glBindTextureEXT glad_glBindTextureEXT
+GLAD_API_CALL PFNGLBITMAPPROC glad_glBitmap;
+#define glBitmap glad_glBitmap
+GLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor;
+#define glBlendColor glad_glBlendColor
+GLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation;
+#define glBlendEquation glad_glBlendEquation
+GLAD_API_CALL PFNGLBLENDEQUATIONEXTPROC glad_glBlendEquationEXT;
+#define glBlendEquationEXT glad_glBlendEquationEXT
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate;
+#define glBlendEquationSeparate glad_glBlendEquationSeparate
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEEXTPROC glad_glBlendEquationSeparateEXT;
+#define glBlendEquationSeparateEXT glad_glBlendEquationSeparateEXT
+GLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc;
+#define glBlendFunc glad_glBlendFunc
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate;
+#define glBlendFuncSeparate glad_glBlendFuncSeparate
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEEXTPROC glad_glBlendFuncSeparateEXT;
+#define glBlendFuncSeparateEXT glad_glBlendFuncSeparateEXT
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEINGRPROC glad_glBlendFuncSeparateINGR;
+#define glBlendFuncSeparateINGR glad_glBlendFuncSeparateINGR
+GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer;
+#define glBlitFramebuffer glad_glBlitFramebuffer
+GLAD_API_CALL PFNGLBLITFRAMEBUFFEREXTPROC glad_glBlitFramebufferEXT;
+#define glBlitFramebufferEXT glad_glBlitFramebufferEXT
+GLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData;
+#define glBufferData glad_glBufferData
+GLAD_API_CALL PFNGLBUFFERDATAARBPROC glad_glBufferDataARB;
+#define glBufferDataARB glad_glBufferDataARB
+GLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData;
+#define glBufferSubData glad_glBufferSubData
+GLAD_API_CALL PFNGLBUFFERSUBDATAARBPROC glad_glBufferSubDataARB;
+#define glBufferSubDataARB glad_glBufferSubDataARB
+GLAD_API_CALL PFNGLCALLLISTPROC glad_glCallList;
+#define glCallList glad_glCallList
+GLAD_API_CALL PFNGLCALLLISTSPROC glad_glCallLists;
+#define glCallLists glad_glCallLists
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus;
+#define glCheckFramebufferStatus glad_glCheckFramebufferStatus
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT;
+#define glCheckFramebufferStatusEXT glad_glCheckFramebufferStatusEXT
+GLAD_API_CALL PFNGLCLEARPROC glad_glClear;
+#define glClear glad_glClear
+GLAD_API_CALL PFNGLCLEARACCUMPROC glad_glClearAccum;
+#define glClearAccum glad_glClearAccum
+GLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor;
+#define glClearColor glad_glClearColor
+GLAD_API_CALL PFNGLCLEARDEPTHPROC glad_glClearDepth;
+#define glClearDepth glad_glClearDepth
+GLAD_API_CALL PFNGLCLEARINDEXPROC glad_glClearIndex;
+#define glClearIndex glad_glClearIndex
+GLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil;
+#define glClearStencil glad_glClearStencil
+GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture;
+#define glClientActiveTexture glad_glClientActiveTexture
+GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREARBPROC glad_glClientActiveTextureARB;
+#define glClientActiveTextureARB glad_glClientActiveTextureARB
+GLAD_API_CALL PFNGLCLIPPLANEPROC glad_glClipPlane;
+#define glClipPlane glad_glClipPlane
+GLAD_API_CALL PFNGLCOLOR3BPROC glad_glColor3b;
+#define glColor3b glad_glColor3b
+GLAD_API_CALL PFNGLCOLOR3BVPROC glad_glColor3bv;
+#define glColor3bv glad_glColor3bv
+GLAD_API_CALL PFNGLCOLOR3DPROC glad_glColor3d;
+#define glColor3d glad_glColor3d
+GLAD_API_CALL PFNGLCOLOR3DVPROC glad_glColor3dv;
+#define glColor3dv glad_glColor3dv
+GLAD_API_CALL PFNGLCOLOR3FPROC glad_glColor3f;
+#define glColor3f glad_glColor3f
+GLAD_API_CALL PFNGLCOLOR3FVPROC glad_glColor3fv;
+#define glColor3fv glad_glColor3fv
+GLAD_API_CALL PFNGLCOLOR3IPROC glad_glColor3i;
+#define glColor3i glad_glColor3i
+GLAD_API_CALL PFNGLCOLOR3IVPROC glad_glColor3iv;
+#define glColor3iv glad_glColor3iv
+GLAD_API_CALL PFNGLCOLOR3SPROC glad_glColor3s;
+#define glColor3s glad_glColor3s
+GLAD_API_CALL PFNGLCOLOR3SVPROC glad_glColor3sv;
+#define glColor3sv glad_glColor3sv
+GLAD_API_CALL PFNGLCOLOR3UBPROC glad_glColor3ub;
+#define glColor3ub glad_glColor3ub
+GLAD_API_CALL PFNGLCOLOR3UBVPROC glad_glColor3ubv;
+#define glColor3ubv glad_glColor3ubv
+GLAD_API_CALL PFNGLCOLOR3UIPROC glad_glColor3ui;
+#define glColor3ui glad_glColor3ui
+GLAD_API_CALL PFNGLCOLOR3UIVPROC glad_glColor3uiv;
+#define glColor3uiv glad_glColor3uiv
+GLAD_API_CALL PFNGLCOLOR3USPROC glad_glColor3us;
+#define glColor3us glad_glColor3us
+GLAD_API_CALL PFNGLCOLOR3USVPROC glad_glColor3usv;
+#define glColor3usv glad_glColor3usv
+GLAD_API_CALL PFNGLCOLOR4BPROC glad_glColor4b;
+#define glColor4b glad_glColor4b
+GLAD_API_CALL PFNGLCOLOR4BVPROC glad_glColor4bv;
+#define glColor4bv glad_glColor4bv
+GLAD_API_CALL PFNGLCOLOR4DPROC glad_glColor4d;
+#define glColor4d glad_glColor4d
+GLAD_API_CALL PFNGLCOLOR4DVPROC glad_glColor4dv;
+#define glColor4dv glad_glColor4dv
+GLAD_API_CALL PFNGLCOLOR4FPROC glad_glColor4f;
+#define glColor4f glad_glColor4f
+GLAD_API_CALL PFNGLCOLOR4FVPROC glad_glColor4fv;
+#define glColor4fv glad_glColor4fv
+GLAD_API_CALL PFNGLCOLOR4IPROC glad_glColor4i;
+#define glColor4i glad_glColor4i
+GLAD_API_CALL PFNGLCOLOR4IVPROC glad_glColor4iv;
+#define glColor4iv glad_glColor4iv
+GLAD_API_CALL PFNGLCOLOR4SPROC glad_glColor4s;
+#define glColor4s glad_glColor4s
+GLAD_API_CALL PFNGLCOLOR4SVPROC glad_glColor4sv;
+#define glColor4sv glad_glColor4sv
+GLAD_API_CALL PFNGLCOLOR4UBPROC glad_glColor4ub;
+#define glColor4ub glad_glColor4ub
+GLAD_API_CALL PFNGLCOLOR4UBVPROC glad_glColor4ubv;
+#define glColor4ubv glad_glColor4ubv
+GLAD_API_CALL PFNGLCOLOR4UIPROC glad_glColor4ui;
+#define glColor4ui glad_glColor4ui
+GLAD_API_CALL PFNGLCOLOR4UIVPROC glad_glColor4uiv;
+#define glColor4uiv glad_glColor4uiv
+GLAD_API_CALL PFNGLCOLOR4USPROC glad_glColor4us;
+#define glColor4us glad_glColor4us
+GLAD_API_CALL PFNGLCOLOR4USVPROC glad_glColor4usv;
+#define glColor4usv glad_glColor4usv
+GLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask;
+#define glColorMask glad_glColorMask
+GLAD_API_CALL PFNGLCOLORMATERIALPROC glad_glColorMaterial;
+#define glColorMaterial glad_glColorMaterial
+GLAD_API_CALL PFNGLCOLORPOINTERPROC glad_glColorPointer;
+#define glColorPointer glad_glColorPointer
+GLAD_API_CALL PFNGLCOLORPOINTEREXTPROC glad_glColorPointerEXT;
+#define glColorPointerEXT glad_glColorPointerEXT
+GLAD_API_CALL PFNGLCOLORSUBTABLEPROC glad_glColorSubTable;
+#define glColorSubTable glad_glColorSubTable
+GLAD_API_CALL PFNGLCOLORTABLEPROC glad_glColorTable;
+#define glColorTable glad_glColorTable
+GLAD_API_CALL PFNGLCOLORTABLEPARAMETERFVPROC glad_glColorTableParameterfv;
+#define glColorTableParameterfv glad_glColorTableParameterfv
+GLAD_API_CALL PFNGLCOLORTABLEPARAMETERIVPROC glad_glColorTableParameteriv;
+#define glColorTableParameteriv glad_glColorTableParameteriv
+GLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader;
+#define glCompileShader glad_glCompileShader
+GLAD_API_CALL PFNGLCOMPILESHADERARBPROC glad_glCompileShaderARB;
+#define glCompileShaderARB glad_glCompileShaderARB
+GLAD_API_CALL PFNGLCONVOLUTIONFILTER1DPROC glad_glConvolutionFilter1D;
+#define glConvolutionFilter1D glad_glConvolutionFilter1D
+GLAD_API_CALL PFNGLCONVOLUTIONFILTER2DPROC glad_glConvolutionFilter2D;
+#define glConvolutionFilter2D glad_glConvolutionFilter2D
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFPROC glad_glConvolutionParameterf;
+#define glConvolutionParameterf glad_glConvolutionParameterf
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFVPROC glad_glConvolutionParameterfv;
+#define glConvolutionParameterfv glad_glConvolutionParameterfv
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIPROC glad_glConvolutionParameteri;
+#define glConvolutionParameteri glad_glConvolutionParameteri
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIVPROC glad_glConvolutionParameteriv;
+#define glConvolutionParameteriv glad_glConvolutionParameteriv
+GLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData;
+#define glCopyBufferSubData glad_glCopyBufferSubData
+GLAD_API_CALL PFNGLCOPYCOLORSUBTABLEPROC glad_glCopyColorSubTable;
+#define glCopyColorSubTable glad_glCopyColorSubTable
+GLAD_API_CALL PFNGLCOPYCOLORTABLEPROC glad_glCopyColorTable;
+#define glCopyColorTable glad_glCopyColorTable
+GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER1DPROC glad_glCopyConvolutionFilter1D;
+#define glCopyConvolutionFilter1D glad_glCopyConvolutionFilter1D
+GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER2DPROC glad_glCopyConvolutionFilter2D;
+#define glCopyConvolutionFilter2D glad_glCopyConvolutionFilter2D
+GLAD_API_CALL PFNGLCOPYPIXELSPROC glad_glCopyPixels;
+#define glCopyPixels glad_glCopyPixels
+GLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D;
+#define glCopyTexImage1D glad_glCopyTexImage1D
+GLAD_API_CALL PFNGLCOPYTEXIMAGE1DEXTPROC glad_glCopyTexImage1DEXT;
+#define glCopyTexImage1DEXT glad_glCopyTexImage1DEXT
+GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D;
+#define glCopyTexImage2D glad_glCopyTexImage2D
+GLAD_API_CALL PFNGLCOPYTEXIMAGE2DEXTPROC glad_glCopyTexImage2DEXT;
+#define glCopyTexImage2DEXT glad_glCopyTexImage2DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D;
+#define glCopyTexSubImage1D glad_glCopyTexSubImage1D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DEXTPROC glad_glCopyTexSubImage1DEXT;
+#define glCopyTexSubImage1DEXT glad_glCopyTexSubImage1DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D;
+#define glCopyTexSubImage2D glad_glCopyTexSubImage2D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DEXTPROC glad_glCopyTexSubImage2DEXT;
+#define glCopyTexSubImage2DEXT glad_glCopyTexSubImage2DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D;
+#define glCopyTexSubImage3D glad_glCopyTexSubImage3D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DEXTPROC glad_glCopyTexSubImage3DEXT;
+#define glCopyTexSubImage3DEXT glad_glCopyTexSubImage3DEXT
+GLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram;
+#define glCreateProgram glad_glCreateProgram
+GLAD_API_CALL PFNGLCREATEPROGRAMOBJECTARBPROC glad_glCreateProgramObjectARB;
+#define glCreateProgramObjectARB glad_glCreateProgramObjectARB
+GLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader;
+#define glCreateShader glad_glCreateShader
+GLAD_API_CALL PFNGLCREATESHADEROBJECTARBPROC glad_glCreateShaderObjectARB;
+#define glCreateShaderObjectARB glad_glCreateShaderObjectARB
+GLAD_API_CALL PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv;
+#define glCreateShaderProgramv glad_glCreateShaderProgramv
+GLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace;
+#define glCullFace glad_glCullFace
+GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback;
+#define glDebugMessageCallback glad_glDebugMessageCallback
+GLAD_API_CALL PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl;
+#define glDebugMessageControl glad_glDebugMessageControl
+GLAD_API_CALL PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert;
+#define glDebugMessageInsert glad_glDebugMessageInsert
+GLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers;
+#define glDeleteBuffers glad_glDeleteBuffers
+GLAD_API_CALL PFNGLDELETEBUFFERSARBPROC glad_glDeleteBuffersARB;
+#define glDeleteBuffersARB glad_glDeleteBuffersARB
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers;
+#define glDeleteFramebuffers glad_glDeleteFramebuffers
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT;
+#define glDeleteFramebuffersEXT glad_glDeleteFramebuffersEXT
+GLAD_API_CALL PFNGLDELETELISTSPROC glad_glDeleteLists;
+#define glDeleteLists glad_glDeleteLists
+GLAD_API_CALL PFNGLDELETEOBJECTARBPROC glad_glDeleteObjectARB;
+#define glDeleteObjectARB glad_glDeleteObjectARB
+GLAD_API_CALL PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines;
+#define glDeleteProgramPipelines glad_glDeleteProgramPipelines
+GLAD_API_CALL PFNGLDELETEPROGRAMSARBPROC glad_glDeleteProgramsARB;
+#define glDeleteProgramsARB glad_glDeleteProgramsARB
+GLAD_API_CALL PFNGLDELETEPROGRAMSNVPROC glad_glDeleteProgramsNV;
+#define glDeleteProgramsNV glad_glDeleteProgramsNV
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers;
+#define glDeleteRenderbuffers glad_glDeleteRenderbuffers
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT;
+#define glDeleteRenderbuffersEXT glad_glDeleteRenderbuffersEXT
+GLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures;
+#define glDeleteTextures glad_glDeleteTextures
+GLAD_API_CALL PFNGLDELETETEXTURESEXTPROC glad_glDeleteTexturesEXT;
+#define glDeleteTexturesEXT glad_glDeleteTexturesEXT
+GLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc;
+#define glDepthFunc glad_glDepthFunc
+GLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask;
+#define glDepthMask glad_glDepthMask
+GLAD_API_CALL PFNGLDEPTHRANGEPROC glad_glDepthRange;
+#define glDepthRange glad_glDepthRange
+GLAD_API_CALL PFNGLDETACHOBJECTARBPROC glad_glDetachObjectARB;
+#define glDetachObjectARB glad_glDetachObjectARB
+GLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader;
+#define glDetachShader glad_glDetachShader
+GLAD_API_CALL PFNGLDISABLEPROC glad_glDisable;
+#define glDisable glad_glDisable
+GLAD_API_CALL PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState;
+#define glDisableClientState glad_glDisableClientState
+GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray;
+#define glDisableVertexAttribArray glad_glDisableVertexAttribArray
+GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glad_glDisableVertexAttribArrayARB;
+#define glDisableVertexAttribArrayARB glad_glDisableVertexAttribArrayARB
+GLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays;
+#define glDrawArrays glad_glDrawArrays
+GLAD_API_CALL PFNGLDRAWARRAYSEXTPROC glad_glDrawArraysEXT;
+#define glDrawArraysEXT glad_glDrawArraysEXT
+GLAD_API_CALL PFNGLDRAWBUFFERPROC glad_glDrawBuffer;
+#define glDrawBuffer glad_glDrawBuffer
+GLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements;
+#define glDrawElements glad_glDrawElements
+GLAD_API_CALL PFNGLDRAWPIXELSPROC glad_glDrawPixels;
+#define glDrawPixels glad_glDrawPixels
+GLAD_API_CALL PFNGLEDGEFLAGPROC glad_glEdgeFlag;
+#define glEdgeFlag glad_glEdgeFlag
+GLAD_API_CALL PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer;
+#define glEdgeFlagPointer glad_glEdgeFlagPointer
+GLAD_API_CALL PFNGLEDGEFLAGPOINTEREXTPROC glad_glEdgeFlagPointerEXT;
+#define glEdgeFlagPointerEXT glad_glEdgeFlagPointerEXT
+GLAD_API_CALL PFNGLEDGEFLAGVPROC glad_glEdgeFlagv;
+#define glEdgeFlagv glad_glEdgeFlagv
+GLAD_API_CALL PFNGLENABLEPROC glad_glEnable;
+#define glEnable glad_glEnable
+GLAD_API_CALL PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState;
+#define glEnableClientState glad_glEnableClientState
+GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray;
+#define glEnableVertexAttribArray glad_glEnableVertexAttribArray
+GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYARBPROC glad_glEnableVertexAttribArrayARB;
+#define glEnableVertexAttribArrayARB glad_glEnableVertexAttribArrayARB
+GLAD_API_CALL PFNGLENDPROC glad_glEnd;
+#define glEnd glad_glEnd
+GLAD_API_CALL PFNGLENDLISTPROC glad_glEndList;
+#define glEndList glad_glEndList
+GLAD_API_CALL PFNGLEVALCOORD1DPROC glad_glEvalCoord1d;
+#define glEvalCoord1d glad_glEvalCoord1d
+GLAD_API_CALL PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv;
+#define glEvalCoord1dv glad_glEvalCoord1dv
+GLAD_API_CALL PFNGLEVALCOORD1FPROC glad_glEvalCoord1f;
+#define glEvalCoord1f glad_glEvalCoord1f
+GLAD_API_CALL PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv;
+#define glEvalCoord1fv glad_glEvalCoord1fv
+GLAD_API_CALL PFNGLEVALCOORD2DPROC glad_glEvalCoord2d;
+#define glEvalCoord2d glad_glEvalCoord2d
+GLAD_API_CALL PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv;
+#define glEvalCoord2dv glad_glEvalCoord2dv
+GLAD_API_CALL PFNGLEVALCOORD2FPROC glad_glEvalCoord2f;
+#define glEvalCoord2f glad_glEvalCoord2f
+GLAD_API_CALL PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv;
+#define glEvalCoord2fv glad_glEvalCoord2fv
+GLAD_API_CALL PFNGLEVALMESH1PROC glad_glEvalMesh1;
+#define glEvalMesh1 glad_glEvalMesh1
+GLAD_API_CALL PFNGLEVALMESH2PROC glad_glEvalMesh2;
+#define glEvalMesh2 glad_glEvalMesh2
+GLAD_API_CALL PFNGLEVALPOINT1PROC glad_glEvalPoint1;
+#define glEvalPoint1 glad_glEvalPoint1
+GLAD_API_CALL PFNGLEVALPOINT2PROC glad_glEvalPoint2;
+#define glEvalPoint2 glad_glEvalPoint2
+GLAD_API_CALL PFNGLEXECUTEPROGRAMNVPROC glad_glExecuteProgramNV;
+#define glExecuteProgramNV glad_glExecuteProgramNV
+GLAD_API_CALL PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer;
+#define glFeedbackBuffer glad_glFeedbackBuffer
+GLAD_API_CALL PFNGLFINISHPROC glad_glFinish;
+#define glFinish glad_glFinish
+GLAD_API_CALL PFNGLFLUSHPROC glad_glFlush;
+#define glFlush glad_glFlush
+GLAD_API_CALL PFNGLFOGFPROC glad_glFogf;
+#define glFogf glad_glFogf
+GLAD_API_CALL PFNGLFOGFVPROC glad_glFogfv;
+#define glFogfv glad_glFogfv
+GLAD_API_CALL PFNGLFOGIPROC glad_glFogi;
+#define glFogi glad_glFogi
+GLAD_API_CALL PFNGLFOGIVPROC glad_glFogiv;
+#define glFogiv glad_glFogiv
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer;
+#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT;
+#define glFramebufferRenderbufferEXT glad_glFramebufferRenderbufferEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture;
+#define glFramebufferTexture glad_glFramebufferTexture
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D;
+#define glFramebufferTexture1D glad_glFramebufferTexture1D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT;
+#define glFramebufferTexture1DEXT glad_glFramebufferTexture1DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D;
+#define glFramebufferTexture2D glad_glFramebufferTexture2D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT;
+#define glFramebufferTexture2DEXT glad_glFramebufferTexture2DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D;
+#define glFramebufferTexture3D glad_glFramebufferTexture3D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT;
+#define glFramebufferTexture3DEXT glad_glFramebufferTexture3DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREARBPROC glad_glFramebufferTextureARB;
+#define glFramebufferTextureARB glad_glFramebufferTextureARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT;
+#define glFramebufferTextureEXT glad_glFramebufferTextureEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEARBPROC glad_glFramebufferTextureFaceARB;
+#define glFramebufferTextureFaceARB glad_glFramebufferTextureFaceARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC glad_glFramebufferTextureFaceEXT;
+#define glFramebufferTextureFaceEXT glad_glFramebufferTextureFaceEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer;
+#define glFramebufferTextureLayer glad_glFramebufferTextureLayer
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERARBPROC glad_glFramebufferTextureLayerARB;
+#define glFramebufferTextureLayerARB glad_glFramebufferTextureLayerARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC glad_glFramebufferTextureLayerEXT;
+#define glFramebufferTextureLayerEXT glad_glFramebufferTextureLayerEXT
+GLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace;
+#define glFrontFace glad_glFrontFace
+GLAD_API_CALL PFNGLFRUSTUMPROC glad_glFrustum;
+#define glFrustum glad_glFrustum
+GLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers;
+#define glGenBuffers glad_glGenBuffers
+GLAD_API_CALL PFNGLGENBUFFERSARBPROC glad_glGenBuffersARB;
+#define glGenBuffersARB glad_glGenBuffersARB
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers;
+#define glGenFramebuffers glad_glGenFramebuffers
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT;
+#define glGenFramebuffersEXT glad_glGenFramebuffersEXT
+GLAD_API_CALL PFNGLGENLISTSPROC glad_glGenLists;
+#define glGenLists glad_glGenLists
+GLAD_API_CALL PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines;
+#define glGenProgramPipelines glad_glGenProgramPipelines
+GLAD_API_CALL PFNGLGENPROGRAMSARBPROC glad_glGenProgramsARB;
+#define glGenProgramsARB glad_glGenProgramsARB
+GLAD_API_CALL PFNGLGENPROGRAMSNVPROC glad_glGenProgramsNV;
+#define glGenProgramsNV glad_glGenProgramsNV
+GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers;
+#define glGenRenderbuffers glad_glGenRenderbuffers
+GLAD_API_CALL PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT;
+#define glGenRenderbuffersEXT glad_glGenRenderbuffersEXT
+GLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures;
+#define glGenTextures glad_glGenTextures
+GLAD_API_CALL PFNGLGENTEXTURESEXTPROC glad_glGenTexturesEXT;
+#define glGenTexturesEXT glad_glGenTexturesEXT
+GLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap;
+#define glGenerateMipmap glad_glGenerateMipmap
+GLAD_API_CALL PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT;
+#define glGenerateMipmapEXT glad_glGenerateMipmapEXT
+GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib;
+#define glGetActiveAttrib glad_glGetActiveAttrib
+GLAD_API_CALL PFNGLGETACTIVEATTRIBARBPROC glad_glGetActiveAttribARB;
+#define glGetActiveAttribARB glad_glGetActiveAttribARB
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform;
+#define glGetActiveUniform glad_glGetActiveUniform
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMARBPROC glad_glGetActiveUniformARB;
+#define glGetActiveUniformARB glad_glGetActiveUniformARB
+GLAD_API_CALL PFNGLGETATTACHEDOBJECTSARBPROC glad_glGetAttachedObjectsARB;
+#define glGetAttachedObjectsARB glad_glGetAttachedObjectsARB
+GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation;
+#define glGetAttribLocation glad_glGetAttribLocation
+GLAD_API_CALL PFNGLGETATTRIBLOCATIONARBPROC glad_glGetAttribLocationARB;
+#define glGetAttribLocationARB glad_glGetAttribLocationARB
+GLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv;
+#define glGetBooleanv glad_glGetBooleanv
+GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv;
+#define glGetBufferParameteriv glad_glGetBufferParameteriv
+GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVARBPROC glad_glGetBufferParameterivARB;
+#define glGetBufferParameterivARB glad_glGetBufferParameterivARB
+GLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv;
+#define glGetBufferPointerv glad_glGetBufferPointerv
+GLAD_API_CALL PFNGLGETBUFFERPOINTERVARBPROC glad_glGetBufferPointervARB;
+#define glGetBufferPointervARB glad_glGetBufferPointervARB
+GLAD_API_CALL PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData;
+#define glGetBufferSubData glad_glGetBufferSubData
+GLAD_API_CALL PFNGLGETBUFFERSUBDATAARBPROC glad_glGetBufferSubDataARB;
+#define glGetBufferSubDataARB glad_glGetBufferSubDataARB
+GLAD_API_CALL PFNGLGETCLIPPLANEPROC glad_glGetClipPlane;
+#define glGetClipPlane glad_glGetClipPlane
+GLAD_API_CALL PFNGLGETCOLORTABLEPROC glad_glGetColorTable;
+#define glGetColorTable glad_glGetColorTable
+GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERFVPROC glad_glGetColorTableParameterfv;
+#define glGetColorTableParameterfv glad_glGetColorTableParameterfv
+GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERIVPROC glad_glGetColorTableParameteriv;
+#define glGetColorTableParameteriv glad_glGetColorTableParameteriv
+GLAD_API_CALL PFNGLGETCONVOLUTIONFILTERPROC glad_glGetConvolutionFilter;
+#define glGetConvolutionFilter glad_glGetConvolutionFilter
+GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERFVPROC glad_glGetConvolutionParameterfv;
+#define glGetConvolutionParameterfv glad_glGetConvolutionParameterfv
+GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERIVPROC glad_glGetConvolutionParameteriv;
+#define glGetConvolutionParameteriv glad_glGetConvolutionParameteriv
+GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog;
+#define glGetDebugMessageLog glad_glGetDebugMessageLog
+GLAD_API_CALL PFNGLGETDOUBLEVPROC glad_glGetDoublev;
+#define glGetDoublev glad_glGetDoublev
+GLAD_API_CALL PFNGLGETERRORPROC glad_glGetError;
+#define glGetError glad_glGetError
+GLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv;
+#define glGetFloatv glad_glGetFloatv
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv;
+#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT;
+#define glGetFramebufferAttachmentParameterivEXT glad_glGetFramebufferAttachmentParameterivEXT
+GLAD_API_CALL PFNGLGETHANDLEARBPROC glad_glGetHandleARB;
+#define glGetHandleARB glad_glGetHandleARB
+GLAD_API_CALL PFNGLGETHISTOGRAMPROC glad_glGetHistogram;
+#define glGetHistogram glad_glGetHistogram
+GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERFVPROC glad_glGetHistogramParameterfv;
+#define glGetHistogramParameterfv glad_glGetHistogramParameterfv
+GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERIVPROC glad_glGetHistogramParameteriv;
+#define glGetHistogramParameteriv glad_glGetHistogramParameteriv
+GLAD_API_CALL PFNGLGETINFOLOGARBPROC glad_glGetInfoLogARB;
+#define glGetInfoLogARB glad_glGetInfoLogARB
+GLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv;
+#define glGetIntegerv glad_glGetIntegerv
+GLAD_API_CALL PFNGLGETLIGHTFVPROC glad_glGetLightfv;
+#define glGetLightfv glad_glGetLightfv
+GLAD_API_CALL PFNGLGETLIGHTIVPROC glad_glGetLightiv;
+#define glGetLightiv glad_glGetLightiv
+GLAD_API_CALL PFNGLGETMAPDVPROC glad_glGetMapdv;
+#define glGetMapdv glad_glGetMapdv
+GLAD_API_CALL PFNGLGETMAPFVPROC glad_glGetMapfv;
+#define glGetMapfv glad_glGetMapfv
+GLAD_API_CALL PFNGLGETMAPIVPROC glad_glGetMapiv;
+#define glGetMapiv glad_glGetMapiv
+GLAD_API_CALL PFNGLGETMATERIALFVPROC glad_glGetMaterialfv;
+#define glGetMaterialfv glad_glGetMaterialfv
+GLAD_API_CALL PFNGLGETMATERIALIVPROC glad_glGetMaterialiv;
+#define glGetMaterialiv glad_glGetMaterialiv
+GLAD_API_CALL PFNGLGETMINMAXPROC glad_glGetMinmax;
+#define glGetMinmax glad_glGetMinmax
+GLAD_API_CALL PFNGLGETMINMAXPARAMETERFVPROC glad_glGetMinmaxParameterfv;
+#define glGetMinmaxParameterfv glad_glGetMinmaxParameterfv
+GLAD_API_CALL PFNGLGETMINMAXPARAMETERIVPROC glad_glGetMinmaxParameteriv;
+#define glGetMinmaxParameteriv glad_glGetMinmaxParameteriv
+GLAD_API_CALL PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel;
+#define glGetObjectLabel glad_glGetObjectLabel
+GLAD_API_CALL PFNGLGETOBJECTPARAMETERFVARBPROC glad_glGetObjectParameterfvARB;
+#define glGetObjectParameterfvARB glad_glGetObjectParameterfvARB
+GLAD_API_CALL PFNGLGETOBJECTPARAMETERIVARBPROC glad_glGetObjectParameterivARB;
+#define glGetObjectParameterivARB glad_glGetObjectParameterivARB
+GLAD_API_CALL PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel;
+#define glGetObjectPtrLabel glad_glGetObjectPtrLabel
+GLAD_API_CALL PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv;
+#define glGetPixelMapfv glad_glGetPixelMapfv
+GLAD_API_CALL PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv;
+#define glGetPixelMapuiv glad_glGetPixelMapuiv
+GLAD_API_CALL PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv;
+#define glGetPixelMapusv glad_glGetPixelMapusv
+GLAD_API_CALL PFNGLGETPOINTERVPROC glad_glGetPointerv;
+#define glGetPointerv glad_glGetPointerv
+GLAD_API_CALL PFNGLGETPOINTERVEXTPROC glad_glGetPointervEXT;
+#define glGetPointervEXT glad_glGetPointervEXT
+GLAD_API_CALL PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple;
+#define glGetPolygonStipple glad_glGetPolygonStipple
+GLAD_API_CALL PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary;
+#define glGetProgramBinary glad_glGetProgramBinary
+GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERDVARBPROC glad_glGetProgramEnvParameterdvARB;
+#define glGetProgramEnvParameterdvARB glad_glGetProgramEnvParameterdvARB
+GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERFVARBPROC glad_glGetProgramEnvParameterfvARB;
+#define glGetProgramEnvParameterfvARB glad_glGetProgramEnvParameterfvARB
+GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glad_glGetProgramLocalParameterdvARB;
+#define glGetProgramLocalParameterdvARB glad_glGetProgramLocalParameterdvARB
+GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glad_glGetProgramLocalParameterfvARB;
+#define glGetProgramLocalParameterfvARB glad_glGetProgramLocalParameterfvARB
+GLAD_API_CALL PFNGLGETPROGRAMPARAMETERDVNVPROC glad_glGetProgramParameterdvNV;
+#define glGetProgramParameterdvNV glad_glGetProgramParameterdvNV
+GLAD_API_CALL PFNGLGETPROGRAMPARAMETERFVNVPROC glad_glGetProgramParameterfvNV;
+#define glGetProgramParameterfvNV glad_glGetProgramParameterfvNV
+GLAD_API_CALL PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog;
+#define glGetProgramPipelineInfoLog glad_glGetProgramPipelineInfoLog
+GLAD_API_CALL PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv;
+#define glGetProgramPipelineiv glad_glGetProgramPipelineiv
+GLAD_API_CALL PFNGLGETPROGRAMSTRINGARBPROC glad_glGetProgramStringARB;
+#define glGetProgramStringARB glad_glGetProgramStringARB
+GLAD_API_CALL PFNGLGETPROGRAMSTRINGNVPROC glad_glGetProgramStringNV;
+#define glGetProgramStringNV glad_glGetProgramStringNV
+GLAD_API_CALL PFNGLGETPROGRAMIVARBPROC glad_glGetProgramivARB;
+#define glGetProgramivARB glad_glGetProgramivARB
+GLAD_API_CALL PFNGLGETPROGRAMIVNVPROC glad_glGetProgramivNV;
+#define glGetProgramivNV glad_glGetProgramivNV
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv;
+#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT;
+#define glGetRenderbufferParameterivEXT glad_glGetRenderbufferParameterivEXT
+GLAD_API_CALL PFNGLGETSEPARABLEFILTERPROC glad_glGetSeparableFilter;
+#define glGetSeparableFilter glad_glGetSeparableFilter
+GLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource;
+#define glGetShaderSource glad_glGetShaderSource
+GLAD_API_CALL PFNGLGETSHADERSOURCEARBPROC glad_glGetShaderSourceARB;
+#define glGetShaderSourceARB glad_glGetShaderSourceARB
+GLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString;
+#define glGetString glad_glGetString
+GLAD_API_CALL PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv;
+#define glGetTexEnvfv glad_glGetTexEnvfv
+GLAD_API_CALL PFNGLGETTEXENVIVPROC glad_glGetTexEnviv;
+#define glGetTexEnviv glad_glGetTexEnviv
+GLAD_API_CALL PFNGLGETTEXGENDVPROC glad_glGetTexGendv;
+#define glGetTexGendv glad_glGetTexGendv
+GLAD_API_CALL PFNGLGETTEXGENFVPROC glad_glGetTexGenfv;
+#define glGetTexGenfv glad_glGetTexGenfv
+GLAD_API_CALL PFNGLGETTEXGENIVPROC glad_glGetTexGeniv;
+#define glGetTexGeniv glad_glGetTexGeniv
+GLAD_API_CALL PFNGLGETTEXIMAGEPROC glad_glGetTexImage;
+#define glGetTexImage glad_glGetTexImage
+GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv;
+#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv
+GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv;
+#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv
+GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv;
+#define glGetTexParameterfv glad_glGetTexParameterfv
+GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv;
+#define glGetTexParameteriv glad_glGetTexParameteriv
+GLAD_API_CALL PFNGLGETTRACKMATRIXIVNVPROC glad_glGetTrackMatrixivNV;
+#define glGetTrackMatrixivNV glad_glGetTrackMatrixivNV
+GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation;
+#define glGetUniformLocation glad_glGetUniformLocation
+GLAD_API_CALL PFNGLGETUNIFORMLOCATIONARBPROC glad_glGetUniformLocationARB;
+#define glGetUniformLocationARB glad_glGetUniformLocationARB
+GLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv;
+#define glGetUniformfv glad_glGetUniformfv
+GLAD_API_CALL PFNGLGETUNIFORMFVARBPROC glad_glGetUniformfvARB;
+#define glGetUniformfvARB glad_glGetUniformfvARB
+GLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv;
+#define glGetUniformiv glad_glGetUniformiv
+GLAD_API_CALL PFNGLGETUNIFORMIVARBPROC glad_glGetUniformivARB;
+#define glGetUniformivARB glad_glGetUniformivARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv;
+#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVARBPROC glad_glGetVertexAttribPointervARB;
+#define glGetVertexAttribPointervARB glad_glGetVertexAttribPointervARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVNVPROC glad_glGetVertexAttribPointervNV;
+#define glGetVertexAttribPointervNV glad_glGetVertexAttribPointervNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv;
+#define glGetVertexAttribdv glad_glGetVertexAttribdv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVARBPROC glad_glGetVertexAttribdvARB;
+#define glGetVertexAttribdvARB glad_glGetVertexAttribdvARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVNVPROC glad_glGetVertexAttribdvNV;
+#define glGetVertexAttribdvNV glad_glGetVertexAttribdvNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv;
+#define glGetVertexAttribfv glad_glGetVertexAttribfv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVARBPROC glad_glGetVertexAttribfvARB;
+#define glGetVertexAttribfvARB glad_glGetVertexAttribfvARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVNVPROC glad_glGetVertexAttribfvNV;
+#define glGetVertexAttribfvNV glad_glGetVertexAttribfvNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv;
+#define glGetVertexAttribiv glad_glGetVertexAttribiv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVARBPROC glad_glGetVertexAttribivARB;
+#define glGetVertexAttribivARB glad_glGetVertexAttribivARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVNVPROC glad_glGetVertexAttribivNV;
+#define glGetVertexAttribivNV glad_glGetVertexAttribivNV
+GLAD_API_CALL PFNGLHINTPROC glad_glHint;
+#define glHint glad_glHint
+GLAD_API_CALL PFNGLHISTOGRAMPROC glad_glHistogram;
+#define glHistogram glad_glHistogram
+GLAD_API_CALL PFNGLINDEXMASKPROC glad_glIndexMask;
+#define glIndexMask glad_glIndexMask
+GLAD_API_CALL PFNGLINDEXPOINTERPROC glad_glIndexPointer;
+#define glIndexPointer glad_glIndexPointer
+GLAD_API_CALL PFNGLINDEXPOINTEREXTPROC glad_glIndexPointerEXT;
+#define glIndexPointerEXT glad_glIndexPointerEXT
+GLAD_API_CALL PFNGLINDEXDPROC glad_glIndexd;
+#define glIndexd glad_glIndexd
+GLAD_API_CALL PFNGLINDEXDVPROC glad_glIndexdv;
+#define glIndexdv glad_glIndexdv
+GLAD_API_CALL PFNGLINDEXFPROC glad_glIndexf;
+#define glIndexf glad_glIndexf
+GLAD_API_CALL PFNGLINDEXFVPROC glad_glIndexfv;
+#define glIndexfv glad_glIndexfv
+GLAD_API_CALL PFNGLINDEXIPROC glad_glIndexi;
+#define glIndexi glad_glIndexi
+GLAD_API_CALL PFNGLINDEXIVPROC glad_glIndexiv;
+#define glIndexiv glad_glIndexiv
+GLAD_API_CALL PFNGLINDEXSPROC glad_glIndexs;
+#define glIndexs glad_glIndexs
+GLAD_API_CALL PFNGLINDEXSVPROC glad_glIndexsv;
+#define glIndexsv glad_glIndexsv
+GLAD_API_CALL PFNGLINDEXUBPROC glad_glIndexub;
+#define glIndexub glad_glIndexub
+GLAD_API_CALL PFNGLINDEXUBVPROC glad_glIndexubv;
+#define glIndexubv glad_glIndexubv
+GLAD_API_CALL PFNGLINITNAMESPROC glad_glInitNames;
+#define glInitNames glad_glInitNames
+GLAD_API_CALL PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays;
+#define glInterleavedArrays glad_glInterleavedArrays
+GLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer;
+#define glIsBuffer glad_glIsBuffer
+GLAD_API_CALL PFNGLISBUFFERARBPROC glad_glIsBufferARB;
+#define glIsBufferARB glad_glIsBufferARB
+GLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled;
+#define glIsEnabled glad_glIsEnabled
+GLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer;
+#define glIsFramebuffer glad_glIsFramebuffer
+GLAD_API_CALL PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT;
+#define glIsFramebufferEXT glad_glIsFramebufferEXT
+GLAD_API_CALL PFNGLISLISTPROC glad_glIsList;
+#define glIsList glad_glIsList
+GLAD_API_CALL PFNGLISPROGRAMARBPROC glad_glIsProgramARB;
+#define glIsProgramARB glad_glIsProgramARB
+GLAD_API_CALL PFNGLISPROGRAMNVPROC glad_glIsProgramNV;
+#define glIsProgramNV glad_glIsProgramNV
+GLAD_API_CALL PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline;
+#define glIsProgramPipeline glad_glIsProgramPipeline
+GLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer;
+#define glIsRenderbuffer glad_glIsRenderbuffer
+GLAD_API_CALL PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT;
+#define glIsRenderbufferEXT glad_glIsRenderbufferEXT
+GLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture;
+#define glIsTexture glad_glIsTexture
+GLAD_API_CALL PFNGLISTEXTUREEXTPROC glad_glIsTextureEXT;
+#define glIsTextureEXT glad_glIsTextureEXT
+GLAD_API_CALL PFNGLLIGHTMODELFPROC glad_glLightModelf;
+#define glLightModelf glad_glLightModelf
+GLAD_API_CALL PFNGLLIGHTMODELFVPROC glad_glLightModelfv;
+#define glLightModelfv glad_glLightModelfv
+GLAD_API_CALL PFNGLLIGHTMODELIPROC glad_glLightModeli;
+#define glLightModeli glad_glLightModeli
+GLAD_API_CALL PFNGLLIGHTMODELIVPROC glad_glLightModeliv;
+#define glLightModeliv glad_glLightModeliv
+GLAD_API_CALL PFNGLLIGHTFPROC glad_glLightf;
+#define glLightf glad_glLightf
+GLAD_API_CALL PFNGLLIGHTFVPROC glad_glLightfv;
+#define glLightfv glad_glLightfv
+GLAD_API_CALL PFNGLLIGHTIPROC glad_glLighti;
+#define glLighti glad_glLighti
+GLAD_API_CALL PFNGLLIGHTIVPROC glad_glLightiv;
+#define glLightiv glad_glLightiv
+GLAD_API_CALL PFNGLLINESTIPPLEPROC glad_glLineStipple;
+#define glLineStipple glad_glLineStipple
+GLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth;
+#define glLineWidth glad_glLineWidth
+GLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram;
+#define glLinkProgram glad_glLinkProgram
+GLAD_API_CALL PFNGLLINKPROGRAMARBPROC glad_glLinkProgramARB;
+#define glLinkProgramARB glad_glLinkProgramARB
+GLAD_API_CALL PFNGLLISTBASEPROC glad_glListBase;
+#define glListBase glad_glListBase
+GLAD_API_CALL PFNGLLOADIDENTITYPROC glad_glLoadIdentity;
+#define glLoadIdentity glad_glLoadIdentity
+GLAD_API_CALL PFNGLLOADMATRIXDPROC glad_glLoadMatrixd;
+#define glLoadMatrixd glad_glLoadMatrixd
+GLAD_API_CALL PFNGLLOADMATRIXFPROC glad_glLoadMatrixf;
+#define glLoadMatrixf glad_glLoadMatrixf
+GLAD_API_CALL PFNGLLOADNAMEPROC glad_glLoadName;
+#define glLoadName glad_glLoadName
+GLAD_API_CALL PFNGLLOADPROGRAMNVPROC glad_glLoadProgramNV;
+#define glLoadProgramNV glad_glLoadProgramNV
+GLAD_API_CALL PFNGLLOGICOPPROC glad_glLogicOp;
+#define glLogicOp glad_glLogicOp
+GLAD_API_CALL PFNGLMAP1DPROC glad_glMap1d;
+#define glMap1d glad_glMap1d
+GLAD_API_CALL PFNGLMAP1FPROC glad_glMap1f;
+#define glMap1f glad_glMap1f
+GLAD_API_CALL PFNGLMAP2DPROC glad_glMap2d;
+#define glMap2d glad_glMap2d
+GLAD_API_CALL PFNGLMAP2FPROC glad_glMap2f;
+#define glMap2f glad_glMap2f
+GLAD_API_CALL PFNGLMAPBUFFERPROC glad_glMapBuffer;
+#define glMapBuffer glad_glMapBuffer
+GLAD_API_CALL PFNGLMAPBUFFERARBPROC glad_glMapBufferARB;
+#define glMapBufferARB glad_glMapBufferARB
+GLAD_API_CALL PFNGLMAPGRID1DPROC glad_glMapGrid1d;
+#define glMapGrid1d glad_glMapGrid1d
+GLAD_API_CALL PFNGLMAPGRID1FPROC glad_glMapGrid1f;
+#define glMapGrid1f glad_glMapGrid1f
+GLAD_API_CALL PFNGLMAPGRID2DPROC glad_glMapGrid2d;
+#define glMapGrid2d glad_glMapGrid2d
+GLAD_API_CALL PFNGLMAPGRID2FPROC glad_glMapGrid2f;
+#define glMapGrid2f glad_glMapGrid2f
+GLAD_API_CALL PFNGLMATERIALFPROC glad_glMaterialf;
+#define glMaterialf glad_glMaterialf
+GLAD_API_CALL PFNGLMATERIALFVPROC glad_glMaterialfv;
+#define glMaterialfv glad_glMaterialfv
+GLAD_API_CALL PFNGLMATERIALIPROC glad_glMateriali;
+#define glMateriali glad_glMateriali
+GLAD_API_CALL PFNGLMATERIALIVPROC glad_glMaterialiv;
+#define glMaterialiv glad_glMaterialiv
+GLAD_API_CALL PFNGLMATRIXMODEPROC glad_glMatrixMode;
+#define glMatrixMode glad_glMatrixMode
+GLAD_API_CALL PFNGLMINMAXPROC glad_glMinmax;
+#define glMinmax glad_glMinmax
+GLAD_API_CALL PFNGLMULTMATRIXDPROC glad_glMultMatrixd;
+#define glMultMatrixd glad_glMultMatrixd
+GLAD_API_CALL PFNGLMULTMATRIXFPROC glad_glMultMatrixf;
+#define glMultMatrixf glad_glMultMatrixf
+GLAD_API_CALL PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d;
+#define glMultiTexCoord1d glad_glMultiTexCoord1d
+GLAD_API_CALL PFNGLMULTITEXCOORD1DARBPROC glad_glMultiTexCoord1dARB;
+#define glMultiTexCoord1dARB glad_glMultiTexCoord1dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv;
+#define glMultiTexCoord1dv glad_glMultiTexCoord1dv
+GLAD_API_CALL PFNGLMULTITEXCOORD1DVARBPROC glad_glMultiTexCoord1dvARB;
+#define glMultiTexCoord1dvARB glad_glMultiTexCoord1dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f;
+#define glMultiTexCoord1f glad_glMultiTexCoord1f
+GLAD_API_CALL PFNGLMULTITEXCOORD1FARBPROC glad_glMultiTexCoord1fARB;
+#define glMultiTexCoord1fARB glad_glMultiTexCoord1fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv;
+#define glMultiTexCoord1fv glad_glMultiTexCoord1fv
+GLAD_API_CALL PFNGLMULTITEXCOORD1FVARBPROC glad_glMultiTexCoord1fvARB;
+#define glMultiTexCoord1fvARB glad_glMultiTexCoord1fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i;
+#define glMultiTexCoord1i glad_glMultiTexCoord1i
+GLAD_API_CALL PFNGLMULTITEXCOORD1IARBPROC glad_glMultiTexCoord1iARB;
+#define glMultiTexCoord1iARB glad_glMultiTexCoord1iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv;
+#define glMultiTexCoord1iv glad_glMultiTexCoord1iv
+GLAD_API_CALL PFNGLMULTITEXCOORD1IVARBPROC glad_glMultiTexCoord1ivARB;
+#define glMultiTexCoord1ivARB glad_glMultiTexCoord1ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s;
+#define glMultiTexCoord1s glad_glMultiTexCoord1s
+GLAD_API_CALL PFNGLMULTITEXCOORD1SARBPROC glad_glMultiTexCoord1sARB;
+#define glMultiTexCoord1sARB glad_glMultiTexCoord1sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv;
+#define glMultiTexCoord1sv glad_glMultiTexCoord1sv
+GLAD_API_CALL PFNGLMULTITEXCOORD1SVARBPROC glad_glMultiTexCoord1svARB;
+#define glMultiTexCoord1svARB glad_glMultiTexCoord1svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d;
+#define glMultiTexCoord2d glad_glMultiTexCoord2d
+GLAD_API_CALL PFNGLMULTITEXCOORD2DARBPROC glad_glMultiTexCoord2dARB;
+#define glMultiTexCoord2dARB glad_glMultiTexCoord2dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv;
+#define glMultiTexCoord2dv glad_glMultiTexCoord2dv
+GLAD_API_CALL PFNGLMULTITEXCOORD2DVARBPROC glad_glMultiTexCoord2dvARB;
+#define glMultiTexCoord2dvARB glad_glMultiTexCoord2dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f;
+#define glMultiTexCoord2f glad_glMultiTexCoord2f
+GLAD_API_CALL PFNGLMULTITEXCOORD2FARBPROC glad_glMultiTexCoord2fARB;
+#define glMultiTexCoord2fARB glad_glMultiTexCoord2fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv;
+#define glMultiTexCoord2fv glad_glMultiTexCoord2fv
+GLAD_API_CALL PFNGLMULTITEXCOORD2FVARBPROC glad_glMultiTexCoord2fvARB;
+#define glMultiTexCoord2fvARB glad_glMultiTexCoord2fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i;
+#define glMultiTexCoord2i glad_glMultiTexCoord2i
+GLAD_API_CALL PFNGLMULTITEXCOORD2IARBPROC glad_glMultiTexCoord2iARB;
+#define glMultiTexCoord2iARB glad_glMultiTexCoord2iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv;
+#define glMultiTexCoord2iv glad_glMultiTexCoord2iv
+GLAD_API_CALL PFNGLMULTITEXCOORD2IVARBPROC glad_glMultiTexCoord2ivARB;
+#define glMultiTexCoord2ivARB glad_glMultiTexCoord2ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s;
+#define glMultiTexCoord2s glad_glMultiTexCoord2s
+GLAD_API_CALL PFNGLMULTITEXCOORD2SARBPROC glad_glMultiTexCoord2sARB;
+#define glMultiTexCoord2sARB glad_glMultiTexCoord2sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv;
+#define glMultiTexCoord2sv glad_glMultiTexCoord2sv
+GLAD_API_CALL PFNGLMULTITEXCOORD2SVARBPROC glad_glMultiTexCoord2svARB;
+#define glMultiTexCoord2svARB glad_glMultiTexCoord2svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d;
+#define glMultiTexCoord3d glad_glMultiTexCoord3d
+GLAD_API_CALL PFNGLMULTITEXCOORD3DARBPROC glad_glMultiTexCoord3dARB;
+#define glMultiTexCoord3dARB glad_glMultiTexCoord3dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv;
+#define glMultiTexCoord3dv glad_glMultiTexCoord3dv
+GLAD_API_CALL PFNGLMULTITEXCOORD3DVARBPROC glad_glMultiTexCoord3dvARB;
+#define glMultiTexCoord3dvARB glad_glMultiTexCoord3dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f;
+#define glMultiTexCoord3f glad_glMultiTexCoord3f
+GLAD_API_CALL PFNGLMULTITEXCOORD3FARBPROC glad_glMultiTexCoord3fARB;
+#define glMultiTexCoord3fARB glad_glMultiTexCoord3fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv;
+#define glMultiTexCoord3fv glad_glMultiTexCoord3fv
+GLAD_API_CALL PFNGLMULTITEXCOORD3FVARBPROC glad_glMultiTexCoord3fvARB;
+#define glMultiTexCoord3fvARB glad_glMultiTexCoord3fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i;
+#define glMultiTexCoord3i glad_glMultiTexCoord3i
+GLAD_API_CALL PFNGLMULTITEXCOORD3IARBPROC glad_glMultiTexCoord3iARB;
+#define glMultiTexCoord3iARB glad_glMultiTexCoord3iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv;
+#define glMultiTexCoord3iv glad_glMultiTexCoord3iv
+GLAD_API_CALL PFNGLMULTITEXCOORD3IVARBPROC glad_glMultiTexCoord3ivARB;
+#define glMultiTexCoord3ivARB glad_glMultiTexCoord3ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s;
+#define glMultiTexCoord3s glad_glMultiTexCoord3s
+GLAD_API_CALL PFNGLMULTITEXCOORD3SARBPROC glad_glMultiTexCoord3sARB;
+#define glMultiTexCoord3sARB glad_glMultiTexCoord3sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv;
+#define glMultiTexCoord3sv glad_glMultiTexCoord3sv
+GLAD_API_CALL PFNGLMULTITEXCOORD3SVARBPROC glad_glMultiTexCoord3svARB;
+#define glMultiTexCoord3svARB glad_glMultiTexCoord3svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d;
+#define glMultiTexCoord4d glad_glMultiTexCoord4d
+GLAD_API_CALL PFNGLMULTITEXCOORD4DARBPROC glad_glMultiTexCoord4dARB;
+#define glMultiTexCoord4dARB glad_glMultiTexCoord4dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv;
+#define glMultiTexCoord4dv glad_glMultiTexCoord4dv
+GLAD_API_CALL PFNGLMULTITEXCOORD4DVARBPROC glad_glMultiTexCoord4dvARB;
+#define glMultiTexCoord4dvARB glad_glMultiTexCoord4dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f;
+#define glMultiTexCoord4f glad_glMultiTexCoord4f
+GLAD_API_CALL PFNGLMULTITEXCOORD4FARBPROC glad_glMultiTexCoord4fARB;
+#define glMultiTexCoord4fARB glad_glMultiTexCoord4fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv;
+#define glMultiTexCoord4fv glad_glMultiTexCoord4fv
+GLAD_API_CALL PFNGLMULTITEXCOORD4FVARBPROC glad_glMultiTexCoord4fvARB;
+#define glMultiTexCoord4fvARB glad_glMultiTexCoord4fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i;
+#define glMultiTexCoord4i glad_glMultiTexCoord4i
+GLAD_API_CALL PFNGLMULTITEXCOORD4IARBPROC glad_glMultiTexCoord4iARB;
+#define glMultiTexCoord4iARB glad_glMultiTexCoord4iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv;
+#define glMultiTexCoord4iv glad_glMultiTexCoord4iv
+GLAD_API_CALL PFNGLMULTITEXCOORD4IVARBPROC glad_glMultiTexCoord4ivARB;
+#define glMultiTexCoord4ivARB glad_glMultiTexCoord4ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s;
+#define glMultiTexCoord4s glad_glMultiTexCoord4s
+GLAD_API_CALL PFNGLMULTITEXCOORD4SARBPROC glad_glMultiTexCoord4sARB;
+#define glMultiTexCoord4sARB glad_glMultiTexCoord4sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv;
+#define glMultiTexCoord4sv glad_glMultiTexCoord4sv
+GLAD_API_CALL PFNGLMULTITEXCOORD4SVARBPROC glad_glMultiTexCoord4svARB;
+#define glMultiTexCoord4svARB glad_glMultiTexCoord4svARB
+GLAD_API_CALL PFNGLNEWLISTPROC glad_glNewList;
+#define glNewList glad_glNewList
+GLAD_API_CALL PFNGLNORMAL3BPROC glad_glNormal3b;
+#define glNormal3b glad_glNormal3b
+GLAD_API_CALL PFNGLNORMAL3BVPROC glad_glNormal3bv;
+#define glNormal3bv glad_glNormal3bv
+GLAD_API_CALL PFNGLNORMAL3DPROC glad_glNormal3d;
+#define glNormal3d glad_glNormal3d
+GLAD_API_CALL PFNGLNORMAL3DVPROC glad_glNormal3dv;
+#define glNormal3dv glad_glNormal3dv
+GLAD_API_CALL PFNGLNORMAL3FPROC glad_glNormal3f;
+#define glNormal3f glad_glNormal3f
+GLAD_API_CALL PFNGLNORMAL3FVPROC glad_glNormal3fv;
+#define glNormal3fv glad_glNormal3fv
+GLAD_API_CALL PFNGLNORMAL3IPROC glad_glNormal3i;
+#define glNormal3i glad_glNormal3i
+GLAD_API_CALL PFNGLNORMAL3IVPROC glad_glNormal3iv;
+#define glNormal3iv glad_glNormal3iv
+GLAD_API_CALL PFNGLNORMAL3SPROC glad_glNormal3s;
+#define glNormal3s glad_glNormal3s
+GLAD_API_CALL PFNGLNORMAL3SVPROC glad_glNormal3sv;
+#define glNormal3sv glad_glNormal3sv
+GLAD_API_CALL PFNGLNORMALPOINTERPROC glad_glNormalPointer;
+#define glNormalPointer glad_glNormalPointer
+GLAD_API_CALL PFNGLNORMALPOINTEREXTPROC glad_glNormalPointerEXT;
+#define glNormalPointerEXT glad_glNormalPointerEXT
+GLAD_API_CALL PFNGLOBJECTLABELPROC glad_glObjectLabel;
+#define glObjectLabel glad_glObjectLabel
+GLAD_API_CALL PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel;
+#define glObjectPtrLabel glad_glObjectPtrLabel
+GLAD_API_CALL PFNGLORTHOPROC glad_glOrtho;
+#define glOrtho glad_glOrtho
+GLAD_API_CALL PFNGLPASSTHROUGHPROC glad_glPassThrough;
+#define glPassThrough glad_glPassThrough
+GLAD_API_CALL PFNGLPIXELMAPFVPROC glad_glPixelMapfv;
+#define glPixelMapfv glad_glPixelMapfv
+GLAD_API_CALL PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv;
+#define glPixelMapuiv glad_glPixelMapuiv
+GLAD_API_CALL PFNGLPIXELMAPUSVPROC glad_glPixelMapusv;
+#define glPixelMapusv glad_glPixelMapusv
+GLAD_API_CALL PFNGLPIXELSTOREFPROC glad_glPixelStoref;
+#define glPixelStoref glad_glPixelStoref
+GLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei;
+#define glPixelStorei glad_glPixelStorei
+GLAD_API_CALL PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf;
+#define glPixelTransferf glad_glPixelTransferf
+GLAD_API_CALL PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi;
+#define glPixelTransferi glad_glPixelTransferi
+GLAD_API_CALL PFNGLPIXELZOOMPROC glad_glPixelZoom;
+#define glPixelZoom glad_glPixelZoom
+GLAD_API_CALL PFNGLPOINTSIZEPROC glad_glPointSize;
+#define glPointSize glad_glPointSize
+GLAD_API_CALL PFNGLPOLYGONMODEPROC glad_glPolygonMode;
+#define glPolygonMode glad_glPolygonMode
+GLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset;
+#define glPolygonOffset glad_glPolygonOffset
+GLAD_API_CALL PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple;
+#define glPolygonStipple glad_glPolygonStipple
+GLAD_API_CALL PFNGLPOPATTRIBPROC glad_glPopAttrib;
+#define glPopAttrib glad_glPopAttrib
+GLAD_API_CALL PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib;
+#define glPopClientAttrib glad_glPopClientAttrib
+GLAD_API_CALL PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup;
+#define glPopDebugGroup glad_glPopDebugGroup
+GLAD_API_CALL PFNGLPOPMATRIXPROC glad_glPopMatrix;
+#define glPopMatrix glad_glPopMatrix
+GLAD_API_CALL PFNGLPOPNAMEPROC glad_glPopName;
+#define glPopName glad_glPopName
+GLAD_API_CALL PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures;
+#define glPrioritizeTextures glad_glPrioritizeTextures
+GLAD_API_CALL PFNGLPRIORITIZETEXTURESEXTPROC glad_glPrioritizeTexturesEXT;
+#define glPrioritizeTexturesEXT glad_glPrioritizeTexturesEXT
+GLAD_API_CALL PFNGLPROGRAMBINARYPROC glad_glProgramBinary;
+#define glProgramBinary glad_glProgramBinary
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DARBPROC glad_glProgramEnvParameter4dARB;
+#define glProgramEnvParameter4dARB glad_glProgramEnvParameter4dARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DVARBPROC glad_glProgramEnvParameter4dvARB;
+#define glProgramEnvParameter4dvARB glad_glProgramEnvParameter4dvARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FARBPROC glad_glProgramEnvParameter4fARB;
+#define glProgramEnvParameter4fARB glad_glProgramEnvParameter4fARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FVARBPROC glad_glProgramEnvParameter4fvARB;
+#define glProgramEnvParameter4fvARB glad_glProgramEnvParameter4fvARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DARBPROC glad_glProgramLocalParameter4dARB;
+#define glProgramLocalParameter4dARB glad_glProgramLocalParameter4dARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glad_glProgramLocalParameter4dvARB;
+#define glProgramLocalParameter4dvARB glad_glProgramLocalParameter4dvARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FARBPROC glad_glProgramLocalParameter4fARB;
+#define glProgramLocalParameter4fARB glad_glProgramLocalParameter4fARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glad_glProgramLocalParameter4fvARB;
+#define glProgramLocalParameter4fvARB glad_glProgramLocalParameter4fvARB
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4DNVPROC glad_glProgramParameter4dNV;
+#define glProgramParameter4dNV glad_glProgramParameter4dNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4DVNVPROC glad_glProgramParameter4dvNV;
+#define glProgramParameter4dvNV glad_glProgramParameter4dvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4FNVPROC glad_glProgramParameter4fNV;
+#define glProgramParameter4fNV glad_glProgramParameter4fNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4FVNVPROC glad_glProgramParameter4fvNV;
+#define glProgramParameter4fvNV glad_glProgramParameter4fvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri;
+#define glProgramParameteri glad_glProgramParameteri
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIARBPROC glad_glProgramParameteriARB;
+#define glProgramParameteriARB glad_glProgramParameteriARB
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIEXTPROC glad_glProgramParameteriEXT;
+#define glProgramParameteriEXT glad_glProgramParameteriEXT
+GLAD_API_CALL PFNGLPROGRAMPARAMETERS4DVNVPROC glad_glProgramParameters4dvNV;
+#define glProgramParameters4dvNV glad_glProgramParameters4dvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETERS4FVNVPROC glad_glProgramParameters4fvNV;
+#define glProgramParameters4fvNV glad_glProgramParameters4fvNV
+GLAD_API_CALL PFNGLPROGRAMSTRINGARBPROC glad_glProgramStringARB;
+#define glProgramStringARB glad_glProgramStringARB
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d;
+#define glProgramUniform1d glad_glProgramUniform1d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv;
+#define glProgramUniform1dv glad_glProgramUniform1dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f;
+#define glProgramUniform1f glad_glProgramUniform1f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv;
+#define glProgramUniform1fv glad_glProgramUniform1fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i;
+#define glProgramUniform1i glad_glProgramUniform1i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv;
+#define glProgramUniform1iv glad_glProgramUniform1iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui;
+#define glProgramUniform1ui glad_glProgramUniform1ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv;
+#define glProgramUniform1uiv glad_glProgramUniform1uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d;
+#define glProgramUniform2d glad_glProgramUniform2d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv;
+#define glProgramUniform2dv glad_glProgramUniform2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f;
+#define glProgramUniform2f glad_glProgramUniform2f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv;
+#define glProgramUniform2fv glad_glProgramUniform2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i;
+#define glProgramUniform2i glad_glProgramUniform2i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv;
+#define glProgramUniform2iv glad_glProgramUniform2iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui;
+#define glProgramUniform2ui glad_glProgramUniform2ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv;
+#define glProgramUniform2uiv glad_glProgramUniform2uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d;
+#define glProgramUniform3d glad_glProgramUniform3d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv;
+#define glProgramUniform3dv glad_glProgramUniform3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f;
+#define glProgramUniform3f glad_glProgramUniform3f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv;
+#define glProgramUniform3fv glad_glProgramUniform3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i;
+#define glProgramUniform3i glad_glProgramUniform3i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv;
+#define glProgramUniform3iv glad_glProgramUniform3iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui;
+#define glProgramUniform3ui glad_glProgramUniform3ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv;
+#define glProgramUniform3uiv glad_glProgramUniform3uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d;
+#define glProgramUniform4d glad_glProgramUniform4d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv;
+#define glProgramUniform4dv glad_glProgramUniform4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f;
+#define glProgramUniform4f glad_glProgramUniform4f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv;
+#define glProgramUniform4fv glad_glProgramUniform4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i;
+#define glProgramUniform4i glad_glProgramUniform4i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv;
+#define glProgramUniform4iv glad_glProgramUniform4iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui;
+#define glProgramUniform4ui glad_glProgramUniform4ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv;
+#define glProgramUniform4uiv glad_glProgramUniform4uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv;
+#define glProgramUniformMatrix2dv glad_glProgramUniformMatrix2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv;
+#define glProgramUniformMatrix2fv glad_glProgramUniformMatrix2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv;
+#define glProgramUniformMatrix2x3dv glad_glProgramUniformMatrix2x3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv;
+#define glProgramUniformMatrix2x3fv glad_glProgramUniformMatrix2x3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv;
+#define glProgramUniformMatrix2x4dv glad_glProgramUniformMatrix2x4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv;
+#define glProgramUniformMatrix2x4fv glad_glProgramUniformMatrix2x4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv;
+#define glProgramUniformMatrix3dv glad_glProgramUniformMatrix3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv;
+#define glProgramUniformMatrix3fv glad_glProgramUniformMatrix3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv;
+#define glProgramUniformMatrix3x2dv glad_glProgramUniformMatrix3x2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv;
+#define glProgramUniformMatrix3x2fv glad_glProgramUniformMatrix3x2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv;
+#define glProgramUniformMatrix3x4dv glad_glProgramUniformMatrix3x4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv;
+#define glProgramUniformMatrix3x4fv glad_glProgramUniformMatrix3x4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv;
+#define glProgramUniformMatrix4dv glad_glProgramUniformMatrix4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv;
+#define glProgramUniformMatrix4fv glad_glProgramUniformMatrix4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv;
+#define glProgramUniformMatrix4x2dv glad_glProgramUniformMatrix4x2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv;
+#define glProgramUniformMatrix4x2fv glad_glProgramUniformMatrix4x2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv;
+#define glProgramUniformMatrix4x3dv glad_glProgramUniformMatrix4x3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv;
+#define glProgramUniformMatrix4x3fv glad_glProgramUniformMatrix4x3fv
+GLAD_API_CALL PFNGLPROGRAMVERTEXLIMITNVPROC glad_glProgramVertexLimitNV;
+#define glProgramVertexLimitNV glad_glProgramVertexLimitNV
+GLAD_API_CALL PFNGLPUSHATTRIBPROC glad_glPushAttrib;
+#define glPushAttrib glad_glPushAttrib
+GLAD_API_CALL PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib;
+#define glPushClientAttrib glad_glPushClientAttrib
+GLAD_API_CALL PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup;
+#define glPushDebugGroup glad_glPushDebugGroup
+GLAD_API_CALL PFNGLPUSHMATRIXPROC glad_glPushMatrix;
+#define glPushMatrix glad_glPushMatrix
+GLAD_API_CALL PFNGLPUSHNAMEPROC glad_glPushName;
+#define glPushName glad_glPushName
+GLAD_API_CALL PFNGLRASTERPOS2DPROC glad_glRasterPos2d;
+#define glRasterPos2d glad_glRasterPos2d
+GLAD_API_CALL PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv;
+#define glRasterPos2dv glad_glRasterPos2dv
+GLAD_API_CALL PFNGLRASTERPOS2FPROC glad_glRasterPos2f;
+#define glRasterPos2f glad_glRasterPos2f
+GLAD_API_CALL PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv;
+#define glRasterPos2fv glad_glRasterPos2fv
+GLAD_API_CALL PFNGLRASTERPOS2IPROC glad_glRasterPos2i;
+#define glRasterPos2i glad_glRasterPos2i
+GLAD_API_CALL PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv;
+#define glRasterPos2iv glad_glRasterPos2iv
+GLAD_API_CALL PFNGLRASTERPOS2SPROC glad_glRasterPos2s;
+#define glRasterPos2s glad_glRasterPos2s
+GLAD_API_CALL PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv;
+#define glRasterPos2sv glad_glRasterPos2sv
+GLAD_API_CALL PFNGLRASTERPOS3DPROC glad_glRasterPos3d;
+#define glRasterPos3d glad_glRasterPos3d
+GLAD_API_CALL PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv;
+#define glRasterPos3dv glad_glRasterPos3dv
+GLAD_API_CALL PFNGLRASTERPOS3FPROC glad_glRasterPos3f;
+#define glRasterPos3f glad_glRasterPos3f
+GLAD_API_CALL PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv;
+#define glRasterPos3fv glad_glRasterPos3fv
+GLAD_API_CALL PFNGLRASTERPOS3IPROC glad_glRasterPos3i;
+#define glRasterPos3i glad_glRasterPos3i
+GLAD_API_CALL PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv;
+#define glRasterPos3iv glad_glRasterPos3iv
+GLAD_API_CALL PFNGLRASTERPOS3SPROC glad_glRasterPos3s;
+#define glRasterPos3s glad_glRasterPos3s
+GLAD_API_CALL PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv;
+#define glRasterPos3sv glad_glRasterPos3sv
+GLAD_API_CALL PFNGLRASTERPOS4DPROC glad_glRasterPos4d;
+#define glRasterPos4d glad_glRasterPos4d
+GLAD_API_CALL PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv;
+#define glRasterPos4dv glad_glRasterPos4dv
+GLAD_API_CALL PFNGLRASTERPOS4FPROC glad_glRasterPos4f;
+#define glRasterPos4f glad_glRasterPos4f
+GLAD_API_CALL PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv;
+#define glRasterPos4fv glad_glRasterPos4fv
+GLAD_API_CALL PFNGLRASTERPOS4IPROC glad_glRasterPos4i;
+#define glRasterPos4i glad_glRasterPos4i
+GLAD_API_CALL PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv;
+#define glRasterPos4iv glad_glRasterPos4iv
+GLAD_API_CALL PFNGLRASTERPOS4SPROC glad_glRasterPos4s;
+#define glRasterPos4s glad_glRasterPos4s
+GLAD_API_CALL PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv;
+#define glRasterPos4sv glad_glRasterPos4sv
+GLAD_API_CALL PFNGLREADBUFFERPROC glad_glReadBuffer;
+#define glReadBuffer glad_glReadBuffer
+GLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels;
+#define glReadPixels glad_glReadPixels
+GLAD_API_CALL PFNGLRECTDPROC glad_glRectd;
+#define glRectd glad_glRectd
+GLAD_API_CALL PFNGLRECTDVPROC glad_glRectdv;
+#define glRectdv glad_glRectdv
+GLAD_API_CALL PFNGLRECTFPROC glad_glRectf;
+#define glRectf glad_glRectf
+GLAD_API_CALL PFNGLRECTFVPROC glad_glRectfv;
+#define glRectfv glad_glRectfv
+GLAD_API_CALL PFNGLRECTIPROC glad_glRecti;
+#define glRecti glad_glRecti
+GLAD_API_CALL PFNGLRECTIVPROC glad_glRectiv;
+#define glRectiv glad_glRectiv
+GLAD_API_CALL PFNGLRECTSPROC glad_glRects;
+#define glRects glad_glRects
+GLAD_API_CALL PFNGLRECTSVPROC glad_glRectsv;
+#define glRectsv glad_glRectsv
+GLAD_API_CALL PFNGLRENDERMODEPROC glad_glRenderMode;
+#define glRenderMode glad_glRenderMode
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage;
+#define glRenderbufferStorage glad_glRenderbufferStorage
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT;
+#define glRenderbufferStorageEXT glad_glRenderbufferStorageEXT
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample;
+#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glRenderbufferStorageMultisampleEXT;
+#define glRenderbufferStorageMultisampleEXT glad_glRenderbufferStorageMultisampleEXT
+GLAD_API_CALL PFNGLREQUESTRESIDENTPROGRAMSNVPROC glad_glRequestResidentProgramsNV;
+#define glRequestResidentProgramsNV glad_glRequestResidentProgramsNV
+GLAD_API_CALL PFNGLRESETHISTOGRAMPROC glad_glResetHistogram;
+#define glResetHistogram glad_glResetHistogram
+GLAD_API_CALL PFNGLRESETMINMAXPROC glad_glResetMinmax;
+#define glResetMinmax glad_glResetMinmax
+GLAD_API_CALL PFNGLROTATEDPROC glad_glRotated;
+#define glRotated glad_glRotated
+GLAD_API_CALL PFNGLROTATEFPROC glad_glRotatef;
+#define glRotatef glad_glRotatef
+GLAD_API_CALL PFNGLSCALEDPROC glad_glScaled;
+#define glScaled glad_glScaled
+GLAD_API_CALL PFNGLSCALEFPROC glad_glScalef;
+#define glScalef glad_glScalef
+GLAD_API_CALL PFNGLSCISSORPROC glad_glScissor;
+#define glScissor glad_glScissor
+GLAD_API_CALL PFNGLSELECTBUFFERPROC glad_glSelectBuffer;
+#define glSelectBuffer glad_glSelectBuffer
+GLAD_API_CALL PFNGLSEPARABLEFILTER2DPROC glad_glSeparableFilter2D;
+#define glSeparableFilter2D glad_glSeparableFilter2D
+GLAD_API_CALL PFNGLSHADEMODELPROC glad_glShadeModel;
+#define glShadeModel glad_glShadeModel
+GLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource;
+#define glShaderSource glad_glShaderSource
+GLAD_API_CALL PFNGLSHADERSOURCEARBPROC glad_glShaderSourceARB;
+#define glShaderSourceARB glad_glShaderSourceARB
+GLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc;
+#define glStencilFunc glad_glStencilFunc
+GLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask;
+#define glStencilMask glad_glStencilMask
+GLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp;
+#define glStencilOp glad_glStencilOp
+GLAD_API_CALL PFNGLTEXCOORD1DPROC glad_glTexCoord1d;
+#define glTexCoord1d glad_glTexCoord1d
+GLAD_API_CALL PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv;
+#define glTexCoord1dv glad_glTexCoord1dv
+GLAD_API_CALL PFNGLTEXCOORD1FPROC glad_glTexCoord1f;
+#define glTexCoord1f glad_glTexCoord1f
+GLAD_API_CALL PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv;
+#define glTexCoord1fv glad_glTexCoord1fv
+GLAD_API_CALL PFNGLTEXCOORD1IPROC glad_glTexCoord1i;
+#define glTexCoord1i glad_glTexCoord1i
+GLAD_API_CALL PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv;
+#define glTexCoord1iv glad_glTexCoord1iv
+GLAD_API_CALL PFNGLTEXCOORD1SPROC glad_glTexCoord1s;
+#define glTexCoord1s glad_glTexCoord1s
+GLAD_API_CALL PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv;
+#define glTexCoord1sv glad_glTexCoord1sv
+GLAD_API_CALL PFNGLTEXCOORD2DPROC glad_glTexCoord2d;
+#define glTexCoord2d glad_glTexCoord2d
+GLAD_API_CALL PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv;
+#define glTexCoord2dv glad_glTexCoord2dv
+GLAD_API_CALL PFNGLTEXCOORD2FPROC glad_glTexCoord2f;
+#define glTexCoord2f glad_glTexCoord2f
+GLAD_API_CALL PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv;
+#define glTexCoord2fv glad_glTexCoord2fv
+GLAD_API_CALL PFNGLTEXCOORD2IPROC glad_glTexCoord2i;
+#define glTexCoord2i glad_glTexCoord2i
+GLAD_API_CALL PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv;
+#define glTexCoord2iv glad_glTexCoord2iv
+GLAD_API_CALL PFNGLTEXCOORD2SPROC glad_glTexCoord2s;
+#define glTexCoord2s glad_glTexCoord2s
+GLAD_API_CALL PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv;
+#define glTexCoord2sv glad_glTexCoord2sv
+GLAD_API_CALL PFNGLTEXCOORD3DPROC glad_glTexCoord3d;
+#define glTexCoord3d glad_glTexCoord3d
+GLAD_API_CALL PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv;
+#define glTexCoord3dv glad_glTexCoord3dv
+GLAD_API_CALL PFNGLTEXCOORD3FPROC glad_glTexCoord3f;
+#define glTexCoord3f glad_glTexCoord3f
+GLAD_API_CALL PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv;
+#define glTexCoord3fv glad_glTexCoord3fv
+GLAD_API_CALL PFNGLTEXCOORD3IPROC glad_glTexCoord3i;
+#define glTexCoord3i glad_glTexCoord3i
+GLAD_API_CALL PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv;
+#define glTexCoord3iv glad_glTexCoord3iv
+GLAD_API_CALL PFNGLTEXCOORD3SPROC glad_glTexCoord3s;
+#define glTexCoord3s glad_glTexCoord3s
+GLAD_API_CALL PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv;
+#define glTexCoord3sv glad_glTexCoord3sv
+GLAD_API_CALL PFNGLTEXCOORD4DPROC glad_glTexCoord4d;
+#define glTexCoord4d glad_glTexCoord4d
+GLAD_API_CALL PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv;
+#define glTexCoord4dv glad_glTexCoord4dv
+GLAD_API_CALL PFNGLTEXCOORD4FPROC glad_glTexCoord4f;
+#define glTexCoord4f glad_glTexCoord4f
+GLAD_API_CALL PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv;
+#define glTexCoord4fv glad_glTexCoord4fv
+GLAD_API_CALL PFNGLTEXCOORD4IPROC glad_glTexCoord4i;
+#define glTexCoord4i glad_glTexCoord4i
+GLAD_API_CALL PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv;
+#define glTexCoord4iv glad_glTexCoord4iv
+GLAD_API_CALL PFNGLTEXCOORD4SPROC glad_glTexCoord4s;
+#define glTexCoord4s glad_glTexCoord4s
+GLAD_API_CALL PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv;
+#define glTexCoord4sv glad_glTexCoord4sv
+GLAD_API_CALL PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer;
+#define glTexCoordPointer glad_glTexCoordPointer
+GLAD_API_CALL PFNGLTEXCOORDPOINTEREXTPROC glad_glTexCoordPointerEXT;
+#define glTexCoordPointerEXT glad_glTexCoordPointerEXT
+GLAD_API_CALL PFNGLTEXENVFPROC glad_glTexEnvf;
+#define glTexEnvf glad_glTexEnvf
+GLAD_API_CALL PFNGLTEXENVFVPROC glad_glTexEnvfv;
+#define glTexEnvfv glad_glTexEnvfv
+GLAD_API_CALL PFNGLTEXENVIPROC glad_glTexEnvi;
+#define glTexEnvi glad_glTexEnvi
+GLAD_API_CALL PFNGLTEXENVIVPROC glad_glTexEnviv;
+#define glTexEnviv glad_glTexEnviv
+GLAD_API_CALL PFNGLTEXGENDPROC glad_glTexGend;
+#define glTexGend glad_glTexGend
+GLAD_API_CALL PFNGLTEXGENDVPROC glad_glTexGendv;
+#define glTexGendv glad_glTexGendv
+GLAD_API_CALL PFNGLTEXGENFPROC glad_glTexGenf;
+#define glTexGenf glad_glTexGenf
+GLAD_API_CALL PFNGLTEXGENFVPROC glad_glTexGenfv;
+#define glTexGenfv glad_glTexGenfv
+GLAD_API_CALL PFNGLTEXGENIPROC glad_glTexGeni;
+#define glTexGeni glad_glTexGeni
+GLAD_API_CALL PFNGLTEXGENIVPROC glad_glTexGeniv;
+#define glTexGeniv glad_glTexGeniv
+GLAD_API_CALL PFNGLTEXIMAGE1DPROC glad_glTexImage1D;
+#define glTexImage1D glad_glTexImage1D
+GLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D;
+#define glTexImage2D glad_glTexImage2D
+GLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf;
+#define glTexParameterf glad_glTexParameterf
+GLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv;
+#define glTexParameterfv glad_glTexParameterfv
+GLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri;
+#define glTexParameteri glad_glTexParameteri
+GLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv;
+#define glTexParameteriv glad_glTexParameteriv
+GLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D;
+#define glTexSubImage1D glad_glTexSubImage1D
+GLAD_API_CALL PFNGLTEXSUBIMAGE1DEXTPROC glad_glTexSubImage1DEXT;
+#define glTexSubImage1DEXT glad_glTexSubImage1DEXT
+GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D;
+#define glTexSubImage2D glad_glTexSubImage2D
+GLAD_API_CALL PFNGLTEXSUBIMAGE2DEXTPROC glad_glTexSubImage2DEXT;
+#define glTexSubImage2DEXT glad_glTexSubImage2DEXT
+GLAD_API_CALL PFNGLTRACKMATRIXNVPROC glad_glTrackMatrixNV;
+#define glTrackMatrixNV glad_glTrackMatrixNV
+GLAD_API_CALL PFNGLTRANSLATEDPROC glad_glTranslated;
+#define glTranslated glad_glTranslated
+GLAD_API_CALL PFNGLTRANSLATEFPROC glad_glTranslatef;
+#define glTranslatef glad_glTranslatef
+GLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f;
+#define glUniform1f glad_glUniform1f
+GLAD_API_CALL PFNGLUNIFORM1FARBPROC glad_glUniform1fARB;
+#define glUniform1fARB glad_glUniform1fARB
+GLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv;
+#define glUniform1fv glad_glUniform1fv
+GLAD_API_CALL PFNGLUNIFORM1FVARBPROC glad_glUniform1fvARB;
+#define glUniform1fvARB glad_glUniform1fvARB
+GLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i;
+#define glUniform1i glad_glUniform1i
+GLAD_API_CALL PFNGLUNIFORM1IARBPROC glad_glUniform1iARB;
+#define glUniform1iARB glad_glUniform1iARB
+GLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv;
+#define glUniform1iv glad_glUniform1iv
+GLAD_API_CALL PFNGLUNIFORM1IVARBPROC glad_glUniform1ivARB;
+#define glUniform1ivARB glad_glUniform1ivARB
+GLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f;
+#define glUniform2f glad_glUniform2f
+GLAD_API_CALL PFNGLUNIFORM2FARBPROC glad_glUniform2fARB;
+#define glUniform2fARB glad_glUniform2fARB
+GLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv;
+#define glUniform2fv glad_glUniform2fv
+GLAD_API_CALL PFNGLUNIFORM2FVARBPROC glad_glUniform2fvARB;
+#define glUniform2fvARB glad_glUniform2fvARB
+GLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i;
+#define glUniform2i glad_glUniform2i
+GLAD_API_CALL PFNGLUNIFORM2IARBPROC glad_glUniform2iARB;
+#define glUniform2iARB glad_glUniform2iARB
+GLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv;
+#define glUniform2iv glad_glUniform2iv
+GLAD_API_CALL PFNGLUNIFORM2IVARBPROC glad_glUniform2ivARB;
+#define glUniform2ivARB glad_glUniform2ivARB
+GLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f;
+#define glUniform3f glad_glUniform3f
+GLAD_API_CALL PFNGLUNIFORM3FARBPROC glad_glUniform3fARB;
+#define glUniform3fARB glad_glUniform3fARB
+GLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv;
+#define glUniform3fv glad_glUniform3fv
+GLAD_API_CALL PFNGLUNIFORM3FVARBPROC glad_glUniform3fvARB;
+#define glUniform3fvARB glad_glUniform3fvARB
+GLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i;
+#define glUniform3i glad_glUniform3i
+GLAD_API_CALL PFNGLUNIFORM3IARBPROC glad_glUniform3iARB;
+#define glUniform3iARB glad_glUniform3iARB
+GLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv;
+#define glUniform3iv glad_glUniform3iv
+GLAD_API_CALL PFNGLUNIFORM3IVARBPROC glad_glUniform3ivARB;
+#define glUniform3ivARB glad_glUniform3ivARB
+GLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f;
+#define glUniform4f glad_glUniform4f
+GLAD_API_CALL PFNGLUNIFORM4FARBPROC glad_glUniform4fARB;
+#define glUniform4fARB glad_glUniform4fARB
+GLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv;
+#define glUniform4fv glad_glUniform4fv
+GLAD_API_CALL PFNGLUNIFORM4FVARBPROC glad_glUniform4fvARB;
+#define glUniform4fvARB glad_glUniform4fvARB
+GLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i;
+#define glUniform4i glad_glUniform4i
+GLAD_API_CALL PFNGLUNIFORM4IARBPROC glad_glUniform4iARB;
+#define glUniform4iARB glad_glUniform4iARB
+GLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv;
+#define glUniform4iv glad_glUniform4iv
+GLAD_API_CALL PFNGLUNIFORM4IVARBPROC glad_glUniform4ivARB;
+#define glUniform4ivARB glad_glUniform4ivARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv;
+#define glUniformMatrix2fv glad_glUniformMatrix2fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX2FVARBPROC glad_glUniformMatrix2fvARB;
+#define glUniformMatrix2fvARB glad_glUniformMatrix2fvARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv;
+#define glUniformMatrix3fv glad_glUniformMatrix3fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX3FVARBPROC glad_glUniformMatrix3fvARB;
+#define glUniformMatrix3fvARB glad_glUniformMatrix3fvARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv;
+#define glUniformMatrix4fv glad_glUniformMatrix4fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX4FVARBPROC glad_glUniformMatrix4fvARB;
+#define glUniformMatrix4fvARB glad_glUniformMatrix4fvARB
+GLAD_API_CALL PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer;
+#define glUnmapBuffer glad_glUnmapBuffer
+GLAD_API_CALL PFNGLUNMAPBUFFERARBPROC glad_glUnmapBufferARB;
+#define glUnmapBufferARB glad_glUnmapBufferARB
+GLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram;
+#define glUseProgram glad_glUseProgram
+GLAD_API_CALL PFNGLUSEPROGRAMOBJECTARBPROC glad_glUseProgramObjectARB;
+#define glUseProgramObjectARB glad_glUseProgramObjectARB
+GLAD_API_CALL PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages;
+#define glUseProgramStages glad_glUseProgramStages
+GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram;
+#define glValidateProgram glad_glValidateProgram
+GLAD_API_CALL PFNGLVALIDATEPROGRAMARBPROC glad_glValidateProgramARB;
+#define glValidateProgramARB glad_glValidateProgramARB
+GLAD_API_CALL PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline;
+#define glValidateProgramPipeline glad_glValidateProgramPipeline
+GLAD_API_CALL PFNGLVERTEX2DPROC glad_glVertex2d;
+#define glVertex2d glad_glVertex2d
+GLAD_API_CALL PFNGLVERTEX2DVPROC glad_glVertex2dv;
+#define glVertex2dv glad_glVertex2dv
+GLAD_API_CALL PFNGLVERTEX2FPROC glad_glVertex2f;
+#define glVertex2f glad_glVertex2f
+GLAD_API_CALL PFNGLVERTEX2FVPROC glad_glVertex2fv;
+#define glVertex2fv glad_glVertex2fv
+GLAD_API_CALL PFNGLVERTEX2IPROC glad_glVertex2i;
+#define glVertex2i glad_glVertex2i
+GLAD_API_CALL PFNGLVERTEX2IVPROC glad_glVertex2iv;
+#define glVertex2iv glad_glVertex2iv
+GLAD_API_CALL PFNGLVERTEX2SPROC glad_glVertex2s;
+#define glVertex2s glad_glVertex2s
+GLAD_API_CALL PFNGLVERTEX2SVPROC glad_glVertex2sv;
+#define glVertex2sv glad_glVertex2sv
+GLAD_API_CALL PFNGLVERTEX3DPROC glad_glVertex3d;
+#define glVertex3d glad_glVertex3d
+GLAD_API_CALL PFNGLVERTEX3DVPROC glad_glVertex3dv;
+#define glVertex3dv glad_glVertex3dv
+GLAD_API_CALL PFNGLVERTEX3FPROC glad_glVertex3f;
+#define glVertex3f glad_glVertex3f
+GLAD_API_CALL PFNGLVERTEX3FVPROC glad_glVertex3fv;
+#define glVertex3fv glad_glVertex3fv
+GLAD_API_CALL PFNGLVERTEX3IPROC glad_glVertex3i;
+#define glVertex3i glad_glVertex3i
+GLAD_API_CALL PFNGLVERTEX3IVPROC glad_glVertex3iv;
+#define glVertex3iv glad_glVertex3iv
+GLAD_API_CALL PFNGLVERTEX3SPROC glad_glVertex3s;
+#define glVertex3s glad_glVertex3s
+GLAD_API_CALL PFNGLVERTEX3SVPROC glad_glVertex3sv;
+#define glVertex3sv glad_glVertex3sv
+GLAD_API_CALL PFNGLVERTEX4DPROC glad_glVertex4d;
+#define glVertex4d glad_glVertex4d
+GLAD_API_CALL PFNGLVERTEX4DVPROC glad_glVertex4dv;
+#define glVertex4dv glad_glVertex4dv
+GLAD_API_CALL PFNGLVERTEX4FPROC glad_glVertex4f;
+#define glVertex4f glad_glVertex4f
+GLAD_API_CALL PFNGLVERTEX4FVPROC glad_glVertex4fv;
+#define glVertex4fv glad_glVertex4fv
+GLAD_API_CALL PFNGLVERTEX4IPROC glad_glVertex4i;
+#define glVertex4i glad_glVertex4i
+GLAD_API_CALL PFNGLVERTEX4IVPROC glad_glVertex4iv;
+#define glVertex4iv glad_glVertex4iv
+GLAD_API_CALL PFNGLVERTEX4SPROC glad_glVertex4s;
+#define glVertex4s glad_glVertex4s
+GLAD_API_CALL PFNGLVERTEX4SVPROC glad_glVertex4sv;
+#define glVertex4sv glad_glVertex4sv
+GLAD_API_CALL PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d;
+#define glVertexAttrib1d glad_glVertexAttrib1d
+GLAD_API_CALL PFNGLVERTEXATTRIB1DARBPROC glad_glVertexAttrib1dARB;
+#define glVertexAttrib1dARB glad_glVertexAttrib1dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1DNVPROC glad_glVertexAttrib1dNV;
+#define glVertexAttrib1dNV glad_glVertexAttrib1dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv;
+#define glVertexAttrib1dv glad_glVertexAttrib1dv
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVARBPROC glad_glVertexAttrib1dvARB;
+#define glVertexAttrib1dvARB glad_glVertexAttrib1dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVNVPROC glad_glVertexAttrib1dvNV;
+#define glVertexAttrib1dvNV glad_glVertexAttrib1dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f;
+#define glVertexAttrib1f glad_glVertexAttrib1f
+GLAD_API_CALL PFNGLVERTEXATTRIB1FARBPROC glad_glVertexAttrib1fARB;
+#define glVertexAttrib1fARB glad_glVertexAttrib1fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1FNVPROC glad_glVertexAttrib1fNV;
+#define glVertexAttrib1fNV glad_glVertexAttrib1fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv;
+#define glVertexAttrib1fv glad_glVertexAttrib1fv
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVARBPROC glad_glVertexAttrib1fvARB;
+#define glVertexAttrib1fvARB glad_glVertexAttrib1fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVNVPROC glad_glVertexAttrib1fvNV;
+#define glVertexAttrib1fvNV glad_glVertexAttrib1fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s;
+#define glVertexAttrib1s glad_glVertexAttrib1s
+GLAD_API_CALL PFNGLVERTEXATTRIB1SARBPROC glad_glVertexAttrib1sARB;
+#define glVertexAttrib1sARB glad_glVertexAttrib1sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1SNVPROC glad_glVertexAttrib1sNV;
+#define glVertexAttrib1sNV glad_glVertexAttrib1sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv;
+#define glVertexAttrib1sv glad_glVertexAttrib1sv
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVARBPROC glad_glVertexAttrib1svARB;
+#define glVertexAttrib1svARB glad_glVertexAttrib1svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVNVPROC glad_glVertexAttrib1svNV;
+#define glVertexAttrib1svNV glad_glVertexAttrib1svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d;
+#define glVertexAttrib2d glad_glVertexAttrib2d
+GLAD_API_CALL PFNGLVERTEXATTRIB2DARBPROC glad_glVertexAttrib2dARB;
+#define glVertexAttrib2dARB glad_glVertexAttrib2dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2DNVPROC glad_glVertexAttrib2dNV;
+#define glVertexAttrib2dNV glad_glVertexAttrib2dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv;
+#define glVertexAttrib2dv glad_glVertexAttrib2dv
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVARBPROC glad_glVertexAttrib2dvARB;
+#define glVertexAttrib2dvARB glad_glVertexAttrib2dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVNVPROC glad_glVertexAttrib2dvNV;
+#define glVertexAttrib2dvNV glad_glVertexAttrib2dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f;
+#define glVertexAttrib2f glad_glVertexAttrib2f
+GLAD_API_CALL PFNGLVERTEXATTRIB2FARBPROC glad_glVertexAttrib2fARB;
+#define glVertexAttrib2fARB glad_glVertexAttrib2fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2FNVPROC glad_glVertexAttrib2fNV;
+#define glVertexAttrib2fNV glad_glVertexAttrib2fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv;
+#define glVertexAttrib2fv glad_glVertexAttrib2fv
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVARBPROC glad_glVertexAttrib2fvARB;
+#define glVertexAttrib2fvARB glad_glVertexAttrib2fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVNVPROC glad_glVertexAttrib2fvNV;
+#define glVertexAttrib2fvNV glad_glVertexAttrib2fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s;
+#define glVertexAttrib2s glad_glVertexAttrib2s
+GLAD_API_CALL PFNGLVERTEXATTRIB2SARBPROC glad_glVertexAttrib2sARB;
+#define glVertexAttrib2sARB glad_glVertexAttrib2sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2SNVPROC glad_glVertexAttrib2sNV;
+#define glVertexAttrib2sNV glad_glVertexAttrib2sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv;
+#define glVertexAttrib2sv glad_glVertexAttrib2sv
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVARBPROC glad_glVertexAttrib2svARB;
+#define glVertexAttrib2svARB glad_glVertexAttrib2svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVNVPROC glad_glVertexAttrib2svNV;
+#define glVertexAttrib2svNV glad_glVertexAttrib2svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d;
+#define glVertexAttrib3d glad_glVertexAttrib3d
+GLAD_API_CALL PFNGLVERTEXATTRIB3DARBPROC glad_glVertexAttrib3dARB;
+#define glVertexAttrib3dARB glad_glVertexAttrib3dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3DNVPROC glad_glVertexAttrib3dNV;
+#define glVertexAttrib3dNV glad_glVertexAttrib3dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv;
+#define glVertexAttrib3dv glad_glVertexAttrib3dv
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVARBPROC glad_glVertexAttrib3dvARB;
+#define glVertexAttrib3dvARB glad_glVertexAttrib3dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVNVPROC glad_glVertexAttrib3dvNV;
+#define glVertexAttrib3dvNV glad_glVertexAttrib3dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f;
+#define glVertexAttrib3f glad_glVertexAttrib3f
+GLAD_API_CALL PFNGLVERTEXATTRIB3FARBPROC glad_glVertexAttrib3fARB;
+#define glVertexAttrib3fARB glad_glVertexAttrib3fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3FNVPROC glad_glVertexAttrib3fNV;
+#define glVertexAttrib3fNV glad_glVertexAttrib3fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv;
+#define glVertexAttrib3fv glad_glVertexAttrib3fv
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVARBPROC glad_glVertexAttrib3fvARB;
+#define glVertexAttrib3fvARB glad_glVertexAttrib3fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVNVPROC glad_glVertexAttrib3fvNV;
+#define glVertexAttrib3fvNV glad_glVertexAttrib3fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s;
+#define glVertexAttrib3s glad_glVertexAttrib3s
+GLAD_API_CALL PFNGLVERTEXATTRIB3SARBPROC glad_glVertexAttrib3sARB;
+#define glVertexAttrib3sARB glad_glVertexAttrib3sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3SNVPROC glad_glVertexAttrib3sNV;
+#define glVertexAttrib3sNV glad_glVertexAttrib3sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv;
+#define glVertexAttrib3sv glad_glVertexAttrib3sv
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVARBPROC glad_glVertexAttrib3svARB;
+#define glVertexAttrib3svARB glad_glVertexAttrib3svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVNVPROC glad_glVertexAttrib3svNV;
+#define glVertexAttrib3svNV glad_glVertexAttrib3svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv;
+#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NBVARBPROC glad_glVertexAttrib4NbvARB;
+#define glVertexAttrib4NbvARB glad_glVertexAttrib4NbvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv;
+#define glVertexAttrib4Niv glad_glVertexAttrib4Niv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NIVARBPROC glad_glVertexAttrib4NivARB;
+#define glVertexAttrib4NivARB glad_glVertexAttrib4NivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv;
+#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NSVARBPROC glad_glVertexAttrib4NsvARB;
+#define glVertexAttrib4NsvARB glad_glVertexAttrib4NsvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub;
+#define glVertexAttrib4Nub glad_glVertexAttrib4Nub
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBARBPROC glad_glVertexAttrib4NubARB;
+#define glVertexAttrib4NubARB glad_glVertexAttrib4NubARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv;
+#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVARBPROC glad_glVertexAttrib4NubvARB;
+#define glVertexAttrib4NubvARB glad_glVertexAttrib4NubvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv;
+#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVARBPROC glad_glVertexAttrib4NuivARB;
+#define glVertexAttrib4NuivARB glad_glVertexAttrib4NuivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv;
+#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVARBPROC glad_glVertexAttrib4NusvARB;
+#define glVertexAttrib4NusvARB glad_glVertexAttrib4NusvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv;
+#define glVertexAttrib4bv glad_glVertexAttrib4bv
+GLAD_API_CALL PFNGLVERTEXATTRIB4BVARBPROC glad_glVertexAttrib4bvARB;
+#define glVertexAttrib4bvARB glad_glVertexAttrib4bvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d;
+#define glVertexAttrib4d glad_glVertexAttrib4d
+GLAD_API_CALL PFNGLVERTEXATTRIB4DARBPROC glad_glVertexAttrib4dARB;
+#define glVertexAttrib4dARB glad_glVertexAttrib4dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DNVPROC glad_glVertexAttrib4dNV;
+#define glVertexAttrib4dNV glad_glVertexAttrib4dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv;
+#define glVertexAttrib4dv glad_glVertexAttrib4dv
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVARBPROC glad_glVertexAttrib4dvARB;
+#define glVertexAttrib4dvARB glad_glVertexAttrib4dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVNVPROC glad_glVertexAttrib4dvNV;
+#define glVertexAttrib4dvNV glad_glVertexAttrib4dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f;
+#define glVertexAttrib4f glad_glVertexAttrib4f
+GLAD_API_CALL PFNGLVERTEXATTRIB4FARBPROC glad_glVertexAttrib4fARB;
+#define glVertexAttrib4fARB glad_glVertexAttrib4fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4FNVPROC glad_glVertexAttrib4fNV;
+#define glVertexAttrib4fNV glad_glVertexAttrib4fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv;
+#define glVertexAttrib4fv glad_glVertexAttrib4fv
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVARBPROC glad_glVertexAttrib4fvARB;
+#define glVertexAttrib4fvARB glad_glVertexAttrib4fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVNVPROC glad_glVertexAttrib4fvNV;
+#define glVertexAttrib4fvNV glad_glVertexAttrib4fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv;
+#define glVertexAttrib4iv glad_glVertexAttrib4iv
+GLAD_API_CALL PFNGLVERTEXATTRIB4IVARBPROC glad_glVertexAttrib4ivARB;
+#define glVertexAttrib4ivARB glad_glVertexAttrib4ivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s;
+#define glVertexAttrib4s glad_glVertexAttrib4s
+GLAD_API_CALL PFNGLVERTEXATTRIB4SARBPROC glad_glVertexAttrib4sARB;
+#define glVertexAttrib4sARB glad_glVertexAttrib4sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SNVPROC glad_glVertexAttrib4sNV;
+#define glVertexAttrib4sNV glad_glVertexAttrib4sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv;
+#define glVertexAttrib4sv glad_glVertexAttrib4sv
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVARBPROC glad_glVertexAttrib4svARB;
+#define glVertexAttrib4svARB glad_glVertexAttrib4svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVNVPROC glad_glVertexAttrib4svNV;
+#define glVertexAttrib4svNV glad_glVertexAttrib4svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBNVPROC glad_glVertexAttrib4ubNV;
+#define glVertexAttrib4ubNV glad_glVertexAttrib4ubNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv;
+#define glVertexAttrib4ubv glad_glVertexAttrib4ubv
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVARBPROC glad_glVertexAttrib4ubvARB;
+#define glVertexAttrib4ubvARB glad_glVertexAttrib4ubvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVNVPROC glad_glVertexAttrib4ubvNV;
+#define glVertexAttrib4ubvNV glad_glVertexAttrib4ubvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv;
+#define glVertexAttrib4uiv glad_glVertexAttrib4uiv
+GLAD_API_CALL PFNGLVERTEXATTRIB4UIVARBPROC glad_glVertexAttrib4uivARB;
+#define glVertexAttrib4uivARB glad_glVertexAttrib4uivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv;
+#define glVertexAttrib4usv glad_glVertexAttrib4usv
+GLAD_API_CALL PFNGLVERTEXATTRIB4USVARBPROC glad_glVertexAttrib4usvARB;
+#define glVertexAttrib4usvARB glad_glVertexAttrib4usvARB
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer;
+#define glVertexAttribPointer glad_glVertexAttribPointer
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERARBPROC glad_glVertexAttribPointerARB;
+#define glVertexAttribPointerARB glad_glVertexAttribPointerARB
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERNVPROC glad_glVertexAttribPointerNV;
+#define glVertexAttribPointerNV glad_glVertexAttribPointerNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1DVNVPROC glad_glVertexAttribs1dvNV;
+#define glVertexAttribs1dvNV glad_glVertexAttribs1dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1FVNVPROC glad_glVertexAttribs1fvNV;
+#define glVertexAttribs1fvNV glad_glVertexAttribs1fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1SVNVPROC glad_glVertexAttribs1svNV;
+#define glVertexAttribs1svNV glad_glVertexAttribs1svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2DVNVPROC glad_glVertexAttribs2dvNV;
+#define glVertexAttribs2dvNV glad_glVertexAttribs2dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2FVNVPROC glad_glVertexAttribs2fvNV;
+#define glVertexAttribs2fvNV glad_glVertexAttribs2fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2SVNVPROC glad_glVertexAttribs2svNV;
+#define glVertexAttribs2svNV glad_glVertexAttribs2svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3DVNVPROC glad_glVertexAttribs3dvNV;
+#define glVertexAttribs3dvNV glad_glVertexAttribs3dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3FVNVPROC glad_glVertexAttribs3fvNV;
+#define glVertexAttribs3fvNV glad_glVertexAttribs3fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3SVNVPROC glad_glVertexAttribs3svNV;
+#define glVertexAttribs3svNV glad_glVertexAttribs3svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4DVNVPROC glad_glVertexAttribs4dvNV;
+#define glVertexAttribs4dvNV glad_glVertexAttribs4dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4FVNVPROC glad_glVertexAttribs4fvNV;
+#define glVertexAttribs4fvNV glad_glVertexAttribs4fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4SVNVPROC glad_glVertexAttribs4svNV;
+#define glVertexAttribs4svNV glad_glVertexAttribs4svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4UBVNVPROC glad_glVertexAttribs4ubvNV;
+#define glVertexAttribs4ubvNV glad_glVertexAttribs4ubvNV
+GLAD_API_CALL PFNGLVERTEXPOINTERPROC glad_glVertexPointer;
+#define glVertexPointer glad_glVertexPointer
+GLAD_API_CALL PFNGLVERTEXPOINTEREXTPROC glad_glVertexPointerEXT;
+#define glVertexPointerEXT glad_glVertexPointerEXT
+GLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport;
+#define glViewport glad_glViewport
+GLAD_API_CALL PFNGLALPHAFUNCXPROC glad_glAlphaFuncx;
+#define glAlphaFuncx glad_glAlphaFuncx
+GLAD_API_CALL PFNGLBINDFRAMEBUFFEROESPROC glad_glBindFramebufferOES;
+#define glBindFramebufferOES glad_glBindFramebufferOES
+GLAD_API_CALL PFNGLBINDRENDERBUFFEROESPROC glad_glBindRenderbufferOES;
+#define glBindRenderbufferOES glad_glBindRenderbufferOES
+GLAD_API_CALL PFNGLBLENDEQUATIONOESPROC glad_glBlendEquationOES;
+#define glBlendEquationOES glad_glBlendEquationOES
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEOESPROC glad_glBlendEquationSeparateOES;
+#define glBlendEquationSeparateOES glad_glBlendEquationSeparateOES
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEOESPROC glad_glBlendFuncSeparateOES;
+#define glBlendFuncSeparateOES glad_glBlendFuncSeparateOES
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSOESPROC glad_glCheckFramebufferStatusOES;
+#define glCheckFramebufferStatusOES glad_glCheckFramebufferStatusOES
+GLAD_API_CALL PFNGLCLEARCOLORXPROC glad_glClearColorx;
+#define glClearColorx glad_glClearColorx
+GLAD_API_CALL PFNGLCLEARDEPTHFPROC glad_glClearDepthf;
+#define glClearDepthf glad_glClearDepthf
+GLAD_API_CALL PFNGLCLEARDEPTHFOESPROC glad_glClearDepthfOES;
+#define glClearDepthfOES glad_glClearDepthfOES
+GLAD_API_CALL PFNGLCLEARDEPTHXPROC glad_glClearDepthx;
+#define glClearDepthx glad_glClearDepthx
+GLAD_API_CALL PFNGLCLIPPLANEFPROC glad_glClipPlanef;
+#define glClipPlanef glad_glClipPlanef
+GLAD_API_CALL PFNGLCLIPPLANEFOESPROC glad_glClipPlanefOES;
+#define glClipPlanefOES glad_glClipPlanefOES
+GLAD_API_CALL PFNGLCLIPPLANEXPROC glad_glClipPlanex;
+#define glClipPlanex glad_glClipPlanex
+GLAD_API_CALL PFNGLCOLOR4XPROC glad_glColor4x;
+#define glColor4x glad_glColor4x
+GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D;
+#define glCompressedTexImage2D glad_glCompressedTexImage2D
+GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D;
+#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSOESPROC glad_glDeleteFramebuffersOES;
+#define glDeleteFramebuffersOES glad_glDeleteFramebuffersOES
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSOESPROC glad_glDeleteRenderbuffersOES;
+#define glDeleteRenderbuffersOES glad_glDeleteRenderbuffersOES
+GLAD_API_CALL PFNGLDEPTHRANGEFPROC glad_glDepthRangef;
+#define glDepthRangef glad_glDepthRangef
+GLAD_API_CALL PFNGLDEPTHRANGEFOESPROC glad_glDepthRangefOES;
+#define glDepthRangefOES glad_glDepthRangefOES
+GLAD_API_CALL PFNGLDEPTHRANGEXPROC glad_glDepthRangex;
+#define glDepthRangex glad_glDepthRangex
+GLAD_API_CALL PFNGLFOGXPROC glad_glFogx;
+#define glFogx glad_glFogx
+GLAD_API_CALL PFNGLFOGXVPROC glad_glFogxv;
+#define glFogxv glad_glFogxv
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFEROESPROC glad_glFramebufferRenderbufferOES;
+#define glFramebufferRenderbufferOES glad_glFramebufferRenderbufferOES
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DOESPROC glad_glFramebufferTexture2DOES;
+#define glFramebufferTexture2DOES glad_glFramebufferTexture2DOES
+GLAD_API_CALL PFNGLFRUSTUMFPROC glad_glFrustumf;
+#define glFrustumf glad_glFrustumf
+GLAD_API_CALL PFNGLFRUSTUMFOESPROC glad_glFrustumfOES;
+#define glFrustumfOES glad_glFrustumfOES
+GLAD_API_CALL PFNGLFRUSTUMXPROC glad_glFrustumx;
+#define glFrustumx glad_glFrustumx
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSOESPROC glad_glGenFramebuffersOES;
+#define glGenFramebuffersOES glad_glGenFramebuffersOES
+GLAD_API_CALL PFNGLGENRENDERBUFFERSOESPROC glad_glGenRenderbuffersOES;
+#define glGenRenderbuffersOES glad_glGenRenderbuffersOES
+GLAD_API_CALL PFNGLGENERATEMIPMAPOESPROC glad_glGenerateMipmapOES;
+#define glGenerateMipmapOES glad_glGenerateMipmapOES
+GLAD_API_CALL PFNGLGETCLIPPLANEFPROC glad_glGetClipPlanef;
+#define glGetClipPlanef glad_glGetClipPlanef
+GLAD_API_CALL PFNGLGETCLIPPLANEFOESPROC glad_glGetClipPlanefOES;
+#define glGetClipPlanefOES glad_glGetClipPlanefOES
+GLAD_API_CALL PFNGLGETCLIPPLANEXPROC glad_glGetClipPlanex;
+#define glGetClipPlanex glad_glGetClipPlanex
+GLAD_API_CALL PFNGLGETFIXEDVPROC glad_glGetFixedv;
+#define glGetFixedv glad_glGetFixedv
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC glad_glGetFramebufferAttachmentParameterivOES;
+#define glGetFramebufferAttachmentParameterivOES glad_glGetFramebufferAttachmentParameterivOES
+GLAD_API_CALL PFNGLGETLIGHTXVPROC glad_glGetLightxv;
+#define glGetLightxv glad_glGetLightxv
+GLAD_API_CALL PFNGLGETMATERIALXVPROC glad_glGetMaterialxv;
+#define glGetMaterialxv glad_glGetMaterialxv
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVOESPROC glad_glGetRenderbufferParameterivOES;
+#define glGetRenderbufferParameterivOES glad_glGetRenderbufferParameterivOES
+GLAD_API_CALL PFNGLGETTEXENVXVPROC glad_glGetTexEnvxv;
+#define glGetTexEnvxv glad_glGetTexEnvxv
+GLAD_API_CALL PFNGLGETTEXPARAMETERXVPROC glad_glGetTexParameterxv;
+#define glGetTexParameterxv glad_glGetTexParameterxv
+GLAD_API_CALL PFNGLISFRAMEBUFFEROESPROC glad_glIsFramebufferOES;
+#define glIsFramebufferOES glad_glIsFramebufferOES
+GLAD_API_CALL PFNGLISRENDERBUFFEROESPROC glad_glIsRenderbufferOES;
+#define glIsRenderbufferOES glad_glIsRenderbufferOES
+GLAD_API_CALL PFNGLLIGHTMODELXPROC glad_glLightModelx;
+#define glLightModelx glad_glLightModelx
+GLAD_API_CALL PFNGLLIGHTMODELXVPROC glad_glLightModelxv;
+#define glLightModelxv glad_glLightModelxv
+GLAD_API_CALL PFNGLLIGHTXPROC glad_glLightx;
+#define glLightx glad_glLightx
+GLAD_API_CALL PFNGLLIGHTXVPROC glad_glLightxv;
+#define glLightxv glad_glLightxv
+GLAD_API_CALL PFNGLLINEWIDTHXPROC glad_glLineWidthx;
+#define glLineWidthx glad_glLineWidthx
+GLAD_API_CALL PFNGLLOADMATRIXXPROC glad_glLoadMatrixx;
+#define glLoadMatrixx glad_glLoadMatrixx
+GLAD_API_CALL PFNGLMATERIALXPROC glad_glMaterialx;
+#define glMaterialx glad_glMaterialx
+GLAD_API_CALL PFNGLMATERIALXVPROC glad_glMaterialxv;
+#define glMaterialxv glad_glMaterialxv
+GLAD_API_CALL PFNGLMULTMATRIXXPROC glad_glMultMatrixx;
+#define glMultMatrixx glad_glMultMatrixx
+GLAD_API_CALL PFNGLMULTITEXCOORD4XPROC glad_glMultiTexCoord4x;
+#define glMultiTexCoord4x glad_glMultiTexCoord4x
+GLAD_API_CALL PFNGLNORMAL3XPROC glad_glNormal3x;
+#define glNormal3x glad_glNormal3x
+GLAD_API_CALL PFNGLORTHOFPROC glad_glOrthof;
+#define glOrthof glad_glOrthof
+GLAD_API_CALL PFNGLORTHOFOESPROC glad_glOrthofOES;
+#define glOrthofOES glad_glOrthofOES
+GLAD_API_CALL PFNGLORTHOXPROC glad_glOrthox;
+#define glOrthox glad_glOrthox
+GLAD_API_CALL PFNGLPOINTPARAMETERFPROC glad_glPointParameterf;
+#define glPointParameterf glad_glPointParameterf
+GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv;
+#define glPointParameterfv glad_glPointParameterfv
+GLAD_API_CALL PFNGLPOINTPARAMETERXPROC glad_glPointParameterx;
+#define glPointParameterx glad_glPointParameterx
+GLAD_API_CALL PFNGLPOINTPARAMETERXVPROC glad_glPointParameterxv;
+#define glPointParameterxv glad_glPointParameterxv
+GLAD_API_CALL PFNGLPOINTSIZEXPROC glad_glPointSizex;
+#define glPointSizex glad_glPointSizex
+GLAD_API_CALL PFNGLPOLYGONOFFSETXPROC glad_glPolygonOffsetx;
+#define glPolygonOffsetx glad_glPolygonOffsetx
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEOESPROC glad_glRenderbufferStorageOES;
+#define glRenderbufferStorageOES glad_glRenderbufferStorageOES
+GLAD_API_CALL PFNGLROTATEXPROC glad_glRotatex;
+#define glRotatex glad_glRotatex
+GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage;
+#define glSampleCoverage glad_glSampleCoverage
+GLAD_API_CALL PFNGLSAMPLECOVERAGEXPROC glad_glSampleCoveragex;
+#define glSampleCoveragex glad_glSampleCoveragex
+GLAD_API_CALL PFNGLSCALEXPROC glad_glScalex;
+#define glScalex glad_glScalex
+GLAD_API_CALL PFNGLTEXENVXPROC glad_glTexEnvx;
+#define glTexEnvx glad_glTexEnvx
+GLAD_API_CALL PFNGLTEXENVXVPROC glad_glTexEnvxv;
+#define glTexEnvxv glad_glTexEnvxv
+GLAD_API_CALL PFNGLTEXPARAMETERXPROC glad_glTexParameterx;
+#define glTexParameterx glad_glTexParameterx
+GLAD_API_CALL PFNGLTEXPARAMETERXVPROC glad_glTexParameterxv;
+#define glTexParameterxv glad_glTexParameterxv
+GLAD_API_CALL PFNGLTRANSLATEXPROC glad_glTranslatex;
+#define glTranslatex glad_glTranslatex
+
+
+
+
+
+GLAD_API_CALL int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr);
+GLAD_API_CALL int gladLoadGL( GLADloadfunc load);
+
+GLAD_API_CALL int gladLoadGLES1UserPtr( GLADuserptrloadfunc load, void *userptr);
+GLAD_API_CALL int gladLoadGLES1( GLADloadfunc load);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Source */
+#ifdef GLAD_GL_IMPLEMENTATION
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef GLAD_IMPL_UTIL_C_
+#define GLAD_IMPL_UTIL_C_
+
+#ifdef _MSC_VER
+#define GLAD_IMPL_UTIL_SSCANF sscanf_s
+#else
+#define GLAD_IMPL_UTIL_SSCANF sscanf
+#endif
+
+#endif /* GLAD_IMPL_UTIL_C_ */
+
+
+int GLAD_GL_VERSION_1_0 = 0;
+int GLAD_GL_VERSION_1_1 = 0;
+int GLAD_GL_VERSION_ES_CM_1_0 = 0;
+int GLAD_GL_ARB_copy_buffer = 0;
+int GLAD_GL_ARB_fragment_shader = 0;
+int GLAD_GL_ARB_framebuffer_object = 0;
+int GLAD_GL_ARB_geometry_shader4 = 0;
+int GLAD_GL_ARB_get_program_binary = 0;
+int GLAD_GL_ARB_imaging = 0;
+int GLAD_GL_ARB_multitexture = 0;
+int GLAD_GL_ARB_separate_shader_objects = 0;
+int GLAD_GL_ARB_shader_objects = 0;
+int GLAD_GL_ARB_shading_language_100 = 0;
+int GLAD_GL_ARB_texture_non_power_of_two = 0;
+int GLAD_GL_ARB_vertex_buffer_object = 0;
+int GLAD_GL_ARB_vertex_program = 0;
+int GLAD_GL_ARB_vertex_shader = 0;
+int GLAD_GL_EXT_blend_equation_separate = 0;
+int GLAD_GL_EXT_blend_func_separate = 0;
+int GLAD_GL_EXT_blend_minmax = 0;
+int GLAD_GL_EXT_blend_subtract = 0;
+int GLAD_GL_EXT_copy_texture = 0;
+int GLAD_GL_EXT_framebuffer_blit = 0;
+int GLAD_GL_EXT_framebuffer_multisample = 0;
+int GLAD_GL_EXT_framebuffer_object = 0;
+int GLAD_GL_EXT_geometry_shader4 = 0;
+int GLAD_GL_EXT_packed_depth_stencil = 0;
+int GLAD_GL_EXT_subtexture = 0;
+int GLAD_GL_EXT_texture_array = 0;
+int GLAD_GL_EXT_texture_object = 0;
+int GLAD_GL_EXT_texture_sRGB = 0;
+int GLAD_GL_EXT_vertex_array = 0;
+int GLAD_GL_INGR_blend_func_separate = 0;
+int GLAD_GL_KHR_debug = 0;
+int GLAD_GL_NV_geometry_program4 = 0;
+int GLAD_GL_NV_vertex_program = 0;
+int GLAD_GL_SGIS_texture_edge_clamp = 0;
+int GLAD_GL_EXT_sRGB = 0;
+int GLAD_GL_OES_blend_equation_separate = 0;
+int GLAD_GL_OES_blend_func_separate = 0;
+int GLAD_GL_OES_blend_subtract = 0;
+int GLAD_GL_OES_framebuffer_object = 0;
+int GLAD_GL_OES_packed_depth_stencil = 0;
+int GLAD_GL_OES_single_precision = 0;
+int GLAD_GL_OES_texture_npot = 0;
+
+
+
+PFNGLACCUMPROC glad_glAccum = NULL;
+PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram = NULL;
+PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL;
+PFNGLACTIVETEXTUREARBPROC glad_glActiveTextureARB = NULL;
+PFNGLALPHAFUNCPROC glad_glAlphaFunc = NULL;
+PFNGLAREPROGRAMSRESIDENTNVPROC glad_glAreProgramsResidentNV = NULL;
+PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident = NULL;
+PFNGLARETEXTURESRESIDENTEXTPROC glad_glAreTexturesResidentEXT = NULL;
+PFNGLARRAYELEMENTPROC glad_glArrayElement = NULL;
+PFNGLARRAYELEMENTEXTPROC glad_glArrayElementEXT = NULL;
+PFNGLATTACHOBJECTARBPROC glad_glAttachObjectARB = NULL;
+PFNGLATTACHSHADERPROC glad_glAttachShader = NULL;
+PFNGLBEGINPROC glad_glBegin = NULL;
+PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL;
+PFNGLBINDATTRIBLOCATIONARBPROC glad_glBindAttribLocationARB = NULL;
+PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL;
+PFNGLBINDBUFFERARBPROC glad_glBindBufferARB = NULL;
+PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL;
+PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT = NULL;
+PFNGLBINDPROGRAMARBPROC glad_glBindProgramARB = NULL;
+PFNGLBINDPROGRAMNVPROC glad_glBindProgramNV = NULL;
+PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline = NULL;
+PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL;
+PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT = NULL;
+PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL;
+PFNGLBINDTEXTUREEXTPROC glad_glBindTextureEXT = NULL;
+PFNGLBITMAPPROC glad_glBitmap = NULL;
+PFNGLBLENDCOLORPROC glad_glBlendColor = NULL;
+PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL;
+PFNGLBLENDEQUATIONEXTPROC glad_glBlendEquationEXT = NULL;
+PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL;
+PFNGLBLENDEQUATIONSEPARATEEXTPROC glad_glBlendEquationSeparateEXT = NULL;
+PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL;
+PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL;
+PFNGLBLENDFUNCSEPARATEEXTPROC glad_glBlendFuncSeparateEXT = NULL;
+PFNGLBLENDFUNCSEPARATEINGRPROC glad_glBlendFuncSeparateINGR = NULL;
+PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL;
+PFNGLBLITFRAMEBUFFEREXTPROC glad_glBlitFramebufferEXT = NULL;
+PFNGLBUFFERDATAPROC glad_glBufferData = NULL;
+PFNGLBUFFERDATAARBPROC glad_glBufferDataARB = NULL;
+PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL;
+PFNGLBUFFERSUBDATAARBPROC glad_glBufferSubDataARB = NULL;
+PFNGLCALLLISTPROC glad_glCallList = NULL;
+PFNGLCALLLISTSPROC glad_glCallLists = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT = NULL;
+PFNGLCLEARPROC glad_glClear = NULL;
+PFNGLCLEARACCUMPROC glad_glClearAccum = NULL;
+PFNGLCLEARCOLORPROC glad_glClearColor = NULL;
+PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL;
+PFNGLCLEARINDEXPROC glad_glClearIndex = NULL;
+PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL;
+PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture = NULL;
+PFNGLCLIENTACTIVETEXTUREARBPROC glad_glClientActiveTextureARB = NULL;
+PFNGLCLIPPLANEPROC glad_glClipPlane = NULL;
+PFNGLCOLOR3BPROC glad_glColor3b = NULL;
+PFNGLCOLOR3BVPROC glad_glColor3bv = NULL;
+PFNGLCOLOR3DPROC glad_glColor3d = NULL;
+PFNGLCOLOR3DVPROC glad_glColor3dv = NULL;
+PFNGLCOLOR3FPROC glad_glColor3f = NULL;
+PFNGLCOLOR3FVPROC glad_glColor3fv = NULL;
+PFNGLCOLOR3IPROC glad_glColor3i = NULL;
+PFNGLCOLOR3IVPROC glad_glColor3iv = NULL;
+PFNGLCOLOR3SPROC glad_glColor3s = NULL;
+PFNGLCOLOR3SVPROC glad_glColor3sv = NULL;
+PFNGLCOLOR3UBPROC glad_glColor3ub = NULL;
+PFNGLCOLOR3UBVPROC glad_glColor3ubv = NULL;
+PFNGLCOLOR3UIPROC glad_glColor3ui = NULL;
+PFNGLCOLOR3UIVPROC glad_glColor3uiv = NULL;
+PFNGLCOLOR3USPROC glad_glColor3us = NULL;
+PFNGLCOLOR3USVPROC glad_glColor3usv = NULL;
+PFNGLCOLOR4BPROC glad_glColor4b = NULL;
+PFNGLCOLOR4BVPROC glad_glColor4bv = NULL;
+PFNGLCOLOR4DPROC glad_glColor4d = NULL;
+PFNGLCOLOR4DVPROC glad_glColor4dv = NULL;
+PFNGLCOLOR4FPROC glad_glColor4f = NULL;
+PFNGLCOLOR4FVPROC glad_glColor4fv = NULL;
+PFNGLCOLOR4IPROC glad_glColor4i = NULL;
+PFNGLCOLOR4IVPROC glad_glColor4iv = NULL;
+PFNGLCOLOR4SPROC glad_glColor4s = NULL;
+PFNGLCOLOR4SVPROC glad_glColor4sv = NULL;
+PFNGLCOLOR4UBPROC glad_glColor4ub = NULL;
+PFNGLCOLOR4UBVPROC glad_glColor4ubv = NULL;
+PFNGLCOLOR4UIPROC glad_glColor4ui = NULL;
+PFNGLCOLOR4UIVPROC glad_glColor4uiv = NULL;
+PFNGLCOLOR4USPROC glad_glColor4us = NULL;
+PFNGLCOLOR4USVPROC glad_glColor4usv = NULL;
+PFNGLCOLORMASKPROC glad_glColorMask = NULL;
+PFNGLCOLORMATERIALPROC glad_glColorMaterial = NULL;
+PFNGLCOLORPOINTERPROC glad_glColorPointer = NULL;
+PFNGLCOLORPOINTEREXTPROC glad_glColorPointerEXT = NULL;
+PFNGLCOLORSUBTABLEPROC glad_glColorSubTable = NULL;
+PFNGLCOLORTABLEPROC glad_glColorTable = NULL;
+PFNGLCOLORTABLEPARAMETERFVPROC glad_glColorTableParameterfv = NULL;
+PFNGLCOLORTABLEPARAMETERIVPROC glad_glColorTableParameteriv = NULL;
+PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL;
+PFNGLCOMPILESHADERARBPROC glad_glCompileShaderARB = NULL;
+PFNGLCONVOLUTIONFILTER1DPROC glad_glConvolutionFilter1D = NULL;
+PFNGLCONVOLUTIONFILTER2DPROC glad_glConvolutionFilter2D = NULL;
+PFNGLCONVOLUTIONPARAMETERFPROC glad_glConvolutionParameterf = NULL;
+PFNGLCONVOLUTIONPARAMETERFVPROC glad_glConvolutionParameterfv = NULL;
+PFNGLCONVOLUTIONPARAMETERIPROC glad_glConvolutionParameteri = NULL;
+PFNGLCONVOLUTIONPARAMETERIVPROC glad_glConvolutionParameteriv = NULL;
+PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL;
+PFNGLCOPYCOLORSUBTABLEPROC glad_glCopyColorSubTable = NULL;
+PFNGLCOPYCOLORTABLEPROC glad_glCopyColorTable = NULL;
+PFNGLCOPYCONVOLUTIONFILTER1DPROC glad_glCopyConvolutionFilter1D = NULL;
+PFNGLCOPYCONVOLUTIONFILTER2DPROC glad_glCopyConvolutionFilter2D = NULL;
+PFNGLCOPYPIXELSPROC glad_glCopyPixels = NULL;
+PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL;
+PFNGLCOPYTEXIMAGE1DEXTPROC glad_glCopyTexImage1DEXT = NULL;
+PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL;
+PFNGLCOPYTEXIMAGE2DEXTPROC glad_glCopyTexImage2DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL;
+PFNGLCOPYTEXSUBIMAGE1DEXTPROC glad_glCopyTexSubImage1DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL;
+PFNGLCOPYTEXSUBIMAGE2DEXTPROC glad_glCopyTexSubImage2DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL;
+PFNGLCOPYTEXSUBIMAGE3DEXTPROC glad_glCopyTexSubImage3DEXT = NULL;
+PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL;
+PFNGLCREATEPROGRAMOBJECTARBPROC glad_glCreateProgramObjectARB = NULL;
+PFNGLCREATESHADERPROC glad_glCreateShader = NULL;
+PFNGLCREATESHADEROBJECTARBPROC glad_glCreateShaderObjectARB = NULL;
+PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv = NULL;
+PFNGLCULLFACEPROC glad_glCullFace = NULL;
+PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback = NULL;
+PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl = NULL;
+PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert = NULL;
+PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL;
+PFNGLDELETEBUFFERSARBPROC glad_glDeleteBuffersARB = NULL;
+PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL;
+PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT = NULL;
+PFNGLDELETELISTSPROC glad_glDeleteLists = NULL;
+PFNGLDELETEOBJECTARBPROC glad_glDeleteObjectARB = NULL;
+PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines = NULL;
+PFNGLDELETEPROGRAMSARBPROC glad_glDeleteProgramsARB = NULL;
+PFNGLDELETEPROGRAMSNVPROC glad_glDeleteProgramsNV = NULL;
+PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL;
+PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT = NULL;
+PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL;
+PFNGLDELETETEXTURESEXTPROC glad_glDeleteTexturesEXT = NULL;
+PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL;
+PFNGLDEPTHMASKPROC glad_glDepthMask = NULL;
+PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL;
+PFNGLDETACHOBJECTARBPROC glad_glDetachObjectARB = NULL;
+PFNGLDETACHSHADERPROC glad_glDetachShader = NULL;
+PFNGLDISABLEPROC glad_glDisable = NULL;
+PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState = NULL;
+PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL;
+PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glad_glDisableVertexAttribArrayARB = NULL;
+PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL;
+PFNGLDRAWARRAYSEXTPROC glad_glDrawArraysEXT = NULL;
+PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL;
+PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL;
+PFNGLDRAWPIXELSPROC glad_glDrawPixels = NULL;
+PFNGLEDGEFLAGPROC glad_glEdgeFlag = NULL;
+PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer = NULL;
+PFNGLEDGEFLAGPOINTEREXTPROC glad_glEdgeFlagPointerEXT = NULL;
+PFNGLEDGEFLAGVPROC glad_glEdgeFlagv = NULL;
+PFNGLENABLEPROC glad_glEnable = NULL;
+PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState = NULL;
+PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL;
+PFNGLENABLEVERTEXATTRIBARRAYARBPROC glad_glEnableVertexAttribArrayARB = NULL;
+PFNGLENDPROC glad_glEnd = NULL;
+PFNGLENDLISTPROC glad_glEndList = NULL;
+PFNGLEVALCOORD1DPROC glad_glEvalCoord1d = NULL;
+PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv = NULL;
+PFNGLEVALCOORD1FPROC glad_glEvalCoord1f = NULL;
+PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv = NULL;
+PFNGLEVALCOORD2DPROC glad_glEvalCoord2d = NULL;
+PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv = NULL;
+PFNGLEVALCOORD2FPROC glad_glEvalCoord2f = NULL;
+PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv = NULL;
+PFNGLEVALMESH1PROC glad_glEvalMesh1 = NULL;
+PFNGLEVALMESH2PROC glad_glEvalMesh2 = NULL;
+PFNGLEVALPOINT1PROC glad_glEvalPoint1 = NULL;
+PFNGLEVALPOINT2PROC glad_glEvalPoint2 = NULL;
+PFNGLEXECUTEPROGRAMNVPROC glad_glExecuteProgramNV = NULL;
+PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer = NULL;
+PFNGLFINISHPROC glad_glFinish = NULL;
+PFNGLFLUSHPROC glad_glFlush = NULL;
+PFNGLFOGFPROC glad_glFogf = NULL;
+PFNGLFOGFVPROC glad_glFogfv = NULL;
+PFNGLFOGIPROC glad_glFogi = NULL;
+PFNGLFOGIVPROC glad_glFogiv = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREARBPROC glad_glFramebufferTextureARB = NULL;
+PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREFACEARBPROC glad_glFramebufferTextureFaceARB = NULL;
+PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC glad_glFramebufferTextureFaceEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERARBPROC glad_glFramebufferTextureLayerARB = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC glad_glFramebufferTextureLayerEXT = NULL;
+PFNGLFRONTFACEPROC glad_glFrontFace = NULL;
+PFNGLFRUSTUMPROC glad_glFrustum = NULL;
+PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL;
+PFNGLGENBUFFERSARBPROC glad_glGenBuffersARB = NULL;
+PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL;
+PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT = NULL;
+PFNGLGENLISTSPROC glad_glGenLists = NULL;
+PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines = NULL;
+PFNGLGENPROGRAMSARBPROC glad_glGenProgramsARB = NULL;
+PFNGLGENPROGRAMSNVPROC glad_glGenProgramsNV = NULL;
+PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL;
+PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT = NULL;
+PFNGLGENTEXTURESPROC glad_glGenTextures = NULL;
+PFNGLGENTEXTURESEXTPROC glad_glGenTexturesEXT = NULL;
+PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL;
+PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT = NULL;
+PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL;
+PFNGLGETACTIVEATTRIBARBPROC glad_glGetActiveAttribARB = NULL;
+PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL;
+PFNGLGETACTIVEUNIFORMARBPROC glad_glGetActiveUniformARB = NULL;
+PFNGLGETATTACHEDOBJECTSARBPROC glad_glGetAttachedObjectsARB = NULL;
+PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL;
+PFNGLGETATTRIBLOCATIONARBPROC glad_glGetAttribLocationARB = NULL;
+PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL;
+PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL;
+PFNGLGETBUFFERPARAMETERIVARBPROC glad_glGetBufferParameterivARB = NULL;
+PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL;
+PFNGLGETBUFFERPOINTERVARBPROC glad_glGetBufferPointervARB = NULL;
+PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL;
+PFNGLGETBUFFERSUBDATAARBPROC glad_glGetBufferSubDataARB = NULL;
+PFNGLGETCLIPPLANEPROC glad_glGetClipPlane = NULL;
+PFNGLGETCOLORTABLEPROC glad_glGetColorTable = NULL;
+PFNGLGETCOLORTABLEPARAMETERFVPROC glad_glGetColorTableParameterfv = NULL;
+PFNGLGETCOLORTABLEPARAMETERIVPROC glad_glGetColorTableParameteriv = NULL;
+PFNGLGETCONVOLUTIONFILTERPROC glad_glGetConvolutionFilter = NULL;
+PFNGLGETCONVOLUTIONPARAMETERFVPROC glad_glGetConvolutionParameterfv = NULL;
+PFNGLGETCONVOLUTIONPARAMETERIVPROC glad_glGetConvolutionParameteriv = NULL;
+PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog = NULL;
+PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL;
+PFNGLGETERRORPROC glad_glGetError = NULL;
+PFNGLGETFLOATVPROC glad_glGetFloatv = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT = NULL;
+PFNGLGETHANDLEARBPROC glad_glGetHandleARB = NULL;
+PFNGLGETHISTOGRAMPROC glad_glGetHistogram = NULL;
+PFNGLGETHISTOGRAMPARAMETERFVPROC glad_glGetHistogramParameterfv = NULL;
+PFNGLGETHISTOGRAMPARAMETERIVPROC glad_glGetHistogramParameteriv = NULL;
+PFNGLGETINFOLOGARBPROC glad_glGetInfoLogARB = NULL;
+PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL;
+PFNGLGETLIGHTFVPROC glad_glGetLightfv = NULL;
+PFNGLGETLIGHTIVPROC glad_glGetLightiv = NULL;
+PFNGLGETMAPDVPROC glad_glGetMapdv = NULL;
+PFNGLGETMAPFVPROC glad_glGetMapfv = NULL;
+PFNGLGETMAPIVPROC glad_glGetMapiv = NULL;
+PFNGLGETMATERIALFVPROC glad_glGetMaterialfv = NULL;
+PFNGLGETMATERIALIVPROC glad_glGetMaterialiv = NULL;
+PFNGLGETMINMAXPROC glad_glGetMinmax = NULL;
+PFNGLGETMINMAXPARAMETERFVPROC glad_glGetMinmaxParameterfv = NULL;
+PFNGLGETMINMAXPARAMETERIVPROC glad_glGetMinmaxParameteriv = NULL;
+PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel = NULL;
+PFNGLGETOBJECTPARAMETERFVARBPROC glad_glGetObjectParameterfvARB = NULL;
+PFNGLGETOBJECTPARAMETERIVARBPROC glad_glGetObjectParameterivARB = NULL;
+PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel = NULL;
+PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv = NULL;
+PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv = NULL;
+PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv = NULL;
+PFNGLGETPOINTERVPROC glad_glGetPointerv = NULL;
+PFNGLGETPOINTERVEXTPROC glad_glGetPointervEXT = NULL;
+PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple = NULL;
+PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary = NULL;
+PFNGLGETPROGRAMENVPARAMETERDVARBPROC glad_glGetProgramEnvParameterdvARB = NULL;
+PFNGLGETPROGRAMENVPARAMETERFVARBPROC glad_glGetProgramEnvParameterfvARB = NULL;
+PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glad_glGetProgramLocalParameterdvARB = NULL;
+PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glad_glGetProgramLocalParameterfvARB = NULL;
+PFNGLGETPROGRAMPARAMETERDVNVPROC glad_glGetProgramParameterdvNV = NULL;
+PFNGLGETPROGRAMPARAMETERFVNVPROC glad_glGetProgramParameterfvNV = NULL;
+PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog = NULL;
+PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv = NULL;
+PFNGLGETPROGRAMSTRINGARBPROC glad_glGetProgramStringARB = NULL;
+PFNGLGETPROGRAMSTRINGNVPROC glad_glGetProgramStringNV = NULL;
+PFNGLGETPROGRAMIVARBPROC glad_glGetProgramivARB = NULL;
+PFNGLGETPROGRAMIVNVPROC glad_glGetProgramivNV = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT = NULL;
+PFNGLGETSEPARABLEFILTERPROC glad_glGetSeparableFilter = NULL;
+PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL;
+PFNGLGETSHADERSOURCEARBPROC glad_glGetShaderSourceARB = NULL;
+PFNGLGETSTRINGPROC glad_glGetString = NULL;
+PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv = NULL;
+PFNGLGETTEXENVIVPROC glad_glGetTexEnviv = NULL;
+PFNGLGETTEXGENDVPROC glad_glGetTexGendv = NULL;
+PFNGLGETTEXGENFVPROC glad_glGetTexGenfv = NULL;
+PFNGLGETTEXGENIVPROC glad_glGetTexGeniv = NULL;
+PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL;
+PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL;
+PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL;
+PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL;
+PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL;
+PFNGLGETTRACKMATRIXIVNVPROC glad_glGetTrackMatrixivNV = NULL;
+PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL;
+PFNGLGETUNIFORMLOCATIONARBPROC glad_glGetUniformLocationARB = NULL;
+PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL;
+PFNGLGETUNIFORMFVARBPROC glad_glGetUniformfvARB = NULL;
+PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL;
+PFNGLGETUNIFORMIVARBPROC glad_glGetUniformivARB = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVARBPROC glad_glGetVertexAttribPointervARB = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVNVPROC glad_glGetVertexAttribPointervNV = NULL;
+PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL;
+PFNGLGETVERTEXATTRIBDVARBPROC glad_glGetVertexAttribdvARB = NULL;
+PFNGLGETVERTEXATTRIBDVNVPROC glad_glGetVertexAttribdvNV = NULL;
+PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL;
+PFNGLGETVERTEXATTRIBFVARBPROC glad_glGetVertexAttribfvARB = NULL;
+PFNGLGETVERTEXATTRIBFVNVPROC glad_glGetVertexAttribfvNV = NULL;
+PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL;
+PFNGLGETVERTEXATTRIBIVARBPROC glad_glGetVertexAttribivARB = NULL;
+PFNGLGETVERTEXATTRIBIVNVPROC glad_glGetVertexAttribivNV = NULL;
+PFNGLHINTPROC glad_glHint = NULL;
+PFNGLHISTOGRAMPROC glad_glHistogram = NULL;
+PFNGLINDEXMASKPROC glad_glIndexMask = NULL;
+PFNGLINDEXPOINTERPROC glad_glIndexPointer = NULL;
+PFNGLINDEXPOINTEREXTPROC glad_glIndexPointerEXT = NULL;
+PFNGLINDEXDPROC glad_glIndexd = NULL;
+PFNGLINDEXDVPROC glad_glIndexdv = NULL;
+PFNGLINDEXFPROC glad_glIndexf = NULL;
+PFNGLINDEXFVPROC glad_glIndexfv = NULL;
+PFNGLINDEXIPROC glad_glIndexi = NULL;
+PFNGLINDEXIVPROC glad_glIndexiv = NULL;
+PFNGLINDEXSPROC glad_glIndexs = NULL;
+PFNGLINDEXSVPROC glad_glIndexsv = NULL;
+PFNGLINDEXUBPROC glad_glIndexub = NULL;
+PFNGLINDEXUBVPROC glad_glIndexubv = NULL;
+PFNGLINITNAMESPROC glad_glInitNames = NULL;
+PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays = NULL;
+PFNGLISBUFFERPROC glad_glIsBuffer = NULL;
+PFNGLISBUFFERARBPROC glad_glIsBufferARB = NULL;
+PFNGLISENABLEDPROC glad_glIsEnabled = NULL;
+PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL;
+PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT = NULL;
+PFNGLISLISTPROC glad_glIsList = NULL;
+PFNGLISPROGRAMARBPROC glad_glIsProgramARB = NULL;
+PFNGLISPROGRAMNVPROC glad_glIsProgramNV = NULL;
+PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline = NULL;
+PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL;
+PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT = NULL;
+PFNGLISTEXTUREPROC glad_glIsTexture = NULL;
+PFNGLISTEXTUREEXTPROC glad_glIsTextureEXT = NULL;
+PFNGLLIGHTMODELFPROC glad_glLightModelf = NULL;
+PFNGLLIGHTMODELFVPROC glad_glLightModelfv = NULL;
+PFNGLLIGHTMODELIPROC glad_glLightModeli = NULL;
+PFNGLLIGHTMODELIVPROC glad_glLightModeliv = NULL;
+PFNGLLIGHTFPROC glad_glLightf = NULL;
+PFNGLLIGHTFVPROC glad_glLightfv = NULL;
+PFNGLLIGHTIPROC glad_glLighti = NULL;
+PFNGLLIGHTIVPROC glad_glLightiv = NULL;
+PFNGLLINESTIPPLEPROC glad_glLineStipple = NULL;
+PFNGLLINEWIDTHPROC glad_glLineWidth = NULL;
+PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL;
+PFNGLLINKPROGRAMARBPROC glad_glLinkProgramARB = NULL;
+PFNGLLISTBASEPROC glad_glListBase = NULL;
+PFNGLLOADIDENTITYPROC glad_glLoadIdentity = NULL;
+PFNGLLOADMATRIXDPROC glad_glLoadMatrixd = NULL;
+PFNGLLOADMATRIXFPROC glad_glLoadMatrixf = NULL;
+PFNGLLOADNAMEPROC glad_glLoadName = NULL;
+PFNGLLOADPROGRAMNVPROC glad_glLoadProgramNV = NULL;
+PFNGLLOGICOPPROC glad_glLogicOp = NULL;
+PFNGLMAP1DPROC glad_glMap1d = NULL;
+PFNGLMAP1FPROC glad_glMap1f = NULL;
+PFNGLMAP2DPROC glad_glMap2d = NULL;
+PFNGLMAP2FPROC glad_glMap2f = NULL;
+PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL;
+PFNGLMAPBUFFERARBPROC glad_glMapBufferARB = NULL;
+PFNGLMAPGRID1DPROC glad_glMapGrid1d = NULL;
+PFNGLMAPGRID1FPROC glad_glMapGrid1f = NULL;
+PFNGLMAPGRID2DPROC glad_glMapGrid2d = NULL;
+PFNGLMAPGRID2FPROC glad_glMapGrid2f = NULL;
+PFNGLMATERIALFPROC glad_glMaterialf = NULL;
+PFNGLMATERIALFVPROC glad_glMaterialfv = NULL;
+PFNGLMATERIALIPROC glad_glMateriali = NULL;
+PFNGLMATERIALIVPROC glad_glMaterialiv = NULL;
+PFNGLMATRIXMODEPROC glad_glMatrixMode = NULL;
+PFNGLMINMAXPROC glad_glMinmax = NULL;
+PFNGLMULTMATRIXDPROC glad_glMultMatrixd = NULL;
+PFNGLMULTMATRIXFPROC glad_glMultMatrixf = NULL;
+PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d = NULL;
+PFNGLMULTITEXCOORD1DARBPROC glad_glMultiTexCoord1dARB = NULL;
+PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv = NULL;
+PFNGLMULTITEXCOORD1DVARBPROC glad_glMultiTexCoord1dvARB = NULL;
+PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f = NULL;
+PFNGLMULTITEXCOORD1FARBPROC glad_glMultiTexCoord1fARB = NULL;
+PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv = NULL;
+PFNGLMULTITEXCOORD1FVARBPROC glad_glMultiTexCoord1fvARB = NULL;
+PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i = NULL;
+PFNGLMULTITEXCOORD1IARBPROC glad_glMultiTexCoord1iARB = NULL;
+PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv = NULL;
+PFNGLMULTITEXCOORD1IVARBPROC glad_glMultiTexCoord1ivARB = NULL;
+PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s = NULL;
+PFNGLMULTITEXCOORD1SARBPROC glad_glMultiTexCoord1sARB = NULL;
+PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv = NULL;
+PFNGLMULTITEXCOORD1SVARBPROC glad_glMultiTexCoord1svARB = NULL;
+PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d = NULL;
+PFNGLMULTITEXCOORD2DARBPROC glad_glMultiTexCoord2dARB = NULL;
+PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv = NULL;
+PFNGLMULTITEXCOORD2DVARBPROC glad_glMultiTexCoord2dvARB = NULL;
+PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f = NULL;
+PFNGLMULTITEXCOORD2FARBPROC glad_glMultiTexCoord2fARB = NULL;
+PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv = NULL;
+PFNGLMULTITEXCOORD2FVARBPROC glad_glMultiTexCoord2fvARB = NULL;
+PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i = NULL;
+PFNGLMULTITEXCOORD2IARBPROC glad_glMultiTexCoord2iARB = NULL;
+PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv = NULL;
+PFNGLMULTITEXCOORD2IVARBPROC glad_glMultiTexCoord2ivARB = NULL;
+PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s = NULL;
+PFNGLMULTITEXCOORD2SARBPROC glad_glMultiTexCoord2sARB = NULL;
+PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv = NULL;
+PFNGLMULTITEXCOORD2SVARBPROC glad_glMultiTexCoord2svARB = NULL;
+PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d = NULL;
+PFNGLMULTITEXCOORD3DARBPROC glad_glMultiTexCoord3dARB = NULL;
+PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv = NULL;
+PFNGLMULTITEXCOORD3DVARBPROC glad_glMultiTexCoord3dvARB = NULL;
+PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f = NULL;
+PFNGLMULTITEXCOORD3FARBPROC glad_glMultiTexCoord3fARB = NULL;
+PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv = NULL;
+PFNGLMULTITEXCOORD3FVARBPROC glad_glMultiTexCoord3fvARB = NULL;
+PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i = NULL;
+PFNGLMULTITEXCOORD3IARBPROC glad_glMultiTexCoord3iARB = NULL;
+PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv = NULL;
+PFNGLMULTITEXCOORD3IVARBPROC glad_glMultiTexCoord3ivARB = NULL;
+PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s = NULL;
+PFNGLMULTITEXCOORD3SARBPROC glad_glMultiTexCoord3sARB = NULL;
+PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv = NULL;
+PFNGLMULTITEXCOORD3SVARBPROC glad_glMultiTexCoord3svARB = NULL;
+PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d = NULL;
+PFNGLMULTITEXCOORD4DARBPROC glad_glMultiTexCoord4dARB = NULL;
+PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv = NULL;
+PFNGLMULTITEXCOORD4DVARBPROC glad_glMultiTexCoord4dvARB = NULL;
+PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f = NULL;
+PFNGLMULTITEXCOORD4FARBPROC glad_glMultiTexCoord4fARB = NULL;
+PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv = NULL;
+PFNGLMULTITEXCOORD4FVARBPROC glad_glMultiTexCoord4fvARB = NULL;
+PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i = NULL;
+PFNGLMULTITEXCOORD4IARBPROC glad_glMultiTexCoord4iARB = NULL;
+PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv = NULL;
+PFNGLMULTITEXCOORD4IVARBPROC glad_glMultiTexCoord4ivARB = NULL;
+PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s = NULL;
+PFNGLMULTITEXCOORD4SARBPROC glad_glMultiTexCoord4sARB = NULL;
+PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv = NULL;
+PFNGLMULTITEXCOORD4SVARBPROC glad_glMultiTexCoord4svARB = NULL;
+PFNGLNEWLISTPROC glad_glNewList = NULL;
+PFNGLNORMAL3BPROC glad_glNormal3b = NULL;
+PFNGLNORMAL3BVPROC glad_glNormal3bv = NULL;
+PFNGLNORMAL3DPROC glad_glNormal3d = NULL;
+PFNGLNORMAL3DVPROC glad_glNormal3dv = NULL;
+PFNGLNORMAL3FPROC glad_glNormal3f = NULL;
+PFNGLNORMAL3FVPROC glad_glNormal3fv = NULL;
+PFNGLNORMAL3IPROC glad_glNormal3i = NULL;
+PFNGLNORMAL3IVPROC glad_glNormal3iv = NULL;
+PFNGLNORMAL3SPROC glad_glNormal3s = NULL;
+PFNGLNORMAL3SVPROC glad_glNormal3sv = NULL;
+PFNGLNORMALPOINTERPROC glad_glNormalPointer = NULL;
+PFNGLNORMALPOINTEREXTPROC glad_glNormalPointerEXT = NULL;
+PFNGLOBJECTLABELPROC glad_glObjectLabel = NULL;
+PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel = NULL;
+PFNGLORTHOPROC glad_glOrtho = NULL;
+PFNGLPASSTHROUGHPROC glad_glPassThrough = NULL;
+PFNGLPIXELMAPFVPROC glad_glPixelMapfv = NULL;
+PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv = NULL;
+PFNGLPIXELMAPUSVPROC glad_glPixelMapusv = NULL;
+PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL;
+PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL;
+PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf = NULL;
+PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi = NULL;
+PFNGLPIXELZOOMPROC glad_glPixelZoom = NULL;
+PFNGLPOINTSIZEPROC glad_glPointSize = NULL;
+PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL;
+PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL;
+PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple = NULL;
+PFNGLPOPATTRIBPROC glad_glPopAttrib = NULL;
+PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib = NULL;
+PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup = NULL;
+PFNGLPOPMATRIXPROC glad_glPopMatrix = NULL;
+PFNGLPOPNAMEPROC glad_glPopName = NULL;
+PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures = NULL;
+PFNGLPRIORITIZETEXTURESEXTPROC glad_glPrioritizeTexturesEXT = NULL;
+PFNGLPROGRAMBINARYPROC glad_glProgramBinary = NULL;
+PFNGLPROGRAMENVPARAMETER4DARBPROC glad_glProgramEnvParameter4dARB = NULL;
+PFNGLPROGRAMENVPARAMETER4DVARBPROC glad_glProgramEnvParameter4dvARB = NULL;
+PFNGLPROGRAMENVPARAMETER4FARBPROC glad_glProgramEnvParameter4fARB = NULL;
+PFNGLPROGRAMENVPARAMETER4FVARBPROC glad_glProgramEnvParameter4fvARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4DARBPROC glad_glProgramLocalParameter4dARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glad_glProgramLocalParameter4dvARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4FARBPROC glad_glProgramLocalParameter4fARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glad_glProgramLocalParameter4fvARB = NULL;
+PFNGLPROGRAMPARAMETER4DNVPROC glad_glProgramParameter4dNV = NULL;
+PFNGLPROGRAMPARAMETER4DVNVPROC glad_glProgramParameter4dvNV = NULL;
+PFNGLPROGRAMPARAMETER4FNVPROC glad_glProgramParameter4fNV = NULL;
+PFNGLPROGRAMPARAMETER4FVNVPROC glad_glProgramParameter4fvNV = NULL;
+PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri = NULL;
+PFNGLPROGRAMPARAMETERIARBPROC glad_glProgramParameteriARB = NULL;
+PFNGLPROGRAMPARAMETERIEXTPROC glad_glProgramParameteriEXT = NULL;
+PFNGLPROGRAMPARAMETERS4DVNVPROC glad_glProgramParameters4dvNV = NULL;
+PFNGLPROGRAMPARAMETERS4FVNVPROC glad_glProgramParameters4fvNV = NULL;
+PFNGLPROGRAMSTRINGARBPROC glad_glProgramStringARB = NULL;
+PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d = NULL;
+PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv = NULL;
+PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f = NULL;
+PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv = NULL;
+PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i = NULL;
+PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv = NULL;
+PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui = NULL;
+PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv = NULL;
+PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d = NULL;
+PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv = NULL;
+PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f = NULL;
+PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv = NULL;
+PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i = NULL;
+PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv = NULL;
+PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui = NULL;
+PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv = NULL;
+PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d = NULL;
+PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv = NULL;
+PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f = NULL;
+PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv = NULL;
+PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i = NULL;
+PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv = NULL;
+PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui = NULL;
+PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv = NULL;
+PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d = NULL;
+PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv = NULL;
+PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f = NULL;
+PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv = NULL;
+PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i = NULL;
+PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv = NULL;
+PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui = NULL;
+PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv = NULL;
+PFNGLPROGRAMVERTEXLIMITNVPROC glad_glProgramVertexLimitNV = NULL;
+PFNGLPUSHATTRIBPROC glad_glPushAttrib = NULL;
+PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib = NULL;
+PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup = NULL;
+PFNGLPUSHMATRIXPROC glad_glPushMatrix = NULL;
+PFNGLPUSHNAMEPROC glad_glPushName = NULL;
+PFNGLRASTERPOS2DPROC glad_glRasterPos2d = NULL;
+PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv = NULL;
+PFNGLRASTERPOS2FPROC glad_glRasterPos2f = NULL;
+PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv = NULL;
+PFNGLRASTERPOS2IPROC glad_glRasterPos2i = NULL;
+PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv = NULL;
+PFNGLRASTERPOS2SPROC glad_glRasterPos2s = NULL;
+PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv = NULL;
+PFNGLRASTERPOS3DPROC glad_glRasterPos3d = NULL;
+PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv = NULL;
+PFNGLRASTERPOS3FPROC glad_glRasterPos3f = NULL;
+PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv = NULL;
+PFNGLRASTERPOS3IPROC glad_glRasterPos3i = NULL;
+PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv = NULL;
+PFNGLRASTERPOS3SPROC glad_glRasterPos3s = NULL;
+PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv = NULL;
+PFNGLRASTERPOS4DPROC glad_glRasterPos4d = NULL;
+PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv = NULL;
+PFNGLRASTERPOS4FPROC glad_glRasterPos4f = NULL;
+PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv = NULL;
+PFNGLRASTERPOS4IPROC glad_glRasterPos4i = NULL;
+PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv = NULL;
+PFNGLRASTERPOS4SPROC glad_glRasterPos4s = NULL;
+PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv = NULL;
+PFNGLREADBUFFERPROC glad_glReadBuffer = NULL;
+PFNGLREADPIXELSPROC glad_glReadPixels = NULL;
+PFNGLRECTDPROC glad_glRectd = NULL;
+PFNGLRECTDVPROC glad_glRectdv = NULL;
+PFNGLRECTFPROC glad_glRectf = NULL;
+PFNGLRECTFVPROC glad_glRectfv = NULL;
+PFNGLRECTIPROC glad_glRecti = NULL;
+PFNGLRECTIVPROC glad_glRectiv = NULL;
+PFNGLRECTSPROC glad_glRects = NULL;
+PFNGLRECTSVPROC glad_glRectsv = NULL;
+PFNGLRENDERMODEPROC glad_glRenderMode = NULL;
+PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL;
+PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT = NULL;
+PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL;
+PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glRenderbufferStorageMultisampleEXT = NULL;
+PFNGLREQUESTRESIDENTPROGRAMSNVPROC glad_glRequestResidentProgramsNV = NULL;
+PFNGLRESETHISTOGRAMPROC glad_glResetHistogram = NULL;
+PFNGLRESETMINMAXPROC glad_glResetMinmax = NULL;
+PFNGLROTATEDPROC glad_glRotated = NULL;
+PFNGLROTATEFPROC glad_glRotatef = NULL;
+PFNGLSCALEDPROC glad_glScaled = NULL;
+PFNGLSCALEFPROC glad_glScalef = NULL;
+PFNGLSCISSORPROC glad_glScissor = NULL;
+PFNGLSELECTBUFFERPROC glad_glSelectBuffer = NULL;
+PFNGLSEPARABLEFILTER2DPROC glad_glSeparableFilter2D = NULL;
+PFNGLSHADEMODELPROC glad_glShadeModel = NULL;
+PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL;
+PFNGLSHADERSOURCEARBPROC glad_glShaderSourceARB = NULL;
+PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL;
+PFNGLSTENCILMASKPROC glad_glStencilMask = NULL;
+PFNGLSTENCILOPPROC glad_glStencilOp = NULL;
+PFNGLTEXCOORD1DPROC glad_glTexCoord1d = NULL;
+PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv = NULL;
+PFNGLTEXCOORD1FPROC glad_glTexCoord1f = NULL;
+PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv = NULL;
+PFNGLTEXCOORD1IPROC glad_glTexCoord1i = NULL;
+PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv = NULL;
+PFNGLTEXCOORD1SPROC glad_glTexCoord1s = NULL;
+PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv = NULL;
+PFNGLTEXCOORD2DPROC glad_glTexCoord2d = NULL;
+PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv = NULL;
+PFNGLTEXCOORD2FPROC glad_glTexCoord2f = NULL;
+PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv = NULL;
+PFNGLTEXCOORD2IPROC glad_glTexCoord2i = NULL;
+PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv = NULL;
+PFNGLTEXCOORD2SPROC glad_glTexCoord2s = NULL;
+PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv = NULL;
+PFNGLTEXCOORD3DPROC glad_glTexCoord3d = NULL;
+PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv = NULL;
+PFNGLTEXCOORD3FPROC glad_glTexCoord3f = NULL;
+PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv = NULL;
+PFNGLTEXCOORD3IPROC glad_glTexCoord3i = NULL;
+PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv = NULL;
+PFNGLTEXCOORD3SPROC glad_glTexCoord3s = NULL;
+PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv = NULL;
+PFNGLTEXCOORD4DPROC glad_glTexCoord4d = NULL;
+PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv = NULL;
+PFNGLTEXCOORD4FPROC glad_glTexCoord4f = NULL;
+PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv = NULL;
+PFNGLTEXCOORD4IPROC glad_glTexCoord4i = NULL;
+PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv = NULL;
+PFNGLTEXCOORD4SPROC glad_glTexCoord4s = NULL;
+PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv = NULL;
+PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer = NULL;
+PFNGLTEXCOORDPOINTEREXTPROC glad_glTexCoordPointerEXT = NULL;
+PFNGLTEXENVFPROC glad_glTexEnvf = NULL;
+PFNGLTEXENVFVPROC glad_glTexEnvfv = NULL;
+PFNGLTEXENVIPROC glad_glTexEnvi = NULL;
+PFNGLTEXENVIVPROC glad_glTexEnviv = NULL;
+PFNGLTEXGENDPROC glad_glTexGend = NULL;
+PFNGLTEXGENDVPROC glad_glTexGendv = NULL;
+PFNGLTEXGENFPROC glad_glTexGenf = NULL;
+PFNGLTEXGENFVPROC glad_glTexGenfv = NULL;
+PFNGLTEXGENIPROC glad_glTexGeni = NULL;
+PFNGLTEXGENIVPROC glad_glTexGeniv = NULL;
+PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL;
+PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL;
+PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL;
+PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL;
+PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL;
+PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL;
+PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL;
+PFNGLTEXSUBIMAGE1DEXTPROC glad_glTexSubImage1DEXT = NULL;
+PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL;
+PFNGLTEXSUBIMAGE2DEXTPROC glad_glTexSubImage2DEXT = NULL;
+PFNGLTRACKMATRIXNVPROC glad_glTrackMatrixNV = NULL;
+PFNGLTRANSLATEDPROC glad_glTranslated = NULL;
+PFNGLTRANSLATEFPROC glad_glTranslatef = NULL;
+PFNGLUNIFORM1FPROC glad_glUniform1f = NULL;
+PFNGLUNIFORM1FARBPROC glad_glUniform1fARB = NULL;
+PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL;
+PFNGLUNIFORM1FVARBPROC glad_glUniform1fvARB = NULL;
+PFNGLUNIFORM1IPROC glad_glUniform1i = NULL;
+PFNGLUNIFORM1IARBPROC glad_glUniform1iARB = NULL;
+PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL;
+PFNGLUNIFORM1IVARBPROC glad_glUniform1ivARB = NULL;
+PFNGLUNIFORM2FPROC glad_glUniform2f = NULL;
+PFNGLUNIFORM2FARBPROC glad_glUniform2fARB = NULL;
+PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL;
+PFNGLUNIFORM2FVARBPROC glad_glUniform2fvARB = NULL;
+PFNGLUNIFORM2IPROC glad_glUniform2i = NULL;
+PFNGLUNIFORM2IARBPROC glad_glUniform2iARB = NULL;
+PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL;
+PFNGLUNIFORM2IVARBPROC glad_glUniform2ivARB = NULL;
+PFNGLUNIFORM3FPROC glad_glUniform3f = NULL;
+PFNGLUNIFORM3FARBPROC glad_glUniform3fARB = NULL;
+PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL;
+PFNGLUNIFORM3FVARBPROC glad_glUniform3fvARB = NULL;
+PFNGLUNIFORM3IPROC glad_glUniform3i = NULL;
+PFNGLUNIFORM3IARBPROC glad_glUniform3iARB = NULL;
+PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL;
+PFNGLUNIFORM3IVARBPROC glad_glUniform3ivARB = NULL;
+PFNGLUNIFORM4FPROC glad_glUniform4f = NULL;
+PFNGLUNIFORM4FARBPROC glad_glUniform4fARB = NULL;
+PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL;
+PFNGLUNIFORM4FVARBPROC glad_glUniform4fvARB = NULL;
+PFNGLUNIFORM4IPROC glad_glUniform4i = NULL;
+PFNGLUNIFORM4IARBPROC glad_glUniform4iARB = NULL;
+PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL;
+PFNGLUNIFORM4IVARBPROC glad_glUniform4ivARB = NULL;
+PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL;
+PFNGLUNIFORMMATRIX2FVARBPROC glad_glUniformMatrix2fvARB = NULL;
+PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL;
+PFNGLUNIFORMMATRIX3FVARBPROC glad_glUniformMatrix3fvARB = NULL;
+PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL;
+PFNGLUNIFORMMATRIX4FVARBPROC glad_glUniformMatrix4fvARB = NULL;
+PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL;
+PFNGLUNMAPBUFFERARBPROC glad_glUnmapBufferARB = NULL;
+PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL;
+PFNGLUSEPROGRAMOBJECTARBPROC glad_glUseProgramObjectARB = NULL;
+PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages = NULL;
+PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL;
+PFNGLVALIDATEPROGRAMARBPROC glad_glValidateProgramARB = NULL;
+PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline = NULL;
+PFNGLVERTEX2DPROC glad_glVertex2d = NULL;
+PFNGLVERTEX2DVPROC glad_glVertex2dv = NULL;
+PFNGLVERTEX2FPROC glad_glVertex2f = NULL;
+PFNGLVERTEX2FVPROC glad_glVertex2fv = NULL;
+PFNGLVERTEX2IPROC glad_glVertex2i = NULL;
+PFNGLVERTEX2IVPROC glad_glVertex2iv = NULL;
+PFNGLVERTEX2SPROC glad_glVertex2s = NULL;
+PFNGLVERTEX2SVPROC glad_glVertex2sv = NULL;
+PFNGLVERTEX3DPROC glad_glVertex3d = NULL;
+PFNGLVERTEX3DVPROC glad_glVertex3dv = NULL;
+PFNGLVERTEX3FPROC glad_glVertex3f = NULL;
+PFNGLVERTEX3FVPROC glad_glVertex3fv = NULL;
+PFNGLVERTEX3IPROC glad_glVertex3i = NULL;
+PFNGLVERTEX3IVPROC glad_glVertex3iv = NULL;
+PFNGLVERTEX3SPROC glad_glVertex3s = NULL;
+PFNGLVERTEX3SVPROC glad_glVertex3sv = NULL;
+PFNGLVERTEX4DPROC glad_glVertex4d = NULL;
+PFNGLVERTEX4DVPROC glad_glVertex4dv = NULL;
+PFNGLVERTEX4FPROC glad_glVertex4f = NULL;
+PFNGLVERTEX4FVPROC glad_glVertex4fv = NULL;
+PFNGLVERTEX4IPROC glad_glVertex4i = NULL;
+PFNGLVERTEX4IVPROC glad_glVertex4iv = NULL;
+PFNGLVERTEX4SPROC glad_glVertex4s = NULL;
+PFNGLVERTEX4SVPROC glad_glVertex4sv = NULL;
+PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL;
+PFNGLVERTEXATTRIB1DARBPROC glad_glVertexAttrib1dARB = NULL;
+PFNGLVERTEXATTRIB1DNVPROC glad_glVertexAttrib1dNV = NULL;
+PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL;
+PFNGLVERTEXATTRIB1DVARBPROC glad_glVertexAttrib1dvARB = NULL;
+PFNGLVERTEXATTRIB1DVNVPROC glad_glVertexAttrib1dvNV = NULL;
+PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL;
+PFNGLVERTEXATTRIB1FARBPROC glad_glVertexAttrib1fARB = NULL;
+PFNGLVERTEXATTRIB1FNVPROC glad_glVertexAttrib1fNV = NULL;
+PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL;
+PFNGLVERTEXATTRIB1FVARBPROC glad_glVertexAttrib1fvARB = NULL;
+PFNGLVERTEXATTRIB1FVNVPROC glad_glVertexAttrib1fvNV = NULL;
+PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL;
+PFNGLVERTEXATTRIB1SARBPROC glad_glVertexAttrib1sARB = NULL;
+PFNGLVERTEXATTRIB1SNVPROC glad_glVertexAttrib1sNV = NULL;
+PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL;
+PFNGLVERTEXATTRIB1SVARBPROC glad_glVertexAttrib1svARB = NULL;
+PFNGLVERTEXATTRIB1SVNVPROC glad_glVertexAttrib1svNV = NULL;
+PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL;
+PFNGLVERTEXATTRIB2DARBPROC glad_glVertexAttrib2dARB = NULL;
+PFNGLVERTEXATTRIB2DNVPROC glad_glVertexAttrib2dNV = NULL;
+PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL;
+PFNGLVERTEXATTRIB2DVARBPROC glad_glVertexAttrib2dvARB = NULL;
+PFNGLVERTEXATTRIB2DVNVPROC glad_glVertexAttrib2dvNV = NULL;
+PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL;
+PFNGLVERTEXATTRIB2FARBPROC glad_glVertexAttrib2fARB = NULL;
+PFNGLVERTEXATTRIB2FNVPROC glad_glVertexAttrib2fNV = NULL;
+PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL;
+PFNGLVERTEXATTRIB2FVARBPROC glad_glVertexAttrib2fvARB = NULL;
+PFNGLVERTEXATTRIB2FVNVPROC glad_glVertexAttrib2fvNV = NULL;
+PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL;
+PFNGLVERTEXATTRIB2SARBPROC glad_glVertexAttrib2sARB = NULL;
+PFNGLVERTEXATTRIB2SNVPROC glad_glVertexAttrib2sNV = NULL;
+PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL;
+PFNGLVERTEXATTRIB2SVARBPROC glad_glVertexAttrib2svARB = NULL;
+PFNGLVERTEXATTRIB2SVNVPROC glad_glVertexAttrib2svNV = NULL;
+PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL;
+PFNGLVERTEXATTRIB3DARBPROC glad_glVertexAttrib3dARB = NULL;
+PFNGLVERTEXATTRIB3DNVPROC glad_glVertexAttrib3dNV = NULL;
+PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL;
+PFNGLVERTEXATTRIB3DVARBPROC glad_glVertexAttrib3dvARB = NULL;
+PFNGLVERTEXATTRIB3DVNVPROC glad_glVertexAttrib3dvNV = NULL;
+PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL;
+PFNGLVERTEXATTRIB3FARBPROC glad_glVertexAttrib3fARB = NULL;
+PFNGLVERTEXATTRIB3FNVPROC glad_glVertexAttrib3fNV = NULL;
+PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL;
+PFNGLVERTEXATTRIB3FVARBPROC glad_glVertexAttrib3fvARB = NULL;
+PFNGLVERTEXATTRIB3FVNVPROC glad_glVertexAttrib3fvNV = NULL;
+PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL;
+PFNGLVERTEXATTRIB3SARBPROC glad_glVertexAttrib3sARB = NULL;
+PFNGLVERTEXATTRIB3SNVPROC glad_glVertexAttrib3sNV = NULL;
+PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL;
+PFNGLVERTEXATTRIB3SVARBPROC glad_glVertexAttrib3svARB = NULL;
+PFNGLVERTEXATTRIB3SVNVPROC glad_glVertexAttrib3svNV = NULL;
+PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL;
+PFNGLVERTEXATTRIB4NBVARBPROC glad_glVertexAttrib4NbvARB = NULL;
+PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL;
+PFNGLVERTEXATTRIB4NIVARBPROC glad_glVertexAttrib4NivARB = NULL;
+PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL;
+PFNGLVERTEXATTRIB4NSVARBPROC glad_glVertexAttrib4NsvARB = NULL;
+PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL;
+PFNGLVERTEXATTRIB4NUBARBPROC glad_glVertexAttrib4NubARB = NULL;
+PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL;
+PFNGLVERTEXATTRIB4NUBVARBPROC glad_glVertexAttrib4NubvARB = NULL;
+PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL;
+PFNGLVERTEXATTRIB4NUIVARBPROC glad_glVertexAttrib4NuivARB = NULL;
+PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL;
+PFNGLVERTEXATTRIB4NUSVARBPROC glad_glVertexAttrib4NusvARB = NULL;
+PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL;
+PFNGLVERTEXATTRIB4BVARBPROC glad_glVertexAttrib4bvARB = NULL;
+PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL;
+PFNGLVERTEXATTRIB4DARBPROC glad_glVertexAttrib4dARB = NULL;
+PFNGLVERTEXATTRIB4DNVPROC glad_glVertexAttrib4dNV = NULL;
+PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL;
+PFNGLVERTEXATTRIB4DVARBPROC glad_glVertexAttrib4dvARB = NULL;
+PFNGLVERTEXATTRIB4DVNVPROC glad_glVertexAttrib4dvNV = NULL;
+PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL;
+PFNGLVERTEXATTRIB4FARBPROC glad_glVertexAttrib4fARB = NULL;
+PFNGLVERTEXATTRIB4FNVPROC glad_glVertexAttrib4fNV = NULL;
+PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL;
+PFNGLVERTEXATTRIB4FVARBPROC glad_glVertexAttrib4fvARB = NULL;
+PFNGLVERTEXATTRIB4FVNVPROC glad_glVertexAttrib4fvNV = NULL;
+PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL;
+PFNGLVERTEXATTRIB4IVARBPROC glad_glVertexAttrib4ivARB = NULL;
+PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL;
+PFNGLVERTEXATTRIB4SARBPROC glad_glVertexAttrib4sARB = NULL;
+PFNGLVERTEXATTRIB4SNVPROC glad_glVertexAttrib4sNV = NULL;
+PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL;
+PFNGLVERTEXATTRIB4SVARBPROC glad_glVertexAttrib4svARB = NULL;
+PFNGLVERTEXATTRIB4SVNVPROC glad_glVertexAttrib4svNV = NULL;
+PFNGLVERTEXATTRIB4UBNVPROC glad_glVertexAttrib4ubNV = NULL;
+PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL;
+PFNGLVERTEXATTRIB4UBVARBPROC glad_glVertexAttrib4ubvARB = NULL;
+PFNGLVERTEXATTRIB4UBVNVPROC glad_glVertexAttrib4ubvNV = NULL;
+PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL;
+PFNGLVERTEXATTRIB4UIVARBPROC glad_glVertexAttrib4uivARB = NULL;
+PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL;
+PFNGLVERTEXATTRIB4USVARBPROC glad_glVertexAttrib4usvARB = NULL;
+PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL;
+PFNGLVERTEXATTRIBPOINTERARBPROC glad_glVertexAttribPointerARB = NULL;
+PFNGLVERTEXATTRIBPOINTERNVPROC glad_glVertexAttribPointerNV = NULL;
+PFNGLVERTEXATTRIBS1DVNVPROC glad_glVertexAttribs1dvNV = NULL;
+PFNGLVERTEXATTRIBS1FVNVPROC glad_glVertexAttribs1fvNV = NULL;
+PFNGLVERTEXATTRIBS1SVNVPROC glad_glVertexAttribs1svNV = NULL;
+PFNGLVERTEXATTRIBS2DVNVPROC glad_glVertexAttribs2dvNV = NULL;
+PFNGLVERTEXATTRIBS2FVNVPROC glad_glVertexAttribs2fvNV = NULL;
+PFNGLVERTEXATTRIBS2SVNVPROC glad_glVertexAttribs2svNV = NULL;
+PFNGLVERTEXATTRIBS3DVNVPROC glad_glVertexAttribs3dvNV = NULL;
+PFNGLVERTEXATTRIBS3FVNVPROC glad_glVertexAttribs3fvNV = NULL;
+PFNGLVERTEXATTRIBS3SVNVPROC glad_glVertexAttribs3svNV = NULL;
+PFNGLVERTEXATTRIBS4DVNVPROC glad_glVertexAttribs4dvNV = NULL;
+PFNGLVERTEXATTRIBS4FVNVPROC glad_glVertexAttribs4fvNV = NULL;
+PFNGLVERTEXATTRIBS4SVNVPROC glad_glVertexAttribs4svNV = NULL;
+PFNGLVERTEXATTRIBS4UBVNVPROC glad_glVertexAttribs4ubvNV = NULL;
+PFNGLVERTEXPOINTERPROC glad_glVertexPointer = NULL;
+PFNGLVERTEXPOINTEREXTPROC glad_glVertexPointerEXT = NULL;
+PFNGLVIEWPORTPROC glad_glViewport = NULL;
+PFNGLALPHAFUNCXPROC glad_glAlphaFuncx = NULL;
+PFNGLBINDFRAMEBUFFEROESPROC glad_glBindFramebufferOES = NULL;
+PFNGLBINDRENDERBUFFEROESPROC glad_glBindRenderbufferOES = NULL;
+PFNGLBLENDEQUATIONOESPROC glad_glBlendEquationOES = NULL;
+PFNGLBLENDEQUATIONSEPARATEOESPROC glad_glBlendEquationSeparateOES = NULL;
+PFNGLBLENDFUNCSEPARATEOESPROC glad_glBlendFuncSeparateOES = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSOESPROC glad_glCheckFramebufferStatusOES = NULL;
+PFNGLCLEARCOLORXPROC glad_glClearColorx = NULL;
+PFNGLCLEARDEPTHFPROC glad_glClearDepthf = NULL;
+PFNGLCLEARDEPTHFOESPROC glad_glClearDepthfOES = NULL;
+PFNGLCLEARDEPTHXPROC glad_glClearDepthx = NULL;
+PFNGLCLIPPLANEFPROC glad_glClipPlanef = NULL;
+PFNGLCLIPPLANEFOESPROC glad_glClipPlanefOES = NULL;
+PFNGLCLIPPLANEXPROC glad_glClipPlanex = NULL;
+PFNGLCOLOR4XPROC glad_glColor4x = NULL;
+PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL;
+PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL;
+PFNGLDELETEFRAMEBUFFERSOESPROC glad_glDeleteFramebuffersOES = NULL;
+PFNGLDELETERENDERBUFFERSOESPROC glad_glDeleteRenderbuffersOES = NULL;
+PFNGLDEPTHRANGEFPROC glad_glDepthRangef = NULL;
+PFNGLDEPTHRANGEFOESPROC glad_glDepthRangefOES = NULL;
+PFNGLDEPTHRANGEXPROC glad_glDepthRangex = NULL;
+PFNGLFOGXPROC glad_glFogx = NULL;
+PFNGLFOGXVPROC glad_glFogxv = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFEROESPROC glad_glFramebufferRenderbufferOES = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DOESPROC glad_glFramebufferTexture2DOES = NULL;
+PFNGLFRUSTUMFPROC glad_glFrustumf = NULL;
+PFNGLFRUSTUMFOESPROC glad_glFrustumfOES = NULL;
+PFNGLFRUSTUMXPROC glad_glFrustumx = NULL;
+PFNGLGENFRAMEBUFFERSOESPROC glad_glGenFramebuffersOES = NULL;
+PFNGLGENRENDERBUFFERSOESPROC glad_glGenRenderbuffersOES = NULL;
+PFNGLGENERATEMIPMAPOESPROC glad_glGenerateMipmapOES = NULL;
+PFNGLGETCLIPPLANEFPROC glad_glGetClipPlanef = NULL;
+PFNGLGETCLIPPLANEFOESPROC glad_glGetClipPlanefOES = NULL;
+PFNGLGETCLIPPLANEXPROC glad_glGetClipPlanex = NULL;
+PFNGLGETFIXEDVPROC glad_glGetFixedv = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC glad_glGetFramebufferAttachmentParameterivOES = NULL;
+PFNGLGETLIGHTXVPROC glad_glGetLightxv = NULL;
+PFNGLGETMATERIALXVPROC glad_glGetMaterialxv = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVOESPROC glad_glGetRenderbufferParameterivOES = NULL;
+PFNGLGETTEXENVXVPROC glad_glGetTexEnvxv = NULL;
+PFNGLGETTEXPARAMETERXVPROC glad_glGetTexParameterxv = NULL;
+PFNGLISFRAMEBUFFEROESPROC glad_glIsFramebufferOES = NULL;
+PFNGLISRENDERBUFFEROESPROC glad_glIsRenderbufferOES = NULL;
+PFNGLLIGHTMODELXPROC glad_glLightModelx = NULL;
+PFNGLLIGHTMODELXVPROC glad_glLightModelxv = NULL;
+PFNGLLIGHTXPROC glad_glLightx = NULL;
+PFNGLLIGHTXVPROC glad_glLightxv = NULL;
+PFNGLLINEWIDTHXPROC glad_glLineWidthx = NULL;
+PFNGLLOADMATRIXXPROC glad_glLoadMatrixx = NULL;
+PFNGLMATERIALXPROC glad_glMaterialx = NULL;
+PFNGLMATERIALXVPROC glad_glMaterialxv = NULL;
+PFNGLMULTMATRIXXPROC glad_glMultMatrixx = NULL;
+PFNGLMULTITEXCOORD4XPROC glad_glMultiTexCoord4x = NULL;
+PFNGLNORMAL3XPROC glad_glNormal3x = NULL;
+PFNGLORTHOFPROC glad_glOrthof = NULL;
+PFNGLORTHOFOESPROC glad_glOrthofOES = NULL;
+PFNGLORTHOXPROC glad_glOrthox = NULL;
+PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL;
+PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL;
+PFNGLPOINTPARAMETERXPROC glad_glPointParameterx = NULL;
+PFNGLPOINTPARAMETERXVPROC glad_glPointParameterxv = NULL;
+PFNGLPOINTSIZEXPROC glad_glPointSizex = NULL;
+PFNGLPOLYGONOFFSETXPROC glad_glPolygonOffsetx = NULL;
+PFNGLRENDERBUFFERSTORAGEOESPROC glad_glRenderbufferStorageOES = NULL;
+PFNGLROTATEXPROC glad_glRotatex = NULL;
+PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL;
+PFNGLSAMPLECOVERAGEXPROC glad_glSampleCoveragex = NULL;
+PFNGLSCALEXPROC glad_glScalex = NULL;
+PFNGLTEXENVXPROC glad_glTexEnvx = NULL;
+PFNGLTEXENVXVPROC glad_glTexEnvxv = NULL;
+PFNGLTEXPARAMETERXPROC glad_glTexParameterx = NULL;
+PFNGLTEXPARAMETERXVPROC glad_glTexParameterxv = NULL;
+PFNGLTRANSLATEXPROC glad_glTranslatex = NULL;
+
+
+static void glad_gl_load_GL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_VERSION_1_0) return;
+ glad_glAccum = (PFNGLACCUMPROC) load(userptr, "glAccum");
+ glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc");
+ glad_glBegin = (PFNGLBEGINPROC) load(userptr, "glBegin");
+ glad_glBitmap = (PFNGLBITMAPPROC) load(userptr, "glBitmap");
+ glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc");
+ glad_glCallList = (PFNGLCALLLISTPROC) load(userptr, "glCallList");
+ glad_glCallLists = (PFNGLCALLLISTSPROC) load(userptr, "glCallLists");
+ glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear");
+ glad_glClearAccum = (PFNGLCLEARACCUMPROC) load(userptr, "glClearAccum");
+ glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor");
+ glad_glClearDepth = (PFNGLCLEARDEPTHPROC) load(userptr, "glClearDepth");
+ glad_glClearIndex = (PFNGLCLEARINDEXPROC) load(userptr, "glClearIndex");
+ glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil");
+ glad_glClipPlane = (PFNGLCLIPPLANEPROC) load(userptr, "glClipPlane");
+ glad_glColor3b = (PFNGLCOLOR3BPROC) load(userptr, "glColor3b");
+ glad_glColor3bv = (PFNGLCOLOR3BVPROC) load(userptr, "glColor3bv");
+ glad_glColor3d = (PFNGLCOLOR3DPROC) load(userptr, "glColor3d");
+ glad_glColor3dv = (PFNGLCOLOR3DVPROC) load(userptr, "glColor3dv");
+ glad_glColor3f = (PFNGLCOLOR3FPROC) load(userptr, "glColor3f");
+ glad_glColor3fv = (PFNGLCOLOR3FVPROC) load(userptr, "glColor3fv");
+ glad_glColor3i = (PFNGLCOLOR3IPROC) load(userptr, "glColor3i");
+ glad_glColor3iv = (PFNGLCOLOR3IVPROC) load(userptr, "glColor3iv");
+ glad_glColor3s = (PFNGLCOLOR3SPROC) load(userptr, "glColor3s");
+ glad_glColor3sv = (PFNGLCOLOR3SVPROC) load(userptr, "glColor3sv");
+ glad_glColor3ub = (PFNGLCOLOR3UBPROC) load(userptr, "glColor3ub");
+ glad_glColor3ubv = (PFNGLCOLOR3UBVPROC) load(userptr, "glColor3ubv");
+ glad_glColor3ui = (PFNGLCOLOR3UIPROC) load(userptr, "glColor3ui");
+ glad_glColor3uiv = (PFNGLCOLOR3UIVPROC) load(userptr, "glColor3uiv");
+ glad_glColor3us = (PFNGLCOLOR3USPROC) load(userptr, "glColor3us");
+ glad_glColor3usv = (PFNGLCOLOR3USVPROC) load(userptr, "glColor3usv");
+ glad_glColor4b = (PFNGLCOLOR4BPROC) load(userptr, "glColor4b");
+ glad_glColor4bv = (PFNGLCOLOR4BVPROC) load(userptr, "glColor4bv");
+ glad_glColor4d = (PFNGLCOLOR4DPROC) load(userptr, "glColor4d");
+ glad_glColor4dv = (PFNGLCOLOR4DVPROC) load(userptr, "glColor4dv");
+ glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f");
+ glad_glColor4fv = (PFNGLCOLOR4FVPROC) load(userptr, "glColor4fv");
+ glad_glColor4i = (PFNGLCOLOR4IPROC) load(userptr, "glColor4i");
+ glad_glColor4iv = (PFNGLCOLOR4IVPROC) load(userptr, "glColor4iv");
+ glad_glColor4s = (PFNGLCOLOR4SPROC) load(userptr, "glColor4s");
+ glad_glColor4sv = (PFNGLCOLOR4SVPROC) load(userptr, "glColor4sv");
+ glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub");
+ glad_glColor4ubv = (PFNGLCOLOR4UBVPROC) load(userptr, "glColor4ubv");
+ glad_glColor4ui = (PFNGLCOLOR4UIPROC) load(userptr, "glColor4ui");
+ glad_glColor4uiv = (PFNGLCOLOR4UIVPROC) load(userptr, "glColor4uiv");
+ glad_glColor4us = (PFNGLCOLOR4USPROC) load(userptr, "glColor4us");
+ glad_glColor4usv = (PFNGLCOLOR4USVPROC) load(userptr, "glColor4usv");
+ glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask");
+ glad_glColorMaterial = (PFNGLCOLORMATERIALPROC) load(userptr, "glColorMaterial");
+ glad_glCopyPixels = (PFNGLCOPYPIXELSPROC) load(userptr, "glCopyPixels");
+ glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace");
+ glad_glDeleteLists = (PFNGLDELETELISTSPROC) load(userptr, "glDeleteLists");
+ glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc");
+ glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask");
+ glad_glDepthRange = (PFNGLDEPTHRANGEPROC) load(userptr, "glDepthRange");
+ glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable");
+ glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC) load(userptr, "glDrawBuffer");
+ glad_glDrawPixels = (PFNGLDRAWPIXELSPROC) load(userptr, "glDrawPixels");
+ glad_glEdgeFlag = (PFNGLEDGEFLAGPROC) load(userptr, "glEdgeFlag");
+ glad_glEdgeFlagv = (PFNGLEDGEFLAGVPROC) load(userptr, "glEdgeFlagv");
+ glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable");
+ glad_glEnd = (PFNGLENDPROC) load(userptr, "glEnd");
+ glad_glEndList = (PFNGLENDLISTPROC) load(userptr, "glEndList");
+ glad_glEvalCoord1d = (PFNGLEVALCOORD1DPROC) load(userptr, "glEvalCoord1d");
+ glad_glEvalCoord1dv = (PFNGLEVALCOORD1DVPROC) load(userptr, "glEvalCoord1dv");
+ glad_glEvalCoord1f = (PFNGLEVALCOORD1FPROC) load(userptr, "glEvalCoord1f");
+ glad_glEvalCoord1fv = (PFNGLEVALCOORD1FVPROC) load(userptr, "glEvalCoord1fv");
+ glad_glEvalCoord2d = (PFNGLEVALCOORD2DPROC) load(userptr, "glEvalCoord2d");
+ glad_glEvalCoord2dv = (PFNGLEVALCOORD2DVPROC) load(userptr, "glEvalCoord2dv");
+ glad_glEvalCoord2f = (PFNGLEVALCOORD2FPROC) load(userptr, "glEvalCoord2f");
+ glad_glEvalCoord2fv = (PFNGLEVALCOORD2FVPROC) load(userptr, "glEvalCoord2fv");
+ glad_glEvalMesh1 = (PFNGLEVALMESH1PROC) load(userptr, "glEvalMesh1");
+ glad_glEvalMesh2 = (PFNGLEVALMESH2PROC) load(userptr, "glEvalMesh2");
+ glad_glEvalPoint1 = (PFNGLEVALPOINT1PROC) load(userptr, "glEvalPoint1");
+ glad_glEvalPoint2 = (PFNGLEVALPOINT2PROC) load(userptr, "glEvalPoint2");
+ glad_glFeedbackBuffer = (PFNGLFEEDBACKBUFFERPROC) load(userptr, "glFeedbackBuffer");
+ glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish");
+ glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush");
+ glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf");
+ glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv");
+ glad_glFogi = (PFNGLFOGIPROC) load(userptr, "glFogi");
+ glad_glFogiv = (PFNGLFOGIVPROC) load(userptr, "glFogiv");
+ glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace");
+ glad_glFrustum = (PFNGLFRUSTUMPROC) load(userptr, "glFrustum");
+ glad_glGenLists = (PFNGLGENLISTSPROC) load(userptr, "glGenLists");
+ glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv");
+ glad_glGetClipPlane = (PFNGLGETCLIPPLANEPROC) load(userptr, "glGetClipPlane");
+ glad_glGetDoublev = (PFNGLGETDOUBLEVPROC) load(userptr, "glGetDoublev");
+ glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError");
+ glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv");
+ glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv");
+ glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv");
+ glad_glGetLightiv = (PFNGLGETLIGHTIVPROC) load(userptr, "glGetLightiv");
+ glad_glGetMapdv = (PFNGLGETMAPDVPROC) load(userptr, "glGetMapdv");
+ glad_glGetMapfv = (PFNGLGETMAPFVPROC) load(userptr, "glGetMapfv");
+ glad_glGetMapiv = (PFNGLGETMAPIVPROC) load(userptr, "glGetMapiv");
+ glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv");
+ glad_glGetMaterialiv = (PFNGLGETMATERIALIVPROC) load(userptr, "glGetMaterialiv");
+ glad_glGetPixelMapfv = (PFNGLGETPIXELMAPFVPROC) load(userptr, "glGetPixelMapfv");
+ glad_glGetPixelMapuiv = (PFNGLGETPIXELMAPUIVPROC) load(userptr, "glGetPixelMapuiv");
+ glad_glGetPixelMapusv = (PFNGLGETPIXELMAPUSVPROC) load(userptr, "glGetPixelMapusv");
+ glad_glGetPolygonStipple = (PFNGLGETPOLYGONSTIPPLEPROC) load(userptr, "glGetPolygonStipple");
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv");
+ glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv");
+ glad_glGetTexGendv = (PFNGLGETTEXGENDVPROC) load(userptr, "glGetTexGendv");
+ glad_glGetTexGenfv = (PFNGLGETTEXGENFVPROC) load(userptr, "glGetTexGenfv");
+ glad_glGetTexGeniv = (PFNGLGETTEXGENIVPROC) load(userptr, "glGetTexGeniv");
+ glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC) load(userptr, "glGetTexImage");
+ glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load(userptr, "glGetTexLevelParameterfv");
+ glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load(userptr, "glGetTexLevelParameteriv");
+ glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv");
+ glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv");
+ glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint");
+ glad_glIndexMask = (PFNGLINDEXMASKPROC) load(userptr, "glIndexMask");
+ glad_glIndexd = (PFNGLINDEXDPROC) load(userptr, "glIndexd");
+ glad_glIndexdv = (PFNGLINDEXDVPROC) load(userptr, "glIndexdv");
+ glad_glIndexf = (PFNGLINDEXFPROC) load(userptr, "glIndexf");
+ glad_glIndexfv = (PFNGLINDEXFVPROC) load(userptr, "glIndexfv");
+ glad_glIndexi = (PFNGLINDEXIPROC) load(userptr, "glIndexi");
+ glad_glIndexiv = (PFNGLINDEXIVPROC) load(userptr, "glIndexiv");
+ glad_glIndexs = (PFNGLINDEXSPROC) load(userptr, "glIndexs");
+ glad_glIndexsv = (PFNGLINDEXSVPROC) load(userptr, "glIndexsv");
+ glad_glInitNames = (PFNGLINITNAMESPROC) load(userptr, "glInitNames");
+ glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled");
+ glad_glIsList = (PFNGLISLISTPROC) load(userptr, "glIsList");
+ glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf");
+ glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv");
+ glad_glLightModeli = (PFNGLLIGHTMODELIPROC) load(userptr, "glLightModeli");
+ glad_glLightModeliv = (PFNGLLIGHTMODELIVPROC) load(userptr, "glLightModeliv");
+ glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf");
+ glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv");
+ glad_glLighti = (PFNGLLIGHTIPROC) load(userptr, "glLighti");
+ glad_glLightiv = (PFNGLLIGHTIVPROC) load(userptr, "glLightiv");
+ glad_glLineStipple = (PFNGLLINESTIPPLEPROC) load(userptr, "glLineStipple");
+ glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth");
+ glad_glListBase = (PFNGLLISTBASEPROC) load(userptr, "glListBase");
+ glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity");
+ glad_glLoadMatrixd = (PFNGLLOADMATRIXDPROC) load(userptr, "glLoadMatrixd");
+ glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf");
+ glad_glLoadName = (PFNGLLOADNAMEPROC) load(userptr, "glLoadName");
+ glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp");
+ glad_glMap1d = (PFNGLMAP1DPROC) load(userptr, "glMap1d");
+ glad_glMap1f = (PFNGLMAP1FPROC) load(userptr, "glMap1f");
+ glad_glMap2d = (PFNGLMAP2DPROC) load(userptr, "glMap2d");
+ glad_glMap2f = (PFNGLMAP2FPROC) load(userptr, "glMap2f");
+ glad_glMapGrid1d = (PFNGLMAPGRID1DPROC) load(userptr, "glMapGrid1d");
+ glad_glMapGrid1f = (PFNGLMAPGRID1FPROC) load(userptr, "glMapGrid1f");
+ glad_glMapGrid2d = (PFNGLMAPGRID2DPROC) load(userptr, "glMapGrid2d");
+ glad_glMapGrid2f = (PFNGLMAPGRID2FPROC) load(userptr, "glMapGrid2f");
+ glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf");
+ glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv");
+ glad_glMateriali = (PFNGLMATERIALIPROC) load(userptr, "glMateriali");
+ glad_glMaterialiv = (PFNGLMATERIALIVPROC) load(userptr, "glMaterialiv");
+ glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode");
+ glad_glMultMatrixd = (PFNGLMULTMATRIXDPROC) load(userptr, "glMultMatrixd");
+ glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf");
+ glad_glNewList = (PFNGLNEWLISTPROC) load(userptr, "glNewList");
+ glad_glNormal3b = (PFNGLNORMAL3BPROC) load(userptr, "glNormal3b");
+ glad_glNormal3bv = (PFNGLNORMAL3BVPROC) load(userptr, "glNormal3bv");
+ glad_glNormal3d = (PFNGLNORMAL3DPROC) load(userptr, "glNormal3d");
+ glad_glNormal3dv = (PFNGLNORMAL3DVPROC) load(userptr, "glNormal3dv");
+ glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f");
+ glad_glNormal3fv = (PFNGLNORMAL3FVPROC) load(userptr, "glNormal3fv");
+ glad_glNormal3i = (PFNGLNORMAL3IPROC) load(userptr, "glNormal3i");
+ glad_glNormal3iv = (PFNGLNORMAL3IVPROC) load(userptr, "glNormal3iv");
+ glad_glNormal3s = (PFNGLNORMAL3SPROC) load(userptr, "glNormal3s");
+ glad_glNormal3sv = (PFNGLNORMAL3SVPROC) load(userptr, "glNormal3sv");
+ glad_glOrtho = (PFNGLORTHOPROC) load(userptr, "glOrtho");
+ glad_glPassThrough = (PFNGLPASSTHROUGHPROC) load(userptr, "glPassThrough");
+ glad_glPixelMapfv = (PFNGLPIXELMAPFVPROC) load(userptr, "glPixelMapfv");
+ glad_glPixelMapuiv = (PFNGLPIXELMAPUIVPROC) load(userptr, "glPixelMapuiv");
+ glad_glPixelMapusv = (PFNGLPIXELMAPUSVPROC) load(userptr, "glPixelMapusv");
+ glad_glPixelStoref = (PFNGLPIXELSTOREFPROC) load(userptr, "glPixelStoref");
+ glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei");
+ glad_glPixelTransferf = (PFNGLPIXELTRANSFERFPROC) load(userptr, "glPixelTransferf");
+ glad_glPixelTransferi = (PFNGLPIXELTRANSFERIPROC) load(userptr, "glPixelTransferi");
+ glad_glPixelZoom = (PFNGLPIXELZOOMPROC) load(userptr, "glPixelZoom");
+ glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize");
+ glad_glPolygonMode = (PFNGLPOLYGONMODEPROC) load(userptr, "glPolygonMode");
+ glad_glPolygonStipple = (PFNGLPOLYGONSTIPPLEPROC) load(userptr, "glPolygonStipple");
+ glad_glPopAttrib = (PFNGLPOPATTRIBPROC) load(userptr, "glPopAttrib");
+ glad_glPopMatrix = (PFNGLPOPMATRIXPROC) load(userptr, "glPopMatrix");
+ glad_glPopName = (PFNGLPOPNAMEPROC) load(userptr, "glPopName");
+ glad_glPushAttrib = (PFNGLPUSHATTRIBPROC) load(userptr, "glPushAttrib");
+ glad_glPushMatrix = (PFNGLPUSHMATRIXPROC) load(userptr, "glPushMatrix");
+ glad_glPushName = (PFNGLPUSHNAMEPROC) load(userptr, "glPushName");
+ glad_glRasterPos2d = (PFNGLRASTERPOS2DPROC) load(userptr, "glRasterPos2d");
+ glad_glRasterPos2dv = (PFNGLRASTERPOS2DVPROC) load(userptr, "glRasterPos2dv");
+ glad_glRasterPos2f = (PFNGLRASTERPOS2FPROC) load(userptr, "glRasterPos2f");
+ glad_glRasterPos2fv = (PFNGLRASTERPOS2FVPROC) load(userptr, "glRasterPos2fv");
+ glad_glRasterPos2i = (PFNGLRASTERPOS2IPROC) load(userptr, "glRasterPos2i");
+ glad_glRasterPos2iv = (PFNGLRASTERPOS2IVPROC) load(userptr, "glRasterPos2iv");
+ glad_glRasterPos2s = (PFNGLRASTERPOS2SPROC) load(userptr, "glRasterPos2s");
+ glad_glRasterPos2sv = (PFNGLRASTERPOS2SVPROC) load(userptr, "glRasterPos2sv");
+ glad_glRasterPos3d = (PFNGLRASTERPOS3DPROC) load(userptr, "glRasterPos3d");
+ glad_glRasterPos3dv = (PFNGLRASTERPOS3DVPROC) load(userptr, "glRasterPos3dv");
+ glad_glRasterPos3f = (PFNGLRASTERPOS3FPROC) load(userptr, "glRasterPos3f");
+ glad_glRasterPos3fv = (PFNGLRASTERPOS3FVPROC) load(userptr, "glRasterPos3fv");
+ glad_glRasterPos3i = (PFNGLRASTERPOS3IPROC) load(userptr, "glRasterPos3i");
+ glad_glRasterPos3iv = (PFNGLRASTERPOS3IVPROC) load(userptr, "glRasterPos3iv");
+ glad_glRasterPos3s = (PFNGLRASTERPOS3SPROC) load(userptr, "glRasterPos3s");
+ glad_glRasterPos3sv = (PFNGLRASTERPOS3SVPROC) load(userptr, "glRasterPos3sv");
+ glad_glRasterPos4d = (PFNGLRASTERPOS4DPROC) load(userptr, "glRasterPos4d");
+ glad_glRasterPos4dv = (PFNGLRASTERPOS4DVPROC) load(userptr, "glRasterPos4dv");
+ glad_glRasterPos4f = (PFNGLRASTERPOS4FPROC) load(userptr, "glRasterPos4f");
+ glad_glRasterPos4fv = (PFNGLRASTERPOS4FVPROC) load(userptr, "glRasterPos4fv");
+ glad_glRasterPos4i = (PFNGLRASTERPOS4IPROC) load(userptr, "glRasterPos4i");
+ glad_glRasterPos4iv = (PFNGLRASTERPOS4IVPROC) load(userptr, "glRasterPos4iv");
+ glad_glRasterPos4s = (PFNGLRASTERPOS4SPROC) load(userptr, "glRasterPos4s");
+ glad_glRasterPos4sv = (PFNGLRASTERPOS4SVPROC) load(userptr, "glRasterPos4sv");
+ glad_glReadBuffer = (PFNGLREADBUFFERPROC) load(userptr, "glReadBuffer");
+ glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels");
+ glad_glRectd = (PFNGLRECTDPROC) load(userptr, "glRectd");
+ glad_glRectdv = (PFNGLRECTDVPROC) load(userptr, "glRectdv");
+ glad_glRectf = (PFNGLRECTFPROC) load(userptr, "glRectf");
+ glad_glRectfv = (PFNGLRECTFVPROC) load(userptr, "glRectfv");
+ glad_glRecti = (PFNGLRECTIPROC) load(userptr, "glRecti");
+ glad_glRectiv = (PFNGLRECTIVPROC) load(userptr, "glRectiv");
+ glad_glRects = (PFNGLRECTSPROC) load(userptr, "glRects");
+ glad_glRectsv = (PFNGLRECTSVPROC) load(userptr, "glRectsv");
+ glad_glRenderMode = (PFNGLRENDERMODEPROC) load(userptr, "glRenderMode");
+ glad_glRotated = (PFNGLROTATEDPROC) load(userptr, "glRotated");
+ glad_glRotatef = (PFNGLROTATEFPROC) load(userptr, "glRotatef");
+ glad_glScaled = (PFNGLSCALEDPROC) load(userptr, "glScaled");
+ glad_glScalef = (PFNGLSCALEFPROC) load(userptr, "glScalef");
+ glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor");
+ glad_glSelectBuffer = (PFNGLSELECTBUFFERPROC) load(userptr, "glSelectBuffer");
+ glad_glShadeModel = (PFNGLSHADEMODELPROC) load(userptr, "glShadeModel");
+ glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc");
+ glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask");
+ glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp");
+ glad_glTexCoord1d = (PFNGLTEXCOORD1DPROC) load(userptr, "glTexCoord1d");
+ glad_glTexCoord1dv = (PFNGLTEXCOORD1DVPROC) load(userptr, "glTexCoord1dv");
+ glad_glTexCoord1f = (PFNGLTEXCOORD1FPROC) load(userptr, "glTexCoord1f");
+ glad_glTexCoord1fv = (PFNGLTEXCOORD1FVPROC) load(userptr, "glTexCoord1fv");
+ glad_glTexCoord1i = (PFNGLTEXCOORD1IPROC) load(userptr, "glTexCoord1i");
+ glad_glTexCoord1iv = (PFNGLTEXCOORD1IVPROC) load(userptr, "glTexCoord1iv");
+ glad_glTexCoord1s = (PFNGLTEXCOORD1SPROC) load(userptr, "glTexCoord1s");
+ glad_glTexCoord1sv = (PFNGLTEXCOORD1SVPROC) load(userptr, "glTexCoord1sv");
+ glad_glTexCoord2d = (PFNGLTEXCOORD2DPROC) load(userptr, "glTexCoord2d");
+ glad_glTexCoord2dv = (PFNGLTEXCOORD2DVPROC) load(userptr, "glTexCoord2dv");
+ glad_glTexCoord2f = (PFNGLTEXCOORD2FPROC) load(userptr, "glTexCoord2f");
+ glad_glTexCoord2fv = (PFNGLTEXCOORD2FVPROC) load(userptr, "glTexCoord2fv");
+ glad_glTexCoord2i = (PFNGLTEXCOORD2IPROC) load(userptr, "glTexCoord2i");
+ glad_glTexCoord2iv = (PFNGLTEXCOORD2IVPROC) load(userptr, "glTexCoord2iv");
+ glad_glTexCoord2s = (PFNGLTEXCOORD2SPROC) load(userptr, "glTexCoord2s");
+ glad_glTexCoord2sv = (PFNGLTEXCOORD2SVPROC) load(userptr, "glTexCoord2sv");
+ glad_glTexCoord3d = (PFNGLTEXCOORD3DPROC) load(userptr, "glTexCoord3d");
+ glad_glTexCoord3dv = (PFNGLTEXCOORD3DVPROC) load(userptr, "glTexCoord3dv");
+ glad_glTexCoord3f = (PFNGLTEXCOORD3FPROC) load(userptr, "glTexCoord3f");
+ glad_glTexCoord3fv = (PFNGLTEXCOORD3FVPROC) load(userptr, "glTexCoord3fv");
+ glad_glTexCoord3i = (PFNGLTEXCOORD3IPROC) load(userptr, "glTexCoord3i");
+ glad_glTexCoord3iv = (PFNGLTEXCOORD3IVPROC) load(userptr, "glTexCoord3iv");
+ glad_glTexCoord3s = (PFNGLTEXCOORD3SPROC) load(userptr, "glTexCoord3s");
+ glad_glTexCoord3sv = (PFNGLTEXCOORD3SVPROC) load(userptr, "glTexCoord3sv");
+ glad_glTexCoord4d = (PFNGLTEXCOORD4DPROC) load(userptr, "glTexCoord4d");
+ glad_glTexCoord4dv = (PFNGLTEXCOORD4DVPROC) load(userptr, "glTexCoord4dv");
+ glad_glTexCoord4f = (PFNGLTEXCOORD4FPROC) load(userptr, "glTexCoord4f");
+ glad_glTexCoord4fv = (PFNGLTEXCOORD4FVPROC) load(userptr, "glTexCoord4fv");
+ glad_glTexCoord4i = (PFNGLTEXCOORD4IPROC) load(userptr, "glTexCoord4i");
+ glad_glTexCoord4iv = (PFNGLTEXCOORD4IVPROC) load(userptr, "glTexCoord4iv");
+ glad_glTexCoord4s = (PFNGLTEXCOORD4SPROC) load(userptr, "glTexCoord4s");
+ glad_glTexCoord4sv = (PFNGLTEXCOORD4SVPROC) load(userptr, "glTexCoord4sv");
+ glad_glTexEnvf = (PFNGLTEXENVFPROC) load(userptr, "glTexEnvf");
+ glad_glTexEnvfv = (PFNGLTEXENVFVPROC) load(userptr, "glTexEnvfv");
+ glad_glTexEnvi = (PFNGLTEXENVIPROC) load(userptr, "glTexEnvi");
+ glad_glTexEnviv = (PFNGLTEXENVIVPROC) load(userptr, "glTexEnviv");
+ glad_glTexGend = (PFNGLTEXGENDPROC) load(userptr, "glTexGend");
+ glad_glTexGendv = (PFNGLTEXGENDVPROC) load(userptr, "glTexGendv");
+ glad_glTexGenf = (PFNGLTEXGENFPROC) load(userptr, "glTexGenf");
+ glad_glTexGenfv = (PFNGLTEXGENFVPROC) load(userptr, "glTexGenfv");
+ glad_glTexGeni = (PFNGLTEXGENIPROC) load(userptr, "glTexGeni");
+ glad_glTexGeniv = (PFNGLTEXGENIVPROC) load(userptr, "glTexGeniv");
+ glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC) load(userptr, "glTexImage1D");
+ glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D");
+ glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf");
+ glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv");
+ glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri");
+ glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv");
+ glad_glTranslated = (PFNGLTRANSLATEDPROC) load(userptr, "glTranslated");
+ glad_glTranslatef = (PFNGLTRANSLATEFPROC) load(userptr, "glTranslatef");
+ glad_glVertex2d = (PFNGLVERTEX2DPROC) load(userptr, "glVertex2d");
+ glad_glVertex2dv = (PFNGLVERTEX2DVPROC) load(userptr, "glVertex2dv");
+ glad_glVertex2f = (PFNGLVERTEX2FPROC) load(userptr, "glVertex2f");
+ glad_glVertex2fv = (PFNGLVERTEX2FVPROC) load(userptr, "glVertex2fv");
+ glad_glVertex2i = (PFNGLVERTEX2IPROC) load(userptr, "glVertex2i");
+ glad_glVertex2iv = (PFNGLVERTEX2IVPROC) load(userptr, "glVertex2iv");
+ glad_glVertex2s = (PFNGLVERTEX2SPROC) load(userptr, "glVertex2s");
+ glad_glVertex2sv = (PFNGLVERTEX2SVPROC) load(userptr, "glVertex2sv");
+ glad_glVertex3d = (PFNGLVERTEX3DPROC) load(userptr, "glVertex3d");
+ glad_glVertex3dv = (PFNGLVERTEX3DVPROC) load(userptr, "glVertex3dv");
+ glad_glVertex3f = (PFNGLVERTEX3FPROC) load(userptr, "glVertex3f");
+ glad_glVertex3fv = (PFNGLVERTEX3FVPROC) load(userptr, "glVertex3fv");
+ glad_glVertex3i = (PFNGLVERTEX3IPROC) load(userptr, "glVertex3i");
+ glad_glVertex3iv = (PFNGLVERTEX3IVPROC) load(userptr, "glVertex3iv");
+ glad_glVertex3s = (PFNGLVERTEX3SPROC) load(userptr, "glVertex3s");
+ glad_glVertex3sv = (PFNGLVERTEX3SVPROC) load(userptr, "glVertex3sv");
+ glad_glVertex4d = (PFNGLVERTEX4DPROC) load(userptr, "glVertex4d");
+ glad_glVertex4dv = (PFNGLVERTEX4DVPROC) load(userptr, "glVertex4dv");
+ glad_glVertex4f = (PFNGLVERTEX4FPROC) load(userptr, "glVertex4f");
+ glad_glVertex4fv = (PFNGLVERTEX4FVPROC) load(userptr, "glVertex4fv");
+ glad_glVertex4i = (PFNGLVERTEX4IPROC) load(userptr, "glVertex4i");
+ glad_glVertex4iv = (PFNGLVERTEX4IVPROC) load(userptr, "glVertex4iv");
+ glad_glVertex4s = (PFNGLVERTEX4SPROC) load(userptr, "glVertex4s");
+ glad_glVertex4sv = (PFNGLVERTEX4SVPROC) load(userptr, "glVertex4sv");
+ glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport");
+}
+static void glad_gl_load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_VERSION_1_1) return;
+ glad_glAreTexturesResident = (PFNGLARETEXTURESRESIDENTPROC) load(userptr, "glAreTexturesResident");
+ glad_glArrayElement = (PFNGLARRAYELEMENTPROC) load(userptr, "glArrayElement");
+ glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture");
+ glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer");
+ glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D");
+ glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D");
+ glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D");
+ glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D");
+ glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures");
+ glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState");
+ glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays");
+ glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements");
+ glad_glEdgeFlagPointer = (PFNGLEDGEFLAGPOINTERPROC) load(userptr, "glEdgeFlagPointer");
+ glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState");
+ glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glIndexPointer = (PFNGLINDEXPOINTERPROC) load(userptr, "glIndexPointer");
+ glad_glIndexub = (PFNGLINDEXUBPROC) load(userptr, "glIndexub");
+ glad_glIndexubv = (PFNGLINDEXUBVPROC) load(userptr, "glIndexubv");
+ glad_glInterleavedArrays = (PFNGLINTERLEAVEDARRAYSPROC) load(userptr, "glInterleavedArrays");
+ glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture");
+ glad_glNormalPointer = (PFNGLNORMALPOINTERPROC) load(userptr, "glNormalPointer");
+ glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset");
+ glad_glPopClientAttrib = (PFNGLPOPCLIENTATTRIBPROC) load(userptr, "glPopClientAttrib");
+ glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(userptr, "glPrioritizeTextures");
+ glad_glPushClientAttrib = (PFNGLPUSHCLIENTATTRIBPROC) load(userptr, "glPushClientAttrib");
+ glad_glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load(userptr, "glTexCoordPointer");
+ glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D");
+ glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D");
+ glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer");
+}
+static void glad_gl_load_GL_VERSION_ES_CM_1_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_VERSION_ES_CM_1_0) return;
+ glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture");
+ glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc");
+ glad_glAlphaFuncx = (PFNGLALPHAFUNCXPROC) load(userptr, "glAlphaFuncx");
+ glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer");
+ glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture");
+ glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc");
+ glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData");
+ glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData");
+ glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear");
+ glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor");
+ glad_glClearColorx = (PFNGLCLEARCOLORXPROC) load(userptr, "glClearColorx");
+ glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf");
+ glad_glClearDepthx = (PFNGLCLEARDEPTHXPROC) load(userptr, "glClearDepthx");
+ glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil");
+ glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture");
+ glad_glClipPlanef = (PFNGLCLIPPLANEFPROC) load(userptr, "glClipPlanef");
+ glad_glClipPlanex = (PFNGLCLIPPLANEXPROC) load(userptr, "glClipPlanex");
+ glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f");
+ glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub");
+ glad_glColor4x = (PFNGLCOLOR4XPROC) load(userptr, "glColor4x");
+ glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask");
+ glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer");
+ glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D");
+ glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D");
+ glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D");
+ glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D");
+ glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace");
+ glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers");
+ glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures");
+ glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc");
+ glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask");
+ glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef");
+ glad_glDepthRangex = (PFNGLDEPTHRANGEXPROC) load(userptr, "glDepthRangex");
+ glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable");
+ glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState");
+ glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays");
+ glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements");
+ glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable");
+ glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState");
+ glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish");
+ glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush");
+ glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf");
+ glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv");
+ glad_glFogx = (PFNGLFOGXPROC) load(userptr, "glFogx");
+ glad_glFogxv = (PFNGLFOGXVPROC) load(userptr, "glFogxv");
+ glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace");
+ glad_glFrustumf = (PFNGLFRUSTUMFPROC) load(userptr, "glFrustumf");
+ glad_glFrustumx = (PFNGLFRUSTUMXPROC) load(userptr, "glFrustumx");
+ glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers");
+ glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures");
+ glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv");
+ glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv");
+ glad_glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC) load(userptr, "glGetClipPlanef");
+ glad_glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC) load(userptr, "glGetClipPlanex");
+ glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError");
+ glad_glGetFixedv = (PFNGLGETFIXEDVPROC) load(userptr, "glGetFixedv");
+ glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv");
+ glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv");
+ glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv");
+ glad_glGetLightxv = (PFNGLGETLIGHTXVPROC) load(userptr, "glGetLightxv");
+ glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv");
+ glad_glGetMaterialxv = (PFNGLGETMATERIALXVPROC) load(userptr, "glGetMaterialxv");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv");
+ glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv");
+ glad_glGetTexEnvxv = (PFNGLGETTEXENVXVPROC) load(userptr, "glGetTexEnvxv");
+ glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv");
+ glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv");
+ glad_glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC) load(userptr, "glGetTexParameterxv");
+ glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint");
+ glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer");
+ glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled");
+ glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture");
+ glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf");
+ glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv");
+ glad_glLightModelx = (PFNGLLIGHTMODELXPROC) load(userptr, "glLightModelx");
+ glad_glLightModelxv = (PFNGLLIGHTMODELXVPROC) load(userptr, "glLightModelxv");
+ glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf");
+ glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv");
+ glad_glLightx = (PFNGLLIGHTXPROC) load(userptr, "glLightx");
+ glad_glLightxv = (PFNGLLIGHTXVPROC) load(userptr, "glLightxv");
+ glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth");
+ glad_glLineWidthx = (PFNGLLINEWIDTHXPROC) load(userptr, "glLineWidthx");
+ glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity");
+ glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf");
+ glad_glLoadMatrixx = (PFNGLLOADMATRIXXPROC) load(userptr, "glLoadMatrixx");
+ glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp");
+ glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf");
+ glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv");
+ glad_glMaterialx = (PFNGLMATERIALXPROC) load(userptr, "glMaterialx");
+ glad_glMaterialxv = (PFNGLMATERIALXVPROC) load(userptr, "glMaterialxv");
+ glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode");
+ glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf");
+ glad_glMultMatrixx = (PFNGLMULTMATRIXXPROC) load(userptr, "glMultMatrixx");
+ glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f");
+ glad_glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC) load(userptr, "glMultiTexCoord4x");
+ glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f");
+ glad_glNormal3x = (PFNGLNORMAL3XPROC) load(userptr, "glNormal3x");
+ glad_glNormalPointer = (PFNGLNORMALPOINTERPROC) load(userptr, "glNormalPointer");
+ glad_glOrthof = (PFNGLORTHOFPROC) load(userptr, "glOrthof");
+ glad_glOrthox = (PFNGLORTHOXPROC) load(userptr, "glOrthox");
+ glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei");
+ glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(userptr, "glPointParameterf");
+ glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(userptr, "glPointParameterfv");
+ glad_glPointParameterx = (PFNGLPOINTPARAMETERXPROC) load(userptr, "glPointParameterx");
+ glad_glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC) load(userptr, "glPointParameterxv");
+ glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize");
+ glad_glPointSizex = (PFNGLPOINTSIZEXPROC) load(userptr, "glPointSizex");
+ glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset");
+ glad_glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC) load(userptr, "glPolygonOffsetx");
+ glad_glPopMatrix = (PFNGLPOPMATRIXPROC) load(userptr, "glPopMatrix");
+ glad_glPushMatrix = (PFNGLPUSHMATRIXPROC) load(userptr, "glPushMatrix");
+ glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels");
+ glad_glRotatef = (PFNGLROTATEFPROC) load(userptr, "glRotatef");
+ glad_glRotatex = (PFNGLROTATEXPROC) load(userptr, "glRotatex");
+ glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage");
+ glad_glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC) load(userptr, "glSampleCoveragex");
+ glad_glScalef = (PFNGLSCALEFPROC) load(userptr, "glScalef");
+ glad_glScalex = (PFNGLSCALEXPROC) load(userptr, "glScalex");
+ glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor");
+ glad_glShadeModel = (PFNGLSHADEMODELPROC) load(userptr, "glShadeModel");
+ glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc");
+ glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask");
+ glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp");
+ glad_glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load(userptr, "glTexCoordPointer");
+ glad_glTexEnvf = (PFNGLTEXENVFPROC) load(userptr, "glTexEnvf");
+ glad_glTexEnvfv = (PFNGLTEXENVFVPROC) load(userptr, "glTexEnvfv");
+ glad_glTexEnvi = (PFNGLTEXENVIPROC) load(userptr, "glTexEnvi");
+ glad_glTexEnviv = (PFNGLTEXENVIVPROC) load(userptr, "glTexEnviv");
+ glad_glTexEnvx = (PFNGLTEXENVXPROC) load(userptr, "glTexEnvx");
+ glad_glTexEnvxv = (PFNGLTEXENVXVPROC) load(userptr, "glTexEnvxv");
+ glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D");
+ glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf");
+ glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv");
+ glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri");
+ glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv");
+ glad_glTexParameterx = (PFNGLTEXPARAMETERXPROC) load(userptr, "glTexParameterx");
+ glad_glTexParameterxv = (PFNGLTEXPARAMETERXVPROC) load(userptr, "glTexParameterxv");
+ glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D");
+ glad_glTranslatef = (PFNGLTRANSLATEFPROC) load(userptr, "glTranslatef");
+ glad_glTranslatex = (PFNGLTRANSLATEXPROC) load(userptr, "glTranslatex");
+ glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer");
+ glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport");
+}
+static void glad_gl_load_GL_ARB_copy_buffer( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_copy_buffer) return;
+ glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData");
+}
+static void glad_gl_load_GL_ARB_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_framebuffer_object) return;
+ glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer");
+ glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer");
+ glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer");
+ glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus");
+ glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers");
+ glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers");
+ glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer");
+ glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D");
+ glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D");
+ glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D");
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers");
+ glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers");
+ glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap");
+ glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv");
+ glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv");
+ glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer");
+ glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer");
+ glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage");
+ glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample");
+}
+static void glad_gl_load_GL_ARB_geometry_shader4( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_geometry_shader4) return;
+ glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture");
+ glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC) load(userptr, "glFramebufferTextureARB");
+ glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB");
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) load(userptr, "glFramebufferTextureLayerARB");
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+ glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC) load(userptr, "glProgramParameteriARB");
+}
+static void glad_gl_load_GL_ARB_get_program_binary( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_get_program_binary) return;
+ glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary");
+ glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary");
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+}
+static void glad_gl_load_GL_ARB_imaging( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_imaging) return;
+ glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor");
+ glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation");
+ glad_glColorSubTable = (PFNGLCOLORSUBTABLEPROC) load(userptr, "glColorSubTable");
+ glad_glColorTable = (PFNGLCOLORTABLEPROC) load(userptr, "glColorTable");
+ glad_glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC) load(userptr, "glColorTableParameterfv");
+ glad_glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC) load(userptr, "glColorTableParameteriv");
+ glad_glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC) load(userptr, "glConvolutionFilter1D");
+ glad_glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC) load(userptr, "glConvolutionFilter2D");
+ glad_glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC) load(userptr, "glConvolutionParameterf");
+ glad_glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC) load(userptr, "glConvolutionParameterfv");
+ glad_glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC) load(userptr, "glConvolutionParameteri");
+ glad_glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC) load(userptr, "glConvolutionParameteriv");
+ glad_glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC) load(userptr, "glCopyColorSubTable");
+ glad_glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC) load(userptr, "glCopyColorTable");
+ glad_glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC) load(userptr, "glCopyConvolutionFilter1D");
+ glad_glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC) load(userptr, "glCopyConvolutionFilter2D");
+ glad_glGetColorTable = (PFNGLGETCOLORTABLEPROC) load(userptr, "glGetColorTable");
+ glad_glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC) load(userptr, "glGetColorTableParameterfv");
+ glad_glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC) load(userptr, "glGetColorTableParameteriv");
+ glad_glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC) load(userptr, "glGetConvolutionFilter");
+ glad_glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC) load(userptr, "glGetConvolutionParameterfv");
+ glad_glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC) load(userptr, "glGetConvolutionParameteriv");
+ glad_glGetHistogram = (PFNGLGETHISTOGRAMPROC) load(userptr, "glGetHistogram");
+ glad_glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC) load(userptr, "glGetHistogramParameterfv");
+ glad_glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC) load(userptr, "glGetHistogramParameteriv");
+ glad_glGetMinmax = (PFNGLGETMINMAXPROC) load(userptr, "glGetMinmax");
+ glad_glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC) load(userptr, "glGetMinmaxParameterfv");
+ glad_glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC) load(userptr, "glGetMinmaxParameteriv");
+ glad_glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC) load(userptr, "glGetSeparableFilter");
+ glad_glHistogram = (PFNGLHISTOGRAMPROC) load(userptr, "glHistogram");
+ glad_glMinmax = (PFNGLMINMAXPROC) load(userptr, "glMinmax");
+ glad_glResetHistogram = (PFNGLRESETHISTOGRAMPROC) load(userptr, "glResetHistogram");
+ glad_glResetMinmax = (PFNGLRESETMINMAXPROC) load(userptr, "glResetMinmax");
+ glad_glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC) load(userptr, "glSeparableFilter2D");
+}
+static void glad_gl_load_GL_ARB_multitexture( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_multitexture) return;
+ glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture");
+ glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) load(userptr, "glActiveTextureARB");
+ glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture");
+ glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) load(userptr, "glClientActiveTextureARB");
+ glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC) load(userptr, "glMultiTexCoord1d");
+ glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC) load(userptr, "glMultiTexCoord1dARB");
+ glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC) load(userptr, "glMultiTexCoord1dv");
+ glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC) load(userptr, "glMultiTexCoord1dvARB");
+ glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC) load(userptr, "glMultiTexCoord1f");
+ glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC) load(userptr, "glMultiTexCoord1fARB");
+ glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC) load(userptr, "glMultiTexCoord1fv");
+ glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC) load(userptr, "glMultiTexCoord1fvARB");
+ glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC) load(userptr, "glMultiTexCoord1i");
+ glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC) load(userptr, "glMultiTexCoord1iARB");
+ glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC) load(userptr, "glMultiTexCoord1iv");
+ glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC) load(userptr, "glMultiTexCoord1ivARB");
+ glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC) load(userptr, "glMultiTexCoord1s");
+ glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC) load(userptr, "glMultiTexCoord1sARB");
+ glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC) load(userptr, "glMultiTexCoord1sv");
+ glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC) load(userptr, "glMultiTexCoord1svARB");
+ glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC) load(userptr, "glMultiTexCoord2d");
+ glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC) load(userptr, "glMultiTexCoord2dARB");
+ glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC) load(userptr, "glMultiTexCoord2dv");
+ glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC) load(userptr, "glMultiTexCoord2dvARB");
+ glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) load(userptr, "glMultiTexCoord2f");
+ glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) load(userptr, "glMultiTexCoord2fARB");
+ glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) load(userptr, "glMultiTexCoord2fv");
+ glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC) load(userptr, "glMultiTexCoord2fvARB");
+ glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC) load(userptr, "glMultiTexCoord2i");
+ glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC) load(userptr, "glMultiTexCoord2iARB");
+ glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC) load(userptr, "glMultiTexCoord2iv");
+ glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC) load(userptr, "glMultiTexCoord2ivARB");
+ glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC) load(userptr, "glMultiTexCoord2s");
+ glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC) load(userptr, "glMultiTexCoord2sARB");
+ glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC) load(userptr, "glMultiTexCoord2sv");
+ glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC) load(userptr, "glMultiTexCoord2svARB");
+ glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC) load(userptr, "glMultiTexCoord3d");
+ glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC) load(userptr, "glMultiTexCoord3dARB");
+ glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC) load(userptr, "glMultiTexCoord3dv");
+ glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC) load(userptr, "glMultiTexCoord3dvARB");
+ glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC) load(userptr, "glMultiTexCoord3f");
+ glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC) load(userptr, "glMultiTexCoord3fARB");
+ glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC) load(userptr, "glMultiTexCoord3fv");
+ glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC) load(userptr, "glMultiTexCoord3fvARB");
+ glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC) load(userptr, "glMultiTexCoord3i");
+ glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC) load(userptr, "glMultiTexCoord3iARB");
+ glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC) load(userptr, "glMultiTexCoord3iv");
+ glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC) load(userptr, "glMultiTexCoord3ivARB");
+ glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC) load(userptr, "glMultiTexCoord3s");
+ glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC) load(userptr, "glMultiTexCoord3sARB");
+ glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC) load(userptr, "glMultiTexCoord3sv");
+ glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC) load(userptr, "glMultiTexCoord3svARB");
+ glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC) load(userptr, "glMultiTexCoord4d");
+ glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC) load(userptr, "glMultiTexCoord4dARB");
+ glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC) load(userptr, "glMultiTexCoord4dv");
+ glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC) load(userptr, "glMultiTexCoord4dvARB");
+ glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f");
+ glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC) load(userptr, "glMultiTexCoord4fARB");
+ glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC) load(userptr, "glMultiTexCoord4fv");
+ glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC) load(userptr, "glMultiTexCoord4fvARB");
+ glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC) load(userptr, "glMultiTexCoord4i");
+ glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC) load(userptr, "glMultiTexCoord4iARB");
+ glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC) load(userptr, "glMultiTexCoord4iv");
+ glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC) load(userptr, "glMultiTexCoord4ivARB");
+ glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC) load(userptr, "glMultiTexCoord4s");
+ glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC) load(userptr, "glMultiTexCoord4sARB");
+ glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC) load(userptr, "glMultiTexCoord4sv");
+ glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC) load(userptr, "glMultiTexCoord4svARB");
+}
+static void glad_gl_load_GL_ARB_separate_shader_objects( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_separate_shader_objects) return;
+ glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram");
+ glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(userptr, "glBindProgramPipeline");
+ glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(userptr, "glCreateShaderProgramv");
+ glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(userptr, "glDeleteProgramPipelines");
+ glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(userptr, "glGenProgramPipelines");
+ glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(userptr, "glGetProgramPipelineInfoLog");
+ glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(userptr, "glGetProgramPipelineiv");
+ glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(userptr, "glIsProgramPipeline");
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+ glad_glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load(userptr, "glProgramUniform1d");
+ glad_glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load(userptr, "glProgramUniform1dv");
+ glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(userptr, "glProgramUniform1f");
+ glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(userptr, "glProgramUniform1fv");
+ glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(userptr, "glProgramUniform1i");
+ glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(userptr, "glProgramUniform1iv");
+ glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(userptr, "glProgramUniform1ui");
+ glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(userptr, "glProgramUniform1uiv");
+ glad_glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load(userptr, "glProgramUniform2d");
+ glad_glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load(userptr, "glProgramUniform2dv");
+ glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(userptr, "glProgramUniform2f");
+ glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(userptr, "glProgramUniform2fv");
+ glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(userptr, "glProgramUniform2i");
+ glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(userptr, "glProgramUniform2iv");
+ glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(userptr, "glProgramUniform2ui");
+ glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(userptr, "glProgramUniform2uiv");
+ glad_glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load(userptr, "glProgramUniform3d");
+ glad_glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load(userptr, "glProgramUniform3dv");
+ glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(userptr, "glProgramUniform3f");
+ glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(userptr, "glProgramUniform3fv");
+ glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(userptr, "glProgramUniform3i");
+ glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(userptr, "glProgramUniform3iv");
+ glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(userptr, "glProgramUniform3ui");
+ glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(userptr, "glProgramUniform3uiv");
+ glad_glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load(userptr, "glProgramUniform4d");
+ glad_glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load(userptr, "glProgramUniform4dv");
+ glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(userptr, "glProgramUniform4f");
+ glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(userptr, "glProgramUniform4fv");
+ glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(userptr, "glProgramUniform4i");
+ glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(userptr, "glProgramUniform4iv");
+ glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(userptr, "glProgramUniform4ui");
+ glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(userptr, "glProgramUniform4uiv");
+ glad_glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load(userptr, "glProgramUniformMatrix2dv");
+ glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(userptr, "glProgramUniformMatrix2fv");
+ glad_glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load(userptr, "glProgramUniformMatrix2x3dv");
+ glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(userptr, "glProgramUniformMatrix2x3fv");
+ glad_glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load(userptr, "glProgramUniformMatrix2x4dv");
+ glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(userptr, "glProgramUniformMatrix2x4fv");
+ glad_glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load(userptr, "glProgramUniformMatrix3dv");
+ glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(userptr, "glProgramUniformMatrix3fv");
+ glad_glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load(userptr, "glProgramUniformMatrix3x2dv");
+ glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(userptr, "glProgramUniformMatrix3x2fv");
+ glad_glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load(userptr, "glProgramUniformMatrix3x4dv");
+ glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(userptr, "glProgramUniformMatrix3x4fv");
+ glad_glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load(userptr, "glProgramUniformMatrix4dv");
+ glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(userptr, "glProgramUniformMatrix4fv");
+ glad_glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load(userptr, "glProgramUniformMatrix4x2dv");
+ glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(userptr, "glProgramUniformMatrix4x2fv");
+ glad_glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load(userptr, "glProgramUniformMatrix4x3dv");
+ glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(userptr, "glProgramUniformMatrix4x3fv");
+ glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages");
+ glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline");
+}
+static void glad_gl_load_GL_ARB_shader_objects( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_shader_objects) return;
+ glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) load(userptr, "glAttachObjectARB");
+ glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader");
+ glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader");
+ glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) load(userptr, "glCompileShaderARB");
+ glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram");
+ glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) load(userptr, "glCreateProgramObjectARB");
+ glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader");
+ glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) load(userptr, "glCreateShaderObjectARB");
+ glad_glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) load(userptr, "glDeleteObjectARB");
+ glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) load(userptr, "glDetachObjectARB");
+ glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader");
+ glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform");
+ glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) load(userptr, "glGetActiveUniformARB");
+ glad_glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) load(userptr, "glGetAttachedObjectsARB");
+ glad_glGetHandleARB = (PFNGLGETHANDLEARBPROC) load(userptr, "glGetHandleARB");
+ glad_glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) load(userptr, "glGetInfoLogARB");
+ glad_glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) load(userptr, "glGetObjectParameterfvARB");
+ glad_glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) load(userptr, "glGetObjectParameterivARB");
+ glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource");
+ glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) load(userptr, "glGetShaderSourceARB");
+ glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation");
+ glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) load(userptr, "glGetUniformLocationARB");
+ glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv");
+ glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) load(userptr, "glGetUniformfvARB");
+ glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv");
+ glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) load(userptr, "glGetUniformivARB");
+ glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram");
+ glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) load(userptr, "glLinkProgramARB");
+ glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource");
+ glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) load(userptr, "glShaderSourceARB");
+ glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f");
+ glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC) load(userptr, "glUniform1fARB");
+ glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv");
+ glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) load(userptr, "glUniform1fvARB");
+ glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i");
+ glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC) load(userptr, "glUniform1iARB");
+ glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv");
+ glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) load(userptr, "glUniform1ivARB");
+ glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f");
+ glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC) load(userptr, "glUniform2fARB");
+ glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv");
+ glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) load(userptr, "glUniform2fvARB");
+ glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i");
+ glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC) load(userptr, "glUniform2iARB");
+ glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv");
+ glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) load(userptr, "glUniform2ivARB");
+ glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f");
+ glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC) load(userptr, "glUniform3fARB");
+ glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv");
+ glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) load(userptr, "glUniform3fvARB");
+ glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i");
+ glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC) load(userptr, "glUniform3iARB");
+ glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv");
+ glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) load(userptr, "glUniform3ivARB");
+ glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f");
+ glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC) load(userptr, "glUniform4fARB");
+ glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv");
+ glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) load(userptr, "glUniform4fvARB");
+ glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i");
+ glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC) load(userptr, "glUniform4iARB");
+ glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv");
+ glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) load(userptr, "glUniform4ivARB");
+ glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv");
+ glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) load(userptr, "glUniformMatrix2fvARB");
+ glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv");
+ glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) load(userptr, "glUniformMatrix3fvARB");
+ glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv");
+ glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) load(userptr, "glUniformMatrix4fvARB");
+ glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram");
+ glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) load(userptr, "glUseProgramObjectARB");
+ glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram");
+ glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) load(userptr, "glValidateProgramARB");
+}
+static void glad_gl_load_GL_ARB_vertex_buffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_vertex_buffer_object) return;
+ glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer");
+ glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC) load(userptr, "glBindBufferARB");
+ glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData");
+ glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC) load(userptr, "glBufferDataARB");
+ glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData");
+ glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) load(userptr, "glBufferSubDataARB");
+ glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers");
+ glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) load(userptr, "glDeleteBuffersARB");
+ glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers");
+ glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) load(userptr, "glGenBuffersARB");
+ glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv");
+ glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) load(userptr, "glGetBufferParameterivARB");
+ glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv");
+ glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) load(userptr, "glGetBufferPointervARB");
+ glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData");
+ glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) load(userptr, "glGetBufferSubDataARB");
+ glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer");
+ glad_glIsBufferARB = (PFNGLISBUFFERARBPROC) load(userptr, "glIsBufferARB");
+ glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer");
+ glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) load(userptr, "glMapBufferARB");
+ glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer");
+ glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC) load(userptr, "glUnmapBufferARB");
+}
+static void glad_gl_load_GL_ARB_vertex_program( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_vertex_program) return;
+ glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB");
+ glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB");
+ glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray");
+ glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB");
+ glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray");
+ glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB");
+ glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB");
+ glad_glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) load(userptr, "glGetProgramEnvParameterdvARB");
+ glad_glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) load(userptr, "glGetProgramEnvParameterfvARB");
+ glad_glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) load(userptr, "glGetProgramLocalParameterdvARB");
+ glad_glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) load(userptr, "glGetProgramLocalParameterfvARB");
+ glad_glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) load(userptr, "glGetProgramStringARB");
+ glad_glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) load(userptr, "glGetProgramivARB");
+ glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv");
+ glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB");
+ glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv");
+ glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB");
+ glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv");
+ glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB");
+ glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv");
+ glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB");
+ glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB");
+ glad_glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) load(userptr, "glProgramEnvParameter4dARB");
+ glad_glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) load(userptr, "glProgramEnvParameter4dvARB");
+ glad_glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) load(userptr, "glProgramEnvParameter4fARB");
+ glad_glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) load(userptr, "glProgramEnvParameter4fvARB");
+ glad_glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) load(userptr, "glProgramLocalParameter4dARB");
+ glad_glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) load(userptr, "glProgramLocalParameter4dvARB");
+ glad_glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) load(userptr, "glProgramLocalParameter4fARB");
+ glad_glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) load(userptr, "glProgramLocalParameter4fvARB");
+ glad_glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) load(userptr, "glProgramStringARB");
+ glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d");
+ glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB");
+ glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv");
+ glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB");
+ glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f");
+ glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB");
+ glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv");
+ glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB");
+ glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s");
+ glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB");
+ glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv");
+ glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB");
+ glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d");
+ glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB");
+ glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv");
+ glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB");
+ glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f");
+ glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB");
+ glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv");
+ glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB");
+ glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s");
+ glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB");
+ glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv");
+ glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB");
+ glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d");
+ glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB");
+ glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv");
+ glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB");
+ glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f");
+ glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB");
+ glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv");
+ glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB");
+ glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s");
+ glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB");
+ glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv");
+ glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB");
+ glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv");
+ glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB");
+ glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv");
+ glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB");
+ glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv");
+ glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB");
+ glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub");
+ glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB");
+ glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv");
+ glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB");
+ glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv");
+ glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB");
+ glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv");
+ glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB");
+ glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv");
+ glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB");
+ glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d");
+ glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB");
+ glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv");
+ glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB");
+ glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f");
+ glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB");
+ glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv");
+ glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB");
+ glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv");
+ glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB");
+ glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s");
+ glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB");
+ glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv");
+ glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB");
+ glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv");
+ glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB");
+ glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv");
+ glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB");
+ glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv");
+ glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB");
+ glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer");
+ glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB");
+}
+static void glad_gl_load_GL_ARB_vertex_shader( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_vertex_shader) return;
+ glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation");
+ glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) load(userptr, "glBindAttribLocationARB");
+ glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray");
+ glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB");
+ glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray");
+ glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB");
+ glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib");
+ glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) load(userptr, "glGetActiveAttribARB");
+ glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation");
+ glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) load(userptr, "glGetAttribLocationARB");
+ glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv");
+ glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB");
+ glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv");
+ glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB");
+ glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv");
+ glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB");
+ glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv");
+ glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB");
+ glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d");
+ glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB");
+ glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv");
+ glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB");
+ glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f");
+ glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB");
+ glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv");
+ glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB");
+ glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s");
+ glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB");
+ glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv");
+ glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB");
+ glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d");
+ glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB");
+ glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv");
+ glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB");
+ glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f");
+ glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB");
+ glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv");
+ glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB");
+ glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s");
+ glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB");
+ glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv");
+ glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB");
+ glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d");
+ glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB");
+ glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv");
+ glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB");
+ glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f");
+ glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB");
+ glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv");
+ glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB");
+ glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s");
+ glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB");
+ glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv");
+ glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB");
+ glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv");
+ glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB");
+ glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv");
+ glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB");
+ glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv");
+ glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB");
+ glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub");
+ glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB");
+ glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv");
+ glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB");
+ glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv");
+ glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB");
+ glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv");
+ glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB");
+ glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv");
+ glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB");
+ glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d");
+ glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB");
+ glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv");
+ glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB");
+ glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f");
+ glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB");
+ glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv");
+ glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB");
+ glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv");
+ glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB");
+ glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s");
+ glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB");
+ glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv");
+ glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB");
+ glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv");
+ glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB");
+ glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv");
+ glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB");
+ glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv");
+ glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB");
+ glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer");
+ glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB");
+}
+static void glad_gl_load_GL_EXT_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_blend_equation_separate) return;
+ glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate");
+ glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC) load(userptr, "glBlendEquationSeparateEXT");
+}
+static void glad_gl_load_GL_EXT_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_blend_func_separate) return;
+ glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate");
+ glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) load(userptr, "glBlendFuncSeparateEXT");
+}
+static void glad_gl_load_GL_EXT_blend_minmax( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_blend_minmax) return;
+ glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation");
+ glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC) load(userptr, "glBlendEquationEXT");
+}
+static void glad_gl_load_GL_EXT_copy_texture( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_copy_texture) return;
+ glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D");
+ glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC) load(userptr, "glCopyTexImage1DEXT");
+ glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D");
+ glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC) load(userptr, "glCopyTexImage2DEXT");
+ glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D");
+ glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC) load(userptr, "glCopyTexSubImage1DEXT");
+ glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D");
+ glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC) load(userptr, "glCopyTexSubImage2DEXT");
+ glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D");
+ glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC) load(userptr, "glCopyTexSubImage3DEXT");
+}
+static void glad_gl_load_GL_EXT_framebuffer_blit( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_framebuffer_blit) return;
+ glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer");
+ glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) load(userptr, "glBlitFramebufferEXT");
+}
+static void glad_gl_load_GL_EXT_framebuffer_multisample( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_framebuffer_multisample) return;
+ glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample");
+ glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) load(userptr, "glRenderbufferStorageMultisampleEXT");
+}
+static void glad_gl_load_GL_EXT_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_framebuffer_object) return;
+ glad_glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) load(userptr, "glBindFramebufferEXT");
+ glad_glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) load(userptr, "glBindRenderbufferEXT");
+ glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus");
+ glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) load(userptr, "glCheckFramebufferStatusEXT");
+ glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers");
+ glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) load(userptr, "glDeleteFramebuffersEXT");
+ glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers");
+ glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) load(userptr, "glDeleteRenderbuffersEXT");
+ glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer");
+ glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) load(userptr, "glFramebufferRenderbufferEXT");
+ glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D");
+ glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) load(userptr, "glFramebufferTexture1DEXT");
+ glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D");
+ glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) load(userptr, "glFramebufferTexture2DEXT");
+ glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D");
+ glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) load(userptr, "glFramebufferTexture3DEXT");
+ glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers");
+ glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) load(userptr, "glGenFramebuffersEXT");
+ glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers");
+ glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) load(userptr, "glGenRenderbuffersEXT");
+ glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap");
+ glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) load(userptr, "glGenerateMipmapEXT");
+ glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv");
+ glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) load(userptr, "glGetFramebufferAttachmentParameterivEXT");
+ glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv");
+ glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetRenderbufferParameterivEXT");
+ glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer");
+ glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) load(userptr, "glIsFramebufferEXT");
+ glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer");
+ glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) load(userptr, "glIsRenderbufferEXT");
+ glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage");
+ glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) load(userptr, "glRenderbufferStorageEXT");
+}
+static void glad_gl_load_GL_EXT_geometry_shader4( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_geometry_shader4) return;
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+ glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC) load(userptr, "glProgramParameteriEXT");
+}
+static void glad_gl_load_GL_EXT_subtexture( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_subtexture) return;
+ glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D");
+ glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC) load(userptr, "glTexSubImage1DEXT");
+ glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D");
+ glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC) load(userptr, "glTexSubImage2DEXT");
+}
+static void glad_gl_load_GL_EXT_texture_array( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_texture_array) return;
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT");
+}
+static void glad_gl_load_GL_EXT_texture_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_texture_object) return;
+ glad_glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC) load(userptr, "glAreTexturesResidentEXT");
+ glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture");
+ glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC) load(userptr, "glBindTextureEXT");
+ glad_glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC) load(userptr, "glDeleteTexturesEXT");
+ glad_glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC) load(userptr, "glGenTexturesEXT");
+ glad_glIsTextureEXT = (PFNGLISTEXTUREEXTPROC) load(userptr, "glIsTextureEXT");
+ glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(userptr, "glPrioritizeTextures");
+ glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC) load(userptr, "glPrioritizeTexturesEXT");
+}
+static void glad_gl_load_GL_EXT_vertex_array( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_vertex_array) return;
+ glad_glArrayElement = (PFNGLARRAYELEMENTPROC) load(userptr, "glArrayElement");
+ glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC) load(userptr, "glArrayElementEXT");
+ glad_glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC) load(userptr, "glColorPointerEXT");
+ glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays");
+ glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC) load(userptr, "glDrawArraysEXT");
+ glad_glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC) load(userptr, "glEdgeFlagPointerEXT");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC) load(userptr, "glGetPointervEXT");
+ glad_glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC) load(userptr, "glIndexPointerEXT");
+ glad_glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC) load(userptr, "glNormalPointerEXT");
+ glad_glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC) load(userptr, "glTexCoordPointerEXT");
+ glad_glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC) load(userptr, "glVertexPointerEXT");
+}
+static void glad_gl_load_GL_INGR_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_INGR_blend_func_separate) return;
+ glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate");
+ glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC) load(userptr, "glBlendFuncSeparateINGR");
+}
+static void glad_gl_load_GL_KHR_debug( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_KHR_debug) return;
+ glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback");
+ glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl");
+ glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert");
+ glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog");
+ glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel");
+ glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel");
+ glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel");
+ glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup");
+ glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup");
+}
+static void glad_gl_load_GL_NV_geometry_program4( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_NV_geometry_program4) return;
+ glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture");
+ glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC) load(userptr, "glFramebufferTextureEXT");
+ glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB");
+ glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) load(userptr, "glFramebufferTextureFaceEXT");
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT");
+ glad_glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC) load(userptr, "glProgramVertexLimitNV");
+}
+static void glad_gl_load_GL_NV_vertex_program( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_NV_vertex_program) return;
+ glad_glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC) load(userptr, "glAreProgramsResidentNV");
+ glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB");
+ glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC) load(userptr, "glBindProgramNV");
+ glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB");
+ glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC) load(userptr, "glDeleteProgramsNV");
+ glad_glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC) load(userptr, "glExecuteProgramNV");
+ glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB");
+ glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC) load(userptr, "glGenProgramsNV");
+ glad_glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC) load(userptr, "glGetProgramParameterdvNV");
+ glad_glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC) load(userptr, "glGetProgramParameterfvNV");
+ glad_glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC) load(userptr, "glGetProgramStringNV");
+ glad_glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC) load(userptr, "glGetProgramivNV");
+ glad_glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC) load(userptr, "glGetTrackMatrixivNV");
+ glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv");
+ glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC) load(userptr, "glGetVertexAttribPointervNV");
+ glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv");
+ glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) load(userptr, "glGetVertexAttribdvNV");
+ glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv");
+ glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) load(userptr, "glGetVertexAttribfvNV");
+ glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv");
+ glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) load(userptr, "glGetVertexAttribivNV");
+ glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB");
+ glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC) load(userptr, "glIsProgramNV");
+ glad_glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC) load(userptr, "glLoadProgramNV");
+ glad_glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC) load(userptr, "glProgramParameter4dNV");
+ glad_glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC) load(userptr, "glProgramParameter4dvNV");
+ glad_glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC) load(userptr, "glProgramParameter4fNV");
+ glad_glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC) load(userptr, "glProgramParameter4fvNV");
+ glad_glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC) load(userptr, "glProgramParameters4dvNV");
+ glad_glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC) load(userptr, "glProgramParameters4fvNV");
+ glad_glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC) load(userptr, "glRequestResidentProgramsNV");
+ glad_glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC) load(userptr, "glTrackMatrixNV");
+ glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d");
+ glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC) load(userptr, "glVertexAttrib1dNV");
+ glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv");
+ glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC) load(userptr, "glVertexAttrib1dvNV");
+ glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f");
+ glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC) load(userptr, "glVertexAttrib1fNV");
+ glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv");
+ glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC) load(userptr, "glVertexAttrib1fvNV");
+ glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s");
+ glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC) load(userptr, "glVertexAttrib1sNV");
+ glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv");
+ glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC) load(userptr, "glVertexAttrib1svNV");
+ glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d");
+ glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC) load(userptr, "glVertexAttrib2dNV");
+ glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv");
+ glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC) load(userptr, "glVertexAttrib2dvNV");
+ glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f");
+ glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC) load(userptr, "glVertexAttrib2fNV");
+ glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv");
+ glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC) load(userptr, "glVertexAttrib2fvNV");
+ glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s");
+ glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC) load(userptr, "glVertexAttrib2sNV");
+ glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv");
+ glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC) load(userptr, "glVertexAttrib2svNV");
+ glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d");
+ glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC) load(userptr, "glVertexAttrib3dNV");
+ glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv");
+ glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC) load(userptr, "glVertexAttrib3dvNV");
+ glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f");
+ glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC) load(userptr, "glVertexAttrib3fNV");
+ glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv");
+ glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC) load(userptr, "glVertexAttrib3fvNV");
+ glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s");
+ glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC) load(userptr, "glVertexAttrib3sNV");
+ glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv");
+ glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC) load(userptr, "glVertexAttrib3svNV");
+ glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub");
+ glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv");
+ glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d");
+ glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC) load(userptr, "glVertexAttrib4dNV");
+ glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv");
+ glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC) load(userptr, "glVertexAttrib4dvNV");
+ glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f");
+ glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC) load(userptr, "glVertexAttrib4fNV");
+ glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv");
+ glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC) load(userptr, "glVertexAttrib4fvNV");
+ glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s");
+ glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC) load(userptr, "glVertexAttrib4sNV");
+ glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv");
+ glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC) load(userptr, "glVertexAttrib4svNV");
+ glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC) load(userptr, "glVertexAttrib4ubNV");
+ glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC) load(userptr, "glVertexAttrib4ubvNV");
+ glad_glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC) load(userptr, "glVertexAttribPointerNV");
+ glad_glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC) load(userptr, "glVertexAttribs1dvNV");
+ glad_glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC) load(userptr, "glVertexAttribs1fvNV");
+ glad_glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC) load(userptr, "glVertexAttribs1svNV");
+ glad_glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC) load(userptr, "glVertexAttribs2dvNV");
+ glad_glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC) load(userptr, "glVertexAttribs2fvNV");
+ glad_glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC) load(userptr, "glVertexAttribs2svNV");
+ glad_glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC) load(userptr, "glVertexAttribs3dvNV");
+ glad_glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC) load(userptr, "glVertexAttribs3fvNV");
+ glad_glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC) load(userptr, "glVertexAttribs3svNV");
+ glad_glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC) load(userptr, "glVertexAttribs4dvNV");
+ glad_glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC) load(userptr, "glVertexAttribs4fvNV");
+ glad_glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC) load(userptr, "glVertexAttribs4svNV");
+ glad_glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC) load(userptr, "glVertexAttribs4ubvNV");
+}
+static void glad_gl_load_GL_OES_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_blend_equation_separate) return;
+ glad_glBlendEquationSeparateOES = (PFNGLBLENDEQUATIONSEPARATEOESPROC) load(userptr, "glBlendEquationSeparateOES");
+}
+static void glad_gl_load_GL_OES_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_blend_func_separate) return;
+ glad_glBlendFuncSeparateOES = (PFNGLBLENDFUNCSEPARATEOESPROC) load(userptr, "glBlendFuncSeparateOES");
+}
+static void glad_gl_load_GL_OES_blend_subtract( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_blend_subtract) return;
+ glad_glBlendEquationOES = (PFNGLBLENDEQUATIONOESPROC) load(userptr, "glBlendEquationOES");
+}
+static void glad_gl_load_GL_OES_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_framebuffer_object) return;
+ glad_glBindFramebufferOES = (PFNGLBINDFRAMEBUFFEROESPROC) load(userptr, "glBindFramebufferOES");
+ glad_glBindRenderbufferOES = (PFNGLBINDRENDERBUFFEROESPROC) load(userptr, "glBindRenderbufferOES");
+ glad_glCheckFramebufferStatusOES = (PFNGLCHECKFRAMEBUFFERSTATUSOESPROC) load(userptr, "glCheckFramebufferStatusOES");
+ glad_glDeleteFramebuffersOES = (PFNGLDELETEFRAMEBUFFERSOESPROC) load(userptr, "glDeleteFramebuffersOES");
+ glad_glDeleteRenderbuffersOES = (PFNGLDELETERENDERBUFFERSOESPROC) load(userptr, "glDeleteRenderbuffersOES");
+ glad_glFramebufferRenderbufferOES = (PFNGLFRAMEBUFFERRENDERBUFFEROESPROC) load(userptr, "glFramebufferRenderbufferOES");
+ glad_glFramebufferTexture2DOES = (PFNGLFRAMEBUFFERTEXTURE2DOESPROC) load(userptr, "glFramebufferTexture2DOES");
+ glad_glGenFramebuffersOES = (PFNGLGENFRAMEBUFFERSOESPROC) load(userptr, "glGenFramebuffersOES");
+ glad_glGenRenderbuffersOES = (PFNGLGENRENDERBUFFERSOESPROC) load(userptr, "glGenRenderbuffersOES");
+ glad_glGenerateMipmapOES = (PFNGLGENERATEMIPMAPOESPROC) load(userptr, "glGenerateMipmapOES");
+ glad_glGetFramebufferAttachmentParameterivOES = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC) load(userptr, "glGetFramebufferAttachmentParameterivOES");
+ glad_glGetRenderbufferParameterivOES = (PFNGLGETRENDERBUFFERPARAMETERIVOESPROC) load(userptr, "glGetRenderbufferParameterivOES");
+ glad_glIsFramebufferOES = (PFNGLISFRAMEBUFFEROESPROC) load(userptr, "glIsFramebufferOES");
+ glad_glIsRenderbufferOES = (PFNGLISRENDERBUFFEROESPROC) load(userptr, "glIsRenderbufferOES");
+ glad_glRenderbufferStorageOES = (PFNGLRENDERBUFFERSTORAGEOESPROC) load(userptr, "glRenderbufferStorageOES");
+}
+static void glad_gl_load_GL_OES_single_precision( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_single_precision) return;
+ glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf");
+ glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC) load(userptr, "glClearDepthfOES");
+ glad_glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC) load(userptr, "glClipPlanefOES");
+ glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef");
+ glad_glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC) load(userptr, "glDepthRangefOES");
+ glad_glFrustumfOES = (PFNGLFRUSTUMFOESPROC) load(userptr, "glFrustumfOES");
+ glad_glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC) load(userptr, "glGetClipPlanefOES");
+ glad_glOrthofOES = (PFNGLORTHOFOESPROC) load(userptr, "glOrthofOES");
+}
+
+
+static void glad_gl_resolve_aliases(void) {
+ if (glad_glActiveTexture == NULL && glad_glActiveTextureARB != NULL) glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC)glad_glActiveTextureARB;
+ if (glad_glActiveTextureARB == NULL && glad_glActiveTexture != NULL) glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glad_glActiveTexture;
+ if (glad_glArrayElement == NULL && glad_glArrayElementEXT != NULL) glad_glArrayElement = (PFNGLARRAYELEMENTPROC)glad_glArrayElementEXT;
+ if (glad_glArrayElementEXT == NULL && glad_glArrayElement != NULL) glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glad_glArrayElement;
+ if (glad_glAttachObjectARB == NULL && glad_glAttachShader != NULL) glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glad_glAttachShader;
+ if (glad_glAttachShader == NULL && glad_glAttachObjectARB != NULL) glad_glAttachShader = (PFNGLATTACHSHADERPROC)glad_glAttachObjectARB;
+ if (glad_glBindAttribLocation == NULL && glad_glBindAttribLocationARB != NULL) glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glad_glBindAttribLocationARB;
+ if (glad_glBindAttribLocationARB == NULL && glad_glBindAttribLocation != NULL) glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glad_glBindAttribLocation;
+ if (glad_glBindBuffer == NULL && glad_glBindBufferARB != NULL) glad_glBindBuffer = (PFNGLBINDBUFFERPROC)glad_glBindBufferARB;
+ if (glad_glBindBufferARB == NULL && glad_glBindBuffer != NULL) glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glad_glBindBuffer;
+ if (glad_glBindProgramARB == NULL && glad_glBindProgramNV != NULL) glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glad_glBindProgramNV;
+ if (glad_glBindProgramNV == NULL && glad_glBindProgramARB != NULL) glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glad_glBindProgramARB;
+ if (glad_glBindTexture == NULL && glad_glBindTextureEXT != NULL) glad_glBindTexture = (PFNGLBINDTEXTUREPROC)glad_glBindTextureEXT;
+ if (glad_glBindTextureEXT == NULL && glad_glBindTexture != NULL) glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glad_glBindTexture;
+ if (glad_glBlendEquation == NULL && glad_glBlendEquationEXT != NULL) glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC)glad_glBlendEquationEXT;
+ if (glad_glBlendEquationEXT == NULL && glad_glBlendEquation != NULL) glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glad_glBlendEquation;
+ if (glad_glBlendEquationSeparate == NULL && glad_glBlendEquationSeparateEXT != NULL) glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glad_glBlendEquationSeparateEXT;
+ if (glad_glBlendEquationSeparateEXT == NULL && glad_glBlendEquationSeparate != NULL) glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glad_glBlendEquationSeparate;
+ if (glad_glBlendFuncSeparate == NULL && glad_glBlendFuncSeparateINGR != NULL) glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glad_glBlendFuncSeparateINGR;
+ if (glad_glBlendFuncSeparate == NULL && glad_glBlendFuncSeparateEXT != NULL) glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glad_glBlendFuncSeparateEXT;
+ if (glad_glBlendFuncSeparateEXT == NULL && glad_glBlendFuncSeparate != NULL) glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glad_glBlendFuncSeparate;
+ if (glad_glBlendFuncSeparateEXT == NULL && glad_glBlendFuncSeparateINGR != NULL) glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glad_glBlendFuncSeparateINGR;
+ if (glad_glBlendFuncSeparateINGR == NULL && glad_glBlendFuncSeparate != NULL) glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC)glad_glBlendFuncSeparate;
+ if (glad_glBlendFuncSeparateINGR == NULL && glad_glBlendFuncSeparateEXT != NULL) glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC)glad_glBlendFuncSeparateEXT;
+ if (glad_glBlitFramebuffer == NULL && glad_glBlitFramebufferEXT != NULL) glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glad_glBlitFramebufferEXT;
+ if (glad_glBlitFramebufferEXT == NULL && glad_glBlitFramebuffer != NULL) glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glad_glBlitFramebuffer;
+ if (glad_glBufferData == NULL && glad_glBufferDataARB != NULL) glad_glBufferData = (PFNGLBUFFERDATAPROC)glad_glBufferDataARB;
+ if (glad_glBufferDataARB == NULL && glad_glBufferData != NULL) glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glad_glBufferData;
+ if (glad_glBufferSubData == NULL && glad_glBufferSubDataARB != NULL) glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glad_glBufferSubDataARB;
+ if (glad_glBufferSubDataARB == NULL && glad_glBufferSubData != NULL) glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glad_glBufferSubData;
+ if (glad_glCheckFramebufferStatus == NULL && glad_glCheckFramebufferStatusEXT != NULL) glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glad_glCheckFramebufferStatusEXT;
+ if (glad_glCheckFramebufferStatusEXT == NULL && glad_glCheckFramebufferStatus != NULL) glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glad_glCheckFramebufferStatus;
+ if (glad_glClearDepthf == NULL && glad_glClearDepthfOES != NULL) glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC)glad_glClearDepthfOES;
+ if (glad_glClearDepthfOES == NULL && glad_glClearDepthf != NULL) glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)glad_glClearDepthf;
+ if (glad_glClientActiveTexture == NULL && glad_glClientActiveTextureARB != NULL) glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glad_glClientActiveTextureARB;
+ if (glad_glClientActiveTextureARB == NULL && glad_glClientActiveTexture != NULL) glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glad_glClientActiveTexture;
+ if (glad_glCompileShader == NULL && glad_glCompileShaderARB != NULL) glad_glCompileShader = (PFNGLCOMPILESHADERPROC)glad_glCompileShaderARB;
+ if (glad_glCompileShaderARB == NULL && glad_glCompileShader != NULL) glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glad_glCompileShader;
+ if (glad_glCopyTexImage1D == NULL && glad_glCopyTexImage1DEXT != NULL) glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC)glad_glCopyTexImage1DEXT;
+ if (glad_glCopyTexImage1DEXT == NULL && glad_glCopyTexImage1D != NULL) glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glad_glCopyTexImage1D;
+ if (glad_glCopyTexImage2D == NULL && glad_glCopyTexImage2DEXT != NULL) glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)glad_glCopyTexImage2DEXT;
+ if (glad_glCopyTexImage2DEXT == NULL && glad_glCopyTexImage2D != NULL) glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glad_glCopyTexImage2D;
+ if (glad_glCopyTexSubImage1D == NULL && glad_glCopyTexSubImage1DEXT != NULL) glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC)glad_glCopyTexSubImage1DEXT;
+ if (glad_glCopyTexSubImage1DEXT == NULL && glad_glCopyTexSubImage1D != NULL) glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glad_glCopyTexSubImage1D;
+ if (glad_glCopyTexSubImage2D == NULL && glad_glCopyTexSubImage2DEXT != NULL) glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)glad_glCopyTexSubImage2DEXT;
+ if (glad_glCopyTexSubImage2DEXT == NULL && glad_glCopyTexSubImage2D != NULL) glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glad_glCopyTexSubImage2D;
+ if (glad_glCopyTexSubImage3D == NULL && glad_glCopyTexSubImage3DEXT != NULL) glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glad_glCopyTexSubImage3DEXT;
+ if (glad_glCopyTexSubImage3DEXT == NULL && glad_glCopyTexSubImage3D != NULL) glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glad_glCopyTexSubImage3D;
+ if (glad_glCreateProgram == NULL && glad_glCreateProgramObjectARB != NULL) glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC)glad_glCreateProgramObjectARB;
+ if (glad_glCreateProgramObjectARB == NULL && glad_glCreateProgram != NULL) glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glad_glCreateProgram;
+ if (glad_glCreateShader == NULL && glad_glCreateShaderObjectARB != NULL) glad_glCreateShader = (PFNGLCREATESHADERPROC)glad_glCreateShaderObjectARB;
+ if (glad_glCreateShaderObjectARB == NULL && glad_glCreateShader != NULL) glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glad_glCreateShader;
+ if (glad_glDeleteBuffers == NULL && glad_glDeleteBuffersARB != NULL) glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glad_glDeleteBuffersARB;
+ if (glad_glDeleteBuffersARB == NULL && glad_glDeleteBuffers != NULL) glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glad_glDeleteBuffers;
+ if (glad_glDeleteFramebuffers == NULL && glad_glDeleteFramebuffersEXT != NULL) glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glad_glDeleteFramebuffersEXT;
+ if (glad_glDeleteFramebuffersEXT == NULL && glad_glDeleteFramebuffers != NULL) glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glad_glDeleteFramebuffers;
+ if (glad_glDeleteProgramsARB == NULL && glad_glDeleteProgramsNV != NULL) glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glad_glDeleteProgramsNV;
+ if (glad_glDeleteProgramsNV == NULL && glad_glDeleteProgramsARB != NULL) glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glad_glDeleteProgramsARB;
+ if (glad_glDeleteRenderbuffers == NULL && glad_glDeleteRenderbuffersEXT != NULL) glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glad_glDeleteRenderbuffersEXT;
+ if (glad_glDeleteRenderbuffersEXT == NULL && glad_glDeleteRenderbuffers != NULL) glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glad_glDeleteRenderbuffers;
+ if (glad_glDepthRangef == NULL && glad_glDepthRangefOES != NULL) glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC)glad_glDepthRangefOES;
+ if (glad_glDepthRangefOES == NULL && glad_glDepthRangef != NULL) glad_glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)glad_glDepthRangef;
+ if (glad_glDetachObjectARB == NULL && glad_glDetachShader != NULL) glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glad_glDetachShader;
+ if (glad_glDetachShader == NULL && glad_glDetachObjectARB != NULL) glad_glDetachShader = (PFNGLDETACHSHADERPROC)glad_glDetachObjectARB;
+ if (glad_glDisableVertexAttribArray == NULL && glad_glDisableVertexAttribArrayARB != NULL) glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glad_glDisableVertexAttribArrayARB;
+ if (glad_glDisableVertexAttribArrayARB == NULL && glad_glDisableVertexAttribArray != NULL) glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glad_glDisableVertexAttribArray;
+ if (glad_glDrawArrays == NULL && glad_glDrawArraysEXT != NULL) glad_glDrawArrays = (PFNGLDRAWARRAYSPROC)glad_glDrawArraysEXT;
+ if (glad_glDrawArraysEXT == NULL && glad_glDrawArrays != NULL) glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glad_glDrawArrays;
+ if (glad_glEnableVertexAttribArray == NULL && glad_glEnableVertexAttribArrayARB != NULL) glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glad_glEnableVertexAttribArrayARB;
+ if (glad_glEnableVertexAttribArrayARB == NULL && glad_glEnableVertexAttribArray != NULL) glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glad_glEnableVertexAttribArray;
+ if (glad_glFramebufferRenderbuffer == NULL && glad_glFramebufferRenderbufferEXT != NULL) glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glad_glFramebufferRenderbufferEXT;
+ if (glad_glFramebufferRenderbufferEXT == NULL && glad_glFramebufferRenderbuffer != NULL) glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glad_glFramebufferRenderbuffer;
+ if (glad_glFramebufferTexture == NULL && glad_glFramebufferTextureEXT != NULL) glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glad_glFramebufferTextureEXT;
+ if (glad_glFramebufferTexture == NULL && glad_glFramebufferTextureARB != NULL) glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glad_glFramebufferTextureARB;
+ if (glad_glFramebufferTexture1D == NULL && glad_glFramebufferTexture1DEXT != NULL) glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glad_glFramebufferTexture1DEXT;
+ if (glad_glFramebufferTexture1DEXT == NULL && glad_glFramebufferTexture1D != NULL) glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glad_glFramebufferTexture1D;
+ if (glad_glFramebufferTexture2D == NULL && glad_glFramebufferTexture2DEXT != NULL) glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glad_glFramebufferTexture2DEXT;
+ if (glad_glFramebufferTexture2DEXT == NULL && glad_glFramebufferTexture2D != NULL) glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glad_glFramebufferTexture2D;
+ if (glad_glFramebufferTexture3D == NULL && glad_glFramebufferTexture3DEXT != NULL) glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glad_glFramebufferTexture3DEXT;
+ if (glad_glFramebufferTexture3DEXT == NULL && glad_glFramebufferTexture3D != NULL) glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glad_glFramebufferTexture3D;
+ if (glad_glFramebufferTextureARB == NULL && glad_glFramebufferTextureEXT != NULL) glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glad_glFramebufferTextureEXT;
+ if (glad_glFramebufferTextureARB == NULL && glad_glFramebufferTexture != NULL) glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glad_glFramebufferTexture;
+ if (glad_glFramebufferTextureEXT == NULL && glad_glFramebufferTexture != NULL) glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glad_glFramebufferTexture;
+ if (glad_glFramebufferTextureEXT == NULL && glad_glFramebufferTextureARB != NULL) glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glad_glFramebufferTextureARB;
+ if (glad_glFramebufferTextureFaceARB == NULL && glad_glFramebufferTextureFaceEXT != NULL) glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glad_glFramebufferTextureFaceEXT;
+ if (glad_glFramebufferTextureFaceEXT == NULL && glad_glFramebufferTextureFaceARB != NULL) glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glad_glFramebufferTextureFaceARB;
+ if (glad_glFramebufferTextureLayer == NULL && glad_glFramebufferTextureLayerARB != NULL) glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glad_glFramebufferTextureLayerARB;
+ if (glad_glFramebufferTextureLayer == NULL && glad_glFramebufferTextureLayerEXT != NULL) glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glad_glFramebufferTextureLayerEXT;
+ if (glad_glFramebufferTextureLayerARB == NULL && glad_glFramebufferTextureLayerEXT != NULL) glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glad_glFramebufferTextureLayerEXT;
+ if (glad_glFramebufferTextureLayerARB == NULL && glad_glFramebufferTextureLayer != NULL) glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glad_glFramebufferTextureLayer;
+ if (glad_glFramebufferTextureLayerEXT == NULL && glad_glFramebufferTextureLayerARB != NULL) glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glad_glFramebufferTextureLayerARB;
+ if (glad_glFramebufferTextureLayerEXT == NULL && glad_glFramebufferTextureLayer != NULL) glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glad_glFramebufferTextureLayer;
+ if (glad_glGenBuffers == NULL && glad_glGenBuffersARB != NULL) glad_glGenBuffers = (PFNGLGENBUFFERSPROC)glad_glGenBuffersARB;
+ if (glad_glGenBuffersARB == NULL && glad_glGenBuffers != NULL) glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glad_glGenBuffers;
+ if (glad_glGenerateMipmap == NULL && glad_glGenerateMipmapEXT != NULL) glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glad_glGenerateMipmapEXT;
+ if (glad_glGenerateMipmapEXT == NULL && glad_glGenerateMipmap != NULL) glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glad_glGenerateMipmap;
+ if (glad_glGenFramebuffers == NULL && glad_glGenFramebuffersEXT != NULL) glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glad_glGenFramebuffersEXT;
+ if (glad_glGenFramebuffersEXT == NULL && glad_glGenFramebuffers != NULL) glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glad_glGenFramebuffers;
+ if (glad_glGenProgramsARB == NULL && glad_glGenProgramsNV != NULL) glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glad_glGenProgramsNV;
+ if (glad_glGenProgramsNV == NULL && glad_glGenProgramsARB != NULL) glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glad_glGenProgramsARB;
+ if (glad_glGenRenderbuffers == NULL && glad_glGenRenderbuffersEXT != NULL) glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glad_glGenRenderbuffersEXT;
+ if (glad_glGenRenderbuffersEXT == NULL && glad_glGenRenderbuffers != NULL) glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glad_glGenRenderbuffers;
+ if (glad_glGetActiveAttrib == NULL && glad_glGetActiveAttribARB != NULL) glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glad_glGetActiveAttribARB;
+ if (glad_glGetActiveAttribARB == NULL && glad_glGetActiveAttrib != NULL) glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glad_glGetActiveAttrib;
+ if (glad_glGetActiveUniform == NULL && glad_glGetActiveUniformARB != NULL) glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glad_glGetActiveUniformARB;
+ if (glad_glGetActiveUniformARB == NULL && glad_glGetActiveUniform != NULL) glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glad_glGetActiveUniform;
+ if (glad_glGetAttribLocation == NULL && glad_glGetAttribLocationARB != NULL) glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glad_glGetAttribLocationARB;
+ if (glad_glGetAttribLocationARB == NULL && glad_glGetAttribLocation != NULL) glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glad_glGetAttribLocation;
+ if (glad_glGetBufferParameteriv == NULL && glad_glGetBufferParameterivARB != NULL) glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glad_glGetBufferParameterivARB;
+ if (glad_glGetBufferParameterivARB == NULL && glad_glGetBufferParameteriv != NULL) glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glad_glGetBufferParameteriv;
+ if (glad_glGetBufferPointerv == NULL && glad_glGetBufferPointervARB != NULL) glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glad_glGetBufferPointervARB;
+ if (glad_glGetBufferPointervARB == NULL && glad_glGetBufferPointerv != NULL) glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glad_glGetBufferPointerv;
+ if (glad_glGetBufferSubData == NULL && glad_glGetBufferSubDataARB != NULL) glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glad_glGetBufferSubDataARB;
+ if (glad_glGetBufferSubDataARB == NULL && glad_glGetBufferSubData != NULL) glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glad_glGetBufferSubData;
+ if (glad_glGetFramebufferAttachmentParameteriv == NULL && glad_glGetFramebufferAttachmentParameterivEXT != NULL) glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glad_glGetFramebufferAttachmentParameterivEXT;
+ if (glad_glGetFramebufferAttachmentParameterivEXT == NULL && glad_glGetFramebufferAttachmentParameteriv != NULL) glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glad_glGetFramebufferAttachmentParameteriv;
+ if (glad_glGetPointerv == NULL && glad_glGetPointervEXT != NULL) glad_glGetPointerv = (PFNGLGETPOINTERVPROC)glad_glGetPointervEXT;
+ if (glad_glGetPointervEXT == NULL && glad_glGetPointerv != NULL) glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC)glad_glGetPointerv;
+ if (glad_glGetRenderbufferParameteriv == NULL && glad_glGetRenderbufferParameterivEXT != NULL) glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glad_glGetRenderbufferParameterivEXT;
+ if (glad_glGetRenderbufferParameterivEXT == NULL && glad_glGetRenderbufferParameteriv != NULL) glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glad_glGetRenderbufferParameteriv;
+ if (glad_glGetShaderSource == NULL && glad_glGetShaderSourceARB != NULL) glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glad_glGetShaderSourceARB;
+ if (glad_glGetShaderSourceARB == NULL && glad_glGetShaderSource != NULL) glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glad_glGetShaderSource;
+ if (glad_glGetUniformfv == NULL && glad_glGetUniformfvARB != NULL) glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glad_glGetUniformfvARB;
+ if (glad_glGetUniformfvARB == NULL && glad_glGetUniformfv != NULL) glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glad_glGetUniformfv;
+ if (glad_glGetUniformiv == NULL && glad_glGetUniformivARB != NULL) glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glad_glGetUniformivARB;
+ if (glad_glGetUniformivARB == NULL && glad_glGetUniformiv != NULL) glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glad_glGetUniformiv;
+ if (glad_glGetUniformLocation == NULL && glad_glGetUniformLocationARB != NULL) glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glad_glGetUniformLocationARB;
+ if (glad_glGetUniformLocationARB == NULL && glad_glGetUniformLocation != NULL) glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glad_glGetUniformLocation;
+ if (glad_glGetVertexAttribdv == NULL && glad_glGetVertexAttribdvARB != NULL) glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glad_glGetVertexAttribdvARB;
+ if (glad_glGetVertexAttribdv == NULL && glad_glGetVertexAttribdvNV != NULL) glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glad_glGetVertexAttribdvNV;
+ if (glad_glGetVertexAttribdvARB == NULL && glad_glGetVertexAttribdv != NULL) glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glad_glGetVertexAttribdv;
+ if (glad_glGetVertexAttribdvARB == NULL && glad_glGetVertexAttribdvNV != NULL) glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glad_glGetVertexAttribdvNV;
+ if (glad_glGetVertexAttribdvNV == NULL && glad_glGetVertexAttribdv != NULL) glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glad_glGetVertexAttribdv;
+ if (glad_glGetVertexAttribdvNV == NULL && glad_glGetVertexAttribdvARB != NULL) glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glad_glGetVertexAttribdvARB;
+ if (glad_glGetVertexAttribfv == NULL && glad_glGetVertexAttribfvARB != NULL) glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glad_glGetVertexAttribfvARB;
+ if (glad_glGetVertexAttribfv == NULL && glad_glGetVertexAttribfvNV != NULL) glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glad_glGetVertexAttribfvNV;
+ if (glad_glGetVertexAttribfvARB == NULL && glad_glGetVertexAttribfv != NULL) glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glad_glGetVertexAttribfv;
+ if (glad_glGetVertexAttribfvARB == NULL && glad_glGetVertexAttribfvNV != NULL) glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glad_glGetVertexAttribfvNV;
+ if (glad_glGetVertexAttribfvNV == NULL && glad_glGetVertexAttribfvARB != NULL) glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glad_glGetVertexAttribfvARB;
+ if (glad_glGetVertexAttribfvNV == NULL && glad_glGetVertexAttribfv != NULL) glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glad_glGetVertexAttribfv;
+ if (glad_glGetVertexAttribiv == NULL && glad_glGetVertexAttribivNV != NULL) glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glad_glGetVertexAttribivNV;
+ if (glad_glGetVertexAttribiv == NULL && glad_glGetVertexAttribivARB != NULL) glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glad_glGetVertexAttribivARB;
+ if (glad_glGetVertexAttribivARB == NULL && glad_glGetVertexAttribivNV != NULL) glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glad_glGetVertexAttribivNV;
+ if (glad_glGetVertexAttribivARB == NULL && glad_glGetVertexAttribiv != NULL) glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glad_glGetVertexAttribiv;
+ if (glad_glGetVertexAttribivNV == NULL && glad_glGetVertexAttribiv != NULL) glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glad_glGetVertexAttribiv;
+ if (glad_glGetVertexAttribivNV == NULL && glad_glGetVertexAttribivARB != NULL) glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glad_glGetVertexAttribivARB;
+ if (glad_glGetVertexAttribPointerv == NULL && glad_glGetVertexAttribPointervNV != NULL) glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glad_glGetVertexAttribPointervNV;
+ if (glad_glGetVertexAttribPointerv == NULL && glad_glGetVertexAttribPointervARB != NULL) glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glad_glGetVertexAttribPointervARB;
+ if (glad_glGetVertexAttribPointervARB == NULL && glad_glGetVertexAttribPointervNV != NULL) glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glad_glGetVertexAttribPointervNV;
+ if (glad_glGetVertexAttribPointervARB == NULL && glad_glGetVertexAttribPointerv != NULL) glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glad_glGetVertexAttribPointerv;
+ if (glad_glGetVertexAttribPointervNV == NULL && glad_glGetVertexAttribPointerv != NULL) glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glad_glGetVertexAttribPointerv;
+ if (glad_glGetVertexAttribPointervNV == NULL && glad_glGetVertexAttribPointervARB != NULL) glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glad_glGetVertexAttribPointervARB;
+ if (glad_glIsBuffer == NULL && glad_glIsBufferARB != NULL) glad_glIsBuffer = (PFNGLISBUFFERPROC)glad_glIsBufferARB;
+ if (glad_glIsBufferARB == NULL && glad_glIsBuffer != NULL) glad_glIsBufferARB = (PFNGLISBUFFERARBPROC)glad_glIsBuffer;
+ if (glad_glIsFramebuffer == NULL && glad_glIsFramebufferEXT != NULL) glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glad_glIsFramebufferEXT;
+ if (glad_glIsFramebufferEXT == NULL && glad_glIsFramebuffer != NULL) glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glad_glIsFramebuffer;
+ if (glad_glIsProgramARB == NULL && glad_glIsProgramNV != NULL) glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC)glad_glIsProgramNV;
+ if (glad_glIsProgramNV == NULL && glad_glIsProgramARB != NULL) glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC)glad_glIsProgramARB;
+ if (glad_glIsRenderbuffer == NULL && glad_glIsRenderbufferEXT != NULL) glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glad_glIsRenderbufferEXT;
+ if (glad_glIsRenderbufferEXT == NULL && glad_glIsRenderbuffer != NULL) glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glad_glIsRenderbuffer;
+ if (glad_glLinkProgram == NULL && glad_glLinkProgramARB != NULL) glad_glLinkProgram = (PFNGLLINKPROGRAMPROC)glad_glLinkProgramARB;
+ if (glad_glLinkProgramARB == NULL && glad_glLinkProgram != NULL) glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glad_glLinkProgram;
+ if (glad_glMapBuffer == NULL && glad_glMapBufferARB != NULL) glad_glMapBuffer = (PFNGLMAPBUFFERPROC)glad_glMapBufferARB;
+ if (glad_glMapBufferARB == NULL && glad_glMapBuffer != NULL) glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glad_glMapBuffer;
+ if (glad_glMultiTexCoord1d == NULL && glad_glMultiTexCoord1dARB != NULL) glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glad_glMultiTexCoord1dARB;
+ if (glad_glMultiTexCoord1dARB == NULL && glad_glMultiTexCoord1d != NULL) glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glad_glMultiTexCoord1d;
+ if (glad_glMultiTexCoord1dv == NULL && glad_glMultiTexCoord1dvARB != NULL) glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glad_glMultiTexCoord1dvARB;
+ if (glad_glMultiTexCoord1dvARB == NULL && glad_glMultiTexCoord1dv != NULL) glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glad_glMultiTexCoord1dv;
+ if (glad_glMultiTexCoord1f == NULL && glad_glMultiTexCoord1fARB != NULL) glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glad_glMultiTexCoord1fARB;
+ if (glad_glMultiTexCoord1fARB == NULL && glad_glMultiTexCoord1f != NULL) glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glad_glMultiTexCoord1f;
+ if (glad_glMultiTexCoord1fv == NULL && glad_glMultiTexCoord1fvARB != NULL) glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glad_glMultiTexCoord1fvARB;
+ if (glad_glMultiTexCoord1fvARB == NULL && glad_glMultiTexCoord1fv != NULL) glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glad_glMultiTexCoord1fv;
+ if (glad_glMultiTexCoord1i == NULL && glad_glMultiTexCoord1iARB != NULL) glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glad_glMultiTexCoord1iARB;
+ if (glad_glMultiTexCoord1iARB == NULL && glad_glMultiTexCoord1i != NULL) glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glad_glMultiTexCoord1i;
+ if (glad_glMultiTexCoord1iv == NULL && glad_glMultiTexCoord1ivARB != NULL) glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glad_glMultiTexCoord1ivARB;
+ if (glad_glMultiTexCoord1ivARB == NULL && glad_glMultiTexCoord1iv != NULL) glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glad_glMultiTexCoord1iv;
+ if (glad_glMultiTexCoord1s == NULL && glad_glMultiTexCoord1sARB != NULL) glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glad_glMultiTexCoord1sARB;
+ if (glad_glMultiTexCoord1sARB == NULL && glad_glMultiTexCoord1s != NULL) glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glad_glMultiTexCoord1s;
+ if (glad_glMultiTexCoord1sv == NULL && glad_glMultiTexCoord1svARB != NULL) glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glad_glMultiTexCoord1svARB;
+ if (glad_glMultiTexCoord1svARB == NULL && glad_glMultiTexCoord1sv != NULL) glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glad_glMultiTexCoord1sv;
+ if (glad_glMultiTexCoord2d == NULL && glad_glMultiTexCoord2dARB != NULL) glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glad_glMultiTexCoord2dARB;
+ if (glad_glMultiTexCoord2dARB == NULL && glad_glMultiTexCoord2d != NULL) glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glad_glMultiTexCoord2d;
+ if (glad_glMultiTexCoord2dv == NULL && glad_glMultiTexCoord2dvARB != NULL) glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glad_glMultiTexCoord2dvARB;
+ if (glad_glMultiTexCoord2dvARB == NULL && glad_glMultiTexCoord2dv != NULL) glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glad_glMultiTexCoord2dv;
+ if (glad_glMultiTexCoord2f == NULL && glad_glMultiTexCoord2fARB != NULL) glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glad_glMultiTexCoord2fARB;
+ if (glad_glMultiTexCoord2fARB == NULL && glad_glMultiTexCoord2f != NULL) glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glad_glMultiTexCoord2f;
+ if (glad_glMultiTexCoord2fv == NULL && glad_glMultiTexCoord2fvARB != NULL) glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glad_glMultiTexCoord2fvARB;
+ if (glad_glMultiTexCoord2fvARB == NULL && glad_glMultiTexCoord2fv != NULL) glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glad_glMultiTexCoord2fv;
+ if (glad_glMultiTexCoord2i == NULL && glad_glMultiTexCoord2iARB != NULL) glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glad_glMultiTexCoord2iARB;
+ if (glad_glMultiTexCoord2iARB == NULL && glad_glMultiTexCoord2i != NULL) glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glad_glMultiTexCoord2i;
+ if (glad_glMultiTexCoord2iv == NULL && glad_glMultiTexCoord2ivARB != NULL) glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glad_glMultiTexCoord2ivARB;
+ if (glad_glMultiTexCoord2ivARB == NULL && glad_glMultiTexCoord2iv != NULL) glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glad_glMultiTexCoord2iv;
+ if (glad_glMultiTexCoord2s == NULL && glad_glMultiTexCoord2sARB != NULL) glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glad_glMultiTexCoord2sARB;
+ if (glad_glMultiTexCoord2sARB == NULL && glad_glMultiTexCoord2s != NULL) glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glad_glMultiTexCoord2s;
+ if (glad_glMultiTexCoord2sv == NULL && glad_glMultiTexCoord2svARB != NULL) glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glad_glMultiTexCoord2svARB;
+ if (glad_glMultiTexCoord2svARB == NULL && glad_glMultiTexCoord2sv != NULL) glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glad_glMultiTexCoord2sv;
+ if (glad_glMultiTexCoord3d == NULL && glad_glMultiTexCoord3dARB != NULL) glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glad_glMultiTexCoord3dARB;
+ if (glad_glMultiTexCoord3dARB == NULL && glad_glMultiTexCoord3d != NULL) glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glad_glMultiTexCoord3d;
+ if (glad_glMultiTexCoord3dv == NULL && glad_glMultiTexCoord3dvARB != NULL) glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glad_glMultiTexCoord3dvARB;
+ if (glad_glMultiTexCoord3dvARB == NULL && glad_glMultiTexCoord3dv != NULL) glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glad_glMultiTexCoord3dv;
+ if (glad_glMultiTexCoord3f == NULL && glad_glMultiTexCoord3fARB != NULL) glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glad_glMultiTexCoord3fARB;
+ if (glad_glMultiTexCoord3fARB == NULL && glad_glMultiTexCoord3f != NULL) glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glad_glMultiTexCoord3f;
+ if (glad_glMultiTexCoord3fv == NULL && glad_glMultiTexCoord3fvARB != NULL) glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glad_glMultiTexCoord3fvARB;
+ if (glad_glMultiTexCoord3fvARB == NULL && glad_glMultiTexCoord3fv != NULL) glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glad_glMultiTexCoord3fv;
+ if (glad_glMultiTexCoord3i == NULL && glad_glMultiTexCoord3iARB != NULL) glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glad_glMultiTexCoord3iARB;
+ if (glad_glMultiTexCoord3iARB == NULL && glad_glMultiTexCoord3i != NULL) glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glad_glMultiTexCoord3i;
+ if (glad_glMultiTexCoord3iv == NULL && glad_glMultiTexCoord3ivARB != NULL) glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glad_glMultiTexCoord3ivARB;
+ if (glad_glMultiTexCoord3ivARB == NULL && glad_glMultiTexCoord3iv != NULL) glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glad_glMultiTexCoord3iv;
+ if (glad_glMultiTexCoord3s == NULL && glad_glMultiTexCoord3sARB != NULL) glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glad_glMultiTexCoord3sARB;
+ if (glad_glMultiTexCoord3sARB == NULL && glad_glMultiTexCoord3s != NULL) glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glad_glMultiTexCoord3s;
+ if (glad_glMultiTexCoord3sv == NULL && glad_glMultiTexCoord3svARB != NULL) glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glad_glMultiTexCoord3svARB;
+ if (glad_glMultiTexCoord3svARB == NULL && glad_glMultiTexCoord3sv != NULL) glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glad_glMultiTexCoord3sv;
+ if (glad_glMultiTexCoord4d == NULL && glad_glMultiTexCoord4dARB != NULL) glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glad_glMultiTexCoord4dARB;
+ if (glad_glMultiTexCoord4dARB == NULL && glad_glMultiTexCoord4d != NULL) glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glad_glMultiTexCoord4d;
+ if (glad_glMultiTexCoord4dv == NULL && glad_glMultiTexCoord4dvARB != NULL) glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glad_glMultiTexCoord4dvARB;
+ if (glad_glMultiTexCoord4dvARB == NULL && glad_glMultiTexCoord4dv != NULL) glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glad_glMultiTexCoord4dv;
+ if (glad_glMultiTexCoord4f == NULL && glad_glMultiTexCoord4fARB != NULL) glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glad_glMultiTexCoord4fARB;
+ if (glad_glMultiTexCoord4fARB == NULL && glad_glMultiTexCoord4f != NULL) glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glad_glMultiTexCoord4f;
+ if (glad_glMultiTexCoord4fv == NULL && glad_glMultiTexCoord4fvARB != NULL) glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glad_glMultiTexCoord4fvARB;
+ if (glad_glMultiTexCoord4fvARB == NULL && glad_glMultiTexCoord4fv != NULL) glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glad_glMultiTexCoord4fv;
+ if (glad_glMultiTexCoord4i == NULL && glad_glMultiTexCoord4iARB != NULL) glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glad_glMultiTexCoord4iARB;
+ if (glad_glMultiTexCoord4iARB == NULL && glad_glMultiTexCoord4i != NULL) glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glad_glMultiTexCoord4i;
+ if (glad_glMultiTexCoord4iv == NULL && glad_glMultiTexCoord4ivARB != NULL) glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glad_glMultiTexCoord4ivARB;
+ if (glad_glMultiTexCoord4ivARB == NULL && glad_glMultiTexCoord4iv != NULL) glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glad_glMultiTexCoord4iv;
+ if (glad_glMultiTexCoord4s == NULL && glad_glMultiTexCoord4sARB != NULL) glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glad_glMultiTexCoord4sARB;
+ if (glad_glMultiTexCoord4sARB == NULL && glad_glMultiTexCoord4s != NULL) glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glad_glMultiTexCoord4s;
+ if (glad_glMultiTexCoord4sv == NULL && glad_glMultiTexCoord4svARB != NULL) glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glad_glMultiTexCoord4svARB;
+ if (glad_glMultiTexCoord4svARB == NULL && glad_glMultiTexCoord4sv != NULL) glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glad_glMultiTexCoord4sv;
+ if (glad_glPrioritizeTextures == NULL && glad_glPrioritizeTexturesEXT != NULL) glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC)glad_glPrioritizeTexturesEXT;
+ if (glad_glPrioritizeTexturesEXT == NULL && glad_glPrioritizeTextures != NULL) glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glad_glPrioritizeTextures;
+ if (glad_glProgramParameteri == NULL && glad_glProgramParameteriARB != NULL) glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glad_glProgramParameteriARB;
+ if (glad_glProgramParameteri == NULL && glad_glProgramParameteriEXT != NULL) glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glad_glProgramParameteriEXT;
+ if (glad_glProgramParameteriARB == NULL && glad_glProgramParameteri != NULL) glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glad_glProgramParameteri;
+ if (glad_glProgramParameteriARB == NULL && glad_glProgramParameteriEXT != NULL) glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glad_glProgramParameteriEXT;
+ if (glad_glProgramParameteriEXT == NULL && glad_glProgramParameteriARB != NULL) glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glad_glProgramParameteriARB;
+ if (glad_glProgramParameteriEXT == NULL && glad_glProgramParameteri != NULL) glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glad_glProgramParameteri;
+ if (glad_glRenderbufferStorage == NULL && glad_glRenderbufferStorageEXT != NULL) glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glad_glRenderbufferStorageEXT;
+ if (glad_glRenderbufferStorageEXT == NULL && glad_glRenderbufferStorage != NULL) glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glad_glRenderbufferStorage;
+ if (glad_glRenderbufferStorageMultisample == NULL && glad_glRenderbufferStorageMultisampleEXT != NULL) glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glad_glRenderbufferStorageMultisampleEXT;
+ if (glad_glRenderbufferStorageMultisampleEXT == NULL && glad_glRenderbufferStorageMultisample != NULL) glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glad_glRenderbufferStorageMultisample;
+ if (glad_glShaderSource == NULL && glad_glShaderSourceARB != NULL) glad_glShaderSource = (PFNGLSHADERSOURCEPROC)glad_glShaderSourceARB;
+ if (glad_glShaderSourceARB == NULL && glad_glShaderSource != NULL) glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glad_glShaderSource;
+ if (glad_glTexSubImage1D == NULL && glad_glTexSubImage1DEXT != NULL) glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)glad_glTexSubImage1DEXT;
+ if (glad_glTexSubImage1DEXT == NULL && glad_glTexSubImage1D != NULL) glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glad_glTexSubImage1D;
+ if (glad_glTexSubImage2D == NULL && glad_glTexSubImage2DEXT != NULL) glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)glad_glTexSubImage2DEXT;
+ if (glad_glTexSubImage2DEXT == NULL && glad_glTexSubImage2D != NULL) glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glad_glTexSubImage2D;
+ if (glad_glUniform1f == NULL && glad_glUniform1fARB != NULL) glad_glUniform1f = (PFNGLUNIFORM1FPROC)glad_glUniform1fARB;
+ if (glad_glUniform1fARB == NULL && glad_glUniform1f != NULL) glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glad_glUniform1f;
+ if (glad_glUniform1fv == NULL && glad_glUniform1fvARB != NULL) glad_glUniform1fv = (PFNGLUNIFORM1FVPROC)glad_glUniform1fvARB;
+ if (glad_glUniform1fvARB == NULL && glad_glUniform1fv != NULL) glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glad_glUniform1fv;
+ if (glad_glUniform1i == NULL && glad_glUniform1iARB != NULL) glad_glUniform1i = (PFNGLUNIFORM1IPROC)glad_glUniform1iARB;
+ if (glad_glUniform1iARB == NULL && glad_glUniform1i != NULL) glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glad_glUniform1i;
+ if (glad_glUniform1iv == NULL && glad_glUniform1ivARB != NULL) glad_glUniform1iv = (PFNGLUNIFORM1IVPROC)glad_glUniform1ivARB;
+ if (glad_glUniform1ivARB == NULL && glad_glUniform1iv != NULL) glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glad_glUniform1iv;
+ if (glad_glUniform2f == NULL && glad_glUniform2fARB != NULL) glad_glUniform2f = (PFNGLUNIFORM2FPROC)glad_glUniform2fARB;
+ if (glad_glUniform2fARB == NULL && glad_glUniform2f != NULL) glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glad_glUniform2f;
+ if (glad_glUniform2fv == NULL && glad_glUniform2fvARB != NULL) glad_glUniform2fv = (PFNGLUNIFORM2FVPROC)glad_glUniform2fvARB;
+ if (glad_glUniform2fvARB == NULL && glad_glUniform2fv != NULL) glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glad_glUniform2fv;
+ if (glad_glUniform2i == NULL && glad_glUniform2iARB != NULL) glad_glUniform2i = (PFNGLUNIFORM2IPROC)glad_glUniform2iARB;
+ if (glad_glUniform2iARB == NULL && glad_glUniform2i != NULL) glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glad_glUniform2i;
+ if (glad_glUniform2iv == NULL && glad_glUniform2ivARB != NULL) glad_glUniform2iv = (PFNGLUNIFORM2IVPROC)glad_glUniform2ivARB;
+ if (glad_glUniform2ivARB == NULL && glad_glUniform2iv != NULL) glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glad_glUniform2iv;
+ if (glad_glUniform3f == NULL && glad_glUniform3fARB != NULL) glad_glUniform3f = (PFNGLUNIFORM3FPROC)glad_glUniform3fARB;
+ if (glad_glUniform3fARB == NULL && glad_glUniform3f != NULL) glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glad_glUniform3f;
+ if (glad_glUniform3fv == NULL && glad_glUniform3fvARB != NULL) glad_glUniform3fv = (PFNGLUNIFORM3FVPROC)glad_glUniform3fvARB;
+ if (glad_glUniform3fvARB == NULL && glad_glUniform3fv != NULL) glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glad_glUniform3fv;
+ if (glad_glUniform3i == NULL && glad_glUniform3iARB != NULL) glad_glUniform3i = (PFNGLUNIFORM3IPROC)glad_glUniform3iARB;
+ if (glad_glUniform3iARB == NULL && glad_glUniform3i != NULL) glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glad_glUniform3i;
+ if (glad_glUniform3iv == NULL && glad_glUniform3ivARB != NULL) glad_glUniform3iv = (PFNGLUNIFORM3IVPROC)glad_glUniform3ivARB;
+ if (glad_glUniform3ivARB == NULL && glad_glUniform3iv != NULL) glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glad_glUniform3iv;
+ if (glad_glUniform4f == NULL && glad_glUniform4fARB != NULL) glad_glUniform4f = (PFNGLUNIFORM4FPROC)glad_glUniform4fARB;
+ if (glad_glUniform4fARB == NULL && glad_glUniform4f != NULL) glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glad_glUniform4f;
+ if (glad_glUniform4fv == NULL && glad_glUniform4fvARB != NULL) glad_glUniform4fv = (PFNGLUNIFORM4FVPROC)glad_glUniform4fvARB;
+ if (glad_glUniform4fvARB == NULL && glad_glUniform4fv != NULL) glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glad_glUniform4fv;
+ if (glad_glUniform4i == NULL && glad_glUniform4iARB != NULL) glad_glUniform4i = (PFNGLUNIFORM4IPROC)glad_glUniform4iARB;
+ if (glad_glUniform4iARB == NULL && glad_glUniform4i != NULL) glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glad_glUniform4i;
+ if (glad_glUniform4iv == NULL && glad_glUniform4ivARB != NULL) glad_glUniform4iv = (PFNGLUNIFORM4IVPROC)glad_glUniform4ivARB;
+ if (glad_glUniform4ivARB == NULL && glad_glUniform4iv != NULL) glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glad_glUniform4iv;
+ if (glad_glUniformMatrix2fv == NULL && glad_glUniformMatrix2fvARB != NULL) glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glad_glUniformMatrix2fvARB;
+ if (glad_glUniformMatrix2fvARB == NULL && glad_glUniformMatrix2fv != NULL) glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glad_glUniformMatrix2fv;
+ if (glad_glUniformMatrix3fv == NULL && glad_glUniformMatrix3fvARB != NULL) glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glad_glUniformMatrix3fvARB;
+ if (glad_glUniformMatrix3fvARB == NULL && glad_glUniformMatrix3fv != NULL) glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glad_glUniformMatrix3fv;
+ if (glad_glUniformMatrix4fv == NULL && glad_glUniformMatrix4fvARB != NULL) glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glad_glUniformMatrix4fvARB;
+ if (glad_glUniformMatrix4fvARB == NULL && glad_glUniformMatrix4fv != NULL) glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glad_glUniformMatrix4fv;
+ if (glad_glUnmapBuffer == NULL && glad_glUnmapBufferARB != NULL) glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glad_glUnmapBufferARB;
+ if (glad_glUnmapBufferARB == NULL && glad_glUnmapBuffer != NULL) glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glad_glUnmapBuffer;
+ if (glad_glUseProgram == NULL && glad_glUseProgramObjectARB != NULL) glad_glUseProgram = (PFNGLUSEPROGRAMPROC)glad_glUseProgramObjectARB;
+ if (glad_glUseProgramObjectARB == NULL && glad_glUseProgram != NULL) glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glad_glUseProgram;
+ if (glad_glValidateProgram == NULL && glad_glValidateProgramARB != NULL) glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glad_glValidateProgramARB;
+ if (glad_glValidateProgramARB == NULL && glad_glValidateProgram != NULL) glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glad_glValidateProgram;
+ if (glad_glVertexAttrib1d == NULL && glad_glVertexAttrib1dNV != NULL) glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glad_glVertexAttrib1dNV;
+ if (glad_glVertexAttrib1d == NULL && glad_glVertexAttrib1dARB != NULL) glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glad_glVertexAttrib1dARB;
+ if (glad_glVertexAttrib1dARB == NULL && glad_glVertexAttrib1dNV != NULL) glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glad_glVertexAttrib1dNV;
+ if (glad_glVertexAttrib1dARB == NULL && glad_glVertexAttrib1d != NULL) glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glad_glVertexAttrib1d;
+ if (glad_glVertexAttrib1dNV == NULL && glad_glVertexAttrib1d != NULL) glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glad_glVertexAttrib1d;
+ if (glad_glVertexAttrib1dNV == NULL && glad_glVertexAttrib1dARB != NULL) glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glad_glVertexAttrib1dARB;
+ if (glad_glVertexAttrib1dv == NULL && glad_glVertexAttrib1dvARB != NULL) glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glad_glVertexAttrib1dvARB;
+ if (glad_glVertexAttrib1dv == NULL && glad_glVertexAttrib1dvNV != NULL) glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glad_glVertexAttrib1dvNV;
+ if (glad_glVertexAttrib1dvARB == NULL && glad_glVertexAttrib1dvNV != NULL) glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glad_glVertexAttrib1dvNV;
+ if (glad_glVertexAttrib1dvARB == NULL && glad_glVertexAttrib1dv != NULL) glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glad_glVertexAttrib1dv;
+ if (glad_glVertexAttrib1dvNV == NULL && glad_glVertexAttrib1dvARB != NULL) glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glad_glVertexAttrib1dvARB;
+ if (glad_glVertexAttrib1dvNV == NULL && glad_glVertexAttrib1dv != NULL) glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glad_glVertexAttrib1dv;
+ if (glad_glVertexAttrib1f == NULL && glad_glVertexAttrib1fNV != NULL) glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glad_glVertexAttrib1fNV;
+ if (glad_glVertexAttrib1f == NULL && glad_glVertexAttrib1fARB != NULL) glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glad_glVertexAttrib1fARB;
+ if (glad_glVertexAttrib1fARB == NULL && glad_glVertexAttrib1fNV != NULL) glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glad_glVertexAttrib1fNV;
+ if (glad_glVertexAttrib1fARB == NULL && glad_glVertexAttrib1f != NULL) glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glad_glVertexAttrib1f;
+ if (glad_glVertexAttrib1fNV == NULL && glad_glVertexAttrib1fARB != NULL) glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glad_glVertexAttrib1fARB;
+ if (glad_glVertexAttrib1fNV == NULL && glad_glVertexAttrib1f != NULL) glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glad_glVertexAttrib1f;
+ if (glad_glVertexAttrib1fv == NULL && glad_glVertexAttrib1fvARB != NULL) glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glad_glVertexAttrib1fvARB;
+ if (glad_glVertexAttrib1fv == NULL && glad_glVertexAttrib1fvNV != NULL) glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glad_glVertexAttrib1fvNV;
+ if (glad_glVertexAttrib1fvARB == NULL && glad_glVertexAttrib1fvNV != NULL) glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glad_glVertexAttrib1fvNV;
+ if (glad_glVertexAttrib1fvARB == NULL && glad_glVertexAttrib1fv != NULL) glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glad_glVertexAttrib1fv;
+ if (glad_glVertexAttrib1fvNV == NULL && glad_glVertexAttrib1fvARB != NULL) glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glad_glVertexAttrib1fvARB;
+ if (glad_glVertexAttrib1fvNV == NULL && glad_glVertexAttrib1fv != NULL) glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glad_glVertexAttrib1fv;
+ if (glad_glVertexAttrib1s == NULL && glad_glVertexAttrib1sNV != NULL) glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glad_glVertexAttrib1sNV;
+ if (glad_glVertexAttrib1s == NULL && glad_glVertexAttrib1sARB != NULL) glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glad_glVertexAttrib1sARB;
+ if (glad_glVertexAttrib1sARB == NULL && glad_glVertexAttrib1sNV != NULL) glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glad_glVertexAttrib1sNV;
+ if (glad_glVertexAttrib1sARB == NULL && glad_glVertexAttrib1s != NULL) glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glad_glVertexAttrib1s;
+ if (glad_glVertexAttrib1sNV == NULL && glad_glVertexAttrib1s != NULL) glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glad_glVertexAttrib1s;
+ if (glad_glVertexAttrib1sNV == NULL && glad_glVertexAttrib1sARB != NULL) glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glad_glVertexAttrib1sARB;
+ if (glad_glVertexAttrib1sv == NULL && glad_glVertexAttrib1svNV != NULL) glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glad_glVertexAttrib1svNV;
+ if (glad_glVertexAttrib1sv == NULL && glad_glVertexAttrib1svARB != NULL) glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glad_glVertexAttrib1svARB;
+ if (glad_glVertexAttrib1svARB == NULL && glad_glVertexAttrib1svNV != NULL) glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glad_glVertexAttrib1svNV;
+ if (glad_glVertexAttrib1svARB == NULL && glad_glVertexAttrib1sv != NULL) glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glad_glVertexAttrib1sv;
+ if (glad_glVertexAttrib1svNV == NULL && glad_glVertexAttrib1svARB != NULL) glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glad_glVertexAttrib1svARB;
+ if (glad_glVertexAttrib1svNV == NULL && glad_glVertexAttrib1sv != NULL) glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glad_glVertexAttrib1sv;
+ if (glad_glVertexAttrib2d == NULL && glad_glVertexAttrib2dARB != NULL) glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glad_glVertexAttrib2dARB;
+ if (glad_glVertexAttrib2d == NULL && glad_glVertexAttrib2dNV != NULL) glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glad_glVertexAttrib2dNV;
+ if (glad_glVertexAttrib2dARB == NULL && glad_glVertexAttrib2d != NULL) glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glad_glVertexAttrib2d;
+ if (glad_glVertexAttrib2dARB == NULL && glad_glVertexAttrib2dNV != NULL) glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glad_glVertexAttrib2dNV;
+ if (glad_glVertexAttrib2dNV == NULL && glad_glVertexAttrib2dARB != NULL) glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glad_glVertexAttrib2dARB;
+ if (glad_glVertexAttrib2dNV == NULL && glad_glVertexAttrib2d != NULL) glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glad_glVertexAttrib2d;
+ if (glad_glVertexAttrib2dv == NULL && glad_glVertexAttrib2dvARB != NULL) glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glad_glVertexAttrib2dvARB;
+ if (glad_glVertexAttrib2dv == NULL && glad_glVertexAttrib2dvNV != NULL) glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glad_glVertexAttrib2dvNV;
+ if (glad_glVertexAttrib2dvARB == NULL && glad_glVertexAttrib2dv != NULL) glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glad_glVertexAttrib2dv;
+ if (glad_glVertexAttrib2dvARB == NULL && glad_glVertexAttrib2dvNV != NULL) glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glad_glVertexAttrib2dvNV;
+ if (glad_glVertexAttrib2dvNV == NULL && glad_glVertexAttrib2dv != NULL) glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glad_glVertexAttrib2dv;
+ if (glad_glVertexAttrib2dvNV == NULL && glad_glVertexAttrib2dvARB != NULL) glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glad_glVertexAttrib2dvARB;
+ if (glad_glVertexAttrib2f == NULL && glad_glVertexAttrib2fARB != NULL) glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glad_glVertexAttrib2fARB;
+ if (glad_glVertexAttrib2f == NULL && glad_glVertexAttrib2fNV != NULL) glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glad_glVertexAttrib2fNV;
+ if (glad_glVertexAttrib2fARB == NULL && glad_glVertexAttrib2fNV != NULL) glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glad_glVertexAttrib2fNV;
+ if (glad_glVertexAttrib2fARB == NULL && glad_glVertexAttrib2f != NULL) glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glad_glVertexAttrib2f;
+ if (glad_glVertexAttrib2fNV == NULL && glad_glVertexAttrib2fARB != NULL) glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glad_glVertexAttrib2fARB;
+ if (glad_glVertexAttrib2fNV == NULL && glad_glVertexAttrib2f != NULL) glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glad_glVertexAttrib2f;
+ if (glad_glVertexAttrib2fv == NULL && glad_glVertexAttrib2fvNV != NULL) glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glad_glVertexAttrib2fvNV;
+ if (glad_glVertexAttrib2fv == NULL && glad_glVertexAttrib2fvARB != NULL) glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glad_glVertexAttrib2fvARB;
+ if (glad_glVertexAttrib2fvARB == NULL && glad_glVertexAttrib2fvNV != NULL) glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glad_glVertexAttrib2fvNV;
+ if (glad_glVertexAttrib2fvARB == NULL && glad_glVertexAttrib2fv != NULL) glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glad_glVertexAttrib2fv;
+ if (glad_glVertexAttrib2fvNV == NULL && glad_glVertexAttrib2fvARB != NULL) glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glad_glVertexAttrib2fvARB;
+ if (glad_glVertexAttrib2fvNV == NULL && glad_glVertexAttrib2fv != NULL) glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glad_glVertexAttrib2fv;
+ if (glad_glVertexAttrib2s == NULL && glad_glVertexAttrib2sARB != NULL) glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glad_glVertexAttrib2sARB;
+ if (glad_glVertexAttrib2s == NULL && glad_glVertexAttrib2sNV != NULL) glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glad_glVertexAttrib2sNV;
+ if (glad_glVertexAttrib2sARB == NULL && glad_glVertexAttrib2s != NULL) glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glad_glVertexAttrib2s;
+ if (glad_glVertexAttrib2sARB == NULL && glad_glVertexAttrib2sNV != NULL) glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glad_glVertexAttrib2sNV;
+ if (glad_glVertexAttrib2sNV == NULL && glad_glVertexAttrib2sARB != NULL) glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glad_glVertexAttrib2sARB;
+ if (glad_glVertexAttrib2sNV == NULL && glad_glVertexAttrib2s != NULL) glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glad_glVertexAttrib2s;
+ if (glad_glVertexAttrib2sv == NULL && glad_glVertexAttrib2svARB != NULL) glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glad_glVertexAttrib2svARB;
+ if (glad_glVertexAttrib2sv == NULL && glad_glVertexAttrib2svNV != NULL) glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glad_glVertexAttrib2svNV;
+ if (glad_glVertexAttrib2svARB == NULL && glad_glVertexAttrib2sv != NULL) glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glad_glVertexAttrib2sv;
+ if (glad_glVertexAttrib2svARB == NULL && glad_glVertexAttrib2svNV != NULL) glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glad_glVertexAttrib2svNV;
+ if (glad_glVertexAttrib2svNV == NULL && glad_glVertexAttrib2sv != NULL) glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glad_glVertexAttrib2sv;
+ if (glad_glVertexAttrib2svNV == NULL && glad_glVertexAttrib2svARB != NULL) glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glad_glVertexAttrib2svARB;
+ if (glad_glVertexAttrib3d == NULL && glad_glVertexAttrib3dARB != NULL) glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glad_glVertexAttrib3dARB;
+ if (glad_glVertexAttrib3d == NULL && glad_glVertexAttrib3dNV != NULL) glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glad_glVertexAttrib3dNV;
+ if (glad_glVertexAttrib3dARB == NULL && glad_glVertexAttrib3d != NULL) glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glad_glVertexAttrib3d;
+ if (glad_glVertexAttrib3dARB == NULL && glad_glVertexAttrib3dNV != NULL) glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glad_glVertexAttrib3dNV;
+ if (glad_glVertexAttrib3dNV == NULL && glad_glVertexAttrib3dARB != NULL) glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glad_glVertexAttrib3dARB;
+ if (glad_glVertexAttrib3dNV == NULL && glad_glVertexAttrib3d != NULL) glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glad_glVertexAttrib3d;
+ if (glad_glVertexAttrib3dv == NULL && glad_glVertexAttrib3dvARB != NULL) glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glad_glVertexAttrib3dvARB;
+ if (glad_glVertexAttrib3dv == NULL && glad_glVertexAttrib3dvNV != NULL) glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glad_glVertexAttrib3dvNV;
+ if (glad_glVertexAttrib3dvARB == NULL && glad_glVertexAttrib3dv != NULL) glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glad_glVertexAttrib3dv;
+ if (glad_glVertexAttrib3dvARB == NULL && glad_glVertexAttrib3dvNV != NULL) glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glad_glVertexAttrib3dvNV;
+ if (glad_glVertexAttrib3dvNV == NULL && glad_glVertexAttrib3dv != NULL) glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glad_glVertexAttrib3dv;
+ if (glad_glVertexAttrib3dvNV == NULL && glad_glVertexAttrib3dvARB != NULL) glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glad_glVertexAttrib3dvARB;
+ if (glad_glVertexAttrib3f == NULL && glad_glVertexAttrib3fARB != NULL) glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glad_glVertexAttrib3fARB;
+ if (glad_glVertexAttrib3f == NULL && glad_glVertexAttrib3fNV != NULL) glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glad_glVertexAttrib3fNV;
+ if (glad_glVertexAttrib3fARB == NULL && glad_glVertexAttrib3f != NULL) glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glad_glVertexAttrib3f;
+ if (glad_glVertexAttrib3fARB == NULL && glad_glVertexAttrib3fNV != NULL) glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glad_glVertexAttrib3fNV;
+ if (glad_glVertexAttrib3fNV == NULL && glad_glVertexAttrib3f != NULL) glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glad_glVertexAttrib3f;
+ if (glad_glVertexAttrib3fNV == NULL && glad_glVertexAttrib3fARB != NULL) glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glad_glVertexAttrib3fARB;
+ if (glad_glVertexAttrib3fv == NULL && glad_glVertexAttrib3fvNV != NULL) glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glad_glVertexAttrib3fvNV;
+ if (glad_glVertexAttrib3fv == NULL && glad_glVertexAttrib3fvARB != NULL) glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glad_glVertexAttrib3fvARB;
+ if (glad_glVertexAttrib3fvARB == NULL && glad_glVertexAttrib3fvNV != NULL) glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glad_glVertexAttrib3fvNV;
+ if (glad_glVertexAttrib3fvARB == NULL && glad_glVertexAttrib3fv != NULL) glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glad_glVertexAttrib3fv;
+ if (glad_glVertexAttrib3fvNV == NULL && glad_glVertexAttrib3fv != NULL) glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glad_glVertexAttrib3fv;
+ if (glad_glVertexAttrib3fvNV == NULL && glad_glVertexAttrib3fvARB != NULL) glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glad_glVertexAttrib3fvARB;
+ if (glad_glVertexAttrib3s == NULL && glad_glVertexAttrib3sARB != NULL) glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glad_glVertexAttrib3sARB;
+ if (glad_glVertexAttrib3s == NULL && glad_glVertexAttrib3sNV != NULL) glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glad_glVertexAttrib3sNV;
+ if (glad_glVertexAttrib3sARB == NULL && glad_glVertexAttrib3s != NULL) glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glad_glVertexAttrib3s;
+ if (glad_glVertexAttrib3sARB == NULL && glad_glVertexAttrib3sNV != NULL) glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glad_glVertexAttrib3sNV;
+ if (glad_glVertexAttrib3sNV == NULL && glad_glVertexAttrib3sARB != NULL) glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glad_glVertexAttrib3sARB;
+ if (glad_glVertexAttrib3sNV == NULL && glad_glVertexAttrib3s != NULL) glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glad_glVertexAttrib3s;
+ if (glad_glVertexAttrib3sv == NULL && glad_glVertexAttrib3svARB != NULL) glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glad_glVertexAttrib3svARB;
+ if (glad_glVertexAttrib3sv == NULL && glad_glVertexAttrib3svNV != NULL) glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glad_glVertexAttrib3svNV;
+ if (glad_glVertexAttrib3svARB == NULL && glad_glVertexAttrib3sv != NULL) glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glad_glVertexAttrib3sv;
+ if (glad_glVertexAttrib3svARB == NULL && glad_glVertexAttrib3svNV != NULL) glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glad_glVertexAttrib3svNV;
+ if (glad_glVertexAttrib3svNV == NULL && glad_glVertexAttrib3sv != NULL) glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glad_glVertexAttrib3sv;
+ if (glad_glVertexAttrib3svNV == NULL && glad_glVertexAttrib3svARB != NULL) glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glad_glVertexAttrib3svARB;
+ if (glad_glVertexAttrib4bv == NULL && glad_glVertexAttrib4bvARB != NULL) glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glad_glVertexAttrib4bvARB;
+ if (glad_glVertexAttrib4bvARB == NULL && glad_glVertexAttrib4bv != NULL) glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glad_glVertexAttrib4bv;
+ if (glad_glVertexAttrib4d == NULL && glad_glVertexAttrib4dNV != NULL) glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glad_glVertexAttrib4dNV;
+ if (glad_glVertexAttrib4d == NULL && glad_glVertexAttrib4dARB != NULL) glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glad_glVertexAttrib4dARB;
+ if (glad_glVertexAttrib4dARB == NULL && glad_glVertexAttrib4dNV != NULL) glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glad_glVertexAttrib4dNV;
+ if (glad_glVertexAttrib4dARB == NULL && glad_glVertexAttrib4d != NULL) glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glad_glVertexAttrib4d;
+ if (glad_glVertexAttrib4dNV == NULL && glad_glVertexAttrib4d != NULL) glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glad_glVertexAttrib4d;
+ if (glad_glVertexAttrib4dNV == NULL && glad_glVertexAttrib4dARB != NULL) glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glad_glVertexAttrib4dARB;
+ if (glad_glVertexAttrib4dv == NULL && glad_glVertexAttrib4dvNV != NULL) glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glad_glVertexAttrib4dvNV;
+ if (glad_glVertexAttrib4dv == NULL && glad_glVertexAttrib4dvARB != NULL) glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glad_glVertexAttrib4dvARB;
+ if (glad_glVertexAttrib4dvARB == NULL && glad_glVertexAttrib4dvNV != NULL) glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glad_glVertexAttrib4dvNV;
+ if (glad_glVertexAttrib4dvARB == NULL && glad_glVertexAttrib4dv != NULL) glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glad_glVertexAttrib4dv;
+ if (glad_glVertexAttrib4dvNV == NULL && glad_glVertexAttrib4dvARB != NULL) glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glad_glVertexAttrib4dvARB;
+ if (glad_glVertexAttrib4dvNV == NULL && glad_glVertexAttrib4dv != NULL) glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glad_glVertexAttrib4dv;
+ if (glad_glVertexAttrib4f == NULL && glad_glVertexAttrib4fNV != NULL) glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glad_glVertexAttrib4fNV;
+ if (glad_glVertexAttrib4f == NULL && glad_glVertexAttrib4fARB != NULL) glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glad_glVertexAttrib4fARB;
+ if (glad_glVertexAttrib4fARB == NULL && glad_glVertexAttrib4f != NULL) glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glad_glVertexAttrib4f;
+ if (glad_glVertexAttrib4fARB == NULL && glad_glVertexAttrib4fNV != NULL) glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glad_glVertexAttrib4fNV;
+ if (glad_glVertexAttrib4fNV == NULL && glad_glVertexAttrib4f != NULL) glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glad_glVertexAttrib4f;
+ if (glad_glVertexAttrib4fNV == NULL && glad_glVertexAttrib4fARB != NULL) glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glad_glVertexAttrib4fARB;
+ if (glad_glVertexAttrib4fv == NULL && glad_glVertexAttrib4fvARB != NULL) glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glad_glVertexAttrib4fvARB;
+ if (glad_glVertexAttrib4fv == NULL && glad_glVertexAttrib4fvNV != NULL) glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glad_glVertexAttrib4fvNV;
+ if (glad_glVertexAttrib4fvARB == NULL && glad_glVertexAttrib4fv != NULL) glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glad_glVertexAttrib4fv;
+ if (glad_glVertexAttrib4fvARB == NULL && glad_glVertexAttrib4fvNV != NULL) glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glad_glVertexAttrib4fvNV;
+ if (glad_glVertexAttrib4fvNV == NULL && glad_glVertexAttrib4fv != NULL) glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glad_glVertexAttrib4fv;
+ if (glad_glVertexAttrib4fvNV == NULL && glad_glVertexAttrib4fvARB != NULL) glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glad_glVertexAttrib4fvARB;
+ if (glad_glVertexAttrib4iv == NULL && glad_glVertexAttrib4ivARB != NULL) glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glad_glVertexAttrib4ivARB;
+ if (glad_glVertexAttrib4ivARB == NULL && glad_glVertexAttrib4iv != NULL) glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glad_glVertexAttrib4iv;
+ if (glad_glVertexAttrib4Nbv == NULL && glad_glVertexAttrib4NbvARB != NULL) glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glad_glVertexAttrib4NbvARB;
+ if (glad_glVertexAttrib4NbvARB == NULL && glad_glVertexAttrib4Nbv != NULL) glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glad_glVertexAttrib4Nbv;
+ if (glad_glVertexAttrib4Niv == NULL && glad_glVertexAttrib4NivARB != NULL) glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glad_glVertexAttrib4NivARB;
+ if (glad_glVertexAttrib4NivARB == NULL && glad_glVertexAttrib4Niv != NULL) glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glad_glVertexAttrib4Niv;
+ if (glad_glVertexAttrib4Nsv == NULL && glad_glVertexAttrib4NsvARB != NULL) glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glad_glVertexAttrib4NsvARB;
+ if (glad_glVertexAttrib4NsvARB == NULL && glad_glVertexAttrib4Nsv != NULL) glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glad_glVertexAttrib4Nsv;
+ if (glad_glVertexAttrib4Nub == NULL && glad_glVertexAttrib4ubNV != NULL) glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glad_glVertexAttrib4ubNV;
+ if (glad_glVertexAttrib4Nub == NULL && glad_glVertexAttrib4NubARB != NULL) glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glad_glVertexAttrib4NubARB;
+ if (glad_glVertexAttrib4NubARB == NULL && glad_glVertexAttrib4Nub != NULL) glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glad_glVertexAttrib4Nub;
+ if (glad_glVertexAttrib4NubARB == NULL && glad_glVertexAttrib4ubNV != NULL) glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glad_glVertexAttrib4ubNV;
+ if (glad_glVertexAttrib4Nubv == NULL && glad_glVertexAttrib4ubvNV != NULL) glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glad_glVertexAttrib4ubvNV;
+ if (glad_glVertexAttrib4Nubv == NULL && glad_glVertexAttrib4NubvARB != NULL) glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glad_glVertexAttrib4NubvARB;
+ if (glad_glVertexAttrib4NubvARB == NULL && glad_glVertexAttrib4ubvNV != NULL) glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glad_glVertexAttrib4ubvNV;
+ if (glad_glVertexAttrib4NubvARB == NULL && glad_glVertexAttrib4Nubv != NULL) glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glad_glVertexAttrib4Nubv;
+ if (glad_glVertexAttrib4Nuiv == NULL && glad_glVertexAttrib4NuivARB != NULL) glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glad_glVertexAttrib4NuivARB;
+ if (glad_glVertexAttrib4NuivARB == NULL && glad_glVertexAttrib4Nuiv != NULL) glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glad_glVertexAttrib4Nuiv;
+ if (glad_glVertexAttrib4Nusv == NULL && glad_glVertexAttrib4NusvARB != NULL) glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glad_glVertexAttrib4NusvARB;
+ if (glad_glVertexAttrib4NusvARB == NULL && glad_glVertexAttrib4Nusv != NULL) glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glad_glVertexAttrib4Nusv;
+ if (glad_glVertexAttrib4s == NULL && glad_glVertexAttrib4sNV != NULL) glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glad_glVertexAttrib4sNV;
+ if (glad_glVertexAttrib4s == NULL && glad_glVertexAttrib4sARB != NULL) glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glad_glVertexAttrib4sARB;
+ if (glad_glVertexAttrib4sARB == NULL && glad_glVertexAttrib4sNV != NULL) glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glad_glVertexAttrib4sNV;
+ if (glad_glVertexAttrib4sARB == NULL && glad_glVertexAttrib4s != NULL) glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glad_glVertexAttrib4s;
+ if (glad_glVertexAttrib4sNV == NULL && glad_glVertexAttrib4s != NULL) glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glad_glVertexAttrib4s;
+ if (glad_glVertexAttrib4sNV == NULL && glad_glVertexAttrib4sARB != NULL) glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glad_glVertexAttrib4sARB;
+ if (glad_glVertexAttrib4sv == NULL && glad_glVertexAttrib4svARB != NULL) glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glad_glVertexAttrib4svARB;
+ if (glad_glVertexAttrib4sv == NULL && glad_glVertexAttrib4svNV != NULL) glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glad_glVertexAttrib4svNV;
+ if (glad_glVertexAttrib4svARB == NULL && glad_glVertexAttrib4sv != NULL) glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glad_glVertexAttrib4sv;
+ if (glad_glVertexAttrib4svARB == NULL && glad_glVertexAttrib4svNV != NULL) glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glad_glVertexAttrib4svNV;
+ if (glad_glVertexAttrib4svNV == NULL && glad_glVertexAttrib4svARB != NULL) glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glad_glVertexAttrib4svARB;
+ if (glad_glVertexAttrib4svNV == NULL && glad_glVertexAttrib4sv != NULL) glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glad_glVertexAttrib4sv;
+ if (glad_glVertexAttrib4ubNV == NULL && glad_glVertexAttrib4Nub != NULL) glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glad_glVertexAttrib4Nub;
+ if (glad_glVertexAttrib4ubNV == NULL && glad_glVertexAttrib4NubARB != NULL) glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glad_glVertexAttrib4NubARB;
+ if (glad_glVertexAttrib4ubv == NULL && glad_glVertexAttrib4ubvARB != NULL) glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glad_glVertexAttrib4ubvARB;
+ if (glad_glVertexAttrib4ubvARB == NULL && glad_glVertexAttrib4ubv != NULL) glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glad_glVertexAttrib4ubv;
+ if (glad_glVertexAttrib4ubvNV == NULL && glad_glVertexAttrib4Nubv != NULL) glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glad_glVertexAttrib4Nubv;
+ if (glad_glVertexAttrib4ubvNV == NULL && glad_glVertexAttrib4NubvARB != NULL) glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glad_glVertexAttrib4NubvARB;
+ if (glad_glVertexAttrib4uiv == NULL && glad_glVertexAttrib4uivARB != NULL) glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glad_glVertexAttrib4uivARB;
+ if (glad_glVertexAttrib4uivARB == NULL && glad_glVertexAttrib4uiv != NULL) glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glad_glVertexAttrib4uiv;
+ if (glad_glVertexAttrib4usv == NULL && glad_glVertexAttrib4usvARB != NULL) glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glad_glVertexAttrib4usvARB;
+ if (glad_glVertexAttrib4usvARB == NULL && glad_glVertexAttrib4usv != NULL) glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glad_glVertexAttrib4usv;
+ if (glad_glVertexAttribPointer == NULL && glad_glVertexAttribPointerARB != NULL) glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glad_glVertexAttribPointerARB;
+ if (glad_glVertexAttribPointerARB == NULL && glad_glVertexAttribPointer != NULL) glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glad_glVertexAttribPointer;
+}
+
+#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0)
+#define GLAD_GL_IS_SOME_NEW_VERSION 1
+#else
+#define GLAD_GL_IS_SOME_NEW_VERSION 0
+#endif
+
+static int glad_gl_get_extensions( int version, const char **out_exts, unsigned int *out_num_exts_i, char ***out_exts_i) {
+#if GLAD_GL_IS_SOME_NEW_VERSION
+ if(GLAD_VERSION_MAJOR(version) < 3) {
+#else
+ (void) version;
+ (void) out_num_exts_i;
+ (void) out_exts_i;
+#endif
+ if (glad_glGetString == NULL) {
+ return 0;
+ }
+ *out_exts = (const char *)glad_glGetString(GL_EXTENSIONS);
+#if GLAD_GL_IS_SOME_NEW_VERSION
+ } else {
+ unsigned int index = 0;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (glad_glGetStringi == NULL || glad_glGetIntegerv == NULL) {
+ return 0;
+ }
+ glad_glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i);
+ if (num_exts_i > 0) {
+ exts_i = (char **) malloc(num_exts_i * (sizeof *exts_i));
+ }
+ if (exts_i == NULL) {
+ return 0;
+ }
+ for(index = 0; index < num_exts_i; index++) {
+ const char *gl_str_tmp = (const char*) glad_glGetStringi(GL_EXTENSIONS, index);
+ size_t len = strlen(gl_str_tmp) + 1;
+
+ char *local_str = (char*) malloc(len * sizeof(char));
+ if(local_str != NULL) {
+ memcpy(local_str, gl_str_tmp, len * sizeof(char));
+ }
+
+ exts_i[index] = local_str;
+ }
+
+ *out_num_exts_i = num_exts_i;
+ *out_exts_i = exts_i;
+ }
+#endif
+ return 1;
+}
+static void glad_gl_free_extensions(char **exts_i, unsigned int num_exts_i) {
+ if (exts_i != NULL) {
+ unsigned int index;
+ for(index = 0; index < num_exts_i; index++) {
+ free((void *) (exts_i[index]));
+ }
+ free((void *)exts_i);
+ exts_i = NULL;
+ }
+}
+static int glad_gl_has_extension(int version, const char *exts, unsigned int num_exts_i, char **exts_i, const char *ext) {
+ if(GLAD_VERSION_MAJOR(version) < 3 || !GLAD_GL_IS_SOME_NEW_VERSION) {
+ const char *extensions;
+ const char *loc;
+ const char *terminator;
+ extensions = exts;
+ if(extensions == NULL || ext == NULL) {
+ return 0;
+ }
+ while(1) {
+ loc = strstr(extensions, ext);
+ if(loc == NULL) {
+ return 0;
+ }
+ terminator = loc + strlen(ext);
+ if((loc == extensions || *(loc - 1) == ' ') &&
+ (*terminator == ' ' || *terminator == '\0')) {
+ return 1;
+ }
+ extensions = terminator;
+ }
+ } else {
+ unsigned int index;
+ for(index = 0; index < num_exts_i; index++) {
+ const char *e = exts_i[index];
+ if(strcmp(e, ext) == 0) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const char* name) {
+ return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);
+}
+
+static int glad_gl_find_extensions_gl( int version) {
+ const char *exts = NULL;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (!glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0;
+
+ GLAD_GL_ARB_copy_buffer = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_copy_buffer");
+ GLAD_GL_ARB_fragment_shader = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_fragment_shader");
+ GLAD_GL_ARB_framebuffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_framebuffer_object");
+ GLAD_GL_ARB_geometry_shader4 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_geometry_shader4");
+ GLAD_GL_ARB_get_program_binary = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_get_program_binary");
+ GLAD_GL_ARB_imaging = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_imaging");
+ GLAD_GL_ARB_multitexture = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_multitexture");
+ GLAD_GL_ARB_separate_shader_objects = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_separate_shader_objects");
+ GLAD_GL_ARB_shader_objects = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_objects");
+ GLAD_GL_ARB_shading_language_100 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shading_language_100");
+ GLAD_GL_ARB_texture_non_power_of_two = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_non_power_of_two");
+ GLAD_GL_ARB_vertex_buffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_buffer_object");
+ GLAD_GL_ARB_vertex_program = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_program");
+ GLAD_GL_ARB_vertex_shader = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_shader");
+ GLAD_GL_EXT_blend_equation_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_equation_separate");
+ GLAD_GL_EXT_blend_func_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_func_separate");
+ GLAD_GL_EXT_blend_minmax = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_minmax");
+ GLAD_GL_EXT_blend_subtract = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_subtract");
+ GLAD_GL_EXT_copy_texture = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_copy_texture");
+ GLAD_GL_EXT_framebuffer_blit = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_blit");
+ GLAD_GL_EXT_framebuffer_multisample = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_multisample");
+ GLAD_GL_EXT_framebuffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_object");
+ GLAD_GL_EXT_geometry_shader4 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_geometry_shader4");
+ GLAD_GL_EXT_packed_depth_stencil = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_packed_depth_stencil");
+ GLAD_GL_EXT_subtexture = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_subtexture");
+ GLAD_GL_EXT_texture_array = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_array");
+ GLAD_GL_EXT_texture_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_object");
+ GLAD_GL_EXT_texture_sRGB = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_sRGB");
+ GLAD_GL_EXT_vertex_array = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_vertex_array");
+ GLAD_GL_INGR_blend_func_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_INGR_blend_func_separate");
+ GLAD_GL_KHR_debug = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_debug");
+ GLAD_GL_NV_geometry_program4 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_NV_geometry_program4");
+ GLAD_GL_NV_vertex_program = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_NV_vertex_program");
+ GLAD_GL_SGIS_texture_edge_clamp = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_SGIS_texture_edge_clamp") | glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_edge_clamp");
+ GLAD_GL_OES_single_precision = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision");
+
+ glad_gl_free_extensions(exts_i, num_exts_i);
+
+ return 1;
+}
+
+static int glad_gl_find_core_gl(void) {
+ int i, major, minor;
+ const char* version;
+ const char* prefixes[] = {
+ "OpenGL ES-CM ",
+ "OpenGL ES-CL ",
+ "OpenGL ES ",
+ NULL
+ };
+ version = (const char*) glad_glGetString(GL_VERSION);
+ if (!version) return 0;
+ for (i = 0; prefixes[i]; i++) {
+ const size_t length = strlen(prefixes[i]);
+ if (strncmp(version, prefixes[i], length) == 0) {
+ version += length;
+ break;
+ }
+ }
+
+ GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor);
+
+ GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
+ GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;
+
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) {
+ int version;
+
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ if(glad_glGetString == NULL) return 0;
+ if(glad_glGetString(GL_VERSION) == NULL) return 0;
+ version = glad_gl_find_core_gl();
+
+ glad_gl_load_GL_VERSION_1_0(load, userptr);
+ glad_gl_load_GL_VERSION_1_1(load, userptr);
+
+ if (!glad_gl_find_extensions_gl(version)) return 0;
+ glad_gl_load_GL_ARB_copy_buffer(load, userptr);
+ glad_gl_load_GL_ARB_framebuffer_object(load, userptr);
+ glad_gl_load_GL_ARB_geometry_shader4(load, userptr);
+ glad_gl_load_GL_ARB_get_program_binary(load, userptr);
+ glad_gl_load_GL_ARB_imaging(load, userptr);
+ glad_gl_load_GL_ARB_multitexture(load, userptr);
+ glad_gl_load_GL_ARB_separate_shader_objects(load, userptr);
+ glad_gl_load_GL_ARB_shader_objects(load, userptr);
+ glad_gl_load_GL_ARB_vertex_buffer_object(load, userptr);
+ glad_gl_load_GL_ARB_vertex_program(load, userptr);
+ glad_gl_load_GL_ARB_vertex_shader(load, userptr);
+ glad_gl_load_GL_EXT_blend_equation_separate(load, userptr);
+ glad_gl_load_GL_EXT_blend_func_separate(load, userptr);
+ glad_gl_load_GL_EXT_blend_minmax(load, userptr);
+ glad_gl_load_GL_EXT_copy_texture(load, userptr);
+ glad_gl_load_GL_EXT_framebuffer_blit(load, userptr);
+ glad_gl_load_GL_EXT_framebuffer_multisample(load, userptr);
+ glad_gl_load_GL_EXT_framebuffer_object(load, userptr);
+ glad_gl_load_GL_EXT_geometry_shader4(load, userptr);
+ glad_gl_load_GL_EXT_subtexture(load, userptr);
+ glad_gl_load_GL_EXT_texture_array(load, userptr);
+ glad_gl_load_GL_EXT_texture_object(load, userptr);
+ glad_gl_load_GL_EXT_vertex_array(load, userptr);
+ glad_gl_load_GL_INGR_blend_func_separate(load, userptr);
+ glad_gl_load_GL_KHR_debug(load, userptr);
+ glad_gl_load_GL_NV_geometry_program4(load, userptr);
+ glad_gl_load_GL_NV_vertex_program(load, userptr);
+ glad_gl_load_GL_OES_single_precision(load, userptr);
+
+
+ glad_gl_resolve_aliases();
+
+ return version;
+}
+
+
+int gladLoadGL( GLADloadfunc load) {
+ return gladLoadGLUserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+static int glad_gl_find_extensions_gles1( int version) {
+ const char *exts = NULL;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (!glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0;
+
+ GLAD_GL_EXT_blend_minmax = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_minmax");
+ GLAD_GL_KHR_debug = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_debug");
+ GLAD_GL_EXT_sRGB = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_sRGB");
+ GLAD_GL_OES_blend_equation_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_equation_separate");
+ GLAD_GL_OES_blend_func_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_func_separate");
+ GLAD_GL_OES_blend_subtract = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_subtract");
+ GLAD_GL_OES_framebuffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_framebuffer_object");
+ GLAD_GL_OES_packed_depth_stencil = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_packed_depth_stencil");
+ GLAD_GL_OES_single_precision = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision");
+ GLAD_GL_OES_texture_npot = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_texture_npot");
+
+ glad_gl_free_extensions(exts_i, num_exts_i);
+
+ return 1;
+}
+
+static int glad_gl_find_core_gles1(void) {
+ int i, major, minor;
+ const char* version;
+ const char* prefixes[] = {
+ "OpenGL ES-CM ",
+ "OpenGL ES-CL ",
+ "OpenGL ES ",
+ NULL
+ };
+ version = (const char*) glad_glGetString(GL_VERSION);
+ if (!version) return 0;
+ for (i = 0; prefixes[i]; i++) {
+ const size_t length = strlen(prefixes[i]);
+ if (strncmp(version, prefixes[i], length) == 0) {
+ version += length;
+ break;
+ }
+ }
+
+ GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor);
+
+ GLAD_GL_VERSION_ES_CM_1_0 = (major == 1 && minor >= 0) || major > 1;
+
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+int gladLoadGLES1UserPtr( GLADuserptrloadfunc load, void *userptr) {
+ int version;
+
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ if(glad_glGetString == NULL) return 0;
+ if(glad_glGetString(GL_VERSION) == NULL) return 0;
+ version = glad_gl_find_core_gles1();
+
+ glad_gl_load_GL_VERSION_ES_CM_1_0(load, userptr);
+
+ if (!glad_gl_find_extensions_gles1(version)) return 0;
+ glad_gl_load_GL_EXT_blend_minmax(load, userptr);
+ glad_gl_load_GL_KHR_debug(load, userptr);
+ glad_gl_load_GL_OES_blend_equation_separate(load, userptr);
+ glad_gl_load_GL_OES_blend_func_separate(load, userptr);
+ glad_gl_load_GL_OES_blend_subtract(load, userptr);
+ glad_gl_load_GL_OES_framebuffer_object(load, userptr);
+ glad_gl_load_GL_OES_single_precision(load, userptr);
+
+
+ glad_gl_resolve_aliases();
+
+ return version;
+}
+
+
+int gladLoadGLES1( GLADloadfunc load) {
+ return gladLoadGLES1UserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+
+
+
+
+
+#endif /* GLAD_GL_IMPLEMENTATION */
+
diff --git a/examples/opengl/resources/background.jpg b/examples/opengl/resources/background.jpg
new file mode 100644
index 0000000..fb3b418
--- /dev/null
+++ b/examples/opengl/resources/background.jpg
Binary files differ
diff --git a/examples/opengl/resources/logo.png b/examples/opengl/resources/logo.png
new file mode 100644
index 0000000..ffee4ce
--- /dev/null
+++ b/examples/opengl/resources/logo.png
Binary files differ
diff --git a/examples/opengl/resources/sansation.ttf b/examples/opengl/resources/sansation.ttf
deleted file mode 100644
index d85fbc8..0000000
--- a/examples/opengl/resources/sansation.ttf
+++ /dev/null
Binary files differ
diff --git a/examples/opengl/resources/tuffy.ttf b/examples/opengl/resources/tuffy.ttf
new file mode 100755
index 0000000..8ea6470
--- /dev/null
+++ b/examples/opengl/resources/tuffy.ttf
Binary files differ
diff --git a/examples/pong/CMakeLists.txt b/examples/pong/CMakeLists.txt
deleted file mode 100644
index a20f3b1..0000000
--- a/examples/pong/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-
-set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/pong)
-
-# all source files
-set(SRC ${SRCROOT}/Pong.cpp)
-
-# define the pong target
-sfml_add_example(pong GUI_APP
- SOURCES ${SRC}
- DEPENDS sfml-audio sfml-graphics
- RESOURCES_DIR resources)
diff --git a/examples/pong/resources/ball.wav b/examples/pong/resources/ball.wav
deleted file mode 100644
index 8b3cfba..0000000
--- a/examples/pong/resources/ball.wav
+++ /dev/null
Binary files differ
diff --git a/examples/pong/resources/sansation.ttf b/examples/pong/resources/sansation.ttf
deleted file mode 100644
index d85fbc8..0000000
--- a/examples/pong/resources/sansation.ttf
+++ /dev/null
Binary files differ
diff --git a/examples/shader/Shader.cpp b/examples/shader/Shader.cpp
index 8a81fde..7cb8cd7 100644
--- a/examples/shader/Shader.cpp
+++ b/examples/shader/Shader.cpp
@@ -17,7 +17,7 @@ class Pixelate : public Effect
public:
Pixelate() :
- Effect("pixelate")
+ Effect("Pixelate")
{
}
@@ -63,7 +63,7 @@ class WaveBlur : public Effect
public:
WaveBlur() :
- Effect("wave + blur")
+ Effect("Wave + Blur")
{
}
@@ -127,7 +127,7 @@ class StormBlink : public Effect
public:
StormBlink() :
- Effect("storm + blink")
+ Effect("Storm + Blink")
{
}
@@ -139,9 +139,9 @@ public:
{
float x = static_cast<float>(std::rand() % 800);
float y = static_cast<float>(std::rand() % 600);
- sf::Uint8 r = std::rand() % 255;
- sf::Uint8 g = std::rand() % 255;
- sf::Uint8 b = std::rand() % 255;
+ sf::Uint8 r = static_cast<sf::Uint8>(std::rand() % 255);
+ sf::Uint8 g = static_cast<sf::Uint8>(std::rand() % 255);
+ sf::Uint8 b = static_cast<sf::Uint8>(std::rand() % 255);
m_points.append(sf::Vertex(sf::Vector2f(x, y), sf::Color(r, g, b)));
}
@@ -182,7 +182,7 @@ class Edge : public Effect
public:
Edge() :
- Effect("edge post-effect")
+ Effect("Edge Post-effect")
{
}
@@ -228,8 +228,8 @@ public:
for (std::size_t i = 0; i < m_entities.size(); ++i)
{
sf::Vector2f position;
- position.x = std::cos(0.25f * (time * i + (m_entities.size() - i))) * 300 + 350;
- position.y = std::sin(0.25f * (time * (m_entities.size() - i) + i)) * 200 + 250;
+ position.x = std::cos(0.25f * (time * static_cast<float>(i) + static_cast<float>(m_entities.size() - i))) * 300 + 350;
+ position.y = std::sin(0.25f * (time * static_cast<float>(m_entities.size() - i) + static_cast<float>(i))) * 200 + 250;
m_entities[i].setPosition(position);
}
@@ -266,7 +266,7 @@ class Geometry : public Effect
public:
Geometry() :
- Effect("geometry shader billboards"),
+ Effect("Geometry Shader Billboards"),
m_pointCloud(sf::Points, 10000)
{
}
@@ -282,8 +282,8 @@ public:
{
// Spread the coordinates from -480 to +480
// So they'll always fill the viewport at 800x600
- m_pointCloud[i].position.x = rand() % 960 - 480.f;
- m_pointCloud[i].position.y = rand() % 960 - 480.f;
+ m_pointCloud[i].position.x = static_cast<float>(rand() % 960) - 480.f;
+ m_pointCloud[i].position.y = static_cast<float>(rand() % 960) - 480.f;
}
// Load the texture
@@ -301,7 +301,7 @@ public:
return true;
}
- void onUpdate(float time, float x, float y)
+ void onUpdate(float /*time*/, float x, float y)
{
// Reset our transformation matrix
m_transform = sf::Transform::Identity;
@@ -352,7 +352,7 @@ int main()
// Load the application font and pass it to the Effect class
sf::Font font;
- if (!font.loadFromFile("resources/sansation.ttf"))
+ if (!font.loadFromFile("resources/tuffy.ttf"))
return EXIT_FAILURE;
Effect::setFont(font);
@@ -433,12 +433,16 @@ int main()
}
// Update the current example
- float x = static_cast<float>(sf::Mouse::getPosition(window).x) / window.getSize().x;
- float y = static_cast<float>(sf::Mouse::getPosition(window).y) / window.getSize().y;
+ float x = static_cast<float>(sf::Mouse::getPosition(window).x) / static_cast<float>(window.getSize().x);
+ float y = static_cast<float>(sf::Mouse::getPosition(window).y) / static_cast<float>(window.getSize().y);
effects[current]->update(clock.getElapsedTime().asSeconds(), x, y);
// Clear the window
- window.clear(sf::Color(255, 128, 0));
+ if(effects[current]->getName() == "Edge Post-effect"){
+ window.clear(sf::Color::White);
+ } else {
+ window.clear(sf::Color(50, 50, 50));
+ }
// Draw the current example
window.draw(*effects[current]);
diff --git a/examples/shader/resources/background.jpg b/examples/shader/resources/background.jpg
new file mode 100644
index 0000000..4c814cb
--- /dev/null
+++ b/examples/shader/resources/background.jpg
Binary files differ
diff --git a/examples/shader/resources/devices.png b/examples/shader/resources/devices.png
index 6b1cbc8..866294a 100644
--- a/examples/shader/resources/devices.png
+++ b/examples/shader/resources/devices.png
Binary files differ
diff --git a/examples/shader/resources/sansation.ttf b/examples/shader/resources/sansation.ttf
deleted file mode 100644
index d85fbc8..0000000
--- a/examples/shader/resources/sansation.ttf
+++ /dev/null
Binary files differ
diff --git a/examples/shader/resources/tuffy.ttf b/examples/shader/resources/tuffy.ttf
new file mode 100755
index 0000000..8ea6470
--- /dev/null
+++ b/examples/shader/resources/tuffy.ttf
Binary files differ
diff --git a/examples/sound/Sound.cpp b/examples/sound/Sound.cpp
index e71aa0d..4d26a62 100644
--- a/examples/sound/Sound.cpp
+++ b/examples/sound/Sound.cpp
@@ -15,11 +15,11 @@ void playSound()
{
// Load a sound buffer from a wav file
sf::SoundBuffer buffer;
- if (!buffer.loadFromFile("resources/canary.wav"))
+ if (!buffer.loadFromFile("resources/killdeer.wav"))
return;
// Display sound informations
- std::cout << "canary.wav:" << std::endl;
+ std::cout << "killdeer.wav:" << std::endl;
std::cout << " " << buffer.getDuration().asSeconds() << " seconds" << std::endl;
std::cout << " " << buffer.getSampleRate() << " samples / sec" << std::endl;
std::cout << " " << buffer.getChannelCount() << " channels" << std::endl;
@@ -88,11 +88,14 @@ int main()
playSound();
// Play music from an ogg file
- playMusic("orchestral.ogg");
+ playMusic("doodle_pop.ogg");
// Play music from a flac file
playMusic("ding.flac");
+ // Play music from a mp3 file
+ playMusic("ding.mp3");
+
// Wait until the user presses 'enter' key
std::cout << "Press enter to exit..." << std::endl;
std::cin.ignore(10000, '\n');
diff --git a/examples/sound/resources/ding.flac b/examples/sound/resources/ding.flac
index 4e62c78..9c87329 100644
--- a/examples/sound/resources/ding.flac
+++ b/examples/sound/resources/ding.flac
Binary files differ
diff --git a/examples/sound/resources/ding.mp3 b/examples/sound/resources/ding.mp3
new file mode 100644
index 0000000..ef47fd3
--- /dev/null
+++ b/examples/sound/resources/ding.mp3
Binary files differ
diff --git a/examples/sound/resources/doodle_pop.ogg b/examples/sound/resources/doodle_pop.ogg
new file mode 100644
index 0000000..555ea34
--- /dev/null
+++ b/examples/sound/resources/doodle_pop.ogg
Binary files differ
diff --git a/examples/sound/resources/killdeer.wav b/examples/sound/resources/killdeer.wav
new file mode 100644
index 0000000..46080e9
--- /dev/null
+++ b/examples/sound/resources/killdeer.wav
Binary files differ
diff --git a/examples/tennis/CMakeLists.txt b/examples/tennis/CMakeLists.txt
new file mode 100644
index 0000000..d269936
--- /dev/null
+++ b/examples/tennis/CMakeLists.txt
@@ -0,0 +1,18 @@
+
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/tennis)
+
+# all source files
+set(SRC ${SRCROOT}/Tennis.cpp)
+if (SFML_OS_IOS)
+ set(RESOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/resources/ball.wav
+ ${CMAKE_CURRENT_SOURCE_DIR}/resources/tuffy.ttf)
+ set_source_files_properties(${RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+endif()
+
+# define the pong target
+sfml_add_example(tennis GUI_APP
+ SOURCES ${SRC}
+ BUNDLE_RESOURCES ${RESOURCES}
+ DEPENDS sfml-audio sfml-graphics
+ RESOURCES_DIR resources)
diff --git a/examples/pong/Pong.cpp b/examples/tennis/Tennis.cpp
index 58c9fd7..bc80bf5 100644
--- a/examples/pong/Pong.cpp
+++ b/examples/tennis/Tennis.cpp
@@ -8,6 +8,18 @@
#include <ctime>
#include <cstdlib>
+#ifdef SFML_SYSTEM_IOS
+#include <SFML/Main.hpp>
+#endif
+
+std::string resourcesDir()
+{
+#ifdef SFML_SYSTEM_IOS
+ return "";
+#else
+ return "resources/";
+#endif
+}
////////////////////////////////////////////////////////////
/// Entry point of application
@@ -21,22 +33,30 @@ int main()
// Define some constants
const float pi = 3.14159f;
- const int gameWidth = 800;
- const int gameHeight = 600;
+ const float gameWidth = 800;
+ const float gameHeight = 600;
sf::Vector2f paddleSize(25, 100);
float ballRadius = 10.f;
// Create the window of the application
- sf::RenderWindow window(sf::VideoMode(gameWidth, gameHeight, 32), "SFML Pong",
+ sf::RenderWindow window(sf::VideoMode(static_cast<unsigned int>(gameWidth), static_cast<unsigned int>(gameHeight), 32), "SFML Tennis",
sf::Style::Titlebar | sf::Style::Close);
window.setVerticalSyncEnabled(true);
// Load the sounds used in the game
sf::SoundBuffer ballSoundBuffer;
- if (!ballSoundBuffer.loadFromFile("resources/ball.wav"))
+ if (!ballSoundBuffer.loadFromFile(resourcesDir() + "ball.wav"))
return EXIT_FAILURE;
sf::Sound ballSound(ballSoundBuffer);
+ // Create the SFML logo texture:
+ sf::Texture sfmlLogoTexture;
+ if(!sfmlLogoTexture.loadFromFile(resourcesDir() + "sfml_logo.png"))
+ return EXIT_FAILURE;
+ sf::Sprite sfmlLogo;
+ sfmlLogo.setTexture(sfmlLogoTexture);
+ sfmlLogo.setPosition(170, 50);
+
// Create the left paddle
sf::RectangleShape leftPaddle;
leftPaddle.setSize(paddleSize - sf::Vector2f(3, 3));
@@ -56,23 +76,28 @@ int main()
// Create the ball
sf::CircleShape ball;
ball.setRadius(ballRadius - 3);
- ball.setOutlineThickness(3);
+ ball.setOutlineThickness(2);
ball.setOutlineColor(sf::Color::Black);
ball.setFillColor(sf::Color::White);
ball.setOrigin(ballRadius / 2, ballRadius / 2);
// Load the text font
sf::Font font;
- if (!font.loadFromFile("resources/sansation.ttf"))
+ if (!font.loadFromFile(resourcesDir() + "tuffy.ttf"))
return EXIT_FAILURE;
// Initialize the pause message
sf::Text pauseMessage;
pauseMessage.setFont(font);
pauseMessage.setCharacterSize(40);
- pauseMessage.setPosition(170.f, 150.f);
+ pauseMessage.setPosition(170.f, 200.f);
pauseMessage.setFillColor(sf::Color::White);
- pauseMessage.setString("Welcome to SFML pong!\nPress space to start the game");
+
+ #ifdef SFML_SYSTEM_IOS
+ pauseMessage.setString("Welcome to SFML Tennis!\nTouch the screen to start the game.");
+ #else
+ pauseMessage.setString("Welcome to SFML Tennis!\n\nPress space to start the game.");
+ #endif
// Define the paddles properties
sf::Clock AITimer;
@@ -99,7 +124,8 @@ int main()
}
// Space key pressed: play
- if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Space))
+ if (((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Space)) ||
+ (event.type == sf::Event::TouchBegan))
{
if (!isPlaying)
{
@@ -108,19 +134,28 @@ int main()
clock.restart();
// Reset the position of the paddles and ball
- leftPaddle.setPosition(10 + paddleSize.x / 2, gameHeight / 2);
- rightPaddle.setPosition(gameWidth - 10 - paddleSize.x / 2, gameHeight / 2);
- ball.setPosition(gameWidth / 2, gameHeight / 2);
+ leftPaddle.setPosition(10.f + paddleSize.x / 2.f, gameHeight / 2.f);
+ rightPaddle.setPosition(gameWidth - 10.f - paddleSize.x / 2.f, gameHeight / 2.f);
+ ball.setPosition(gameWidth / 2.f, gameHeight / 2.f);
// Reset the ball angle
do
{
// Make sure the ball initial angle is not too much vertical
- ballAngle = (std::rand() % 360) * 2 * pi / 360;
+ ballAngle = static_cast<float>(std::rand() % 360) * 2.f * pi / 360.f;
}
while (std::abs(std::cos(ballAngle)) < 0.7f);
}
}
+
+ // Window size changed, adjust view appropriately
+ if (event.type == sf::Event::Resized)
+ {
+ sf::View view;
+ view.setSize(gameWidth, gameHeight);
+ view.setCenter(gameWidth / 2.f, gameHeight /2.f);
+ window.setView(view);
+ }
}
if (isPlaying)
@@ -139,6 +174,13 @@ int main()
leftPaddle.move(0.f, paddleSpeed * deltaTime);
}
+ if (sf::Touch::isDown(0))
+ {
+ sf::Vector2i pos = sf::Touch::getPosition(0);
+ sf::Vector2f mappedPos = window.mapPixelToCoords(pos);
+ leftPaddle.setPosition(leftPaddle.getPosition().x, mappedPos.y);
+ }
+
// Move the computer's paddle
if (((rightPaddleSpeed < 0.f) && (rightPaddle.getPosition().y - paddleSize.y / 2 > 5.f)) ||
((rightPaddleSpeed > 0.f) && (rightPaddle.getPosition().y + paddleSize.y / 2 < gameHeight - 5.f)))
@@ -162,16 +204,22 @@ int main()
float factor = ballSpeed * deltaTime;
ball.move(std::cos(ballAngle) * factor, std::sin(ballAngle) * factor);
+ #ifdef SFML_SYSTEM_IOS
+ const std::string inputString = "Touch the screen to restart.";
+ #else
+ const std::string inputString = "Press space to restart or\nescape to exit.";
+ #endif
+
// Check collisions between the ball and the screen
if (ball.getPosition().x - ballRadius < 0.f)
{
isPlaying = false;
- pauseMessage.setString("You lost!\nPress space to restart or\nescape to exit");
+ pauseMessage.setString("You Lost!\n\n" + inputString);
}
if (ball.getPosition().x + ballRadius > gameWidth)
{
isPlaying = false;
- pauseMessage.setString("You won!\nPress space to restart or\nescape to exit");
+ pauseMessage.setString("You Won!\n\n" + inputString);
}
if (ball.getPosition().y - ballRadius < 0.f)
{
@@ -194,9 +242,9 @@ int main()
ball.getPosition().y - ballRadius <= leftPaddle.getPosition().y + paddleSize.y / 2)
{
if (ball.getPosition().y > leftPaddle.getPosition().y)
- ballAngle = pi - ballAngle + (std::rand() % 20) * pi / 180;
+ ballAngle = pi - ballAngle + static_cast<float>(std::rand() % 20) * pi / 180;
else
- ballAngle = pi - ballAngle - (std::rand() % 20) * pi / 180;
+ ballAngle = pi - ballAngle - static_cast<float>(std::rand() % 20) * pi / 180;
ballSound.play();
ball.setPosition(leftPaddle.getPosition().x + ballRadius + paddleSize.x / 2 + 0.1f, ball.getPosition().y);
@@ -209,9 +257,9 @@ int main()
ball.getPosition().y - ballRadius <= rightPaddle.getPosition().y + paddleSize.y / 2)
{
if (ball.getPosition().y > rightPaddle.getPosition().y)
- ballAngle = pi - ballAngle + (std::rand() % 20) * pi / 180;
+ ballAngle = pi - ballAngle + static_cast<float>(std::rand() % 20) * pi / 180;
else
- ballAngle = pi - ballAngle - (std::rand() % 20) * pi / 180;
+ ballAngle = pi - ballAngle - static_cast<float>(std::rand() % 20) * pi / 180;
ballSound.play();
ball.setPosition(rightPaddle.getPosition().x - ballRadius - paddleSize.x / 2 - 0.1f, ball.getPosition().y);
@@ -219,7 +267,7 @@ int main()
}
// Clear the window
- window.clear(sf::Color(50, 200, 50));
+ window.clear(sf::Color(50, 50, 50));
if (isPlaying)
{
@@ -232,6 +280,7 @@ int main()
{
// Draw the pause message
window.draw(pauseMessage);
+ window.draw(sfmlLogo);
}
// Display things on screen
diff --git a/examples/tennis/resources/ball.wav b/examples/tennis/resources/ball.wav
new file mode 100644
index 0000000..c969f47
--- /dev/null
+++ b/examples/tennis/resources/ball.wav
Binary files differ
diff --git a/examples/tennis/resources/sfml_logo.png b/examples/tennis/resources/sfml_logo.png
new file mode 100644
index 0000000..509acc0
--- /dev/null
+++ b/examples/tennis/resources/sfml_logo.png
Binary files differ
diff --git a/examples/tennis/resources/tuffy.ttf b/examples/tennis/resources/tuffy.ttf
new file mode 100755
index 0000000..8ea6470
--- /dev/null
+++ b/examples/tennis/resources/tuffy.ttf
Binary files differ
diff --git a/examples/voip/Client.cpp b/examples/voip/Client.cpp
index d66e0e2..3003709 100644
--- a/examples/voip/Client.cpp
+++ b/examples/voip/Client.cpp
@@ -7,8 +7,8 @@
#include <iostream>
-const sf::Uint8 audioData = 1;
-const sf::Uint8 endOfStream = 2;
+const sf::Uint8 clientAudioData = 1;
+const sf::Uint8 clientEndOfStream = 2;
////////////////////////////////////////////////////////////
@@ -71,7 +71,7 @@ private:
{
// Pack the audio samples into a network packet
sf::Packet packet;
- packet << audioData;
+ packet << clientAudioData;
packet.append(samples, sampleCount * sizeof(sf::Int16));
// Send the audio packet to the server
@@ -86,7 +86,7 @@ private:
{
// Send a "end-of-stream" packet
sf::Packet packet;
- packet << endOfStream;
+ packet << clientEndOfStream;
m_socket.send(packet);
// Close the socket
diff --git a/examples/voip/Server.cpp b/examples/voip/Server.cpp
index 0875bf9..577c8aa 100644
--- a/examples/voip/Server.cpp
+++ b/examples/voip/Server.cpp
@@ -4,13 +4,14 @@
////////////////////////////////////////////////////////////
#include <SFML/Audio.hpp>
#include <SFML/Network.hpp>
+#include <cstring>
#include <iomanip>
#include <iostream>
#include <iterator>
-const sf::Uint8 audioData = 1;
-const sf::Uint8 endOfStream = 2;
+const sf::Uint8 serverAudioData = 1;
+const sf::Uint8 serverEndOfStream = 2;
////////////////////////////////////////////////////////////
@@ -84,7 +85,7 @@ private:
// (don't forget that we run in two separate threads)
{
sf::Lock lock(m_mutex);
- m_tempBuffer.assign(m_samples.begin() + m_offset, m_samples.end());
+ m_tempBuffer.assign(m_samples.begin() + static_cast<std::vector<sf::Int16>::difference_type>(m_offset), m_samples.end());
}
// Fill audio data to pass to the stream
@@ -103,7 +104,7 @@ private:
////////////////////////////////////////////////////////////
virtual void onSeek(sf::Time timeOffset)
{
- m_offset = timeOffset.asMilliseconds() * getSampleRate() * getChannelCount() / 1000;
+ m_offset = static_cast<std::size_t>(timeOffset.asMilliseconds()) * getSampleRate() * getChannelCount() / 1000;
}
////////////////////////////////////////////////////////////
@@ -123,20 +124,21 @@ private:
sf::Uint8 id;
packet >> id;
- if (id == audioData)
+ if (id == serverAudioData)
{
// Extract audio samples from the packet, and append it to our samples buffer
- const sf::Int16* samples = reinterpret_cast<const sf::Int16*>(static_cast<const char*>(packet.getData()) + 1);
- std::size_t sampleCount = (packet.getDataSize() - 1) / sizeof(sf::Int16);
+ std::size_t sampleCount = (packet.getDataSize() - 1) / sizeof(sf::Int16);
// Don't forget that the other thread can access the sample array at any time
// (so we protect any operation on it with the mutex)
{
sf::Lock lock(m_mutex);
- std::copy(samples, samples + sampleCount, std::back_inserter(m_samples));
+ std::size_t oldSize = m_samples.size();
+ m_samples.resize(oldSize + sampleCount);
+ std::memcpy(&(m_samples[oldSize]), static_cast<const char*>(packet.getData()) + 1, sampleCount * sizeof(sf::Int16));
}
}
- else if (id == endOfStream)
+ else if (id == serverEndOfStream)
{
// End of stream reached: we stop receiving audio data
std::cout << "Audio data has been 100% received!" << std::endl;
diff --git a/examples/vulkan/CMakeLists.txt b/examples/vulkan/CMakeLists.txt
new file mode 100644
index 0000000..e35c091
--- /dev/null
+++ b/examples/vulkan/CMakeLists.txt
@@ -0,0 +1,14 @@
+
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/vulkan)
+
+# all source files
+set(SRC ${SRCROOT}/Vulkan.cpp)
+
+# define the window target
+sfml_add_example(vulkan GUI_APP
+ SOURCES ${SRC}
+ DEPENDS sfml-graphics
+ RESOURCES_DIR resources)
+
+# external dependency headers
+target_include_directories(vulkan SYSTEM PRIVATE ${PROJECT_SOURCE_DIR}/examples/vulkan) \ No newline at end of file
diff --git a/examples/vulkan/Vulkan.cpp b/examples/vulkan/Vulkan.cpp
new file mode 100644
index 0000000..ade2d14
--- /dev/null
+++ b/examples/vulkan/Vulkan.cpp
@@ -0,0 +1,2559 @@
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#define GLAD_VULKAN_IMPLEMENTATION
+#include <vulkan.h>
+
+// Include graphics because we use sf::Image for loading images
+#include <SFML/Graphics.hpp>
+
+#include <SFML/Window.hpp>
+#include <vector>
+#include <limits>
+#include <cstring>
+#include <cmath>
+
+
+////////////////////////////////////////////////////////////
+// Helper functions
+////////////////////////////////////////////////////////////
+namespace
+{
+ typedef float Vec3[3];
+ typedef float Matrix[4][4];
+
+ // Multiply 2 matrices
+ void matrixMultiply(Matrix& result, const Matrix& left, const Matrix& right)
+ {
+ Matrix temp;
+
+ for (int i = 0; i < 4; i++)
+ {
+ for (int j = 0; j < 4; j++)
+ temp[i][j] = left[0][j] * right[i][0] + left[1][j] * right[i][1] + left[2][j] * right[i][2] + left[3][j] * right[i][3];
+ }
+
+ std::memcpy(result, temp, sizeof(Matrix));
+ }
+
+ // Rotate a matrix around the x-axis
+ void matrixRotateX(Matrix& result, float angle)
+ {
+ Matrix matrix = {
+ {1.f, 0.f, 0.f, 0.f},
+ {0.f, std::cos(angle), std::sin(angle), 0.f},
+ {0.f, -std::sin(angle), std::cos(angle), 0.f},
+ {0.f, 0.f, 0.f, 1.f}
+ };
+
+ matrixMultiply(result, result, matrix);
+ }
+
+ // Rotate a matrix around the y-axis
+ void matrixRotateY(Matrix& result, float angle)
+ {
+ Matrix matrix = {
+ { std::cos(angle), 0.f, std::sin(angle), 0.f},
+ { 0.f, 1.f, 0.f, 0.f},
+ {-std::sin(angle), 0.f, std::cos(angle), 0.f},
+ { 0.f, 0.f, 0.f, 1.f}
+ };
+
+ matrixMultiply(result, result, matrix);
+ }
+
+ // Rotate a matrix around the z-axis
+ void matrixRotateZ(Matrix& result, float angle)
+ {
+ Matrix matrix = {
+ { std::cos(angle), std::sin(angle), 0.f, 0.f},
+ {-std::sin(angle), std::cos(angle), 0.f, 0.f},
+ { 0.f, 0.f, 1.f, 0.f},
+ { 0.f, 0.f, 0.f, 1.f}
+ };
+
+ matrixMultiply(result, result, matrix);
+ }
+
+ // Construct a lookat view matrix
+ void matrixLookAt(Matrix& result, const Vec3& eye, const Vec3& center, const Vec3& up)
+ {
+ // Forward-looking vector
+ Vec3 forward = {
+ center[0] - eye[0],
+ center[1] - eye[1],
+ center[2] - eye[2]
+ };
+
+ // Normalize
+ float factor = 1.0f / std::sqrt(forward[0] * forward[0] + forward[1] * forward[1] + forward[2] * forward[2]);
+
+ for(int i = 0; i < 3; i++)
+ forward[i] = forward[i] * factor;
+
+ // Side vector (Forward cross product Up)
+ Vec3 side = {
+ forward[1] * up[2] - forward[2] * up[1],
+ forward[2] * up[0] - forward[0] * up[2],
+ forward[0] * up[1] - forward[1] * up[0]
+ };
+
+ // Normalize
+ factor = 1.0f / std::sqrt(side[0] * side[0] + side[1] * side[1] + side[2] * side[2]);
+
+ for(int i = 0; i < 3; i++)
+ side[i] = side[i] * factor;
+
+ result[0][0] = side[0];
+ result[0][1] = side[1] * forward[2] - side[2] * forward[1];
+ result[0][2] = -forward[0];
+ result[0][3] = 0.f;
+
+ result[1][0] = side[1];
+ result[1][1] = side[2] * forward[0] - side[0] * forward[2];
+ result[1][2] = -forward[1];
+ result[1][3] = 0.f;
+
+ result[2][0] = side[2];
+ result[2][1] = side[0] * forward[1] - side[1] * forward[0];
+ result[2][2] = -forward[2];
+ result[2][3] = 0.f;
+
+ result[3][0] = (-eye[0]) * result[0][0] + (-eye[1]) * result[1][0] + (-eye[2]) * result[2][0];
+ result[3][1] = (-eye[0]) * result[0][1] + (-eye[1]) * result[1][1] + (-eye[2]) * result[2][1];
+ result[3][2] = (-eye[0]) * result[0][2] + (-eye[1]) * result[1][2] + (-eye[2]) * result[2][2];
+ result[3][3] = (-eye[0]) * result[0][3] + (-eye[1]) * result[1][3] + (-eye[2]) * result[2][3] + 1.0f;
+ }
+
+ // Construct a perspective projection matrix
+ void matrixPerspective(Matrix& result, float fov, float aspect, float nearPlane, float farPlane)
+ {
+ const float a = 1.f / std::tan(fov / 2.f);
+
+ result[0][0] = a / aspect;
+ result[0][1] = 0.f;
+ result[0][2] = 0.f;
+ result[0][3] = 0.f;
+
+ result[1][0] = 0.f;
+ result[1][1] = -a;
+ result[1][2] = 0.f;
+ result[1][3] = 0.f;
+
+ result[2][0] = 0.f;
+ result[2][1] = 0.f;
+ result[2][2] = -((farPlane + nearPlane) / (farPlane - nearPlane));
+ result[2][3] = -1.f;
+
+ result[3][0] = 0.f;
+ result[3][1] = 0.f;
+ result[3][2] = -((2.f * farPlane * nearPlane) / (farPlane - nearPlane));
+ result[3][3] = 0.f;
+ }
+
+ // Clamp a value between low and high values
+ template<typename T>
+ T clamp(T value, T low, T high)
+ {
+ return (value <= low) ? low : ((value >= high) ? high : value);
+ }
+
+ // Helper function we pass to GLAD to load Vulkan functions via SFML
+ GLADapiproc getVulkanFunction(const char* name)
+ {
+ return sf::Vulkan::getFunction(name);
+ }
+
+ // Debug we pass to Vulkan to call when it detects warnings or errors
+ VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugReportFlagsEXT, VkDebugReportObjectTypeEXT, uint64_t, size_t, int32_t, const char*, const char* pMessage, void*)
+ {
+ sf::err() << pMessage << std::endl;
+
+ return VK_FALSE;
+ }
+}
+
+
+////////////////////////////////////////////////////////////
+// VulkanExample class
+////////////////////////////////////////////////////////////
+class VulkanExample
+{
+public:
+ // Constructor
+ VulkanExample() :
+ window(sf::VideoMode(800, 600), "SFML window with Vulkan", sf::Style::Default),
+ vulkanAvailable(sf::Vulkan::isAvailable()),
+ maxFramesInFlight(2),
+ currentFrame(0),
+ swapchainOutOfDate(false),
+ instance(0),
+ debugReportCallback(0),
+ surface(0),
+ gpu(0),
+ queueFamilyIndex(-1),
+ device(0),
+ queue(0),
+ swapchainFormat(),
+ swapchainExtent(),
+ swapchain(0),
+ depthFormat(VK_FORMAT_UNDEFINED),
+ depthImage(0),
+ depthImageMemory(0),
+ depthImageView(0),
+ vertexShaderModule(0),
+ fragmentShaderModule(0),
+ descriptorSetLayout(0),
+ pipelineLayout(0),
+ renderPass(0),
+ graphicsPipeline(0),
+ commandPool(0),
+ vertexBuffer(0),
+ vertexBufferMemory(0),
+ indexBuffer(0),
+ indexBufferMemory(0),
+ textureImage(0),
+ textureImageMemory(0),
+ textureImageView(0),
+ textureSampler(0),
+ descriptorPool(0)
+ {
+ // Vulkan setup procedure
+ if (vulkanAvailable) setupInstance();
+ if (vulkanAvailable) setupDebugReportCallback();
+ if (vulkanAvailable) setupSurface();
+ if (vulkanAvailable) setupPhysicalDevice();
+ if (vulkanAvailable) setupLogicalDevice();
+ if (vulkanAvailable) setupSwapchain();
+ if (vulkanAvailable) setupSwapchainImages();
+ if (vulkanAvailable) setupShaders();
+ if (vulkanAvailable) setupRenderpass();
+ if (vulkanAvailable) setupDescriptorSetLayout();
+ if (vulkanAvailable) setupPipelineLayout();
+ if (vulkanAvailable) setupPipeline();
+ if (vulkanAvailable) setupCommandPool();
+ if (vulkanAvailable) setupVertexBuffer();
+ if (vulkanAvailable) setupIndexBuffer();
+ if (vulkanAvailable) setupUniformBuffers();
+ if (vulkanAvailable) setupDepthImage();
+ if (vulkanAvailable) setupDepthImageView();
+ if (vulkanAvailable) setupTextureImage();
+ if (vulkanAvailable) setupTextureImageView();
+ if (vulkanAvailable) setupTextureSampler();
+ if (vulkanAvailable) setupFramebuffers();
+ if (vulkanAvailable) setupDescriptorPool();
+ if (vulkanAvailable) setupDescriptorSets();
+ if (vulkanAvailable) setupCommandBuffers();
+ if (vulkanAvailable) setupDraw();
+ if (vulkanAvailable) setupSemaphores();
+ if (vulkanAvailable) setupFences();
+
+ // If something went wrong, notify the user by setting the window title
+ if (!vulkanAvailable)
+ window.setTitle("SFML window with Vulkan (Vulkan not available)");
+ }
+
+
+ // Destructor
+ ~VulkanExample()
+ {
+ // Wait until there are no pending frames
+ if (device)
+ vkDeviceWaitIdle(device);
+
+ // Teardown swapchain
+ cleanupSwapchain();
+
+ // Vulkan teardown procedure
+ for (std::size_t i = 0; i < fences.size(); i++)
+ vkDestroyFence(device, fences[i], 0);
+
+ for (std::size_t i = 0; i < renderFinishedSemaphores.size(); i++)
+ vkDestroySemaphore(device, renderFinishedSemaphores[i], 0);
+
+ for (std::size_t i = 0; i < imageAvailableSemaphores.size(); i++)
+ vkDestroySemaphore(device, imageAvailableSemaphores[i], 0);
+
+ if (descriptorPool)
+ vkDestroyDescriptorPool(device, descriptorPool, 0);
+
+ for (std::size_t i = 0; i < uniformBuffersMemory.size(); i++)
+ vkFreeMemory(device, uniformBuffersMemory[i], 0);
+
+ for (std::size_t i = 0; i < uniformBuffers.size(); i++)
+ vkDestroyBuffer(device, uniformBuffers[i], 0);
+
+ if (textureSampler)
+ vkDestroySampler(device, textureSampler, 0);
+
+ if (textureImageView)
+ vkDestroyImageView(device, textureImageView, 0);
+
+ if (textureImageMemory)
+ vkFreeMemory(device, textureImageMemory, 0);
+
+ if (textureImage)
+ vkDestroyImage(device, textureImage, 0);
+
+ if (indexBufferMemory)
+ vkFreeMemory(device, indexBufferMemory, 0);
+
+ if (indexBuffer)
+ vkDestroyBuffer(device, indexBuffer, 0);
+
+ if (vertexBufferMemory)
+ vkFreeMemory(device, vertexBufferMemory, 0);
+
+ if (vertexBuffer)
+ vkDestroyBuffer(device, vertexBuffer, 0);
+
+ if (commandPool)
+ vkDestroyCommandPool(device, commandPool, 0);
+
+ if (descriptorSetLayout)
+ vkDestroyDescriptorSetLayout(device, descriptorSetLayout, 0);
+
+ if (fragmentShaderModule)
+ vkDestroyShaderModule(device, fragmentShaderModule, 0);
+
+ if (vertexShaderModule)
+ vkDestroyShaderModule(device, vertexShaderModule, 0);
+
+ if (device)
+ vkDestroyDevice(device, 0);
+
+ if (surface)
+ vkDestroySurfaceKHR(instance, surface, 0);
+
+ if (debugReportCallback)
+ vkDestroyDebugReportCallbackEXT(instance, debugReportCallback, 0);
+
+ if (instance)
+ vkDestroyInstance(instance, 0);
+ }
+
+ // Cleanup swapchain
+ void cleanupSwapchain()
+ {
+ // Swapchain teardown procedure
+ for (std::size_t i = 0; i < fences.size(); i++)
+ vkWaitForFences(device, 1, &fences[i], VK_TRUE, std::numeric_limits<uint64_t>::max());
+
+ if (commandBuffers.size())
+ vkFreeCommandBuffers(device, commandPool, static_cast<sf::Uint32>(commandBuffers.size()), &commandBuffers[0]);
+
+ commandBuffers.clear();
+
+ for (std::size_t i = 0; i < swapchainFramebuffers.size(); i++)
+ vkDestroyFramebuffer(device, swapchainFramebuffers[i], 0);
+
+ swapchainFramebuffers.clear();
+
+ if (graphicsPipeline)
+ vkDestroyPipeline(device, graphicsPipeline, 0);
+
+ if (renderPass)
+ vkDestroyRenderPass(device, renderPass, 0);
+
+ if (pipelineLayout)
+ vkDestroyPipelineLayout(device, pipelineLayout, 0);
+
+ if (depthImageView)
+ vkDestroyImageView(device, depthImageView, 0);
+
+ if (depthImageMemory)
+ vkFreeMemory(device, depthImageMemory, 0);
+
+ if (depthImage)
+ vkDestroyImage(device, depthImage, 0);
+
+ for (std::size_t i = 0; i < swapchainImageViews.size(); i++)
+ vkDestroyImageView(device, swapchainImageViews[i], 0);
+
+ swapchainImageViews.clear();
+
+ if (swapchain)
+ vkDestroySwapchainKHR(device, swapchain, 0);
+ }
+
+ // Cleanup and recreate swapchain
+ void recreateSwapchain()
+ {
+ // Wait until there are no pending frames
+ vkDeviceWaitIdle(device);
+
+ // Cleanup swapchain
+ cleanupSwapchain();
+
+ // Swapchain setup procedure
+ if (vulkanAvailable) setupSwapchain();
+ if (vulkanAvailable) setupSwapchainImages();
+ if (vulkanAvailable) setupPipelineLayout();
+ if (vulkanAvailable) setupRenderpass();
+ if (vulkanAvailable) setupPipeline();
+ if (vulkanAvailable) setupDepthImage();
+ if (vulkanAvailable) setupDepthImageView();
+ if (vulkanAvailable) setupFramebuffers();
+ if (vulkanAvailable) setupCommandBuffers();
+ if (vulkanAvailable) setupDraw();
+ }
+
+ // Setup Vulkan instance
+ void setupInstance()
+ {
+ // Load bootstrap entry points
+ gladLoadVulkan(0, getVulkanFunction);
+
+ if (!vkCreateInstance)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Retrieve the available instance layers
+ uint32_t objectCount = 0;
+
+ std::vector<VkLayerProperties> layers;
+
+ if (vkEnumerateInstanceLayerProperties(&objectCount, 0) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ layers.resize(objectCount);
+
+ if (vkEnumerateInstanceLayerProperties(&objectCount, &layers[0]) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Activate the layers we are interested in
+ std::vector<const char*> validationLayers;
+
+ for (std::size_t i = 0; i < layers.size(); i++)
+ {
+ // VK_LAYER_LUNARG_standard_validation, meta-layer for the following layers:
+ // -- VK_LAYER_GOOGLE_threading
+ // -- VK_LAYER_LUNARG_parameter_validation
+ // -- VK_LAYER_LUNARG_device_limits
+ // -- VK_LAYER_LUNARG_object_tracker
+ // -- VK_LAYER_LUNARG_image
+ // -- VK_LAYER_LUNARG_core_validation
+ // -- VK_LAYER_LUNARG_swapchain
+ // -- VK_LAYER_GOOGLE_unique_objects
+ // These layers perform error checking and warn about bad or sub-optimal Vulkan API usage
+ // VK_LAYER_LUNARG_monitor appends an FPS counter to the window title
+ if (!std::strcmp(layers[i].layerName, "VK_LAYER_LUNARG_standard_validation"))
+ {
+ validationLayers.push_back("VK_LAYER_LUNARG_standard_validation");
+ }
+ else if (!std::strcmp(layers[i].layerName, "VK_LAYER_LUNARG_monitor"))
+ {
+ validationLayers.push_back("VK_LAYER_LUNARG_monitor");
+ }
+ }
+
+ // Retrieve the extensions we need to enable in order to use Vulkan with SFML
+ std::vector<const char*> requiredExtentions = sf::Vulkan::getGraphicsRequiredInstanceExtensions();
+ requiredExtentions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
+
+ // Register our application information
+ VkApplicationInfo applicationInfo = VkApplicationInfo();
+ applicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
+ applicationInfo.pApplicationName = "SFML Vulkan Test";
+ applicationInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
+ applicationInfo.pEngineName = "SFML Vulkan Test Engine";
+ applicationInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
+ applicationInfo.apiVersion = VK_API_VERSION_1_0;
+
+ VkInstanceCreateInfo instanceCreateInfo = VkInstanceCreateInfo();
+ instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
+ instanceCreateInfo.pApplicationInfo = &applicationInfo;
+ instanceCreateInfo.enabledLayerCount = static_cast<sf::Uint32>(validationLayers.size());
+ instanceCreateInfo.ppEnabledLayerNames = &validationLayers[0];
+ instanceCreateInfo.enabledExtensionCount = static_cast<sf::Uint32>(requiredExtentions.size());
+ instanceCreateInfo.ppEnabledExtensionNames = &requiredExtentions[0];
+
+ // Try to create a Vulkan instance with debug report enabled
+ VkResult result = vkCreateInstance(&instanceCreateInfo, 0, &instance);
+
+ // If an extension is missing, try disabling debug report
+ if (result == VK_ERROR_EXTENSION_NOT_PRESENT)
+ {
+ requiredExtentions.pop_back();
+
+ instanceCreateInfo.enabledExtensionCount = static_cast<sf::Uint32>(requiredExtentions.size());
+ instanceCreateInfo.ppEnabledExtensionNames = &requiredExtentions[0];
+
+ result = vkCreateInstance(&instanceCreateInfo, 0, &instance);
+ }
+
+ // If instance creation still fails, give up
+ if (result != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Load instance entry points
+ gladLoadVulkan(0, getVulkanFunction);
+ }
+
+ // Setup our debug callback function to be called by Vulkan
+ void setupDebugReportCallback()
+ {
+ // Don't try to register the callback if the extension is not available
+ if (!vkCreateDebugReportCallbackEXT)
+ return;
+
+ // Register for warnings and errors
+ VkDebugReportCallbackCreateInfoEXT debugReportCallbackCreateInfo = VkDebugReportCallbackCreateInfoEXT();
+ debugReportCallbackCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
+ debugReportCallbackCreateInfo.flags = VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT;
+ debugReportCallbackCreateInfo.pfnCallback = debugCallback;
+
+ // Create the debug callback
+ if (vkCreateDebugReportCallbackEXT(instance, &debugReportCallbackCreateInfo, 0, &debugReportCallback) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Setup the SFML window Vulkan rendering surface
+ void setupSurface()
+ {
+ if (!window.createVulkanSurface(instance, surface))
+ vulkanAvailable = false;
+ }
+
+ // Select a GPU to use and query its capabilities
+ void setupPhysicalDevice()
+ {
+ // Last sanity check
+ if (!vkEnumeratePhysicalDevices || !vkCreateDevice || !vkGetPhysicalDeviceProperties)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Retrieve list of GPUs
+ uint32_t objectCount = 0;
+
+ std::vector<VkPhysicalDevice> devices;
+
+ if (vkEnumeratePhysicalDevices(instance, &objectCount, 0) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ devices.resize(objectCount);
+
+ if (vkEnumeratePhysicalDevices(instance, &objectCount, &devices[0]) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Look for a GPU that supports swapchains
+ for (std::size_t i = 0; i < devices.size(); i++)
+ {
+ VkPhysicalDeviceProperties deviceProperties;
+ vkGetPhysicalDeviceProperties(devices[i], &deviceProperties);
+
+ std::vector<VkExtensionProperties> extensions;
+
+ if (vkEnumerateDeviceExtensionProperties(devices[i], 0, &objectCount, 0) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ extensions.resize(objectCount);
+
+ if (vkEnumerateDeviceExtensionProperties(devices[i], 0, &objectCount, &extensions[0]) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ bool supportsSwapchain = false;
+
+ for (std::size_t j = 0; j < extensions.size(); j++)
+ {
+ if (!std::strcmp(extensions[j].extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME))
+ {
+ supportsSwapchain = true;
+ break;
+ }
+ }
+
+ if (!supportsSwapchain)
+ continue;
+
+ // Prefer discrete over integrated GPUs if multiple are available
+ if (deviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU)
+ {
+ gpu = devices[i];
+ break;
+ }
+ else if (deviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU)
+ {
+ gpu = devices[i];
+ }
+ }
+
+ if (!gpu)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Load physical device entry points
+ gladLoadVulkan(gpu, getVulkanFunction);
+
+ // Check what depth formats are available and select one
+ VkFormatProperties formatProperties = VkFormatProperties();
+
+ vkGetPhysicalDeviceFormatProperties(gpu, VK_FORMAT_D24_UNORM_S8_UINT, &formatProperties);
+
+ if (formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
+ depthFormat = VK_FORMAT_D24_UNORM_S8_UINT;
+ }
+ else
+ {
+ vkGetPhysicalDeviceFormatProperties(gpu, VK_FORMAT_D32_SFLOAT_S8_UINT, &formatProperties);
+
+ if (formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
+ depthFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
+ }
+ else
+ {
+ vkGetPhysicalDeviceFormatProperties(gpu, VK_FORMAT_D32_SFLOAT, &formatProperties);
+
+ if (formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
+ depthFormat = VK_FORMAT_D32_SFLOAT;
+ }
+ else
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+ }
+ }
+
+ // Setup logical device and device queue
+ void setupLogicalDevice()
+ {
+ // Select a queue family that supports graphics operations and surface presentation
+ uint32_t objectCount = 0;
+
+ std::vector<VkQueueFamilyProperties> queueFamilyProperties;
+
+ vkGetPhysicalDeviceQueueFamilyProperties(gpu, &objectCount, 0);
+
+ queueFamilyProperties.resize(objectCount);
+
+ vkGetPhysicalDeviceQueueFamilyProperties(gpu, &objectCount, &queueFamilyProperties[0]);
+
+ for (std::size_t i = 0; i < queueFamilyProperties.size(); i++)
+ {
+ VkBool32 surfaceSupported = VK_FALSE;
+
+ vkGetPhysicalDeviceSurfaceSupportKHR(gpu, static_cast<sf::Uint32>(i), surface, &surfaceSupported);
+
+ if ((queueFamilyProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) && (surfaceSupported == VK_TRUE))
+ {
+ queueFamilyIndex = static_cast<int>(i);
+ break;
+ }
+ }
+
+ if (queueFamilyIndex < 0)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ float queuePriority = 1.0f;
+
+ VkDeviceQueueCreateInfo deviceQueueCreateInfo = VkDeviceQueueCreateInfo();
+ deviceQueueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+ deviceQueueCreateInfo.queueCount = 1;
+ deviceQueueCreateInfo.queueFamilyIndex = static_cast<uint32_t>(queueFamilyIndex);
+ deviceQueueCreateInfo.pQueuePriorities = &queuePriority;
+
+ // Enable the swapchain extension
+ const char* extentions[1] = { VK_KHR_SWAPCHAIN_EXTENSION_NAME };
+
+ // Enable anisotropic filtering
+ VkPhysicalDeviceFeatures physicalDeviceFeatures = VkPhysicalDeviceFeatures();
+ physicalDeviceFeatures.samplerAnisotropy = VK_TRUE;
+
+ VkDeviceCreateInfo deviceCreateInfo = VkDeviceCreateInfo();
+ deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
+ deviceCreateInfo.enabledExtensionCount = 1;
+ deviceCreateInfo.ppEnabledExtensionNames = extentions;
+ deviceCreateInfo.queueCreateInfoCount = 1;
+ deviceCreateInfo.pQueueCreateInfos = &deviceQueueCreateInfo;
+ deviceCreateInfo.pEnabledFeatures = &physicalDeviceFeatures;
+
+ // Create our logical device
+ if (vkCreateDevice(gpu, &deviceCreateInfo, 0, &device) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Retrieve a handle to the logical device command queue
+ vkGetDeviceQueue(device, static_cast<uint32_t>(queueFamilyIndex), 0, &queue);
+ }
+
+ // Query surface formats and set up swapchain
+ void setupSwapchain()
+ {
+ // Select a surface format that supports RGBA color format
+ uint32_t objectCount = 0;
+
+ std::vector<VkSurfaceFormatKHR> surfaceFormats;
+
+ if (vkGetPhysicalDeviceSurfaceFormatsKHR(gpu, surface, &objectCount, 0) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ surfaceFormats.resize(objectCount);
+
+ if (vkGetPhysicalDeviceSurfaceFormatsKHR(gpu, surface, &objectCount, &surfaceFormats[0]) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ if ((surfaceFormats.size() == 1) && (surfaceFormats[0].format == VK_FORMAT_UNDEFINED))
+ {
+ swapchainFormat.format = VK_FORMAT_B8G8R8A8_UNORM;
+ swapchainFormat.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
+ }
+ else if (!surfaceFormats.empty())
+ {
+ for (std::size_t i = 0; i < surfaceFormats.size(); i++)
+ {
+ if ((surfaceFormats[i].format == VK_FORMAT_B8G8R8A8_UNORM) && (surfaceFormats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR))
+ {
+ swapchainFormat.format = VK_FORMAT_B8G8R8A8_UNORM;
+ swapchainFormat.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
+
+ break;
+ }
+ }
+
+ if (swapchainFormat.format == VK_FORMAT_UNDEFINED)
+ swapchainFormat = surfaceFormats[0];
+ }
+ else
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Select a swapchain present mode
+ std::vector<VkPresentModeKHR> presentModes;
+
+ if (vkGetPhysicalDeviceSurfacePresentModesKHR(gpu, surface, &objectCount, 0) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ presentModes.resize(objectCount);
+
+ if (vkGetPhysicalDeviceSurfacePresentModesKHR(gpu, surface, &objectCount, &presentModes[0]) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Prefer mailbox over FIFO if it is available
+ VkPresentModeKHR presentMode = VK_PRESENT_MODE_FIFO_KHR;
+
+ for (std::size_t i = 0; i < presentModes.size(); i++)
+ {
+ if (presentModes[i] == VK_PRESENT_MODE_MAILBOX_KHR)
+ {
+ presentMode = presentModes[i];
+ break;
+ }
+ }
+
+ // Determine size and count of swapchain images
+ VkSurfaceCapabilitiesKHR surfaceCapabilities;
+
+ if (vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu, surface, &surfaceCapabilities) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ swapchainExtent.width = clamp<uint32_t>(window.getSize().x, surfaceCapabilities.minImageExtent.width, surfaceCapabilities.maxImageExtent.width);
+ swapchainExtent.height = clamp<uint32_t>(window.getSize().y, surfaceCapabilities.minImageExtent.height, surfaceCapabilities.maxImageExtent.height);
+
+ uint32_t imageCount = clamp<uint32_t>(2, surfaceCapabilities.minImageCount, surfaceCapabilities.maxImageCount);
+
+ VkSwapchainCreateInfoKHR swapchainCreateInfo = VkSwapchainCreateInfoKHR();
+ swapchainCreateInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
+ swapchainCreateInfo.surface = surface;
+ swapchainCreateInfo.minImageCount = imageCount;
+ swapchainCreateInfo.imageFormat = swapchainFormat.format;
+ swapchainCreateInfo.imageColorSpace = swapchainFormat.colorSpace;
+ swapchainCreateInfo.imageExtent = swapchainExtent;
+ swapchainCreateInfo.imageArrayLayers = 1;
+ swapchainCreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ swapchainCreateInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ swapchainCreateInfo.preTransform = surfaceCapabilities.currentTransform;
+ swapchainCreateInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
+ swapchainCreateInfo.presentMode = presentMode;
+ swapchainCreateInfo.clipped = VK_TRUE;
+ swapchainCreateInfo.oldSwapchain = VK_NULL_HANDLE;
+
+ // Create the swapchain
+ if (vkCreateSwapchainKHR(device, &swapchainCreateInfo, 0, &swapchain) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Retrieve the swapchain images and create image views for them
+ void setupSwapchainImages()
+ {
+ // Retrieve swapchain images
+ uint32_t objectCount = 0;
+
+ if (vkGetSwapchainImagesKHR(device, swapchain, &objectCount, 0) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ swapchainImages.resize(objectCount);
+ swapchainImageViews.resize(objectCount);
+
+ if (vkGetSwapchainImagesKHR(device, swapchain, &objectCount, &swapchainImages[0]) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ VkImageViewCreateInfo imageViewCreateInfo = VkImageViewCreateInfo();
+ imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ imageViewCreateInfo.format = swapchainFormat.format;
+ imageViewCreateInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
+ imageViewCreateInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
+ imageViewCreateInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
+ imageViewCreateInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
+ imageViewCreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ imageViewCreateInfo.subresourceRange.baseMipLevel = 0;
+ imageViewCreateInfo.subresourceRange.levelCount = 1;
+ imageViewCreateInfo.subresourceRange.baseArrayLayer = 0;
+ imageViewCreateInfo.subresourceRange.layerCount = 1;
+
+ // Create an image view for each swapchain image
+ for (std::size_t i = 0; i < swapchainImages.size(); i++)
+ {
+ imageViewCreateInfo.image = swapchainImages[i];
+
+ if (vkCreateImageView(device, &imageViewCreateInfo, 0, &swapchainImageViews[i]) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+ }
+
+ // Load vertex and fragment shader modules
+ void setupShaders()
+ {
+ VkShaderModuleCreateInfo shaderModuleCreateInfo = VkShaderModuleCreateInfo();
+ shaderModuleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
+
+ // Use the vertex shader SPIR-V code to create a vertex shader module
+ {
+ sf::FileInputStream file;
+
+ if (!file.open("resources/shader.vert.spv"))
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ std::vector<uint32_t> buffer(static_cast<std::size_t>(file.getSize()) / sizeof(uint32_t));
+
+ if (file.read(&buffer[0], file.getSize()) != file.getSize())
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ shaderModuleCreateInfo.codeSize = buffer.size() * sizeof(uint32_t);
+ shaderModuleCreateInfo.pCode = &buffer[0];
+
+ if (vkCreateShaderModule(device, &shaderModuleCreateInfo, 0, &vertexShaderModule) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Use the fragment shader SPIR-V code to create a fragment shader module
+ {
+ sf::FileInputStream file;
+
+ if (!file.open("resources/shader.frag.spv"))
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ std::vector<uint32_t> buffer(static_cast<std::size_t>(file.getSize()) / sizeof(uint32_t));
+
+ if (file.read(&buffer[0], file.getSize()) != file.getSize())
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ shaderModuleCreateInfo.codeSize = buffer.size() * sizeof(uint32_t);
+ shaderModuleCreateInfo.pCode = &buffer[0];
+
+ if (vkCreateShaderModule(device, &shaderModuleCreateInfo, 0, &fragmentShaderModule) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Prepare the shader stage information for later pipeline creation
+ shaderStages[0]= VkPipelineShaderStageCreateInfo();
+ shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
+ shaderStages[0].module = vertexShaderModule;
+ shaderStages[0].pName = "main";
+
+ shaderStages[1]= VkPipelineShaderStageCreateInfo();
+ shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ shaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
+ shaderStages[1].module = fragmentShaderModule;
+ shaderStages[1].pName = "main";
+ }
+
+ // Setup renderpass and its subpass dependencies
+ void setupRenderpass()
+ {
+ VkAttachmentDescription attachmentDescriptions[2];
+
+ // Color attachment
+ attachmentDescriptions[0] = VkAttachmentDescription();
+ attachmentDescriptions[0].format = swapchainFormat.format;
+ attachmentDescriptions[0].samples = VK_SAMPLE_COUNT_1_BIT;
+ attachmentDescriptions[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ attachmentDescriptions[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+ attachmentDescriptions[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
+ attachmentDescriptions[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
+ attachmentDescriptions[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ attachmentDescriptions[0].finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
+
+ // Depth attachment
+ attachmentDescriptions[1] = VkAttachmentDescription();
+ attachmentDescriptions[1].format = depthFormat;
+ attachmentDescriptions[1].samples = VK_SAMPLE_COUNT_1_BIT;
+ attachmentDescriptions[1].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ attachmentDescriptions[1].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
+ attachmentDescriptions[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
+ attachmentDescriptions[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
+ attachmentDescriptions[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ attachmentDescriptions[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+
+ VkAttachmentReference attachmentReferences[2];
+
+ attachmentReferences[0] = VkAttachmentReference();
+ attachmentReferences[0].attachment = 0;
+ attachmentReferences[0].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+
+ attachmentReferences[1] = VkAttachmentReference();
+ attachmentReferences[1].attachment = 1;
+ attachmentReferences[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+
+ // Set up the renderpass to depend on commands that execute before the renderpass begins
+ VkSubpassDescription subpassDescription = VkSubpassDescription();
+ subpassDescription.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
+ subpassDescription.colorAttachmentCount = 1;
+ subpassDescription.pColorAttachments = &attachmentReferences[0];
+ subpassDescription.pDepthStencilAttachment = &attachmentReferences[1];
+
+ VkSubpassDependency subpassDependency = VkSubpassDependency();
+ subpassDependency.srcSubpass = VK_SUBPASS_EXTERNAL;
+ subpassDependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ subpassDependency.srcAccessMask = 0;
+ subpassDependency.dstSubpass = 0;
+ subpassDependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ subpassDependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+
+ VkRenderPassCreateInfo renderPassCreateInfo = VkRenderPassCreateInfo();
+ renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
+ renderPassCreateInfo.attachmentCount = 2;
+ renderPassCreateInfo.pAttachments = attachmentDescriptions;
+ renderPassCreateInfo.subpassCount = 1;
+ renderPassCreateInfo.pSubpasses = &subpassDescription;
+ renderPassCreateInfo.dependencyCount = 1;
+ renderPassCreateInfo.pDependencies = &subpassDependency;
+
+ // Create the renderpass
+ if (vkCreateRenderPass(device, &renderPassCreateInfo, 0, &renderPass) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Set up uniform buffer and texture sampler descriptor set layouts
+ void setupDescriptorSetLayout()
+ {
+ VkDescriptorSetLayoutBinding descriptorSetLayoutBindings[2];
+
+ // Layout binding for uniform buffer
+ descriptorSetLayoutBindings[0] = VkDescriptorSetLayoutBinding();
+ descriptorSetLayoutBindings[0].binding = 0;
+ descriptorSetLayoutBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ descriptorSetLayoutBindings[0].descriptorCount = 1;
+ descriptorSetLayoutBindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
+
+ // Layout binding for texture sampler
+ descriptorSetLayoutBindings[1] = VkDescriptorSetLayoutBinding();
+ descriptorSetLayoutBindings[1].binding = 1;
+ descriptorSetLayoutBindings[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ descriptorSetLayoutBindings[1].descriptorCount = 1;
+ descriptorSetLayoutBindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
+
+ VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo = VkDescriptorSetLayoutCreateInfo();
+ descriptorSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
+ descriptorSetLayoutCreateInfo.bindingCount = 2;
+ descriptorSetLayoutCreateInfo.pBindings = descriptorSetLayoutBindings;
+
+ // Create descriptor set layout
+ if (vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCreateInfo, 0, &descriptorSetLayout) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Set up pipeline layout
+ void setupPipelineLayout()
+ {
+ VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = VkPipelineLayoutCreateInfo();
+ pipelineLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+ pipelineLayoutCreateInfo.setLayoutCount = 1;
+ pipelineLayoutCreateInfo.pSetLayouts = &descriptorSetLayout;
+
+ // Create pipeline layout
+ if (vkCreatePipelineLayout(device, &pipelineLayoutCreateInfo, 0, &pipelineLayout) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Set up rendering pipeline
+ void setupPipeline()
+ {
+ // Set up how the vertex shader pulls data out of our vertex buffer
+ VkVertexInputBindingDescription vertexInputBindingDescription = VkVertexInputBindingDescription();
+ vertexInputBindingDescription.binding = 0;
+ vertexInputBindingDescription.stride = sizeof(float) * 9;
+ vertexInputBindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
+
+ // Set up how the vertex buffer data is interpreted as attributes by the vertex shader
+ VkVertexInputAttributeDescription vertexInputAttributeDescriptions[3];
+
+ // Position attribute
+ vertexInputAttributeDescriptions[0] = VkVertexInputAttributeDescription();
+ vertexInputAttributeDescriptions[0].binding = 0;
+ vertexInputAttributeDescriptions[0].location = 0;
+ vertexInputAttributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT;
+ vertexInputAttributeDescriptions[0].offset = sizeof(float) * 0;
+
+ // Color attribute
+ vertexInputAttributeDescriptions[1] = VkVertexInputAttributeDescription();
+ vertexInputAttributeDescriptions[1].binding = 0;
+ vertexInputAttributeDescriptions[1].location = 1;
+ vertexInputAttributeDescriptions[1].format = VK_FORMAT_R32G32B32A32_SFLOAT;
+ vertexInputAttributeDescriptions[1].offset = sizeof(float) * 3;
+
+ // Texture coordinate attribute
+ vertexInputAttributeDescriptions[2] = VkVertexInputAttributeDescription();
+ vertexInputAttributeDescriptions[2].binding = 0;
+ vertexInputAttributeDescriptions[2].location = 2;
+ vertexInputAttributeDescriptions[2].format = VK_FORMAT_R32G32_SFLOAT;
+ vertexInputAttributeDescriptions[2].offset = sizeof(float) * 7;
+
+ VkPipelineVertexInputStateCreateInfo vertexInputStateCreateInfo = VkPipelineVertexInputStateCreateInfo();
+ vertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
+ vertexInputStateCreateInfo.vertexBindingDescriptionCount = 1;
+ vertexInputStateCreateInfo.pVertexBindingDescriptions = &vertexInputBindingDescription;
+ vertexInputStateCreateInfo.vertexAttributeDescriptionCount = 3;
+ vertexInputStateCreateInfo.pVertexAttributeDescriptions = vertexInputAttributeDescriptions;
+
+ // We want to generate a triangle list with our vertex data
+ VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateCreateInfo = VkPipelineInputAssemblyStateCreateInfo();
+ inputAssemblyStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
+ inputAssemblyStateCreateInfo.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+ inputAssemblyStateCreateInfo.primitiveRestartEnable = VK_FALSE;
+
+ // Set up the viewport
+ VkViewport viewport = VkViewport();
+ viewport.x = 0.0f;
+ viewport.y = 0.0f;
+ viewport.width = static_cast<float>(swapchainExtent.width);
+ viewport.height = static_cast<float>(swapchainExtent.height);
+ viewport.minDepth = 0.0f;
+ viewport.maxDepth = 1.f;
+
+ // Set up the scissor region
+ VkRect2D scissor = VkRect2D();
+ scissor.offset.x = 0;
+ scissor.offset.y = 0;
+ scissor.extent = swapchainExtent;
+
+ VkPipelineViewportStateCreateInfo pipelineViewportStateCreateInfo = VkPipelineViewportStateCreateInfo();
+ pipelineViewportStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
+ pipelineViewportStateCreateInfo.viewportCount = 1;
+ pipelineViewportStateCreateInfo.pViewports = &viewport;
+ pipelineViewportStateCreateInfo.scissorCount = 1;
+ pipelineViewportStateCreateInfo.pScissors = &scissor;
+
+ // Set up rasterization parameters: fill polygons, no backface culling, front face is counter-clockwise
+ VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateCreateInfo = VkPipelineRasterizationStateCreateInfo();
+ pipelineRasterizationStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
+ pipelineRasterizationStateCreateInfo.depthClampEnable = VK_FALSE;
+ pipelineRasterizationStateCreateInfo.rasterizerDiscardEnable = VK_FALSE;
+ pipelineRasterizationStateCreateInfo.polygonMode = VK_POLYGON_MODE_FILL;
+ pipelineRasterizationStateCreateInfo.lineWidth = 1.0f;
+ pipelineRasterizationStateCreateInfo.cullMode = VK_CULL_MODE_NONE;
+ pipelineRasterizationStateCreateInfo.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
+ pipelineRasterizationStateCreateInfo.depthBiasEnable = VK_FALSE;
+
+ // Enable depth testing and disable scissor testing
+ VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateCreateInfo = VkPipelineDepthStencilStateCreateInfo();
+ pipelineDepthStencilStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
+ pipelineDepthStencilStateCreateInfo.depthTestEnable = VK_TRUE;
+ pipelineDepthStencilStateCreateInfo.depthWriteEnable = VK_TRUE;
+ pipelineDepthStencilStateCreateInfo.depthCompareOp = VK_COMPARE_OP_LESS;
+ pipelineDepthStencilStateCreateInfo.depthBoundsTestEnable = VK_FALSE;
+ pipelineDepthStencilStateCreateInfo.stencilTestEnable = VK_FALSE;
+
+ // Enable multi-sampling
+ VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo = VkPipelineMultisampleStateCreateInfo();
+ pipelineMultisampleStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
+ pipelineMultisampleStateCreateInfo.sampleShadingEnable = VK_FALSE;
+ pipelineMultisampleStateCreateInfo.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
+
+ // Set up blending parameters
+ VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState = VkPipelineColorBlendAttachmentState();
+ pipelineColorBlendAttachmentState.blendEnable = VK_TRUE;
+ pipelineColorBlendAttachmentState.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
+ pipelineColorBlendAttachmentState.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
+ pipelineColorBlendAttachmentState.colorBlendOp = VK_BLEND_OP_ADD;
+ pipelineColorBlendAttachmentState.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
+ pipelineColorBlendAttachmentState.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
+ pipelineColorBlendAttachmentState.alphaBlendOp = VK_BLEND_OP_ADD;
+ pipelineColorBlendAttachmentState.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+
+ VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateCreateInfo = VkPipelineColorBlendStateCreateInfo();
+ pipelineColorBlendStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
+ pipelineColorBlendStateCreateInfo.logicOpEnable = VK_FALSE;
+ pipelineColorBlendStateCreateInfo.attachmentCount = 1;
+ pipelineColorBlendStateCreateInfo.pAttachments = &pipelineColorBlendAttachmentState;
+
+ VkGraphicsPipelineCreateInfo graphicsPipelineCreateInfo = VkGraphicsPipelineCreateInfo();
+ graphicsPipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
+ graphicsPipelineCreateInfo.stageCount = 2;
+ graphicsPipelineCreateInfo.pStages = shaderStages;
+ graphicsPipelineCreateInfo.pVertexInputState = &vertexInputStateCreateInfo;
+ graphicsPipelineCreateInfo.pInputAssemblyState = &inputAssemblyStateCreateInfo;
+ graphicsPipelineCreateInfo.pViewportState = &pipelineViewportStateCreateInfo;
+ graphicsPipelineCreateInfo.pRasterizationState = &pipelineRasterizationStateCreateInfo;
+ graphicsPipelineCreateInfo.pDepthStencilState = &pipelineDepthStencilStateCreateInfo;
+ graphicsPipelineCreateInfo.pMultisampleState = &pipelineMultisampleStateCreateInfo;
+ graphicsPipelineCreateInfo.pColorBlendState = &pipelineColorBlendStateCreateInfo;
+ graphicsPipelineCreateInfo.layout = pipelineLayout;
+ graphicsPipelineCreateInfo.renderPass = renderPass;
+ graphicsPipelineCreateInfo.subpass = 0;
+
+ // Create our graphics pipeline
+ if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &graphicsPipelineCreateInfo, 0, &graphicsPipeline) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Use our renderpass and swapchain images to create the corresponding framebuffers
+ void setupFramebuffers()
+ {
+ swapchainFramebuffers.resize(swapchainImageViews.size());
+
+ VkFramebufferCreateInfo framebufferCreateInfo = VkFramebufferCreateInfo();
+ framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
+ framebufferCreateInfo.renderPass = renderPass;
+ framebufferCreateInfo.attachmentCount = 2;
+ framebufferCreateInfo.width = swapchainExtent.width;
+ framebufferCreateInfo.height = swapchainExtent.height;
+ framebufferCreateInfo.layers = 1;
+
+ for (std::size_t i = 0; i < swapchainFramebuffers.size(); i++)
+ {
+ // Each framebuffer consists of a corresponding swapchain image and the shared depth image
+ VkImageView attachments[] = {swapchainImageViews[i], depthImageView};
+
+ framebufferCreateInfo.pAttachments = attachments;
+
+ // Create the framebuffer
+ if (vkCreateFramebuffer(device, &framebufferCreateInfo, 0, &swapchainFramebuffers[i]) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+ }
+
+ // Set up our command pool
+ void setupCommandPool()
+ {
+ // We want to be able to reset command buffers after submitting them
+ VkCommandPoolCreateInfo commandPoolCreateInfo = VkCommandPoolCreateInfo();
+ commandPoolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
+ commandPoolCreateInfo.queueFamilyIndex = static_cast<uint32_t>(queueFamilyIndex);
+ commandPoolCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
+
+ // Create our command pool
+ if (vkCreateCommandPool(device, &commandPoolCreateInfo, 0, &commandPool) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Helper to create a generic buffer with the specified size, usage and memory flags
+ bool createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& memory)
+ {
+ // We only have a single queue so we can request exclusive access
+ VkBufferCreateInfo bufferCreateInfo = VkBufferCreateInfo();
+ bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ bufferCreateInfo.size = size;
+ bufferCreateInfo.usage = usage;
+ bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+
+ // Create the buffer, this does not allocate any memory for it yet
+ if (vkCreateBuffer(device, &bufferCreateInfo, 0, &buffer) != VK_SUCCESS)
+ return false;
+
+ // Check what kind of memory we need to request from the GPU
+ VkMemoryRequirements memoryRequirements = VkMemoryRequirements();
+ vkGetBufferMemoryRequirements(device, buffer, &memoryRequirements);
+
+ // Check what GPU memory type is available for us to allocate out of
+ VkPhysicalDeviceMemoryProperties memoryProperties = VkPhysicalDeviceMemoryProperties();
+ vkGetPhysicalDeviceMemoryProperties(gpu, &memoryProperties);
+
+ uint32_t memoryType = 0;
+
+ for (; memoryType < memoryProperties.memoryTypeCount; memoryType++)
+ {
+ if ((memoryRequirements.memoryTypeBits & static_cast<unsigned int>(1 << memoryType)) &&
+ ((memoryProperties.memoryTypes[memoryType].propertyFlags & properties) == properties))
+ break;
+ }
+
+ if (memoryType == memoryProperties.memoryTypeCount)
+ return false;
+
+ VkMemoryAllocateInfo memoryAllocateInfo = VkMemoryAllocateInfo();
+ memoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ memoryAllocateInfo.allocationSize = memoryRequirements.size;
+ memoryAllocateInfo.memoryTypeIndex = memoryType;
+
+ // Allocate the memory out of the GPU pool for the required memory type
+ if (vkAllocateMemory(device, &memoryAllocateInfo, 0, &memory) != VK_SUCCESS)
+ return false;
+
+ // Bind the allocated memory to our buffer object
+ if (vkBindBufferMemory(device, buffer, memory, 0) != VK_SUCCESS)
+ return false;
+
+ return true;
+ }
+
+ // Helper to copy the contents of one buffer to another buffer
+ bool copyBuffer(VkBuffer dst, VkBuffer src, VkDeviceSize size)
+ {
+ // Allocate a primary command buffer out of our command pool
+ VkCommandBufferAllocateInfo commandBufferAllocateInfo = VkCommandBufferAllocateInfo();
+ commandBufferAllocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
+ commandBufferAllocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
+ commandBufferAllocateInfo.commandPool = commandPool;
+ commandBufferAllocateInfo.commandBufferCount = 1;
+
+ VkCommandBuffer commandBuffer;
+
+ if (vkAllocateCommandBuffers(device, &commandBufferAllocateInfo, &commandBuffer) != VK_SUCCESS)
+ return false;
+
+ // Begin the command buffer
+ VkCommandBufferBeginInfo commandBufferBeginInfo = VkCommandBufferBeginInfo();
+ commandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ commandBufferBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
+
+ if (vkBeginCommandBuffer(commandBuffer, &commandBufferBeginInfo) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ return false;
+ }
+
+ // Add our buffer copy command
+ VkBufferCopy bufferCopy = VkBufferCopy();
+ bufferCopy.srcOffset = 0;
+ bufferCopy.dstOffset = 0;
+ bufferCopy.size = size;
+
+ vkCmdCopyBuffer(commandBuffer, src, dst, 1, &bufferCopy);
+
+ // End and submit the command buffer
+ vkEndCommandBuffer(commandBuffer);
+
+ VkSubmitInfo submitInfo = VkSubmitInfo();
+ submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submitInfo.commandBufferCount = 1;
+ submitInfo.pCommandBuffers = &commandBuffer;
+
+ if (vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ return false;
+ }
+
+ // Ensure the command buffer has been processed
+ if (vkQueueWaitIdle(queue) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ return false;
+ }
+
+ // Free the command buffer
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ return true;
+ }
+
+ // Create our vertex buffer and upload its data
+ void setupVertexBuffer()
+ {
+ float vertexData[] = {
+ // X Y Z R G B A U V
+ -0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
+ 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
+ -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
+
+ -0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f,
+ 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f,
+ -0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f,
+
+ 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f,
+ 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f,
+
+ -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
+ -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
+ -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
+ -0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
+
+ -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f,
+ 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
+ -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f,
+
+ -0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
+ 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f,
+ 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f,
+ -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f
+ };
+
+ // Create a staging buffer that is writable by the CPU
+ VkBuffer stagingBuffer = 0;
+ VkDeviceMemory stagingBufferMemory = 0;
+
+ if (!createBuffer(
+ sizeof(vertexData),
+ VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ stagingBuffer,
+ stagingBufferMemory
+ ))
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ void* ptr;
+
+ // Map the buffer into our address space
+ if (vkMapMemory(device, stagingBufferMemory, 0, sizeof(vertexData), 0, &ptr) != VK_SUCCESS)
+ {
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Copy the vertex data into the buffer
+ std::memcpy(ptr, vertexData, sizeof(vertexData));
+
+ // Unmap the buffer
+ vkUnmapMemory(device, stagingBufferMemory);
+
+ // Create the GPU local vertex buffer
+ if (!createBuffer(
+ sizeof(vertexData),
+ VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+ vertexBuffer,
+ vertexBufferMemory
+ ))
+ {
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Copy the contents of the staging buffer into the GPU vertex buffer
+ vulkanAvailable = copyBuffer(vertexBuffer, stagingBuffer, sizeof(vertexData));
+
+ // Free the staging buffer and its memory
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+ }
+
+ // Create our index buffer and upload its data
+ void setupIndexBuffer()
+ {
+ uint16_t indexData[] = {
+ 0, 1, 2,
+ 2, 3, 0,
+
+ 4, 5, 6,
+ 6, 7, 4,
+
+ 8, 9, 10,
+ 10, 11, 8,
+
+ 12, 13, 14,
+ 14, 15, 12,
+
+ 16, 17, 18,
+ 18, 19, 16,
+
+ 20, 21, 22,
+ 22, 23, 20
+ };
+
+ // Create a staging buffer that is writable by the CPU
+ VkBuffer stagingBuffer = 0;
+ VkDeviceMemory stagingBufferMemory = 0;
+
+ if (!createBuffer(
+ sizeof(indexData),
+ VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ stagingBuffer,
+ stagingBufferMemory
+ ))
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ void* ptr;
+
+ // Map the buffer into our address space
+ if (vkMapMemory(device, stagingBufferMemory, 0, sizeof(indexData), 0, &ptr) != VK_SUCCESS)
+ {
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Copy the index data into the buffer
+ std::memcpy(ptr, indexData, sizeof(indexData));
+
+ // Unmap the buffer
+ vkUnmapMemory(device, stagingBufferMemory);
+
+ // Create the GPU local index buffer
+ if (!createBuffer(
+ sizeof(indexData),
+ VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+ indexBuffer,
+ indexBufferMemory
+ ))
+ {
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Copy the contents of the staging buffer into the GPU index buffer
+ vulkanAvailable = copyBuffer(indexBuffer, stagingBuffer, sizeof(indexData));
+
+ // Free the staging buffer and its memory
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+ }
+
+ // Create our uniform buffer but don't upload any data yet
+ void setupUniformBuffers()
+ {
+ // Create a uniform buffer for every frame that might be in flight to prevent clobbering
+ for (size_t i = 0; i < swapchainImages.size(); i++)
+ {
+ uniformBuffers.push_back(0);
+ uniformBuffersMemory.push_back(0);
+
+ // The uniform buffer will be host visible and coherent since we use it for streaming data every frame
+ if (!createBuffer(
+ sizeof(Matrix) * 3,
+ VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ uniformBuffers[i],
+ uniformBuffersMemory[i]
+ ))
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+ }
+
+ // Helper to create a generic image with the specified size, format, usage and memory flags
+ bool createImage(uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory)
+ {
+ // We only have a single queue so we can request exclusive access
+ VkImageCreateInfo imageCreateInfo = VkImageCreateInfo();
+ imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
+ imageCreateInfo.extent.width = width;
+ imageCreateInfo.extent.height = height;
+ imageCreateInfo.extent.depth = 1;
+ imageCreateInfo.mipLevels = 1;
+ imageCreateInfo.arrayLayers = 1;
+ imageCreateInfo.format = format;
+ imageCreateInfo.tiling = tiling;
+ imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ imageCreateInfo.usage = usage;
+ imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
+ imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+
+ // Create the image, this does not allocate any memory for it yet
+ if (vkCreateImage(device, &imageCreateInfo, 0, &image) != VK_SUCCESS)
+ return false;
+
+ // Check what kind of memory we need to request from the GPU
+ VkMemoryRequirements memoryRequirements = VkMemoryRequirements();
+ vkGetImageMemoryRequirements(device, image, &memoryRequirements);
+
+ // Check what GPU memory type is available for us to allocate out of
+ VkPhysicalDeviceMemoryProperties memoryProperties = VkPhysicalDeviceMemoryProperties();
+ vkGetPhysicalDeviceMemoryProperties(gpu, &memoryProperties);
+
+ uint32_t memoryType = 0;
+
+ for (; memoryType < memoryProperties.memoryTypeCount; memoryType++)
+ {
+ if ((memoryRequirements.memoryTypeBits & static_cast<unsigned int>(1 << memoryType)) &&
+ ((memoryProperties.memoryTypes[memoryType].propertyFlags & properties) == properties))
+ break;
+ }
+
+ if (memoryType == memoryProperties.memoryTypeCount)
+ return false;
+
+ VkMemoryAllocateInfo memoryAllocateInfo = VkMemoryAllocateInfo();
+ memoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ memoryAllocateInfo.allocationSize = memoryRequirements.size;
+ memoryAllocateInfo.memoryTypeIndex = memoryType;
+
+ // Allocate the memory out of the GPU pool for the required memory type
+ if (vkAllocateMemory(device, &memoryAllocateInfo, 0, &imageMemory) != VK_SUCCESS)
+ return false;
+
+ // Bind the allocated memory to our image object
+ if (vkBindImageMemory(device, image, imageMemory, 0) != VK_SUCCESS)
+ return false;
+
+ return true;
+ }
+
+ // Create our depth image and transition it into the proper layout
+ void setupDepthImage()
+ {
+ // Create our depth image
+ if (!createImage(
+ swapchainExtent.width,
+ swapchainExtent.height,
+ depthFormat,
+ VK_IMAGE_TILING_OPTIMAL,
+ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+ depthImage,
+ depthImageMemory
+ ))
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Allocate a command buffer
+ VkCommandBufferAllocateInfo commandBufferAllocateInfo = VkCommandBufferAllocateInfo();
+ commandBufferAllocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
+ commandBufferAllocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
+ commandBufferAllocateInfo.commandPool = commandPool;
+ commandBufferAllocateInfo.commandBufferCount = 1;
+
+ VkCommandBuffer commandBuffer;
+
+ if (vkAllocateCommandBuffers(device, &commandBufferAllocateInfo, &commandBuffer) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Begin the command buffer
+ VkCommandBufferBeginInfo commandBufferBeginInfo = VkCommandBufferBeginInfo();
+ commandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ commandBufferBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
+
+ VkSubmitInfo submitInfo = VkSubmitInfo();
+ submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submitInfo.commandBufferCount = 1;
+ submitInfo.pCommandBuffers = &commandBuffer;
+
+ if (vkBeginCommandBuffer(commandBuffer, &commandBufferBeginInfo) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Submit a barrier to transition the image layout to depth stencil optimal
+ VkImageMemoryBarrier barrier = VkImageMemoryBarrier();
+ barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+ barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.image = depthImage;
+ barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | ((depthFormat == VK_FORMAT_D32_SFLOAT) ? 0 : VK_IMAGE_ASPECT_STENCIL_BIT);
+ barrier.subresourceRange.baseMipLevel = 0;
+ barrier.subresourceRange.levelCount = 1;
+ barrier.subresourceRange.baseArrayLayer = 0;
+ barrier.subresourceRange.layerCount = 1;
+ barrier.srcAccessMask = 0;
+ barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+
+ vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, 0, 0, 0, 0, 0, 1, &barrier);
+
+ // End and submit the command buffer
+ if (vkEndCommandBuffer(commandBuffer) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ if (vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Ensure the command buffer has been processed
+ if (vkQueueWaitIdle(queue) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Free the command buffer
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+ }
+
+ // Create an image view for our depth image
+ void setupDepthImageView()
+ {
+ VkImageViewCreateInfo imageViewCreateInfo = VkImageViewCreateInfo();
+ imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ imageViewCreateInfo.image = depthImage;
+ imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ imageViewCreateInfo.format = depthFormat;
+ imageViewCreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | ((depthFormat == VK_FORMAT_D32_SFLOAT) ? 0 : VK_IMAGE_ASPECT_STENCIL_BIT);
+ imageViewCreateInfo.subresourceRange.baseMipLevel = 0;
+ imageViewCreateInfo.subresourceRange.levelCount = 1;
+ imageViewCreateInfo.subresourceRange.baseArrayLayer = 0;
+ imageViewCreateInfo.subresourceRange.layerCount = 1;
+
+ // Create the depth image view
+ if (vkCreateImageView(device, &imageViewCreateInfo, 0, &depthImageView) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Create an image for our texture data
+ void setupTextureImage()
+ {
+ // Load the image data
+ sf::Image imageData;
+
+ if (!imageData.loadFromFile("resources/logo.png"))
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Create a staging buffer to transfer the data with
+ VkDeviceSize imageSize = imageData.getSize().x * imageData.getSize().y * 4;
+
+ VkBuffer stagingBuffer;
+ VkDeviceMemory stagingBufferMemory;
+ createBuffer(imageSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory);
+
+ void* ptr;
+
+ // Map the buffer into our address space
+ if (vkMapMemory(device, stagingBufferMemory, 0, imageSize, 0, &ptr) != VK_SUCCESS)
+ {
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Copy the image data into the buffer
+ std::memcpy(ptr, imageData.getPixelsPtr(), static_cast<std::size_t>(imageSize));
+
+ // Unmap the buffer
+ vkUnmapMemory(device, stagingBufferMemory);
+
+ // Create a GPU local image
+ if (!createImage(
+ imageData.getSize().x,
+ imageData.getSize().y,
+ VK_FORMAT_R8G8B8A8_UNORM,
+ VK_IMAGE_TILING_OPTIMAL,
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+ textureImage,
+ textureImageMemory
+ ))
+ {
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Create a command buffer
+ VkCommandBufferAllocateInfo commandBufferAllocateInfo = VkCommandBufferAllocateInfo();
+ commandBufferAllocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
+ commandBufferAllocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
+ commandBufferAllocateInfo.commandPool = commandPool;
+ commandBufferAllocateInfo.commandBufferCount = 1;
+
+ VkCommandBuffer commandBuffer;
+
+ if (vkAllocateCommandBuffers(device, &commandBufferAllocateInfo, &commandBuffer) != VK_SUCCESS)
+ {
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Begin the command buffer
+ VkCommandBufferBeginInfo commandBufferBeginInfo = VkCommandBufferBeginInfo();
+ commandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ commandBufferBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
+
+ VkSubmitInfo submitInfo = VkSubmitInfo();
+ submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submitInfo.commandBufferCount = 1;
+ submitInfo.pCommandBuffers = &commandBuffer;
+
+ if (vkBeginCommandBuffer(commandBuffer, &commandBufferBeginInfo) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Submit a barrier to transition the image layout to transfer destionation optimal
+ VkImageMemoryBarrier barrier = VkImageMemoryBarrier();
+ barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+ barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
+ barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.image = textureImage;
+ barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ barrier.subresourceRange.baseMipLevel = 0;
+ barrier.subresourceRange.levelCount = 1;
+ barrier.subresourceRange.baseArrayLayer = 0;
+ barrier.subresourceRange.layerCount = 1;
+ barrier.srcAccessMask = 0;
+ barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+
+ vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, 0, 0, 0, 1, &barrier);
+
+ if (vkEndCommandBuffer(commandBuffer) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ if (vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Ensure the command buffer has been processed
+ if (vkQueueWaitIdle(queue) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Begin the command buffer
+ if (vkBeginCommandBuffer(commandBuffer, &commandBufferBeginInfo) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Copy the staging buffer contents into the image
+ VkBufferImageCopy bufferImageCopy = VkBufferImageCopy();
+ bufferImageCopy.bufferOffset = 0;
+ bufferImageCopy.bufferRowLength = 0;
+ bufferImageCopy.bufferImageHeight = 0;
+ bufferImageCopy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ bufferImageCopy.imageSubresource.mipLevel = 0;
+ bufferImageCopy.imageSubresource.baseArrayLayer = 0;
+ bufferImageCopy.imageSubresource.layerCount = 1;
+ bufferImageCopy.imageOffset.x = 0;
+ bufferImageCopy.imageOffset.y = 0;
+ bufferImageCopy.imageOffset.z = 0;
+ bufferImageCopy.imageExtent.width = imageData.getSize().x;
+ bufferImageCopy.imageExtent.height = imageData.getSize().y;
+ bufferImageCopy.imageExtent.depth = 1;
+
+ vkCmdCopyBufferToImage(commandBuffer, stagingBuffer, textureImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &bufferImageCopy);
+
+ // End and submit the command buffer
+ if (vkEndCommandBuffer(commandBuffer) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ if (vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Ensure the command buffer has been processed
+ if (vkQueueWaitIdle(queue) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Begin the command buffer
+ if (vkBeginCommandBuffer(commandBuffer, &commandBufferBeginInfo) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Submit a barrier to transition the image layout from transfer destionation optimal to shader read-only optimal
+ barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
+ barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
+
+ vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, 0, 0, 0, 1, &barrier);
+
+ // End and submit the command buffer
+ if (vkEndCommandBuffer(commandBuffer) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ if (vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Ensure the command buffer has been processed
+ if (vkQueueWaitIdle(queue) != VK_SUCCESS)
+ {
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Free the command buffer
+ vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
+
+ vkFreeMemory(device, stagingBufferMemory, 0);
+ vkDestroyBuffer(device, stagingBuffer, 0);
+ }
+
+ // Create an image view for our texture
+ void setupTextureImageView()
+ {
+ VkImageViewCreateInfo imageViewCreateInfo = VkImageViewCreateInfo();
+ imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ imageViewCreateInfo.image = textureImage;
+ imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ imageViewCreateInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
+ imageViewCreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ imageViewCreateInfo.subresourceRange.baseMipLevel = 0;
+ imageViewCreateInfo.subresourceRange.levelCount = 1;
+ imageViewCreateInfo.subresourceRange.baseArrayLayer = 0;
+ imageViewCreateInfo.subresourceRange.layerCount = 1;
+
+ // Create our texture image view
+ if (vkCreateImageView(device, &imageViewCreateInfo, 0, &textureImageView) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Create a sampler for our texture
+ void setupTextureSampler()
+ {
+ // Sampler parameters: linear min/mag filtering, 4x anisotropic
+ VkSamplerCreateInfo samplerCreateInfo = VkSamplerCreateInfo();
+ samplerCreateInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
+ samplerCreateInfo.magFilter = VK_FILTER_LINEAR;
+ samplerCreateInfo.minFilter = VK_FILTER_LINEAR;
+ samplerCreateInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+ samplerCreateInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+ samplerCreateInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+ samplerCreateInfo.anisotropyEnable = VK_TRUE;
+ samplerCreateInfo.maxAnisotropy = 4;
+ samplerCreateInfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK;
+ samplerCreateInfo.unnormalizedCoordinates = VK_FALSE;
+ samplerCreateInfo.compareEnable = VK_FALSE;
+ samplerCreateInfo.compareOp = VK_COMPARE_OP_ALWAYS;
+ samplerCreateInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
+ samplerCreateInfo.mipLodBias = 0.0f;
+ samplerCreateInfo.minLod = 0.0f;
+ samplerCreateInfo.maxLod = 0.0f;
+
+ // Create our sampler
+ if (vkCreateSampler(device, &samplerCreateInfo, 0, &textureSampler) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Set up our descriptor pool
+ void setupDescriptorPool()
+ {
+ // We need to allocate as many descriptor sets as we have frames in flight
+ VkDescriptorPoolSize descriptorPoolSizes[2];
+
+ descriptorPoolSizes[0] = VkDescriptorPoolSize();
+ descriptorPoolSizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ descriptorPoolSizes[0].descriptorCount = static_cast<uint32_t>(swapchainImages.size());
+
+ descriptorPoolSizes[1] = VkDescriptorPoolSize();
+ descriptorPoolSizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ descriptorPoolSizes[1].descriptorCount = static_cast<uint32_t>(swapchainImages.size());
+
+ VkDescriptorPoolCreateInfo descriptorPoolCreateInfo = VkDescriptorPoolCreateInfo();
+ descriptorPoolCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
+ descriptorPoolCreateInfo.poolSizeCount = 2;
+ descriptorPoolCreateInfo.pPoolSizes = descriptorPoolSizes;
+ descriptorPoolCreateInfo.maxSets = static_cast<uint32_t>(swapchainImages.size());
+
+ // Create the descriptor pool
+ if (vkCreateDescriptorPool(device, &descriptorPoolCreateInfo, 0, &descriptorPool) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Set up our descriptor sets
+ void setupDescriptorSets()
+ {
+ // Allocate a descriptor set for each frame in flight
+ std::vector<VkDescriptorSetLayout> descriptorSetLayouts(swapchainImages.size(), descriptorSetLayout);
+
+ VkDescriptorSetAllocateInfo descriptorSetAllocateInfo = VkDescriptorSetAllocateInfo();
+ descriptorSetAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
+ descriptorSetAllocateInfo.descriptorPool = descriptorPool;
+ descriptorSetAllocateInfo.descriptorSetCount = static_cast<uint32_t>(swapchainImages.size());
+ descriptorSetAllocateInfo.pSetLayouts = &descriptorSetLayouts[0];
+
+ descriptorSets.resize(swapchainImages.size());
+
+ if (vkAllocateDescriptorSets(device, &descriptorSetAllocateInfo, &descriptorSets[0]) != VK_SUCCESS)
+ {
+ descriptorSets.clear();
+
+ vulkanAvailable = false;
+ return;
+ }
+
+ // For every descriptor set, set up the bindings to our uniform buffer and texture sampler
+ for (std::size_t i = 0; i < descriptorSets.size(); i++)
+ {
+ VkWriteDescriptorSet writeDescriptorSets[2];
+
+ // Uniform buffer binding information
+ VkDescriptorBufferInfo descriptorBufferInfo = VkDescriptorBufferInfo();
+ descriptorBufferInfo.buffer = uniformBuffers[i];
+ descriptorBufferInfo.offset = 0;
+ descriptorBufferInfo.range = sizeof(Matrix) * 3;
+
+ writeDescriptorSets[0] = VkWriteDescriptorSet();
+ writeDescriptorSets[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ writeDescriptorSets[0].dstSet = descriptorSets[i];
+ writeDescriptorSets[0].dstBinding = 0;
+ writeDescriptorSets[0].dstArrayElement = 0;
+ writeDescriptorSets[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ writeDescriptorSets[0].descriptorCount = 1;
+ writeDescriptorSets[0].pBufferInfo = &descriptorBufferInfo;
+
+ // Texture sampler binding information
+ VkDescriptorImageInfo descriptorImageInfo = VkDescriptorImageInfo();
+ descriptorImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ descriptorImageInfo.imageView = textureImageView;
+ descriptorImageInfo.sampler = textureSampler;
+
+ writeDescriptorSets[1] = VkWriteDescriptorSet();
+ writeDescriptorSets[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ writeDescriptorSets[1].dstSet = descriptorSets[i];
+ writeDescriptorSets[1].dstBinding = 1;
+ writeDescriptorSets[1].dstArrayElement = 0;
+ writeDescriptorSets[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ writeDescriptorSets[1].descriptorCount = 1;
+ writeDescriptorSets[1].pImageInfo = &descriptorImageInfo;
+
+ // Update the desciptor set
+ vkUpdateDescriptorSets(device, 2, writeDescriptorSets, 0, 0);
+ }
+ }
+
+ // Set up the command buffers we use for drawing each frame
+ void setupCommandBuffers()
+ {
+ // We need a command buffer for every frame in flight
+ commandBuffers.resize(swapchainFramebuffers.size());
+
+ // These are primary command buffers
+ VkCommandBufferAllocateInfo commandBufferAllocateInfo = VkCommandBufferAllocateInfo();
+ commandBufferAllocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
+ commandBufferAllocateInfo.commandPool = commandPool;
+ commandBufferAllocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
+ commandBufferAllocateInfo.commandBufferCount = static_cast<uint32_t>(commandBuffers.size());
+
+ // Allocate the command buffers from our command pool
+ if (vkAllocateCommandBuffers(device, &commandBufferAllocateInfo, &commandBuffers[0]) != VK_SUCCESS)
+ {
+ commandBuffers.clear();
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Set up the commands we need to issue to draw a frame
+ void setupDraw()
+ {
+ // Set up our clear colors
+ VkClearValue clearColors[2];
+
+ // Clear color buffer to opaque black
+ clearColors[0] = VkClearValue();
+ clearColors[0].color.float32[0] = 0.0f;
+ clearColors[0].color.float32[1] = 0.0f;
+ clearColors[0].color.float32[2] = 0.0f;
+ clearColors[0].color.float32[3] = 0.0f;
+
+ // Clear depth to 1.0f
+ clearColors[1] = VkClearValue();
+ clearColors[1].depthStencil.depth = 1.0f;
+ clearColors[1].depthStencil.stencil = 0;
+
+ VkRenderPassBeginInfo renderPassBeginInfo = VkRenderPassBeginInfo();
+ renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
+ renderPassBeginInfo.renderPass = renderPass;
+ renderPassBeginInfo.renderArea.offset.x = 0;
+ renderPassBeginInfo.renderArea.offset.y = 0;
+ renderPassBeginInfo.renderArea.extent = swapchainExtent;
+ renderPassBeginInfo.clearValueCount = 2;
+ renderPassBeginInfo.pClearValues = clearColors;
+
+ // Simultaneous use: this command buffer can be resubmitted to a queue before a previous submission is completed
+ VkCommandBufferBeginInfo commandBufferBeginInfo = VkCommandBufferBeginInfo();
+ commandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ commandBufferBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
+
+ // Set up the command buffers for each frame in flight
+ for (std::size_t i = 0; i < commandBuffers.size(); i++)
+ {
+ // Begin the command buffer
+ if (vkBeginCommandBuffer(commandBuffers[i], &commandBufferBeginInfo) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Begin the renderpass
+ renderPassBeginInfo.framebuffer = swapchainFramebuffers[i];
+
+ vkCmdBeginRenderPass(commandBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+ // Bind our graphics pipeline
+ vkCmdBindPipeline(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline);
+
+ // Bind our vertex buffer
+ VkDeviceSize offset = 0;
+
+ vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, &vertexBuffer, &offset);
+
+ // Bind our index buffer
+ vkCmdBindIndexBuffer(commandBuffers[i], indexBuffer, 0, VK_INDEX_TYPE_UINT16);
+
+ // Bind our descriptor sets
+ vkCmdBindDescriptorSets(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets[i], 0, 0);
+
+ // Draw our primitives
+ vkCmdDrawIndexed(commandBuffers[i], 36, 1, 0, 0, 0);
+
+ // End the renderpass
+ vkCmdEndRenderPass(commandBuffers[i]);
+
+ // End the command buffer
+ if (vkEndCommandBuffer(commandBuffers[i]) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+ }
+
+ // Set up the semaphores we use to synchronize frames among each other
+ void setupSemaphores()
+ {
+ VkSemaphoreCreateInfo semaphoreCreateInfo = VkSemaphoreCreateInfo();
+ semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
+
+ // Create a semaphore to track when an swapchain image is available for each frame in flight
+ for (std::size_t i = 0; i < maxFramesInFlight; i++)
+ {
+ imageAvailableSemaphores.push_back(0);
+
+ if (vkCreateSemaphore(device, &semaphoreCreateInfo, 0, &imageAvailableSemaphores[i]) != VK_SUCCESS)
+ {
+ imageAvailableSemaphores.pop_back();
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Create a semaphore to track when rendering is complete for each frame in flight
+ for (std::size_t i = 0; i < maxFramesInFlight; i++)
+ {
+ renderFinishedSemaphores.push_back(0);
+
+ if (vkCreateSemaphore(device, &semaphoreCreateInfo, 0, &renderFinishedSemaphores[i]) != VK_SUCCESS)
+ {
+ renderFinishedSemaphores.pop_back();
+ vulkanAvailable = false;
+ return;
+ }
+ }
+ }
+
+ // Set up the fences we use to synchronize frames among each other
+ void setupFences()
+ {
+ // Create the fences in the signaled state
+ VkFenceCreateInfo fenceCreateInfo = VkFenceCreateInfo();
+ fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
+ fenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
+
+ // Create a fence to track when queue submission is complete for each frame in flight
+ for (std::size_t i = 0; i < maxFramesInFlight; i++)
+ {
+ fences.push_back(0);
+
+ if (vkCreateFence(device, &fenceCreateInfo, 0, &fences[i]) != VK_SUCCESS)
+ {
+ fences.pop_back();
+ vulkanAvailable = false;
+ return;
+ }
+ }
+ }
+
+ // Update the matrices in our uniform buffer every frame
+ void updateUniformBuffer(float elapsed)
+ {
+ const float pi = 3.14159265359f;
+
+ // Construct the model matrix
+ Matrix model = {
+ { 1.0f, 0.0f, 0.0f, 0.0f },
+ { 0.0f, 1.0f, 0.0f, 0.0f },
+ { 0.0f, 0.0f, 1.0f, 0.0f },
+ { 0.0f, 0.0f, 0.0f, 1.0f }
+ };
+
+ matrixRotateX(model, elapsed * 59.0f * pi / 180.f);
+ matrixRotateY(model, elapsed * 83.0f * pi / 180.f);
+ matrixRotateZ(model, elapsed * 109.0f * pi / 180.f);
+
+ // Translate the model based on the mouse position
+ sf::Vector2f mousePosition = sf::Vector2f(sf::Mouse::getPosition(window));
+ sf::Vector2f windowSize = sf::Vector2f(window.getSize());
+ float x = clamp( mousePosition.x * 2.f / windowSize.x - 1.f, -1.0f, 1.0f) * 2.0f;
+ float y = clamp(-mousePosition.y * 2.f / windowSize.y + 1.f, -1.0f, 1.0f) * 1.5f;
+
+ model[3][0] -= x;
+ model[3][2] += y;
+
+ // Construct the view matrix
+ const Vec3 eye = {0.0f, 4.0f, 0.0f};
+ const Vec3 center = {0.0f, 0.0f, 0.0f};
+ const Vec3 up = {0.0f, 0.0f, 1.0f};
+
+ Matrix view;
+
+ matrixLookAt(view, eye, center, up);
+
+ // Construct the projection matrix
+ const float fov = 45.0f;
+ const float aspect = static_cast<float>(swapchainExtent.width) / static_cast<float>(swapchainExtent.height);
+ const float nearPlane = 0.1f;
+ const float farPlane = 10.0f;
+
+ Matrix projection;
+
+ matrixPerspective(projection, fov * pi / 180.f, aspect, nearPlane, farPlane);
+
+ char* ptr;
+
+ // Map the current frame's uniform buffer into our address space
+ if (vkMapMemory(device, uniformBuffersMemory[currentFrame], 0, sizeof(Matrix) * 3, 0, reinterpret_cast<void**>(&ptr)) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Copy the matrix data into the current frame's uniform buffer
+ std::memcpy(ptr + sizeof(Matrix) * 0, model, sizeof(Matrix));
+ std::memcpy(ptr + sizeof(Matrix) * 1, view, sizeof(Matrix));
+ std::memcpy(ptr + sizeof(Matrix) * 2, projection, sizeof(Matrix));
+
+ // Unmap the buffer
+ vkUnmapMemory(device, uniformBuffersMemory[currentFrame]);
+ }
+
+ void draw()
+ {
+ uint32_t imageIndex = 0;
+
+ // If the objects we need to submit this frame are still pending, wait here
+ vkWaitForFences(device, 1, &fences[currentFrame], VK_TRUE, std::numeric_limits<uint64_t>::max());
+
+ {
+ // Get the next image in the swapchain
+ VkResult result = vkAcquireNextImageKHR(device, swapchain, std::numeric_limits<uint64_t>::max(), imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
+
+ // Check if we need to re-create the swapchain (e.g. if the window was resized)
+ if (result == VK_ERROR_OUT_OF_DATE_KHR)
+ {
+ recreateSwapchain();
+ swapchainOutOfDate = false;
+ return;
+ }
+
+ if ((result != VK_SUCCESS) && (result != VK_TIMEOUT) && (result != VK_NOT_READY) && (result != VK_SUBOPTIMAL_KHR))
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Wait for the swapchain image to be available in the color attachment stage before submitting the queue
+ VkPipelineStageFlags waitStages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+
+ // Signal the render finished semaphore once the queue has been processed
+ VkSubmitInfo submitInfo = VkSubmitInfo();
+ submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submitInfo.waitSemaphoreCount = 1;
+ submitInfo.pWaitSemaphores = &imageAvailableSemaphores[currentFrame];
+ submitInfo.pWaitDstStageMask = &waitStages;
+ submitInfo.commandBufferCount = 1;
+ submitInfo.pCommandBuffers = &commandBuffers[imageIndex];
+ submitInfo.signalSemaphoreCount = 1;
+ submitInfo.pSignalSemaphores = &renderFinishedSemaphores[currentFrame];
+
+ vkResetFences(device, 1, &fences[currentFrame]);
+
+ if (vkQueueSubmit(queue, 1, &submitInfo, fences[currentFrame]) != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+
+ // Wait for rendering to complete before presenting
+ VkPresentInfoKHR presentInfo = VkPresentInfoKHR();
+ presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
+ presentInfo.waitSemaphoreCount = 1;
+ presentInfo.pWaitSemaphores = &renderFinishedSemaphores[currentFrame];
+ presentInfo.swapchainCount = 1;
+ presentInfo.pSwapchains = &swapchain;
+ presentInfo.pImageIndices = &imageIndex;
+
+ {
+ // Queue presentation
+ VkResult result = vkQueuePresentKHR(queue, &presentInfo);
+
+ // Check if we need to re-create the swapchain (e.g. if the window was resized)
+ if ((result == VK_ERROR_OUT_OF_DATE_KHR) || (result == VK_SUBOPTIMAL_KHR) || swapchainOutOfDate)
+ {
+ recreateSwapchain();
+ swapchainOutOfDate = false;
+ }
+ else if (result != VK_SUCCESS)
+ {
+ vulkanAvailable = false;
+ return;
+ }
+ }
+
+ // Make sure to use the next frame's objects next frame
+ currentFrame = (currentFrame + 1) % maxFramesInFlight;
+ }
+
+ void run()
+ {
+ sf::Clock clock;
+
+ // Start game loop
+ while (window.isOpen())
+ {
+ // Process events
+ sf::Event event;
+ while (window.pollEvent(event))
+ {
+ // Close window: exit
+ if (event.type == sf::Event::Closed)
+ window.close();
+
+ // Escape key: exit
+ if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
+ window.close();
+
+ // Re-create the swapchain when the window is resized
+ if (event.type == sf::Event::Resized)
+ swapchainOutOfDate = true;
+ }
+
+ if (vulkanAvailable)
+ {
+ // Update the uniform buffer (matrices)
+ updateUniformBuffer(clock.getElapsedTime().asSeconds());
+
+ // Render the frame
+ draw();
+ }
+ }
+ }
+
+private:
+ sf::WindowBase window;
+
+ bool vulkanAvailable;
+
+ const unsigned int maxFramesInFlight;
+ unsigned int currentFrame;
+ bool swapchainOutOfDate;
+
+ VkInstance instance;
+ VkDebugReportCallbackEXT debugReportCallback;
+ VkSurfaceKHR surface;
+ VkPhysicalDevice gpu;
+ int queueFamilyIndex;
+ VkDevice device;
+ VkQueue queue;
+ VkSurfaceFormatKHR swapchainFormat;
+ VkExtent2D swapchainExtent;
+ VkSwapchainKHR swapchain;
+ std::vector<VkImage> swapchainImages;
+ std::vector<VkImageView> swapchainImageViews;
+ VkFormat depthFormat;
+ VkImage depthImage;
+ VkDeviceMemory depthImageMemory;
+ VkImageView depthImageView;
+ VkShaderModule vertexShaderModule;
+ VkShaderModule fragmentShaderModule;
+ VkPipelineShaderStageCreateInfo shaderStages[2];
+ VkDescriptorSetLayout descriptorSetLayout;
+ VkPipelineLayout pipelineLayout;
+ VkRenderPass renderPass;
+ VkPipeline graphicsPipeline;
+ std::vector<VkFramebuffer> swapchainFramebuffers;
+ VkCommandPool commandPool;
+ VkBuffer vertexBuffer;
+ VkDeviceMemory vertexBufferMemory;
+ VkBuffer indexBuffer;
+ VkDeviceMemory indexBufferMemory;
+ std::vector<VkBuffer> uniformBuffers;
+ std::vector<VkDeviceMemory> uniformBuffersMemory;
+ VkImage textureImage;
+ VkDeviceMemory textureImageMemory;
+ VkImageView textureImageView;
+ VkSampler textureSampler;
+ VkDescriptorPool descriptorPool;
+ std::vector<VkDescriptorSet> descriptorSets;
+ std::vector<VkCommandBuffer> commandBuffers;
+ std::vector<VkSemaphore> imageAvailableSemaphores;
+ std::vector<VkSemaphore> renderFinishedSemaphores;
+ std::vector<VkFence> fences;
+};
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \return Application exit code
+///
+////////////////////////////////////////////////////////////
+int main()
+{
+ VulkanExample example;
+
+ example.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/examples/vulkan/resources/logo.png b/examples/vulkan/resources/logo.png
new file mode 100644
index 0000000..10aa70b
--- /dev/null
+++ b/examples/vulkan/resources/logo.png
Binary files differ
diff --git a/examples/vulkan/resources/shader.frag b/examples/vulkan/resources/shader.frag
new file mode 100644
index 0000000..7273a05
--- /dev/null
+++ b/examples/vulkan/resources/shader.frag
@@ -0,0 +1,16 @@
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(binding = 1) uniform sampler2D texSampler;
+
+layout(location = 0) in vec4 fragColor;
+layout(location = 1) in vec2 fragTexCoord;
+
+layout(location = 0) out vec4 outColor;
+
+void main() {
+ outColor = fragColor * texture(texSampler, fragTexCoord);
+
+ if (outColor.a < 0.5)
+ discard;
+} \ No newline at end of file
diff --git a/examples/vulkan/resources/shader.frag.spv b/examples/vulkan/resources/shader.frag.spv
new file mode 100644
index 0000000..00fd6f4
--- /dev/null
+++ b/examples/vulkan/resources/shader.frag.spv
Binary files differ
diff --git a/examples/vulkan/resources/shader.vert b/examples/vulkan/resources/shader.vert
new file mode 100644
index 0000000..1f6b009
--- /dev/null
+++ b/examples/vulkan/resources/shader.vert
@@ -0,0 +1,25 @@
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(binding = 0) uniform UniformBufferObject {
+ mat4 model;
+ mat4 view;
+ mat4 proj;
+} ubo;
+
+layout(location = 0) in vec3 inPosition;
+layout(location = 1) in vec4 inColor;
+layout(location = 2) in vec2 inTexCoord;
+
+layout(location = 0) out vec4 fragColor;
+layout(location = 1) out vec2 fragTexCoord;
+
+out gl_PerVertex {
+ vec4 gl_Position;
+};
+
+void main() {
+ gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 1.0);
+ fragColor = inColor;
+ fragTexCoord = inTexCoord;
+} \ No newline at end of file
diff --git a/examples/vulkan/resources/shader.vert.spv b/examples/vulkan/resources/shader.vert.spv
new file mode 100644
index 0000000..9095b69
--- /dev/null
+++ b/examples/vulkan/resources/shader.vert.spv
Binary files differ
diff --git a/examples/vulkan/vulkan.h b/examples/vulkan/vulkan.h
new file mode 100644
index 0000000..348e839
--- /dev/null
+++ b/examples/vulkan/vulkan.h
@@ -0,0 +1,3341 @@
+/**
+ * Loader generated by glad 2.0.0-beta on Sat Sep 15 15:51:42 2018
+ *
+ * Generator: C/C++
+ * Specification: vk
+ * Extensions: 3
+ *
+ * APIs:
+ * - vulkan=1.0
+ *
+ * Options:
+ * - MX_GLOBAL = False
+ * - LOADER = False
+ * - ALIAS = False
+ * - HEADER_ONLY = True
+ * - DEBUG = False
+ * - MX = False
+ *
+ * Commandline:
+ * --api='vulkan=1.0' --extensions='VK_EXT_debug_report,VK_KHR_surface,VK_KHR_swapchain' c --header-only
+ *
+ * Online:
+ * http://glad.sh/#api=vulkan%3D1.0&extensions=VK_EXT_debug_report%2CVK_KHR_surface%2CVK_KHR_swapchain&generator=c&options=HEADER_ONLY
+ *
+ */
+
+#ifndef GLAD_VULKAN_H_
+#define GLAD_VULKAN_H_
+
+#ifdef VULKAN_H_
+ #error header already included (API: vulkan), remove previous include!
+#endif
+#define VULKAN_H_ 1
+
+#ifdef VULKAN_CORE_H_
+ #error header already included (API: vulkan), remove previous include!
+#endif
+#define VULKAN_CORE_H_ 1
+
+
+#define GLAD_VULKAN
+#define GLAD_OPTION_VULKAN_HEADER_ONLY
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef GLAD_PLATFORM_H_
+#define GLAD_PLATFORM_H_
+
+#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)
+ #define GLAD_PLATFORM_WIN32 1
+#else
+ #define GLAD_PLATFORM_WIN32 0
+#endif
+
+
+#ifndef GLAD_PLATFORM_UWP
+ #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY)
+ #ifdef __has_include
+ #if __has_include(<winapifamily.h>)
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #endif
+
+ #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY
+ #include <winapifamily.h>
+ #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ #define GLAD_PLATFORM_UWP 1
+ #endif
+ #endif
+
+ #ifndef GLAD_PLATFORM_UWP
+ #define GLAD_PLATFORM_UWP 0
+ #endif
+#endif
+
+#ifdef __GNUC__
+ #define GLAD_GNUC_EXTENSION __extension__
+#else
+ #define GLAD_GNUC_EXTENSION
+#endif
+
+#ifndef GLAD_API_CALL
+ #if defined(GLAD_API_CALL_EXPORT)
+ #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__)
+ #if defined(GLAD_API_CALL_EXPORT_BUILD)
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllexport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllexport) extern
+ #endif
+ #else
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllimport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllimport) extern
+ #endif
+ #endif
+ #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD)
+ #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+#endif
+
+#ifdef APIENTRY
+ #define GLAD_API_PTR APIENTRY
+#elif GLAD_PLATFORM_WIN32
+ #define GLAD_API_PTR __stdcall
+#else
+ #define GLAD_API_PTR
+#endif
+
+#ifndef GLAPI
+#define GLAPI GLAD_API_CALL
+#endif
+
+#ifndef GLAPIENTRY
+#define GLAPIENTRY GLAD_API_PTR
+#endif
+
+
+#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor)
+#define GLAD_VERSION_MAJOR(version) (version / 10000)
+#define GLAD_VERSION_MINOR(version) (version % 10000)
+
+typedef void (*GLADapiproc)(void);
+
+typedef GLADapiproc (*GLADloadfunc)(const char *name);
+typedef GLADapiproc (*GLADuserptrloadfunc)(const char *name, void *userptr);
+
+typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...);
+typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...);
+
+#endif /* GLAD_PLATFORM_H_ */
+
+#define VK_ATTACHMENT_UNUSED (~0U)
+#define VK_EXT_DEBUG_REPORT_EXTENSION_NAME "VK_EXT_debug_report"
+#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 9
+#define VK_FALSE 0
+#define VK_KHR_SURFACE_EXTENSION_NAME "VK_KHR_surface"
+#define VK_KHR_SURFACE_SPEC_VERSION 25
+#define VK_KHR_SWAPCHAIN_EXTENSION_NAME "VK_KHR_swapchain"
+#define VK_KHR_SWAPCHAIN_SPEC_VERSION 70
+#define VK_LOD_CLAMP_NONE 1000.0f
+#define VK_MAX_DESCRIPTION_SIZE 256
+#define VK_MAX_DEVICE_GROUP_SIZE 32
+#define VK_MAX_EXTENSION_NAME_SIZE 256
+#define VK_MAX_MEMORY_HEAPS 16
+#define VK_MAX_MEMORY_TYPES 32
+#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 256
+#define VK_QUEUE_FAMILY_IGNORED (~0U)
+#define VK_REMAINING_ARRAY_LAYERS (~0U)
+#define VK_REMAINING_MIP_LEVELS (~0U)
+#define VK_SUBPASS_EXTERNAL (~0U)
+#define VK_TRUE 1
+#define VK_UUID_SIZE 16
+#define VK_WHOLE_SIZE (~0ULL)
+
+
+/* */
+/* File: vk_platform.h */
+/* */
+/*
+** Copyright (c) 2014-2017 The Khronos Group Inc.
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+
+#ifndef VK_PLATFORM_H_
+#define VK_PLATFORM_H_
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/*
+***************************************************************************************************
+* Platform-specific directives and type declarations
+***************************************************************************************************
+*/
+
+/* Platform-specific calling convention macros.
+ *
+ * Platforms should define these so that Vulkan clients call Vulkan commands
+ * with the same calling conventions that the Vulkan implementation expects.
+ *
+ * VKAPI_ATTR - Placed before the return type in function declarations.
+ * Useful for C++11 and GCC/Clang-style function attribute syntax.
+ * VKAPI_CALL - Placed after the return type in function declarations.
+ * Useful for MSVC-style calling convention syntax.
+ * VKAPI_PTR - Placed between the '(' and '*' in function pointer types.
+ *
+ * Function declaration: VKAPI_ATTR void VKAPI_CALL vkCommand(void);
+ * Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void);
+ */
+#if defined(_WIN32)
+ /* On Windows, Vulkan commands use the stdcall convention */
+ #define VKAPI_ATTR
+ #define VKAPI_CALL __stdcall
+ #define VKAPI_PTR VKAPI_CALL
+#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7
+ #error "Vulkan isn't supported for the 'armeabi' NDK ABI"
+#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE)
+ /* On Android 32-bit ARM targets, Vulkan functions use the "hardfloat" */
+ /* calling convention, i.e. float parameters are passed in registers. This */
+ /* is true even if the rest of the application passes floats on the stack, */
+ /* as it does by default when compiling for the armeabi-v7a NDK ABI. */
+ #define VKAPI_ATTR __attribute__((pcs("aapcs-vfp")))
+ #define VKAPI_CALL
+ #define VKAPI_PTR VKAPI_ATTR
+#else
+ /* On other platforms, use the default calling convention */
+ #define VKAPI_ATTR
+ #define VKAPI_CALL
+ #define VKAPI_PTR
+#endif
+
+#include <stddef.h>
+
+#if !defined(VK_NO_STDINT_H)
+ #if defined(_MSC_VER) && (_MSC_VER < 1600)
+ typedef signed __int8 int8_t;
+ typedef unsigned __int8 uint8_t;
+ typedef signed __int16 int16_t;
+ typedef unsigned __int16 uint16_t;
+ typedef signed __int32 int32_t;
+ typedef unsigned __int32 uint32_t;
+ typedef signed __int64 int64_t;
+ typedef unsigned __int64 uint64_t;
+ #else
+ #include <stdint.h>
+ #endif
+#endif /* !defined(VK_NO_STDINT_H) */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+#endif
+#define VK_MAKE_VERSION(major, minor, patch) \
+ (((major) << 22) | ((minor) << 12) | (patch))
+#define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22)
+#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff)
+#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff)
+/* DEPRECATED: This define has been removed. Specific version defines (e.g. VK_API_VERSION_1_0), or the VK_MAKE_VERSION macro, should be used instead. */
+/*#define VK_API_VERSION VK_MAKE_VERSION(1, 0, 0) // Patch version should always be set to 0 */
+/* Vulkan 1.0 version number */
+#define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0)/* Patch version should always be set to 0 */
+/* Version of this file */
+#define VK_HEADER_VERSION 84
+#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;
+#if !defined(VK_DEFINE_NON_DISPATCHABLE_HANDLE)
+#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
+ #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;
+#else
+ #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
+#endif
+#endif
+#define VK_NULL_HANDLE 0
+
+
+
+
+
+
+
+
+VK_DEFINE_HANDLE(VkInstance)
+VK_DEFINE_HANDLE(VkPhysicalDevice)
+VK_DEFINE_HANDLE(VkDevice)
+VK_DEFINE_HANDLE(VkQueue)
+VK_DEFINE_HANDLE(VkCommandBuffer)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDeviceMemory)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBuffer)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferView)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImageView)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShaderModule)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipeline)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineLayout)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSampler)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSet)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSetLayout)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorPool)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFence)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSemaphore)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkEvent)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkQueryPool)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkRenderPass)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineCache)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSwapchainKHR)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT)
+typedef enum VkAttachmentLoadOp {
+ VK_ATTACHMENT_LOAD_OP_LOAD = 0,
+ VK_ATTACHMENT_LOAD_OP_CLEAR = 1,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE = 2
+} VkAttachmentLoadOp;
+typedef enum VkAttachmentStoreOp {
+ VK_ATTACHMENT_STORE_OP_STORE = 0,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE = 1
+} VkAttachmentStoreOp;
+typedef enum VkBlendFactor {
+ VK_BLEND_FACTOR_ZERO = 0,
+ VK_BLEND_FACTOR_ONE = 1,
+ VK_BLEND_FACTOR_SRC_COLOR = 2,
+ VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR = 3,
+ VK_BLEND_FACTOR_DST_COLOR = 4,
+ VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR = 5,
+ VK_BLEND_FACTOR_SRC_ALPHA = 6,
+ VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA = 7,
+ VK_BLEND_FACTOR_DST_ALPHA = 8,
+ VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA = 9,
+ VK_BLEND_FACTOR_CONSTANT_COLOR = 10,
+ VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR = 11,
+ VK_BLEND_FACTOR_CONSTANT_ALPHA = 12,
+ VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA = 13,
+ VK_BLEND_FACTOR_SRC_ALPHA_SATURATE = 14,
+ VK_BLEND_FACTOR_SRC1_COLOR = 15,
+ VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR = 16,
+ VK_BLEND_FACTOR_SRC1_ALPHA = 17,
+ VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA = 18
+} VkBlendFactor;
+typedef enum VkBlendOp {
+ VK_BLEND_OP_ADD = 0,
+ VK_BLEND_OP_SUBTRACT = 1,
+ VK_BLEND_OP_REVERSE_SUBTRACT = 2,
+ VK_BLEND_OP_MIN = 3,
+ VK_BLEND_OP_MAX = 4
+} VkBlendOp;
+typedef enum VkBorderColor {
+ VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = 0,
+ VK_BORDER_COLOR_INT_TRANSPARENT_BLACK = 1,
+ VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK = 2,
+ VK_BORDER_COLOR_INT_OPAQUE_BLACK = 3,
+ VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE = 4,
+ VK_BORDER_COLOR_INT_OPAQUE_WHITE = 5
+} VkBorderColor;
+typedef enum VkPipelineCacheHeaderVersion {
+ VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1
+} VkPipelineCacheHeaderVersion;
+
+
+typedef enum VkBufferCreateFlagBits {
+ VK_BUFFER_CREATE_SPARSE_BINDING_BIT = 1,
+ VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 2,
+ VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 4
+} VkBufferCreateFlagBits;
+typedef enum VkBufferUsageFlagBits {
+ VK_BUFFER_USAGE_TRANSFER_SRC_BIT = 1,
+ VK_BUFFER_USAGE_TRANSFER_DST_BIT = 2,
+ VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = 4,
+ VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = 8,
+ VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = 16,
+ VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = 32,
+ VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 64,
+ VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 128,
+ VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 256
+} VkBufferUsageFlagBits;
+typedef enum VkColorComponentFlagBits {
+ VK_COLOR_COMPONENT_R_BIT = 1,
+ VK_COLOR_COMPONENT_G_BIT = 2,
+ VK_COLOR_COMPONENT_B_BIT = 4,
+ VK_COLOR_COMPONENT_A_BIT = 8
+} VkColorComponentFlagBits;
+typedef enum VkComponentSwizzle {
+ VK_COMPONENT_SWIZZLE_IDENTITY = 0,
+ VK_COMPONENT_SWIZZLE_ZERO = 1,
+ VK_COMPONENT_SWIZZLE_ONE = 2,
+ VK_COMPONENT_SWIZZLE_R = 3,
+ VK_COMPONENT_SWIZZLE_G = 4,
+ VK_COMPONENT_SWIZZLE_B = 5,
+ VK_COMPONENT_SWIZZLE_A = 6
+} VkComponentSwizzle;
+typedef enum VkCommandPoolCreateFlagBits {
+ VK_COMMAND_POOL_CREATE_TRANSIENT_BIT = 1,
+ VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = 2
+} VkCommandPoolCreateFlagBits;
+typedef enum VkCommandPoolResetFlagBits {
+ VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT = 1
+} VkCommandPoolResetFlagBits;
+typedef enum VkCommandBufferResetFlagBits {
+ VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT = 1
+} VkCommandBufferResetFlagBits;
+typedef enum VkCommandBufferLevel {
+ VK_COMMAND_BUFFER_LEVEL_PRIMARY = 0,
+ VK_COMMAND_BUFFER_LEVEL_SECONDARY = 1
+} VkCommandBufferLevel;
+typedef enum VkCommandBufferUsageFlagBits {
+ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT = 1,
+ VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT = 2,
+ VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT = 4
+} VkCommandBufferUsageFlagBits;
+typedef enum VkCompareOp {
+ VK_COMPARE_OP_NEVER = 0,
+ VK_COMPARE_OP_LESS = 1,
+ VK_COMPARE_OP_EQUAL = 2,
+ VK_COMPARE_OP_LESS_OR_EQUAL = 3,
+ VK_COMPARE_OP_GREATER = 4,
+ VK_COMPARE_OP_NOT_EQUAL = 5,
+ VK_COMPARE_OP_GREATER_OR_EQUAL = 6,
+ VK_COMPARE_OP_ALWAYS = 7
+} VkCompareOp;
+typedef enum VkCullModeFlagBits {
+ VK_CULL_MODE_NONE = 0,
+ VK_CULL_MODE_FRONT_BIT = 1,
+ VK_CULL_MODE_BACK_BIT = 2,
+ VK_CULL_MODE_FRONT_AND_BACK = 0x00000003
+} VkCullModeFlagBits;
+typedef enum VkDescriptorType {
+ VK_DESCRIPTOR_TYPE_SAMPLER = 0,
+ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = 1,
+ VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = 2,
+ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = 3,
+ VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = 4,
+ VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = 5,
+ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = 6,
+ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = 7,
+ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = 8,
+ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = 9,
+ VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = 10
+} VkDescriptorType;
+typedef enum VkDynamicState {
+ VK_DYNAMIC_STATE_VIEWPORT = 0,
+ VK_DYNAMIC_STATE_SCISSOR = 1,
+ VK_DYNAMIC_STATE_LINE_WIDTH = 2,
+ VK_DYNAMIC_STATE_DEPTH_BIAS = 3,
+ VK_DYNAMIC_STATE_BLEND_CONSTANTS = 4,
+ VK_DYNAMIC_STATE_DEPTH_BOUNDS = 5,
+ VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK = 6,
+ VK_DYNAMIC_STATE_STENCIL_WRITE_MASK = 7,
+ VK_DYNAMIC_STATE_STENCIL_REFERENCE = 8
+} VkDynamicState;
+typedef enum VkFenceCreateFlagBits {
+ VK_FENCE_CREATE_SIGNALED_BIT = 1
+} VkFenceCreateFlagBits;
+typedef enum VkPolygonMode {
+ VK_POLYGON_MODE_FILL = 0,
+ VK_POLYGON_MODE_LINE = 1,
+ VK_POLYGON_MODE_POINT = 2
+} VkPolygonMode;
+typedef enum VkFormat {
+ VK_FORMAT_UNDEFINED = 0,
+ VK_FORMAT_R4G4_UNORM_PACK8 = 1,
+ VK_FORMAT_R4G4B4A4_UNORM_PACK16 = 2,
+ VK_FORMAT_B4G4R4A4_UNORM_PACK16 = 3,
+ VK_FORMAT_R5G6B5_UNORM_PACK16 = 4,
+ VK_FORMAT_B5G6R5_UNORM_PACK16 = 5,
+ VK_FORMAT_R5G5B5A1_UNORM_PACK16 = 6,
+ VK_FORMAT_B5G5R5A1_UNORM_PACK16 = 7,
+ VK_FORMAT_A1R5G5B5_UNORM_PACK16 = 8,
+ VK_FORMAT_R8_UNORM = 9,
+ VK_FORMAT_R8_SNORM = 10,
+ VK_FORMAT_R8_USCALED = 11,
+ VK_FORMAT_R8_SSCALED = 12,
+ VK_FORMAT_R8_UINT = 13,
+ VK_FORMAT_R8_SINT = 14,
+ VK_FORMAT_R8_SRGB = 15,
+ VK_FORMAT_R8G8_UNORM = 16,
+ VK_FORMAT_R8G8_SNORM = 17,
+ VK_FORMAT_R8G8_USCALED = 18,
+ VK_FORMAT_R8G8_SSCALED = 19,
+ VK_FORMAT_R8G8_UINT = 20,
+ VK_FORMAT_R8G8_SINT = 21,
+ VK_FORMAT_R8G8_SRGB = 22,
+ VK_FORMAT_R8G8B8_UNORM = 23,
+ VK_FORMAT_R8G8B8_SNORM = 24,
+ VK_FORMAT_R8G8B8_USCALED = 25,
+ VK_FORMAT_R8G8B8_SSCALED = 26,
+ VK_FORMAT_R8G8B8_UINT = 27,
+ VK_FORMAT_R8G8B8_SINT = 28,
+ VK_FORMAT_R8G8B8_SRGB = 29,
+ VK_FORMAT_B8G8R8_UNORM = 30,
+ VK_FORMAT_B8G8R8_SNORM = 31,
+ VK_FORMAT_B8G8R8_USCALED = 32,
+ VK_FORMAT_B8G8R8_SSCALED = 33,
+ VK_FORMAT_B8G8R8_UINT = 34,
+ VK_FORMAT_B8G8R8_SINT = 35,
+ VK_FORMAT_B8G8R8_SRGB = 36,
+ VK_FORMAT_R8G8B8A8_UNORM = 37,
+ VK_FORMAT_R8G8B8A8_SNORM = 38,
+ VK_FORMAT_R8G8B8A8_USCALED = 39,
+ VK_FORMAT_R8G8B8A8_SSCALED = 40,
+ VK_FORMAT_R8G8B8A8_UINT = 41,
+ VK_FORMAT_R8G8B8A8_SINT = 42,
+ VK_FORMAT_R8G8B8A8_SRGB = 43,
+ VK_FORMAT_B8G8R8A8_UNORM = 44,
+ VK_FORMAT_B8G8R8A8_SNORM = 45,
+ VK_FORMAT_B8G8R8A8_USCALED = 46,
+ VK_FORMAT_B8G8R8A8_SSCALED = 47,
+ VK_FORMAT_B8G8R8A8_UINT = 48,
+ VK_FORMAT_B8G8R8A8_SINT = 49,
+ VK_FORMAT_B8G8R8A8_SRGB = 50,
+ VK_FORMAT_A8B8G8R8_UNORM_PACK32 = 51,
+ VK_FORMAT_A8B8G8R8_SNORM_PACK32 = 52,
+ VK_FORMAT_A8B8G8R8_USCALED_PACK32 = 53,
+ VK_FORMAT_A8B8G8R8_SSCALED_PACK32 = 54,
+ VK_FORMAT_A8B8G8R8_UINT_PACK32 = 55,
+ VK_FORMAT_A8B8G8R8_SINT_PACK32 = 56,
+ VK_FORMAT_A8B8G8R8_SRGB_PACK32 = 57,
+ VK_FORMAT_A2R10G10B10_UNORM_PACK32 = 58,
+ VK_FORMAT_A2R10G10B10_SNORM_PACK32 = 59,
+ VK_FORMAT_A2R10G10B10_USCALED_PACK32 = 60,
+ VK_FORMAT_A2R10G10B10_SSCALED_PACK32 = 61,
+ VK_FORMAT_A2R10G10B10_UINT_PACK32 = 62,
+ VK_FORMAT_A2R10G10B10_SINT_PACK32 = 63,
+ VK_FORMAT_A2B10G10R10_UNORM_PACK32 = 64,
+ VK_FORMAT_A2B10G10R10_SNORM_PACK32 = 65,
+ VK_FORMAT_A2B10G10R10_USCALED_PACK32 = 66,
+ VK_FORMAT_A2B10G10R10_SSCALED_PACK32 = 67,
+ VK_FORMAT_A2B10G10R10_UINT_PACK32 = 68,
+ VK_FORMAT_A2B10G10R10_SINT_PACK32 = 69,
+ VK_FORMAT_R16_UNORM = 70,
+ VK_FORMAT_R16_SNORM = 71,
+ VK_FORMAT_R16_USCALED = 72,
+ VK_FORMAT_R16_SSCALED = 73,
+ VK_FORMAT_R16_UINT = 74,
+ VK_FORMAT_R16_SINT = 75,
+ VK_FORMAT_R16_SFLOAT = 76,
+ VK_FORMAT_R16G16_UNORM = 77,
+ VK_FORMAT_R16G16_SNORM = 78,
+ VK_FORMAT_R16G16_USCALED = 79,
+ VK_FORMAT_R16G16_SSCALED = 80,
+ VK_FORMAT_R16G16_UINT = 81,
+ VK_FORMAT_R16G16_SINT = 82,
+ VK_FORMAT_R16G16_SFLOAT = 83,
+ VK_FORMAT_R16G16B16_UNORM = 84,
+ VK_FORMAT_R16G16B16_SNORM = 85,
+ VK_FORMAT_R16G16B16_USCALED = 86,
+ VK_FORMAT_R16G16B16_SSCALED = 87,
+ VK_FORMAT_R16G16B16_UINT = 88,
+ VK_FORMAT_R16G16B16_SINT = 89,
+ VK_FORMAT_R16G16B16_SFLOAT = 90,
+ VK_FORMAT_R16G16B16A16_UNORM = 91,
+ VK_FORMAT_R16G16B16A16_SNORM = 92,
+ VK_FORMAT_R16G16B16A16_USCALED = 93,
+ VK_FORMAT_R16G16B16A16_SSCALED = 94,
+ VK_FORMAT_R16G16B16A16_UINT = 95,
+ VK_FORMAT_R16G16B16A16_SINT = 96,
+ VK_FORMAT_R16G16B16A16_SFLOAT = 97,
+ VK_FORMAT_R32_UINT = 98,
+ VK_FORMAT_R32_SINT = 99,
+ VK_FORMAT_R32_SFLOAT = 100,
+ VK_FORMAT_R32G32_UINT = 101,
+ VK_FORMAT_R32G32_SINT = 102,
+ VK_FORMAT_R32G32_SFLOAT = 103,
+ VK_FORMAT_R32G32B32_UINT = 104,
+ VK_FORMAT_R32G32B32_SINT = 105,
+ VK_FORMAT_R32G32B32_SFLOAT = 106,
+ VK_FORMAT_R32G32B32A32_UINT = 107,
+ VK_FORMAT_R32G32B32A32_SINT = 108,
+ VK_FORMAT_R32G32B32A32_SFLOAT = 109,
+ VK_FORMAT_R64_UINT = 110,
+ VK_FORMAT_R64_SINT = 111,
+ VK_FORMAT_R64_SFLOAT = 112,
+ VK_FORMAT_R64G64_UINT = 113,
+ VK_FORMAT_R64G64_SINT = 114,
+ VK_FORMAT_R64G64_SFLOAT = 115,
+ VK_FORMAT_R64G64B64_UINT = 116,
+ VK_FORMAT_R64G64B64_SINT = 117,
+ VK_FORMAT_R64G64B64_SFLOAT = 118,
+ VK_FORMAT_R64G64B64A64_UINT = 119,
+ VK_FORMAT_R64G64B64A64_SINT = 120,
+ VK_FORMAT_R64G64B64A64_SFLOAT = 121,
+ VK_FORMAT_B10G11R11_UFLOAT_PACK32 = 122,
+ VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = 123,
+ VK_FORMAT_D16_UNORM = 124,
+ VK_FORMAT_X8_D24_UNORM_PACK32 = 125,
+ VK_FORMAT_D32_SFLOAT = 126,
+ VK_FORMAT_S8_UINT = 127,
+ VK_FORMAT_D16_UNORM_S8_UINT = 128,
+ VK_FORMAT_D24_UNORM_S8_UINT = 129,
+ VK_FORMAT_D32_SFLOAT_S8_UINT = 130,
+ VK_FORMAT_BC1_RGB_UNORM_BLOCK = 131,
+ VK_FORMAT_BC1_RGB_SRGB_BLOCK = 132,
+ VK_FORMAT_BC1_RGBA_UNORM_BLOCK = 133,
+ VK_FORMAT_BC1_RGBA_SRGB_BLOCK = 134,
+ VK_FORMAT_BC2_UNORM_BLOCK = 135,
+ VK_FORMAT_BC2_SRGB_BLOCK = 136,
+ VK_FORMAT_BC3_UNORM_BLOCK = 137,
+ VK_FORMAT_BC3_SRGB_BLOCK = 138,
+ VK_FORMAT_BC4_UNORM_BLOCK = 139,
+ VK_FORMAT_BC4_SNORM_BLOCK = 140,
+ VK_FORMAT_BC5_UNORM_BLOCK = 141,
+ VK_FORMAT_BC5_SNORM_BLOCK = 142,
+ VK_FORMAT_BC6H_UFLOAT_BLOCK = 143,
+ VK_FORMAT_BC6H_SFLOAT_BLOCK = 144,
+ VK_FORMAT_BC7_UNORM_BLOCK = 145,
+ VK_FORMAT_BC7_SRGB_BLOCK = 146,
+ VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = 147,
+ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = 148,
+ VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = 149,
+ VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = 150,
+ VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = 151,
+ VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = 152,
+ VK_FORMAT_EAC_R11_UNORM_BLOCK = 153,
+ VK_FORMAT_EAC_R11_SNORM_BLOCK = 154,
+ VK_FORMAT_EAC_R11G11_UNORM_BLOCK = 155,
+ VK_FORMAT_EAC_R11G11_SNORM_BLOCK = 156,
+ VK_FORMAT_ASTC_4x4_UNORM_BLOCK = 157,
+ VK_FORMAT_ASTC_4x4_SRGB_BLOCK = 158,
+ VK_FORMAT_ASTC_5x4_UNORM_BLOCK = 159,
+ VK_FORMAT_ASTC_5x4_SRGB_BLOCK = 160,
+ VK_FORMAT_ASTC_5x5_UNORM_BLOCK = 161,
+ VK_FORMAT_ASTC_5x5_SRGB_BLOCK = 162,
+ VK_FORMAT_ASTC_6x5_UNORM_BLOCK = 163,
+ VK_FORMAT_ASTC_6x5_SRGB_BLOCK = 164,
+ VK_FORMAT_ASTC_6x6_UNORM_BLOCK = 165,
+ VK_FORMAT_ASTC_6x6_SRGB_BLOCK = 166,
+ VK_FORMAT_ASTC_8x5_UNORM_BLOCK = 167,
+ VK_FORMAT_ASTC_8x5_SRGB_BLOCK = 168,
+ VK_FORMAT_ASTC_8x6_UNORM_BLOCK = 169,
+ VK_FORMAT_ASTC_8x6_SRGB_BLOCK = 170,
+ VK_FORMAT_ASTC_8x8_UNORM_BLOCK = 171,
+ VK_FORMAT_ASTC_8x8_SRGB_BLOCK = 172,
+ VK_FORMAT_ASTC_10x5_UNORM_BLOCK = 173,
+ VK_FORMAT_ASTC_10x5_SRGB_BLOCK = 174,
+ VK_FORMAT_ASTC_10x6_UNORM_BLOCK = 175,
+ VK_FORMAT_ASTC_10x6_SRGB_BLOCK = 176,
+ VK_FORMAT_ASTC_10x8_UNORM_BLOCK = 177,
+ VK_FORMAT_ASTC_10x8_SRGB_BLOCK = 178,
+ VK_FORMAT_ASTC_10x10_UNORM_BLOCK = 179,
+ VK_FORMAT_ASTC_10x10_SRGB_BLOCK = 180,
+ VK_FORMAT_ASTC_12x10_UNORM_BLOCK = 181,
+ VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182,
+ VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183,
+ VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184
+} VkFormat;
+typedef enum VkFormatFeatureFlagBits {
+ VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT = 1,
+ VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT = 2,
+ VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT = 4,
+ VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT = 8,
+ VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT = 16,
+ VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = 32,
+ VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT = 64,
+ VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT = 128,
+ VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT = 256,
+ VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT = 512,
+ VK_FORMAT_FEATURE_BLIT_SRC_BIT = 1024,
+ VK_FORMAT_FEATURE_BLIT_DST_BIT = 2048,
+ VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 4096
+} VkFormatFeatureFlagBits;
+typedef enum VkFrontFace {
+ VK_FRONT_FACE_COUNTER_CLOCKWISE = 0,
+ VK_FRONT_FACE_CLOCKWISE = 1
+} VkFrontFace;
+typedef enum VkImageAspectFlagBits {
+ VK_IMAGE_ASPECT_COLOR_BIT = 1,
+ VK_IMAGE_ASPECT_DEPTH_BIT = 2,
+ VK_IMAGE_ASPECT_STENCIL_BIT = 4,
+ VK_IMAGE_ASPECT_METADATA_BIT = 8
+} VkImageAspectFlagBits;
+typedef enum VkImageCreateFlagBits {
+ VK_IMAGE_CREATE_SPARSE_BINDING_BIT = 1,
+ VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 2,
+ VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 4,
+ VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 8,
+ VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 16
+} VkImageCreateFlagBits;
+typedef enum VkImageLayout {
+ VK_IMAGE_LAYOUT_UNDEFINED = 0,
+ VK_IMAGE_LAYOUT_GENERAL = 1,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2,
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3,
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5,
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = 6,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7,
+ VK_IMAGE_LAYOUT_PREINITIALIZED = 8,
+ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002
+} VkImageLayout;
+typedef enum VkImageTiling {
+ VK_IMAGE_TILING_OPTIMAL = 0,
+ VK_IMAGE_TILING_LINEAR = 1
+} VkImageTiling;
+typedef enum VkImageType {
+ VK_IMAGE_TYPE_1D = 0,
+ VK_IMAGE_TYPE_2D = 1,
+ VK_IMAGE_TYPE_3D = 2
+} VkImageType;
+typedef enum VkImageUsageFlagBits {
+ VK_IMAGE_USAGE_TRANSFER_SRC_BIT = 1,
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT = 2,
+ VK_IMAGE_USAGE_SAMPLED_BIT = 4,
+ VK_IMAGE_USAGE_STORAGE_BIT = 8,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 16,
+ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 32,
+ VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 64,
+ VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 128
+} VkImageUsageFlagBits;
+typedef enum VkImageViewType {
+ VK_IMAGE_VIEW_TYPE_1D = 0,
+ VK_IMAGE_VIEW_TYPE_2D = 1,
+ VK_IMAGE_VIEW_TYPE_3D = 2,
+ VK_IMAGE_VIEW_TYPE_CUBE = 3,
+ VK_IMAGE_VIEW_TYPE_1D_ARRAY = 4,
+ VK_IMAGE_VIEW_TYPE_2D_ARRAY = 5,
+ VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = 6
+} VkImageViewType;
+typedef enum VkSharingMode {
+ VK_SHARING_MODE_EXCLUSIVE = 0,
+ VK_SHARING_MODE_CONCURRENT = 1
+} VkSharingMode;
+typedef enum VkIndexType {
+ VK_INDEX_TYPE_UINT16 = 0,
+ VK_INDEX_TYPE_UINT32 = 1
+} VkIndexType;
+typedef enum VkLogicOp {
+ VK_LOGIC_OP_CLEAR = 0,
+ VK_LOGIC_OP_AND = 1,
+ VK_LOGIC_OP_AND_REVERSE = 2,
+ VK_LOGIC_OP_COPY = 3,
+ VK_LOGIC_OP_AND_INVERTED = 4,
+ VK_LOGIC_OP_NO_OP = 5,
+ VK_LOGIC_OP_XOR = 6,
+ VK_LOGIC_OP_OR = 7,
+ VK_LOGIC_OP_NOR = 8,
+ VK_LOGIC_OP_EQUIVALENT = 9,
+ VK_LOGIC_OP_INVERT = 10,
+ VK_LOGIC_OP_OR_REVERSE = 11,
+ VK_LOGIC_OP_COPY_INVERTED = 12,
+ VK_LOGIC_OP_OR_INVERTED = 13,
+ VK_LOGIC_OP_NAND = 14,
+ VK_LOGIC_OP_SET = 15
+} VkLogicOp;
+typedef enum VkMemoryHeapFlagBits {
+ VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = 1
+} VkMemoryHeapFlagBits;
+typedef enum VkAccessFlagBits {
+ VK_ACCESS_INDIRECT_COMMAND_READ_BIT = 1,
+ VK_ACCESS_INDEX_READ_BIT = 2,
+ VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT = 4,
+ VK_ACCESS_UNIFORM_READ_BIT = 8,
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT = 16,
+ VK_ACCESS_SHADER_READ_BIT = 32,
+ VK_ACCESS_SHADER_WRITE_BIT = 64,
+ VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = 128,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = 256,
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 512,
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 1024,
+ VK_ACCESS_TRANSFER_READ_BIT = 2048,
+ VK_ACCESS_TRANSFER_WRITE_BIT = 4096,
+ VK_ACCESS_HOST_READ_BIT = 8192,
+ VK_ACCESS_HOST_WRITE_BIT = 16384,
+ VK_ACCESS_MEMORY_READ_BIT = 32768,
+ VK_ACCESS_MEMORY_WRITE_BIT = 65536
+} VkAccessFlagBits;
+typedef enum VkMemoryPropertyFlagBits {
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT = 1,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT = 2,
+ VK_MEMORY_PROPERTY_HOST_COHERENT_BIT = 4,
+ VK_MEMORY_PROPERTY_HOST_CACHED_BIT = 8,
+ VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 16
+} VkMemoryPropertyFlagBits;
+typedef enum VkPhysicalDeviceType {
+ VK_PHYSICAL_DEVICE_TYPE_OTHER = 0,
+ VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU = 1,
+ VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU = 2,
+ VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU = 3,
+ VK_PHYSICAL_DEVICE_TYPE_CPU = 4
+} VkPhysicalDeviceType;
+typedef enum VkPipelineBindPoint {
+ VK_PIPELINE_BIND_POINT_GRAPHICS = 0,
+ VK_PIPELINE_BIND_POINT_COMPUTE = 1
+} VkPipelineBindPoint;
+typedef enum VkPipelineCreateFlagBits {
+ VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 1,
+ VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 2,
+ VK_PIPELINE_CREATE_DERIVATIVE_BIT = 4
+} VkPipelineCreateFlagBits;
+typedef enum VkPrimitiveTopology {
+ VK_PRIMITIVE_TOPOLOGY_POINT_LIST = 0,
+ VK_PRIMITIVE_TOPOLOGY_LINE_LIST = 1,
+ VK_PRIMITIVE_TOPOLOGY_LINE_STRIP = 2,
+ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST = 3,
+ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP = 4,
+ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN = 5,
+ VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY = 6,
+ VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY = 7,
+ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY = 8,
+ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY = 9,
+ VK_PRIMITIVE_TOPOLOGY_PATCH_LIST = 10
+} VkPrimitiveTopology;
+typedef enum VkQueryControlFlagBits {
+ VK_QUERY_CONTROL_PRECISE_BIT = 1
+} VkQueryControlFlagBits;
+typedef enum VkQueryPipelineStatisticFlagBits {
+ VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT = 1,
+ VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT = 2,
+ VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT = 4,
+ VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT = 8,
+ VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT = 16,
+ VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT = 32,
+ VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT = 64,
+ VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT = 128,
+ VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT = 256,
+ VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT = 512,
+ VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = 1024
+} VkQueryPipelineStatisticFlagBits;
+typedef enum VkQueryResultFlagBits {
+ VK_QUERY_RESULT_64_BIT = 1,
+ VK_QUERY_RESULT_WAIT_BIT = 2,
+ VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 4,
+ VK_QUERY_RESULT_PARTIAL_BIT = 8
+} VkQueryResultFlagBits;
+typedef enum VkQueryType {
+ VK_QUERY_TYPE_OCCLUSION = 0,
+ VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,
+ VK_QUERY_TYPE_TIMESTAMP = 2
+} VkQueryType;
+typedef enum VkQueueFlagBits {
+ VK_QUEUE_GRAPHICS_BIT = 1,
+ VK_QUEUE_COMPUTE_BIT = 2,
+ VK_QUEUE_TRANSFER_BIT = 4,
+ VK_QUEUE_SPARSE_BINDING_BIT = 8
+} VkQueueFlagBits;
+typedef enum VkSubpassContents {
+ VK_SUBPASS_CONTENTS_INLINE = 0,
+ VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS = 1
+} VkSubpassContents;
+typedef enum VkResult {
+ VK_SUCCESS = 0,
+ VK_NOT_READY = 1,
+ VK_TIMEOUT = 2,
+ VK_EVENT_SET = 3,
+ VK_EVENT_RESET = 4,
+ VK_INCOMPLETE = 5,
+ VK_ERROR_OUT_OF_HOST_MEMORY = -1,
+ VK_ERROR_OUT_OF_DEVICE_MEMORY = -2,
+ VK_ERROR_INITIALIZATION_FAILED = -3,
+ VK_ERROR_DEVICE_LOST = -4,
+ VK_ERROR_MEMORY_MAP_FAILED = -5,
+ VK_ERROR_LAYER_NOT_PRESENT = -6,
+ VK_ERROR_EXTENSION_NOT_PRESENT = -7,
+ VK_ERROR_FEATURE_NOT_PRESENT = -8,
+ VK_ERROR_INCOMPATIBLE_DRIVER = -9,
+ VK_ERROR_TOO_MANY_OBJECTS = -10,
+ VK_ERROR_FORMAT_NOT_SUPPORTED = -11,
+ VK_ERROR_FRAGMENTED_POOL = -12,
+ VK_ERROR_SURFACE_LOST_KHR = -1000000000,
+ VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001,
+ VK_SUBOPTIMAL_KHR = 1000001003,
+ VK_ERROR_OUT_OF_DATE_KHR = -1000001004,
+ VK_ERROR_VALIDATION_FAILED_EXT = -1000011001
+} VkResult;
+typedef enum VkShaderStageFlagBits {
+ VK_SHADER_STAGE_VERTEX_BIT = 1,
+ VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = 2,
+ VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = 4,
+ VK_SHADER_STAGE_GEOMETRY_BIT = 8,
+ VK_SHADER_STAGE_FRAGMENT_BIT = 16,
+ VK_SHADER_STAGE_COMPUTE_BIT = 32,
+ VK_SHADER_STAGE_ALL_GRAPHICS = 0x0000001F,
+ VK_SHADER_STAGE_ALL = 0x7FFFFFFF
+} VkShaderStageFlagBits;
+typedef enum VkSparseMemoryBindFlagBits {
+ VK_SPARSE_MEMORY_BIND_METADATA_BIT = 1
+} VkSparseMemoryBindFlagBits;
+typedef enum VkStencilFaceFlagBits {
+ VK_STENCIL_FACE_FRONT_BIT = 1,
+ VK_STENCIL_FACE_BACK_BIT = 2,
+ VK_STENCIL_FRONT_AND_BACK = 0x00000003
+} VkStencilFaceFlagBits;
+typedef enum VkStencilOp {
+ VK_STENCIL_OP_KEEP = 0,
+ VK_STENCIL_OP_ZERO = 1,
+ VK_STENCIL_OP_REPLACE = 2,
+ VK_STENCIL_OP_INCREMENT_AND_CLAMP = 3,
+ VK_STENCIL_OP_DECREMENT_AND_CLAMP = 4,
+ VK_STENCIL_OP_INVERT = 5,
+ VK_STENCIL_OP_INCREMENT_AND_WRAP = 6,
+ VK_STENCIL_OP_DECREMENT_AND_WRAP = 7
+} VkStencilOp;
+typedef enum VkStructureType {
+ VK_STRUCTURE_TYPE_APPLICATION_INFO = 0,
+ VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO = 1,
+ VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO = 2,
+ VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO = 3,
+ VK_STRUCTURE_TYPE_SUBMIT_INFO = 4,
+ VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO = 5,
+ VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE = 6,
+ VK_STRUCTURE_TYPE_BIND_SPARSE_INFO = 7,
+ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO = 8,
+ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO = 9,
+ VK_STRUCTURE_TYPE_EVENT_CREATE_INFO = 10,
+ VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO = 11,
+ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO = 12,
+ VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO = 13,
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO = 14,
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO = 15,
+ VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO = 16,
+ VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = 17,
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = 18,
+ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 19,
+ VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 20,
+ VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = 21,
+ VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = 22,
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO = 23,
+ VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 24,
+ VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 25,
+ VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 26,
+ VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO = 27,
+ VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = 28,
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = 29,
+ VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = 30,
+ VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = 31,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 32,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = 33,
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO = 34,
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = 35,
+ VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = 36,
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = 37,
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = 38,
+ VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO = 39,
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO = 40,
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO = 41,
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO = 42,
+ VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = 43,
+ VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = 44,
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = 45,
+ VK_STRUCTURE_TYPE_MEMORY_BARRIER = 46,
+ VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO = 47,
+ VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO = 48,
+ VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000,
+ VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001,
+ VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007,
+ VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR = 1000060008,
+ VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR = 1000060009,
+ VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR = 1000060010,
+ VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR = 1000060011,
+ VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR = 1000060012,
+ VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT = 1000011000,
+ VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT
+} VkStructureType;
+typedef enum VkSystemAllocationScope {
+ VK_SYSTEM_ALLOCATION_SCOPE_COMMAND = 0,
+ VK_SYSTEM_ALLOCATION_SCOPE_OBJECT = 1,
+ VK_SYSTEM_ALLOCATION_SCOPE_CACHE = 2,
+ VK_SYSTEM_ALLOCATION_SCOPE_DEVICE = 3,
+ VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE = 4
+} VkSystemAllocationScope;
+typedef enum VkInternalAllocationType {
+ VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE = 0
+} VkInternalAllocationType;
+typedef enum VkSamplerAddressMode {
+ VK_SAMPLER_ADDRESS_MODE_REPEAT = 0,
+ VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = 1,
+ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2,
+ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3
+} VkSamplerAddressMode;
+typedef enum VkFilter {
+ VK_FILTER_NEAREST = 0,
+ VK_FILTER_LINEAR = 1
+} VkFilter;
+typedef enum VkSamplerMipmapMode {
+ VK_SAMPLER_MIPMAP_MODE_NEAREST = 0,
+ VK_SAMPLER_MIPMAP_MODE_LINEAR = 1
+} VkSamplerMipmapMode;
+typedef enum VkVertexInputRate {
+ VK_VERTEX_INPUT_RATE_VERTEX = 0,
+ VK_VERTEX_INPUT_RATE_INSTANCE = 1
+} VkVertexInputRate;
+typedef enum VkPipelineStageFlagBits {
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT = 1,
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT = 2,
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT = 4,
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT = 8,
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT = 16,
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT = 32,
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT = 64,
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT = 128,
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT = 256,
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT = 512,
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = 1024,
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT = 2048,
+ VK_PIPELINE_STAGE_TRANSFER_BIT = 4096,
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT = 8192,
+ VK_PIPELINE_STAGE_HOST_BIT = 16384,
+ VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT = 32768,
+ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT = 65536
+} VkPipelineStageFlagBits;
+typedef enum VkSparseImageFormatFlagBits {
+ VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT = 1,
+ VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT = 2,
+ VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT = 4
+} VkSparseImageFormatFlagBits;
+typedef enum VkSampleCountFlagBits {
+ VK_SAMPLE_COUNT_1_BIT = 1,
+ VK_SAMPLE_COUNT_2_BIT = 2,
+ VK_SAMPLE_COUNT_4_BIT = 4,
+ VK_SAMPLE_COUNT_8_BIT = 8,
+ VK_SAMPLE_COUNT_16_BIT = 16,
+ VK_SAMPLE_COUNT_32_BIT = 32,
+ VK_SAMPLE_COUNT_64_BIT = 64
+} VkSampleCountFlagBits;
+typedef enum VkAttachmentDescriptionFlagBits {
+ VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = 1
+} VkAttachmentDescriptionFlagBits;
+typedef enum VkDescriptorPoolCreateFlagBits {
+ VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 1
+} VkDescriptorPoolCreateFlagBits;
+typedef enum VkDependencyFlagBits {
+ VK_DEPENDENCY_BY_REGION_BIT = 1
+} VkDependencyFlagBits;
+typedef enum VkObjectType {
+ VK_OBJECT_TYPE_UNKNOWN = 0,
+ VK_OBJECT_TYPE_INSTANCE = 1,
+ VK_OBJECT_TYPE_PHYSICAL_DEVICE = 2,
+ VK_OBJECT_TYPE_DEVICE = 3,
+ VK_OBJECT_TYPE_QUEUE = 4,
+ VK_OBJECT_TYPE_SEMAPHORE = 5,
+ VK_OBJECT_TYPE_COMMAND_BUFFER = 6,
+ VK_OBJECT_TYPE_FENCE = 7,
+ VK_OBJECT_TYPE_DEVICE_MEMORY = 8,
+ VK_OBJECT_TYPE_BUFFER = 9,
+ VK_OBJECT_TYPE_IMAGE = 10,
+ VK_OBJECT_TYPE_EVENT = 11,
+ VK_OBJECT_TYPE_QUERY_POOL = 12,
+ VK_OBJECT_TYPE_BUFFER_VIEW = 13,
+ VK_OBJECT_TYPE_IMAGE_VIEW = 14,
+ VK_OBJECT_TYPE_SHADER_MODULE = 15,
+ VK_OBJECT_TYPE_PIPELINE_CACHE = 16,
+ VK_OBJECT_TYPE_PIPELINE_LAYOUT = 17,
+ VK_OBJECT_TYPE_RENDER_PASS = 18,
+ VK_OBJECT_TYPE_PIPELINE = 19,
+ VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT = 20,
+ VK_OBJECT_TYPE_SAMPLER = 21,
+ VK_OBJECT_TYPE_DESCRIPTOR_POOL = 22,
+ VK_OBJECT_TYPE_DESCRIPTOR_SET = 23,
+ VK_OBJECT_TYPE_FRAMEBUFFER = 24,
+ VK_OBJECT_TYPE_COMMAND_POOL = 25,
+ VK_OBJECT_TYPE_SURFACE_KHR = 1000000000,
+ VK_OBJECT_TYPE_SWAPCHAIN_KHR = 1000001000,
+ VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT = 1000011000
+} VkObjectType;
+
+typedef enum VkColorSpaceKHR {
+ VK_COLOR_SPACE_SRGB_NONLINEAR_KHR = 0,
+ VK_COLORSPACE_SRGB_NONLINEAR_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR
+} VkColorSpaceKHR;
+typedef enum VkCompositeAlphaFlagBitsKHR {
+ VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR = 1,
+ VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR = 2,
+ VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR = 4,
+ VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR = 8
+} VkCompositeAlphaFlagBitsKHR;
+typedef enum VkPresentModeKHR {
+ VK_PRESENT_MODE_IMMEDIATE_KHR = 0,
+ VK_PRESENT_MODE_MAILBOX_KHR = 1,
+ VK_PRESENT_MODE_FIFO_KHR = 2,
+ VK_PRESENT_MODE_FIFO_RELAXED_KHR = 3
+} VkPresentModeKHR;
+typedef enum VkSurfaceTransformFlagBitsKHR {
+ VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR = 1,
+ VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR = 2,
+ VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR = 4,
+ VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR = 8,
+ VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR = 16,
+ VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR = 32,
+ VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR = 64,
+ VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR = 128,
+ VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR = 256
+} VkSurfaceTransformFlagBitsKHR;
+typedef enum VkDebugReportFlagBitsEXT {
+ VK_DEBUG_REPORT_INFORMATION_BIT_EXT = 1,
+ VK_DEBUG_REPORT_WARNING_BIT_EXT = 2,
+ VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT = 4,
+ VK_DEBUG_REPORT_ERROR_BIT_EXT = 8,
+ VK_DEBUG_REPORT_DEBUG_BIT_EXT = 16
+} VkDebugReportFlagBitsEXT;
+typedef enum VkDebugReportObjectTypeEXT {
+ VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT = 0,
+ VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT = 1,
+ VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT = 2,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT = 3,
+ VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT = 4,
+ VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT = 5,
+ VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT = 6,
+ VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT = 7,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT = 8,
+ VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT = 9,
+ VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT = 10,
+ VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT = 11,
+ VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT = 12,
+ VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT = 13,
+ VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT = 14,
+ VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT = 15,
+ VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT = 16,
+ VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT = 17,
+ VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT = 18,
+ VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT = 19,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT = 20,
+ VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT = 21,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT = 22,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT = 23,
+ VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT = 24,
+ VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT = 25,
+ VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT = 26,
+ VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT = 27,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT = 28,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT = 29,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT = 30,
+ VK_DEBUG_REPORT_OBJECT_TYPE_OBJECT_TABLE_NVX_EXT = 31,
+ VK_DEBUG_REPORT_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX_EXT = 32,
+ VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT = 33,
+ VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT,
+ VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT = 1000156000,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT = 1000085000
+} VkDebugReportObjectTypeEXT;
+typedef enum VkDeviceGroupPresentModeFlagBitsKHR {
+ VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR = 1,
+ VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR = 2,
+ VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR = 4,
+ VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR = 8
+} VkDeviceGroupPresentModeFlagBitsKHR;
+typedef enum VkSwapchainCreateFlagBitsKHR {
+ VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = 1,
+ VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR = 2
+} VkSwapchainCreateFlagBitsKHR;
+typedef enum VkVendorId {
+ VK_VENDOR_ID_VIV = 0x10001,
+ VK_VENDOR_ID_VSI = 0x10002,
+ VK_VENDOR_ID_KAZAN = 0x10003
+} VkVendorId;
+typedef void (VKAPI_PTR *PFN_vkInternalAllocationNotification)(
+ void* pUserData,
+ size_t size,
+ VkInternalAllocationType allocationType,
+ VkSystemAllocationScope allocationScope);
+typedef void (VKAPI_PTR *PFN_vkInternalFreeNotification)(
+ void* pUserData,
+ size_t size,
+ VkInternalAllocationType allocationType,
+ VkSystemAllocationScope allocationScope);
+typedef void* (VKAPI_PTR *PFN_vkReallocationFunction)(
+ void* pUserData,
+ void* pOriginal,
+ size_t size,
+ size_t alignment,
+ VkSystemAllocationScope allocationScope);
+typedef void* (VKAPI_PTR *PFN_vkAllocationFunction)(
+ void* pUserData,
+ size_t size,
+ size_t alignment,
+ VkSystemAllocationScope allocationScope);
+typedef void (VKAPI_PTR *PFN_vkFreeFunction)(
+ void* pUserData,
+ void* pMemory);
+typedef void (VKAPI_PTR *PFN_vkVoidFunction)(void);
+typedef struct VkBaseOutStructure {
+ VkStructureType sType;
+ struct VkBaseOutStructure * pNext;
+} VkBaseOutStructure;
+typedef struct VkBaseInStructure {
+ VkStructureType sType;
+ const struct VkBaseInStructure * pNext;
+} VkBaseInStructure;
+typedef struct VkOffset2D {
+ int32_t x;
+ int32_t y;
+} VkOffset2D;
+typedef struct VkOffset3D {
+ int32_t x;
+ int32_t y;
+ int32_t z;
+} VkOffset3D;
+typedef struct VkExtent2D {
+ uint32_t width;
+ uint32_t height;
+} VkExtent2D;
+typedef struct VkExtent3D {
+ uint32_t width;
+ uint32_t height;
+ uint32_t depth;
+} VkExtent3D;
+typedef struct VkViewport {
+ float x;
+ float y;
+ float width;
+ float height;
+ float minDepth;
+ float maxDepth;
+} VkViewport;
+typedef struct VkRect2D {
+ VkOffset2D offset;
+ VkExtent2D extent;
+} VkRect2D;
+typedef struct VkClearRect {
+ VkRect2D rect;
+ uint32_t baseArrayLayer;
+ uint32_t layerCount;
+} VkClearRect;
+typedef struct VkComponentMapping {
+ VkComponentSwizzle r;
+ VkComponentSwizzle g;
+ VkComponentSwizzle b;
+ VkComponentSwizzle a;
+} VkComponentMapping;
+typedef struct VkExtensionProperties {
+ char extensionName [ VK_MAX_EXTENSION_NAME_SIZE ];
+ uint32_t specVersion;
+} VkExtensionProperties;
+typedef struct VkLayerProperties {
+ char layerName [ VK_MAX_EXTENSION_NAME_SIZE ];
+ uint32_t specVersion;
+ uint32_t implementationVersion;
+ char description [ VK_MAX_DESCRIPTION_SIZE ];
+} VkLayerProperties;
+typedef struct VkApplicationInfo {
+ VkStructureType sType;
+ const void * pNext;
+ const char * pApplicationName;
+ uint32_t applicationVersion;
+ const char * pEngineName;
+ uint32_t engineVersion;
+ uint32_t apiVersion;
+} VkApplicationInfo;
+typedef struct VkAllocationCallbacks {
+ void * pUserData;
+ PFN_vkAllocationFunction pfnAllocation;
+ PFN_vkReallocationFunction pfnReallocation;
+ PFN_vkFreeFunction pfnFree;
+ PFN_vkInternalAllocationNotification pfnInternalAllocation;
+ PFN_vkInternalFreeNotification pfnInternalFree;
+} VkAllocationCallbacks;
+typedef struct VkDescriptorImageInfo {
+ VkSampler sampler;
+ VkImageView imageView;
+ VkImageLayout imageLayout;
+} VkDescriptorImageInfo;
+typedef struct VkCopyDescriptorSet {
+ VkStructureType sType;
+ const void * pNext;
+ VkDescriptorSet srcSet;
+ uint32_t srcBinding;
+ uint32_t srcArrayElement;
+ VkDescriptorSet dstSet;
+ uint32_t dstBinding;
+ uint32_t dstArrayElement;
+ uint32_t descriptorCount;
+} VkCopyDescriptorSet;
+typedef struct VkDescriptorPoolSize {
+ VkDescriptorType type;
+ uint32_t descriptorCount;
+} VkDescriptorPoolSize;
+typedef struct VkDescriptorSetAllocateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkDescriptorPool descriptorPool;
+ uint32_t descriptorSetCount;
+ const VkDescriptorSetLayout * pSetLayouts;
+} VkDescriptorSetAllocateInfo;
+typedef struct VkSpecializationMapEntry {
+ uint32_t constantID;
+ uint32_t offset;
+ size_t size;
+} VkSpecializationMapEntry;
+typedef struct VkSpecializationInfo {
+ uint32_t mapEntryCount;
+ const VkSpecializationMapEntry * pMapEntries;
+ size_t dataSize;
+ const void * pData;
+} VkSpecializationInfo;
+typedef struct VkVertexInputBindingDescription {
+ uint32_t binding;
+ uint32_t stride;
+ VkVertexInputRate inputRate;
+} VkVertexInputBindingDescription;
+typedef struct VkVertexInputAttributeDescription {
+ uint32_t location;
+ uint32_t binding;
+ VkFormat format;
+ uint32_t offset;
+} VkVertexInputAttributeDescription;
+typedef struct VkStencilOpState {
+ VkStencilOp failOp;
+ VkStencilOp passOp;
+ VkStencilOp depthFailOp;
+ VkCompareOp compareOp;
+ uint32_t compareMask;
+ uint32_t writeMask;
+ uint32_t reference;
+} VkStencilOpState;
+typedef struct VkCommandBufferAllocateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkCommandPool commandPool;
+ VkCommandBufferLevel level;
+ uint32_t commandBufferCount;
+} VkCommandBufferAllocateInfo;
+typedef union VkClearColorValue {
+ float float32 [4];
+ int32_t int32 [4];
+ uint32_t uint32 [4];
+} VkClearColorValue;
+typedef struct VkClearDepthStencilValue {
+ float depth;
+ uint32_t stencil;
+} VkClearDepthStencilValue;
+typedef union VkClearValue {
+ VkClearColorValue color;
+ VkClearDepthStencilValue depthStencil;
+} VkClearValue;
+typedef struct VkAttachmentReference {
+ uint32_t attachment;
+ VkImageLayout layout;
+} VkAttachmentReference;
+typedef struct VkDrawIndirectCommand {
+ uint32_t vertexCount;
+ uint32_t instanceCount;
+ uint32_t firstVertex;
+ uint32_t firstInstance;
+} VkDrawIndirectCommand;
+typedef struct VkDrawIndexedIndirectCommand {
+ uint32_t indexCount;
+ uint32_t instanceCount;
+ uint32_t firstIndex;
+ int32_t vertexOffset;
+ uint32_t firstInstance;
+} VkDrawIndexedIndirectCommand;
+typedef struct VkDispatchIndirectCommand {
+ uint32_t x;
+ uint32_t y;
+ uint32_t z;
+} VkDispatchIndirectCommand;
+typedef struct VkSurfaceFormatKHR {
+ VkFormat format;
+ VkColorSpaceKHR colorSpace;
+} VkSurfaceFormatKHR;
+typedef struct VkPresentInfoKHR {
+ VkStructureType sType;
+ const void * pNext;
+ uint32_t waitSemaphoreCount;
+ const VkSemaphore * pWaitSemaphores;
+ uint32_t swapchainCount;
+ const VkSwapchainKHR * pSwapchains;
+ const uint32_t * pImageIndices;
+ VkResult * pResults;
+} VkPresentInfoKHR;
+typedef struct VkImageSwapchainCreateInfoKHR {
+ VkStructureType sType;
+ const void * pNext;
+ VkSwapchainKHR swapchain;
+} VkImageSwapchainCreateInfoKHR;
+typedef struct VkBindImageMemorySwapchainInfoKHR {
+ VkStructureType sType;
+ const void * pNext;
+ VkSwapchainKHR swapchain;
+ uint32_t imageIndex;
+} VkBindImageMemorySwapchainInfoKHR;
+typedef struct VkAcquireNextImageInfoKHR {
+ VkStructureType sType;
+ const void * pNext;
+ VkSwapchainKHR swapchain;
+ uint64_t timeout;
+ VkSemaphore semaphore;
+ VkFence fence;
+ uint32_t deviceMask;
+} VkAcquireNextImageInfoKHR;
+typedef struct VkDeviceGroupPresentInfoKHR {
+ VkStructureType sType;
+ const void * pNext;
+ uint32_t swapchainCount;
+ const uint32_t * pDeviceMasks;
+ VkDeviceGroupPresentModeFlagBitsKHR mode;
+} VkDeviceGroupPresentInfoKHR;
+typedef uint32_t VkSampleMask;
+typedef uint32_t VkBool32;
+typedef uint32_t VkFlags;
+typedef uint64_t VkDeviceSize;
+typedef VkFlags VkFramebufferCreateFlags;
+typedef VkFlags VkQueryPoolCreateFlags;
+typedef VkFlags VkRenderPassCreateFlags;
+typedef VkFlags VkSamplerCreateFlags;
+typedef VkFlags VkPipelineLayoutCreateFlags;
+typedef VkFlags VkPipelineCacheCreateFlags;
+typedef VkFlags VkPipelineDepthStencilStateCreateFlags;
+typedef VkFlags VkPipelineDynamicStateCreateFlags;
+typedef VkFlags VkPipelineColorBlendStateCreateFlags;
+typedef VkFlags VkPipelineMultisampleStateCreateFlags;
+typedef VkFlags VkPipelineRasterizationStateCreateFlags;
+typedef VkFlags VkPipelineViewportStateCreateFlags;
+typedef VkFlags VkPipelineTessellationStateCreateFlags;
+typedef VkFlags VkPipelineInputAssemblyStateCreateFlags;
+typedef VkFlags VkPipelineVertexInputStateCreateFlags;
+typedef VkFlags VkPipelineShaderStageCreateFlags;
+typedef VkFlags VkDescriptorSetLayoutCreateFlags;
+typedef VkFlags VkBufferViewCreateFlags;
+typedef VkFlags VkInstanceCreateFlags;
+typedef VkFlags VkDeviceCreateFlags;
+typedef VkFlags VkDeviceQueueCreateFlags;
+typedef VkFlags VkQueueFlags;
+typedef VkFlags VkMemoryPropertyFlags;
+typedef VkFlags VkMemoryHeapFlags;
+typedef VkFlags VkAccessFlags;
+typedef VkFlags VkBufferUsageFlags;
+typedef VkFlags VkBufferCreateFlags;
+typedef VkFlags VkShaderStageFlags;
+typedef VkFlags VkImageUsageFlags;
+typedef VkFlags VkImageCreateFlags;
+typedef VkFlags VkImageViewCreateFlags;
+typedef VkFlags VkPipelineCreateFlags;
+typedef VkFlags VkColorComponentFlags;
+typedef VkFlags VkFenceCreateFlags;
+typedef VkFlags VkSemaphoreCreateFlags;
+typedef VkFlags VkFormatFeatureFlags;
+typedef VkFlags VkQueryControlFlags;
+typedef VkFlags VkQueryResultFlags;
+typedef VkFlags VkShaderModuleCreateFlags;
+typedef VkFlags VkEventCreateFlags;
+typedef VkFlags VkCommandPoolCreateFlags;
+typedef VkFlags VkCommandPoolResetFlags;
+typedef VkFlags VkCommandBufferResetFlags;
+typedef VkFlags VkCommandBufferUsageFlags;
+typedef VkFlags VkQueryPipelineStatisticFlags;
+typedef VkFlags VkMemoryMapFlags;
+typedef VkFlags VkImageAspectFlags;
+typedef VkFlags VkSparseMemoryBindFlags;
+typedef VkFlags VkSparseImageFormatFlags;
+typedef VkFlags VkSubpassDescriptionFlags;
+typedef VkFlags VkPipelineStageFlags;
+typedef VkFlags VkSampleCountFlags;
+typedef VkFlags VkAttachmentDescriptionFlags;
+typedef VkFlags VkStencilFaceFlags;
+typedef VkFlags VkCullModeFlags;
+typedef VkFlags VkDescriptorPoolCreateFlags;
+typedef VkFlags VkDescriptorPoolResetFlags;
+typedef VkFlags VkDependencyFlags;
+typedef VkFlags VkCompositeAlphaFlagsKHR;
+typedef VkFlags VkSurfaceTransformFlagsKHR;
+typedef VkFlags VkSwapchainCreateFlagsKHR;
+typedef VkFlags VkDeviceGroupPresentModeFlagsKHR;
+typedef VkFlags VkDebugReportFlagsEXT;
+typedef VkBool32 (VKAPI_PTR *PFN_vkDebugReportCallbackEXT)(
+ VkDebugReportFlagsEXT flags,
+ VkDebugReportObjectTypeEXT objectType,
+ uint64_t object,
+ size_t location,
+ int32_t messageCode,
+ const char* pLayerPrefix,
+ const char* pMessage,
+ void* pUserData);
+typedef struct VkDeviceQueueCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkDeviceQueueCreateFlags flags;
+ uint32_t queueFamilyIndex;
+ uint32_t queueCount;
+ const float * pQueuePriorities;
+} VkDeviceQueueCreateInfo;
+typedef struct VkInstanceCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkInstanceCreateFlags flags;
+ const VkApplicationInfo * pApplicationInfo;
+ uint32_t enabledLayerCount;
+ const char * const* ppEnabledLayerNames;
+ uint32_t enabledExtensionCount;
+ const char * const* ppEnabledExtensionNames;
+} VkInstanceCreateInfo;
+typedef struct VkQueueFamilyProperties {
+ VkQueueFlags queueFlags;
+ uint32_t queueCount;
+ uint32_t timestampValidBits;
+ VkExtent3D minImageTransferGranularity;
+} VkQueueFamilyProperties;
+typedef struct VkMemoryAllocateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkDeviceSize allocationSize;
+ uint32_t memoryTypeIndex;
+} VkMemoryAllocateInfo;
+typedef struct VkMemoryRequirements {
+ VkDeviceSize size;
+ VkDeviceSize alignment;
+ uint32_t memoryTypeBits;
+} VkMemoryRequirements;
+typedef struct VkSparseImageFormatProperties {
+ VkImageAspectFlags aspectMask;
+ VkExtent3D imageGranularity;
+ VkSparseImageFormatFlags flags;
+} VkSparseImageFormatProperties;
+typedef struct VkSparseImageMemoryRequirements {
+ VkSparseImageFormatProperties formatProperties;
+ uint32_t imageMipTailFirstLod;
+ VkDeviceSize imageMipTailSize;
+ VkDeviceSize imageMipTailOffset;
+ VkDeviceSize imageMipTailStride;
+} VkSparseImageMemoryRequirements;
+typedef struct VkMemoryType {
+ VkMemoryPropertyFlags propertyFlags;
+ uint32_t heapIndex;
+} VkMemoryType;
+typedef struct VkMemoryHeap {
+ VkDeviceSize size;
+ VkMemoryHeapFlags flags;
+} VkMemoryHeap;
+typedef struct VkMappedMemoryRange {
+ VkStructureType sType;
+ const void * pNext;
+ VkDeviceMemory memory;
+ VkDeviceSize offset;
+ VkDeviceSize size;
+} VkMappedMemoryRange;
+typedef struct VkFormatProperties {
+ VkFormatFeatureFlags linearTilingFeatures;
+ VkFormatFeatureFlags optimalTilingFeatures;
+ VkFormatFeatureFlags bufferFeatures;
+} VkFormatProperties;
+typedef struct VkImageFormatProperties {
+ VkExtent3D maxExtent;
+ uint32_t maxMipLevels;
+ uint32_t maxArrayLayers;
+ VkSampleCountFlags sampleCounts;
+ VkDeviceSize maxResourceSize;
+} VkImageFormatProperties;
+typedef struct VkDescriptorBufferInfo {
+ VkBuffer buffer;
+ VkDeviceSize offset;
+ VkDeviceSize range;
+} VkDescriptorBufferInfo;
+typedef struct VkWriteDescriptorSet {
+ VkStructureType sType;
+ const void * pNext;
+ VkDescriptorSet dstSet;
+ uint32_t dstBinding;
+ uint32_t dstArrayElement;
+ uint32_t descriptorCount;
+ VkDescriptorType descriptorType;
+ const VkDescriptorImageInfo * pImageInfo;
+ const VkDescriptorBufferInfo * pBufferInfo;
+ const VkBufferView * pTexelBufferView;
+} VkWriteDescriptorSet;
+typedef struct VkBufferCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkBufferCreateFlags flags;
+ VkDeviceSize size;
+ VkBufferUsageFlags usage;
+ VkSharingMode sharingMode;
+ uint32_t queueFamilyIndexCount;
+ const uint32_t * pQueueFamilyIndices;
+} VkBufferCreateInfo;
+typedef struct VkBufferViewCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkBufferViewCreateFlags flags;
+ VkBuffer buffer;
+ VkFormat format;
+ VkDeviceSize offset;
+ VkDeviceSize range;
+} VkBufferViewCreateInfo;
+typedef struct VkImageSubresource {
+ VkImageAspectFlags aspectMask;
+ uint32_t mipLevel;
+ uint32_t arrayLayer;
+} VkImageSubresource;
+typedef struct VkImageSubresourceLayers {
+ VkImageAspectFlags aspectMask;
+ uint32_t mipLevel;
+ uint32_t baseArrayLayer;
+ uint32_t layerCount;
+} VkImageSubresourceLayers;
+typedef struct VkImageSubresourceRange {
+ VkImageAspectFlags aspectMask;
+ uint32_t baseMipLevel;
+ uint32_t levelCount;
+ uint32_t baseArrayLayer;
+ uint32_t layerCount;
+} VkImageSubresourceRange;
+typedef struct VkMemoryBarrier {
+ VkStructureType sType;
+ const void * pNext;
+ VkAccessFlags srcAccessMask;
+ VkAccessFlags dstAccessMask;
+} VkMemoryBarrier;
+typedef struct VkBufferMemoryBarrier {
+ VkStructureType sType;
+ const void * pNext;
+ VkAccessFlags srcAccessMask;
+ VkAccessFlags dstAccessMask;
+ uint32_t srcQueueFamilyIndex;
+ uint32_t dstQueueFamilyIndex;
+ VkBuffer buffer;
+ VkDeviceSize offset;
+ VkDeviceSize size;
+} VkBufferMemoryBarrier;
+typedef struct VkImageMemoryBarrier {
+ VkStructureType sType;
+ const void * pNext;
+ VkAccessFlags srcAccessMask;
+ VkAccessFlags dstAccessMask;
+ VkImageLayout oldLayout;
+ VkImageLayout newLayout;
+ uint32_t srcQueueFamilyIndex;
+ uint32_t dstQueueFamilyIndex;
+ VkImage image;
+ VkImageSubresourceRange subresourceRange;
+} VkImageMemoryBarrier;
+typedef struct VkImageCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkImageCreateFlags flags;
+ VkImageType imageType;
+ VkFormat format;
+ VkExtent3D extent;
+ uint32_t mipLevels;
+ uint32_t arrayLayers;
+ VkSampleCountFlagBits samples;
+ VkImageTiling tiling;
+ VkImageUsageFlags usage;
+ VkSharingMode sharingMode;
+ uint32_t queueFamilyIndexCount;
+ const uint32_t * pQueueFamilyIndices;
+ VkImageLayout initialLayout;
+} VkImageCreateInfo;
+typedef struct VkSubresourceLayout {
+ VkDeviceSize offset;
+ VkDeviceSize size;
+ VkDeviceSize rowPitch;
+ VkDeviceSize arrayPitch;
+ VkDeviceSize depthPitch;
+} VkSubresourceLayout;
+typedef struct VkImageViewCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkImageViewCreateFlags flags;
+ VkImage image;
+ VkImageViewType viewType;
+ VkFormat format;
+ VkComponentMapping components;
+ VkImageSubresourceRange subresourceRange;
+} VkImageViewCreateInfo;
+typedef struct VkBufferCopy {
+ VkDeviceSize srcOffset;
+ VkDeviceSize dstOffset;
+ VkDeviceSize size;
+} VkBufferCopy;
+typedef struct VkSparseMemoryBind {
+ VkDeviceSize resourceOffset;
+ VkDeviceSize size;
+ VkDeviceMemory memory;
+ VkDeviceSize memoryOffset;
+ VkSparseMemoryBindFlags flags;
+} VkSparseMemoryBind;
+typedef struct VkSparseImageMemoryBind {
+ VkImageSubresource subresource;
+ VkOffset3D offset;
+ VkExtent3D extent;
+ VkDeviceMemory memory;
+ VkDeviceSize memoryOffset;
+ VkSparseMemoryBindFlags flags;
+} VkSparseImageMemoryBind;
+typedef struct VkSparseBufferMemoryBindInfo {
+ VkBuffer buffer;
+ uint32_t bindCount;
+ const VkSparseMemoryBind * pBinds;
+} VkSparseBufferMemoryBindInfo;
+typedef struct VkSparseImageOpaqueMemoryBindInfo {
+ VkImage image;
+ uint32_t bindCount;
+ const VkSparseMemoryBind * pBinds;
+} VkSparseImageOpaqueMemoryBindInfo;
+typedef struct VkSparseImageMemoryBindInfo {
+ VkImage image;
+ uint32_t bindCount;
+ const VkSparseImageMemoryBind * pBinds;
+} VkSparseImageMemoryBindInfo;
+typedef struct VkBindSparseInfo {
+ VkStructureType sType;
+ const void * pNext;
+ uint32_t waitSemaphoreCount;
+ const VkSemaphore * pWaitSemaphores;
+ uint32_t bufferBindCount;
+ const VkSparseBufferMemoryBindInfo * pBufferBinds;
+ uint32_t imageOpaqueBindCount;
+ const VkSparseImageOpaqueMemoryBindInfo * pImageOpaqueBinds;
+ uint32_t imageBindCount;
+ const VkSparseImageMemoryBindInfo * pImageBinds;
+ uint32_t signalSemaphoreCount;
+ const VkSemaphore * pSignalSemaphores;
+} VkBindSparseInfo;
+typedef struct VkImageCopy {
+ VkImageSubresourceLayers srcSubresource;
+ VkOffset3D srcOffset;
+ VkImageSubresourceLayers dstSubresource;
+ VkOffset3D dstOffset;
+ VkExtent3D extent;
+} VkImageCopy;
+typedef struct VkImageBlit {
+ VkImageSubresourceLayers srcSubresource;
+ VkOffset3D srcOffsets [2];
+ VkImageSubresourceLayers dstSubresource;
+ VkOffset3D dstOffsets [2];
+} VkImageBlit;
+typedef struct VkBufferImageCopy {
+ VkDeviceSize bufferOffset;
+ uint32_t bufferRowLength;
+ uint32_t bufferImageHeight;
+ VkImageSubresourceLayers imageSubresource;
+ VkOffset3D imageOffset;
+ VkExtent3D imageExtent;
+} VkBufferImageCopy;
+typedef struct VkImageResolve {
+ VkImageSubresourceLayers srcSubresource;
+ VkOffset3D srcOffset;
+ VkImageSubresourceLayers dstSubresource;
+ VkOffset3D dstOffset;
+ VkExtent3D extent;
+} VkImageResolve;
+typedef struct VkShaderModuleCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkShaderModuleCreateFlags flags;
+ size_t codeSize;
+ const uint32_t * pCode;
+} VkShaderModuleCreateInfo;
+typedef struct VkDescriptorSetLayoutBinding {
+ uint32_t binding;
+ VkDescriptorType descriptorType;
+ uint32_t descriptorCount;
+ VkShaderStageFlags stageFlags;
+ const VkSampler * pImmutableSamplers;
+} VkDescriptorSetLayoutBinding;
+typedef struct VkDescriptorSetLayoutCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkDescriptorSetLayoutCreateFlags flags;
+ uint32_t bindingCount;
+ const VkDescriptorSetLayoutBinding * pBindings;
+} VkDescriptorSetLayoutCreateInfo;
+typedef struct VkDescriptorPoolCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkDescriptorPoolCreateFlags flags;
+ uint32_t maxSets;
+ uint32_t poolSizeCount;
+ const VkDescriptorPoolSize * pPoolSizes;
+} VkDescriptorPoolCreateInfo;
+typedef struct VkPipelineShaderStageCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineShaderStageCreateFlags flags;
+ VkShaderStageFlagBits stage;
+ VkShaderModule module;
+ const char * pName;
+ const VkSpecializationInfo * pSpecializationInfo;
+} VkPipelineShaderStageCreateInfo;
+typedef struct VkComputePipelineCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineCreateFlags flags;
+ VkPipelineShaderStageCreateInfo stage;
+ VkPipelineLayout layout;
+ VkPipeline basePipelineHandle;
+ int32_t basePipelineIndex;
+} VkComputePipelineCreateInfo;
+typedef struct VkPipelineVertexInputStateCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineVertexInputStateCreateFlags flags;
+ uint32_t vertexBindingDescriptionCount;
+ const VkVertexInputBindingDescription * pVertexBindingDescriptions;
+ uint32_t vertexAttributeDescriptionCount;
+ const VkVertexInputAttributeDescription * pVertexAttributeDescriptions;
+} VkPipelineVertexInputStateCreateInfo;
+typedef struct VkPipelineInputAssemblyStateCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineInputAssemblyStateCreateFlags flags;
+ VkPrimitiveTopology topology;
+ VkBool32 primitiveRestartEnable;
+} VkPipelineInputAssemblyStateCreateInfo;
+typedef struct VkPipelineTessellationStateCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineTessellationStateCreateFlags flags;
+ uint32_t patchControlPoints;
+} VkPipelineTessellationStateCreateInfo;
+typedef struct VkPipelineViewportStateCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineViewportStateCreateFlags flags;
+ uint32_t viewportCount;
+ const VkViewport * pViewports;
+ uint32_t scissorCount;
+ const VkRect2D * pScissors;
+} VkPipelineViewportStateCreateInfo;
+typedef struct VkPipelineRasterizationStateCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineRasterizationStateCreateFlags flags;
+ VkBool32 depthClampEnable;
+ VkBool32 rasterizerDiscardEnable;
+ VkPolygonMode polygonMode;
+ VkCullModeFlags cullMode;
+ VkFrontFace frontFace;
+ VkBool32 depthBiasEnable;
+ float depthBiasConstantFactor;
+ float depthBiasClamp;
+ float depthBiasSlopeFactor;
+ float lineWidth;
+} VkPipelineRasterizationStateCreateInfo;
+typedef struct VkPipelineMultisampleStateCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineMultisampleStateCreateFlags flags;
+ VkSampleCountFlagBits rasterizationSamples;
+ VkBool32 sampleShadingEnable;
+ float minSampleShading;
+ const VkSampleMask * pSampleMask;
+ VkBool32 alphaToCoverageEnable;
+ VkBool32 alphaToOneEnable;
+} VkPipelineMultisampleStateCreateInfo;
+typedef struct VkPipelineColorBlendAttachmentState {
+ VkBool32 blendEnable;
+ VkBlendFactor srcColorBlendFactor;
+ VkBlendFactor dstColorBlendFactor;
+ VkBlendOp colorBlendOp;
+ VkBlendFactor srcAlphaBlendFactor;
+ VkBlendFactor dstAlphaBlendFactor;
+ VkBlendOp alphaBlendOp;
+ VkColorComponentFlags colorWriteMask;
+} VkPipelineColorBlendAttachmentState;
+typedef struct VkPipelineColorBlendStateCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineColorBlendStateCreateFlags flags;
+ VkBool32 logicOpEnable;
+ VkLogicOp logicOp;
+ uint32_t attachmentCount;
+ const VkPipelineColorBlendAttachmentState * pAttachments;
+ float blendConstants [4];
+} VkPipelineColorBlendStateCreateInfo;
+typedef struct VkPipelineDynamicStateCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineDynamicStateCreateFlags flags;
+ uint32_t dynamicStateCount;
+ const VkDynamicState * pDynamicStates;
+} VkPipelineDynamicStateCreateInfo;
+typedef struct VkPipelineDepthStencilStateCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineDepthStencilStateCreateFlags flags;
+ VkBool32 depthTestEnable;
+ VkBool32 depthWriteEnable;
+ VkCompareOp depthCompareOp;
+ VkBool32 depthBoundsTestEnable;
+ VkBool32 stencilTestEnable;
+ VkStencilOpState front;
+ VkStencilOpState back;
+ float minDepthBounds;
+ float maxDepthBounds;
+} VkPipelineDepthStencilStateCreateInfo;
+typedef struct VkGraphicsPipelineCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineCreateFlags flags;
+ uint32_t stageCount;
+ const VkPipelineShaderStageCreateInfo * pStages;
+ const VkPipelineVertexInputStateCreateInfo * pVertexInputState;
+ const VkPipelineInputAssemblyStateCreateInfo * pInputAssemblyState;
+ const VkPipelineTessellationStateCreateInfo * pTessellationState;
+ const VkPipelineViewportStateCreateInfo * pViewportState;
+ const VkPipelineRasterizationStateCreateInfo * pRasterizationState;
+ const VkPipelineMultisampleStateCreateInfo * pMultisampleState;
+ const VkPipelineDepthStencilStateCreateInfo * pDepthStencilState;
+ const VkPipelineColorBlendStateCreateInfo * pColorBlendState;
+ const VkPipelineDynamicStateCreateInfo * pDynamicState;
+ VkPipelineLayout layout;
+ VkRenderPass renderPass;
+ uint32_t subpass;
+ VkPipeline basePipelineHandle;
+ int32_t basePipelineIndex;
+} VkGraphicsPipelineCreateInfo;
+typedef struct VkPipelineCacheCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineCacheCreateFlags flags;
+ size_t initialDataSize;
+ const void * pInitialData;
+} VkPipelineCacheCreateInfo;
+typedef struct VkPushConstantRange {
+ VkShaderStageFlags stageFlags;
+ uint32_t offset;
+ uint32_t size;
+} VkPushConstantRange;
+typedef struct VkPipelineLayoutCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkPipelineLayoutCreateFlags flags;
+ uint32_t setLayoutCount;
+ const VkDescriptorSetLayout * pSetLayouts;
+ uint32_t pushConstantRangeCount;
+ const VkPushConstantRange * pPushConstantRanges;
+} VkPipelineLayoutCreateInfo;
+typedef struct VkSamplerCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkSamplerCreateFlags flags;
+ VkFilter magFilter;
+ VkFilter minFilter;
+ VkSamplerMipmapMode mipmapMode;
+ VkSamplerAddressMode addressModeU;
+ VkSamplerAddressMode addressModeV;
+ VkSamplerAddressMode addressModeW;
+ float mipLodBias;
+ VkBool32 anisotropyEnable;
+ float maxAnisotropy;
+ VkBool32 compareEnable;
+ VkCompareOp compareOp;
+ float minLod;
+ float maxLod;
+ VkBorderColor borderColor;
+ VkBool32 unnormalizedCoordinates;
+} VkSamplerCreateInfo;
+typedef struct VkCommandPoolCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkCommandPoolCreateFlags flags;
+ uint32_t queueFamilyIndex;
+} VkCommandPoolCreateInfo;
+typedef struct VkCommandBufferInheritanceInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkRenderPass renderPass;
+ uint32_t subpass;
+ VkFramebuffer framebuffer;
+ VkBool32 occlusionQueryEnable;
+ VkQueryControlFlags queryFlags;
+ VkQueryPipelineStatisticFlags pipelineStatistics;
+} VkCommandBufferInheritanceInfo;
+typedef struct VkCommandBufferBeginInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkCommandBufferUsageFlags flags;
+ const VkCommandBufferInheritanceInfo * pInheritanceInfo;
+} VkCommandBufferBeginInfo;
+typedef struct VkRenderPassBeginInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkRenderPass renderPass;
+ VkFramebuffer framebuffer;
+ VkRect2D renderArea;
+ uint32_t clearValueCount;
+ const VkClearValue * pClearValues;
+} VkRenderPassBeginInfo;
+typedef struct VkClearAttachment {
+ VkImageAspectFlags aspectMask;
+ uint32_t colorAttachment;
+ VkClearValue clearValue;
+} VkClearAttachment;
+typedef struct VkAttachmentDescription {
+ VkAttachmentDescriptionFlags flags;
+ VkFormat format;
+ VkSampleCountFlagBits samples;
+ VkAttachmentLoadOp loadOp;
+ VkAttachmentStoreOp storeOp;
+ VkAttachmentLoadOp stencilLoadOp;
+ VkAttachmentStoreOp stencilStoreOp;
+ VkImageLayout initialLayout;
+ VkImageLayout finalLayout;
+} VkAttachmentDescription;
+typedef struct VkSubpassDescription {
+ VkSubpassDescriptionFlags flags;
+ VkPipelineBindPoint pipelineBindPoint;
+ uint32_t inputAttachmentCount;
+ const VkAttachmentReference * pInputAttachments;
+ uint32_t colorAttachmentCount;
+ const VkAttachmentReference * pColorAttachments;
+ const VkAttachmentReference * pResolveAttachments;
+ const VkAttachmentReference * pDepthStencilAttachment;
+ uint32_t preserveAttachmentCount;
+ const uint32_t * pPreserveAttachments;
+} VkSubpassDescription;
+typedef struct VkSubpassDependency {
+ uint32_t srcSubpass;
+ uint32_t dstSubpass;
+ VkPipelineStageFlags srcStageMask;
+ VkPipelineStageFlags dstStageMask;
+ VkAccessFlags srcAccessMask;
+ VkAccessFlags dstAccessMask;
+ VkDependencyFlags dependencyFlags;
+} VkSubpassDependency;
+typedef struct VkRenderPassCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkRenderPassCreateFlags flags;
+ uint32_t attachmentCount;
+ const VkAttachmentDescription * pAttachments;
+ uint32_t subpassCount;
+ const VkSubpassDescription * pSubpasses;
+ uint32_t dependencyCount;
+ const VkSubpassDependency * pDependencies;
+} VkRenderPassCreateInfo;
+typedef struct VkEventCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkEventCreateFlags flags;
+} VkEventCreateInfo;
+typedef struct VkFenceCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkFenceCreateFlags flags;
+} VkFenceCreateInfo;
+typedef struct VkPhysicalDeviceFeatures {
+ VkBool32 robustBufferAccess;
+ VkBool32 fullDrawIndexUint32;
+ VkBool32 imageCubeArray;
+ VkBool32 independentBlend;
+ VkBool32 geometryShader;
+ VkBool32 tessellationShader;
+ VkBool32 sampleRateShading;
+ VkBool32 dualSrcBlend;
+ VkBool32 logicOp;
+ VkBool32 multiDrawIndirect;
+ VkBool32 drawIndirectFirstInstance;
+ VkBool32 depthClamp;
+ VkBool32 depthBiasClamp;
+ VkBool32 fillModeNonSolid;
+ VkBool32 depthBounds;
+ VkBool32 wideLines;
+ VkBool32 largePoints;
+ VkBool32 alphaToOne;
+ VkBool32 multiViewport;
+ VkBool32 samplerAnisotropy;
+ VkBool32 textureCompressionETC2;
+ VkBool32 textureCompressionASTC_LDR;
+ VkBool32 textureCompressionBC;
+ VkBool32 occlusionQueryPrecise;
+ VkBool32 pipelineStatisticsQuery;
+ VkBool32 vertexPipelineStoresAndAtomics;
+ VkBool32 fragmentStoresAndAtomics;
+ VkBool32 shaderTessellationAndGeometryPointSize;
+ VkBool32 shaderImageGatherExtended;
+ VkBool32 shaderStorageImageExtendedFormats;
+ VkBool32 shaderStorageImageMultisample;
+ VkBool32 shaderStorageImageReadWithoutFormat;
+ VkBool32 shaderStorageImageWriteWithoutFormat;
+ VkBool32 shaderUniformBufferArrayDynamicIndexing;
+ VkBool32 shaderSampledImageArrayDynamicIndexing;
+ VkBool32 shaderStorageBufferArrayDynamicIndexing;
+ VkBool32 shaderStorageImageArrayDynamicIndexing;
+ VkBool32 shaderClipDistance;
+ VkBool32 shaderCullDistance;
+ VkBool32 shaderFloat64;
+ VkBool32 shaderInt64;
+ VkBool32 shaderInt16;
+ VkBool32 shaderResourceResidency;
+ VkBool32 shaderResourceMinLod;
+ VkBool32 sparseBinding;
+ VkBool32 sparseResidencyBuffer;
+ VkBool32 sparseResidencyImage2D;
+ VkBool32 sparseResidencyImage3D;
+ VkBool32 sparseResidency2Samples;
+ VkBool32 sparseResidency4Samples;
+ VkBool32 sparseResidency8Samples;
+ VkBool32 sparseResidency16Samples;
+ VkBool32 sparseResidencyAliased;
+ VkBool32 variableMultisampleRate;
+ VkBool32 inheritedQueries;
+} VkPhysicalDeviceFeatures;
+typedef struct VkPhysicalDeviceSparseProperties {
+ VkBool32 residencyStandard2DBlockShape;
+ VkBool32 residencyStandard2DMultisampleBlockShape;
+ VkBool32 residencyStandard3DBlockShape;
+ VkBool32 residencyAlignedMipSize;
+ VkBool32 residencyNonResidentStrict;
+} VkPhysicalDeviceSparseProperties;
+typedef struct VkPhysicalDeviceLimits {
+ uint32_t maxImageDimension1D;
+ uint32_t maxImageDimension2D;
+ uint32_t maxImageDimension3D;
+ uint32_t maxImageDimensionCube;
+ uint32_t maxImageArrayLayers;
+ uint32_t maxTexelBufferElements;
+ uint32_t maxUniformBufferRange;
+ uint32_t maxStorageBufferRange;
+ uint32_t maxPushConstantsSize;
+ uint32_t maxMemoryAllocationCount;
+ uint32_t maxSamplerAllocationCount;
+ VkDeviceSize bufferImageGranularity;
+ VkDeviceSize sparseAddressSpaceSize;
+ uint32_t maxBoundDescriptorSets;
+ uint32_t maxPerStageDescriptorSamplers;
+ uint32_t maxPerStageDescriptorUniformBuffers;
+ uint32_t maxPerStageDescriptorStorageBuffers;
+ uint32_t maxPerStageDescriptorSampledImages;
+ uint32_t maxPerStageDescriptorStorageImages;
+ uint32_t maxPerStageDescriptorInputAttachments;
+ uint32_t maxPerStageResources;
+ uint32_t maxDescriptorSetSamplers;
+ uint32_t maxDescriptorSetUniformBuffers;
+ uint32_t maxDescriptorSetUniformBuffersDynamic;
+ uint32_t maxDescriptorSetStorageBuffers;
+ uint32_t maxDescriptorSetStorageBuffersDynamic;
+ uint32_t maxDescriptorSetSampledImages;
+ uint32_t maxDescriptorSetStorageImages;
+ uint32_t maxDescriptorSetInputAttachments;
+ uint32_t maxVertexInputAttributes;
+ uint32_t maxVertexInputBindings;
+ uint32_t maxVertexInputAttributeOffset;
+ uint32_t maxVertexInputBindingStride;
+ uint32_t maxVertexOutputComponents;
+ uint32_t maxTessellationGenerationLevel;
+ uint32_t maxTessellationPatchSize;
+ uint32_t maxTessellationControlPerVertexInputComponents;
+ uint32_t maxTessellationControlPerVertexOutputComponents;
+ uint32_t maxTessellationControlPerPatchOutputComponents;
+ uint32_t maxTessellationControlTotalOutputComponents;
+ uint32_t maxTessellationEvaluationInputComponents;
+ uint32_t maxTessellationEvaluationOutputComponents;
+ uint32_t maxGeometryShaderInvocations;
+ uint32_t maxGeometryInputComponents;
+ uint32_t maxGeometryOutputComponents;
+ uint32_t maxGeometryOutputVertices;
+ uint32_t maxGeometryTotalOutputComponents;
+ uint32_t maxFragmentInputComponents;
+ uint32_t maxFragmentOutputAttachments;
+ uint32_t maxFragmentDualSrcAttachments;
+ uint32_t maxFragmentCombinedOutputResources;
+ uint32_t maxComputeSharedMemorySize;
+ uint32_t maxComputeWorkGroupCount [3];
+ uint32_t maxComputeWorkGroupInvocations;
+ uint32_t maxComputeWorkGroupSize [3];
+ uint32_t subPixelPrecisionBits;
+ uint32_t subTexelPrecisionBits;
+ uint32_t mipmapPrecisionBits;
+ uint32_t maxDrawIndexedIndexValue;
+ uint32_t maxDrawIndirectCount;
+ float maxSamplerLodBias;
+ float maxSamplerAnisotropy;
+ uint32_t maxViewports;
+ uint32_t maxViewportDimensions [2];
+ float viewportBoundsRange [2];
+ uint32_t viewportSubPixelBits;
+ size_t minMemoryMapAlignment;
+ VkDeviceSize minTexelBufferOffsetAlignment;
+ VkDeviceSize minUniformBufferOffsetAlignment;
+ VkDeviceSize minStorageBufferOffsetAlignment;
+ int32_t minTexelOffset;
+ uint32_t maxTexelOffset;
+ int32_t minTexelGatherOffset;
+ uint32_t maxTexelGatherOffset;
+ float minInterpolationOffset;
+ float maxInterpolationOffset;
+ uint32_t subPixelInterpolationOffsetBits;
+ uint32_t maxFramebufferWidth;
+ uint32_t maxFramebufferHeight;
+ uint32_t maxFramebufferLayers;
+ VkSampleCountFlags framebufferColorSampleCounts;
+ VkSampleCountFlags framebufferDepthSampleCounts;
+ VkSampleCountFlags framebufferStencilSampleCounts;
+ VkSampleCountFlags framebufferNoAttachmentsSampleCounts;
+ uint32_t maxColorAttachments;
+ VkSampleCountFlags sampledImageColorSampleCounts;
+ VkSampleCountFlags sampledImageIntegerSampleCounts;
+ VkSampleCountFlags sampledImageDepthSampleCounts;
+ VkSampleCountFlags sampledImageStencilSampleCounts;
+ VkSampleCountFlags storageImageSampleCounts;
+ uint32_t maxSampleMaskWords;
+ VkBool32 timestampComputeAndGraphics;
+ float timestampPeriod;
+ uint32_t maxClipDistances;
+ uint32_t maxCullDistances;
+ uint32_t maxCombinedClipAndCullDistances;
+ uint32_t discreteQueuePriorities;
+ float pointSizeRange [2];
+ float lineWidthRange [2];
+ float pointSizeGranularity;
+ float lineWidthGranularity;
+ VkBool32 strictLines;
+ VkBool32 standardSampleLocations;
+ VkDeviceSize optimalBufferCopyOffsetAlignment;
+ VkDeviceSize optimalBufferCopyRowPitchAlignment;
+ VkDeviceSize nonCoherentAtomSize;
+} VkPhysicalDeviceLimits;
+typedef struct VkSemaphoreCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkSemaphoreCreateFlags flags;
+} VkSemaphoreCreateInfo;
+typedef struct VkQueryPoolCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkQueryPoolCreateFlags flags;
+ VkQueryType queryType;
+ uint32_t queryCount;
+ VkQueryPipelineStatisticFlags pipelineStatistics;
+} VkQueryPoolCreateInfo;
+typedef struct VkFramebufferCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkFramebufferCreateFlags flags;
+ VkRenderPass renderPass;
+ uint32_t attachmentCount;
+ const VkImageView * pAttachments;
+ uint32_t width;
+ uint32_t height;
+ uint32_t layers;
+} VkFramebufferCreateInfo;
+typedef struct VkSubmitInfo {
+ VkStructureType sType;
+ const void * pNext;
+ uint32_t waitSemaphoreCount;
+ const VkSemaphore * pWaitSemaphores;
+ const VkPipelineStageFlags * pWaitDstStageMask;
+ uint32_t commandBufferCount;
+ const VkCommandBuffer * pCommandBuffers;
+ uint32_t signalSemaphoreCount;
+ const VkSemaphore * pSignalSemaphores;
+} VkSubmitInfo;
+typedef struct VkSurfaceCapabilitiesKHR {
+ uint32_t minImageCount;
+ uint32_t maxImageCount;
+ VkExtent2D currentExtent;
+ VkExtent2D minImageExtent;
+ VkExtent2D maxImageExtent;
+ uint32_t maxImageArrayLayers;
+ VkSurfaceTransformFlagsKHR supportedTransforms;
+ VkSurfaceTransformFlagBitsKHR currentTransform;
+ VkCompositeAlphaFlagsKHR supportedCompositeAlpha;
+ VkImageUsageFlags supportedUsageFlags;
+} VkSurfaceCapabilitiesKHR;
+typedef struct VkSwapchainCreateInfoKHR {
+ VkStructureType sType;
+ const void * pNext;
+ VkSwapchainCreateFlagsKHR flags;
+ VkSurfaceKHR surface;
+ uint32_t minImageCount;
+ VkFormat imageFormat;
+ VkColorSpaceKHR imageColorSpace;
+ VkExtent2D imageExtent;
+ uint32_t imageArrayLayers;
+ VkImageUsageFlags imageUsage;
+ VkSharingMode imageSharingMode;
+ uint32_t queueFamilyIndexCount;
+ const uint32_t * pQueueFamilyIndices;
+ VkSurfaceTransformFlagBitsKHR preTransform;
+ VkCompositeAlphaFlagBitsKHR compositeAlpha;
+ VkPresentModeKHR presentMode;
+ VkBool32 clipped;
+ VkSwapchainKHR oldSwapchain;
+} VkSwapchainCreateInfoKHR;
+typedef struct VkDebugReportCallbackCreateInfoEXT {
+ VkStructureType sType;
+ const void * pNext;
+ VkDebugReportFlagsEXT flags;
+ PFN_vkDebugReportCallbackEXT pfnCallback;
+ void * pUserData;
+} VkDebugReportCallbackCreateInfoEXT;
+typedef struct VkDeviceGroupPresentCapabilitiesKHR {
+ VkStructureType sType;
+ const void * pNext;
+ uint32_t presentMask [ VK_MAX_DEVICE_GROUP_SIZE ];
+ VkDeviceGroupPresentModeFlagsKHR modes;
+} VkDeviceGroupPresentCapabilitiesKHR;
+typedef struct VkDeviceGroupSwapchainCreateInfoKHR {
+ VkStructureType sType;
+ const void * pNext;
+ VkDeviceGroupPresentModeFlagsKHR modes;
+} VkDeviceGroupSwapchainCreateInfoKHR;
+typedef struct VkPhysicalDeviceProperties {
+ uint32_t apiVersion;
+ uint32_t driverVersion;
+ uint32_t vendorID;
+ uint32_t deviceID;
+ VkPhysicalDeviceType deviceType;
+ char deviceName [ VK_MAX_PHYSICAL_DEVICE_NAME_SIZE ];
+ uint8_t pipelineCacheUUID [ VK_UUID_SIZE ];
+ VkPhysicalDeviceLimits limits;
+ VkPhysicalDeviceSparseProperties sparseProperties;
+} VkPhysicalDeviceProperties;
+typedef struct VkDeviceCreateInfo {
+ VkStructureType sType;
+ const void * pNext;
+ VkDeviceCreateFlags flags;
+ uint32_t queueCreateInfoCount;
+ const VkDeviceQueueCreateInfo * pQueueCreateInfos;
+ uint32_t enabledLayerCount;
+ const char * const* ppEnabledLayerNames;
+ uint32_t enabledExtensionCount;
+ const char * const* ppEnabledExtensionNames;
+ const VkPhysicalDeviceFeatures * pEnabledFeatures;
+} VkDeviceCreateInfo;
+typedef struct VkPhysicalDeviceMemoryProperties {
+ uint32_t memoryTypeCount;
+ VkMemoryType memoryTypes [ VK_MAX_MEMORY_TYPES ];
+ uint32_t memoryHeapCount;
+ VkMemoryHeap memoryHeaps [ VK_MAX_MEMORY_HEAPS ];
+} VkPhysicalDeviceMemoryProperties;
+
+
+#define VK_VERSION_1_0 1
+GLAD_API_CALL int GLAD_VK_VERSION_1_0;
+#define VK_EXT_debug_report 1
+GLAD_API_CALL int GLAD_VK_EXT_debug_report;
+#define VK_KHR_surface 1
+GLAD_API_CALL int GLAD_VK_KHR_surface;
+#define VK_KHR_swapchain 1
+GLAD_API_CALL int GLAD_VK_KHR_swapchain;
+
+
+typedef VkResult (GLAD_API_PTR *PFN_vkAcquireNextImage2KHR)(VkDevice device, const VkAcquireNextImageInfoKHR * pAcquireInfo, uint32_t * pImageIndex);
+typedef VkResult (GLAD_API_PTR *PFN_vkAcquireNextImageKHR)(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t * pImageIndex);
+typedef VkResult (GLAD_API_PTR *PFN_vkAllocateCommandBuffers)(VkDevice device, const VkCommandBufferAllocateInfo * pAllocateInfo, VkCommandBuffer * pCommandBuffers);
+typedef VkResult (GLAD_API_PTR *PFN_vkAllocateDescriptorSets)(VkDevice device, const VkDescriptorSetAllocateInfo * pAllocateInfo, VkDescriptorSet * pDescriptorSets);
+typedef VkResult (GLAD_API_PTR *PFN_vkAllocateMemory)(VkDevice device, const VkMemoryAllocateInfo * pAllocateInfo, const VkAllocationCallbacks * pAllocator, VkDeviceMemory * pMemory);
+typedef VkResult (GLAD_API_PTR *PFN_vkBeginCommandBuffer)(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo * pBeginInfo);
+typedef VkResult (GLAD_API_PTR *PFN_vkBindBufferMemory)(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset);
+typedef VkResult (GLAD_API_PTR *PFN_vkBindImageMemory)(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset);
+typedef void (GLAD_API_PTR *PFN_vkCmdBeginQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags);
+typedef void (GLAD_API_PTR *PFN_vkCmdBeginRenderPass)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo * pRenderPassBegin, VkSubpassContents contents);
+typedef void (GLAD_API_PTR *PFN_vkCmdBindDescriptorSets)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet * pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t * pDynamicOffsets);
+typedef void (GLAD_API_PTR *PFN_vkCmdBindIndexBuffer)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType);
+typedef void (GLAD_API_PTR *PFN_vkCmdBindPipeline)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline);
+typedef void (GLAD_API_PTR *PFN_vkCmdBindVertexBuffers)(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer * pBuffers, const VkDeviceSize * pOffsets);
+typedef void (GLAD_API_PTR *PFN_vkCmdBlitImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit * pRegions, VkFilter filter);
+typedef void (GLAD_API_PTR *PFN_vkCmdClearAttachments)(VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkClearAttachment * pAttachments, uint32_t rectCount, const VkClearRect * pRects);
+typedef void (GLAD_API_PTR *PFN_vkCmdClearColorImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue * pColor, uint32_t rangeCount, const VkImageSubresourceRange * pRanges);
+typedef void (GLAD_API_PTR *PFN_vkCmdClearDepthStencilImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue * pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange * pRanges);
+typedef void (GLAD_API_PTR *PFN_vkCmdCopyBuffer)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy * pRegions);
+typedef void (GLAD_API_PTR *PFN_vkCmdCopyBufferToImage)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy * pRegions);
+typedef void (GLAD_API_PTR *PFN_vkCmdCopyImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy * pRegions);
+typedef void (GLAD_API_PTR *PFN_vkCmdCopyImageToBuffer)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy * pRegions);
+typedef void (GLAD_API_PTR *PFN_vkCmdCopyQueryPoolResults)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags);
+typedef void (GLAD_API_PTR *PFN_vkCmdDispatch)(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
+typedef void (GLAD_API_PTR *PFN_vkCmdDispatchIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset);
+typedef void (GLAD_API_PTR *PFN_vkCmdDraw)(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance);
+typedef void (GLAD_API_PTR *PFN_vkCmdDrawIndexed)(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance);
+typedef void (GLAD_API_PTR *PFN_vkCmdDrawIndexedIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride);
+typedef void (GLAD_API_PTR *PFN_vkCmdDrawIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride);
+typedef void (GLAD_API_PTR *PFN_vkCmdEndQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query);
+typedef void (GLAD_API_PTR *PFN_vkCmdEndRenderPass)(VkCommandBuffer commandBuffer);
+typedef void (GLAD_API_PTR *PFN_vkCmdExecuteCommands)(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer * pCommandBuffers);
+typedef void (GLAD_API_PTR *PFN_vkCmdFillBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data);
+typedef void (GLAD_API_PTR *PFN_vkCmdNextSubpass)(VkCommandBuffer commandBuffer, VkSubpassContents contents);
+typedef void (GLAD_API_PTR *PFN_vkCmdPipelineBarrier)(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier * pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier * pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier * pImageMemoryBarriers);
+typedef void (GLAD_API_PTR *PFN_vkCmdPushConstants)(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, const void * pValues);
+typedef void (GLAD_API_PTR *PFN_vkCmdResetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask);
+typedef void (GLAD_API_PTR *PFN_vkCmdResetQueryPool)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);
+typedef void (GLAD_API_PTR *PFN_vkCmdResolveImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve * pRegions);
+typedef void (GLAD_API_PTR *PFN_vkCmdSetBlendConstants)(VkCommandBuffer commandBuffer, const float blendConstants [4]);
+typedef void (GLAD_API_PTR *PFN_vkCmdSetDepthBias)(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor);
+typedef void (GLAD_API_PTR *PFN_vkCmdSetDepthBounds)(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds);
+typedef void (GLAD_API_PTR *PFN_vkCmdSetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask);
+typedef void (GLAD_API_PTR *PFN_vkCmdSetLineWidth)(VkCommandBuffer commandBuffer, float lineWidth);
+typedef void (GLAD_API_PTR *PFN_vkCmdSetScissor)(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D * pScissors);
+typedef void (GLAD_API_PTR *PFN_vkCmdSetStencilCompareMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask);
+typedef void (GLAD_API_PTR *PFN_vkCmdSetStencilReference)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference);
+typedef void (GLAD_API_PTR *PFN_vkCmdSetStencilWriteMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask);
+typedef void (GLAD_API_PTR *PFN_vkCmdSetViewport)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport * pViewports);
+typedef void (GLAD_API_PTR *PFN_vkCmdUpdateBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void * pData);
+typedef void (GLAD_API_PTR *PFN_vkCmdWaitEvents)(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent * pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier * pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier * pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier * pImageMemoryBarriers);
+typedef void (GLAD_API_PTR *PFN_vkCmdWriteTimestamp)(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t query);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateBuffer)(VkDevice device, const VkBufferCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkBuffer * pBuffer);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateBufferView)(VkDevice device, const VkBufferViewCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkBufferView * pView);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateCommandPool)(VkDevice device, const VkCommandPoolCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkCommandPool * pCommandPool);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateComputePipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo * pCreateInfos, const VkAllocationCallbacks * pAllocator, VkPipeline * pPipelines);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateDebugReportCallbackEXT)(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkDebugReportCallbackEXT * pCallback);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateDescriptorPool)(VkDevice device, const VkDescriptorPoolCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkDescriptorPool * pDescriptorPool);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateDescriptorSetLayout)(VkDevice device, const VkDescriptorSetLayoutCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkDescriptorSetLayout * pSetLayout);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateDevice)(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkDevice * pDevice);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateEvent)(VkDevice device, const VkEventCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkEvent * pEvent);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateFence)(VkDevice device, const VkFenceCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkFence * pFence);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateFramebuffer)(VkDevice device, const VkFramebufferCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkFramebuffer * pFramebuffer);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateGraphicsPipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo * pCreateInfos, const VkAllocationCallbacks * pAllocator, VkPipeline * pPipelines);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateImage)(VkDevice device, const VkImageCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkImage * pImage);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateImageView)(VkDevice device, const VkImageViewCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkImageView * pView);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateInstance)(const VkInstanceCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkInstance * pInstance);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreatePipelineCache)(VkDevice device, const VkPipelineCacheCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkPipelineCache * pPipelineCache);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreatePipelineLayout)(VkDevice device, const VkPipelineLayoutCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkPipelineLayout * pPipelineLayout);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateQueryPool)(VkDevice device, const VkQueryPoolCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkQueryPool * pQueryPool);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateRenderPass)(VkDevice device, const VkRenderPassCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkRenderPass * pRenderPass);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateSampler)(VkDevice device, const VkSamplerCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkSampler * pSampler);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateSemaphore)(VkDevice device, const VkSemaphoreCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkSemaphore * pSemaphore);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateShaderModule)(VkDevice device, const VkShaderModuleCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkShaderModule * pShaderModule);
+typedef VkResult (GLAD_API_PTR *PFN_vkCreateSwapchainKHR)(VkDevice device, const VkSwapchainCreateInfoKHR * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkSwapchainKHR * pSwapchain);
+typedef void (GLAD_API_PTR *PFN_vkDebugReportMessageEXT)(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char * pLayerPrefix, const char * pMessage);
+typedef void (GLAD_API_PTR *PFN_vkDestroyBuffer)(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyBufferView)(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyCommandPool)(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyDebugReportCallbackEXT)(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyDescriptorSetLayout)(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyDevice)(VkDevice device, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyEvent)(VkDevice device, VkEvent event, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyFence)(VkDevice device, VkFence fence, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyFramebuffer)(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyImage)(VkDevice device, VkImage image, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyImageView)(VkDevice device, VkImageView imageView, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyInstance)(VkInstance instance, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyPipeline)(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyPipelineCache)(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyPipelineLayout)(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyQueryPool)(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyRenderPass)(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroySampler)(VkDevice device, VkSampler sampler, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroySemaphore)(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroyShaderModule)(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroySurfaceKHR)(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkDestroySwapchainKHR)(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks * pAllocator);
+typedef VkResult (GLAD_API_PTR *PFN_vkDeviceWaitIdle)(VkDevice device);
+typedef VkResult (GLAD_API_PTR *PFN_vkEndCommandBuffer)(VkCommandBuffer commandBuffer);
+typedef VkResult (GLAD_API_PTR *PFN_vkEnumerateDeviceExtensionProperties)(VkPhysicalDevice physicalDevice, const char * pLayerName, uint32_t * pPropertyCount, VkExtensionProperties * pProperties);
+typedef VkResult (GLAD_API_PTR *PFN_vkEnumerateDeviceLayerProperties)(VkPhysicalDevice physicalDevice, uint32_t * pPropertyCount, VkLayerProperties * pProperties);
+typedef VkResult (GLAD_API_PTR *PFN_vkEnumerateInstanceExtensionProperties)(const char * pLayerName, uint32_t * pPropertyCount, VkExtensionProperties * pProperties);
+typedef VkResult (GLAD_API_PTR *PFN_vkEnumerateInstanceLayerProperties)(uint32_t * pPropertyCount, VkLayerProperties * pProperties);
+typedef VkResult (GLAD_API_PTR *PFN_vkEnumeratePhysicalDevices)(VkInstance instance, uint32_t * pPhysicalDeviceCount, VkPhysicalDevice * pPhysicalDevices);
+typedef VkResult (GLAD_API_PTR *PFN_vkFlushMappedMemoryRanges)(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange * pMemoryRanges);
+typedef void (GLAD_API_PTR *PFN_vkFreeCommandBuffers)(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer * pCommandBuffers);
+typedef VkResult (GLAD_API_PTR *PFN_vkFreeDescriptorSets)(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount, const VkDescriptorSet * pDescriptorSets);
+typedef void (GLAD_API_PTR *PFN_vkFreeMemory)(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks * pAllocator);
+typedef void (GLAD_API_PTR *PFN_vkGetBufferMemoryRequirements)(VkDevice device, VkBuffer buffer, VkMemoryRequirements * pMemoryRequirements);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetDeviceGroupPresentCapabilitiesKHR)(VkDevice device, VkDeviceGroupPresentCapabilitiesKHR * pDeviceGroupPresentCapabilities);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetDeviceGroupSurfacePresentModesKHR)(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHR * pModes);
+typedef void (GLAD_API_PTR *PFN_vkGetDeviceMemoryCommitment)(VkDevice device, VkDeviceMemory memory, VkDeviceSize * pCommittedMemoryInBytes);
+typedef PFN_vkVoidFunction (GLAD_API_PTR *PFN_vkGetDeviceProcAddr)(VkDevice device, const char * pName);
+typedef void (GLAD_API_PTR *PFN_vkGetDeviceQueue)(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue * pQueue);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetEventStatus)(VkDevice device, VkEvent event);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetFenceStatus)(VkDevice device, VkFence fence);
+typedef void (GLAD_API_PTR *PFN_vkGetImageMemoryRequirements)(VkDevice device, VkImage image, VkMemoryRequirements * pMemoryRequirements);
+typedef void (GLAD_API_PTR *PFN_vkGetImageSparseMemoryRequirements)(VkDevice device, VkImage image, uint32_t * pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements * pSparseMemoryRequirements);
+typedef void (GLAD_API_PTR *PFN_vkGetImageSubresourceLayout)(VkDevice device, VkImage image, const VkImageSubresource * pSubresource, VkSubresourceLayout * pLayout);
+typedef PFN_vkVoidFunction (GLAD_API_PTR *PFN_vkGetInstanceProcAddr)(VkInstance instance, const char * pName);
+typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceFeatures)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures * pFeatures);
+typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties * pFormatProperties);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDeviceImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties * pImageFormatProperties);
+typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceMemoryProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties * pMemoryProperties);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t * pRectCount, VkRect2D * pRects);
+typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties * pProperties);
+typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceQueueFamilyProperties)(VkPhysicalDevice physicalDevice, uint32_t * pQueueFamilyPropertyCount, VkQueueFamilyProperties * pQueueFamilyProperties);
+typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, uint32_t * pPropertyCount, VkSparseImageFormatProperties * pProperties);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR * pSurfaceCapabilities);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t * pSurfaceFormatCount, VkSurfaceFormatKHR * pSurfaceFormats);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t * pPresentModeCount, VkPresentModeKHR * pPresentModes);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDeviceSurfaceSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, VkSurfaceKHR surface, VkBool32 * pSupported);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetPipelineCacheData)(VkDevice device, VkPipelineCache pipelineCache, size_t * pDataSize, void * pData);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetQueryPoolResults)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, size_t dataSize, void * pData, VkDeviceSize stride, VkQueryResultFlags flags);
+typedef void (GLAD_API_PTR *PFN_vkGetRenderAreaGranularity)(VkDevice device, VkRenderPass renderPass, VkExtent2D * pGranularity);
+typedef VkResult (GLAD_API_PTR *PFN_vkGetSwapchainImagesKHR)(VkDevice device, VkSwapchainKHR swapchain, uint32_t * pSwapchainImageCount, VkImage * pSwapchainImages);
+typedef VkResult (GLAD_API_PTR *PFN_vkInvalidateMappedMemoryRanges)(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange * pMemoryRanges);
+typedef VkResult (GLAD_API_PTR *PFN_vkMapMemory)(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void ** ppData);
+typedef VkResult (GLAD_API_PTR *PFN_vkMergePipelineCaches)(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache * pSrcCaches);
+typedef VkResult (GLAD_API_PTR *PFN_vkQueueBindSparse)(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo * pBindInfo, VkFence fence);
+typedef VkResult (GLAD_API_PTR *PFN_vkQueuePresentKHR)(VkQueue queue, const VkPresentInfoKHR * pPresentInfo);
+typedef VkResult (GLAD_API_PTR *PFN_vkQueueSubmit)(VkQueue queue, uint32_t submitCount, const VkSubmitInfo * pSubmits, VkFence fence);
+typedef VkResult (GLAD_API_PTR *PFN_vkQueueWaitIdle)(VkQueue queue);
+typedef VkResult (GLAD_API_PTR *PFN_vkResetCommandBuffer)(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags);
+typedef VkResult (GLAD_API_PTR *PFN_vkResetCommandPool)(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags);
+typedef VkResult (GLAD_API_PTR *PFN_vkResetDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags);
+typedef VkResult (GLAD_API_PTR *PFN_vkResetEvent)(VkDevice device, VkEvent event);
+typedef VkResult (GLAD_API_PTR *PFN_vkResetFences)(VkDevice device, uint32_t fenceCount, const VkFence * pFences);
+typedef VkResult (GLAD_API_PTR *PFN_vkSetEvent)(VkDevice device, VkEvent event);
+typedef void (GLAD_API_PTR *PFN_vkUnmapMemory)(VkDevice device, VkDeviceMemory memory);
+typedef void (GLAD_API_PTR *PFN_vkUpdateDescriptorSets)(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet * pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet * pDescriptorCopies);
+typedef VkResult (GLAD_API_PTR *PFN_vkWaitForFences)(VkDevice device, uint32_t fenceCount, const VkFence * pFences, VkBool32 waitAll, uint64_t timeout);
+
+GLAD_API_CALL PFN_vkAcquireNextImage2KHR glad_vkAcquireNextImage2KHR;
+#define vkAcquireNextImage2KHR glad_vkAcquireNextImage2KHR
+GLAD_API_CALL PFN_vkAcquireNextImageKHR glad_vkAcquireNextImageKHR;
+#define vkAcquireNextImageKHR glad_vkAcquireNextImageKHR
+GLAD_API_CALL PFN_vkAllocateCommandBuffers glad_vkAllocateCommandBuffers;
+#define vkAllocateCommandBuffers glad_vkAllocateCommandBuffers
+GLAD_API_CALL PFN_vkAllocateDescriptorSets glad_vkAllocateDescriptorSets;
+#define vkAllocateDescriptorSets glad_vkAllocateDescriptorSets
+GLAD_API_CALL PFN_vkAllocateMemory glad_vkAllocateMemory;
+#define vkAllocateMemory glad_vkAllocateMemory
+GLAD_API_CALL PFN_vkBeginCommandBuffer glad_vkBeginCommandBuffer;
+#define vkBeginCommandBuffer glad_vkBeginCommandBuffer
+GLAD_API_CALL PFN_vkBindBufferMemory glad_vkBindBufferMemory;
+#define vkBindBufferMemory glad_vkBindBufferMemory
+GLAD_API_CALL PFN_vkBindImageMemory glad_vkBindImageMemory;
+#define vkBindImageMemory glad_vkBindImageMemory
+GLAD_API_CALL PFN_vkCmdBeginQuery glad_vkCmdBeginQuery;
+#define vkCmdBeginQuery glad_vkCmdBeginQuery
+GLAD_API_CALL PFN_vkCmdBeginRenderPass glad_vkCmdBeginRenderPass;
+#define vkCmdBeginRenderPass glad_vkCmdBeginRenderPass
+GLAD_API_CALL PFN_vkCmdBindDescriptorSets glad_vkCmdBindDescriptorSets;
+#define vkCmdBindDescriptorSets glad_vkCmdBindDescriptorSets
+GLAD_API_CALL PFN_vkCmdBindIndexBuffer glad_vkCmdBindIndexBuffer;
+#define vkCmdBindIndexBuffer glad_vkCmdBindIndexBuffer
+GLAD_API_CALL PFN_vkCmdBindPipeline glad_vkCmdBindPipeline;
+#define vkCmdBindPipeline glad_vkCmdBindPipeline
+GLAD_API_CALL PFN_vkCmdBindVertexBuffers glad_vkCmdBindVertexBuffers;
+#define vkCmdBindVertexBuffers glad_vkCmdBindVertexBuffers
+GLAD_API_CALL PFN_vkCmdBlitImage glad_vkCmdBlitImage;
+#define vkCmdBlitImage glad_vkCmdBlitImage
+GLAD_API_CALL PFN_vkCmdClearAttachments glad_vkCmdClearAttachments;
+#define vkCmdClearAttachments glad_vkCmdClearAttachments
+GLAD_API_CALL PFN_vkCmdClearColorImage glad_vkCmdClearColorImage;
+#define vkCmdClearColorImage glad_vkCmdClearColorImage
+GLAD_API_CALL PFN_vkCmdClearDepthStencilImage glad_vkCmdClearDepthStencilImage;
+#define vkCmdClearDepthStencilImage glad_vkCmdClearDepthStencilImage
+GLAD_API_CALL PFN_vkCmdCopyBuffer glad_vkCmdCopyBuffer;
+#define vkCmdCopyBuffer glad_vkCmdCopyBuffer
+GLAD_API_CALL PFN_vkCmdCopyBufferToImage glad_vkCmdCopyBufferToImage;
+#define vkCmdCopyBufferToImage glad_vkCmdCopyBufferToImage
+GLAD_API_CALL PFN_vkCmdCopyImage glad_vkCmdCopyImage;
+#define vkCmdCopyImage glad_vkCmdCopyImage
+GLAD_API_CALL PFN_vkCmdCopyImageToBuffer glad_vkCmdCopyImageToBuffer;
+#define vkCmdCopyImageToBuffer glad_vkCmdCopyImageToBuffer
+GLAD_API_CALL PFN_vkCmdCopyQueryPoolResults glad_vkCmdCopyQueryPoolResults;
+#define vkCmdCopyQueryPoolResults glad_vkCmdCopyQueryPoolResults
+GLAD_API_CALL PFN_vkCmdDispatch glad_vkCmdDispatch;
+#define vkCmdDispatch glad_vkCmdDispatch
+GLAD_API_CALL PFN_vkCmdDispatchIndirect glad_vkCmdDispatchIndirect;
+#define vkCmdDispatchIndirect glad_vkCmdDispatchIndirect
+GLAD_API_CALL PFN_vkCmdDraw glad_vkCmdDraw;
+#define vkCmdDraw glad_vkCmdDraw
+GLAD_API_CALL PFN_vkCmdDrawIndexed glad_vkCmdDrawIndexed;
+#define vkCmdDrawIndexed glad_vkCmdDrawIndexed
+GLAD_API_CALL PFN_vkCmdDrawIndexedIndirect glad_vkCmdDrawIndexedIndirect;
+#define vkCmdDrawIndexedIndirect glad_vkCmdDrawIndexedIndirect
+GLAD_API_CALL PFN_vkCmdDrawIndirect glad_vkCmdDrawIndirect;
+#define vkCmdDrawIndirect glad_vkCmdDrawIndirect
+GLAD_API_CALL PFN_vkCmdEndQuery glad_vkCmdEndQuery;
+#define vkCmdEndQuery glad_vkCmdEndQuery
+GLAD_API_CALL PFN_vkCmdEndRenderPass glad_vkCmdEndRenderPass;
+#define vkCmdEndRenderPass glad_vkCmdEndRenderPass
+GLAD_API_CALL PFN_vkCmdExecuteCommands glad_vkCmdExecuteCommands;
+#define vkCmdExecuteCommands glad_vkCmdExecuteCommands
+GLAD_API_CALL PFN_vkCmdFillBuffer glad_vkCmdFillBuffer;
+#define vkCmdFillBuffer glad_vkCmdFillBuffer
+GLAD_API_CALL PFN_vkCmdNextSubpass glad_vkCmdNextSubpass;
+#define vkCmdNextSubpass glad_vkCmdNextSubpass
+GLAD_API_CALL PFN_vkCmdPipelineBarrier glad_vkCmdPipelineBarrier;
+#define vkCmdPipelineBarrier glad_vkCmdPipelineBarrier
+GLAD_API_CALL PFN_vkCmdPushConstants glad_vkCmdPushConstants;
+#define vkCmdPushConstants glad_vkCmdPushConstants
+GLAD_API_CALL PFN_vkCmdResetEvent glad_vkCmdResetEvent;
+#define vkCmdResetEvent glad_vkCmdResetEvent
+GLAD_API_CALL PFN_vkCmdResetQueryPool glad_vkCmdResetQueryPool;
+#define vkCmdResetQueryPool glad_vkCmdResetQueryPool
+GLAD_API_CALL PFN_vkCmdResolveImage glad_vkCmdResolveImage;
+#define vkCmdResolveImage glad_vkCmdResolveImage
+GLAD_API_CALL PFN_vkCmdSetBlendConstants glad_vkCmdSetBlendConstants;
+#define vkCmdSetBlendConstants glad_vkCmdSetBlendConstants
+GLAD_API_CALL PFN_vkCmdSetDepthBias glad_vkCmdSetDepthBias;
+#define vkCmdSetDepthBias glad_vkCmdSetDepthBias
+GLAD_API_CALL PFN_vkCmdSetDepthBounds glad_vkCmdSetDepthBounds;
+#define vkCmdSetDepthBounds glad_vkCmdSetDepthBounds
+GLAD_API_CALL PFN_vkCmdSetEvent glad_vkCmdSetEvent;
+#define vkCmdSetEvent glad_vkCmdSetEvent
+GLAD_API_CALL PFN_vkCmdSetLineWidth glad_vkCmdSetLineWidth;
+#define vkCmdSetLineWidth glad_vkCmdSetLineWidth
+GLAD_API_CALL PFN_vkCmdSetScissor glad_vkCmdSetScissor;
+#define vkCmdSetScissor glad_vkCmdSetScissor
+GLAD_API_CALL PFN_vkCmdSetStencilCompareMask glad_vkCmdSetStencilCompareMask;
+#define vkCmdSetStencilCompareMask glad_vkCmdSetStencilCompareMask
+GLAD_API_CALL PFN_vkCmdSetStencilReference glad_vkCmdSetStencilReference;
+#define vkCmdSetStencilReference glad_vkCmdSetStencilReference
+GLAD_API_CALL PFN_vkCmdSetStencilWriteMask glad_vkCmdSetStencilWriteMask;
+#define vkCmdSetStencilWriteMask glad_vkCmdSetStencilWriteMask
+GLAD_API_CALL PFN_vkCmdSetViewport glad_vkCmdSetViewport;
+#define vkCmdSetViewport glad_vkCmdSetViewport
+GLAD_API_CALL PFN_vkCmdUpdateBuffer glad_vkCmdUpdateBuffer;
+#define vkCmdUpdateBuffer glad_vkCmdUpdateBuffer
+GLAD_API_CALL PFN_vkCmdWaitEvents glad_vkCmdWaitEvents;
+#define vkCmdWaitEvents glad_vkCmdWaitEvents
+GLAD_API_CALL PFN_vkCmdWriteTimestamp glad_vkCmdWriteTimestamp;
+#define vkCmdWriteTimestamp glad_vkCmdWriteTimestamp
+GLAD_API_CALL PFN_vkCreateBuffer glad_vkCreateBuffer;
+#define vkCreateBuffer glad_vkCreateBuffer
+GLAD_API_CALL PFN_vkCreateBufferView glad_vkCreateBufferView;
+#define vkCreateBufferView glad_vkCreateBufferView
+GLAD_API_CALL PFN_vkCreateCommandPool glad_vkCreateCommandPool;
+#define vkCreateCommandPool glad_vkCreateCommandPool
+GLAD_API_CALL PFN_vkCreateComputePipelines glad_vkCreateComputePipelines;
+#define vkCreateComputePipelines glad_vkCreateComputePipelines
+GLAD_API_CALL PFN_vkCreateDebugReportCallbackEXT glad_vkCreateDebugReportCallbackEXT;
+#define vkCreateDebugReportCallbackEXT glad_vkCreateDebugReportCallbackEXT
+GLAD_API_CALL PFN_vkCreateDescriptorPool glad_vkCreateDescriptorPool;
+#define vkCreateDescriptorPool glad_vkCreateDescriptorPool
+GLAD_API_CALL PFN_vkCreateDescriptorSetLayout glad_vkCreateDescriptorSetLayout;
+#define vkCreateDescriptorSetLayout glad_vkCreateDescriptorSetLayout
+GLAD_API_CALL PFN_vkCreateDevice glad_vkCreateDevice;
+#define vkCreateDevice glad_vkCreateDevice
+GLAD_API_CALL PFN_vkCreateEvent glad_vkCreateEvent;
+#define vkCreateEvent glad_vkCreateEvent
+GLAD_API_CALL PFN_vkCreateFence glad_vkCreateFence;
+#define vkCreateFence glad_vkCreateFence
+GLAD_API_CALL PFN_vkCreateFramebuffer glad_vkCreateFramebuffer;
+#define vkCreateFramebuffer glad_vkCreateFramebuffer
+GLAD_API_CALL PFN_vkCreateGraphicsPipelines glad_vkCreateGraphicsPipelines;
+#define vkCreateGraphicsPipelines glad_vkCreateGraphicsPipelines
+GLAD_API_CALL PFN_vkCreateImage glad_vkCreateImage;
+#define vkCreateImage glad_vkCreateImage
+GLAD_API_CALL PFN_vkCreateImageView glad_vkCreateImageView;
+#define vkCreateImageView glad_vkCreateImageView
+GLAD_API_CALL PFN_vkCreateInstance glad_vkCreateInstance;
+#define vkCreateInstance glad_vkCreateInstance
+GLAD_API_CALL PFN_vkCreatePipelineCache glad_vkCreatePipelineCache;
+#define vkCreatePipelineCache glad_vkCreatePipelineCache
+GLAD_API_CALL PFN_vkCreatePipelineLayout glad_vkCreatePipelineLayout;
+#define vkCreatePipelineLayout glad_vkCreatePipelineLayout
+GLAD_API_CALL PFN_vkCreateQueryPool glad_vkCreateQueryPool;
+#define vkCreateQueryPool glad_vkCreateQueryPool
+GLAD_API_CALL PFN_vkCreateRenderPass glad_vkCreateRenderPass;
+#define vkCreateRenderPass glad_vkCreateRenderPass
+GLAD_API_CALL PFN_vkCreateSampler glad_vkCreateSampler;
+#define vkCreateSampler glad_vkCreateSampler
+GLAD_API_CALL PFN_vkCreateSemaphore glad_vkCreateSemaphore;
+#define vkCreateSemaphore glad_vkCreateSemaphore
+GLAD_API_CALL PFN_vkCreateShaderModule glad_vkCreateShaderModule;
+#define vkCreateShaderModule glad_vkCreateShaderModule
+GLAD_API_CALL PFN_vkCreateSwapchainKHR glad_vkCreateSwapchainKHR;
+#define vkCreateSwapchainKHR glad_vkCreateSwapchainKHR
+GLAD_API_CALL PFN_vkDebugReportMessageEXT glad_vkDebugReportMessageEXT;
+#define vkDebugReportMessageEXT glad_vkDebugReportMessageEXT
+GLAD_API_CALL PFN_vkDestroyBuffer glad_vkDestroyBuffer;
+#define vkDestroyBuffer glad_vkDestroyBuffer
+GLAD_API_CALL PFN_vkDestroyBufferView glad_vkDestroyBufferView;
+#define vkDestroyBufferView glad_vkDestroyBufferView
+GLAD_API_CALL PFN_vkDestroyCommandPool glad_vkDestroyCommandPool;
+#define vkDestroyCommandPool glad_vkDestroyCommandPool
+GLAD_API_CALL PFN_vkDestroyDebugReportCallbackEXT glad_vkDestroyDebugReportCallbackEXT;
+#define vkDestroyDebugReportCallbackEXT glad_vkDestroyDebugReportCallbackEXT
+GLAD_API_CALL PFN_vkDestroyDescriptorPool glad_vkDestroyDescriptorPool;
+#define vkDestroyDescriptorPool glad_vkDestroyDescriptorPool
+GLAD_API_CALL PFN_vkDestroyDescriptorSetLayout glad_vkDestroyDescriptorSetLayout;
+#define vkDestroyDescriptorSetLayout glad_vkDestroyDescriptorSetLayout
+GLAD_API_CALL PFN_vkDestroyDevice glad_vkDestroyDevice;
+#define vkDestroyDevice glad_vkDestroyDevice
+GLAD_API_CALL PFN_vkDestroyEvent glad_vkDestroyEvent;
+#define vkDestroyEvent glad_vkDestroyEvent
+GLAD_API_CALL PFN_vkDestroyFence glad_vkDestroyFence;
+#define vkDestroyFence glad_vkDestroyFence
+GLAD_API_CALL PFN_vkDestroyFramebuffer glad_vkDestroyFramebuffer;
+#define vkDestroyFramebuffer glad_vkDestroyFramebuffer
+GLAD_API_CALL PFN_vkDestroyImage glad_vkDestroyImage;
+#define vkDestroyImage glad_vkDestroyImage
+GLAD_API_CALL PFN_vkDestroyImageView glad_vkDestroyImageView;
+#define vkDestroyImageView glad_vkDestroyImageView
+GLAD_API_CALL PFN_vkDestroyInstance glad_vkDestroyInstance;
+#define vkDestroyInstance glad_vkDestroyInstance
+GLAD_API_CALL PFN_vkDestroyPipeline glad_vkDestroyPipeline;
+#define vkDestroyPipeline glad_vkDestroyPipeline
+GLAD_API_CALL PFN_vkDestroyPipelineCache glad_vkDestroyPipelineCache;
+#define vkDestroyPipelineCache glad_vkDestroyPipelineCache
+GLAD_API_CALL PFN_vkDestroyPipelineLayout glad_vkDestroyPipelineLayout;
+#define vkDestroyPipelineLayout glad_vkDestroyPipelineLayout
+GLAD_API_CALL PFN_vkDestroyQueryPool glad_vkDestroyQueryPool;
+#define vkDestroyQueryPool glad_vkDestroyQueryPool
+GLAD_API_CALL PFN_vkDestroyRenderPass glad_vkDestroyRenderPass;
+#define vkDestroyRenderPass glad_vkDestroyRenderPass
+GLAD_API_CALL PFN_vkDestroySampler glad_vkDestroySampler;
+#define vkDestroySampler glad_vkDestroySampler
+GLAD_API_CALL PFN_vkDestroySemaphore glad_vkDestroySemaphore;
+#define vkDestroySemaphore glad_vkDestroySemaphore
+GLAD_API_CALL PFN_vkDestroyShaderModule glad_vkDestroyShaderModule;
+#define vkDestroyShaderModule glad_vkDestroyShaderModule
+GLAD_API_CALL PFN_vkDestroySurfaceKHR glad_vkDestroySurfaceKHR;
+#define vkDestroySurfaceKHR glad_vkDestroySurfaceKHR
+GLAD_API_CALL PFN_vkDestroySwapchainKHR glad_vkDestroySwapchainKHR;
+#define vkDestroySwapchainKHR glad_vkDestroySwapchainKHR
+GLAD_API_CALL PFN_vkDeviceWaitIdle glad_vkDeviceWaitIdle;
+#define vkDeviceWaitIdle glad_vkDeviceWaitIdle
+GLAD_API_CALL PFN_vkEndCommandBuffer glad_vkEndCommandBuffer;
+#define vkEndCommandBuffer glad_vkEndCommandBuffer
+GLAD_API_CALL PFN_vkEnumerateDeviceExtensionProperties glad_vkEnumerateDeviceExtensionProperties;
+#define vkEnumerateDeviceExtensionProperties glad_vkEnumerateDeviceExtensionProperties
+GLAD_API_CALL PFN_vkEnumerateDeviceLayerProperties glad_vkEnumerateDeviceLayerProperties;
+#define vkEnumerateDeviceLayerProperties glad_vkEnumerateDeviceLayerProperties
+GLAD_API_CALL PFN_vkEnumerateInstanceExtensionProperties glad_vkEnumerateInstanceExtensionProperties;
+#define vkEnumerateInstanceExtensionProperties glad_vkEnumerateInstanceExtensionProperties
+GLAD_API_CALL PFN_vkEnumerateInstanceLayerProperties glad_vkEnumerateInstanceLayerProperties;
+#define vkEnumerateInstanceLayerProperties glad_vkEnumerateInstanceLayerProperties
+GLAD_API_CALL PFN_vkEnumeratePhysicalDevices glad_vkEnumeratePhysicalDevices;
+#define vkEnumeratePhysicalDevices glad_vkEnumeratePhysicalDevices
+GLAD_API_CALL PFN_vkFlushMappedMemoryRanges glad_vkFlushMappedMemoryRanges;
+#define vkFlushMappedMemoryRanges glad_vkFlushMappedMemoryRanges
+GLAD_API_CALL PFN_vkFreeCommandBuffers glad_vkFreeCommandBuffers;
+#define vkFreeCommandBuffers glad_vkFreeCommandBuffers
+GLAD_API_CALL PFN_vkFreeDescriptorSets glad_vkFreeDescriptorSets;
+#define vkFreeDescriptorSets glad_vkFreeDescriptorSets
+GLAD_API_CALL PFN_vkFreeMemory glad_vkFreeMemory;
+#define vkFreeMemory glad_vkFreeMemory
+GLAD_API_CALL PFN_vkGetBufferMemoryRequirements glad_vkGetBufferMemoryRequirements;
+#define vkGetBufferMemoryRequirements glad_vkGetBufferMemoryRequirements
+GLAD_API_CALL PFN_vkGetDeviceGroupPresentCapabilitiesKHR glad_vkGetDeviceGroupPresentCapabilitiesKHR;
+#define vkGetDeviceGroupPresentCapabilitiesKHR glad_vkGetDeviceGroupPresentCapabilitiesKHR
+GLAD_API_CALL PFN_vkGetDeviceGroupSurfacePresentModesKHR glad_vkGetDeviceGroupSurfacePresentModesKHR;
+#define vkGetDeviceGroupSurfacePresentModesKHR glad_vkGetDeviceGroupSurfacePresentModesKHR
+GLAD_API_CALL PFN_vkGetDeviceMemoryCommitment glad_vkGetDeviceMemoryCommitment;
+#define vkGetDeviceMemoryCommitment glad_vkGetDeviceMemoryCommitment
+GLAD_API_CALL PFN_vkGetDeviceProcAddr glad_vkGetDeviceProcAddr;
+#define vkGetDeviceProcAddr glad_vkGetDeviceProcAddr
+GLAD_API_CALL PFN_vkGetDeviceQueue glad_vkGetDeviceQueue;
+#define vkGetDeviceQueue glad_vkGetDeviceQueue
+GLAD_API_CALL PFN_vkGetEventStatus glad_vkGetEventStatus;
+#define vkGetEventStatus glad_vkGetEventStatus
+GLAD_API_CALL PFN_vkGetFenceStatus glad_vkGetFenceStatus;
+#define vkGetFenceStatus glad_vkGetFenceStatus
+GLAD_API_CALL PFN_vkGetImageMemoryRequirements glad_vkGetImageMemoryRequirements;
+#define vkGetImageMemoryRequirements glad_vkGetImageMemoryRequirements
+GLAD_API_CALL PFN_vkGetImageSparseMemoryRequirements glad_vkGetImageSparseMemoryRequirements;
+#define vkGetImageSparseMemoryRequirements glad_vkGetImageSparseMemoryRequirements
+GLAD_API_CALL PFN_vkGetImageSubresourceLayout glad_vkGetImageSubresourceLayout;
+#define vkGetImageSubresourceLayout glad_vkGetImageSubresourceLayout
+GLAD_API_CALL PFN_vkGetInstanceProcAddr glad_vkGetInstanceProcAddr;
+#define vkGetInstanceProcAddr glad_vkGetInstanceProcAddr
+GLAD_API_CALL PFN_vkGetPhysicalDeviceFeatures glad_vkGetPhysicalDeviceFeatures;
+#define vkGetPhysicalDeviceFeatures glad_vkGetPhysicalDeviceFeatures
+GLAD_API_CALL PFN_vkGetPhysicalDeviceFormatProperties glad_vkGetPhysicalDeviceFormatProperties;
+#define vkGetPhysicalDeviceFormatProperties glad_vkGetPhysicalDeviceFormatProperties
+GLAD_API_CALL PFN_vkGetPhysicalDeviceImageFormatProperties glad_vkGetPhysicalDeviceImageFormatProperties;
+#define vkGetPhysicalDeviceImageFormatProperties glad_vkGetPhysicalDeviceImageFormatProperties
+GLAD_API_CALL PFN_vkGetPhysicalDeviceMemoryProperties glad_vkGetPhysicalDeviceMemoryProperties;
+#define vkGetPhysicalDeviceMemoryProperties glad_vkGetPhysicalDeviceMemoryProperties
+GLAD_API_CALL PFN_vkGetPhysicalDevicePresentRectanglesKHR glad_vkGetPhysicalDevicePresentRectanglesKHR;
+#define vkGetPhysicalDevicePresentRectanglesKHR glad_vkGetPhysicalDevicePresentRectanglesKHR
+GLAD_API_CALL PFN_vkGetPhysicalDeviceProperties glad_vkGetPhysicalDeviceProperties;
+#define vkGetPhysicalDeviceProperties glad_vkGetPhysicalDeviceProperties
+GLAD_API_CALL PFN_vkGetPhysicalDeviceQueueFamilyProperties glad_vkGetPhysicalDeviceQueueFamilyProperties;
+#define vkGetPhysicalDeviceQueueFamilyProperties glad_vkGetPhysicalDeviceQueueFamilyProperties
+GLAD_API_CALL PFN_vkGetPhysicalDeviceSparseImageFormatProperties glad_vkGetPhysicalDeviceSparseImageFormatProperties;
+#define vkGetPhysicalDeviceSparseImageFormatProperties glad_vkGetPhysicalDeviceSparseImageFormatProperties
+GLAD_API_CALL PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR glad_vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
+#define vkGetPhysicalDeviceSurfaceCapabilitiesKHR glad_vkGetPhysicalDeviceSurfaceCapabilitiesKHR
+GLAD_API_CALL PFN_vkGetPhysicalDeviceSurfaceFormatsKHR glad_vkGetPhysicalDeviceSurfaceFormatsKHR;
+#define vkGetPhysicalDeviceSurfaceFormatsKHR glad_vkGetPhysicalDeviceSurfaceFormatsKHR
+GLAD_API_CALL PFN_vkGetPhysicalDeviceSurfacePresentModesKHR glad_vkGetPhysicalDeviceSurfacePresentModesKHR;
+#define vkGetPhysicalDeviceSurfacePresentModesKHR glad_vkGetPhysicalDeviceSurfacePresentModesKHR
+GLAD_API_CALL PFN_vkGetPhysicalDeviceSurfaceSupportKHR glad_vkGetPhysicalDeviceSurfaceSupportKHR;
+#define vkGetPhysicalDeviceSurfaceSupportKHR glad_vkGetPhysicalDeviceSurfaceSupportKHR
+GLAD_API_CALL PFN_vkGetPipelineCacheData glad_vkGetPipelineCacheData;
+#define vkGetPipelineCacheData glad_vkGetPipelineCacheData
+GLAD_API_CALL PFN_vkGetQueryPoolResults glad_vkGetQueryPoolResults;
+#define vkGetQueryPoolResults glad_vkGetQueryPoolResults
+GLAD_API_CALL PFN_vkGetRenderAreaGranularity glad_vkGetRenderAreaGranularity;
+#define vkGetRenderAreaGranularity glad_vkGetRenderAreaGranularity
+GLAD_API_CALL PFN_vkGetSwapchainImagesKHR glad_vkGetSwapchainImagesKHR;
+#define vkGetSwapchainImagesKHR glad_vkGetSwapchainImagesKHR
+GLAD_API_CALL PFN_vkInvalidateMappedMemoryRanges glad_vkInvalidateMappedMemoryRanges;
+#define vkInvalidateMappedMemoryRanges glad_vkInvalidateMappedMemoryRanges
+GLAD_API_CALL PFN_vkMapMemory glad_vkMapMemory;
+#define vkMapMemory glad_vkMapMemory
+GLAD_API_CALL PFN_vkMergePipelineCaches glad_vkMergePipelineCaches;
+#define vkMergePipelineCaches glad_vkMergePipelineCaches
+GLAD_API_CALL PFN_vkQueueBindSparse glad_vkQueueBindSparse;
+#define vkQueueBindSparse glad_vkQueueBindSparse
+GLAD_API_CALL PFN_vkQueuePresentKHR glad_vkQueuePresentKHR;
+#define vkQueuePresentKHR glad_vkQueuePresentKHR
+GLAD_API_CALL PFN_vkQueueSubmit glad_vkQueueSubmit;
+#define vkQueueSubmit glad_vkQueueSubmit
+GLAD_API_CALL PFN_vkQueueWaitIdle glad_vkQueueWaitIdle;
+#define vkQueueWaitIdle glad_vkQueueWaitIdle
+GLAD_API_CALL PFN_vkResetCommandBuffer glad_vkResetCommandBuffer;
+#define vkResetCommandBuffer glad_vkResetCommandBuffer
+GLAD_API_CALL PFN_vkResetCommandPool glad_vkResetCommandPool;
+#define vkResetCommandPool glad_vkResetCommandPool
+GLAD_API_CALL PFN_vkResetDescriptorPool glad_vkResetDescriptorPool;
+#define vkResetDescriptorPool glad_vkResetDescriptorPool
+GLAD_API_CALL PFN_vkResetEvent glad_vkResetEvent;
+#define vkResetEvent glad_vkResetEvent
+GLAD_API_CALL PFN_vkResetFences glad_vkResetFences;
+#define vkResetFences glad_vkResetFences
+GLAD_API_CALL PFN_vkSetEvent glad_vkSetEvent;
+#define vkSetEvent glad_vkSetEvent
+GLAD_API_CALL PFN_vkUnmapMemory glad_vkUnmapMemory;
+#define vkUnmapMemory glad_vkUnmapMemory
+GLAD_API_CALL PFN_vkUpdateDescriptorSets glad_vkUpdateDescriptorSets;
+#define vkUpdateDescriptorSets glad_vkUpdateDescriptorSets
+GLAD_API_CALL PFN_vkWaitForFences glad_vkWaitForFences;
+#define vkWaitForFences glad_vkWaitForFences
+
+
+GLAD_API_CALL int gladLoadVulkanUserPtr( VkPhysicalDevice physical_device, GLADuserptrloadfunc load, void *userptr);
+GLAD_API_CALL int gladLoadVulkan( VkPhysicalDevice physical_device, GLADloadfunc load);
+
+
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Source */
+#ifdef GLAD_VULKAN_IMPLEMENTATION
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef GLAD_IMPL_UTIL_C_
+#define GLAD_IMPL_UTIL_C_
+
+#ifdef _MSC_VER
+#define GLAD_IMPL_UTIL_SSCANF sscanf_s
+#else
+#define GLAD_IMPL_UTIL_SSCANF sscanf
+#endif
+
+#endif /* GLAD_IMPL_UTIL_C_ */
+
+
+int GLAD_VK_VERSION_1_0 = 0;
+int GLAD_VK_EXT_debug_report = 0;
+int GLAD_VK_KHR_surface = 0;
+int GLAD_VK_KHR_swapchain = 0;
+
+
+
+PFN_vkAcquireNextImage2KHR glad_vkAcquireNextImage2KHR = NULL;
+PFN_vkAcquireNextImageKHR glad_vkAcquireNextImageKHR = NULL;
+PFN_vkAllocateCommandBuffers glad_vkAllocateCommandBuffers = NULL;
+PFN_vkAllocateDescriptorSets glad_vkAllocateDescriptorSets = NULL;
+PFN_vkAllocateMemory glad_vkAllocateMemory = NULL;
+PFN_vkBeginCommandBuffer glad_vkBeginCommandBuffer = NULL;
+PFN_vkBindBufferMemory glad_vkBindBufferMemory = NULL;
+PFN_vkBindImageMemory glad_vkBindImageMemory = NULL;
+PFN_vkCmdBeginQuery glad_vkCmdBeginQuery = NULL;
+PFN_vkCmdBeginRenderPass glad_vkCmdBeginRenderPass = NULL;
+PFN_vkCmdBindDescriptorSets glad_vkCmdBindDescriptorSets = NULL;
+PFN_vkCmdBindIndexBuffer glad_vkCmdBindIndexBuffer = NULL;
+PFN_vkCmdBindPipeline glad_vkCmdBindPipeline = NULL;
+PFN_vkCmdBindVertexBuffers glad_vkCmdBindVertexBuffers = NULL;
+PFN_vkCmdBlitImage glad_vkCmdBlitImage = NULL;
+PFN_vkCmdClearAttachments glad_vkCmdClearAttachments = NULL;
+PFN_vkCmdClearColorImage glad_vkCmdClearColorImage = NULL;
+PFN_vkCmdClearDepthStencilImage glad_vkCmdClearDepthStencilImage = NULL;
+PFN_vkCmdCopyBuffer glad_vkCmdCopyBuffer = NULL;
+PFN_vkCmdCopyBufferToImage glad_vkCmdCopyBufferToImage = NULL;
+PFN_vkCmdCopyImage glad_vkCmdCopyImage = NULL;
+PFN_vkCmdCopyImageToBuffer glad_vkCmdCopyImageToBuffer = NULL;
+PFN_vkCmdCopyQueryPoolResults glad_vkCmdCopyQueryPoolResults = NULL;
+PFN_vkCmdDispatch glad_vkCmdDispatch = NULL;
+PFN_vkCmdDispatchIndirect glad_vkCmdDispatchIndirect = NULL;
+PFN_vkCmdDraw glad_vkCmdDraw = NULL;
+PFN_vkCmdDrawIndexed glad_vkCmdDrawIndexed = NULL;
+PFN_vkCmdDrawIndexedIndirect glad_vkCmdDrawIndexedIndirect = NULL;
+PFN_vkCmdDrawIndirect glad_vkCmdDrawIndirect = NULL;
+PFN_vkCmdEndQuery glad_vkCmdEndQuery = NULL;
+PFN_vkCmdEndRenderPass glad_vkCmdEndRenderPass = NULL;
+PFN_vkCmdExecuteCommands glad_vkCmdExecuteCommands = NULL;
+PFN_vkCmdFillBuffer glad_vkCmdFillBuffer = NULL;
+PFN_vkCmdNextSubpass glad_vkCmdNextSubpass = NULL;
+PFN_vkCmdPipelineBarrier glad_vkCmdPipelineBarrier = NULL;
+PFN_vkCmdPushConstants glad_vkCmdPushConstants = NULL;
+PFN_vkCmdResetEvent glad_vkCmdResetEvent = NULL;
+PFN_vkCmdResetQueryPool glad_vkCmdResetQueryPool = NULL;
+PFN_vkCmdResolveImage glad_vkCmdResolveImage = NULL;
+PFN_vkCmdSetBlendConstants glad_vkCmdSetBlendConstants = NULL;
+PFN_vkCmdSetDepthBias glad_vkCmdSetDepthBias = NULL;
+PFN_vkCmdSetDepthBounds glad_vkCmdSetDepthBounds = NULL;
+PFN_vkCmdSetEvent glad_vkCmdSetEvent = NULL;
+PFN_vkCmdSetLineWidth glad_vkCmdSetLineWidth = NULL;
+PFN_vkCmdSetScissor glad_vkCmdSetScissor = NULL;
+PFN_vkCmdSetStencilCompareMask glad_vkCmdSetStencilCompareMask = NULL;
+PFN_vkCmdSetStencilReference glad_vkCmdSetStencilReference = NULL;
+PFN_vkCmdSetStencilWriteMask glad_vkCmdSetStencilWriteMask = NULL;
+PFN_vkCmdSetViewport glad_vkCmdSetViewport = NULL;
+PFN_vkCmdUpdateBuffer glad_vkCmdUpdateBuffer = NULL;
+PFN_vkCmdWaitEvents glad_vkCmdWaitEvents = NULL;
+PFN_vkCmdWriteTimestamp glad_vkCmdWriteTimestamp = NULL;
+PFN_vkCreateBuffer glad_vkCreateBuffer = NULL;
+PFN_vkCreateBufferView glad_vkCreateBufferView = NULL;
+PFN_vkCreateCommandPool glad_vkCreateCommandPool = NULL;
+PFN_vkCreateComputePipelines glad_vkCreateComputePipelines = NULL;
+PFN_vkCreateDebugReportCallbackEXT glad_vkCreateDebugReportCallbackEXT = NULL;
+PFN_vkCreateDescriptorPool glad_vkCreateDescriptorPool = NULL;
+PFN_vkCreateDescriptorSetLayout glad_vkCreateDescriptorSetLayout = NULL;
+PFN_vkCreateDevice glad_vkCreateDevice = NULL;
+PFN_vkCreateEvent glad_vkCreateEvent = NULL;
+PFN_vkCreateFence glad_vkCreateFence = NULL;
+PFN_vkCreateFramebuffer glad_vkCreateFramebuffer = NULL;
+PFN_vkCreateGraphicsPipelines glad_vkCreateGraphicsPipelines = NULL;
+PFN_vkCreateImage glad_vkCreateImage = NULL;
+PFN_vkCreateImageView glad_vkCreateImageView = NULL;
+PFN_vkCreateInstance glad_vkCreateInstance = NULL;
+PFN_vkCreatePipelineCache glad_vkCreatePipelineCache = NULL;
+PFN_vkCreatePipelineLayout glad_vkCreatePipelineLayout = NULL;
+PFN_vkCreateQueryPool glad_vkCreateQueryPool = NULL;
+PFN_vkCreateRenderPass glad_vkCreateRenderPass = NULL;
+PFN_vkCreateSampler glad_vkCreateSampler = NULL;
+PFN_vkCreateSemaphore glad_vkCreateSemaphore = NULL;
+PFN_vkCreateShaderModule glad_vkCreateShaderModule = NULL;
+PFN_vkCreateSwapchainKHR glad_vkCreateSwapchainKHR = NULL;
+PFN_vkDebugReportMessageEXT glad_vkDebugReportMessageEXT = NULL;
+PFN_vkDestroyBuffer glad_vkDestroyBuffer = NULL;
+PFN_vkDestroyBufferView glad_vkDestroyBufferView = NULL;
+PFN_vkDestroyCommandPool glad_vkDestroyCommandPool = NULL;
+PFN_vkDestroyDebugReportCallbackEXT glad_vkDestroyDebugReportCallbackEXT = NULL;
+PFN_vkDestroyDescriptorPool glad_vkDestroyDescriptorPool = NULL;
+PFN_vkDestroyDescriptorSetLayout glad_vkDestroyDescriptorSetLayout = NULL;
+PFN_vkDestroyDevice glad_vkDestroyDevice = NULL;
+PFN_vkDestroyEvent glad_vkDestroyEvent = NULL;
+PFN_vkDestroyFence glad_vkDestroyFence = NULL;
+PFN_vkDestroyFramebuffer glad_vkDestroyFramebuffer = NULL;
+PFN_vkDestroyImage glad_vkDestroyImage = NULL;
+PFN_vkDestroyImageView glad_vkDestroyImageView = NULL;
+PFN_vkDestroyInstance glad_vkDestroyInstance = NULL;
+PFN_vkDestroyPipeline glad_vkDestroyPipeline = NULL;
+PFN_vkDestroyPipelineCache glad_vkDestroyPipelineCache = NULL;
+PFN_vkDestroyPipelineLayout glad_vkDestroyPipelineLayout = NULL;
+PFN_vkDestroyQueryPool glad_vkDestroyQueryPool = NULL;
+PFN_vkDestroyRenderPass glad_vkDestroyRenderPass = NULL;
+PFN_vkDestroySampler glad_vkDestroySampler = NULL;
+PFN_vkDestroySemaphore glad_vkDestroySemaphore = NULL;
+PFN_vkDestroyShaderModule glad_vkDestroyShaderModule = NULL;
+PFN_vkDestroySurfaceKHR glad_vkDestroySurfaceKHR = NULL;
+PFN_vkDestroySwapchainKHR glad_vkDestroySwapchainKHR = NULL;
+PFN_vkDeviceWaitIdle glad_vkDeviceWaitIdle = NULL;
+PFN_vkEndCommandBuffer glad_vkEndCommandBuffer = NULL;
+PFN_vkEnumerateDeviceExtensionProperties glad_vkEnumerateDeviceExtensionProperties = NULL;
+PFN_vkEnumerateDeviceLayerProperties glad_vkEnumerateDeviceLayerProperties = NULL;
+PFN_vkEnumerateInstanceExtensionProperties glad_vkEnumerateInstanceExtensionProperties = NULL;
+PFN_vkEnumerateInstanceLayerProperties glad_vkEnumerateInstanceLayerProperties = NULL;
+PFN_vkEnumeratePhysicalDevices glad_vkEnumeratePhysicalDevices = NULL;
+PFN_vkFlushMappedMemoryRanges glad_vkFlushMappedMemoryRanges = NULL;
+PFN_vkFreeCommandBuffers glad_vkFreeCommandBuffers = NULL;
+PFN_vkFreeDescriptorSets glad_vkFreeDescriptorSets = NULL;
+PFN_vkFreeMemory glad_vkFreeMemory = NULL;
+PFN_vkGetBufferMemoryRequirements glad_vkGetBufferMemoryRequirements = NULL;
+PFN_vkGetDeviceGroupPresentCapabilitiesKHR glad_vkGetDeviceGroupPresentCapabilitiesKHR = NULL;
+PFN_vkGetDeviceGroupSurfacePresentModesKHR glad_vkGetDeviceGroupSurfacePresentModesKHR = NULL;
+PFN_vkGetDeviceMemoryCommitment glad_vkGetDeviceMemoryCommitment = NULL;
+PFN_vkGetDeviceProcAddr glad_vkGetDeviceProcAddr = NULL;
+PFN_vkGetDeviceQueue glad_vkGetDeviceQueue = NULL;
+PFN_vkGetEventStatus glad_vkGetEventStatus = NULL;
+PFN_vkGetFenceStatus glad_vkGetFenceStatus = NULL;
+PFN_vkGetImageMemoryRequirements glad_vkGetImageMemoryRequirements = NULL;
+PFN_vkGetImageSparseMemoryRequirements glad_vkGetImageSparseMemoryRequirements = NULL;
+PFN_vkGetImageSubresourceLayout glad_vkGetImageSubresourceLayout = NULL;
+PFN_vkGetInstanceProcAddr glad_vkGetInstanceProcAddr = NULL;
+PFN_vkGetPhysicalDeviceFeatures glad_vkGetPhysicalDeviceFeatures = NULL;
+PFN_vkGetPhysicalDeviceFormatProperties glad_vkGetPhysicalDeviceFormatProperties = NULL;
+PFN_vkGetPhysicalDeviceImageFormatProperties glad_vkGetPhysicalDeviceImageFormatProperties = NULL;
+PFN_vkGetPhysicalDeviceMemoryProperties glad_vkGetPhysicalDeviceMemoryProperties = NULL;
+PFN_vkGetPhysicalDevicePresentRectanglesKHR glad_vkGetPhysicalDevicePresentRectanglesKHR = NULL;
+PFN_vkGetPhysicalDeviceProperties glad_vkGetPhysicalDeviceProperties = NULL;
+PFN_vkGetPhysicalDeviceQueueFamilyProperties glad_vkGetPhysicalDeviceQueueFamilyProperties = NULL;
+PFN_vkGetPhysicalDeviceSparseImageFormatProperties glad_vkGetPhysicalDeviceSparseImageFormatProperties = NULL;
+PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR glad_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = NULL;
+PFN_vkGetPhysicalDeviceSurfaceFormatsKHR glad_vkGetPhysicalDeviceSurfaceFormatsKHR = NULL;
+PFN_vkGetPhysicalDeviceSurfacePresentModesKHR glad_vkGetPhysicalDeviceSurfacePresentModesKHR = NULL;
+PFN_vkGetPhysicalDeviceSurfaceSupportKHR glad_vkGetPhysicalDeviceSurfaceSupportKHR = NULL;
+PFN_vkGetPipelineCacheData glad_vkGetPipelineCacheData = NULL;
+PFN_vkGetQueryPoolResults glad_vkGetQueryPoolResults = NULL;
+PFN_vkGetRenderAreaGranularity glad_vkGetRenderAreaGranularity = NULL;
+PFN_vkGetSwapchainImagesKHR glad_vkGetSwapchainImagesKHR = NULL;
+PFN_vkInvalidateMappedMemoryRanges glad_vkInvalidateMappedMemoryRanges = NULL;
+PFN_vkMapMemory glad_vkMapMemory = NULL;
+PFN_vkMergePipelineCaches glad_vkMergePipelineCaches = NULL;
+PFN_vkQueueBindSparse glad_vkQueueBindSparse = NULL;
+PFN_vkQueuePresentKHR glad_vkQueuePresentKHR = NULL;
+PFN_vkQueueSubmit glad_vkQueueSubmit = NULL;
+PFN_vkQueueWaitIdle glad_vkQueueWaitIdle = NULL;
+PFN_vkResetCommandBuffer glad_vkResetCommandBuffer = NULL;
+PFN_vkResetCommandPool glad_vkResetCommandPool = NULL;
+PFN_vkResetDescriptorPool glad_vkResetDescriptorPool = NULL;
+PFN_vkResetEvent glad_vkResetEvent = NULL;
+PFN_vkResetFences glad_vkResetFences = NULL;
+PFN_vkSetEvent glad_vkSetEvent = NULL;
+PFN_vkUnmapMemory glad_vkUnmapMemory = NULL;
+PFN_vkUpdateDescriptorSets glad_vkUpdateDescriptorSets = NULL;
+PFN_vkWaitForFences glad_vkWaitForFences = NULL;
+
+
+static void glad_vk_load_VK_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_VK_VERSION_1_0) return;
+ vkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers) load("vkAllocateCommandBuffers", userptr);
+ vkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets) load("vkAllocateDescriptorSets", userptr);
+ vkAllocateMemory = (PFN_vkAllocateMemory) load("vkAllocateMemory", userptr);
+ vkBeginCommandBuffer = (PFN_vkBeginCommandBuffer) load("vkBeginCommandBuffer", userptr);
+ vkBindBufferMemory = (PFN_vkBindBufferMemory) load("vkBindBufferMemory", userptr);
+ vkBindImageMemory = (PFN_vkBindImageMemory) load("vkBindImageMemory", userptr);
+ vkCmdBeginQuery = (PFN_vkCmdBeginQuery) load("vkCmdBeginQuery", userptr);
+ vkCmdBeginRenderPass = (PFN_vkCmdBeginRenderPass) load("vkCmdBeginRenderPass", userptr);
+ vkCmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets) load("vkCmdBindDescriptorSets", userptr);
+ vkCmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer) load("vkCmdBindIndexBuffer", userptr);
+ vkCmdBindPipeline = (PFN_vkCmdBindPipeline) load("vkCmdBindPipeline", userptr);
+ vkCmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers) load("vkCmdBindVertexBuffers", userptr);
+ vkCmdBlitImage = (PFN_vkCmdBlitImage) load("vkCmdBlitImage", userptr);
+ vkCmdClearAttachments = (PFN_vkCmdClearAttachments) load("vkCmdClearAttachments", userptr);
+ vkCmdClearColorImage = (PFN_vkCmdClearColorImage) load("vkCmdClearColorImage", userptr);
+ vkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage) load("vkCmdClearDepthStencilImage", userptr);
+ vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer) load("vkCmdCopyBuffer", userptr);
+ vkCmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage) load("vkCmdCopyBufferToImage", userptr);
+ vkCmdCopyImage = (PFN_vkCmdCopyImage) load("vkCmdCopyImage", userptr);
+ vkCmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer) load("vkCmdCopyImageToBuffer", userptr);
+ vkCmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults) load("vkCmdCopyQueryPoolResults", userptr);
+ vkCmdDispatch = (PFN_vkCmdDispatch) load("vkCmdDispatch", userptr);
+ vkCmdDispatchIndirect = (PFN_vkCmdDispatchIndirect) load("vkCmdDispatchIndirect", userptr);
+ vkCmdDraw = (PFN_vkCmdDraw) load("vkCmdDraw", userptr);
+ vkCmdDrawIndexed = (PFN_vkCmdDrawIndexed) load("vkCmdDrawIndexed", userptr);
+ vkCmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect) load("vkCmdDrawIndexedIndirect", userptr);
+ vkCmdDrawIndirect = (PFN_vkCmdDrawIndirect) load("vkCmdDrawIndirect", userptr);
+ vkCmdEndQuery = (PFN_vkCmdEndQuery) load("vkCmdEndQuery", userptr);
+ vkCmdEndRenderPass = (PFN_vkCmdEndRenderPass) load("vkCmdEndRenderPass", userptr);
+ vkCmdExecuteCommands = (PFN_vkCmdExecuteCommands) load("vkCmdExecuteCommands", userptr);
+ vkCmdFillBuffer = (PFN_vkCmdFillBuffer) load("vkCmdFillBuffer", userptr);
+ vkCmdNextSubpass = (PFN_vkCmdNextSubpass) load("vkCmdNextSubpass", userptr);
+ vkCmdPipelineBarrier = (PFN_vkCmdPipelineBarrier) load("vkCmdPipelineBarrier", userptr);
+ vkCmdPushConstants = (PFN_vkCmdPushConstants) load("vkCmdPushConstants", userptr);
+ vkCmdResetEvent = (PFN_vkCmdResetEvent) load("vkCmdResetEvent", userptr);
+ vkCmdResetQueryPool = (PFN_vkCmdResetQueryPool) load("vkCmdResetQueryPool", userptr);
+ vkCmdResolveImage = (PFN_vkCmdResolveImage) load("vkCmdResolveImage", userptr);
+ vkCmdSetBlendConstants = (PFN_vkCmdSetBlendConstants) load("vkCmdSetBlendConstants", userptr);
+ vkCmdSetDepthBias = (PFN_vkCmdSetDepthBias) load("vkCmdSetDepthBias", userptr);
+ vkCmdSetDepthBounds = (PFN_vkCmdSetDepthBounds) load("vkCmdSetDepthBounds", userptr);
+ vkCmdSetEvent = (PFN_vkCmdSetEvent) load("vkCmdSetEvent", userptr);
+ vkCmdSetLineWidth = (PFN_vkCmdSetLineWidth) load("vkCmdSetLineWidth", userptr);
+ vkCmdSetScissor = (PFN_vkCmdSetScissor) load("vkCmdSetScissor", userptr);
+ vkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask) load("vkCmdSetStencilCompareMask", userptr);
+ vkCmdSetStencilReference = (PFN_vkCmdSetStencilReference) load("vkCmdSetStencilReference", userptr);
+ vkCmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask) load("vkCmdSetStencilWriteMask", userptr);
+ vkCmdSetViewport = (PFN_vkCmdSetViewport) load("vkCmdSetViewport", userptr);
+ vkCmdUpdateBuffer = (PFN_vkCmdUpdateBuffer) load("vkCmdUpdateBuffer", userptr);
+ vkCmdWaitEvents = (PFN_vkCmdWaitEvents) load("vkCmdWaitEvents", userptr);
+ vkCmdWriteTimestamp = (PFN_vkCmdWriteTimestamp) load("vkCmdWriteTimestamp", userptr);
+ vkCreateBuffer = (PFN_vkCreateBuffer) load("vkCreateBuffer", userptr);
+ vkCreateBufferView = (PFN_vkCreateBufferView) load("vkCreateBufferView", userptr);
+ vkCreateCommandPool = (PFN_vkCreateCommandPool) load("vkCreateCommandPool", userptr);
+ vkCreateComputePipelines = (PFN_vkCreateComputePipelines) load("vkCreateComputePipelines", userptr);
+ vkCreateDescriptorPool = (PFN_vkCreateDescriptorPool) load("vkCreateDescriptorPool", userptr);
+ vkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout) load("vkCreateDescriptorSetLayout", userptr);
+ vkCreateDevice = (PFN_vkCreateDevice) load("vkCreateDevice", userptr);
+ vkCreateEvent = (PFN_vkCreateEvent) load("vkCreateEvent", userptr);
+ vkCreateFence = (PFN_vkCreateFence) load("vkCreateFence", userptr);
+ vkCreateFramebuffer = (PFN_vkCreateFramebuffer) load("vkCreateFramebuffer", userptr);
+ vkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines) load("vkCreateGraphicsPipelines", userptr);
+ vkCreateImage = (PFN_vkCreateImage) load("vkCreateImage", userptr);
+ vkCreateImageView = (PFN_vkCreateImageView) load("vkCreateImageView", userptr);
+ vkCreateInstance = (PFN_vkCreateInstance) load("vkCreateInstance", userptr);
+ vkCreatePipelineCache = (PFN_vkCreatePipelineCache) load("vkCreatePipelineCache", userptr);
+ vkCreatePipelineLayout = (PFN_vkCreatePipelineLayout) load("vkCreatePipelineLayout", userptr);
+ vkCreateQueryPool = (PFN_vkCreateQueryPool) load("vkCreateQueryPool", userptr);
+ vkCreateRenderPass = (PFN_vkCreateRenderPass) load("vkCreateRenderPass", userptr);
+ vkCreateSampler = (PFN_vkCreateSampler) load("vkCreateSampler", userptr);
+ vkCreateSemaphore = (PFN_vkCreateSemaphore) load("vkCreateSemaphore", userptr);
+ vkCreateShaderModule = (PFN_vkCreateShaderModule) load("vkCreateShaderModule", userptr);
+ vkDestroyBuffer = (PFN_vkDestroyBuffer) load("vkDestroyBuffer", userptr);
+ vkDestroyBufferView = (PFN_vkDestroyBufferView) load("vkDestroyBufferView", userptr);
+ vkDestroyCommandPool = (PFN_vkDestroyCommandPool) load("vkDestroyCommandPool", userptr);
+ vkDestroyDescriptorPool = (PFN_vkDestroyDescriptorPool) load("vkDestroyDescriptorPool", userptr);
+ vkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout) load("vkDestroyDescriptorSetLayout", userptr);
+ vkDestroyDevice = (PFN_vkDestroyDevice) load("vkDestroyDevice", userptr);
+ vkDestroyEvent = (PFN_vkDestroyEvent) load("vkDestroyEvent", userptr);
+ vkDestroyFence = (PFN_vkDestroyFence) load("vkDestroyFence", userptr);
+ vkDestroyFramebuffer = (PFN_vkDestroyFramebuffer) load("vkDestroyFramebuffer", userptr);
+ vkDestroyImage = (PFN_vkDestroyImage) load("vkDestroyImage", userptr);
+ vkDestroyImageView = (PFN_vkDestroyImageView) load("vkDestroyImageView", userptr);
+ vkDestroyInstance = (PFN_vkDestroyInstance) load("vkDestroyInstance", userptr);
+ vkDestroyPipeline = (PFN_vkDestroyPipeline) load("vkDestroyPipeline", userptr);
+ vkDestroyPipelineCache = (PFN_vkDestroyPipelineCache) load("vkDestroyPipelineCache", userptr);
+ vkDestroyPipelineLayout = (PFN_vkDestroyPipelineLayout) load("vkDestroyPipelineLayout", userptr);
+ vkDestroyQueryPool = (PFN_vkDestroyQueryPool) load("vkDestroyQueryPool", userptr);
+ vkDestroyRenderPass = (PFN_vkDestroyRenderPass) load("vkDestroyRenderPass", userptr);
+ vkDestroySampler = (PFN_vkDestroySampler) load("vkDestroySampler", userptr);
+ vkDestroySemaphore = (PFN_vkDestroySemaphore) load("vkDestroySemaphore", userptr);
+ vkDestroyShaderModule = (PFN_vkDestroyShaderModule) load("vkDestroyShaderModule", userptr);
+ vkDeviceWaitIdle = (PFN_vkDeviceWaitIdle) load("vkDeviceWaitIdle", userptr);
+ vkEndCommandBuffer = (PFN_vkEndCommandBuffer) load("vkEndCommandBuffer", userptr);
+ vkEnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties) load("vkEnumerateDeviceExtensionProperties", userptr);
+ vkEnumerateDeviceLayerProperties = (PFN_vkEnumerateDeviceLayerProperties) load("vkEnumerateDeviceLayerProperties", userptr);
+ vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties) load("vkEnumerateInstanceExtensionProperties", userptr);
+ vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties) load("vkEnumerateInstanceLayerProperties", userptr);
+ vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices) load("vkEnumeratePhysicalDevices", userptr);
+ vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges) load("vkFlushMappedMemoryRanges", userptr);
+ vkFreeCommandBuffers = (PFN_vkFreeCommandBuffers) load("vkFreeCommandBuffers", userptr);
+ vkFreeDescriptorSets = (PFN_vkFreeDescriptorSets) load("vkFreeDescriptorSets", userptr);
+ vkFreeMemory = (PFN_vkFreeMemory) load("vkFreeMemory", userptr);
+ vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements) load("vkGetBufferMemoryRequirements", userptr);
+ vkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment) load("vkGetDeviceMemoryCommitment", userptr);
+ vkGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr) load("vkGetDeviceProcAddr", userptr);
+ vkGetDeviceQueue = (PFN_vkGetDeviceQueue) load("vkGetDeviceQueue", userptr);
+ vkGetEventStatus = (PFN_vkGetEventStatus) load("vkGetEventStatus", userptr);
+ vkGetFenceStatus = (PFN_vkGetFenceStatus) load("vkGetFenceStatus", userptr);
+ vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements) load("vkGetImageMemoryRequirements", userptr);
+ vkGetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements) load("vkGetImageSparseMemoryRequirements", userptr);
+ vkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout) load("vkGetImageSubresourceLayout", userptr);
+ vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) load("vkGetInstanceProcAddr", userptr);
+ vkGetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures) load("vkGetPhysicalDeviceFeatures", userptr);
+ vkGetPhysicalDeviceFormatProperties = (PFN_vkGetPhysicalDeviceFormatProperties) load("vkGetPhysicalDeviceFormatProperties", userptr);
+ vkGetPhysicalDeviceImageFormatProperties = (PFN_vkGetPhysicalDeviceImageFormatProperties) load("vkGetPhysicalDeviceImageFormatProperties", userptr);
+ vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties) load("vkGetPhysicalDeviceMemoryProperties", userptr);
+ vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties) load("vkGetPhysicalDeviceProperties", userptr);
+ vkGetPhysicalDeviceQueueFamilyProperties = (PFN_vkGetPhysicalDeviceQueueFamilyProperties) load("vkGetPhysicalDeviceQueueFamilyProperties", userptr);
+ vkGetPhysicalDeviceSparseImageFormatProperties = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties) load("vkGetPhysicalDeviceSparseImageFormatProperties", userptr);
+ vkGetPipelineCacheData = (PFN_vkGetPipelineCacheData) load("vkGetPipelineCacheData", userptr);
+ vkGetQueryPoolResults = (PFN_vkGetQueryPoolResults) load("vkGetQueryPoolResults", userptr);
+ vkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity) load("vkGetRenderAreaGranularity", userptr);
+ vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges) load("vkInvalidateMappedMemoryRanges", userptr);
+ vkMapMemory = (PFN_vkMapMemory) load("vkMapMemory", userptr);
+ vkMergePipelineCaches = (PFN_vkMergePipelineCaches) load("vkMergePipelineCaches", userptr);
+ vkQueueBindSparse = (PFN_vkQueueBindSparse) load("vkQueueBindSparse", userptr);
+ vkQueueSubmit = (PFN_vkQueueSubmit) load("vkQueueSubmit", userptr);
+ vkQueueWaitIdle = (PFN_vkQueueWaitIdle) load("vkQueueWaitIdle", userptr);
+ vkResetCommandBuffer = (PFN_vkResetCommandBuffer) load("vkResetCommandBuffer", userptr);
+ vkResetCommandPool = (PFN_vkResetCommandPool) load("vkResetCommandPool", userptr);
+ vkResetDescriptorPool = (PFN_vkResetDescriptorPool) load("vkResetDescriptorPool", userptr);
+ vkResetEvent = (PFN_vkResetEvent) load("vkResetEvent", userptr);
+ vkResetFences = (PFN_vkResetFences) load("vkResetFences", userptr);
+ vkSetEvent = (PFN_vkSetEvent) load("vkSetEvent", userptr);
+ vkUnmapMemory = (PFN_vkUnmapMemory) load("vkUnmapMemory", userptr);
+ vkUpdateDescriptorSets = (PFN_vkUpdateDescriptorSets) load("vkUpdateDescriptorSets", userptr);
+ vkWaitForFences = (PFN_vkWaitForFences) load("vkWaitForFences", userptr);
+}
+static void glad_vk_load_VK_EXT_debug_report( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_VK_EXT_debug_report) return;
+ vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT) load("vkCreateDebugReportCallbackEXT", userptr);
+ vkDebugReportMessageEXT = (PFN_vkDebugReportMessageEXT) load("vkDebugReportMessageEXT", userptr);
+ vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT) load("vkDestroyDebugReportCallbackEXT", userptr);
+}
+static void glad_vk_load_VK_KHR_surface( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_VK_KHR_surface) return;
+ vkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR) load("vkDestroySurfaceKHR", userptr);
+ vkGetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR) load("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", userptr);
+ vkGetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR) load("vkGetPhysicalDeviceSurfaceFormatsKHR", userptr);
+ vkGetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR) load("vkGetPhysicalDeviceSurfacePresentModesKHR", userptr);
+ vkGetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR) load("vkGetPhysicalDeviceSurfaceSupportKHR", userptr);
+}
+static void glad_vk_load_VK_KHR_swapchain( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_VK_KHR_swapchain) return;
+ vkAcquireNextImage2KHR = (PFN_vkAcquireNextImage2KHR) load("vkAcquireNextImage2KHR", userptr);
+ vkAcquireNextImageKHR = (PFN_vkAcquireNextImageKHR) load("vkAcquireNextImageKHR", userptr);
+ vkCreateSwapchainKHR = (PFN_vkCreateSwapchainKHR) load("vkCreateSwapchainKHR", userptr);
+ vkDestroySwapchainKHR = (PFN_vkDestroySwapchainKHR) load("vkDestroySwapchainKHR", userptr);
+ vkGetDeviceGroupPresentCapabilitiesKHR = (PFN_vkGetDeviceGroupPresentCapabilitiesKHR) load("vkGetDeviceGroupPresentCapabilitiesKHR", userptr);
+ vkGetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR) load("vkGetDeviceGroupSurfacePresentModesKHR", userptr);
+ vkGetPhysicalDevicePresentRectanglesKHR = (PFN_vkGetPhysicalDevicePresentRectanglesKHR) load("vkGetPhysicalDevicePresentRectanglesKHR", userptr);
+ vkGetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR) load("vkGetSwapchainImagesKHR", userptr);
+ vkQueuePresentKHR = (PFN_vkQueuePresentKHR) load("vkQueuePresentKHR", userptr);
+}
+
+
+
+static int glad_vk_get_extensions( VkPhysicalDevice physical_device, uint32_t *out_extension_count, char ***out_extensions) {
+ uint32_t i;
+ uint32_t instance_extension_count = 0;
+ uint32_t device_extension_count = 0;
+ uint32_t max_extension_count;
+ uint32_t total_extension_count;
+ char **extensions;
+ VkExtensionProperties *ext_properties;
+ VkResult result;
+
+ if (vkEnumerateInstanceExtensionProperties == NULL || (physical_device != NULL && vkEnumerateDeviceExtensionProperties == NULL)) {
+ return 0;
+ }
+
+ result = vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, NULL);
+ if (result != VK_SUCCESS) {
+ return 0;
+ }
+
+ if (physical_device != NULL) {
+ result = vkEnumerateDeviceExtensionProperties(physical_device, NULL, &device_extension_count, NULL);
+ if (result != VK_SUCCESS) {
+ return 0;
+ }
+ }
+
+ total_extension_count = instance_extension_count + device_extension_count;
+ max_extension_count = instance_extension_count > device_extension_count
+ ? instance_extension_count : device_extension_count;
+
+ ext_properties = (VkExtensionProperties*) malloc(max_extension_count * sizeof(VkExtensionProperties));
+ if (ext_properties == NULL) {
+ return 0;
+ }
+
+ result = vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, ext_properties);
+ if (result != VK_SUCCESS) {
+ free((void*) ext_properties);
+ return 0;
+ }
+
+ extensions = (char**) calloc(total_extension_count, sizeof(char*));
+ if (extensions == NULL) {
+ free((void*) ext_properties);
+ return 0;
+ }
+
+ for (i = 0; i < instance_extension_count; ++i) {
+ VkExtensionProperties ext = ext_properties[i];
+
+ size_t extension_name_length = strlen(ext.extensionName) + 1;
+ extensions[i] = (char*) malloc(extension_name_length * sizeof(char));
+ memcpy(extensions[i], ext.extensionName, extension_name_length * sizeof(char));
+ }
+
+ if (physical_device != NULL) {
+ result = vkEnumerateDeviceExtensionProperties(physical_device, NULL, &device_extension_count, ext_properties);
+ if (result != VK_SUCCESS) {
+ for (i = 0; i < instance_extension_count; ++i) {
+ free((void*) extensions[i]);
+ }
+ free(extensions);
+ return 0;
+ }
+
+ for (i = 0; i < device_extension_count; ++i) {
+ VkExtensionProperties ext = ext_properties[i];
+
+ size_t extension_name_length = strlen(ext.extensionName) + 1;
+ extensions[instance_extension_count + i] = (char*) malloc(extension_name_length * sizeof(char));
+ memcpy(extensions[instance_extension_count + i], ext.extensionName, extension_name_length * sizeof(char));
+ }
+ }
+
+ free((void*) ext_properties);
+
+ *out_extension_count = total_extension_count;
+ *out_extensions = extensions;
+
+ return 1;
+}
+
+static void glad_vk_free_extensions(uint32_t extension_count, char **extensions) {
+ uint32_t i;
+
+ for(i = 0; i < extension_count ; ++i) {
+ free((void*) (extensions[i]));
+ }
+
+ free((void*) extensions);
+}
+
+static int glad_vk_has_extension(const char *name, uint32_t extension_count, char **extensions) {
+ uint32_t i;
+
+ for (i = 0; i < extension_count; ++i) {
+ if(strcmp(name, extensions[i]) == 0) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static GLADapiproc glad_vk_get_proc_from_userptr(const char* name, void *userptr) {
+ return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);
+}
+
+static int glad_vk_find_extensions_vulkan( VkPhysicalDevice physical_device) {
+ uint32_t extension_count = 0;
+ char **extensions = NULL;
+ if (!glad_vk_get_extensions(physical_device, &extension_count, &extensions)) return 0;
+
+ GLAD_VK_EXT_debug_report = glad_vk_has_extension("VK_EXT_debug_report", extension_count, extensions);
+ GLAD_VK_KHR_surface = glad_vk_has_extension("VK_KHR_surface", extension_count, extensions);
+ GLAD_VK_KHR_swapchain = glad_vk_has_extension("VK_KHR_swapchain", extension_count, extensions);
+
+ glad_vk_free_extensions(extension_count, extensions);
+
+ return 1;
+}
+
+static int glad_vk_find_core_vulkan( VkPhysicalDevice physical_device) {
+ int major = 1;
+ int minor = 0;
+
+#ifdef VK_VERSION_1_1
+ if (vkEnumerateInstanceVersion != NULL) {
+ uint32_t version;
+ VkResult result;
+
+ result = vkEnumerateInstanceVersion(&version);
+ if (result == VK_SUCCESS) {
+ major = (int) VK_VERSION_MAJOR(version);
+ minor = (int) VK_VERSION_MINOR(version);
+ }
+ }
+#endif
+
+ if (physical_device != NULL && vkGetPhysicalDeviceProperties != NULL) {
+ VkPhysicalDeviceProperties properties;
+ vkGetPhysicalDeviceProperties(physical_device, &properties);
+
+ major = (int) VK_VERSION_MAJOR(properties.apiVersion);
+ minor = (int) VK_VERSION_MINOR(properties.apiVersion);
+ }
+
+ GLAD_VK_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
+
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+int gladLoadVulkanUserPtr( VkPhysicalDevice physical_device, GLADuserptrloadfunc load, void *userptr) {
+ int version;
+
+#ifdef VK_VERSION_1_1
+ vkEnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion) load("vkEnumerateInstanceVersion", userptr);
+#endif
+ version = glad_vk_find_core_vulkan( physical_device);
+ if (!version) {
+ return 0;
+ }
+
+ glad_vk_load_VK_VERSION_1_0(load, userptr);
+
+ if (!glad_vk_find_extensions_vulkan( physical_device)) return 0;
+ glad_vk_load_VK_EXT_debug_report(load, userptr);
+ glad_vk_load_VK_KHR_surface(load, userptr);
+ glad_vk_load_VK_KHR_swapchain(load, userptr);
+
+
+ return version;
+}
+
+
+int gladLoadVulkan( VkPhysicalDevice physical_device, GLADloadfunc load) {
+ return gladLoadVulkanUserPtr( physical_device, glad_vk_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+
+
+
+
+#endif /* GLAD_VULKAN_IMPLEMENTATION */
+
diff --git a/examples/win32/Win32.cpp b/examples/win32/Win32.cpp
index aedfc76..9b696c2 100644
--- a/examples/win32/Win32.cpp
+++ b/examples/win32/Win32.cpp
@@ -122,6 +122,10 @@ int main()
}
}
+ // Close our SFML views before destroying the underlying window
+ SFMLView1.close();
+ SFMLView2.close();
+
// Destroy the main window (all its child controls will be destroyed)
DestroyWindow(window);
diff --git a/examples/win32/resources/image1.jpg b/examples/win32/resources/image1.jpg
new file mode 100644
index 0000000..8e734e2
--- /dev/null
+++ b/examples/win32/resources/image1.jpg
Binary files differ
diff --git a/examples/win32/resources/image2.jpg b/examples/win32/resources/image2.jpg
new file mode 100644
index 0000000..f4f7e82
--- /dev/null
+++ b/examples/win32/resources/image2.jpg
Binary files differ
diff --git a/examples/window/CMakeLists.txt b/examples/window/CMakeLists.txt
index b106c04..d0af6ca 100644
--- a/examples/window/CMakeLists.txt
+++ b/examples/window/CMakeLists.txt
@@ -7,4 +7,7 @@ set(SRC ${SRCROOT}/Window.cpp)
# define the window target
sfml_add_example(window GUI_APP
SOURCES ${SRC}
- DEPENDS sfml-window OpenGL)
+ DEPENDS sfml-window)
+
+# external dependency headers
+target_include_directories(window SYSTEM PRIVATE ${PROJECT_SOURCE_DIR}/examples/window)
diff --git a/examples/window/Window.cpp b/examples/window/Window.cpp
index 3fcea52..7bdaa39 100644
--- a/examples/window/Window.cpp
+++ b/examples/window/Window.cpp
@@ -2,8 +2,13 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Window.hpp>
-#include <SFML/OpenGL.hpp>
+#define GLAD_GL_IMPLEMENTATION
+#include <gl.h>
+
+#ifdef SFML_SYSTEM_IOS
+#include <SFML/Main.hpp>
+#endif
////////////////////////////////////////////////////////////
/// Entry point of application
@@ -23,8 +28,19 @@ int main()
// Make it the active window for OpenGL calls
window.setActive();
+ // Load OpenGL or OpenGL ES entry points using glad
+#ifdef SFML_OPENGL_ES
+ gladLoadGLES1(reinterpret_cast<GLADloadfunc>(sf::Context::getFunction));
+#else
+ gladLoadGL(reinterpret_cast<GLADloadfunc>(sf::Context::getFunction));
+#endif
+
// Set the color and depth clear values
+#ifdef SFML_OPENGL_ES
+ glClearDepthf(1.f);
+#else
glClearDepth(1.f);
+#endif
glClearColor(0.f, 0.f, 0.f, 1.f);
// Enable Z-buffer read and write
@@ -36,13 +52,17 @@ int main()
glDisable(GL_TEXTURE_2D);
// Configure the viewport (the same size as the window)
- glViewport(0, 0, window.getSize().x, window.getSize().y);
+ glViewport(0, 0, static_cast<GLsizei>(window.getSize().x), static_cast<GLsizei>(window.getSize().y));
// Setup a perspective projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
- GLfloat ratio = static_cast<float>(window.getSize().x) / window.getSize().y;
+ GLfloat ratio = static_cast<float>(window.getSize().x) / static_cast<float>(window.getSize().y);
+#ifdef SFML_OPENGL_ES
+ glFrustumf(-ratio, ratio, -1.f, 1.f, 1.f, 500.f);
+#else
glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f);
+#endif
// Define a 3D cube (6 faces made of 2 triangles composed by 3 vertices)
GLfloat cube[] =
@@ -121,7 +141,17 @@ int main()
// Resize event: adjust the viewport
if (event.type == sf::Event::Resized)
- glViewport(0, 0, event.size.width, event.size.height);
+ {
+ glViewport(0, 0, static_cast<GLsizei>(event.size.width), static_cast<GLsizei>(event.size.height));
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ GLfloat newRatio = static_cast<float>(event.size.width) / static_cast<float>(event.size.height);
+#ifdef SFML_OPENGL_ES
+ glFrustumf(-newRatio, newRatio, -1.f, 1.f, 1.f, 500.f);
+#else
+ glFrustum(-newRatio, newRatio, -1.f, 1.f, 1.f, 500.f);
+#endif
+ }
}
// Clear the color and depth buffers
diff --git a/examples/window/gl.h b/examples/window/gl.h
new file mode 100644
index 0000000..54500f6
--- /dev/null
+++ b/examples/window/gl.h
@@ -0,0 +1,7837 @@
+/**
+ * Loader generated by glad 2.0.0-beta on Wed Jul 17 01:48:58 2019
+ *
+ * Generator: C/C++
+ * Specification: gl
+ * Extensions: 42
+ *
+ * APIs:
+ * - gl:compatibility=1.1
+ * - gles1:common=1.0
+ *
+ * Options:
+ * - MX_GLOBAL = False
+ * - ON_DEMAND = False
+ * - LOADER = False
+ * - ALIAS = True
+ * - HEADER_ONLY = True
+ * - DEBUG = False
+ * - MX = False
+ *
+ * Commandline:
+ * --merge --api='gl:compatibility=1.1,gles1:common=1.0' --extensions='GL_ARB_copy_buffer,GL_ARB_fragment_shader,GL_ARB_framebuffer_object,GL_ARB_geometry_shader4,GL_ARB_get_program_binary,GL_ARB_imaging,GL_ARB_multitexture,GL_ARB_separate_shader_objects,GL_ARB_shader_objects,GL_ARB_shading_language_100,GL_ARB_texture_non_power_of_two,GL_ARB_vertex_buffer_object,GL_ARB_vertex_program,GL_ARB_vertex_shader,GL_EXT_blend_equation_separate,GL_EXT_blend_func_separate,GL_EXT_blend_minmax,GL_EXT_blend_subtract,GL_EXT_copy_texture,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_EXT_geometry_shader4,GL_EXT_packed_depth_stencil,GL_EXT_subtexture,GL_EXT_texture_array,GL_EXT_texture_object,GL_EXT_texture_sRGB,GL_EXT_vertex_array,GL_INGR_blend_func_separate,GL_KHR_debug,GL_NV_geometry_program4,GL_NV_vertex_program,GL_SGIS_texture_edge_clamp,GL_EXT_sRGB,GL_OES_blend_equation_separate,GL_OES_blend_func_separate,GL_OES_blend_subtract,GL_OES_framebuffer_object,GL_OES_packed_depth_stencil,GL_OES_single_precision,GL_OES_texture_npot' c --alias --header-only
+ *
+ * Online:
+ * http://glad.sh/#api=gl%3Acompatibility%3D1.1%2Cgles1%3Acommon%3D1.0&extensions=GL_ARB_copy_buffer%2CGL_ARB_fragment_shader%2CGL_ARB_framebuffer_object%2CGL_ARB_geometry_shader4%2CGL_ARB_get_program_binary%2CGL_ARB_imaging%2CGL_ARB_multitexture%2CGL_ARB_separate_shader_objects%2CGL_ARB_shader_objects%2CGL_ARB_shading_language_100%2CGL_ARB_texture_non_power_of_two%2CGL_ARB_vertex_buffer_object%2CGL_ARB_vertex_program%2CGL_ARB_vertex_shader%2CGL_EXT_blend_equation_separate%2CGL_EXT_blend_func_separate%2CGL_EXT_blend_minmax%2CGL_EXT_blend_subtract%2CGL_EXT_copy_texture%2CGL_EXT_framebuffer_blit%2CGL_EXT_framebuffer_multisample%2CGL_EXT_framebuffer_object%2CGL_EXT_geometry_shader4%2CGL_EXT_packed_depth_stencil%2CGL_EXT_subtexture%2CGL_EXT_texture_array%2CGL_EXT_texture_object%2CGL_EXT_texture_sRGB%2CGL_EXT_vertex_array%2CGL_INGR_blend_func_separate%2CGL_KHR_debug%2CGL_NV_geometry_program4%2CGL_NV_vertex_program%2CGL_SGIS_texture_edge_clamp%2CGL_EXT_sRGB%2CGL_OES_blend_equation_separate%2CGL_OES_blend_func_separate%2CGL_OES_blend_subtract%2CGL_OES_framebuffer_object%2CGL_OES_packed_depth_stencil%2CGL_OES_single_precision%2CGL_OES_texture_npot&generator=c&options=MERGE%2CALIAS%2CHEADER_ONLY
+ *
+ */
+
+#ifndef GLAD_GL_H_
+#define GLAD_GL_H_
+
+#ifdef __gl_h_
+ #error OpenGL header already included (API: gl), remove previous include!
+#endif
+#define __gl_h_ 1
+
+
+#define GLAD_GL
+#define GLAD_OPTION_GL_ALIAS
+#define GLAD_OPTION_GL_HEADER_ONLY
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef GLAD_PLATFORM_H_
+#define GLAD_PLATFORM_H_
+
+#ifndef GLAD_PLATFORM_WIN32
+ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)
+ #define GLAD_PLATFORM_WIN32 1
+ #else
+ #define GLAD_PLATFORM_WIN32 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_APPLE
+ #ifdef __APPLE__
+ #define GLAD_PLATFORM_APPLE 1
+ #else
+ #define GLAD_PLATFORM_APPLE 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_EMSCRIPTEN
+ #ifdef __EMSCRIPTEN__
+ #define GLAD_PLATFORM_EMSCRIPTEN 1
+ #else
+ #define GLAD_PLATFORM_EMSCRIPTEN 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_UWP
+ #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY)
+ #ifdef __has_include
+ #if __has_include(<winapifamily.h>)
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #endif
+
+ #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY
+ #include <winapifamily.h>
+ #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ #define GLAD_PLATFORM_UWP 1
+ #endif
+ #endif
+
+ #ifndef GLAD_PLATFORM_UWP
+ #define GLAD_PLATFORM_UWP 0
+ #endif
+#endif
+
+#ifdef __GNUC__
+ #define GLAD_GNUC_EXTENSION __extension__
+#else
+ #define GLAD_GNUC_EXTENSION
+#endif
+
+#ifndef GLAD_API_CALL
+ #if defined(GLAD_API_CALL_EXPORT)
+ #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__)
+ #if defined(GLAD_API_CALL_EXPORT_BUILD)
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllexport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllexport) extern
+ #endif
+ #else
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllimport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllimport) extern
+ #endif
+ #endif
+ #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD)
+ #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+#endif
+
+#ifdef APIENTRY
+ #define GLAD_API_PTR APIENTRY
+#elif GLAD_PLATFORM_WIN32
+ #define GLAD_API_PTR __stdcall
+#else
+ #define GLAD_API_PTR
+#endif
+
+#ifndef GLAPI
+#define GLAPI GLAD_API_CALL
+#endif
+
+#ifndef GLAPIENTRY
+#define GLAPIENTRY GLAD_API_PTR
+#endif
+
+#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor)
+#define GLAD_VERSION_MAJOR(version) (version / 10000)
+#define GLAD_VERSION_MINOR(version) (version % 10000)
+
+#define GLAD_GENERATOR_VERSION "2.0.0-beta"
+
+typedef void (*GLADapiproc)(void);
+
+typedef GLADapiproc (*GLADloadfunc)(const char *name);
+typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name);
+
+typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...);
+typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...);
+
+#endif /* GLAD_PLATFORM_H_ */
+
+#define GL_2D 0x0600
+#define GL_2_BYTES 0x1407
+#define GL_3D 0x0601
+#define GL_3D_COLOR 0x0602
+#define GL_3D_COLOR_TEXTURE 0x0603
+#define GL_3_BYTES 0x1408
+#define GL_4D_COLOR_TEXTURE 0x0604
+#define GL_4_BYTES 0x1409
+#define GL_ACCUM 0x0100
+#define GL_ACCUM_ALPHA_BITS 0x0D5B
+#define GL_ACCUM_BLUE_BITS 0x0D5A
+#define GL_ACCUM_BUFFER_BIT 0x00000200
+#define GL_ACCUM_CLEAR_VALUE 0x0B80
+#define GL_ACCUM_GREEN_BITS 0x0D59
+#define GL_ACCUM_RED_BITS 0x0D58
+#define GL_ACTIVE_PROGRAM 0x8259
+#define GL_ACTIVE_TEXTURE_ARB 0x84E0
+#define GL_ADD 0x0104
+#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF
+#define GL_ALL_SHADER_BITS 0xFFFFFFFF
+#define GL_ALPHA 0x1906
+#define GL_ALPHA12 0x803D
+#define GL_ALPHA16 0x803E
+#define GL_ALPHA4 0x803B
+#define GL_ALPHA8 0x803C
+#define GL_ALPHA_BIAS 0x0D1D
+#define GL_ALPHA_BITS 0x0D55
+#define GL_ALPHA_SCALE 0x0D1C
+#define GL_ALPHA_TEST 0x0BC0
+#define GL_ALPHA_TEST_FUNC 0x0BC1
+#define GL_ALPHA_TEST_REF 0x0BC2
+#define GL_ALWAYS 0x0207
+#define GL_AMBIENT 0x1200
+#define GL_AMBIENT_AND_DIFFUSE 0x1602
+#define GL_AND 0x1501
+#define GL_AND_INVERTED 0x1504
+#define GL_AND_REVERSE 0x1502
+#define GL_ARRAY_BUFFER_ARB 0x8892
+#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894
+#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645
+#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623
+#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624
+#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625
+#define GL_ATTRIB_STACK_DEPTH 0x0BB0
+#define GL_AUTO_NORMAL 0x0D80
+#define GL_AUX0 0x0409
+#define GL_AUX1 0x040A
+#define GL_AUX2 0x040B
+#define GL_AUX3 0x040C
+#define GL_AUX_BUFFERS 0x0C00
+#define GL_BACK 0x0405
+#define GL_BACK_LEFT 0x0402
+#define GL_BACK_RIGHT 0x0403
+#define GL_BITMAP 0x1A00
+#define GL_BITMAP_TOKEN 0x0704
+#define GL_BLEND 0x0BE2
+#define GL_BLEND_COLOR 0x8005
+#define GL_BLEND_DST 0x0BE0
+#define GL_BLEND_DST_ALPHA_EXT 0x80CA
+#define GL_BLEND_DST_RGB_EXT 0x80C8
+#define GL_BLEND_EQUATION 0x8009
+#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D
+#define GL_BLEND_EQUATION_EXT 0x8009
+#define GL_BLEND_EQUATION_RGB_EXT 0x8009
+#define GL_BLEND_SRC 0x0BE1
+#define GL_BLEND_SRC_ALPHA_EXT 0x80CB
+#define GL_BLEND_SRC_RGB_EXT 0x80C9
+#define GL_BLUE 0x1905
+#define GL_BLUE_BIAS 0x0D1B
+#define GL_BLUE_BITS 0x0D54
+#define GL_BLUE_SCALE 0x0D1A
+#define GL_BOOL_ARB 0x8B56
+#define GL_BOOL_VEC2_ARB 0x8B57
+#define GL_BOOL_VEC3_ARB 0x8B58
+#define GL_BOOL_VEC4_ARB 0x8B59
+#define GL_BUFFER 0x82E0
+#define GL_BUFFER_ACCESS_ARB 0x88BB
+#define GL_BUFFER_MAPPED_ARB 0x88BC
+#define GL_BUFFER_MAP_POINTER_ARB 0x88BD
+#define GL_BUFFER_SIZE_ARB 0x8764
+#define GL_BUFFER_USAGE_ARB 0x8765
+#define GL_BYTE 0x1400
+#define GL_C3F_V3F 0x2A24
+#define GL_C4F_N3F_V3F 0x2A26
+#define GL_C4UB_V2F 0x2A22
+#define GL_C4UB_V3F 0x2A23
+#define GL_CCW 0x0901
+#define GL_CLAMP 0x2900
+#define GL_CLAMP_TO_EDGE_SGIS 0x812F
+#define GL_CLEAR 0x1500
+#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
+#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF
+#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1
+#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
+#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
+#define GL_CLIP_PLANE0 0x3000
+#define GL_CLIP_PLANE1 0x3001
+#define GL_CLIP_PLANE2 0x3002
+#define GL_CLIP_PLANE3 0x3003
+#define GL_CLIP_PLANE4 0x3004
+#define GL_CLIP_PLANE5 0x3005
+#define GL_COEFF 0x0A00
+#define GL_COLOR 0x1800
+#define GL_COLOR_ARRAY 0x8076
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
+#define GL_COLOR_ARRAY_COUNT_EXT 0x8084
+#define GL_COLOR_ARRAY_EXT 0x8076
+#define GL_COLOR_ARRAY_POINTER 0x8090
+#define GL_COLOR_ARRAY_POINTER_EXT 0x8090
+#define GL_COLOR_ARRAY_SIZE 0x8081
+#define GL_COLOR_ARRAY_SIZE_EXT 0x8081
+#define GL_COLOR_ARRAY_STRIDE 0x8083
+#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083
+#define GL_COLOR_ARRAY_TYPE 0x8082
+#define GL_COLOR_ARRAY_TYPE_EXT 0x8082
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT13_EXT 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
+#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_INDEX 0x1900
+#define GL_COLOR_INDEXES 0x1603
+#define GL_COLOR_LOGIC_OP 0x0BF2
+#define GL_COLOR_MATERIAL 0x0B57
+#define GL_COLOR_MATERIAL_FACE 0x0B55
+#define GL_COLOR_MATERIAL_PARAMETER 0x0B56
+#define GL_COLOR_MATRIX 0x80B1
+#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2
+#define GL_COLOR_SUM_ARB 0x8458
+#define GL_COLOR_TABLE 0x80D0
+#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD
+#define GL_COLOR_TABLE_BIAS 0x80D7
+#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC
+#define GL_COLOR_TABLE_FORMAT 0x80D8
+#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB
+#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF
+#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE
+#define GL_COLOR_TABLE_RED_SIZE 0x80DA
+#define GL_COLOR_TABLE_SCALE 0x80D6
+#define GL_COLOR_TABLE_WIDTH 0x80D9
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E
+#define GL_COMPILE 0x1300
+#define GL_COMPILE_AND_EXECUTE 0x1301
+#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B
+#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A
+#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
+#define GL_COMPRESSED_SRGB_EXT 0x8C48
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_CONSTANT_ATTENUATION 0x1207
+#define GL_CONSTANT_BORDER 0x8151
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
+#define GL_CONVOLUTION_1D 0x8010
+#define GL_CONVOLUTION_2D 0x8011
+#define GL_CONVOLUTION_BORDER_COLOR 0x8154
+#define GL_CONVOLUTION_BORDER_MODE 0x8013
+#define GL_CONVOLUTION_FILTER_BIAS 0x8015
+#define GL_CONVOLUTION_FILTER_SCALE 0x8014
+#define GL_CONVOLUTION_FORMAT 0x8017
+#define GL_CONVOLUTION_HEIGHT 0x8019
+#define GL_CONVOLUTION_WIDTH 0x8018
+#define GL_COPY 0x1503
+#define GL_COPY_INVERTED 0x150C
+#define GL_COPY_PIXEL_TOKEN 0x0706
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#define GL_CULL_FACE 0x0B44
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_CURRENT_ATTRIB_NV 0x8626
+#define GL_CURRENT_BIT 0x00000001
+#define GL_CURRENT_COLOR 0x0B00
+#define GL_CURRENT_INDEX 0x0B01
+#define GL_CURRENT_MATRIX_ARB 0x8641
+#define GL_CURRENT_MATRIX_NV 0x8641
+#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
+#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640
+#define GL_CURRENT_NORMAL 0x0B02
+#define GL_CURRENT_RASTER_COLOR 0x0B04
+#define GL_CURRENT_RASTER_DISTANCE 0x0B09
+#define GL_CURRENT_RASTER_INDEX 0x0B05
+#define GL_CURRENT_RASTER_POSITION 0x0B07
+#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08
+#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06
+#define GL_CURRENT_TEXTURE_COORDS 0x0B03
+#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
+#define GL_CW 0x0900
+#define GL_DEBUG_CALLBACK_FUNCTION 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
+#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
+#define GL_DEBUG_LOGGED_MESSAGES 0x9145
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
+#define GL_DEBUG_OUTPUT 0x92E0
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
+#define GL_DEBUG_SEVERITY_HIGH 0x9146
+#define GL_DEBUG_SEVERITY_LOW 0x9148
+#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
+#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
+#define GL_DEBUG_SOURCE_API 0x8246
+#define GL_DEBUG_SOURCE_APPLICATION 0x824A
+#define GL_DEBUG_SOURCE_OTHER 0x824B
+#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
+#define GL_DEBUG_TYPE_ERROR 0x824C
+#define GL_DEBUG_TYPE_MARKER 0x8268
+#define GL_DEBUG_TYPE_OTHER 0x8251
+#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
+#define GL_DEBUG_TYPE_POP_GROUP 0x826A
+#define GL_DEBUG_TYPE_PORTABILITY 0x824F
+#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
+#define GL_DECAL 0x2101
+#define GL_DECR 0x1E03
+#define GL_DEPTH 0x1801
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_DEPTH24_STENCIL8_EXT 0x88F0
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_DEPTH_ATTACHMENT_EXT 0x8D00
+#define GL_DEPTH_BIAS 0x0D1F
+#define GL_DEPTH_BITS 0x0D56
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_SCALE 0x0D1E
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_DEPTH_STENCIL_EXT 0x84F9
+#define GL_DEPTH_TEST 0x0B71
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DIFFUSE 0x1201
+#define GL_DISPLAY_LIST 0x82E7
+#define GL_DITHER 0x0BD0
+#define GL_DOMAIN 0x0A02
+#define GL_DONT_CARE 0x1100
+#define GL_DOUBLE 0x140A
+#define GL_DOUBLEBUFFER 0x0C32
+#define GL_DRAW_BUFFER 0x0C01
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
+#define GL_DRAW_PIXEL_TOKEN 0x0705
+#define GL_DST_ALPHA 0x0304
+#define GL_DST_COLOR 0x0306
+#define GL_DYNAMIC_COPY_ARB 0x88EA
+#define GL_DYNAMIC_DRAW_ARB 0x88E8
+#define GL_DYNAMIC_READ_ARB 0x88E9
+#define GL_EDGE_FLAG 0x0B43
+#define GL_EDGE_FLAG_ARRAY 0x8079
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B
+#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D
+#define GL_EDGE_FLAG_ARRAY_EXT 0x8079
+#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
+#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093
+#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C
+#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C
+#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
+#define GL_EMISSION 0x1600
+#define GL_ENABLE_BIT 0x00002000
+#define GL_EQUAL 0x0202
+#define GL_EQUIV 0x1509
+#define GL_EVAL_BIT 0x00010000
+#define GL_EXP 0x0800
+#define GL_EXP2 0x0801
+#define GL_EXTENSIONS 0x1F03
+#define GL_EYE_LINEAR 0x2400
+#define GL_EYE_PLANE 0x2502
+#define GL_FALSE 0
+#define GL_FASTEST 0x1101
+#define GL_FEEDBACK 0x1C01
+#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0
+#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1
+#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2
+#define GL_FILL 0x1B02
+#define GL_FLAT 0x1D00
+#define GL_FLOAT 0x1406
+#define GL_FLOAT_MAT2_ARB 0x8B5A
+#define GL_FLOAT_MAT3_ARB 0x8B5B
+#define GL_FLOAT_MAT4_ARB 0x8B5C
+#define GL_FLOAT_VEC2_ARB 0x8B50
+#define GL_FLOAT_VEC3_ARB 0x8B51
+#define GL_FLOAT_VEC4_ARB 0x8B52
+#define GL_FOG 0x0B60
+#define GL_FOG_BIT 0x00000080
+#define GL_FOG_COLOR 0x0B66
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D
+#define GL_FOG_DENSITY 0x0B62
+#define GL_FOG_END 0x0B64
+#define GL_FOG_HINT 0x0C54
+#define GL_FOG_INDEX 0x0B61
+#define GL_FOG_MODE 0x0B65
+#define GL_FOG_START 0x0B63
+#define GL_FRAGMENT_SHADER_ARB 0x8B30
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_EXT 0x8D40
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
+#define GL_FRONT 0x0404
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_FRONT_FACE 0x0B46
+#define GL_FRONT_LEFT 0x0400
+#define GL_FRONT_RIGHT 0x0401
+#define GL_FUNC_ADD 0x8006
+#define GL_FUNC_ADD_EXT 0x8006
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_SUBTRACT_EXT 0x800A
+#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB
+#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB
+#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC
+#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC
+#define GL_GEOMETRY_PROGRAM_NV 0x8C26
+#define GL_GEOMETRY_SHADER_ARB 0x8DD9
+#define GL_GEOMETRY_SHADER_BIT 0x00000004
+#define GL_GEOMETRY_SHADER_EXT 0x8DD9
+#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA
+#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA
+#define GL_GEQUAL 0x0206
+#define GL_GREATER 0x0204
+#define GL_GREEN 0x1904
+#define GL_GREEN_BIAS 0x0D19
+#define GL_GREEN_BITS 0x0D53
+#define GL_GREEN_SCALE 0x0D18
+#define GL_HINT_BIT 0x00008000
+#define GL_HISTOGRAM 0x8024
+#define GL_HISTOGRAM_ALPHA_SIZE 0x802B
+#define GL_HISTOGRAM_BLUE_SIZE 0x802A
+#define GL_HISTOGRAM_FORMAT 0x8027
+#define GL_HISTOGRAM_GREEN_SIZE 0x8029
+#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C
+#define GL_HISTOGRAM_RED_SIZE 0x8028
+#define GL_HISTOGRAM_SINK 0x802D
+#define GL_HISTOGRAM_WIDTH 0x8026
+#define GL_IDENTITY_NV 0x862A
+#define GL_INCR 0x1E02
+#define GL_INDEX 0x8222
+#define GL_INDEX_ARRAY 0x8077
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
+#define GL_INDEX_ARRAY_COUNT_EXT 0x8087
+#define GL_INDEX_ARRAY_EXT 0x8077
+#define GL_INDEX_ARRAY_POINTER 0x8091
+#define GL_INDEX_ARRAY_POINTER_EXT 0x8091
+#define GL_INDEX_ARRAY_STRIDE 0x8086
+#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086
+#define GL_INDEX_ARRAY_TYPE 0x8085
+#define GL_INDEX_ARRAY_TYPE_EXT 0x8085
+#define GL_INDEX_BITS 0x0D51
+#define GL_INDEX_CLEAR_VALUE 0x0C20
+#define GL_INDEX_LOGIC_OP 0x0BF1
+#define GL_INDEX_MODE 0x0C30
+#define GL_INDEX_OFFSET 0x0D13
+#define GL_INDEX_SHIFT 0x0D12
+#define GL_INDEX_WRITEMASK 0x0C21
+#define GL_INT 0x1404
+#define GL_INTENSITY 0x8049
+#define GL_INTENSITY12 0x804C
+#define GL_INTENSITY16 0x804D
+#define GL_INTENSITY4 0x804A
+#define GL_INTENSITY8 0x804B
+#define GL_INT_VEC2_ARB 0x8B53
+#define GL_INT_VEC3_ARB 0x8B54
+#define GL_INT_VEC4_ARB 0x8B55
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
+#define GL_INVALID_OPERATION 0x0502
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVERSE_NV 0x862B
+#define GL_INVERSE_TRANSPOSE_NV 0x862D
+#define GL_INVERT 0x150A
+#define GL_KEEP 0x1E00
+#define GL_LEFT 0x0406
+#define GL_LEQUAL 0x0203
+#define GL_LESS 0x0201
+#define GL_LIGHT0 0x4000
+#define GL_LIGHT1 0x4001
+#define GL_LIGHT2 0x4002
+#define GL_LIGHT3 0x4003
+#define GL_LIGHT4 0x4004
+#define GL_LIGHT5 0x4005
+#define GL_LIGHT6 0x4006
+#define GL_LIGHT7 0x4007
+#define GL_LIGHTING 0x0B50
+#define GL_LIGHTING_BIT 0x00000040
+#define GL_LIGHT_MODEL_AMBIENT 0x0B53
+#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
+#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
+#define GL_LINE 0x1B01
+#define GL_LINEAR 0x2601
+#define GL_LINEAR_ATTENUATION 0x1208
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_LINES 0x0001
+#define GL_LINES_ADJACENCY_ARB 0x000A
+#define GL_LINES_ADJACENCY_EXT 0x000A
+#define GL_LINE_BIT 0x00000004
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_RESET_TOKEN 0x0707
+#define GL_LINE_SMOOTH 0x0B20
+#define GL_LINE_SMOOTH_HINT 0x0C52
+#define GL_LINE_STIPPLE 0x0B24
+#define GL_LINE_STIPPLE_PATTERN 0x0B25
+#define GL_LINE_STIPPLE_REPEAT 0x0B26
+#define GL_LINE_STRIP 0x0003
+#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B
+#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B
+#define GL_LINE_TOKEN 0x0702
+#define GL_LINE_WIDTH 0x0B21
+#define GL_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_LINE_WIDTH_RANGE 0x0B22
+#define GL_LIST_BASE 0x0B32
+#define GL_LIST_BIT 0x00020000
+#define GL_LIST_INDEX 0x0B33
+#define GL_LIST_MODE 0x0B30
+#define GL_LOAD 0x0101
+#define GL_LOGIC_OP 0x0BF1
+#define GL_LOGIC_OP_MODE 0x0BF0
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE12 0x8041
+#define GL_LUMINANCE12_ALPHA12 0x8047
+#define GL_LUMINANCE12_ALPHA4 0x8046
+#define GL_LUMINANCE16 0x8042
+#define GL_LUMINANCE16_ALPHA16 0x8048
+#define GL_LUMINANCE4 0x803F
+#define GL_LUMINANCE4_ALPHA4 0x8043
+#define GL_LUMINANCE6_ALPHA2 0x8044
+#define GL_LUMINANCE8 0x8040
+#define GL_LUMINANCE8_ALPHA8 0x8045
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_MAP1_COLOR_4 0x0D90
+#define GL_MAP1_GRID_DOMAIN 0x0DD0
+#define GL_MAP1_GRID_SEGMENTS 0x0DD1
+#define GL_MAP1_INDEX 0x0D91
+#define GL_MAP1_NORMAL 0x0D92
+#define GL_MAP1_TEXTURE_COORD_1 0x0D93
+#define GL_MAP1_TEXTURE_COORD_2 0x0D94
+#define GL_MAP1_TEXTURE_COORD_3 0x0D95
+#define GL_MAP1_TEXTURE_COORD_4 0x0D96
+#define GL_MAP1_VERTEX_3 0x0D97
+#define GL_MAP1_VERTEX_4 0x0D98
+#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660
+#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A
+#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B
+#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C
+#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D
+#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E
+#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F
+#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661
+#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662
+#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663
+#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664
+#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665
+#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666
+#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667
+#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668
+#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669
+#define GL_MAP2_COLOR_4 0x0DB0
+#define GL_MAP2_GRID_DOMAIN 0x0DD2
+#define GL_MAP2_GRID_SEGMENTS 0x0DD3
+#define GL_MAP2_INDEX 0x0DB1
+#define GL_MAP2_NORMAL 0x0DB2
+#define GL_MAP2_TEXTURE_COORD_1 0x0DB3
+#define GL_MAP2_TEXTURE_COORD_2 0x0DB4
+#define GL_MAP2_TEXTURE_COORD_3 0x0DB5
+#define GL_MAP2_TEXTURE_COORD_4 0x0DB6
+#define GL_MAP2_VERTEX_3 0x0DB7
+#define GL_MAP2_VERTEX_4 0x0DB8
+#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670
+#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A
+#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B
+#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C
+#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D
+#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E
+#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F
+#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671
+#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672
+#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673
+#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674
+#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675
+#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676
+#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677
+#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678
+#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679
+#define GL_MAP_COLOR 0x0D10
+#define GL_MAP_STENCIL 0x0D11
+#define GL_MATRIX0_ARB 0x88C0
+#define GL_MATRIX0_NV 0x8630
+#define GL_MATRIX10_ARB 0x88CA
+#define GL_MATRIX11_ARB 0x88CB
+#define GL_MATRIX12_ARB 0x88CC
+#define GL_MATRIX13_ARB 0x88CD
+#define GL_MATRIX14_ARB 0x88CE
+#define GL_MATRIX15_ARB 0x88CF
+#define GL_MATRIX16_ARB 0x88D0
+#define GL_MATRIX17_ARB 0x88D1
+#define GL_MATRIX18_ARB 0x88D2
+#define GL_MATRIX19_ARB 0x88D3
+#define GL_MATRIX1_ARB 0x88C1
+#define GL_MATRIX1_NV 0x8631
+#define GL_MATRIX20_ARB 0x88D4
+#define GL_MATRIX21_ARB 0x88D5
+#define GL_MATRIX22_ARB 0x88D6
+#define GL_MATRIX23_ARB 0x88D7
+#define GL_MATRIX24_ARB 0x88D8
+#define GL_MATRIX25_ARB 0x88D9
+#define GL_MATRIX26_ARB 0x88DA
+#define GL_MATRIX27_ARB 0x88DB
+#define GL_MATRIX28_ARB 0x88DC
+#define GL_MATRIX29_ARB 0x88DD
+#define GL_MATRIX2_ARB 0x88C2
+#define GL_MATRIX2_NV 0x8632
+#define GL_MATRIX30_ARB 0x88DE
+#define GL_MATRIX31_ARB 0x88DF
+#define GL_MATRIX3_ARB 0x88C3
+#define GL_MATRIX3_NV 0x8633
+#define GL_MATRIX4_ARB 0x88C4
+#define GL_MATRIX4_NV 0x8634
+#define GL_MATRIX5_ARB 0x88C5
+#define GL_MATRIX5_NV 0x8635
+#define GL_MATRIX6_ARB 0x88C6
+#define GL_MATRIX6_NV 0x8636
+#define GL_MATRIX7_ARB 0x88C7
+#define GL_MATRIX7_NV 0x8637
+#define GL_MATRIX8_ARB 0x88C8
+#define GL_MATRIX9_ARB 0x88C9
+#define GL_MATRIX_MODE 0x0BA0
+#define GL_MAX 0x8008
+#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF
+#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35
+#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B
+#define GL_MAX_CLIP_PLANES 0x0D32
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D
+#define GL_MAX_CONVOLUTION_HEIGHT 0x801B
+#define GL_MAX_CONVOLUTION_WIDTH 0x801A
+#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
+#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
+#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
+#define GL_MAX_EVAL_ORDER 0x0D30
+#define GL_MAX_EXT 0x8008
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD
+#define GL_MAX_LABEL_LENGTH 0x82E8
+#define GL_MAX_LIGHTS 0x0D31
+#define GL_MAX_LIST_NESTING 0x0B31
+#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36
+#define GL_MAX_NAME_STACK_DEPTH 0x0D37
+#define GL_MAX_PIXEL_MAP_TABLE 0x0D34
+#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
+#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD
+#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
+#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1
+#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
+#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F
+#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
+#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
+#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
+#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
+#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
+#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
+#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27
+#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9
+#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5
+#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28
+#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
+#define GL_MAX_SAMPLES 0x8D57
+#define GL_MAX_SAMPLES_EXT 0x8D57
+#define GL_MAX_TEXTURE_COORDS_ARB 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39
+#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
+#define GL_MAX_TRACK_MATRICES_NV 0x862F
+#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B
+#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B
+#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_MIN 0x8007
+#define GL_MINMAX 0x802E
+#define GL_MINMAX_FORMAT 0x802F
+#define GL_MINMAX_SINK 0x8030
+#define GL_MIN_EXT 0x8007
+#define GL_MODELVIEW 0x1700
+#define GL_MODELVIEW_MATRIX 0x0BA6
+#define GL_MODELVIEW_PROJECTION_NV 0x8629
+#define GL_MODELVIEW_STACK_DEPTH 0x0BA3
+#define GL_MODULATE 0x2100
+#define GL_MULT 0x0103
+#define GL_N3F_V3F 0x2A25
+#define GL_NAME_STACK_DEPTH 0x0D70
+#define GL_NAND 0x150E
+#define GL_NEAREST 0x2600
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_NEVER 0x0200
+#define GL_NICEST 0x1102
+#define GL_NONE 0
+#define GL_NOOP 0x1505
+#define GL_NOR 0x1508
+#define GL_NORMALIZE 0x0BA1
+#define GL_NORMAL_ARRAY 0x8075
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
+#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080
+#define GL_NORMAL_ARRAY_EXT 0x8075
+#define GL_NORMAL_ARRAY_POINTER 0x808F
+#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F
+#define GL_NORMAL_ARRAY_STRIDE 0x807F
+#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F
+#define GL_NORMAL_ARRAY_TYPE 0x807E
+#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E
+#define GL_NOTEQUAL 0x0205
+#define GL_NO_ERROR 0
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89
+#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A
+#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86
+#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
+#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85
+#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81
+#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80
+#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84
+#define GL_OBJECT_LINEAR 0x2401
+#define GL_OBJECT_LINK_STATUS_ARB 0x8B82
+#define GL_OBJECT_PLANE 0x2501
+#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88
+#define GL_OBJECT_SUBTYPE_ARB 0x8B4F
+#define GL_OBJECT_TYPE_ARB 0x8B4E
+#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83
+#define GL_ONE 1
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_OR 0x1507
+#define GL_ORDER 0x0A01
+#define GL_OR_INVERTED 0x150D
+#define GL_OR_REVERSE 0x150B
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_PACK_LSB_FIRST 0x0D01
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SWAP_BYTES 0x0D00
+#define GL_PASS_THROUGH_TOKEN 0x0700
+#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50
+#define GL_PIXEL_MAP_A_TO_A 0x0C79
+#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9
+#define GL_PIXEL_MAP_B_TO_B 0x0C78
+#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8
+#define GL_PIXEL_MAP_G_TO_G 0x0C77
+#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7
+#define GL_PIXEL_MAP_I_TO_A 0x0C75
+#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5
+#define GL_PIXEL_MAP_I_TO_B 0x0C74
+#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4
+#define GL_PIXEL_MAP_I_TO_G 0x0C73
+#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3
+#define GL_PIXEL_MAP_I_TO_I 0x0C70
+#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0
+#define GL_PIXEL_MAP_I_TO_R 0x0C72
+#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2
+#define GL_PIXEL_MAP_R_TO_R 0x0C76
+#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6
+#define GL_PIXEL_MAP_S_TO_S 0x0C71
+#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1
+#define GL_PIXEL_MODE_BIT 0x00000020
+#define GL_POINT 0x1B00
+#define GL_POINTS 0x0000
+#define GL_POINT_BIT 0x00000002
+#define GL_POINT_SIZE 0x0B11
+#define GL_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_POINT_SIZE_RANGE 0x0B12
+#define GL_POINT_SMOOTH 0x0B10
+#define GL_POINT_SMOOTH_HINT 0x0C51
+#define GL_POINT_TOKEN 0x0701
+#define GL_POLYGON 0x0009
+#define GL_POLYGON_BIT 0x00000008
+#define GL_POLYGON_MODE 0x0B40
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_POLYGON_OFFSET_LINE 0x2A02
+#define GL_POLYGON_OFFSET_POINT 0x2A01
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_SMOOTH 0x0B41
+#define GL_POLYGON_SMOOTH_HINT 0x0C53
+#define GL_POLYGON_STIPPLE 0x0B42
+#define GL_POLYGON_STIPPLE_BIT 0x00000010
+#define GL_POLYGON_TOKEN 0x0703
+#define GL_POSITION 0x1203
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5
+#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8
+#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4
+#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
+#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F
+#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
+#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E
+#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1
+#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
+#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D
+#define GL_POST_CONVOLUTION_RED_BIAS 0x8020
+#define GL_POST_CONVOLUTION_RED_SCALE 0x801C
+#define GL_PROGRAM 0x82E2
+#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0
+#define GL_PROGRAM_ATTRIBS_ARB 0x88AC
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINDING_ARB 0x8677
+#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B
+#define GL_PROGRAM_ERROR_POSITION_NV 0x864B
+#define GL_PROGRAM_ERROR_STRING_ARB 0x8874
+#define GL_PROGRAM_FORMAT_ARB 0x8876
+#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875
+#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0
+#define GL_PROGRAM_LENGTH_ARB 0x8627
+#define GL_PROGRAM_LENGTH_NV 0x8627
+#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
+#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE
+#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
+#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA
+#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
+#define GL_PROGRAM_OBJECT_ARB 0x8B40
+#define GL_PROGRAM_PARAMETERS_ARB 0x88A8
+#define GL_PROGRAM_PARAMETER_NV 0x8644
+#define GL_PROGRAM_PIPELINE 0x82E4
+#define GL_PROGRAM_PIPELINE_BINDING 0x825A
+#define GL_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_PROGRAM_POINT_SIZE_EXT 0x8642
+#define GL_PROGRAM_RESIDENT_NV 0x8647
+#define GL_PROGRAM_SEPARABLE 0x8258
+#define GL_PROGRAM_STRING_ARB 0x8628
+#define GL_PROGRAM_STRING_NV 0x8628
+#define GL_PROGRAM_TARGET_NV 0x8646
+#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4
+#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
+#define GL_PROJECTION 0x1701
+#define GL_PROJECTION_MATRIX 0x0BA7
+#define GL_PROJECTION_STACK_DEPTH 0x0BA4
+#define GL_PROXY_COLOR_TABLE 0x80D3
+#define GL_PROXY_HISTOGRAM 0x8025
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
+#define GL_PROXY_TEXTURE_1D 0x8063
+#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19
+#define GL_PROXY_TEXTURE_2D 0x8064
+#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B
+#define GL_Q 0x2003
+#define GL_QUADRATIC_ATTENUATION 0x1209
+#define GL_QUADS 0x0007
+#define GL_QUAD_STRIP 0x0008
+#define GL_QUERY 0x82E3
+#define GL_R 0x2002
+#define GL_R3_G3_B2 0x2A10
+#define GL_READ_BUFFER 0x0C02
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
+#define GL_READ_FRAMEBUFFER_EXT 0x8CA8
+#define GL_READ_ONLY_ARB 0x88B8
+#define GL_READ_WRITE_ARB 0x88BA
+#define GL_RED 0x1903
+#define GL_REDUCE 0x8016
+#define GL_RED_BIAS 0x0D15
+#define GL_RED_BITS 0x0D52
+#define GL_RED_SCALE 0x0D14
+#define GL_RENDER 0x1C00
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54
+#define GL_RENDERBUFFER_EXT 0x8D41
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
+#define GL_RENDERER 0x1F01
+#define GL_RENDER_MODE 0x0C40
+#define GL_REPEAT 0x2901
+#define GL_REPLACE 0x1E01
+#define GL_REPLICATE_BORDER 0x8153
+#define GL_RETURN 0x0102
+#define GL_RGB 0x1907
+#define GL_RGB10 0x8052
+#define GL_RGB10_A2 0x8059
+#define GL_RGB12 0x8053
+#define GL_RGB16 0x8054
+#define GL_RGB4 0x804F
+#define GL_RGB5 0x8050
+#define GL_RGB5_A1 0x8057
+#define GL_RGB8 0x8051
+#define GL_RGBA 0x1908
+#define GL_RGBA12 0x805A
+#define GL_RGBA16 0x805B
+#define GL_RGBA2 0x8055
+#define GL_RGBA4 0x8056
+#define GL_RGBA8 0x8058
+#define GL_RGBA_MODE 0x0C31
+#define GL_RIGHT 0x0407
+#define GL_S 0x2000
+#define GL_SAMPLER 0x82E6
+#define GL_SAMPLER_1D_ARB 0x8B5D
+#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61
+#define GL_SAMPLER_2D_ARB 0x8B5E
+#define GL_SAMPLER_2D_RECT_ARB 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
+#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62
+#define GL_SAMPLER_3D_ARB 0x8B5F
+#define GL_SAMPLER_CUBE_ARB 0x8B60
+#define GL_SCISSOR_BIT 0x00080000
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
+#define GL_SELECT 0x1C02
+#define GL_SELECTION_BUFFER_POINTER 0x0DF3
+#define GL_SELECTION_BUFFER_SIZE 0x0DF4
+#define GL_SEPARABLE_2D 0x8012
+#define GL_SET 0x150F
+#define GL_SHADER 0x82E1
+#define GL_SHADER_OBJECT_ARB 0x8B48
+#define GL_SHADE_MODEL 0x0B54
+#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
+#define GL_SHININESS 0x1601
+#define GL_SHORT 0x1402
+#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45
+#define GL_SLUMINANCE8_EXT 0x8C47
+#define GL_SLUMINANCE_ALPHA_EXT 0x8C44
+#define GL_SLUMINANCE_EXT 0x8C46
+#define GL_SMOOTH 0x1D01
+#define GL_SPECULAR 0x1202
+#define GL_SPHERE_MAP 0x2402
+#define GL_SPOT_CUTOFF 0x1206
+#define GL_SPOT_DIRECTION 0x1204
+#define GL_SPOT_EXPONENT 0x1205
+#define GL_SRC_ALPHA 0x0302
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_SRC_COLOR 0x0300
+#define GL_SRGB8_ALPHA8_EXT 0x8C43
+#define GL_SRGB8_EXT 0x8C41
+#define GL_SRGB_ALPHA_EXT 0x8C42
+#define GL_SRGB_EXT 0x8C40
+#define GL_STACK_OVERFLOW 0x0503
+#define GL_STACK_UNDERFLOW 0x0504
+#define GL_STATIC_COPY_ARB 0x88E6
+#define GL_STATIC_DRAW_ARB 0x88E4
+#define GL_STATIC_READ_ARB 0x88E5
+#define GL_STENCIL 0x1802
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_STENCIL_ATTACHMENT_EXT 0x8D20
+#define GL_STENCIL_BITS 0x0D57
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_INDEX 0x1901
+#define GL_STENCIL_INDEX1 0x8D46
+#define GL_STENCIL_INDEX16 0x8D49
+#define GL_STENCIL_INDEX16_EXT 0x8D49
+#define GL_STENCIL_INDEX1_EXT 0x8D46
+#define GL_STENCIL_INDEX4 0x8D47
+#define GL_STENCIL_INDEX4_EXT 0x8D47
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_STENCIL_INDEX8_EXT 0x8D48
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_TEST 0x0B90
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_STEREO 0x0C33
+#define GL_STREAM_COPY_ARB 0x88E2
+#define GL_STREAM_DRAW_ARB 0x88E0
+#define GL_STREAM_READ_ARB 0x88E1
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_T 0x2001
+#define GL_T2F_C3F_V3F 0x2A2A
+#define GL_T2F_C4F_N3F_V3F 0x2A2C
+#define GL_T2F_C4UB_V3F 0x2A29
+#define GL_T2F_N3F_V3F 0x2A2B
+#define GL_T2F_V3F 0x2A27
+#define GL_T4F_C4F_N3F_V4F 0x2A2D
+#define GL_T4F_V4F 0x2A28
+#define GL_TABLE_TOO_LARGE 0x8031
+#define GL_TESS_CONTROL_SHADER_BIT 0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010
+#define GL_TEXTURE 0x1702
+#define GL_TEXTURE0_ARB 0x84C0
+#define GL_TEXTURE10_ARB 0x84CA
+#define GL_TEXTURE11_ARB 0x84CB
+#define GL_TEXTURE12_ARB 0x84CC
+#define GL_TEXTURE13_ARB 0x84CD
+#define GL_TEXTURE14_ARB 0x84CE
+#define GL_TEXTURE15_ARB 0x84CF
+#define GL_TEXTURE16_ARB 0x84D0
+#define GL_TEXTURE17_ARB 0x84D1
+#define GL_TEXTURE18_ARB 0x84D2
+#define GL_TEXTURE19_ARB 0x84D3
+#define GL_TEXTURE1_ARB 0x84C1
+#define GL_TEXTURE20_ARB 0x84D4
+#define GL_TEXTURE21_ARB 0x84D5
+#define GL_TEXTURE22_ARB 0x84D6
+#define GL_TEXTURE23_ARB 0x84D7
+#define GL_TEXTURE24_ARB 0x84D8
+#define GL_TEXTURE25_ARB 0x84D9
+#define GL_TEXTURE26_ARB 0x84DA
+#define GL_TEXTURE27_ARB 0x84DB
+#define GL_TEXTURE28_ARB 0x84DC
+#define GL_TEXTURE29_ARB 0x84DD
+#define GL_TEXTURE2_ARB 0x84C2
+#define GL_TEXTURE30_ARB 0x84DE
+#define GL_TEXTURE31_ARB 0x84DF
+#define GL_TEXTURE3_ARB 0x84C3
+#define GL_TEXTURE4_ARB 0x84C4
+#define GL_TEXTURE5_ARB 0x84C5
+#define GL_TEXTURE6_ARB 0x84C6
+#define GL_TEXTURE7_ARB 0x84C7
+#define GL_TEXTURE8_ARB 0x84C8
+#define GL_TEXTURE9_ARB 0x84C9
+#define GL_TEXTURE_1D 0x0DE0
+#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18
+#define GL_TEXTURE_1D_BINDING_EXT 0x8068
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A
+#define GL_TEXTURE_2D_BINDING_EXT 0x8069
+#define GL_TEXTURE_3D_BINDING_EXT 0x806A
+#define GL_TEXTURE_ALPHA_SIZE 0x805F
+#define GL_TEXTURE_BINDING_1D 0x8068
+#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D
+#define GL_TEXTURE_BIT 0x00040000
+#define GL_TEXTURE_BLUE_SIZE 0x805E
+#define GL_TEXTURE_BORDER 0x1005
+#define GL_TEXTURE_BORDER_COLOR 0x1004
+#define GL_TEXTURE_COMPONENTS 0x1003
+#define GL_TEXTURE_COORD_ARRAY 0x8078
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A
+#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B
+#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078
+#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092
+#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
+#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088
+#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088
+#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A
+#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
+#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089
+#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089
+#define GL_TEXTURE_ENV 0x2300
+#define GL_TEXTURE_ENV_COLOR 0x2201
+#define GL_TEXTURE_ENV_MODE 0x2200
+#define GL_TEXTURE_GEN_MODE 0x2500
+#define GL_TEXTURE_GEN_Q 0x0C63
+#define GL_TEXTURE_GEN_R 0x0C62
+#define GL_TEXTURE_GEN_S 0x0C60
+#define GL_TEXTURE_GEN_T 0x0C61
+#define GL_TEXTURE_GREEN_SIZE 0x805D
+#define GL_TEXTURE_HEIGHT 0x1001
+#define GL_TEXTURE_INTENSITY_SIZE 0x8061
+#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
+#define GL_TEXTURE_LUMINANCE_SIZE 0x8060
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MATRIX 0x0BA8
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_PRIORITY 0x8066
+#define GL_TEXTURE_PRIORITY_EXT 0x8066
+#define GL_TEXTURE_RED_SIZE 0x805C
+#define GL_TEXTURE_RESIDENT 0x8067
+#define GL_TEXTURE_RESIDENT_EXT 0x8067
+#define GL_TEXTURE_STACK_DEPTH 0x0BA5
+#define GL_TEXTURE_STENCIL_SIZE 0x88F1
+#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1
+#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_TRACK_MATRIX_NV 0x8648
+#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649
+#define GL_TRANSFORM_BIT 0x00001000
+#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7
+#define GL_TRANSPOSE_NV 0x862C
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLES_ADJACENCY_ARB 0x000C
+#define GL_TRIANGLES_ADJACENCY_EXT 0x000C
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D
+#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D
+#define GL_TRUE 1
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_UNPACK_LSB_FIRST 0x0CF1
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SWAP_BYTES 0x0CF0
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_UNSIGNED_INT 0x1405
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_UNSIGNED_INT_24_8_EXT 0x84FA
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_V2F 0x2A20
+#define GL_V3F 0x2A21
+#define GL_VENDOR 0x1F00
+#define GL_VERSION 0x1F02
+#define GL_VERTEX_ARRAY 0x8074
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
+#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D
+#define GL_VERTEX_ARRAY_EXT 0x8074
+#define GL_VERTEX_ARRAY_POINTER 0x808E
+#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E
+#define GL_VERTEX_ARRAY_SIZE 0x807A
+#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A
+#define GL_VERTEX_ARRAY_STRIDE 0x807C
+#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C
+#define GL_VERTEX_ARRAY_TYPE 0x807B
+#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B
+#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650
+#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A
+#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B
+#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C
+#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D
+#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E
+#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F
+#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651
+#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652
+#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653
+#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654
+#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655
+#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656
+#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657
+#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658
+#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
+#define GL_VERTEX_PROGRAM_ARB 0x8620
+#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A
+#define GL_VERTEX_PROGRAM_NV 0x8620
+#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
+#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643
+#define GL_VERTEX_SHADER_ARB 0x8B31
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#define GL_VERTEX_STATE_PROGRAM_NV 0x8621
+#define GL_VIEWPORT 0x0BA2
+#define GL_VIEWPORT_BIT 0x00000800
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E
+#define GL_WRITE_ONLY_ARB 0x88B9
+#define GL_XOR 0x1506
+#define GL_ZERO 0
+#define GL_ZOOM_X 0x0D16
+#define GL_ZOOM_Y 0x0D17
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_ADD_SIGNED 0x8574
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_BLEND_DST_ALPHA_OES 0x80CA
+#define GL_BLEND_DST_RGB_OES 0x80C8
+#define GL_BLEND_EQUATION_ALPHA_OES 0x883D
+#define GL_BLEND_EQUATION_OES 0x8009
+#define GL_BLEND_EQUATION_RGB_OES 0x8009
+#define GL_BLEND_SRC_ALPHA_OES 0x80CB
+#define GL_BLEND_SRC_RGB_OES 0x80C9
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1
+#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898
+#define GL_COLOR_ATTACHMENT0_OES 0x8CE0
+#define GL_COMBINE 0x8570
+#define GL_COMBINE_ALPHA 0x8572
+#define GL_COMBINE_RGB 0x8571
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_CONSTANT 0x8576
+#define GL_DEPTH24_STENCIL8_OES 0x88F0
+#define GL_DEPTH_ATTACHMENT_OES 0x8D00
+#define GL_DEPTH_COMPONENT16_OES 0x81A5
+#define GL_DEPTH_STENCIL_OES 0x84F9
+#define GL_DOT3_RGB 0x86AE
+#define GL_DOT3_RGBA 0x86AF
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_FIXED 0x140C
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES 0x8CD2
+#define GL_FRAMEBUFFER_BINDING_OES 0x8CA6
+#define GL_FRAMEBUFFER_COMPLETE_OES 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES 0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES 0x8CDA
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES 0x8CD7
+#define GL_FRAMEBUFFER_OES 0x8D40
+#define GL_FRAMEBUFFER_UNSUPPORTED_OES 0x8CDD
+#define GL_FUNC_ADD_OES 0x8006
+#define GL_FUNC_REVERSE_SUBTRACT_OES 0x800B
+#define GL_FUNC_SUBTRACT_OES 0x800A
+#define GL_GENERATE_MIPMAP 0x8191
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_INTERPOLATE 0x8575
+#define GL_INVALID_FRAMEBUFFER_OPERATION_OES 0x0506
+#define GL_MAX_RENDERBUFFER_SIZE_OES 0x84E8
+#define GL_MAX_TEXTURE_UNITS 0x84E2
+#define GL_MULTISAMPLE 0x809D
+#define GL_NONE_OES 0
+#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_OPERAND0_ALPHA 0x8598
+#define GL_OPERAND0_RGB 0x8590
+#define GL_OPERAND1_ALPHA 0x8599
+#define GL_OPERAND1_RGB 0x8591
+#define GL_OPERAND2_ALPHA 0x859A
+#define GL_OPERAND2_RGB 0x8592
+#define GL_POINT_DISTANCE_ATTENUATION 0x8129
+#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128
+#define GL_POINT_SIZE_MAX 0x8127
+#define GL_POINT_SIZE_MIN 0x8126
+#define GL_PREVIOUS 0x8578
+#define GL_PRIMARY_COLOR 0x8577
+#define GL_RENDERBUFFER_ALPHA_SIZE_OES 0x8D53
+#define GL_RENDERBUFFER_BINDING_OES 0x8CA7
+#define GL_RENDERBUFFER_BLUE_SIZE_OES 0x8D52
+#define GL_RENDERBUFFER_DEPTH_SIZE_OES 0x8D54
+#define GL_RENDERBUFFER_GREEN_SIZE_OES 0x8D51
+#define GL_RENDERBUFFER_HEIGHT_OES 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_OES 0x8D44
+#define GL_RENDERBUFFER_OES 0x8D41
+#define GL_RENDERBUFFER_RED_SIZE_OES 0x8D50
+#define GL_RENDERBUFFER_STENCIL_SIZE_OES 0x8D55
+#define GL_RENDERBUFFER_WIDTH_OES 0x8D42
+#define GL_RESCALE_NORMAL 0x803A
+#define GL_RGB565_OES 0x8D62
+#define GL_RGB5_A1_OES 0x8057
+#define GL_RGBA4_OES 0x8056
+#define GL_RGB_SCALE 0x8573
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE 0x809F
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22
+#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12
+#define GL_SOURCE0_ALPHA 0x8588
+#define GL_SOURCE0_RGB 0x8580
+#define GL_SOURCE1_ALPHA 0x8589
+#define GL_SOURCE1_RGB 0x8581
+#define GL_SOURCE2_ALPHA 0x858A
+#define GL_SOURCE2_RGB 0x8582
+#define GL_SRC0_ALPHA 0x8588
+#define GL_SRC0_RGB 0x8580
+#define GL_SRC1_ALPHA 0x8589
+#define GL_SRC1_RGB 0x8581
+#define GL_SRC2_ALPHA 0x858A
+#define GL_SRC2_RGB 0x8582
+#define GL_STATIC_DRAW 0x88E4
+#define GL_STENCIL_ATTACHMENT_OES 0x8D20
+#define GL_SUBTRACT 0x84E7
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A
+#define GL_UNSIGNED_INT_24_8_OES 0x84FA
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_VERSION_ES_CL_1_0 1
+#define GL_VERSION_ES_CL_1_1 1
+#define GL_VERSION_ES_CM_1_1 1
+#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896
+
+
+#ifndef __khrplatform_h_
+#define __khrplatform_h_
+
+/*
+** Copyright (c) 2008-2018 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+/* Khronos platform-specific types and definitions.
+ *
+ * The master copy of khrplatform.h is maintained in the Khronos EGL
+ * Registry repository at https://github.com/KhronosGroup/EGL-Registry
+ * The last semantic modification to khrplatform.h was at commit ID:
+ * 67a3e0864c2d75ea5287b9f3d2eb74a745936692
+ *
+ * Adopters may modify this file to suit their platform. Adopters are
+ * encouraged to submit platform specific modifications to the Khronos
+ * group so that they can be included in future versions of this file.
+ * Please submit changes by filing pull requests or issues on
+ * the EGL Registry repository linked above.
+ *
+ *
+ * See the Implementer's Guidelines for information about where this file
+ * should be located on your system and for more details of its use:
+ * http://www.khronos.org/registry/implementers_guide.pdf
+ *
+ * This file should be included as
+ * #include <KHR/khrplatform.h>
+ * by Khronos client API header files that use its types and defines.
+ *
+ * The types in khrplatform.h should only be used to define API-specific types.
+ *
+ * Types defined in khrplatform.h:
+ * khronos_int8_t signed 8 bit
+ * khronos_uint8_t unsigned 8 bit
+ * khronos_int16_t signed 16 bit
+ * khronos_uint16_t unsigned 16 bit
+ * khronos_int32_t signed 32 bit
+ * khronos_uint32_t unsigned 32 bit
+ * khronos_int64_t signed 64 bit
+ * khronos_uint64_t unsigned 64 bit
+ * khronos_intptr_t signed same number of bits as a pointer
+ * khronos_uintptr_t unsigned same number of bits as a pointer
+ * khronos_ssize_t signed size
+ * khronos_usize_t unsigned size
+ * khronos_float_t signed 32 bit floating point
+ * khronos_time_ns_t unsigned 64 bit time in nanoseconds
+ * khronos_utime_nanoseconds_t unsigned time interval or absolute time in
+ * nanoseconds
+ * khronos_stime_nanoseconds_t signed time interval in nanoseconds
+ * khronos_boolean_enum_t enumerated boolean type. This should
+ * only be used as a base type when a client API's boolean type is
+ * an enum. Client APIs which use an integer or other type for
+ * booleans cannot use this as the base type for their boolean.
+ *
+ * Tokens defined in khrplatform.h:
+ *
+ * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
+ *
+ * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
+ * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
+ *
+ * Calling convention macros defined in this file:
+ * KHRONOS_APICALL
+ * KHRONOS_GLAD_API_PTR
+ * KHRONOS_APIATTRIBUTES
+ *
+ * These may be used in function prototypes as:
+ *
+ * KHRONOS_APICALL void KHRONOS_GLAD_API_PTR funcname(
+ * int arg1,
+ * int arg2) KHRONOS_APIATTRIBUTES;
+ */
+
+#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC)
+# define KHRONOS_STATIC 1
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APICALL
+ *-------------------------------------------------------------------------
+ * This precedes the return type of the function in the function prototype.
+ */
+#if defined(KHRONOS_STATIC)
+ /* If the preprocessor constant KHRONOS_STATIC is defined, make the
+ * header compatible with static linking. */
+# define KHRONOS_APICALL
+#elif defined(_WIN32)
+# define KHRONOS_APICALL __declspec(dllimport)
+#elif defined (__SYMBIAN32__)
+# define KHRONOS_APICALL IMPORT_C
+#elif defined(__ANDROID__)
+# define KHRONOS_APICALL __attribute__((visibility("default")))
+#else
+# define KHRONOS_APICALL
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_GLAD_API_PTR
+ *-------------------------------------------------------------------------
+ * This follows the return type of the function and precedes the function
+ * name in the function prototype.
+ */
+#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(KHRONOS_STATIC)
+ /* Win32 but not WinCE */
+# define KHRONOS_GLAD_API_PTR __stdcall
+#else
+# define KHRONOS_GLAD_API_PTR
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APIATTRIBUTES
+ *-------------------------------------------------------------------------
+ * This follows the closing parenthesis of the function prototype arguments.
+ */
+#if defined (__ARMCC_2__)
+#define KHRONOS_APIATTRIBUTES __softfp
+#else
+#define KHRONOS_APIATTRIBUTES
+#endif
+
+/*-------------------------------------------------------------------------
+ * basic type definitions
+ *-----------------------------------------------------------------------*/
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
+
+
+/*
+ * Using <stdint.h>
+ */
+#include <stdint.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(__VMS ) || defined(__sgi)
+
+/*
+ * Using <inttypes.h>
+ */
+#include <inttypes.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
+
+/*
+ * Win32
+ */
+typedef __int32 khronos_int32_t;
+typedef unsigned __int32 khronos_uint32_t;
+typedef __int64 khronos_int64_t;
+typedef unsigned __int64 khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(__sun__) || defined(__digital__)
+
+/*
+ * Sun or Digital
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#if defined(__arch64__) || defined(_LP64)
+typedef long int khronos_int64_t;
+typedef unsigned long int khronos_uint64_t;
+#else
+typedef long long int khronos_int64_t;
+typedef unsigned long long int khronos_uint64_t;
+#endif /* __arch64__ */
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif 0
+
+/*
+ * Hypothetical platform with no float or int64 support
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#define KHRONOS_SUPPORT_INT64 0
+#define KHRONOS_SUPPORT_FLOAT 0
+
+#else
+
+/*
+ * Generic fallback
+ */
+#include <stdint.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#endif
+
+
+/*
+ * Types that are (so far) the same on all platforms
+ */
+typedef signed char khronos_int8_t;
+typedef unsigned char khronos_uint8_t;
+typedef signed short int khronos_int16_t;
+typedef unsigned short int khronos_uint16_t;
+
+/*
+ * Types that differ between LLP64 and LP64 architectures - in LLP64,
+ * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
+ * to be the only LLP64 architecture in current use.
+ */
+#ifdef _WIN64
+typedef signed long long int khronos_intptr_t;
+typedef unsigned long long int khronos_uintptr_t;
+typedef signed long long int khronos_ssize_t;
+typedef unsigned long long int khronos_usize_t;
+#else
+typedef signed long int khronos_intptr_t;
+typedef unsigned long int khronos_uintptr_t;
+typedef signed long int khronos_ssize_t;
+typedef unsigned long int khronos_usize_t;
+#endif
+
+#if KHRONOS_SUPPORT_FLOAT
+/*
+ * Float type
+ */
+typedef float khronos_float_t;
+#endif
+
+#if KHRONOS_SUPPORT_INT64
+/* Time types
+ *
+ * These types can be used to represent a time interval in nanoseconds or
+ * an absolute Unadjusted System Time. Unadjusted System Time is the number
+ * of nanoseconds since some arbitrary system event (e.g. since the last
+ * time the system booted). The Unadjusted System Time is an unsigned
+ * 64 bit value that wraps back to 0 every 584 years. Time intervals
+ * may be either signed or unsigned.
+ */
+typedef khronos_uint64_t khronos_utime_nanoseconds_t;
+typedef khronos_int64_t khronos_stime_nanoseconds_t;
+#endif
+
+/*
+ * Dummy value used to pad enum types to 32 bits.
+ */
+#ifndef KHRONOS_MAX_ENUM
+#define KHRONOS_MAX_ENUM 0x7FFFFFFF
+#endif
+
+/*
+ * Enumerated boolean type
+ *
+ * Values other than zero should be considered to be true. Therefore
+ * comparisons should not be made against KHRONOS_TRUE.
+ */
+typedef enum {
+ KHRONOS_FALSE = 0,
+ KHRONOS_TRUE = 1,
+ KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
+} khronos_boolean_enum_t;
+
+#endif /* __khrplatform_h_ */
+typedef unsigned int GLenum;
+typedef unsigned char GLboolean;
+typedef unsigned int GLbitfield;
+typedef void GLvoid;
+typedef khronos_int8_t GLbyte;
+typedef khronos_uint8_t GLubyte;
+typedef khronos_int16_t GLshort;
+typedef khronos_uint16_t GLushort;
+typedef int GLint;
+typedef unsigned int GLuint;
+typedef khronos_int32_t GLclampx;
+typedef int GLsizei;
+typedef khronos_float_t GLfloat;
+typedef khronos_float_t GLclampf;
+typedef double GLdouble;
+typedef double GLclampd;
+typedef void *GLeglClientBufferEXT;
+typedef void *GLeglImageOES;
+typedef char GLchar;
+typedef char GLcharARB;
+#ifdef __APPLE__
+typedef void *GLhandleARB;
+#else
+typedef unsigned int GLhandleARB;
+#endif
+typedef khronos_uint16_t GLhalf;
+typedef khronos_uint16_t GLhalfARB;
+typedef khronos_int32_t GLfixed;
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_intptr_t GLintptr;
+#else
+typedef khronos_intptr_t GLintptr;
+#endif
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_intptr_t GLintptrARB;
+#else
+typedef khronos_intptr_t GLintptrARB;
+#endif
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_ssize_t GLsizeiptr;
+#else
+typedef khronos_ssize_t GLsizeiptr;
+#endif
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_ssize_t GLsizeiptrARB;
+#else
+typedef khronos_ssize_t GLsizeiptrARB;
+#endif
+typedef khronos_int64_t GLint64;
+typedef khronos_int64_t GLint64EXT;
+typedef khronos_uint64_t GLuint64;
+typedef khronos_uint64_t GLuint64EXT;
+typedef struct __GLsync *GLsync;
+struct _cl_context;
+struct _cl_event;
+typedef void ( *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+typedef void ( *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+typedef void ( *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+typedef void ( *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam);
+typedef unsigned short GLhalfNV;
+typedef GLintptr GLvdpauSurfaceNV;
+typedef void ( *GLVULKANPROCNV)(void);
+
+
+#define GL_VERSION_1_0 1
+GLAD_API_CALL int GLAD_GL_VERSION_1_0;
+#define GL_VERSION_1_1 1
+GLAD_API_CALL int GLAD_GL_VERSION_1_1;
+#define GL_VERSION_ES_CM_1_0 1
+GLAD_API_CALL int GLAD_GL_VERSION_ES_CM_1_0;
+#define GL_ARB_copy_buffer 1
+GLAD_API_CALL int GLAD_GL_ARB_copy_buffer;
+#define GL_ARB_fragment_shader 1
+GLAD_API_CALL int GLAD_GL_ARB_fragment_shader;
+#define GL_ARB_framebuffer_object 1
+GLAD_API_CALL int GLAD_GL_ARB_framebuffer_object;
+#define GL_ARB_geometry_shader4 1
+GLAD_API_CALL int GLAD_GL_ARB_geometry_shader4;
+#define GL_ARB_get_program_binary 1
+GLAD_API_CALL int GLAD_GL_ARB_get_program_binary;
+#define GL_ARB_imaging 1
+GLAD_API_CALL int GLAD_GL_ARB_imaging;
+#define GL_ARB_multitexture 1
+GLAD_API_CALL int GLAD_GL_ARB_multitexture;
+#define GL_ARB_separate_shader_objects 1
+GLAD_API_CALL int GLAD_GL_ARB_separate_shader_objects;
+#define GL_ARB_shader_objects 1
+GLAD_API_CALL int GLAD_GL_ARB_shader_objects;
+#define GL_ARB_shading_language_100 1
+GLAD_API_CALL int GLAD_GL_ARB_shading_language_100;
+#define GL_ARB_texture_non_power_of_two 1
+GLAD_API_CALL int GLAD_GL_ARB_texture_non_power_of_two;
+#define GL_ARB_vertex_buffer_object 1
+GLAD_API_CALL int GLAD_GL_ARB_vertex_buffer_object;
+#define GL_ARB_vertex_program 1
+GLAD_API_CALL int GLAD_GL_ARB_vertex_program;
+#define GL_ARB_vertex_shader 1
+GLAD_API_CALL int GLAD_GL_ARB_vertex_shader;
+#define GL_EXT_blend_equation_separate 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_equation_separate;
+#define GL_EXT_blend_func_separate 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_func_separate;
+#define GL_EXT_blend_minmax 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_minmax;
+#define GL_EXT_blend_subtract 1
+GLAD_API_CALL int GLAD_GL_EXT_blend_subtract;
+#define GL_EXT_copy_texture 1
+GLAD_API_CALL int GLAD_GL_EXT_copy_texture;
+#define GL_EXT_framebuffer_blit 1
+GLAD_API_CALL int GLAD_GL_EXT_framebuffer_blit;
+#define GL_EXT_framebuffer_multisample 1
+GLAD_API_CALL int GLAD_GL_EXT_framebuffer_multisample;
+#define GL_EXT_framebuffer_object 1
+GLAD_API_CALL int GLAD_GL_EXT_framebuffer_object;
+#define GL_EXT_geometry_shader4 1
+GLAD_API_CALL int GLAD_GL_EXT_geometry_shader4;
+#define GL_EXT_packed_depth_stencil 1
+GLAD_API_CALL int GLAD_GL_EXT_packed_depth_stencil;
+#define GL_EXT_subtexture 1
+GLAD_API_CALL int GLAD_GL_EXT_subtexture;
+#define GL_EXT_texture_array 1
+GLAD_API_CALL int GLAD_GL_EXT_texture_array;
+#define GL_EXT_texture_object 1
+GLAD_API_CALL int GLAD_GL_EXT_texture_object;
+#define GL_EXT_texture_sRGB 1
+GLAD_API_CALL int GLAD_GL_EXT_texture_sRGB;
+#define GL_EXT_vertex_array 1
+GLAD_API_CALL int GLAD_GL_EXT_vertex_array;
+#define GL_INGR_blend_func_separate 1
+GLAD_API_CALL int GLAD_GL_INGR_blend_func_separate;
+#define GL_KHR_debug 1
+GLAD_API_CALL int GLAD_GL_KHR_debug;
+#define GL_NV_geometry_program4 1
+GLAD_API_CALL int GLAD_GL_NV_geometry_program4;
+#define GL_NV_vertex_program 1
+GLAD_API_CALL int GLAD_GL_NV_vertex_program;
+#define GL_SGIS_texture_edge_clamp 1
+GLAD_API_CALL int GLAD_GL_SGIS_texture_edge_clamp;
+#define GL_EXT_sRGB 1
+GLAD_API_CALL int GLAD_GL_EXT_sRGB;
+#define GL_OES_blend_equation_separate 1
+GLAD_API_CALL int GLAD_GL_OES_blend_equation_separate;
+#define GL_OES_blend_func_separate 1
+GLAD_API_CALL int GLAD_GL_OES_blend_func_separate;
+#define GL_OES_blend_subtract 1
+GLAD_API_CALL int GLAD_GL_OES_blend_subtract;
+#define GL_OES_framebuffer_object 1
+GLAD_API_CALL int GLAD_GL_OES_framebuffer_object;
+#define GL_OES_packed_depth_stencil 1
+GLAD_API_CALL int GLAD_GL_OES_packed_depth_stencil;
+#define GL_OES_single_precision 1
+GLAD_API_CALL int GLAD_GL_OES_single_precision;
+#define GL_OES_texture_npot 1
+GLAD_API_CALL int GLAD_GL_OES_texture_npot;
+
+
+typedef void (GLAD_API_PTR *PFNGLACCUMPROC)(GLenum op, GLfloat value);
+typedef void (GLAD_API_PTR *PFNGLACTIVESHADERPROGRAMPROC)(GLuint pipeline, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLALPHAFUNCPROC)(GLenum func, GLfloat ref);
+typedef GLboolean (GLAD_API_PTR *PFNGLAREPROGRAMSRESIDENTNVPROC)(GLsizei n, const GLuint * programs, GLboolean * residences);
+typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences);
+typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTEXTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences);
+typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTPROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTEXTPROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLATTACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB obj);
+typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLBEGINPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONARBPROC)(GLhandleARB programObj, GLuint index, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERARBPROC)(GLenum target, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMARBPROC)(GLenum target, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMNVPROC)(GLenum target, GLuint id);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREEXTPROC)(GLenum target, GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLBITMAPPROC)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap);
+typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONEXTPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEINGRPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage);
+typedef void (GLAD_API_PTR *PFNGLBUFFERDATAARBPROC)(GLenum target, GLsizeiptrARB size, const void * data, GLenum usage);
+typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data);
+typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCALLLISTPROC)(GLuint list);
+typedef void (GLAD_API_PTR *PFNGLCALLLISTSPROC)(GLsizei n, GLenum type, const void * lists);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLCLEARACCUMPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth);
+typedef void (GLAD_API_PTR *PFNGLCLEARINDEXPROC)(GLfloat c);
+typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s);
+typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEPROC)(GLenum plane, const GLdouble * equation);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3IPROC)(GLint red, GLint green, GLint blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UBVPROC)(const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UIVPROC)(const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3USVPROC)(const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4BPROC)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4DPROC)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4FPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4IPROC)(GLint red, GLint green, GLint blue, GLint alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4SPROC)(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UBPROC)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UBVPROC)(const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UIPROC)(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UIVPROC)(const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4USPROC)(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4USVPROC)(const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLORMATERIALPROC)(GLenum face, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLCOLORPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * table);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERARBPROC)(GLhandleARB shaderObj);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * image);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * image);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIPROC)(GLenum target, GLenum pname, GLint params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GLAD_API_PTR *PFNGLCOPYCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATEPROGRAMOBJECTARBPROC)(void);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATESHADEROBJECTARBPROC)(GLenum shaderType);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar *const* strings);
+typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void * userParam);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf);
+typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSARBPROC)(GLsizei n, const GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETELISTSPROC)(GLuint list, GLsizei range);
+typedef void (GLAD_API_PTR *PFNGLDELETEOBJECTARBPROC)(GLhandleARB obj);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint * pipelines);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSARBPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSNVPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESEXTPROC)(GLsizei n, const GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func);
+typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f);
+typedef void (GLAD_API_PTR *PFNGLDETACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB attachedObj);
+typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap);
+typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEPROC)(GLenum array);
+typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count);
+typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSEXTPROC)(GLenum mode, GLint first, GLsizei count);
+typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf);
+typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices);
+typedef void (GLAD_API_PTR *PFNGLDRAWPIXELSPROC)(GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPROC)(GLboolean flag);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTERPROC)(GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTEREXTPROC)(GLsizei stride, GLsizei count, const GLboolean * pointer);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGVPROC)(const GLboolean * flag);
+typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap);
+typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEPROC)(GLenum array);
+typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLENDPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLENDLISTPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DPROC)(GLdouble u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DVPROC)(const GLdouble * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FPROC)(GLfloat u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FVPROC)(const GLfloat * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DPROC)(GLdouble u, GLdouble v);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DVPROC)(const GLdouble * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FPROC)(GLfloat u, GLfloat v);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FVPROC)(const GLfloat * u);
+typedef void (GLAD_API_PTR *PFNGLEVALMESH1PROC)(GLenum mode, GLint i1, GLint i2);
+typedef void (GLAD_API_PTR *PFNGLEVALMESH2PROC)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+typedef void (GLAD_API_PTR *PFNGLEVALPOINT1PROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLEVALPOINT2PROC)(GLint i, GLint j);
+typedef void (GLAD_API_PTR *PFNGLEXECUTEPROGRAMNVPROC)(GLenum target, GLuint id, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLFEEDBACKBUFFERPROC)(GLsizei size, GLenum type, GLfloat * buffer);
+typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLFOGFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLFOGFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLFOGIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLFOGIVPROC)(GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLGENBUFFERSARBPROC)(GLsizei n, GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint * framebuffers);
+typedef GLuint (GLAD_API_PTR *PFNGLGENLISTSPROC)(GLsizei range);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSARBPROC)(GLsizei n, GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSNVPROC)(GLsizei n, GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLGENTEXTURESEXTPROC)(GLsizei n, GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPEXTPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETATTACHEDOBJECTSARBPROC)(GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj);
+typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVARBPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVARBPROC)(GLenum target, GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEPROC)(GLenum plane, GLdouble * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPROC)(GLenum target, GLenum format, GLenum type, void * table);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONFILTERPROC)(GLenum target, GLenum format, GLenum type, void * image);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog);
+typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data);
+typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLGETHANDLEARBPROC)(GLenum pname);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETINFOLOGARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog);
+typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTFVPROC)(GLenum light, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTIVPROC)(GLenum light, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETMAPDVPROC)(GLenum target, GLenum query, GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLGETMAPFVPROC)(GLenum target, GLenum query, GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLGETMAPIVPROC)(GLenum target, GLenum query, GLint * v);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALFVPROC)(GLenum face, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALIVPROC)(GLenum face, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERFVARBPROC)(GLhandleARB obj, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERIVARBPROC)(GLhandleARB obj, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPTRLABELPROC)(const void * ptr, GLsizei bufSize, GLsizei * length, GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPFVPROC)(GLenum map, GLfloat * values);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUIVPROC)(GLenum map, GLuint * values);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUSVPROC)(GLenum map, GLushort * values);
+typedef void (GLAD_API_PTR *PFNGLGETPOINTERVPROC)(GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETPOINTERVEXTPROC)(GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte * mask);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERDVNVPROC)(GLenum target, GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERFVNVPROC)(GLenum target, GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGARBPROC)(GLenum target, GLenum pname, void * string);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGNVPROC)(GLuint id, GLenum pname, GLubyte * program);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVARBPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVNVPROC)(GLuint id, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETSEPARABLEFILTERPROC)(GLenum target, GLenum format, GLenum type, void * row, void * column, void * span);
+typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source);
+typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source);
+typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENDVPROC)(GLenum coord, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENFVPROC)(GLenum coord, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENIVPROC)(GLenum coord, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTRACKMATRIXIVNVPROC)(GLenum target, GLuint address, GLenum pname, GLint * params);
+typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVARBPROC)(GLhandleARB programObj, GLint location, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVARBPROC)(GLhandleARB programObj, GLint location, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVARBPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVNVPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVARBPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVNVPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVARBPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVNVPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVARBPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVNVPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLHISTOGRAMPROC)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+typedef void (GLAD_API_PTR *PFNGLINDEXMASKPROC)(GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLINDEXPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLINDEXPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLINDEXDPROC)(GLdouble c);
+typedef void (GLAD_API_PTR *PFNGLINDEXDVPROC)(const GLdouble * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXFPROC)(GLfloat c);
+typedef void (GLAD_API_PTR *PFNGLINDEXFVPROC)(const GLfloat * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXIPROC)(GLint c);
+typedef void (GLAD_API_PTR *PFNGLINDEXIVPROC)(const GLint * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXSPROC)(GLshort c);
+typedef void (GLAD_API_PTR *PFNGLINDEXSVPROC)(const GLshort * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXUBPROC)(GLubyte c);
+typedef void (GLAD_API_PTR *PFNGLINDEXUBVPROC)(const GLubyte * c);
+typedef void (GLAD_API_PTR *PFNGLINITNAMESPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLINTERLEAVEDARRAYSPROC)(GLenum format, GLsizei stride, const void * pointer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERARBPROC)(GLuint buffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISLISTPROC)(GLuint list);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMARBPROC)(GLuint program);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMNVPROC)(GLuint id);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture);
+typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREEXTPROC)(GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIVPROC)(GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTFPROC)(GLenum light, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTFVPROC)(GLenum light, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTIPROC)(GLenum light, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTIVPROC)(GLenum light, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLLINESTIPPLEPROC)(GLint factor, GLushort pattern);
+typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width);
+typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLLISTBASEPROC)(GLuint base);
+typedef void (GLAD_API_PTR *PFNGLLOADIDENTITYPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXDPROC)(const GLdouble * m);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXFPROC)(const GLfloat * m);
+typedef void (GLAD_API_PTR *PFNGLLOADNAMEPROC)(GLuint name);
+typedef void (GLAD_API_PTR *PFNGLLOADPROGRAMNVPROC)(GLenum target, GLuint id, GLsizei len, const GLubyte * program);
+typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode);
+typedef void (GLAD_API_PTR *PFNGLMAP1DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points);
+typedef void (GLAD_API_PTR *PFNGLMAP1FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points);
+typedef void (GLAD_API_PTR *PFNGLMAP2DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points);
+typedef void (GLAD_API_PTR *PFNGLMAP2FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points);
+typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access);
+typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERARBPROC)(GLenum target, GLenum access);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID1DPROC)(GLint un, GLdouble u1, GLdouble u2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID1FPROC)(GLint un, GLfloat u1, GLfloat u2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID2DPROC)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID2FPROC)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLMATERIALFPROC)(GLenum face, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALFVPROC)(GLenum face, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLMATERIALIPROC)(GLenum face, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALIVPROC)(GLenum face, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLMATRIXMODEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLMINMAXPROC)(GLenum target, GLenum internalformat, GLboolean sink);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXDPROC)(const GLdouble * m);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXFPROC)(const GLfloat * m);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DPROC)(GLenum target, GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DARBPROC)(GLenum target, GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FPROC)(GLenum target, GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FARBPROC)(GLenum target, GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IPROC)(GLenum target, GLint s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IARBPROC)(GLenum target, GLint s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SPROC)(GLenum target, GLshort s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SARBPROC)(GLenum target, GLshort s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DPROC)(GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DARBPROC)(GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FPROC)(GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FARBPROC)(GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IPROC)(GLenum target, GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IARBPROC)(GLenum target, GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SPROC)(GLenum target, GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SARBPROC)(GLenum target, GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IPROC)(GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IARBPROC)(GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SPROC)(GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IARBPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLNEWLISTPROC)(GLuint list, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3BPROC)(GLbyte nx, GLbyte ny, GLbyte nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3DPROC)(GLdouble nx, GLdouble ny, GLdouble nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3FPROC)(GLfloat nx, GLfloat ny, GLfloat nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3IPROC)(GLint nx, GLint ny, GLint nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3SPROC)(GLshort nx, GLshort ny, GLshort nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLNORMALPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLNORMALPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELPROC)(const void * ptr, GLsizei length, const GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLORTHOPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+typedef void (GLAD_API_PTR *PFNGLPASSTHROUGHPROC)(GLfloat token);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPFVPROC)(GLenum map, GLsizei mapsize, const GLfloat * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPUIVPROC)(GLenum map, GLsizei mapsize, const GLuint * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPUSVPROC)(GLenum map, GLsizei mapsize, const GLushort * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLPIXELZOOMPROC)(GLfloat xfactor, GLfloat yfactor);
+typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONSTIPPLEPROC)(const GLubyte * mask);
+typedef void (GLAD_API_PTR *PFNGLPOPATTRIBPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPCLIENTATTRIBPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPMATRIXPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPNAMEPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESPROC)(GLsizei n, const GLuint * textures, const GLfloat * priorities);
+typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESEXTPROC)(GLsizei n, const GLuint * textures, const GLclampf * priorities);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLsizei length);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DNVPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DVNVPROC)(GLenum target, GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FNVPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FVNVPROC)(GLenum target, GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIARBPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIEXTPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4DVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4FVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMSTRINGARBPROC)(GLenum target, GLenum format, GLsizei len, const void * string);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DPROC)(GLuint program, GLint location, GLdouble v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FPROC)(GLuint program, GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IPROC)(GLuint program, GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIPROC)(GLuint program, GLint location, GLuint v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IPROC)(GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMVERTEXLIMITNVPROC)(GLenum target, GLint limit);
+typedef void (GLAD_API_PTR *PFNGLPUSHATTRIBPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message);
+typedef void (GLAD_API_PTR *PFNGLPUSHMATRIXPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPUSHNAMEPROC)(GLuint name);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DPROC)(GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FPROC)(GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IPROC)(GLint x, GLint y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SPROC)(GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IPROC)(GLint x, GLint y, GLint z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SPROC)(GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IPROC)(GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src);
+typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLRECTDPROC)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+typedef void (GLAD_API_PTR *PFNGLRECTDVPROC)(const GLdouble * v1, const GLdouble * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTFPROC)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+typedef void (GLAD_API_PTR *PFNGLRECTFVPROC)(const GLfloat * v1, const GLfloat * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTIPROC)(GLint x1, GLint y1, GLint x2, GLint y2);
+typedef void (GLAD_API_PTR *PFNGLRECTIVPROC)(const GLint * v1, const GLint * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTSPROC)(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+typedef void (GLAD_API_PTR *PFNGLRECTSVPROC)(const GLshort * v1, const GLshort * v2);
+typedef GLint (GLAD_API_PTR *PFNGLRENDERMODEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLREQUESTRESIDENTPROGRAMSNVPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLRESETHISTOGRAMPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLRESETMINMAXPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLROTATEDPROC)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLROTATEFPROC)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLSCALEDPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLSCALEFPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLSELECTBUFFERPROC)(GLsizei size, GLuint * buffer);
+typedef void (GLAD_API_PTR *PFNGLSEPARABLEFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * row, const void * column);
+typedef void (GLAD_API_PTR *PFNGLSHADEMODELPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length);
+typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEARBPROC)(GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint * length);
+typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DPROC)(GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FPROC)(GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IPROC)(GLint s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SPROC)(GLshort s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DPROC)(GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FPROC)(GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IPROC)(GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SPROC)(GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DPROC)(GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FPROC)(GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IPROC)(GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SPROC)(GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DPROC)(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FPROC)(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IPROC)(GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SPROC)(GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLTEXENVFPROC)(GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXENVIPROC)(GLenum target, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENDPROC)(GLenum coord, GLenum pname, GLdouble param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENDVPROC)(GLenum coord, GLenum pname, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENFPROC)(GLenum coord, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENFVPROC)(GLenum coord, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENIPROC)(GLenum coord, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENIVPROC)(GLenum coord, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTRACKMATRIXNVPROC)(GLenum target, GLuint address, GLenum matrix, GLenum transform);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEDPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEFPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FARBPROC)(GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IARBPROC)(GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FARBPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IARBPROC)(GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target);
+typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERARBPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMOBJECTARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2DPROC)(GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2FPROC)(GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2IPROC)(GLint x, GLint y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2SPROC)(GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3DPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3FPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3IPROC)(GLint x, GLint y, GLint z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3SPROC)(GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4IPROC)(GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DARBPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DNVPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FARBPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FNVPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SARBPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SNVPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DARBPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DNVPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FARBPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FNVPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SARBPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SNVPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVARBPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVARBPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBARBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVARBPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVARBPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVARBPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVARBPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVARBPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBNVPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVARBPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVNVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVARBPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVARBPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERARBPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERNVPROC)(GLuint index, GLint fsize, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4UBVNVPROC)(GLuint index, GLsizei count, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLALPHAFUNCXPROC)(GLenum func, GLfixed ref);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEROESPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEROESPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONOESPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEOESPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEOESPROC)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSOESPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLCLEARCOLORXPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat d);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFOESPROC)(GLclampf depth);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHXPROC)(GLfixed depth);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFPROC)(GLenum p, const GLfloat * eqn);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFOESPROC)(GLenum plane, const GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEXPROC)(GLenum plane, const GLfixed * equation);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4XPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSOESPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSOESPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFOESPROC)(GLclampf n, GLclampf f);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEXPROC)(GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLFOGXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLFOGXVPROC)(GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEROESPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DOESPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMFPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMXPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSOESPROC)(GLsizei n, GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSOESPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPOESPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFPROC)(GLenum plane, GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFOESPROC)(GLenum plane, GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEXPROC)(GLenum plane, GLfixed * equation);
+typedef void (GLAD_API_PTR *PFNGLGETFIXEDVPROC)(GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTXVPROC)(GLenum light, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALXVPROC)(GLenum face, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVOESPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVXVPROC)(GLenum target, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERXVPROC)(GLenum target, GLenum pname, GLfixed * params);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFEROESPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFEROESPROC)(GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELXVPROC)(GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTXPROC)(GLenum light, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTXVPROC)(GLenum light, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLLINEWIDTHXPROC)(GLfixed width);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXXPROC)(const GLfixed * m);
+typedef void (GLAD_API_PTR *PFNGLMATERIALXPROC)(GLenum face, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALXVPROC)(GLenum face, GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXXPROC)(const GLfixed * m);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4XPROC)(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3XPROC)(GLfixed nx, GLfixed ny, GLfixed nz);
+typedef void (GLAD_API_PTR *PFNGLORTHOFPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLORTHOFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLORTHOXPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERXVPROC)(GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLPOINTSIZEXPROC)(GLfixed size);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETXPROC)(GLfixed factor, GLfixed units);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEOESPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLROTATEXPROC)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert);
+typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEXPROC)(GLclampx value, GLboolean invert);
+typedef void (GLAD_API_PTR *PFNGLSCALEXPROC)(GLfixed x, GLfixed y, GLfixed z);
+typedef void (GLAD_API_PTR *PFNGLTEXENVXPROC)(GLenum target, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVXVPROC)(GLenum target, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERXPROC)(GLenum target, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERXVPROC)(GLenum target, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEXPROC)(GLfixed x, GLfixed y, GLfixed z);
+
+GLAD_API_CALL PFNGLACCUMPROC glad_glAccum;
+#define glAccum glad_glAccum
+GLAD_API_CALL PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram;
+#define glActiveShaderProgram glad_glActiveShaderProgram
+GLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture;
+#define glActiveTexture glad_glActiveTexture
+GLAD_API_CALL PFNGLACTIVETEXTUREARBPROC glad_glActiveTextureARB;
+#define glActiveTextureARB glad_glActiveTextureARB
+GLAD_API_CALL PFNGLALPHAFUNCPROC glad_glAlphaFunc;
+#define glAlphaFunc glad_glAlphaFunc
+GLAD_API_CALL PFNGLAREPROGRAMSRESIDENTNVPROC glad_glAreProgramsResidentNV;
+#define glAreProgramsResidentNV glad_glAreProgramsResidentNV
+GLAD_API_CALL PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident;
+#define glAreTexturesResident glad_glAreTexturesResident
+GLAD_API_CALL PFNGLARETEXTURESRESIDENTEXTPROC glad_glAreTexturesResidentEXT;
+#define glAreTexturesResidentEXT glad_glAreTexturesResidentEXT
+GLAD_API_CALL PFNGLARRAYELEMENTPROC glad_glArrayElement;
+#define glArrayElement glad_glArrayElement
+GLAD_API_CALL PFNGLARRAYELEMENTEXTPROC glad_glArrayElementEXT;
+#define glArrayElementEXT glad_glArrayElementEXT
+GLAD_API_CALL PFNGLATTACHOBJECTARBPROC glad_glAttachObjectARB;
+#define glAttachObjectARB glad_glAttachObjectARB
+GLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader;
+#define glAttachShader glad_glAttachShader
+GLAD_API_CALL PFNGLBEGINPROC glad_glBegin;
+#define glBegin glad_glBegin
+GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation;
+#define glBindAttribLocation glad_glBindAttribLocation
+GLAD_API_CALL PFNGLBINDATTRIBLOCATIONARBPROC glad_glBindAttribLocationARB;
+#define glBindAttribLocationARB glad_glBindAttribLocationARB
+GLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer;
+#define glBindBuffer glad_glBindBuffer
+GLAD_API_CALL PFNGLBINDBUFFERARBPROC glad_glBindBufferARB;
+#define glBindBufferARB glad_glBindBufferARB
+GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer;
+#define glBindFramebuffer glad_glBindFramebuffer
+GLAD_API_CALL PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT;
+#define glBindFramebufferEXT glad_glBindFramebufferEXT
+GLAD_API_CALL PFNGLBINDPROGRAMARBPROC glad_glBindProgramARB;
+#define glBindProgramARB glad_glBindProgramARB
+GLAD_API_CALL PFNGLBINDPROGRAMNVPROC glad_glBindProgramNV;
+#define glBindProgramNV glad_glBindProgramNV
+GLAD_API_CALL PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline;
+#define glBindProgramPipeline glad_glBindProgramPipeline
+GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer;
+#define glBindRenderbuffer glad_glBindRenderbuffer
+GLAD_API_CALL PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT;
+#define glBindRenderbufferEXT glad_glBindRenderbufferEXT
+GLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture;
+#define glBindTexture glad_glBindTexture
+GLAD_API_CALL PFNGLBINDTEXTUREEXTPROC glad_glBindTextureEXT;
+#define glBindTextureEXT glad_glBindTextureEXT
+GLAD_API_CALL PFNGLBITMAPPROC glad_glBitmap;
+#define glBitmap glad_glBitmap
+GLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor;
+#define glBlendColor glad_glBlendColor
+GLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation;
+#define glBlendEquation glad_glBlendEquation
+GLAD_API_CALL PFNGLBLENDEQUATIONEXTPROC glad_glBlendEquationEXT;
+#define glBlendEquationEXT glad_glBlendEquationEXT
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate;
+#define glBlendEquationSeparate glad_glBlendEquationSeparate
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEEXTPROC glad_glBlendEquationSeparateEXT;
+#define glBlendEquationSeparateEXT glad_glBlendEquationSeparateEXT
+GLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc;
+#define glBlendFunc glad_glBlendFunc
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate;
+#define glBlendFuncSeparate glad_glBlendFuncSeparate
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEEXTPROC glad_glBlendFuncSeparateEXT;
+#define glBlendFuncSeparateEXT glad_glBlendFuncSeparateEXT
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEINGRPROC glad_glBlendFuncSeparateINGR;
+#define glBlendFuncSeparateINGR glad_glBlendFuncSeparateINGR
+GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer;
+#define glBlitFramebuffer glad_glBlitFramebuffer
+GLAD_API_CALL PFNGLBLITFRAMEBUFFEREXTPROC glad_glBlitFramebufferEXT;
+#define glBlitFramebufferEXT glad_glBlitFramebufferEXT
+GLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData;
+#define glBufferData glad_glBufferData
+GLAD_API_CALL PFNGLBUFFERDATAARBPROC glad_glBufferDataARB;
+#define glBufferDataARB glad_glBufferDataARB
+GLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData;
+#define glBufferSubData glad_glBufferSubData
+GLAD_API_CALL PFNGLBUFFERSUBDATAARBPROC glad_glBufferSubDataARB;
+#define glBufferSubDataARB glad_glBufferSubDataARB
+GLAD_API_CALL PFNGLCALLLISTPROC glad_glCallList;
+#define glCallList glad_glCallList
+GLAD_API_CALL PFNGLCALLLISTSPROC glad_glCallLists;
+#define glCallLists glad_glCallLists
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus;
+#define glCheckFramebufferStatus glad_glCheckFramebufferStatus
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT;
+#define glCheckFramebufferStatusEXT glad_glCheckFramebufferStatusEXT
+GLAD_API_CALL PFNGLCLEARPROC glad_glClear;
+#define glClear glad_glClear
+GLAD_API_CALL PFNGLCLEARACCUMPROC glad_glClearAccum;
+#define glClearAccum glad_glClearAccum
+GLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor;
+#define glClearColor glad_glClearColor
+GLAD_API_CALL PFNGLCLEARDEPTHPROC glad_glClearDepth;
+#define glClearDepth glad_glClearDepth
+GLAD_API_CALL PFNGLCLEARINDEXPROC glad_glClearIndex;
+#define glClearIndex glad_glClearIndex
+GLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil;
+#define glClearStencil glad_glClearStencil
+GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture;
+#define glClientActiveTexture glad_glClientActiveTexture
+GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREARBPROC glad_glClientActiveTextureARB;
+#define glClientActiveTextureARB glad_glClientActiveTextureARB
+GLAD_API_CALL PFNGLCLIPPLANEPROC glad_glClipPlane;
+#define glClipPlane glad_glClipPlane
+GLAD_API_CALL PFNGLCOLOR3BPROC glad_glColor3b;
+#define glColor3b glad_glColor3b
+GLAD_API_CALL PFNGLCOLOR3BVPROC glad_glColor3bv;
+#define glColor3bv glad_glColor3bv
+GLAD_API_CALL PFNGLCOLOR3DPROC glad_glColor3d;
+#define glColor3d glad_glColor3d
+GLAD_API_CALL PFNGLCOLOR3DVPROC glad_glColor3dv;
+#define glColor3dv glad_glColor3dv
+GLAD_API_CALL PFNGLCOLOR3FPROC glad_glColor3f;
+#define glColor3f glad_glColor3f
+GLAD_API_CALL PFNGLCOLOR3FVPROC glad_glColor3fv;
+#define glColor3fv glad_glColor3fv
+GLAD_API_CALL PFNGLCOLOR3IPROC glad_glColor3i;
+#define glColor3i glad_glColor3i
+GLAD_API_CALL PFNGLCOLOR3IVPROC glad_glColor3iv;
+#define glColor3iv glad_glColor3iv
+GLAD_API_CALL PFNGLCOLOR3SPROC glad_glColor3s;
+#define glColor3s glad_glColor3s
+GLAD_API_CALL PFNGLCOLOR3SVPROC glad_glColor3sv;
+#define glColor3sv glad_glColor3sv
+GLAD_API_CALL PFNGLCOLOR3UBPROC glad_glColor3ub;
+#define glColor3ub glad_glColor3ub
+GLAD_API_CALL PFNGLCOLOR3UBVPROC glad_glColor3ubv;
+#define glColor3ubv glad_glColor3ubv
+GLAD_API_CALL PFNGLCOLOR3UIPROC glad_glColor3ui;
+#define glColor3ui glad_glColor3ui
+GLAD_API_CALL PFNGLCOLOR3UIVPROC glad_glColor3uiv;
+#define glColor3uiv glad_glColor3uiv
+GLAD_API_CALL PFNGLCOLOR3USPROC glad_glColor3us;
+#define glColor3us glad_glColor3us
+GLAD_API_CALL PFNGLCOLOR3USVPROC glad_glColor3usv;
+#define glColor3usv glad_glColor3usv
+GLAD_API_CALL PFNGLCOLOR4BPROC glad_glColor4b;
+#define glColor4b glad_glColor4b
+GLAD_API_CALL PFNGLCOLOR4BVPROC glad_glColor4bv;
+#define glColor4bv glad_glColor4bv
+GLAD_API_CALL PFNGLCOLOR4DPROC glad_glColor4d;
+#define glColor4d glad_glColor4d
+GLAD_API_CALL PFNGLCOLOR4DVPROC glad_glColor4dv;
+#define glColor4dv glad_glColor4dv
+GLAD_API_CALL PFNGLCOLOR4FPROC glad_glColor4f;
+#define glColor4f glad_glColor4f
+GLAD_API_CALL PFNGLCOLOR4FVPROC glad_glColor4fv;
+#define glColor4fv glad_glColor4fv
+GLAD_API_CALL PFNGLCOLOR4IPROC glad_glColor4i;
+#define glColor4i glad_glColor4i
+GLAD_API_CALL PFNGLCOLOR4IVPROC glad_glColor4iv;
+#define glColor4iv glad_glColor4iv
+GLAD_API_CALL PFNGLCOLOR4SPROC glad_glColor4s;
+#define glColor4s glad_glColor4s
+GLAD_API_CALL PFNGLCOLOR4SVPROC glad_glColor4sv;
+#define glColor4sv glad_glColor4sv
+GLAD_API_CALL PFNGLCOLOR4UBPROC glad_glColor4ub;
+#define glColor4ub glad_glColor4ub
+GLAD_API_CALL PFNGLCOLOR4UBVPROC glad_glColor4ubv;
+#define glColor4ubv glad_glColor4ubv
+GLAD_API_CALL PFNGLCOLOR4UIPROC glad_glColor4ui;
+#define glColor4ui glad_glColor4ui
+GLAD_API_CALL PFNGLCOLOR4UIVPROC glad_glColor4uiv;
+#define glColor4uiv glad_glColor4uiv
+GLAD_API_CALL PFNGLCOLOR4USPROC glad_glColor4us;
+#define glColor4us glad_glColor4us
+GLAD_API_CALL PFNGLCOLOR4USVPROC glad_glColor4usv;
+#define glColor4usv glad_glColor4usv
+GLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask;
+#define glColorMask glad_glColorMask
+GLAD_API_CALL PFNGLCOLORMATERIALPROC glad_glColorMaterial;
+#define glColorMaterial glad_glColorMaterial
+GLAD_API_CALL PFNGLCOLORPOINTERPROC glad_glColorPointer;
+#define glColorPointer glad_glColorPointer
+GLAD_API_CALL PFNGLCOLORPOINTEREXTPROC glad_glColorPointerEXT;
+#define glColorPointerEXT glad_glColorPointerEXT
+GLAD_API_CALL PFNGLCOLORSUBTABLEPROC glad_glColorSubTable;
+#define glColorSubTable glad_glColorSubTable
+GLAD_API_CALL PFNGLCOLORTABLEPROC glad_glColorTable;
+#define glColorTable glad_glColorTable
+GLAD_API_CALL PFNGLCOLORTABLEPARAMETERFVPROC glad_glColorTableParameterfv;
+#define glColorTableParameterfv glad_glColorTableParameterfv
+GLAD_API_CALL PFNGLCOLORTABLEPARAMETERIVPROC glad_glColorTableParameteriv;
+#define glColorTableParameteriv glad_glColorTableParameteriv
+GLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader;
+#define glCompileShader glad_glCompileShader
+GLAD_API_CALL PFNGLCOMPILESHADERARBPROC glad_glCompileShaderARB;
+#define glCompileShaderARB glad_glCompileShaderARB
+GLAD_API_CALL PFNGLCONVOLUTIONFILTER1DPROC glad_glConvolutionFilter1D;
+#define glConvolutionFilter1D glad_glConvolutionFilter1D
+GLAD_API_CALL PFNGLCONVOLUTIONFILTER2DPROC glad_glConvolutionFilter2D;
+#define glConvolutionFilter2D glad_glConvolutionFilter2D
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFPROC glad_glConvolutionParameterf;
+#define glConvolutionParameterf glad_glConvolutionParameterf
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFVPROC glad_glConvolutionParameterfv;
+#define glConvolutionParameterfv glad_glConvolutionParameterfv
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIPROC glad_glConvolutionParameteri;
+#define glConvolutionParameteri glad_glConvolutionParameteri
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIVPROC glad_glConvolutionParameteriv;
+#define glConvolutionParameteriv glad_glConvolutionParameteriv
+GLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData;
+#define glCopyBufferSubData glad_glCopyBufferSubData
+GLAD_API_CALL PFNGLCOPYCOLORSUBTABLEPROC glad_glCopyColorSubTable;
+#define glCopyColorSubTable glad_glCopyColorSubTable
+GLAD_API_CALL PFNGLCOPYCOLORTABLEPROC glad_glCopyColorTable;
+#define glCopyColorTable glad_glCopyColorTable
+GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER1DPROC glad_glCopyConvolutionFilter1D;
+#define glCopyConvolutionFilter1D glad_glCopyConvolutionFilter1D
+GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER2DPROC glad_glCopyConvolutionFilter2D;
+#define glCopyConvolutionFilter2D glad_glCopyConvolutionFilter2D
+GLAD_API_CALL PFNGLCOPYPIXELSPROC glad_glCopyPixels;
+#define glCopyPixels glad_glCopyPixels
+GLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D;
+#define glCopyTexImage1D glad_glCopyTexImage1D
+GLAD_API_CALL PFNGLCOPYTEXIMAGE1DEXTPROC glad_glCopyTexImage1DEXT;
+#define glCopyTexImage1DEXT glad_glCopyTexImage1DEXT
+GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D;
+#define glCopyTexImage2D glad_glCopyTexImage2D
+GLAD_API_CALL PFNGLCOPYTEXIMAGE2DEXTPROC glad_glCopyTexImage2DEXT;
+#define glCopyTexImage2DEXT glad_glCopyTexImage2DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D;
+#define glCopyTexSubImage1D glad_glCopyTexSubImage1D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DEXTPROC glad_glCopyTexSubImage1DEXT;
+#define glCopyTexSubImage1DEXT glad_glCopyTexSubImage1DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D;
+#define glCopyTexSubImage2D glad_glCopyTexSubImage2D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DEXTPROC glad_glCopyTexSubImage2DEXT;
+#define glCopyTexSubImage2DEXT glad_glCopyTexSubImage2DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D;
+#define glCopyTexSubImage3D glad_glCopyTexSubImage3D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DEXTPROC glad_glCopyTexSubImage3DEXT;
+#define glCopyTexSubImage3DEXT glad_glCopyTexSubImage3DEXT
+GLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram;
+#define glCreateProgram glad_glCreateProgram
+GLAD_API_CALL PFNGLCREATEPROGRAMOBJECTARBPROC glad_glCreateProgramObjectARB;
+#define glCreateProgramObjectARB glad_glCreateProgramObjectARB
+GLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader;
+#define glCreateShader glad_glCreateShader
+GLAD_API_CALL PFNGLCREATESHADEROBJECTARBPROC glad_glCreateShaderObjectARB;
+#define glCreateShaderObjectARB glad_glCreateShaderObjectARB
+GLAD_API_CALL PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv;
+#define glCreateShaderProgramv glad_glCreateShaderProgramv
+GLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace;
+#define glCullFace glad_glCullFace
+GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback;
+#define glDebugMessageCallback glad_glDebugMessageCallback
+GLAD_API_CALL PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl;
+#define glDebugMessageControl glad_glDebugMessageControl
+GLAD_API_CALL PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert;
+#define glDebugMessageInsert glad_glDebugMessageInsert
+GLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers;
+#define glDeleteBuffers glad_glDeleteBuffers
+GLAD_API_CALL PFNGLDELETEBUFFERSARBPROC glad_glDeleteBuffersARB;
+#define glDeleteBuffersARB glad_glDeleteBuffersARB
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers;
+#define glDeleteFramebuffers glad_glDeleteFramebuffers
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT;
+#define glDeleteFramebuffersEXT glad_glDeleteFramebuffersEXT
+GLAD_API_CALL PFNGLDELETELISTSPROC glad_glDeleteLists;
+#define glDeleteLists glad_glDeleteLists
+GLAD_API_CALL PFNGLDELETEOBJECTARBPROC glad_glDeleteObjectARB;
+#define glDeleteObjectARB glad_glDeleteObjectARB
+GLAD_API_CALL PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines;
+#define glDeleteProgramPipelines glad_glDeleteProgramPipelines
+GLAD_API_CALL PFNGLDELETEPROGRAMSARBPROC glad_glDeleteProgramsARB;
+#define glDeleteProgramsARB glad_glDeleteProgramsARB
+GLAD_API_CALL PFNGLDELETEPROGRAMSNVPROC glad_glDeleteProgramsNV;
+#define glDeleteProgramsNV glad_glDeleteProgramsNV
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers;
+#define glDeleteRenderbuffers glad_glDeleteRenderbuffers
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT;
+#define glDeleteRenderbuffersEXT glad_glDeleteRenderbuffersEXT
+GLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures;
+#define glDeleteTextures glad_glDeleteTextures
+GLAD_API_CALL PFNGLDELETETEXTURESEXTPROC glad_glDeleteTexturesEXT;
+#define glDeleteTexturesEXT glad_glDeleteTexturesEXT
+GLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc;
+#define glDepthFunc glad_glDepthFunc
+GLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask;
+#define glDepthMask glad_glDepthMask
+GLAD_API_CALL PFNGLDEPTHRANGEPROC glad_glDepthRange;
+#define glDepthRange glad_glDepthRange
+GLAD_API_CALL PFNGLDETACHOBJECTARBPROC glad_glDetachObjectARB;
+#define glDetachObjectARB glad_glDetachObjectARB
+GLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader;
+#define glDetachShader glad_glDetachShader
+GLAD_API_CALL PFNGLDISABLEPROC glad_glDisable;
+#define glDisable glad_glDisable
+GLAD_API_CALL PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState;
+#define glDisableClientState glad_glDisableClientState
+GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray;
+#define glDisableVertexAttribArray glad_glDisableVertexAttribArray
+GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glad_glDisableVertexAttribArrayARB;
+#define glDisableVertexAttribArrayARB glad_glDisableVertexAttribArrayARB
+GLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays;
+#define glDrawArrays glad_glDrawArrays
+GLAD_API_CALL PFNGLDRAWARRAYSEXTPROC glad_glDrawArraysEXT;
+#define glDrawArraysEXT glad_glDrawArraysEXT
+GLAD_API_CALL PFNGLDRAWBUFFERPROC glad_glDrawBuffer;
+#define glDrawBuffer glad_glDrawBuffer
+GLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements;
+#define glDrawElements glad_glDrawElements
+GLAD_API_CALL PFNGLDRAWPIXELSPROC glad_glDrawPixels;
+#define glDrawPixels glad_glDrawPixels
+GLAD_API_CALL PFNGLEDGEFLAGPROC glad_glEdgeFlag;
+#define glEdgeFlag glad_glEdgeFlag
+GLAD_API_CALL PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer;
+#define glEdgeFlagPointer glad_glEdgeFlagPointer
+GLAD_API_CALL PFNGLEDGEFLAGPOINTEREXTPROC glad_glEdgeFlagPointerEXT;
+#define glEdgeFlagPointerEXT glad_glEdgeFlagPointerEXT
+GLAD_API_CALL PFNGLEDGEFLAGVPROC glad_glEdgeFlagv;
+#define glEdgeFlagv glad_glEdgeFlagv
+GLAD_API_CALL PFNGLENABLEPROC glad_glEnable;
+#define glEnable glad_glEnable
+GLAD_API_CALL PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState;
+#define glEnableClientState glad_glEnableClientState
+GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray;
+#define glEnableVertexAttribArray glad_glEnableVertexAttribArray
+GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYARBPROC glad_glEnableVertexAttribArrayARB;
+#define glEnableVertexAttribArrayARB glad_glEnableVertexAttribArrayARB
+GLAD_API_CALL PFNGLENDPROC glad_glEnd;
+#define glEnd glad_glEnd
+GLAD_API_CALL PFNGLENDLISTPROC glad_glEndList;
+#define glEndList glad_glEndList
+GLAD_API_CALL PFNGLEVALCOORD1DPROC glad_glEvalCoord1d;
+#define glEvalCoord1d glad_glEvalCoord1d
+GLAD_API_CALL PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv;
+#define glEvalCoord1dv glad_glEvalCoord1dv
+GLAD_API_CALL PFNGLEVALCOORD1FPROC glad_glEvalCoord1f;
+#define glEvalCoord1f glad_glEvalCoord1f
+GLAD_API_CALL PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv;
+#define glEvalCoord1fv glad_glEvalCoord1fv
+GLAD_API_CALL PFNGLEVALCOORD2DPROC glad_glEvalCoord2d;
+#define glEvalCoord2d glad_glEvalCoord2d
+GLAD_API_CALL PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv;
+#define glEvalCoord2dv glad_glEvalCoord2dv
+GLAD_API_CALL PFNGLEVALCOORD2FPROC glad_glEvalCoord2f;
+#define glEvalCoord2f glad_glEvalCoord2f
+GLAD_API_CALL PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv;
+#define glEvalCoord2fv glad_glEvalCoord2fv
+GLAD_API_CALL PFNGLEVALMESH1PROC glad_glEvalMesh1;
+#define glEvalMesh1 glad_glEvalMesh1
+GLAD_API_CALL PFNGLEVALMESH2PROC glad_glEvalMesh2;
+#define glEvalMesh2 glad_glEvalMesh2
+GLAD_API_CALL PFNGLEVALPOINT1PROC glad_glEvalPoint1;
+#define glEvalPoint1 glad_glEvalPoint1
+GLAD_API_CALL PFNGLEVALPOINT2PROC glad_glEvalPoint2;
+#define glEvalPoint2 glad_glEvalPoint2
+GLAD_API_CALL PFNGLEXECUTEPROGRAMNVPROC glad_glExecuteProgramNV;
+#define glExecuteProgramNV glad_glExecuteProgramNV
+GLAD_API_CALL PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer;
+#define glFeedbackBuffer glad_glFeedbackBuffer
+GLAD_API_CALL PFNGLFINISHPROC glad_glFinish;
+#define glFinish glad_glFinish
+GLAD_API_CALL PFNGLFLUSHPROC glad_glFlush;
+#define glFlush glad_glFlush
+GLAD_API_CALL PFNGLFOGFPROC glad_glFogf;
+#define glFogf glad_glFogf
+GLAD_API_CALL PFNGLFOGFVPROC glad_glFogfv;
+#define glFogfv glad_glFogfv
+GLAD_API_CALL PFNGLFOGIPROC glad_glFogi;
+#define glFogi glad_glFogi
+GLAD_API_CALL PFNGLFOGIVPROC glad_glFogiv;
+#define glFogiv glad_glFogiv
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer;
+#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT;
+#define glFramebufferRenderbufferEXT glad_glFramebufferRenderbufferEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture;
+#define glFramebufferTexture glad_glFramebufferTexture
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D;
+#define glFramebufferTexture1D glad_glFramebufferTexture1D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT;
+#define glFramebufferTexture1DEXT glad_glFramebufferTexture1DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D;
+#define glFramebufferTexture2D glad_glFramebufferTexture2D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT;
+#define glFramebufferTexture2DEXT glad_glFramebufferTexture2DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D;
+#define glFramebufferTexture3D glad_glFramebufferTexture3D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT;
+#define glFramebufferTexture3DEXT glad_glFramebufferTexture3DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREARBPROC glad_glFramebufferTextureARB;
+#define glFramebufferTextureARB glad_glFramebufferTextureARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT;
+#define glFramebufferTextureEXT glad_glFramebufferTextureEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEARBPROC glad_glFramebufferTextureFaceARB;
+#define glFramebufferTextureFaceARB glad_glFramebufferTextureFaceARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC glad_glFramebufferTextureFaceEXT;
+#define glFramebufferTextureFaceEXT glad_glFramebufferTextureFaceEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer;
+#define glFramebufferTextureLayer glad_glFramebufferTextureLayer
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERARBPROC glad_glFramebufferTextureLayerARB;
+#define glFramebufferTextureLayerARB glad_glFramebufferTextureLayerARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC glad_glFramebufferTextureLayerEXT;
+#define glFramebufferTextureLayerEXT glad_glFramebufferTextureLayerEXT
+GLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace;
+#define glFrontFace glad_glFrontFace
+GLAD_API_CALL PFNGLFRUSTUMPROC glad_glFrustum;
+#define glFrustum glad_glFrustum
+GLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers;
+#define glGenBuffers glad_glGenBuffers
+GLAD_API_CALL PFNGLGENBUFFERSARBPROC glad_glGenBuffersARB;
+#define glGenBuffersARB glad_glGenBuffersARB
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers;
+#define glGenFramebuffers glad_glGenFramebuffers
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT;
+#define glGenFramebuffersEXT glad_glGenFramebuffersEXT
+GLAD_API_CALL PFNGLGENLISTSPROC glad_glGenLists;
+#define glGenLists glad_glGenLists
+GLAD_API_CALL PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines;
+#define glGenProgramPipelines glad_glGenProgramPipelines
+GLAD_API_CALL PFNGLGENPROGRAMSARBPROC glad_glGenProgramsARB;
+#define glGenProgramsARB glad_glGenProgramsARB
+GLAD_API_CALL PFNGLGENPROGRAMSNVPROC glad_glGenProgramsNV;
+#define glGenProgramsNV glad_glGenProgramsNV
+GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers;
+#define glGenRenderbuffers glad_glGenRenderbuffers
+GLAD_API_CALL PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT;
+#define glGenRenderbuffersEXT glad_glGenRenderbuffersEXT
+GLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures;
+#define glGenTextures glad_glGenTextures
+GLAD_API_CALL PFNGLGENTEXTURESEXTPROC glad_glGenTexturesEXT;
+#define glGenTexturesEXT glad_glGenTexturesEXT
+GLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap;
+#define glGenerateMipmap glad_glGenerateMipmap
+GLAD_API_CALL PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT;
+#define glGenerateMipmapEXT glad_glGenerateMipmapEXT
+GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib;
+#define glGetActiveAttrib glad_glGetActiveAttrib
+GLAD_API_CALL PFNGLGETACTIVEATTRIBARBPROC glad_glGetActiveAttribARB;
+#define glGetActiveAttribARB glad_glGetActiveAttribARB
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform;
+#define glGetActiveUniform glad_glGetActiveUniform
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMARBPROC glad_glGetActiveUniformARB;
+#define glGetActiveUniformARB glad_glGetActiveUniformARB
+GLAD_API_CALL PFNGLGETATTACHEDOBJECTSARBPROC glad_glGetAttachedObjectsARB;
+#define glGetAttachedObjectsARB glad_glGetAttachedObjectsARB
+GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation;
+#define glGetAttribLocation glad_glGetAttribLocation
+GLAD_API_CALL PFNGLGETATTRIBLOCATIONARBPROC glad_glGetAttribLocationARB;
+#define glGetAttribLocationARB glad_glGetAttribLocationARB
+GLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv;
+#define glGetBooleanv glad_glGetBooleanv
+GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv;
+#define glGetBufferParameteriv glad_glGetBufferParameteriv
+GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVARBPROC glad_glGetBufferParameterivARB;
+#define glGetBufferParameterivARB glad_glGetBufferParameterivARB
+GLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv;
+#define glGetBufferPointerv glad_glGetBufferPointerv
+GLAD_API_CALL PFNGLGETBUFFERPOINTERVARBPROC glad_glGetBufferPointervARB;
+#define glGetBufferPointervARB glad_glGetBufferPointervARB
+GLAD_API_CALL PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData;
+#define glGetBufferSubData glad_glGetBufferSubData
+GLAD_API_CALL PFNGLGETBUFFERSUBDATAARBPROC glad_glGetBufferSubDataARB;
+#define glGetBufferSubDataARB glad_glGetBufferSubDataARB
+GLAD_API_CALL PFNGLGETCLIPPLANEPROC glad_glGetClipPlane;
+#define glGetClipPlane glad_glGetClipPlane
+GLAD_API_CALL PFNGLGETCOLORTABLEPROC glad_glGetColorTable;
+#define glGetColorTable glad_glGetColorTable
+GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERFVPROC glad_glGetColorTableParameterfv;
+#define glGetColorTableParameterfv glad_glGetColorTableParameterfv
+GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERIVPROC glad_glGetColorTableParameteriv;
+#define glGetColorTableParameteriv glad_glGetColorTableParameteriv
+GLAD_API_CALL PFNGLGETCONVOLUTIONFILTERPROC glad_glGetConvolutionFilter;
+#define glGetConvolutionFilter glad_glGetConvolutionFilter
+GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERFVPROC glad_glGetConvolutionParameterfv;
+#define glGetConvolutionParameterfv glad_glGetConvolutionParameterfv
+GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERIVPROC glad_glGetConvolutionParameteriv;
+#define glGetConvolutionParameteriv glad_glGetConvolutionParameteriv
+GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog;
+#define glGetDebugMessageLog glad_glGetDebugMessageLog
+GLAD_API_CALL PFNGLGETDOUBLEVPROC glad_glGetDoublev;
+#define glGetDoublev glad_glGetDoublev
+GLAD_API_CALL PFNGLGETERRORPROC glad_glGetError;
+#define glGetError glad_glGetError
+GLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv;
+#define glGetFloatv glad_glGetFloatv
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv;
+#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT;
+#define glGetFramebufferAttachmentParameterivEXT glad_glGetFramebufferAttachmentParameterivEXT
+GLAD_API_CALL PFNGLGETHANDLEARBPROC glad_glGetHandleARB;
+#define glGetHandleARB glad_glGetHandleARB
+GLAD_API_CALL PFNGLGETHISTOGRAMPROC glad_glGetHistogram;
+#define glGetHistogram glad_glGetHistogram
+GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERFVPROC glad_glGetHistogramParameterfv;
+#define glGetHistogramParameterfv glad_glGetHistogramParameterfv
+GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERIVPROC glad_glGetHistogramParameteriv;
+#define glGetHistogramParameteriv glad_glGetHistogramParameteriv
+GLAD_API_CALL PFNGLGETINFOLOGARBPROC glad_glGetInfoLogARB;
+#define glGetInfoLogARB glad_glGetInfoLogARB
+GLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv;
+#define glGetIntegerv glad_glGetIntegerv
+GLAD_API_CALL PFNGLGETLIGHTFVPROC glad_glGetLightfv;
+#define glGetLightfv glad_glGetLightfv
+GLAD_API_CALL PFNGLGETLIGHTIVPROC glad_glGetLightiv;
+#define glGetLightiv glad_glGetLightiv
+GLAD_API_CALL PFNGLGETMAPDVPROC glad_glGetMapdv;
+#define glGetMapdv glad_glGetMapdv
+GLAD_API_CALL PFNGLGETMAPFVPROC glad_glGetMapfv;
+#define glGetMapfv glad_glGetMapfv
+GLAD_API_CALL PFNGLGETMAPIVPROC glad_glGetMapiv;
+#define glGetMapiv glad_glGetMapiv
+GLAD_API_CALL PFNGLGETMATERIALFVPROC glad_glGetMaterialfv;
+#define glGetMaterialfv glad_glGetMaterialfv
+GLAD_API_CALL PFNGLGETMATERIALIVPROC glad_glGetMaterialiv;
+#define glGetMaterialiv glad_glGetMaterialiv
+GLAD_API_CALL PFNGLGETMINMAXPROC glad_glGetMinmax;
+#define glGetMinmax glad_glGetMinmax
+GLAD_API_CALL PFNGLGETMINMAXPARAMETERFVPROC glad_glGetMinmaxParameterfv;
+#define glGetMinmaxParameterfv glad_glGetMinmaxParameterfv
+GLAD_API_CALL PFNGLGETMINMAXPARAMETERIVPROC glad_glGetMinmaxParameteriv;
+#define glGetMinmaxParameteriv glad_glGetMinmaxParameteriv
+GLAD_API_CALL PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel;
+#define glGetObjectLabel glad_glGetObjectLabel
+GLAD_API_CALL PFNGLGETOBJECTPARAMETERFVARBPROC glad_glGetObjectParameterfvARB;
+#define glGetObjectParameterfvARB glad_glGetObjectParameterfvARB
+GLAD_API_CALL PFNGLGETOBJECTPARAMETERIVARBPROC glad_glGetObjectParameterivARB;
+#define glGetObjectParameterivARB glad_glGetObjectParameterivARB
+GLAD_API_CALL PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel;
+#define glGetObjectPtrLabel glad_glGetObjectPtrLabel
+GLAD_API_CALL PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv;
+#define glGetPixelMapfv glad_glGetPixelMapfv
+GLAD_API_CALL PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv;
+#define glGetPixelMapuiv glad_glGetPixelMapuiv
+GLAD_API_CALL PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv;
+#define glGetPixelMapusv glad_glGetPixelMapusv
+GLAD_API_CALL PFNGLGETPOINTERVPROC glad_glGetPointerv;
+#define glGetPointerv glad_glGetPointerv
+GLAD_API_CALL PFNGLGETPOINTERVEXTPROC glad_glGetPointervEXT;
+#define glGetPointervEXT glad_glGetPointervEXT
+GLAD_API_CALL PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple;
+#define glGetPolygonStipple glad_glGetPolygonStipple
+GLAD_API_CALL PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary;
+#define glGetProgramBinary glad_glGetProgramBinary
+GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERDVARBPROC glad_glGetProgramEnvParameterdvARB;
+#define glGetProgramEnvParameterdvARB glad_glGetProgramEnvParameterdvARB
+GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERFVARBPROC glad_glGetProgramEnvParameterfvARB;
+#define glGetProgramEnvParameterfvARB glad_glGetProgramEnvParameterfvARB
+GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glad_glGetProgramLocalParameterdvARB;
+#define glGetProgramLocalParameterdvARB glad_glGetProgramLocalParameterdvARB
+GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glad_glGetProgramLocalParameterfvARB;
+#define glGetProgramLocalParameterfvARB glad_glGetProgramLocalParameterfvARB
+GLAD_API_CALL PFNGLGETPROGRAMPARAMETERDVNVPROC glad_glGetProgramParameterdvNV;
+#define glGetProgramParameterdvNV glad_glGetProgramParameterdvNV
+GLAD_API_CALL PFNGLGETPROGRAMPARAMETERFVNVPROC glad_glGetProgramParameterfvNV;
+#define glGetProgramParameterfvNV glad_glGetProgramParameterfvNV
+GLAD_API_CALL PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog;
+#define glGetProgramPipelineInfoLog glad_glGetProgramPipelineInfoLog
+GLAD_API_CALL PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv;
+#define glGetProgramPipelineiv glad_glGetProgramPipelineiv
+GLAD_API_CALL PFNGLGETPROGRAMSTRINGARBPROC glad_glGetProgramStringARB;
+#define glGetProgramStringARB glad_glGetProgramStringARB
+GLAD_API_CALL PFNGLGETPROGRAMSTRINGNVPROC glad_glGetProgramStringNV;
+#define glGetProgramStringNV glad_glGetProgramStringNV
+GLAD_API_CALL PFNGLGETPROGRAMIVARBPROC glad_glGetProgramivARB;
+#define glGetProgramivARB glad_glGetProgramivARB
+GLAD_API_CALL PFNGLGETPROGRAMIVNVPROC glad_glGetProgramivNV;
+#define glGetProgramivNV glad_glGetProgramivNV
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv;
+#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT;
+#define glGetRenderbufferParameterivEXT glad_glGetRenderbufferParameterivEXT
+GLAD_API_CALL PFNGLGETSEPARABLEFILTERPROC glad_glGetSeparableFilter;
+#define glGetSeparableFilter glad_glGetSeparableFilter
+GLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource;
+#define glGetShaderSource glad_glGetShaderSource
+GLAD_API_CALL PFNGLGETSHADERSOURCEARBPROC glad_glGetShaderSourceARB;
+#define glGetShaderSourceARB glad_glGetShaderSourceARB
+GLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString;
+#define glGetString glad_glGetString
+GLAD_API_CALL PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv;
+#define glGetTexEnvfv glad_glGetTexEnvfv
+GLAD_API_CALL PFNGLGETTEXENVIVPROC glad_glGetTexEnviv;
+#define glGetTexEnviv glad_glGetTexEnviv
+GLAD_API_CALL PFNGLGETTEXGENDVPROC glad_glGetTexGendv;
+#define glGetTexGendv glad_glGetTexGendv
+GLAD_API_CALL PFNGLGETTEXGENFVPROC glad_glGetTexGenfv;
+#define glGetTexGenfv glad_glGetTexGenfv
+GLAD_API_CALL PFNGLGETTEXGENIVPROC glad_glGetTexGeniv;
+#define glGetTexGeniv glad_glGetTexGeniv
+GLAD_API_CALL PFNGLGETTEXIMAGEPROC glad_glGetTexImage;
+#define glGetTexImage glad_glGetTexImage
+GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv;
+#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv
+GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv;
+#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv
+GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv;
+#define glGetTexParameterfv glad_glGetTexParameterfv
+GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv;
+#define glGetTexParameteriv glad_glGetTexParameteriv
+GLAD_API_CALL PFNGLGETTRACKMATRIXIVNVPROC glad_glGetTrackMatrixivNV;
+#define glGetTrackMatrixivNV glad_glGetTrackMatrixivNV
+GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation;
+#define glGetUniformLocation glad_glGetUniformLocation
+GLAD_API_CALL PFNGLGETUNIFORMLOCATIONARBPROC glad_glGetUniformLocationARB;
+#define glGetUniformLocationARB glad_glGetUniformLocationARB
+GLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv;
+#define glGetUniformfv glad_glGetUniformfv
+GLAD_API_CALL PFNGLGETUNIFORMFVARBPROC glad_glGetUniformfvARB;
+#define glGetUniformfvARB glad_glGetUniformfvARB
+GLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv;
+#define glGetUniformiv glad_glGetUniformiv
+GLAD_API_CALL PFNGLGETUNIFORMIVARBPROC glad_glGetUniformivARB;
+#define glGetUniformivARB glad_glGetUniformivARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv;
+#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVARBPROC glad_glGetVertexAttribPointervARB;
+#define glGetVertexAttribPointervARB glad_glGetVertexAttribPointervARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVNVPROC glad_glGetVertexAttribPointervNV;
+#define glGetVertexAttribPointervNV glad_glGetVertexAttribPointervNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv;
+#define glGetVertexAttribdv glad_glGetVertexAttribdv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVARBPROC glad_glGetVertexAttribdvARB;
+#define glGetVertexAttribdvARB glad_glGetVertexAttribdvARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVNVPROC glad_glGetVertexAttribdvNV;
+#define glGetVertexAttribdvNV glad_glGetVertexAttribdvNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv;
+#define glGetVertexAttribfv glad_glGetVertexAttribfv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVARBPROC glad_glGetVertexAttribfvARB;
+#define glGetVertexAttribfvARB glad_glGetVertexAttribfvARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVNVPROC glad_glGetVertexAttribfvNV;
+#define glGetVertexAttribfvNV glad_glGetVertexAttribfvNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv;
+#define glGetVertexAttribiv glad_glGetVertexAttribiv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVARBPROC glad_glGetVertexAttribivARB;
+#define glGetVertexAttribivARB glad_glGetVertexAttribivARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVNVPROC glad_glGetVertexAttribivNV;
+#define glGetVertexAttribivNV glad_glGetVertexAttribivNV
+GLAD_API_CALL PFNGLHINTPROC glad_glHint;
+#define glHint glad_glHint
+GLAD_API_CALL PFNGLHISTOGRAMPROC glad_glHistogram;
+#define glHistogram glad_glHistogram
+GLAD_API_CALL PFNGLINDEXMASKPROC glad_glIndexMask;
+#define glIndexMask glad_glIndexMask
+GLAD_API_CALL PFNGLINDEXPOINTERPROC glad_glIndexPointer;
+#define glIndexPointer glad_glIndexPointer
+GLAD_API_CALL PFNGLINDEXPOINTEREXTPROC glad_glIndexPointerEXT;
+#define glIndexPointerEXT glad_glIndexPointerEXT
+GLAD_API_CALL PFNGLINDEXDPROC glad_glIndexd;
+#define glIndexd glad_glIndexd
+GLAD_API_CALL PFNGLINDEXDVPROC glad_glIndexdv;
+#define glIndexdv glad_glIndexdv
+GLAD_API_CALL PFNGLINDEXFPROC glad_glIndexf;
+#define glIndexf glad_glIndexf
+GLAD_API_CALL PFNGLINDEXFVPROC glad_glIndexfv;
+#define glIndexfv glad_glIndexfv
+GLAD_API_CALL PFNGLINDEXIPROC glad_glIndexi;
+#define glIndexi glad_glIndexi
+GLAD_API_CALL PFNGLINDEXIVPROC glad_glIndexiv;
+#define glIndexiv glad_glIndexiv
+GLAD_API_CALL PFNGLINDEXSPROC glad_glIndexs;
+#define glIndexs glad_glIndexs
+GLAD_API_CALL PFNGLINDEXSVPROC glad_glIndexsv;
+#define glIndexsv glad_glIndexsv
+GLAD_API_CALL PFNGLINDEXUBPROC glad_glIndexub;
+#define glIndexub glad_glIndexub
+GLAD_API_CALL PFNGLINDEXUBVPROC glad_glIndexubv;
+#define glIndexubv glad_glIndexubv
+GLAD_API_CALL PFNGLINITNAMESPROC glad_glInitNames;
+#define glInitNames glad_glInitNames
+GLAD_API_CALL PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays;
+#define glInterleavedArrays glad_glInterleavedArrays
+GLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer;
+#define glIsBuffer glad_glIsBuffer
+GLAD_API_CALL PFNGLISBUFFERARBPROC glad_glIsBufferARB;
+#define glIsBufferARB glad_glIsBufferARB
+GLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled;
+#define glIsEnabled glad_glIsEnabled
+GLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer;
+#define glIsFramebuffer glad_glIsFramebuffer
+GLAD_API_CALL PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT;
+#define glIsFramebufferEXT glad_glIsFramebufferEXT
+GLAD_API_CALL PFNGLISLISTPROC glad_glIsList;
+#define glIsList glad_glIsList
+GLAD_API_CALL PFNGLISPROGRAMARBPROC glad_glIsProgramARB;
+#define glIsProgramARB glad_glIsProgramARB
+GLAD_API_CALL PFNGLISPROGRAMNVPROC glad_glIsProgramNV;
+#define glIsProgramNV glad_glIsProgramNV
+GLAD_API_CALL PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline;
+#define glIsProgramPipeline glad_glIsProgramPipeline
+GLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer;
+#define glIsRenderbuffer glad_glIsRenderbuffer
+GLAD_API_CALL PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT;
+#define glIsRenderbufferEXT glad_glIsRenderbufferEXT
+GLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture;
+#define glIsTexture glad_glIsTexture
+GLAD_API_CALL PFNGLISTEXTUREEXTPROC glad_glIsTextureEXT;
+#define glIsTextureEXT glad_glIsTextureEXT
+GLAD_API_CALL PFNGLLIGHTMODELFPROC glad_glLightModelf;
+#define glLightModelf glad_glLightModelf
+GLAD_API_CALL PFNGLLIGHTMODELFVPROC glad_glLightModelfv;
+#define glLightModelfv glad_glLightModelfv
+GLAD_API_CALL PFNGLLIGHTMODELIPROC glad_glLightModeli;
+#define glLightModeli glad_glLightModeli
+GLAD_API_CALL PFNGLLIGHTMODELIVPROC glad_glLightModeliv;
+#define glLightModeliv glad_glLightModeliv
+GLAD_API_CALL PFNGLLIGHTFPROC glad_glLightf;
+#define glLightf glad_glLightf
+GLAD_API_CALL PFNGLLIGHTFVPROC glad_glLightfv;
+#define glLightfv glad_glLightfv
+GLAD_API_CALL PFNGLLIGHTIPROC glad_glLighti;
+#define glLighti glad_glLighti
+GLAD_API_CALL PFNGLLIGHTIVPROC glad_glLightiv;
+#define glLightiv glad_glLightiv
+GLAD_API_CALL PFNGLLINESTIPPLEPROC glad_glLineStipple;
+#define glLineStipple glad_glLineStipple
+GLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth;
+#define glLineWidth glad_glLineWidth
+GLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram;
+#define glLinkProgram glad_glLinkProgram
+GLAD_API_CALL PFNGLLINKPROGRAMARBPROC glad_glLinkProgramARB;
+#define glLinkProgramARB glad_glLinkProgramARB
+GLAD_API_CALL PFNGLLISTBASEPROC glad_glListBase;
+#define glListBase glad_glListBase
+GLAD_API_CALL PFNGLLOADIDENTITYPROC glad_glLoadIdentity;
+#define glLoadIdentity glad_glLoadIdentity
+GLAD_API_CALL PFNGLLOADMATRIXDPROC glad_glLoadMatrixd;
+#define glLoadMatrixd glad_glLoadMatrixd
+GLAD_API_CALL PFNGLLOADMATRIXFPROC glad_glLoadMatrixf;
+#define glLoadMatrixf glad_glLoadMatrixf
+GLAD_API_CALL PFNGLLOADNAMEPROC glad_glLoadName;
+#define glLoadName glad_glLoadName
+GLAD_API_CALL PFNGLLOADPROGRAMNVPROC glad_glLoadProgramNV;
+#define glLoadProgramNV glad_glLoadProgramNV
+GLAD_API_CALL PFNGLLOGICOPPROC glad_glLogicOp;
+#define glLogicOp glad_glLogicOp
+GLAD_API_CALL PFNGLMAP1DPROC glad_glMap1d;
+#define glMap1d glad_glMap1d
+GLAD_API_CALL PFNGLMAP1FPROC glad_glMap1f;
+#define glMap1f glad_glMap1f
+GLAD_API_CALL PFNGLMAP2DPROC glad_glMap2d;
+#define glMap2d glad_glMap2d
+GLAD_API_CALL PFNGLMAP2FPROC glad_glMap2f;
+#define glMap2f glad_glMap2f
+GLAD_API_CALL PFNGLMAPBUFFERPROC glad_glMapBuffer;
+#define glMapBuffer glad_glMapBuffer
+GLAD_API_CALL PFNGLMAPBUFFERARBPROC glad_glMapBufferARB;
+#define glMapBufferARB glad_glMapBufferARB
+GLAD_API_CALL PFNGLMAPGRID1DPROC glad_glMapGrid1d;
+#define glMapGrid1d glad_glMapGrid1d
+GLAD_API_CALL PFNGLMAPGRID1FPROC glad_glMapGrid1f;
+#define glMapGrid1f glad_glMapGrid1f
+GLAD_API_CALL PFNGLMAPGRID2DPROC glad_glMapGrid2d;
+#define glMapGrid2d glad_glMapGrid2d
+GLAD_API_CALL PFNGLMAPGRID2FPROC glad_glMapGrid2f;
+#define glMapGrid2f glad_glMapGrid2f
+GLAD_API_CALL PFNGLMATERIALFPROC glad_glMaterialf;
+#define glMaterialf glad_glMaterialf
+GLAD_API_CALL PFNGLMATERIALFVPROC glad_glMaterialfv;
+#define glMaterialfv glad_glMaterialfv
+GLAD_API_CALL PFNGLMATERIALIPROC glad_glMateriali;
+#define glMateriali glad_glMateriali
+GLAD_API_CALL PFNGLMATERIALIVPROC glad_glMaterialiv;
+#define glMaterialiv glad_glMaterialiv
+GLAD_API_CALL PFNGLMATRIXMODEPROC glad_glMatrixMode;
+#define glMatrixMode glad_glMatrixMode
+GLAD_API_CALL PFNGLMINMAXPROC glad_glMinmax;
+#define glMinmax glad_glMinmax
+GLAD_API_CALL PFNGLMULTMATRIXDPROC glad_glMultMatrixd;
+#define glMultMatrixd glad_glMultMatrixd
+GLAD_API_CALL PFNGLMULTMATRIXFPROC glad_glMultMatrixf;
+#define glMultMatrixf glad_glMultMatrixf
+GLAD_API_CALL PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d;
+#define glMultiTexCoord1d glad_glMultiTexCoord1d
+GLAD_API_CALL PFNGLMULTITEXCOORD1DARBPROC glad_glMultiTexCoord1dARB;
+#define glMultiTexCoord1dARB glad_glMultiTexCoord1dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv;
+#define glMultiTexCoord1dv glad_glMultiTexCoord1dv
+GLAD_API_CALL PFNGLMULTITEXCOORD1DVARBPROC glad_glMultiTexCoord1dvARB;
+#define glMultiTexCoord1dvARB glad_glMultiTexCoord1dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f;
+#define glMultiTexCoord1f glad_glMultiTexCoord1f
+GLAD_API_CALL PFNGLMULTITEXCOORD1FARBPROC glad_glMultiTexCoord1fARB;
+#define glMultiTexCoord1fARB glad_glMultiTexCoord1fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv;
+#define glMultiTexCoord1fv glad_glMultiTexCoord1fv
+GLAD_API_CALL PFNGLMULTITEXCOORD1FVARBPROC glad_glMultiTexCoord1fvARB;
+#define glMultiTexCoord1fvARB glad_glMultiTexCoord1fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i;
+#define glMultiTexCoord1i glad_glMultiTexCoord1i
+GLAD_API_CALL PFNGLMULTITEXCOORD1IARBPROC glad_glMultiTexCoord1iARB;
+#define glMultiTexCoord1iARB glad_glMultiTexCoord1iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv;
+#define glMultiTexCoord1iv glad_glMultiTexCoord1iv
+GLAD_API_CALL PFNGLMULTITEXCOORD1IVARBPROC glad_glMultiTexCoord1ivARB;
+#define glMultiTexCoord1ivARB glad_glMultiTexCoord1ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s;
+#define glMultiTexCoord1s glad_glMultiTexCoord1s
+GLAD_API_CALL PFNGLMULTITEXCOORD1SARBPROC glad_glMultiTexCoord1sARB;
+#define glMultiTexCoord1sARB glad_glMultiTexCoord1sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv;
+#define glMultiTexCoord1sv glad_glMultiTexCoord1sv
+GLAD_API_CALL PFNGLMULTITEXCOORD1SVARBPROC glad_glMultiTexCoord1svARB;
+#define glMultiTexCoord1svARB glad_glMultiTexCoord1svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d;
+#define glMultiTexCoord2d glad_glMultiTexCoord2d
+GLAD_API_CALL PFNGLMULTITEXCOORD2DARBPROC glad_glMultiTexCoord2dARB;
+#define glMultiTexCoord2dARB glad_glMultiTexCoord2dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv;
+#define glMultiTexCoord2dv glad_glMultiTexCoord2dv
+GLAD_API_CALL PFNGLMULTITEXCOORD2DVARBPROC glad_glMultiTexCoord2dvARB;
+#define glMultiTexCoord2dvARB glad_glMultiTexCoord2dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f;
+#define glMultiTexCoord2f glad_glMultiTexCoord2f
+GLAD_API_CALL PFNGLMULTITEXCOORD2FARBPROC glad_glMultiTexCoord2fARB;
+#define glMultiTexCoord2fARB glad_glMultiTexCoord2fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv;
+#define glMultiTexCoord2fv glad_glMultiTexCoord2fv
+GLAD_API_CALL PFNGLMULTITEXCOORD2FVARBPROC glad_glMultiTexCoord2fvARB;
+#define glMultiTexCoord2fvARB glad_glMultiTexCoord2fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i;
+#define glMultiTexCoord2i glad_glMultiTexCoord2i
+GLAD_API_CALL PFNGLMULTITEXCOORD2IARBPROC glad_glMultiTexCoord2iARB;
+#define glMultiTexCoord2iARB glad_glMultiTexCoord2iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv;
+#define glMultiTexCoord2iv glad_glMultiTexCoord2iv
+GLAD_API_CALL PFNGLMULTITEXCOORD2IVARBPROC glad_glMultiTexCoord2ivARB;
+#define glMultiTexCoord2ivARB glad_glMultiTexCoord2ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s;
+#define glMultiTexCoord2s glad_glMultiTexCoord2s
+GLAD_API_CALL PFNGLMULTITEXCOORD2SARBPROC glad_glMultiTexCoord2sARB;
+#define glMultiTexCoord2sARB glad_glMultiTexCoord2sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv;
+#define glMultiTexCoord2sv glad_glMultiTexCoord2sv
+GLAD_API_CALL PFNGLMULTITEXCOORD2SVARBPROC glad_glMultiTexCoord2svARB;
+#define glMultiTexCoord2svARB glad_glMultiTexCoord2svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d;
+#define glMultiTexCoord3d glad_glMultiTexCoord3d
+GLAD_API_CALL PFNGLMULTITEXCOORD3DARBPROC glad_glMultiTexCoord3dARB;
+#define glMultiTexCoord3dARB glad_glMultiTexCoord3dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv;
+#define glMultiTexCoord3dv glad_glMultiTexCoord3dv
+GLAD_API_CALL PFNGLMULTITEXCOORD3DVARBPROC glad_glMultiTexCoord3dvARB;
+#define glMultiTexCoord3dvARB glad_glMultiTexCoord3dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f;
+#define glMultiTexCoord3f glad_glMultiTexCoord3f
+GLAD_API_CALL PFNGLMULTITEXCOORD3FARBPROC glad_glMultiTexCoord3fARB;
+#define glMultiTexCoord3fARB glad_glMultiTexCoord3fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv;
+#define glMultiTexCoord3fv glad_glMultiTexCoord3fv
+GLAD_API_CALL PFNGLMULTITEXCOORD3FVARBPROC glad_glMultiTexCoord3fvARB;
+#define glMultiTexCoord3fvARB glad_glMultiTexCoord3fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i;
+#define glMultiTexCoord3i glad_glMultiTexCoord3i
+GLAD_API_CALL PFNGLMULTITEXCOORD3IARBPROC glad_glMultiTexCoord3iARB;
+#define glMultiTexCoord3iARB glad_glMultiTexCoord3iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv;
+#define glMultiTexCoord3iv glad_glMultiTexCoord3iv
+GLAD_API_CALL PFNGLMULTITEXCOORD3IVARBPROC glad_glMultiTexCoord3ivARB;
+#define glMultiTexCoord3ivARB glad_glMultiTexCoord3ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s;
+#define glMultiTexCoord3s glad_glMultiTexCoord3s
+GLAD_API_CALL PFNGLMULTITEXCOORD3SARBPROC glad_glMultiTexCoord3sARB;
+#define glMultiTexCoord3sARB glad_glMultiTexCoord3sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv;
+#define glMultiTexCoord3sv glad_glMultiTexCoord3sv
+GLAD_API_CALL PFNGLMULTITEXCOORD3SVARBPROC glad_glMultiTexCoord3svARB;
+#define glMultiTexCoord3svARB glad_glMultiTexCoord3svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d;
+#define glMultiTexCoord4d glad_glMultiTexCoord4d
+GLAD_API_CALL PFNGLMULTITEXCOORD4DARBPROC glad_glMultiTexCoord4dARB;
+#define glMultiTexCoord4dARB glad_glMultiTexCoord4dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv;
+#define glMultiTexCoord4dv glad_glMultiTexCoord4dv
+GLAD_API_CALL PFNGLMULTITEXCOORD4DVARBPROC glad_glMultiTexCoord4dvARB;
+#define glMultiTexCoord4dvARB glad_glMultiTexCoord4dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f;
+#define glMultiTexCoord4f glad_glMultiTexCoord4f
+GLAD_API_CALL PFNGLMULTITEXCOORD4FARBPROC glad_glMultiTexCoord4fARB;
+#define glMultiTexCoord4fARB glad_glMultiTexCoord4fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv;
+#define glMultiTexCoord4fv glad_glMultiTexCoord4fv
+GLAD_API_CALL PFNGLMULTITEXCOORD4FVARBPROC glad_glMultiTexCoord4fvARB;
+#define glMultiTexCoord4fvARB glad_glMultiTexCoord4fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i;
+#define glMultiTexCoord4i glad_glMultiTexCoord4i
+GLAD_API_CALL PFNGLMULTITEXCOORD4IARBPROC glad_glMultiTexCoord4iARB;
+#define glMultiTexCoord4iARB glad_glMultiTexCoord4iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv;
+#define glMultiTexCoord4iv glad_glMultiTexCoord4iv
+GLAD_API_CALL PFNGLMULTITEXCOORD4IVARBPROC glad_glMultiTexCoord4ivARB;
+#define glMultiTexCoord4ivARB glad_glMultiTexCoord4ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s;
+#define glMultiTexCoord4s glad_glMultiTexCoord4s
+GLAD_API_CALL PFNGLMULTITEXCOORD4SARBPROC glad_glMultiTexCoord4sARB;
+#define glMultiTexCoord4sARB glad_glMultiTexCoord4sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv;
+#define glMultiTexCoord4sv glad_glMultiTexCoord4sv
+GLAD_API_CALL PFNGLMULTITEXCOORD4SVARBPROC glad_glMultiTexCoord4svARB;
+#define glMultiTexCoord4svARB glad_glMultiTexCoord4svARB
+GLAD_API_CALL PFNGLNEWLISTPROC glad_glNewList;
+#define glNewList glad_glNewList
+GLAD_API_CALL PFNGLNORMAL3BPROC glad_glNormal3b;
+#define glNormal3b glad_glNormal3b
+GLAD_API_CALL PFNGLNORMAL3BVPROC glad_glNormal3bv;
+#define glNormal3bv glad_glNormal3bv
+GLAD_API_CALL PFNGLNORMAL3DPROC glad_glNormal3d;
+#define glNormal3d glad_glNormal3d
+GLAD_API_CALL PFNGLNORMAL3DVPROC glad_glNormal3dv;
+#define glNormal3dv glad_glNormal3dv
+GLAD_API_CALL PFNGLNORMAL3FPROC glad_glNormal3f;
+#define glNormal3f glad_glNormal3f
+GLAD_API_CALL PFNGLNORMAL3FVPROC glad_glNormal3fv;
+#define glNormal3fv glad_glNormal3fv
+GLAD_API_CALL PFNGLNORMAL3IPROC glad_glNormal3i;
+#define glNormal3i glad_glNormal3i
+GLAD_API_CALL PFNGLNORMAL3IVPROC glad_glNormal3iv;
+#define glNormal3iv glad_glNormal3iv
+GLAD_API_CALL PFNGLNORMAL3SPROC glad_glNormal3s;
+#define glNormal3s glad_glNormal3s
+GLAD_API_CALL PFNGLNORMAL3SVPROC glad_glNormal3sv;
+#define glNormal3sv glad_glNormal3sv
+GLAD_API_CALL PFNGLNORMALPOINTERPROC glad_glNormalPointer;
+#define glNormalPointer glad_glNormalPointer
+GLAD_API_CALL PFNGLNORMALPOINTEREXTPROC glad_glNormalPointerEXT;
+#define glNormalPointerEXT glad_glNormalPointerEXT
+GLAD_API_CALL PFNGLOBJECTLABELPROC glad_glObjectLabel;
+#define glObjectLabel glad_glObjectLabel
+GLAD_API_CALL PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel;
+#define glObjectPtrLabel glad_glObjectPtrLabel
+GLAD_API_CALL PFNGLORTHOPROC glad_glOrtho;
+#define glOrtho glad_glOrtho
+GLAD_API_CALL PFNGLPASSTHROUGHPROC glad_glPassThrough;
+#define glPassThrough glad_glPassThrough
+GLAD_API_CALL PFNGLPIXELMAPFVPROC glad_glPixelMapfv;
+#define glPixelMapfv glad_glPixelMapfv
+GLAD_API_CALL PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv;
+#define glPixelMapuiv glad_glPixelMapuiv
+GLAD_API_CALL PFNGLPIXELMAPUSVPROC glad_glPixelMapusv;
+#define glPixelMapusv glad_glPixelMapusv
+GLAD_API_CALL PFNGLPIXELSTOREFPROC glad_glPixelStoref;
+#define glPixelStoref glad_glPixelStoref
+GLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei;
+#define glPixelStorei glad_glPixelStorei
+GLAD_API_CALL PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf;
+#define glPixelTransferf glad_glPixelTransferf
+GLAD_API_CALL PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi;
+#define glPixelTransferi glad_glPixelTransferi
+GLAD_API_CALL PFNGLPIXELZOOMPROC glad_glPixelZoom;
+#define glPixelZoom glad_glPixelZoom
+GLAD_API_CALL PFNGLPOINTSIZEPROC glad_glPointSize;
+#define glPointSize glad_glPointSize
+GLAD_API_CALL PFNGLPOLYGONMODEPROC glad_glPolygonMode;
+#define glPolygonMode glad_glPolygonMode
+GLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset;
+#define glPolygonOffset glad_glPolygonOffset
+GLAD_API_CALL PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple;
+#define glPolygonStipple glad_glPolygonStipple
+GLAD_API_CALL PFNGLPOPATTRIBPROC glad_glPopAttrib;
+#define glPopAttrib glad_glPopAttrib
+GLAD_API_CALL PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib;
+#define glPopClientAttrib glad_glPopClientAttrib
+GLAD_API_CALL PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup;
+#define glPopDebugGroup glad_glPopDebugGroup
+GLAD_API_CALL PFNGLPOPMATRIXPROC glad_glPopMatrix;
+#define glPopMatrix glad_glPopMatrix
+GLAD_API_CALL PFNGLPOPNAMEPROC glad_glPopName;
+#define glPopName glad_glPopName
+GLAD_API_CALL PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures;
+#define glPrioritizeTextures glad_glPrioritizeTextures
+GLAD_API_CALL PFNGLPRIORITIZETEXTURESEXTPROC glad_glPrioritizeTexturesEXT;
+#define glPrioritizeTexturesEXT glad_glPrioritizeTexturesEXT
+GLAD_API_CALL PFNGLPROGRAMBINARYPROC glad_glProgramBinary;
+#define glProgramBinary glad_glProgramBinary
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DARBPROC glad_glProgramEnvParameter4dARB;
+#define glProgramEnvParameter4dARB glad_glProgramEnvParameter4dARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DVARBPROC glad_glProgramEnvParameter4dvARB;
+#define glProgramEnvParameter4dvARB glad_glProgramEnvParameter4dvARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FARBPROC glad_glProgramEnvParameter4fARB;
+#define glProgramEnvParameter4fARB glad_glProgramEnvParameter4fARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FVARBPROC glad_glProgramEnvParameter4fvARB;
+#define glProgramEnvParameter4fvARB glad_glProgramEnvParameter4fvARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DARBPROC glad_glProgramLocalParameter4dARB;
+#define glProgramLocalParameter4dARB glad_glProgramLocalParameter4dARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glad_glProgramLocalParameter4dvARB;
+#define glProgramLocalParameter4dvARB glad_glProgramLocalParameter4dvARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FARBPROC glad_glProgramLocalParameter4fARB;
+#define glProgramLocalParameter4fARB glad_glProgramLocalParameter4fARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glad_glProgramLocalParameter4fvARB;
+#define glProgramLocalParameter4fvARB glad_glProgramLocalParameter4fvARB
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4DNVPROC glad_glProgramParameter4dNV;
+#define glProgramParameter4dNV glad_glProgramParameter4dNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4DVNVPROC glad_glProgramParameter4dvNV;
+#define glProgramParameter4dvNV glad_glProgramParameter4dvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4FNVPROC glad_glProgramParameter4fNV;
+#define glProgramParameter4fNV glad_glProgramParameter4fNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4FVNVPROC glad_glProgramParameter4fvNV;
+#define glProgramParameter4fvNV glad_glProgramParameter4fvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri;
+#define glProgramParameteri glad_glProgramParameteri
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIARBPROC glad_glProgramParameteriARB;
+#define glProgramParameteriARB glad_glProgramParameteriARB
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIEXTPROC glad_glProgramParameteriEXT;
+#define glProgramParameteriEXT glad_glProgramParameteriEXT
+GLAD_API_CALL PFNGLPROGRAMPARAMETERS4DVNVPROC glad_glProgramParameters4dvNV;
+#define glProgramParameters4dvNV glad_glProgramParameters4dvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETERS4FVNVPROC glad_glProgramParameters4fvNV;
+#define glProgramParameters4fvNV glad_glProgramParameters4fvNV
+GLAD_API_CALL PFNGLPROGRAMSTRINGARBPROC glad_glProgramStringARB;
+#define glProgramStringARB glad_glProgramStringARB
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d;
+#define glProgramUniform1d glad_glProgramUniform1d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv;
+#define glProgramUniform1dv glad_glProgramUniform1dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f;
+#define glProgramUniform1f glad_glProgramUniform1f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv;
+#define glProgramUniform1fv glad_glProgramUniform1fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i;
+#define glProgramUniform1i glad_glProgramUniform1i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv;
+#define glProgramUniform1iv glad_glProgramUniform1iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui;
+#define glProgramUniform1ui glad_glProgramUniform1ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv;
+#define glProgramUniform1uiv glad_glProgramUniform1uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d;
+#define glProgramUniform2d glad_glProgramUniform2d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv;
+#define glProgramUniform2dv glad_glProgramUniform2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f;
+#define glProgramUniform2f glad_glProgramUniform2f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv;
+#define glProgramUniform2fv glad_glProgramUniform2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i;
+#define glProgramUniform2i glad_glProgramUniform2i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv;
+#define glProgramUniform2iv glad_glProgramUniform2iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui;
+#define glProgramUniform2ui glad_glProgramUniform2ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv;
+#define glProgramUniform2uiv glad_glProgramUniform2uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d;
+#define glProgramUniform3d glad_glProgramUniform3d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv;
+#define glProgramUniform3dv glad_glProgramUniform3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f;
+#define glProgramUniform3f glad_glProgramUniform3f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv;
+#define glProgramUniform3fv glad_glProgramUniform3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i;
+#define glProgramUniform3i glad_glProgramUniform3i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv;
+#define glProgramUniform3iv glad_glProgramUniform3iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui;
+#define glProgramUniform3ui glad_glProgramUniform3ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv;
+#define glProgramUniform3uiv glad_glProgramUniform3uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d;
+#define glProgramUniform4d glad_glProgramUniform4d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv;
+#define glProgramUniform4dv glad_glProgramUniform4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f;
+#define glProgramUniform4f glad_glProgramUniform4f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv;
+#define glProgramUniform4fv glad_glProgramUniform4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i;
+#define glProgramUniform4i glad_glProgramUniform4i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv;
+#define glProgramUniform4iv glad_glProgramUniform4iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui;
+#define glProgramUniform4ui glad_glProgramUniform4ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv;
+#define glProgramUniform4uiv glad_glProgramUniform4uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv;
+#define glProgramUniformMatrix2dv glad_glProgramUniformMatrix2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv;
+#define glProgramUniformMatrix2fv glad_glProgramUniformMatrix2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv;
+#define glProgramUniformMatrix2x3dv glad_glProgramUniformMatrix2x3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv;
+#define glProgramUniformMatrix2x3fv glad_glProgramUniformMatrix2x3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv;
+#define glProgramUniformMatrix2x4dv glad_glProgramUniformMatrix2x4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv;
+#define glProgramUniformMatrix2x4fv glad_glProgramUniformMatrix2x4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv;
+#define glProgramUniformMatrix3dv glad_glProgramUniformMatrix3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv;
+#define glProgramUniformMatrix3fv glad_glProgramUniformMatrix3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv;
+#define glProgramUniformMatrix3x2dv glad_glProgramUniformMatrix3x2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv;
+#define glProgramUniformMatrix3x2fv glad_glProgramUniformMatrix3x2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv;
+#define glProgramUniformMatrix3x4dv glad_glProgramUniformMatrix3x4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv;
+#define glProgramUniformMatrix3x4fv glad_glProgramUniformMatrix3x4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv;
+#define glProgramUniformMatrix4dv glad_glProgramUniformMatrix4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv;
+#define glProgramUniformMatrix4fv glad_glProgramUniformMatrix4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv;
+#define glProgramUniformMatrix4x2dv glad_glProgramUniformMatrix4x2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv;
+#define glProgramUniformMatrix4x2fv glad_glProgramUniformMatrix4x2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv;
+#define glProgramUniformMatrix4x3dv glad_glProgramUniformMatrix4x3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv;
+#define glProgramUniformMatrix4x3fv glad_glProgramUniformMatrix4x3fv
+GLAD_API_CALL PFNGLPROGRAMVERTEXLIMITNVPROC glad_glProgramVertexLimitNV;
+#define glProgramVertexLimitNV glad_glProgramVertexLimitNV
+GLAD_API_CALL PFNGLPUSHATTRIBPROC glad_glPushAttrib;
+#define glPushAttrib glad_glPushAttrib
+GLAD_API_CALL PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib;
+#define glPushClientAttrib glad_glPushClientAttrib
+GLAD_API_CALL PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup;
+#define glPushDebugGroup glad_glPushDebugGroup
+GLAD_API_CALL PFNGLPUSHMATRIXPROC glad_glPushMatrix;
+#define glPushMatrix glad_glPushMatrix
+GLAD_API_CALL PFNGLPUSHNAMEPROC glad_glPushName;
+#define glPushName glad_glPushName
+GLAD_API_CALL PFNGLRASTERPOS2DPROC glad_glRasterPos2d;
+#define glRasterPos2d glad_glRasterPos2d
+GLAD_API_CALL PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv;
+#define glRasterPos2dv glad_glRasterPos2dv
+GLAD_API_CALL PFNGLRASTERPOS2FPROC glad_glRasterPos2f;
+#define glRasterPos2f glad_glRasterPos2f
+GLAD_API_CALL PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv;
+#define glRasterPos2fv glad_glRasterPos2fv
+GLAD_API_CALL PFNGLRASTERPOS2IPROC glad_glRasterPos2i;
+#define glRasterPos2i glad_glRasterPos2i
+GLAD_API_CALL PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv;
+#define glRasterPos2iv glad_glRasterPos2iv
+GLAD_API_CALL PFNGLRASTERPOS2SPROC glad_glRasterPos2s;
+#define glRasterPos2s glad_glRasterPos2s
+GLAD_API_CALL PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv;
+#define glRasterPos2sv glad_glRasterPos2sv
+GLAD_API_CALL PFNGLRASTERPOS3DPROC glad_glRasterPos3d;
+#define glRasterPos3d glad_glRasterPos3d
+GLAD_API_CALL PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv;
+#define glRasterPos3dv glad_glRasterPos3dv
+GLAD_API_CALL PFNGLRASTERPOS3FPROC glad_glRasterPos3f;
+#define glRasterPos3f glad_glRasterPos3f
+GLAD_API_CALL PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv;
+#define glRasterPos3fv glad_glRasterPos3fv
+GLAD_API_CALL PFNGLRASTERPOS3IPROC glad_glRasterPos3i;
+#define glRasterPos3i glad_glRasterPos3i
+GLAD_API_CALL PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv;
+#define glRasterPos3iv glad_glRasterPos3iv
+GLAD_API_CALL PFNGLRASTERPOS3SPROC glad_glRasterPos3s;
+#define glRasterPos3s glad_glRasterPos3s
+GLAD_API_CALL PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv;
+#define glRasterPos3sv glad_glRasterPos3sv
+GLAD_API_CALL PFNGLRASTERPOS4DPROC glad_glRasterPos4d;
+#define glRasterPos4d glad_glRasterPos4d
+GLAD_API_CALL PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv;
+#define glRasterPos4dv glad_glRasterPos4dv
+GLAD_API_CALL PFNGLRASTERPOS4FPROC glad_glRasterPos4f;
+#define glRasterPos4f glad_glRasterPos4f
+GLAD_API_CALL PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv;
+#define glRasterPos4fv glad_glRasterPos4fv
+GLAD_API_CALL PFNGLRASTERPOS4IPROC glad_glRasterPos4i;
+#define glRasterPos4i glad_glRasterPos4i
+GLAD_API_CALL PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv;
+#define glRasterPos4iv glad_glRasterPos4iv
+GLAD_API_CALL PFNGLRASTERPOS4SPROC glad_glRasterPos4s;
+#define glRasterPos4s glad_glRasterPos4s
+GLAD_API_CALL PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv;
+#define glRasterPos4sv glad_glRasterPos4sv
+GLAD_API_CALL PFNGLREADBUFFERPROC glad_glReadBuffer;
+#define glReadBuffer glad_glReadBuffer
+GLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels;
+#define glReadPixels glad_glReadPixels
+GLAD_API_CALL PFNGLRECTDPROC glad_glRectd;
+#define glRectd glad_glRectd
+GLAD_API_CALL PFNGLRECTDVPROC glad_glRectdv;
+#define glRectdv glad_glRectdv
+GLAD_API_CALL PFNGLRECTFPROC glad_glRectf;
+#define glRectf glad_glRectf
+GLAD_API_CALL PFNGLRECTFVPROC glad_glRectfv;
+#define glRectfv glad_glRectfv
+GLAD_API_CALL PFNGLRECTIPROC glad_glRecti;
+#define glRecti glad_glRecti
+GLAD_API_CALL PFNGLRECTIVPROC glad_glRectiv;
+#define glRectiv glad_glRectiv
+GLAD_API_CALL PFNGLRECTSPROC glad_glRects;
+#define glRects glad_glRects
+GLAD_API_CALL PFNGLRECTSVPROC glad_glRectsv;
+#define glRectsv glad_glRectsv
+GLAD_API_CALL PFNGLRENDERMODEPROC glad_glRenderMode;
+#define glRenderMode glad_glRenderMode
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage;
+#define glRenderbufferStorage glad_glRenderbufferStorage
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT;
+#define glRenderbufferStorageEXT glad_glRenderbufferStorageEXT
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample;
+#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glRenderbufferStorageMultisampleEXT;
+#define glRenderbufferStorageMultisampleEXT glad_glRenderbufferStorageMultisampleEXT
+GLAD_API_CALL PFNGLREQUESTRESIDENTPROGRAMSNVPROC glad_glRequestResidentProgramsNV;
+#define glRequestResidentProgramsNV glad_glRequestResidentProgramsNV
+GLAD_API_CALL PFNGLRESETHISTOGRAMPROC glad_glResetHistogram;
+#define glResetHistogram glad_glResetHistogram
+GLAD_API_CALL PFNGLRESETMINMAXPROC glad_glResetMinmax;
+#define glResetMinmax glad_glResetMinmax
+GLAD_API_CALL PFNGLROTATEDPROC glad_glRotated;
+#define glRotated glad_glRotated
+GLAD_API_CALL PFNGLROTATEFPROC glad_glRotatef;
+#define glRotatef glad_glRotatef
+GLAD_API_CALL PFNGLSCALEDPROC glad_glScaled;
+#define glScaled glad_glScaled
+GLAD_API_CALL PFNGLSCALEFPROC glad_glScalef;
+#define glScalef glad_glScalef
+GLAD_API_CALL PFNGLSCISSORPROC glad_glScissor;
+#define glScissor glad_glScissor
+GLAD_API_CALL PFNGLSELECTBUFFERPROC glad_glSelectBuffer;
+#define glSelectBuffer glad_glSelectBuffer
+GLAD_API_CALL PFNGLSEPARABLEFILTER2DPROC glad_glSeparableFilter2D;
+#define glSeparableFilter2D glad_glSeparableFilter2D
+GLAD_API_CALL PFNGLSHADEMODELPROC glad_glShadeModel;
+#define glShadeModel glad_glShadeModel
+GLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource;
+#define glShaderSource glad_glShaderSource
+GLAD_API_CALL PFNGLSHADERSOURCEARBPROC glad_glShaderSourceARB;
+#define glShaderSourceARB glad_glShaderSourceARB
+GLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc;
+#define glStencilFunc glad_glStencilFunc
+GLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask;
+#define glStencilMask glad_glStencilMask
+GLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp;
+#define glStencilOp glad_glStencilOp
+GLAD_API_CALL PFNGLTEXCOORD1DPROC glad_glTexCoord1d;
+#define glTexCoord1d glad_glTexCoord1d
+GLAD_API_CALL PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv;
+#define glTexCoord1dv glad_glTexCoord1dv
+GLAD_API_CALL PFNGLTEXCOORD1FPROC glad_glTexCoord1f;
+#define glTexCoord1f glad_glTexCoord1f
+GLAD_API_CALL PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv;
+#define glTexCoord1fv glad_glTexCoord1fv
+GLAD_API_CALL PFNGLTEXCOORD1IPROC glad_glTexCoord1i;
+#define glTexCoord1i glad_glTexCoord1i
+GLAD_API_CALL PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv;
+#define glTexCoord1iv glad_glTexCoord1iv
+GLAD_API_CALL PFNGLTEXCOORD1SPROC glad_glTexCoord1s;
+#define glTexCoord1s glad_glTexCoord1s
+GLAD_API_CALL PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv;
+#define glTexCoord1sv glad_glTexCoord1sv
+GLAD_API_CALL PFNGLTEXCOORD2DPROC glad_glTexCoord2d;
+#define glTexCoord2d glad_glTexCoord2d
+GLAD_API_CALL PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv;
+#define glTexCoord2dv glad_glTexCoord2dv
+GLAD_API_CALL PFNGLTEXCOORD2FPROC glad_glTexCoord2f;
+#define glTexCoord2f glad_glTexCoord2f
+GLAD_API_CALL PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv;
+#define glTexCoord2fv glad_glTexCoord2fv
+GLAD_API_CALL PFNGLTEXCOORD2IPROC glad_glTexCoord2i;
+#define glTexCoord2i glad_glTexCoord2i
+GLAD_API_CALL PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv;
+#define glTexCoord2iv glad_glTexCoord2iv
+GLAD_API_CALL PFNGLTEXCOORD2SPROC glad_glTexCoord2s;
+#define glTexCoord2s glad_glTexCoord2s
+GLAD_API_CALL PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv;
+#define glTexCoord2sv glad_glTexCoord2sv
+GLAD_API_CALL PFNGLTEXCOORD3DPROC glad_glTexCoord3d;
+#define glTexCoord3d glad_glTexCoord3d
+GLAD_API_CALL PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv;
+#define glTexCoord3dv glad_glTexCoord3dv
+GLAD_API_CALL PFNGLTEXCOORD3FPROC glad_glTexCoord3f;
+#define glTexCoord3f glad_glTexCoord3f
+GLAD_API_CALL PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv;
+#define glTexCoord3fv glad_glTexCoord3fv
+GLAD_API_CALL PFNGLTEXCOORD3IPROC glad_glTexCoord3i;
+#define glTexCoord3i glad_glTexCoord3i
+GLAD_API_CALL PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv;
+#define glTexCoord3iv glad_glTexCoord3iv
+GLAD_API_CALL PFNGLTEXCOORD3SPROC glad_glTexCoord3s;
+#define glTexCoord3s glad_glTexCoord3s
+GLAD_API_CALL PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv;
+#define glTexCoord3sv glad_glTexCoord3sv
+GLAD_API_CALL PFNGLTEXCOORD4DPROC glad_glTexCoord4d;
+#define glTexCoord4d glad_glTexCoord4d
+GLAD_API_CALL PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv;
+#define glTexCoord4dv glad_glTexCoord4dv
+GLAD_API_CALL PFNGLTEXCOORD4FPROC glad_glTexCoord4f;
+#define glTexCoord4f glad_glTexCoord4f
+GLAD_API_CALL PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv;
+#define glTexCoord4fv glad_glTexCoord4fv
+GLAD_API_CALL PFNGLTEXCOORD4IPROC glad_glTexCoord4i;
+#define glTexCoord4i glad_glTexCoord4i
+GLAD_API_CALL PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv;
+#define glTexCoord4iv glad_glTexCoord4iv
+GLAD_API_CALL PFNGLTEXCOORD4SPROC glad_glTexCoord4s;
+#define glTexCoord4s glad_glTexCoord4s
+GLAD_API_CALL PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv;
+#define glTexCoord4sv glad_glTexCoord4sv
+GLAD_API_CALL PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer;
+#define glTexCoordPointer glad_glTexCoordPointer
+GLAD_API_CALL PFNGLTEXCOORDPOINTEREXTPROC glad_glTexCoordPointerEXT;
+#define glTexCoordPointerEXT glad_glTexCoordPointerEXT
+GLAD_API_CALL PFNGLTEXENVFPROC glad_glTexEnvf;
+#define glTexEnvf glad_glTexEnvf
+GLAD_API_CALL PFNGLTEXENVFVPROC glad_glTexEnvfv;
+#define glTexEnvfv glad_glTexEnvfv
+GLAD_API_CALL PFNGLTEXENVIPROC glad_glTexEnvi;
+#define glTexEnvi glad_glTexEnvi
+GLAD_API_CALL PFNGLTEXENVIVPROC glad_glTexEnviv;
+#define glTexEnviv glad_glTexEnviv
+GLAD_API_CALL PFNGLTEXGENDPROC glad_glTexGend;
+#define glTexGend glad_glTexGend
+GLAD_API_CALL PFNGLTEXGENDVPROC glad_glTexGendv;
+#define glTexGendv glad_glTexGendv
+GLAD_API_CALL PFNGLTEXGENFPROC glad_glTexGenf;
+#define glTexGenf glad_glTexGenf
+GLAD_API_CALL PFNGLTEXGENFVPROC glad_glTexGenfv;
+#define glTexGenfv glad_glTexGenfv
+GLAD_API_CALL PFNGLTEXGENIPROC glad_glTexGeni;
+#define glTexGeni glad_glTexGeni
+GLAD_API_CALL PFNGLTEXGENIVPROC glad_glTexGeniv;
+#define glTexGeniv glad_glTexGeniv
+GLAD_API_CALL PFNGLTEXIMAGE1DPROC glad_glTexImage1D;
+#define glTexImage1D glad_glTexImage1D
+GLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D;
+#define glTexImage2D glad_glTexImage2D
+GLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf;
+#define glTexParameterf glad_glTexParameterf
+GLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv;
+#define glTexParameterfv glad_glTexParameterfv
+GLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri;
+#define glTexParameteri glad_glTexParameteri
+GLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv;
+#define glTexParameteriv glad_glTexParameteriv
+GLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D;
+#define glTexSubImage1D glad_glTexSubImage1D
+GLAD_API_CALL PFNGLTEXSUBIMAGE1DEXTPROC glad_glTexSubImage1DEXT;
+#define glTexSubImage1DEXT glad_glTexSubImage1DEXT
+GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D;
+#define glTexSubImage2D glad_glTexSubImage2D
+GLAD_API_CALL PFNGLTEXSUBIMAGE2DEXTPROC glad_glTexSubImage2DEXT;
+#define glTexSubImage2DEXT glad_glTexSubImage2DEXT
+GLAD_API_CALL PFNGLTRACKMATRIXNVPROC glad_glTrackMatrixNV;
+#define glTrackMatrixNV glad_glTrackMatrixNV
+GLAD_API_CALL PFNGLTRANSLATEDPROC glad_glTranslated;
+#define glTranslated glad_glTranslated
+GLAD_API_CALL PFNGLTRANSLATEFPROC glad_glTranslatef;
+#define glTranslatef glad_glTranslatef
+GLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f;
+#define glUniform1f glad_glUniform1f
+GLAD_API_CALL PFNGLUNIFORM1FARBPROC glad_glUniform1fARB;
+#define glUniform1fARB glad_glUniform1fARB
+GLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv;
+#define glUniform1fv glad_glUniform1fv
+GLAD_API_CALL PFNGLUNIFORM1FVARBPROC glad_glUniform1fvARB;
+#define glUniform1fvARB glad_glUniform1fvARB
+GLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i;
+#define glUniform1i glad_glUniform1i
+GLAD_API_CALL PFNGLUNIFORM1IARBPROC glad_glUniform1iARB;
+#define glUniform1iARB glad_glUniform1iARB
+GLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv;
+#define glUniform1iv glad_glUniform1iv
+GLAD_API_CALL PFNGLUNIFORM1IVARBPROC glad_glUniform1ivARB;
+#define glUniform1ivARB glad_glUniform1ivARB
+GLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f;
+#define glUniform2f glad_glUniform2f
+GLAD_API_CALL PFNGLUNIFORM2FARBPROC glad_glUniform2fARB;
+#define glUniform2fARB glad_glUniform2fARB
+GLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv;
+#define glUniform2fv glad_glUniform2fv
+GLAD_API_CALL PFNGLUNIFORM2FVARBPROC glad_glUniform2fvARB;
+#define glUniform2fvARB glad_glUniform2fvARB
+GLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i;
+#define glUniform2i glad_glUniform2i
+GLAD_API_CALL PFNGLUNIFORM2IARBPROC glad_glUniform2iARB;
+#define glUniform2iARB glad_glUniform2iARB
+GLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv;
+#define glUniform2iv glad_glUniform2iv
+GLAD_API_CALL PFNGLUNIFORM2IVARBPROC glad_glUniform2ivARB;
+#define glUniform2ivARB glad_glUniform2ivARB
+GLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f;
+#define glUniform3f glad_glUniform3f
+GLAD_API_CALL PFNGLUNIFORM3FARBPROC glad_glUniform3fARB;
+#define glUniform3fARB glad_glUniform3fARB
+GLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv;
+#define glUniform3fv glad_glUniform3fv
+GLAD_API_CALL PFNGLUNIFORM3FVARBPROC glad_glUniform3fvARB;
+#define glUniform3fvARB glad_glUniform3fvARB
+GLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i;
+#define glUniform3i glad_glUniform3i
+GLAD_API_CALL PFNGLUNIFORM3IARBPROC glad_glUniform3iARB;
+#define glUniform3iARB glad_glUniform3iARB
+GLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv;
+#define glUniform3iv glad_glUniform3iv
+GLAD_API_CALL PFNGLUNIFORM3IVARBPROC glad_glUniform3ivARB;
+#define glUniform3ivARB glad_glUniform3ivARB
+GLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f;
+#define glUniform4f glad_glUniform4f
+GLAD_API_CALL PFNGLUNIFORM4FARBPROC glad_glUniform4fARB;
+#define glUniform4fARB glad_glUniform4fARB
+GLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv;
+#define glUniform4fv glad_glUniform4fv
+GLAD_API_CALL PFNGLUNIFORM4FVARBPROC glad_glUniform4fvARB;
+#define glUniform4fvARB glad_glUniform4fvARB
+GLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i;
+#define glUniform4i glad_glUniform4i
+GLAD_API_CALL PFNGLUNIFORM4IARBPROC glad_glUniform4iARB;
+#define glUniform4iARB glad_glUniform4iARB
+GLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv;
+#define glUniform4iv glad_glUniform4iv
+GLAD_API_CALL PFNGLUNIFORM4IVARBPROC glad_glUniform4ivARB;
+#define glUniform4ivARB glad_glUniform4ivARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv;
+#define glUniformMatrix2fv glad_glUniformMatrix2fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX2FVARBPROC glad_glUniformMatrix2fvARB;
+#define glUniformMatrix2fvARB glad_glUniformMatrix2fvARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv;
+#define glUniformMatrix3fv glad_glUniformMatrix3fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX3FVARBPROC glad_glUniformMatrix3fvARB;
+#define glUniformMatrix3fvARB glad_glUniformMatrix3fvARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv;
+#define glUniformMatrix4fv glad_glUniformMatrix4fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX4FVARBPROC glad_glUniformMatrix4fvARB;
+#define glUniformMatrix4fvARB glad_glUniformMatrix4fvARB
+GLAD_API_CALL PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer;
+#define glUnmapBuffer glad_glUnmapBuffer
+GLAD_API_CALL PFNGLUNMAPBUFFERARBPROC glad_glUnmapBufferARB;
+#define glUnmapBufferARB glad_glUnmapBufferARB
+GLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram;
+#define glUseProgram glad_glUseProgram
+GLAD_API_CALL PFNGLUSEPROGRAMOBJECTARBPROC glad_glUseProgramObjectARB;
+#define glUseProgramObjectARB glad_glUseProgramObjectARB
+GLAD_API_CALL PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages;
+#define glUseProgramStages glad_glUseProgramStages
+GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram;
+#define glValidateProgram glad_glValidateProgram
+GLAD_API_CALL PFNGLVALIDATEPROGRAMARBPROC glad_glValidateProgramARB;
+#define glValidateProgramARB glad_glValidateProgramARB
+GLAD_API_CALL PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline;
+#define glValidateProgramPipeline glad_glValidateProgramPipeline
+GLAD_API_CALL PFNGLVERTEX2DPROC glad_glVertex2d;
+#define glVertex2d glad_glVertex2d
+GLAD_API_CALL PFNGLVERTEX2DVPROC glad_glVertex2dv;
+#define glVertex2dv glad_glVertex2dv
+GLAD_API_CALL PFNGLVERTEX2FPROC glad_glVertex2f;
+#define glVertex2f glad_glVertex2f
+GLAD_API_CALL PFNGLVERTEX2FVPROC glad_glVertex2fv;
+#define glVertex2fv glad_glVertex2fv
+GLAD_API_CALL PFNGLVERTEX2IPROC glad_glVertex2i;
+#define glVertex2i glad_glVertex2i
+GLAD_API_CALL PFNGLVERTEX2IVPROC glad_glVertex2iv;
+#define glVertex2iv glad_glVertex2iv
+GLAD_API_CALL PFNGLVERTEX2SPROC glad_glVertex2s;
+#define glVertex2s glad_glVertex2s
+GLAD_API_CALL PFNGLVERTEX2SVPROC glad_glVertex2sv;
+#define glVertex2sv glad_glVertex2sv
+GLAD_API_CALL PFNGLVERTEX3DPROC glad_glVertex3d;
+#define glVertex3d glad_glVertex3d
+GLAD_API_CALL PFNGLVERTEX3DVPROC glad_glVertex3dv;
+#define glVertex3dv glad_glVertex3dv
+GLAD_API_CALL PFNGLVERTEX3FPROC glad_glVertex3f;
+#define glVertex3f glad_glVertex3f
+GLAD_API_CALL PFNGLVERTEX3FVPROC glad_glVertex3fv;
+#define glVertex3fv glad_glVertex3fv
+GLAD_API_CALL PFNGLVERTEX3IPROC glad_glVertex3i;
+#define glVertex3i glad_glVertex3i
+GLAD_API_CALL PFNGLVERTEX3IVPROC glad_glVertex3iv;
+#define glVertex3iv glad_glVertex3iv
+GLAD_API_CALL PFNGLVERTEX3SPROC glad_glVertex3s;
+#define glVertex3s glad_glVertex3s
+GLAD_API_CALL PFNGLVERTEX3SVPROC glad_glVertex3sv;
+#define glVertex3sv glad_glVertex3sv
+GLAD_API_CALL PFNGLVERTEX4DPROC glad_glVertex4d;
+#define glVertex4d glad_glVertex4d
+GLAD_API_CALL PFNGLVERTEX4DVPROC glad_glVertex4dv;
+#define glVertex4dv glad_glVertex4dv
+GLAD_API_CALL PFNGLVERTEX4FPROC glad_glVertex4f;
+#define glVertex4f glad_glVertex4f
+GLAD_API_CALL PFNGLVERTEX4FVPROC glad_glVertex4fv;
+#define glVertex4fv glad_glVertex4fv
+GLAD_API_CALL PFNGLVERTEX4IPROC glad_glVertex4i;
+#define glVertex4i glad_glVertex4i
+GLAD_API_CALL PFNGLVERTEX4IVPROC glad_glVertex4iv;
+#define glVertex4iv glad_glVertex4iv
+GLAD_API_CALL PFNGLVERTEX4SPROC glad_glVertex4s;
+#define glVertex4s glad_glVertex4s
+GLAD_API_CALL PFNGLVERTEX4SVPROC glad_glVertex4sv;
+#define glVertex4sv glad_glVertex4sv
+GLAD_API_CALL PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d;
+#define glVertexAttrib1d glad_glVertexAttrib1d
+GLAD_API_CALL PFNGLVERTEXATTRIB1DARBPROC glad_glVertexAttrib1dARB;
+#define glVertexAttrib1dARB glad_glVertexAttrib1dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1DNVPROC glad_glVertexAttrib1dNV;
+#define glVertexAttrib1dNV glad_glVertexAttrib1dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv;
+#define glVertexAttrib1dv glad_glVertexAttrib1dv
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVARBPROC glad_glVertexAttrib1dvARB;
+#define glVertexAttrib1dvARB glad_glVertexAttrib1dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVNVPROC glad_glVertexAttrib1dvNV;
+#define glVertexAttrib1dvNV glad_glVertexAttrib1dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f;
+#define glVertexAttrib1f glad_glVertexAttrib1f
+GLAD_API_CALL PFNGLVERTEXATTRIB1FARBPROC glad_glVertexAttrib1fARB;
+#define glVertexAttrib1fARB glad_glVertexAttrib1fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1FNVPROC glad_glVertexAttrib1fNV;
+#define glVertexAttrib1fNV glad_glVertexAttrib1fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv;
+#define glVertexAttrib1fv glad_glVertexAttrib1fv
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVARBPROC glad_glVertexAttrib1fvARB;
+#define glVertexAttrib1fvARB glad_glVertexAttrib1fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVNVPROC glad_glVertexAttrib1fvNV;
+#define glVertexAttrib1fvNV glad_glVertexAttrib1fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s;
+#define glVertexAttrib1s glad_glVertexAttrib1s
+GLAD_API_CALL PFNGLVERTEXATTRIB1SARBPROC glad_glVertexAttrib1sARB;
+#define glVertexAttrib1sARB glad_glVertexAttrib1sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1SNVPROC glad_glVertexAttrib1sNV;
+#define glVertexAttrib1sNV glad_glVertexAttrib1sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv;
+#define glVertexAttrib1sv glad_glVertexAttrib1sv
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVARBPROC glad_glVertexAttrib1svARB;
+#define glVertexAttrib1svARB glad_glVertexAttrib1svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVNVPROC glad_glVertexAttrib1svNV;
+#define glVertexAttrib1svNV glad_glVertexAttrib1svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d;
+#define glVertexAttrib2d glad_glVertexAttrib2d
+GLAD_API_CALL PFNGLVERTEXATTRIB2DARBPROC glad_glVertexAttrib2dARB;
+#define glVertexAttrib2dARB glad_glVertexAttrib2dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2DNVPROC glad_glVertexAttrib2dNV;
+#define glVertexAttrib2dNV glad_glVertexAttrib2dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv;
+#define glVertexAttrib2dv glad_glVertexAttrib2dv
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVARBPROC glad_glVertexAttrib2dvARB;
+#define glVertexAttrib2dvARB glad_glVertexAttrib2dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVNVPROC glad_glVertexAttrib2dvNV;
+#define glVertexAttrib2dvNV glad_glVertexAttrib2dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f;
+#define glVertexAttrib2f glad_glVertexAttrib2f
+GLAD_API_CALL PFNGLVERTEXATTRIB2FARBPROC glad_glVertexAttrib2fARB;
+#define glVertexAttrib2fARB glad_glVertexAttrib2fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2FNVPROC glad_glVertexAttrib2fNV;
+#define glVertexAttrib2fNV glad_glVertexAttrib2fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv;
+#define glVertexAttrib2fv glad_glVertexAttrib2fv
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVARBPROC glad_glVertexAttrib2fvARB;
+#define glVertexAttrib2fvARB glad_glVertexAttrib2fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVNVPROC glad_glVertexAttrib2fvNV;
+#define glVertexAttrib2fvNV glad_glVertexAttrib2fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s;
+#define glVertexAttrib2s glad_glVertexAttrib2s
+GLAD_API_CALL PFNGLVERTEXATTRIB2SARBPROC glad_glVertexAttrib2sARB;
+#define glVertexAttrib2sARB glad_glVertexAttrib2sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2SNVPROC glad_glVertexAttrib2sNV;
+#define glVertexAttrib2sNV glad_glVertexAttrib2sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv;
+#define glVertexAttrib2sv glad_glVertexAttrib2sv
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVARBPROC glad_glVertexAttrib2svARB;
+#define glVertexAttrib2svARB glad_glVertexAttrib2svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVNVPROC glad_glVertexAttrib2svNV;
+#define glVertexAttrib2svNV glad_glVertexAttrib2svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d;
+#define glVertexAttrib3d glad_glVertexAttrib3d
+GLAD_API_CALL PFNGLVERTEXATTRIB3DARBPROC glad_glVertexAttrib3dARB;
+#define glVertexAttrib3dARB glad_glVertexAttrib3dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3DNVPROC glad_glVertexAttrib3dNV;
+#define glVertexAttrib3dNV glad_glVertexAttrib3dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv;
+#define glVertexAttrib3dv glad_glVertexAttrib3dv
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVARBPROC glad_glVertexAttrib3dvARB;
+#define glVertexAttrib3dvARB glad_glVertexAttrib3dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVNVPROC glad_glVertexAttrib3dvNV;
+#define glVertexAttrib3dvNV glad_glVertexAttrib3dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f;
+#define glVertexAttrib3f glad_glVertexAttrib3f
+GLAD_API_CALL PFNGLVERTEXATTRIB3FARBPROC glad_glVertexAttrib3fARB;
+#define glVertexAttrib3fARB glad_glVertexAttrib3fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3FNVPROC glad_glVertexAttrib3fNV;
+#define glVertexAttrib3fNV glad_glVertexAttrib3fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv;
+#define glVertexAttrib3fv glad_glVertexAttrib3fv
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVARBPROC glad_glVertexAttrib3fvARB;
+#define glVertexAttrib3fvARB glad_glVertexAttrib3fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVNVPROC glad_glVertexAttrib3fvNV;
+#define glVertexAttrib3fvNV glad_glVertexAttrib3fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s;
+#define glVertexAttrib3s glad_glVertexAttrib3s
+GLAD_API_CALL PFNGLVERTEXATTRIB3SARBPROC glad_glVertexAttrib3sARB;
+#define glVertexAttrib3sARB glad_glVertexAttrib3sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3SNVPROC glad_glVertexAttrib3sNV;
+#define glVertexAttrib3sNV glad_glVertexAttrib3sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv;
+#define glVertexAttrib3sv glad_glVertexAttrib3sv
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVARBPROC glad_glVertexAttrib3svARB;
+#define glVertexAttrib3svARB glad_glVertexAttrib3svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVNVPROC glad_glVertexAttrib3svNV;
+#define glVertexAttrib3svNV glad_glVertexAttrib3svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv;
+#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NBVARBPROC glad_glVertexAttrib4NbvARB;
+#define glVertexAttrib4NbvARB glad_glVertexAttrib4NbvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv;
+#define glVertexAttrib4Niv glad_glVertexAttrib4Niv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NIVARBPROC glad_glVertexAttrib4NivARB;
+#define glVertexAttrib4NivARB glad_glVertexAttrib4NivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv;
+#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NSVARBPROC glad_glVertexAttrib4NsvARB;
+#define glVertexAttrib4NsvARB glad_glVertexAttrib4NsvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub;
+#define glVertexAttrib4Nub glad_glVertexAttrib4Nub
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBARBPROC glad_glVertexAttrib4NubARB;
+#define glVertexAttrib4NubARB glad_glVertexAttrib4NubARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv;
+#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVARBPROC glad_glVertexAttrib4NubvARB;
+#define glVertexAttrib4NubvARB glad_glVertexAttrib4NubvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv;
+#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVARBPROC glad_glVertexAttrib4NuivARB;
+#define glVertexAttrib4NuivARB glad_glVertexAttrib4NuivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv;
+#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVARBPROC glad_glVertexAttrib4NusvARB;
+#define glVertexAttrib4NusvARB glad_glVertexAttrib4NusvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv;
+#define glVertexAttrib4bv glad_glVertexAttrib4bv
+GLAD_API_CALL PFNGLVERTEXATTRIB4BVARBPROC glad_glVertexAttrib4bvARB;
+#define glVertexAttrib4bvARB glad_glVertexAttrib4bvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d;
+#define glVertexAttrib4d glad_glVertexAttrib4d
+GLAD_API_CALL PFNGLVERTEXATTRIB4DARBPROC glad_glVertexAttrib4dARB;
+#define glVertexAttrib4dARB glad_glVertexAttrib4dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DNVPROC glad_glVertexAttrib4dNV;
+#define glVertexAttrib4dNV glad_glVertexAttrib4dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv;
+#define glVertexAttrib4dv glad_glVertexAttrib4dv
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVARBPROC glad_glVertexAttrib4dvARB;
+#define glVertexAttrib4dvARB glad_glVertexAttrib4dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVNVPROC glad_glVertexAttrib4dvNV;
+#define glVertexAttrib4dvNV glad_glVertexAttrib4dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f;
+#define glVertexAttrib4f glad_glVertexAttrib4f
+GLAD_API_CALL PFNGLVERTEXATTRIB4FARBPROC glad_glVertexAttrib4fARB;
+#define glVertexAttrib4fARB glad_glVertexAttrib4fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4FNVPROC glad_glVertexAttrib4fNV;
+#define glVertexAttrib4fNV glad_glVertexAttrib4fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv;
+#define glVertexAttrib4fv glad_glVertexAttrib4fv
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVARBPROC glad_glVertexAttrib4fvARB;
+#define glVertexAttrib4fvARB glad_glVertexAttrib4fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVNVPROC glad_glVertexAttrib4fvNV;
+#define glVertexAttrib4fvNV glad_glVertexAttrib4fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv;
+#define glVertexAttrib4iv glad_glVertexAttrib4iv
+GLAD_API_CALL PFNGLVERTEXATTRIB4IVARBPROC glad_glVertexAttrib4ivARB;
+#define glVertexAttrib4ivARB glad_glVertexAttrib4ivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s;
+#define glVertexAttrib4s glad_glVertexAttrib4s
+GLAD_API_CALL PFNGLVERTEXATTRIB4SARBPROC glad_glVertexAttrib4sARB;
+#define glVertexAttrib4sARB glad_glVertexAttrib4sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SNVPROC glad_glVertexAttrib4sNV;
+#define glVertexAttrib4sNV glad_glVertexAttrib4sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv;
+#define glVertexAttrib4sv glad_glVertexAttrib4sv
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVARBPROC glad_glVertexAttrib4svARB;
+#define glVertexAttrib4svARB glad_glVertexAttrib4svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVNVPROC glad_glVertexAttrib4svNV;
+#define glVertexAttrib4svNV glad_glVertexAttrib4svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBNVPROC glad_glVertexAttrib4ubNV;
+#define glVertexAttrib4ubNV glad_glVertexAttrib4ubNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv;
+#define glVertexAttrib4ubv glad_glVertexAttrib4ubv
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVARBPROC glad_glVertexAttrib4ubvARB;
+#define glVertexAttrib4ubvARB glad_glVertexAttrib4ubvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVNVPROC glad_glVertexAttrib4ubvNV;
+#define glVertexAttrib4ubvNV glad_glVertexAttrib4ubvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv;
+#define glVertexAttrib4uiv glad_glVertexAttrib4uiv
+GLAD_API_CALL PFNGLVERTEXATTRIB4UIVARBPROC glad_glVertexAttrib4uivARB;
+#define glVertexAttrib4uivARB glad_glVertexAttrib4uivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv;
+#define glVertexAttrib4usv glad_glVertexAttrib4usv
+GLAD_API_CALL PFNGLVERTEXATTRIB4USVARBPROC glad_glVertexAttrib4usvARB;
+#define glVertexAttrib4usvARB glad_glVertexAttrib4usvARB
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer;
+#define glVertexAttribPointer glad_glVertexAttribPointer
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERARBPROC glad_glVertexAttribPointerARB;
+#define glVertexAttribPointerARB glad_glVertexAttribPointerARB
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERNVPROC glad_glVertexAttribPointerNV;
+#define glVertexAttribPointerNV glad_glVertexAttribPointerNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1DVNVPROC glad_glVertexAttribs1dvNV;
+#define glVertexAttribs1dvNV glad_glVertexAttribs1dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1FVNVPROC glad_glVertexAttribs1fvNV;
+#define glVertexAttribs1fvNV glad_glVertexAttribs1fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1SVNVPROC glad_glVertexAttribs1svNV;
+#define glVertexAttribs1svNV glad_glVertexAttribs1svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2DVNVPROC glad_glVertexAttribs2dvNV;
+#define glVertexAttribs2dvNV glad_glVertexAttribs2dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2FVNVPROC glad_glVertexAttribs2fvNV;
+#define glVertexAttribs2fvNV glad_glVertexAttribs2fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2SVNVPROC glad_glVertexAttribs2svNV;
+#define glVertexAttribs2svNV glad_glVertexAttribs2svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3DVNVPROC glad_glVertexAttribs3dvNV;
+#define glVertexAttribs3dvNV glad_glVertexAttribs3dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3FVNVPROC glad_glVertexAttribs3fvNV;
+#define glVertexAttribs3fvNV glad_glVertexAttribs3fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3SVNVPROC glad_glVertexAttribs3svNV;
+#define glVertexAttribs3svNV glad_glVertexAttribs3svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4DVNVPROC glad_glVertexAttribs4dvNV;
+#define glVertexAttribs4dvNV glad_glVertexAttribs4dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4FVNVPROC glad_glVertexAttribs4fvNV;
+#define glVertexAttribs4fvNV glad_glVertexAttribs4fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4SVNVPROC glad_glVertexAttribs4svNV;
+#define glVertexAttribs4svNV glad_glVertexAttribs4svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4UBVNVPROC glad_glVertexAttribs4ubvNV;
+#define glVertexAttribs4ubvNV glad_glVertexAttribs4ubvNV
+GLAD_API_CALL PFNGLVERTEXPOINTERPROC glad_glVertexPointer;
+#define glVertexPointer glad_glVertexPointer
+GLAD_API_CALL PFNGLVERTEXPOINTEREXTPROC glad_glVertexPointerEXT;
+#define glVertexPointerEXT glad_glVertexPointerEXT
+GLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport;
+#define glViewport glad_glViewport
+GLAD_API_CALL PFNGLALPHAFUNCXPROC glad_glAlphaFuncx;
+#define glAlphaFuncx glad_glAlphaFuncx
+GLAD_API_CALL PFNGLBINDFRAMEBUFFEROESPROC glad_glBindFramebufferOES;
+#define glBindFramebufferOES glad_glBindFramebufferOES
+GLAD_API_CALL PFNGLBINDRENDERBUFFEROESPROC glad_glBindRenderbufferOES;
+#define glBindRenderbufferOES glad_glBindRenderbufferOES
+GLAD_API_CALL PFNGLBLENDEQUATIONOESPROC glad_glBlendEquationOES;
+#define glBlendEquationOES glad_glBlendEquationOES
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEOESPROC glad_glBlendEquationSeparateOES;
+#define glBlendEquationSeparateOES glad_glBlendEquationSeparateOES
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEOESPROC glad_glBlendFuncSeparateOES;
+#define glBlendFuncSeparateOES glad_glBlendFuncSeparateOES
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSOESPROC glad_glCheckFramebufferStatusOES;
+#define glCheckFramebufferStatusOES glad_glCheckFramebufferStatusOES
+GLAD_API_CALL PFNGLCLEARCOLORXPROC glad_glClearColorx;
+#define glClearColorx glad_glClearColorx
+GLAD_API_CALL PFNGLCLEARDEPTHFPROC glad_glClearDepthf;
+#define glClearDepthf glad_glClearDepthf
+GLAD_API_CALL PFNGLCLEARDEPTHFOESPROC glad_glClearDepthfOES;
+#define glClearDepthfOES glad_glClearDepthfOES
+GLAD_API_CALL PFNGLCLEARDEPTHXPROC glad_glClearDepthx;
+#define glClearDepthx glad_glClearDepthx
+GLAD_API_CALL PFNGLCLIPPLANEFPROC glad_glClipPlanef;
+#define glClipPlanef glad_glClipPlanef
+GLAD_API_CALL PFNGLCLIPPLANEFOESPROC glad_glClipPlanefOES;
+#define glClipPlanefOES glad_glClipPlanefOES
+GLAD_API_CALL PFNGLCLIPPLANEXPROC glad_glClipPlanex;
+#define glClipPlanex glad_glClipPlanex
+GLAD_API_CALL PFNGLCOLOR4XPROC glad_glColor4x;
+#define glColor4x glad_glColor4x
+GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D;
+#define glCompressedTexImage2D glad_glCompressedTexImage2D
+GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D;
+#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSOESPROC glad_glDeleteFramebuffersOES;
+#define glDeleteFramebuffersOES glad_glDeleteFramebuffersOES
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSOESPROC glad_glDeleteRenderbuffersOES;
+#define glDeleteRenderbuffersOES glad_glDeleteRenderbuffersOES
+GLAD_API_CALL PFNGLDEPTHRANGEFPROC glad_glDepthRangef;
+#define glDepthRangef glad_glDepthRangef
+GLAD_API_CALL PFNGLDEPTHRANGEFOESPROC glad_glDepthRangefOES;
+#define glDepthRangefOES glad_glDepthRangefOES
+GLAD_API_CALL PFNGLDEPTHRANGEXPROC glad_glDepthRangex;
+#define glDepthRangex glad_glDepthRangex
+GLAD_API_CALL PFNGLFOGXPROC glad_glFogx;
+#define glFogx glad_glFogx
+GLAD_API_CALL PFNGLFOGXVPROC glad_glFogxv;
+#define glFogxv glad_glFogxv
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFEROESPROC glad_glFramebufferRenderbufferOES;
+#define glFramebufferRenderbufferOES glad_glFramebufferRenderbufferOES
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DOESPROC glad_glFramebufferTexture2DOES;
+#define glFramebufferTexture2DOES glad_glFramebufferTexture2DOES
+GLAD_API_CALL PFNGLFRUSTUMFPROC glad_glFrustumf;
+#define glFrustumf glad_glFrustumf
+GLAD_API_CALL PFNGLFRUSTUMFOESPROC glad_glFrustumfOES;
+#define glFrustumfOES glad_glFrustumfOES
+GLAD_API_CALL PFNGLFRUSTUMXPROC glad_glFrustumx;
+#define glFrustumx glad_glFrustumx
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSOESPROC glad_glGenFramebuffersOES;
+#define glGenFramebuffersOES glad_glGenFramebuffersOES
+GLAD_API_CALL PFNGLGENRENDERBUFFERSOESPROC glad_glGenRenderbuffersOES;
+#define glGenRenderbuffersOES glad_glGenRenderbuffersOES
+GLAD_API_CALL PFNGLGENERATEMIPMAPOESPROC glad_glGenerateMipmapOES;
+#define glGenerateMipmapOES glad_glGenerateMipmapOES
+GLAD_API_CALL PFNGLGETCLIPPLANEFPROC glad_glGetClipPlanef;
+#define glGetClipPlanef glad_glGetClipPlanef
+GLAD_API_CALL PFNGLGETCLIPPLANEFOESPROC glad_glGetClipPlanefOES;
+#define glGetClipPlanefOES glad_glGetClipPlanefOES
+GLAD_API_CALL PFNGLGETCLIPPLANEXPROC glad_glGetClipPlanex;
+#define glGetClipPlanex glad_glGetClipPlanex
+GLAD_API_CALL PFNGLGETFIXEDVPROC glad_glGetFixedv;
+#define glGetFixedv glad_glGetFixedv
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC glad_glGetFramebufferAttachmentParameterivOES;
+#define glGetFramebufferAttachmentParameterivOES glad_glGetFramebufferAttachmentParameterivOES
+GLAD_API_CALL PFNGLGETLIGHTXVPROC glad_glGetLightxv;
+#define glGetLightxv glad_glGetLightxv
+GLAD_API_CALL PFNGLGETMATERIALXVPROC glad_glGetMaterialxv;
+#define glGetMaterialxv glad_glGetMaterialxv
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVOESPROC glad_glGetRenderbufferParameterivOES;
+#define glGetRenderbufferParameterivOES glad_glGetRenderbufferParameterivOES
+GLAD_API_CALL PFNGLGETTEXENVXVPROC glad_glGetTexEnvxv;
+#define glGetTexEnvxv glad_glGetTexEnvxv
+GLAD_API_CALL PFNGLGETTEXPARAMETERXVPROC glad_glGetTexParameterxv;
+#define glGetTexParameterxv glad_glGetTexParameterxv
+GLAD_API_CALL PFNGLISFRAMEBUFFEROESPROC glad_glIsFramebufferOES;
+#define glIsFramebufferOES glad_glIsFramebufferOES
+GLAD_API_CALL PFNGLISRENDERBUFFEROESPROC glad_glIsRenderbufferOES;
+#define glIsRenderbufferOES glad_glIsRenderbufferOES
+GLAD_API_CALL PFNGLLIGHTMODELXPROC glad_glLightModelx;
+#define glLightModelx glad_glLightModelx
+GLAD_API_CALL PFNGLLIGHTMODELXVPROC glad_glLightModelxv;
+#define glLightModelxv glad_glLightModelxv
+GLAD_API_CALL PFNGLLIGHTXPROC glad_glLightx;
+#define glLightx glad_glLightx
+GLAD_API_CALL PFNGLLIGHTXVPROC glad_glLightxv;
+#define glLightxv glad_glLightxv
+GLAD_API_CALL PFNGLLINEWIDTHXPROC glad_glLineWidthx;
+#define glLineWidthx glad_glLineWidthx
+GLAD_API_CALL PFNGLLOADMATRIXXPROC glad_glLoadMatrixx;
+#define glLoadMatrixx glad_glLoadMatrixx
+GLAD_API_CALL PFNGLMATERIALXPROC glad_glMaterialx;
+#define glMaterialx glad_glMaterialx
+GLAD_API_CALL PFNGLMATERIALXVPROC glad_glMaterialxv;
+#define glMaterialxv glad_glMaterialxv
+GLAD_API_CALL PFNGLMULTMATRIXXPROC glad_glMultMatrixx;
+#define glMultMatrixx glad_glMultMatrixx
+GLAD_API_CALL PFNGLMULTITEXCOORD4XPROC glad_glMultiTexCoord4x;
+#define glMultiTexCoord4x glad_glMultiTexCoord4x
+GLAD_API_CALL PFNGLNORMAL3XPROC glad_glNormal3x;
+#define glNormal3x glad_glNormal3x
+GLAD_API_CALL PFNGLORTHOFPROC glad_glOrthof;
+#define glOrthof glad_glOrthof
+GLAD_API_CALL PFNGLORTHOFOESPROC glad_glOrthofOES;
+#define glOrthofOES glad_glOrthofOES
+GLAD_API_CALL PFNGLORTHOXPROC glad_glOrthox;
+#define glOrthox glad_glOrthox
+GLAD_API_CALL PFNGLPOINTPARAMETERFPROC glad_glPointParameterf;
+#define glPointParameterf glad_glPointParameterf
+GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv;
+#define glPointParameterfv glad_glPointParameterfv
+GLAD_API_CALL PFNGLPOINTPARAMETERXPROC glad_glPointParameterx;
+#define glPointParameterx glad_glPointParameterx
+GLAD_API_CALL PFNGLPOINTPARAMETERXVPROC glad_glPointParameterxv;
+#define glPointParameterxv glad_glPointParameterxv
+GLAD_API_CALL PFNGLPOINTSIZEXPROC glad_glPointSizex;
+#define glPointSizex glad_glPointSizex
+GLAD_API_CALL PFNGLPOLYGONOFFSETXPROC glad_glPolygonOffsetx;
+#define glPolygonOffsetx glad_glPolygonOffsetx
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEOESPROC glad_glRenderbufferStorageOES;
+#define glRenderbufferStorageOES glad_glRenderbufferStorageOES
+GLAD_API_CALL PFNGLROTATEXPROC glad_glRotatex;
+#define glRotatex glad_glRotatex
+GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage;
+#define glSampleCoverage glad_glSampleCoverage
+GLAD_API_CALL PFNGLSAMPLECOVERAGEXPROC glad_glSampleCoveragex;
+#define glSampleCoveragex glad_glSampleCoveragex
+GLAD_API_CALL PFNGLSCALEXPROC glad_glScalex;
+#define glScalex glad_glScalex
+GLAD_API_CALL PFNGLTEXENVXPROC glad_glTexEnvx;
+#define glTexEnvx glad_glTexEnvx
+GLAD_API_CALL PFNGLTEXENVXVPROC glad_glTexEnvxv;
+#define glTexEnvxv glad_glTexEnvxv
+GLAD_API_CALL PFNGLTEXPARAMETERXPROC glad_glTexParameterx;
+#define glTexParameterx glad_glTexParameterx
+GLAD_API_CALL PFNGLTEXPARAMETERXVPROC glad_glTexParameterxv;
+#define glTexParameterxv glad_glTexParameterxv
+GLAD_API_CALL PFNGLTRANSLATEXPROC glad_glTranslatex;
+#define glTranslatex glad_glTranslatex
+
+
+
+
+
+GLAD_API_CALL int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr);
+GLAD_API_CALL int gladLoadGL( GLADloadfunc load);
+
+GLAD_API_CALL int gladLoadGLES1UserPtr( GLADuserptrloadfunc load, void *userptr);
+GLAD_API_CALL int gladLoadGLES1( GLADloadfunc load);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Source */
+#ifdef GLAD_GL_IMPLEMENTATION
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef GLAD_IMPL_UTIL_C_
+#define GLAD_IMPL_UTIL_C_
+
+#ifdef _MSC_VER
+#define GLAD_IMPL_UTIL_SSCANF sscanf_s
+#else
+#define GLAD_IMPL_UTIL_SSCANF sscanf
+#endif
+
+#endif /* GLAD_IMPL_UTIL_C_ */
+
+
+int GLAD_GL_VERSION_1_0 = 0;
+int GLAD_GL_VERSION_1_1 = 0;
+int GLAD_GL_VERSION_ES_CM_1_0 = 0;
+int GLAD_GL_ARB_copy_buffer = 0;
+int GLAD_GL_ARB_fragment_shader = 0;
+int GLAD_GL_ARB_framebuffer_object = 0;
+int GLAD_GL_ARB_geometry_shader4 = 0;
+int GLAD_GL_ARB_get_program_binary = 0;
+int GLAD_GL_ARB_imaging = 0;
+int GLAD_GL_ARB_multitexture = 0;
+int GLAD_GL_ARB_separate_shader_objects = 0;
+int GLAD_GL_ARB_shader_objects = 0;
+int GLAD_GL_ARB_shading_language_100 = 0;
+int GLAD_GL_ARB_texture_non_power_of_two = 0;
+int GLAD_GL_ARB_vertex_buffer_object = 0;
+int GLAD_GL_ARB_vertex_program = 0;
+int GLAD_GL_ARB_vertex_shader = 0;
+int GLAD_GL_EXT_blend_equation_separate = 0;
+int GLAD_GL_EXT_blend_func_separate = 0;
+int GLAD_GL_EXT_blend_minmax = 0;
+int GLAD_GL_EXT_blend_subtract = 0;
+int GLAD_GL_EXT_copy_texture = 0;
+int GLAD_GL_EXT_framebuffer_blit = 0;
+int GLAD_GL_EXT_framebuffer_multisample = 0;
+int GLAD_GL_EXT_framebuffer_object = 0;
+int GLAD_GL_EXT_geometry_shader4 = 0;
+int GLAD_GL_EXT_packed_depth_stencil = 0;
+int GLAD_GL_EXT_subtexture = 0;
+int GLAD_GL_EXT_texture_array = 0;
+int GLAD_GL_EXT_texture_object = 0;
+int GLAD_GL_EXT_texture_sRGB = 0;
+int GLAD_GL_EXT_vertex_array = 0;
+int GLAD_GL_INGR_blend_func_separate = 0;
+int GLAD_GL_KHR_debug = 0;
+int GLAD_GL_NV_geometry_program4 = 0;
+int GLAD_GL_NV_vertex_program = 0;
+int GLAD_GL_SGIS_texture_edge_clamp = 0;
+int GLAD_GL_EXT_sRGB = 0;
+int GLAD_GL_OES_blend_equation_separate = 0;
+int GLAD_GL_OES_blend_func_separate = 0;
+int GLAD_GL_OES_blend_subtract = 0;
+int GLAD_GL_OES_framebuffer_object = 0;
+int GLAD_GL_OES_packed_depth_stencil = 0;
+int GLAD_GL_OES_single_precision = 0;
+int GLAD_GL_OES_texture_npot = 0;
+
+
+
+PFNGLACCUMPROC glad_glAccum = NULL;
+PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram = NULL;
+PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL;
+PFNGLACTIVETEXTUREARBPROC glad_glActiveTextureARB = NULL;
+PFNGLALPHAFUNCPROC glad_glAlphaFunc = NULL;
+PFNGLAREPROGRAMSRESIDENTNVPROC glad_glAreProgramsResidentNV = NULL;
+PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident = NULL;
+PFNGLARETEXTURESRESIDENTEXTPROC glad_glAreTexturesResidentEXT = NULL;
+PFNGLARRAYELEMENTPROC glad_glArrayElement = NULL;
+PFNGLARRAYELEMENTEXTPROC glad_glArrayElementEXT = NULL;
+PFNGLATTACHOBJECTARBPROC glad_glAttachObjectARB = NULL;
+PFNGLATTACHSHADERPROC glad_glAttachShader = NULL;
+PFNGLBEGINPROC glad_glBegin = NULL;
+PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL;
+PFNGLBINDATTRIBLOCATIONARBPROC glad_glBindAttribLocationARB = NULL;
+PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL;
+PFNGLBINDBUFFERARBPROC glad_glBindBufferARB = NULL;
+PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL;
+PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT = NULL;
+PFNGLBINDPROGRAMARBPROC glad_glBindProgramARB = NULL;
+PFNGLBINDPROGRAMNVPROC glad_glBindProgramNV = NULL;
+PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline = NULL;
+PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL;
+PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT = NULL;
+PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL;
+PFNGLBINDTEXTUREEXTPROC glad_glBindTextureEXT = NULL;
+PFNGLBITMAPPROC glad_glBitmap = NULL;
+PFNGLBLENDCOLORPROC glad_glBlendColor = NULL;
+PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL;
+PFNGLBLENDEQUATIONEXTPROC glad_glBlendEquationEXT = NULL;
+PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL;
+PFNGLBLENDEQUATIONSEPARATEEXTPROC glad_glBlendEquationSeparateEXT = NULL;
+PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL;
+PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL;
+PFNGLBLENDFUNCSEPARATEEXTPROC glad_glBlendFuncSeparateEXT = NULL;
+PFNGLBLENDFUNCSEPARATEINGRPROC glad_glBlendFuncSeparateINGR = NULL;
+PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL;
+PFNGLBLITFRAMEBUFFEREXTPROC glad_glBlitFramebufferEXT = NULL;
+PFNGLBUFFERDATAPROC glad_glBufferData = NULL;
+PFNGLBUFFERDATAARBPROC glad_glBufferDataARB = NULL;
+PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL;
+PFNGLBUFFERSUBDATAARBPROC glad_glBufferSubDataARB = NULL;
+PFNGLCALLLISTPROC glad_glCallList = NULL;
+PFNGLCALLLISTSPROC glad_glCallLists = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT = NULL;
+PFNGLCLEARPROC glad_glClear = NULL;
+PFNGLCLEARACCUMPROC glad_glClearAccum = NULL;
+PFNGLCLEARCOLORPROC glad_glClearColor = NULL;
+PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL;
+PFNGLCLEARINDEXPROC glad_glClearIndex = NULL;
+PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL;
+PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture = NULL;
+PFNGLCLIENTACTIVETEXTUREARBPROC glad_glClientActiveTextureARB = NULL;
+PFNGLCLIPPLANEPROC glad_glClipPlane = NULL;
+PFNGLCOLOR3BPROC glad_glColor3b = NULL;
+PFNGLCOLOR3BVPROC glad_glColor3bv = NULL;
+PFNGLCOLOR3DPROC glad_glColor3d = NULL;
+PFNGLCOLOR3DVPROC glad_glColor3dv = NULL;
+PFNGLCOLOR3FPROC glad_glColor3f = NULL;
+PFNGLCOLOR3FVPROC glad_glColor3fv = NULL;
+PFNGLCOLOR3IPROC glad_glColor3i = NULL;
+PFNGLCOLOR3IVPROC glad_glColor3iv = NULL;
+PFNGLCOLOR3SPROC glad_glColor3s = NULL;
+PFNGLCOLOR3SVPROC glad_glColor3sv = NULL;
+PFNGLCOLOR3UBPROC glad_glColor3ub = NULL;
+PFNGLCOLOR3UBVPROC glad_glColor3ubv = NULL;
+PFNGLCOLOR3UIPROC glad_glColor3ui = NULL;
+PFNGLCOLOR3UIVPROC glad_glColor3uiv = NULL;
+PFNGLCOLOR3USPROC glad_glColor3us = NULL;
+PFNGLCOLOR3USVPROC glad_glColor3usv = NULL;
+PFNGLCOLOR4BPROC glad_glColor4b = NULL;
+PFNGLCOLOR4BVPROC glad_glColor4bv = NULL;
+PFNGLCOLOR4DPROC glad_glColor4d = NULL;
+PFNGLCOLOR4DVPROC glad_glColor4dv = NULL;
+PFNGLCOLOR4FPROC glad_glColor4f = NULL;
+PFNGLCOLOR4FVPROC glad_glColor4fv = NULL;
+PFNGLCOLOR4IPROC glad_glColor4i = NULL;
+PFNGLCOLOR4IVPROC glad_glColor4iv = NULL;
+PFNGLCOLOR4SPROC glad_glColor4s = NULL;
+PFNGLCOLOR4SVPROC glad_glColor4sv = NULL;
+PFNGLCOLOR4UBPROC glad_glColor4ub = NULL;
+PFNGLCOLOR4UBVPROC glad_glColor4ubv = NULL;
+PFNGLCOLOR4UIPROC glad_glColor4ui = NULL;
+PFNGLCOLOR4UIVPROC glad_glColor4uiv = NULL;
+PFNGLCOLOR4USPROC glad_glColor4us = NULL;
+PFNGLCOLOR4USVPROC glad_glColor4usv = NULL;
+PFNGLCOLORMASKPROC glad_glColorMask = NULL;
+PFNGLCOLORMATERIALPROC glad_glColorMaterial = NULL;
+PFNGLCOLORPOINTERPROC glad_glColorPointer = NULL;
+PFNGLCOLORPOINTEREXTPROC glad_glColorPointerEXT = NULL;
+PFNGLCOLORSUBTABLEPROC glad_glColorSubTable = NULL;
+PFNGLCOLORTABLEPROC glad_glColorTable = NULL;
+PFNGLCOLORTABLEPARAMETERFVPROC glad_glColorTableParameterfv = NULL;
+PFNGLCOLORTABLEPARAMETERIVPROC glad_glColorTableParameteriv = NULL;
+PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL;
+PFNGLCOMPILESHADERARBPROC glad_glCompileShaderARB = NULL;
+PFNGLCONVOLUTIONFILTER1DPROC glad_glConvolutionFilter1D = NULL;
+PFNGLCONVOLUTIONFILTER2DPROC glad_glConvolutionFilter2D = NULL;
+PFNGLCONVOLUTIONPARAMETERFPROC glad_glConvolutionParameterf = NULL;
+PFNGLCONVOLUTIONPARAMETERFVPROC glad_glConvolutionParameterfv = NULL;
+PFNGLCONVOLUTIONPARAMETERIPROC glad_glConvolutionParameteri = NULL;
+PFNGLCONVOLUTIONPARAMETERIVPROC glad_glConvolutionParameteriv = NULL;
+PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL;
+PFNGLCOPYCOLORSUBTABLEPROC glad_glCopyColorSubTable = NULL;
+PFNGLCOPYCOLORTABLEPROC glad_glCopyColorTable = NULL;
+PFNGLCOPYCONVOLUTIONFILTER1DPROC glad_glCopyConvolutionFilter1D = NULL;
+PFNGLCOPYCONVOLUTIONFILTER2DPROC glad_glCopyConvolutionFilter2D = NULL;
+PFNGLCOPYPIXELSPROC glad_glCopyPixels = NULL;
+PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL;
+PFNGLCOPYTEXIMAGE1DEXTPROC glad_glCopyTexImage1DEXT = NULL;
+PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL;
+PFNGLCOPYTEXIMAGE2DEXTPROC glad_glCopyTexImage2DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL;
+PFNGLCOPYTEXSUBIMAGE1DEXTPROC glad_glCopyTexSubImage1DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL;
+PFNGLCOPYTEXSUBIMAGE2DEXTPROC glad_glCopyTexSubImage2DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL;
+PFNGLCOPYTEXSUBIMAGE3DEXTPROC glad_glCopyTexSubImage3DEXT = NULL;
+PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL;
+PFNGLCREATEPROGRAMOBJECTARBPROC glad_glCreateProgramObjectARB = NULL;
+PFNGLCREATESHADERPROC glad_glCreateShader = NULL;
+PFNGLCREATESHADEROBJECTARBPROC glad_glCreateShaderObjectARB = NULL;
+PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv = NULL;
+PFNGLCULLFACEPROC glad_glCullFace = NULL;
+PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback = NULL;
+PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl = NULL;
+PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert = NULL;
+PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL;
+PFNGLDELETEBUFFERSARBPROC glad_glDeleteBuffersARB = NULL;
+PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL;
+PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT = NULL;
+PFNGLDELETELISTSPROC glad_glDeleteLists = NULL;
+PFNGLDELETEOBJECTARBPROC glad_glDeleteObjectARB = NULL;
+PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines = NULL;
+PFNGLDELETEPROGRAMSARBPROC glad_glDeleteProgramsARB = NULL;
+PFNGLDELETEPROGRAMSNVPROC glad_glDeleteProgramsNV = NULL;
+PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL;
+PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT = NULL;
+PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL;
+PFNGLDELETETEXTURESEXTPROC glad_glDeleteTexturesEXT = NULL;
+PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL;
+PFNGLDEPTHMASKPROC glad_glDepthMask = NULL;
+PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL;
+PFNGLDETACHOBJECTARBPROC glad_glDetachObjectARB = NULL;
+PFNGLDETACHSHADERPROC glad_glDetachShader = NULL;
+PFNGLDISABLEPROC glad_glDisable = NULL;
+PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState = NULL;
+PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL;
+PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glad_glDisableVertexAttribArrayARB = NULL;
+PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL;
+PFNGLDRAWARRAYSEXTPROC glad_glDrawArraysEXT = NULL;
+PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL;
+PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL;
+PFNGLDRAWPIXELSPROC glad_glDrawPixels = NULL;
+PFNGLEDGEFLAGPROC glad_glEdgeFlag = NULL;
+PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer = NULL;
+PFNGLEDGEFLAGPOINTEREXTPROC glad_glEdgeFlagPointerEXT = NULL;
+PFNGLEDGEFLAGVPROC glad_glEdgeFlagv = NULL;
+PFNGLENABLEPROC glad_glEnable = NULL;
+PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState = NULL;
+PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL;
+PFNGLENABLEVERTEXATTRIBARRAYARBPROC glad_glEnableVertexAttribArrayARB = NULL;
+PFNGLENDPROC glad_glEnd = NULL;
+PFNGLENDLISTPROC glad_glEndList = NULL;
+PFNGLEVALCOORD1DPROC glad_glEvalCoord1d = NULL;
+PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv = NULL;
+PFNGLEVALCOORD1FPROC glad_glEvalCoord1f = NULL;
+PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv = NULL;
+PFNGLEVALCOORD2DPROC glad_glEvalCoord2d = NULL;
+PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv = NULL;
+PFNGLEVALCOORD2FPROC glad_glEvalCoord2f = NULL;
+PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv = NULL;
+PFNGLEVALMESH1PROC glad_glEvalMesh1 = NULL;
+PFNGLEVALMESH2PROC glad_glEvalMesh2 = NULL;
+PFNGLEVALPOINT1PROC glad_glEvalPoint1 = NULL;
+PFNGLEVALPOINT2PROC glad_glEvalPoint2 = NULL;
+PFNGLEXECUTEPROGRAMNVPROC glad_glExecuteProgramNV = NULL;
+PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer = NULL;
+PFNGLFINISHPROC glad_glFinish = NULL;
+PFNGLFLUSHPROC glad_glFlush = NULL;
+PFNGLFOGFPROC glad_glFogf = NULL;
+PFNGLFOGFVPROC glad_glFogfv = NULL;
+PFNGLFOGIPROC glad_glFogi = NULL;
+PFNGLFOGIVPROC glad_glFogiv = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREARBPROC glad_glFramebufferTextureARB = NULL;
+PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREFACEARBPROC glad_glFramebufferTextureFaceARB = NULL;
+PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC glad_glFramebufferTextureFaceEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERARBPROC glad_glFramebufferTextureLayerARB = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC glad_glFramebufferTextureLayerEXT = NULL;
+PFNGLFRONTFACEPROC glad_glFrontFace = NULL;
+PFNGLFRUSTUMPROC glad_glFrustum = NULL;
+PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL;
+PFNGLGENBUFFERSARBPROC glad_glGenBuffersARB = NULL;
+PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL;
+PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT = NULL;
+PFNGLGENLISTSPROC glad_glGenLists = NULL;
+PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines = NULL;
+PFNGLGENPROGRAMSARBPROC glad_glGenProgramsARB = NULL;
+PFNGLGENPROGRAMSNVPROC glad_glGenProgramsNV = NULL;
+PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL;
+PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT = NULL;
+PFNGLGENTEXTURESPROC glad_glGenTextures = NULL;
+PFNGLGENTEXTURESEXTPROC glad_glGenTexturesEXT = NULL;
+PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL;
+PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT = NULL;
+PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL;
+PFNGLGETACTIVEATTRIBARBPROC glad_glGetActiveAttribARB = NULL;
+PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL;
+PFNGLGETACTIVEUNIFORMARBPROC glad_glGetActiveUniformARB = NULL;
+PFNGLGETATTACHEDOBJECTSARBPROC glad_glGetAttachedObjectsARB = NULL;
+PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL;
+PFNGLGETATTRIBLOCATIONARBPROC glad_glGetAttribLocationARB = NULL;
+PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL;
+PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL;
+PFNGLGETBUFFERPARAMETERIVARBPROC glad_glGetBufferParameterivARB = NULL;
+PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL;
+PFNGLGETBUFFERPOINTERVARBPROC glad_glGetBufferPointervARB = NULL;
+PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL;
+PFNGLGETBUFFERSUBDATAARBPROC glad_glGetBufferSubDataARB = NULL;
+PFNGLGETCLIPPLANEPROC glad_glGetClipPlane = NULL;
+PFNGLGETCOLORTABLEPROC glad_glGetColorTable = NULL;
+PFNGLGETCOLORTABLEPARAMETERFVPROC glad_glGetColorTableParameterfv = NULL;
+PFNGLGETCOLORTABLEPARAMETERIVPROC glad_glGetColorTableParameteriv = NULL;
+PFNGLGETCONVOLUTIONFILTERPROC glad_glGetConvolutionFilter = NULL;
+PFNGLGETCONVOLUTIONPARAMETERFVPROC glad_glGetConvolutionParameterfv = NULL;
+PFNGLGETCONVOLUTIONPARAMETERIVPROC glad_glGetConvolutionParameteriv = NULL;
+PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog = NULL;
+PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL;
+PFNGLGETERRORPROC glad_glGetError = NULL;
+PFNGLGETFLOATVPROC glad_glGetFloatv = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT = NULL;
+PFNGLGETHANDLEARBPROC glad_glGetHandleARB = NULL;
+PFNGLGETHISTOGRAMPROC glad_glGetHistogram = NULL;
+PFNGLGETHISTOGRAMPARAMETERFVPROC glad_glGetHistogramParameterfv = NULL;
+PFNGLGETHISTOGRAMPARAMETERIVPROC glad_glGetHistogramParameteriv = NULL;
+PFNGLGETINFOLOGARBPROC glad_glGetInfoLogARB = NULL;
+PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL;
+PFNGLGETLIGHTFVPROC glad_glGetLightfv = NULL;
+PFNGLGETLIGHTIVPROC glad_glGetLightiv = NULL;
+PFNGLGETMAPDVPROC glad_glGetMapdv = NULL;
+PFNGLGETMAPFVPROC glad_glGetMapfv = NULL;
+PFNGLGETMAPIVPROC glad_glGetMapiv = NULL;
+PFNGLGETMATERIALFVPROC glad_glGetMaterialfv = NULL;
+PFNGLGETMATERIALIVPROC glad_glGetMaterialiv = NULL;
+PFNGLGETMINMAXPROC glad_glGetMinmax = NULL;
+PFNGLGETMINMAXPARAMETERFVPROC glad_glGetMinmaxParameterfv = NULL;
+PFNGLGETMINMAXPARAMETERIVPROC glad_glGetMinmaxParameteriv = NULL;
+PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel = NULL;
+PFNGLGETOBJECTPARAMETERFVARBPROC glad_glGetObjectParameterfvARB = NULL;
+PFNGLGETOBJECTPARAMETERIVARBPROC glad_glGetObjectParameterivARB = NULL;
+PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel = NULL;
+PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv = NULL;
+PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv = NULL;
+PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv = NULL;
+PFNGLGETPOINTERVPROC glad_glGetPointerv = NULL;
+PFNGLGETPOINTERVEXTPROC glad_glGetPointervEXT = NULL;
+PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple = NULL;
+PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary = NULL;
+PFNGLGETPROGRAMENVPARAMETERDVARBPROC glad_glGetProgramEnvParameterdvARB = NULL;
+PFNGLGETPROGRAMENVPARAMETERFVARBPROC glad_glGetProgramEnvParameterfvARB = NULL;
+PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glad_glGetProgramLocalParameterdvARB = NULL;
+PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glad_glGetProgramLocalParameterfvARB = NULL;
+PFNGLGETPROGRAMPARAMETERDVNVPROC glad_glGetProgramParameterdvNV = NULL;
+PFNGLGETPROGRAMPARAMETERFVNVPROC glad_glGetProgramParameterfvNV = NULL;
+PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog = NULL;
+PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv = NULL;
+PFNGLGETPROGRAMSTRINGARBPROC glad_glGetProgramStringARB = NULL;
+PFNGLGETPROGRAMSTRINGNVPROC glad_glGetProgramStringNV = NULL;
+PFNGLGETPROGRAMIVARBPROC glad_glGetProgramivARB = NULL;
+PFNGLGETPROGRAMIVNVPROC glad_glGetProgramivNV = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT = NULL;
+PFNGLGETSEPARABLEFILTERPROC glad_glGetSeparableFilter = NULL;
+PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL;
+PFNGLGETSHADERSOURCEARBPROC glad_glGetShaderSourceARB = NULL;
+PFNGLGETSTRINGPROC glad_glGetString = NULL;
+PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv = NULL;
+PFNGLGETTEXENVIVPROC glad_glGetTexEnviv = NULL;
+PFNGLGETTEXGENDVPROC glad_glGetTexGendv = NULL;
+PFNGLGETTEXGENFVPROC glad_glGetTexGenfv = NULL;
+PFNGLGETTEXGENIVPROC glad_glGetTexGeniv = NULL;
+PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL;
+PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL;
+PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL;
+PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL;
+PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL;
+PFNGLGETTRACKMATRIXIVNVPROC glad_glGetTrackMatrixivNV = NULL;
+PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL;
+PFNGLGETUNIFORMLOCATIONARBPROC glad_glGetUniformLocationARB = NULL;
+PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL;
+PFNGLGETUNIFORMFVARBPROC glad_glGetUniformfvARB = NULL;
+PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL;
+PFNGLGETUNIFORMIVARBPROC glad_glGetUniformivARB = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVARBPROC glad_glGetVertexAttribPointervARB = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVNVPROC glad_glGetVertexAttribPointervNV = NULL;
+PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL;
+PFNGLGETVERTEXATTRIBDVARBPROC glad_glGetVertexAttribdvARB = NULL;
+PFNGLGETVERTEXATTRIBDVNVPROC glad_glGetVertexAttribdvNV = NULL;
+PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL;
+PFNGLGETVERTEXATTRIBFVARBPROC glad_glGetVertexAttribfvARB = NULL;
+PFNGLGETVERTEXATTRIBFVNVPROC glad_glGetVertexAttribfvNV = NULL;
+PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL;
+PFNGLGETVERTEXATTRIBIVARBPROC glad_glGetVertexAttribivARB = NULL;
+PFNGLGETVERTEXATTRIBIVNVPROC glad_glGetVertexAttribivNV = NULL;
+PFNGLHINTPROC glad_glHint = NULL;
+PFNGLHISTOGRAMPROC glad_glHistogram = NULL;
+PFNGLINDEXMASKPROC glad_glIndexMask = NULL;
+PFNGLINDEXPOINTERPROC glad_glIndexPointer = NULL;
+PFNGLINDEXPOINTEREXTPROC glad_glIndexPointerEXT = NULL;
+PFNGLINDEXDPROC glad_glIndexd = NULL;
+PFNGLINDEXDVPROC glad_glIndexdv = NULL;
+PFNGLINDEXFPROC glad_glIndexf = NULL;
+PFNGLINDEXFVPROC glad_glIndexfv = NULL;
+PFNGLINDEXIPROC glad_glIndexi = NULL;
+PFNGLINDEXIVPROC glad_glIndexiv = NULL;
+PFNGLINDEXSPROC glad_glIndexs = NULL;
+PFNGLINDEXSVPROC glad_glIndexsv = NULL;
+PFNGLINDEXUBPROC glad_glIndexub = NULL;
+PFNGLINDEXUBVPROC glad_glIndexubv = NULL;
+PFNGLINITNAMESPROC glad_glInitNames = NULL;
+PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays = NULL;
+PFNGLISBUFFERPROC glad_glIsBuffer = NULL;
+PFNGLISBUFFERARBPROC glad_glIsBufferARB = NULL;
+PFNGLISENABLEDPROC glad_glIsEnabled = NULL;
+PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL;
+PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT = NULL;
+PFNGLISLISTPROC glad_glIsList = NULL;
+PFNGLISPROGRAMARBPROC glad_glIsProgramARB = NULL;
+PFNGLISPROGRAMNVPROC glad_glIsProgramNV = NULL;
+PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline = NULL;
+PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL;
+PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT = NULL;
+PFNGLISTEXTUREPROC glad_glIsTexture = NULL;
+PFNGLISTEXTUREEXTPROC glad_glIsTextureEXT = NULL;
+PFNGLLIGHTMODELFPROC glad_glLightModelf = NULL;
+PFNGLLIGHTMODELFVPROC glad_glLightModelfv = NULL;
+PFNGLLIGHTMODELIPROC glad_glLightModeli = NULL;
+PFNGLLIGHTMODELIVPROC glad_glLightModeliv = NULL;
+PFNGLLIGHTFPROC glad_glLightf = NULL;
+PFNGLLIGHTFVPROC glad_glLightfv = NULL;
+PFNGLLIGHTIPROC glad_glLighti = NULL;
+PFNGLLIGHTIVPROC glad_glLightiv = NULL;
+PFNGLLINESTIPPLEPROC glad_glLineStipple = NULL;
+PFNGLLINEWIDTHPROC glad_glLineWidth = NULL;
+PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL;
+PFNGLLINKPROGRAMARBPROC glad_glLinkProgramARB = NULL;
+PFNGLLISTBASEPROC glad_glListBase = NULL;
+PFNGLLOADIDENTITYPROC glad_glLoadIdentity = NULL;
+PFNGLLOADMATRIXDPROC glad_glLoadMatrixd = NULL;
+PFNGLLOADMATRIXFPROC glad_glLoadMatrixf = NULL;
+PFNGLLOADNAMEPROC glad_glLoadName = NULL;
+PFNGLLOADPROGRAMNVPROC glad_glLoadProgramNV = NULL;
+PFNGLLOGICOPPROC glad_glLogicOp = NULL;
+PFNGLMAP1DPROC glad_glMap1d = NULL;
+PFNGLMAP1FPROC glad_glMap1f = NULL;
+PFNGLMAP2DPROC glad_glMap2d = NULL;
+PFNGLMAP2FPROC glad_glMap2f = NULL;
+PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL;
+PFNGLMAPBUFFERARBPROC glad_glMapBufferARB = NULL;
+PFNGLMAPGRID1DPROC glad_glMapGrid1d = NULL;
+PFNGLMAPGRID1FPROC glad_glMapGrid1f = NULL;
+PFNGLMAPGRID2DPROC glad_glMapGrid2d = NULL;
+PFNGLMAPGRID2FPROC glad_glMapGrid2f = NULL;
+PFNGLMATERIALFPROC glad_glMaterialf = NULL;
+PFNGLMATERIALFVPROC glad_glMaterialfv = NULL;
+PFNGLMATERIALIPROC glad_glMateriali = NULL;
+PFNGLMATERIALIVPROC glad_glMaterialiv = NULL;
+PFNGLMATRIXMODEPROC glad_glMatrixMode = NULL;
+PFNGLMINMAXPROC glad_glMinmax = NULL;
+PFNGLMULTMATRIXDPROC glad_glMultMatrixd = NULL;
+PFNGLMULTMATRIXFPROC glad_glMultMatrixf = NULL;
+PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d = NULL;
+PFNGLMULTITEXCOORD1DARBPROC glad_glMultiTexCoord1dARB = NULL;
+PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv = NULL;
+PFNGLMULTITEXCOORD1DVARBPROC glad_glMultiTexCoord1dvARB = NULL;
+PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f = NULL;
+PFNGLMULTITEXCOORD1FARBPROC glad_glMultiTexCoord1fARB = NULL;
+PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv = NULL;
+PFNGLMULTITEXCOORD1FVARBPROC glad_glMultiTexCoord1fvARB = NULL;
+PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i = NULL;
+PFNGLMULTITEXCOORD1IARBPROC glad_glMultiTexCoord1iARB = NULL;
+PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv = NULL;
+PFNGLMULTITEXCOORD1IVARBPROC glad_glMultiTexCoord1ivARB = NULL;
+PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s = NULL;
+PFNGLMULTITEXCOORD1SARBPROC glad_glMultiTexCoord1sARB = NULL;
+PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv = NULL;
+PFNGLMULTITEXCOORD1SVARBPROC glad_glMultiTexCoord1svARB = NULL;
+PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d = NULL;
+PFNGLMULTITEXCOORD2DARBPROC glad_glMultiTexCoord2dARB = NULL;
+PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv = NULL;
+PFNGLMULTITEXCOORD2DVARBPROC glad_glMultiTexCoord2dvARB = NULL;
+PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f = NULL;
+PFNGLMULTITEXCOORD2FARBPROC glad_glMultiTexCoord2fARB = NULL;
+PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv = NULL;
+PFNGLMULTITEXCOORD2FVARBPROC glad_glMultiTexCoord2fvARB = NULL;
+PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i = NULL;
+PFNGLMULTITEXCOORD2IARBPROC glad_glMultiTexCoord2iARB = NULL;
+PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv = NULL;
+PFNGLMULTITEXCOORD2IVARBPROC glad_glMultiTexCoord2ivARB = NULL;
+PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s = NULL;
+PFNGLMULTITEXCOORD2SARBPROC glad_glMultiTexCoord2sARB = NULL;
+PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv = NULL;
+PFNGLMULTITEXCOORD2SVARBPROC glad_glMultiTexCoord2svARB = NULL;
+PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d = NULL;
+PFNGLMULTITEXCOORD3DARBPROC glad_glMultiTexCoord3dARB = NULL;
+PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv = NULL;
+PFNGLMULTITEXCOORD3DVARBPROC glad_glMultiTexCoord3dvARB = NULL;
+PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f = NULL;
+PFNGLMULTITEXCOORD3FARBPROC glad_glMultiTexCoord3fARB = NULL;
+PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv = NULL;
+PFNGLMULTITEXCOORD3FVARBPROC glad_glMultiTexCoord3fvARB = NULL;
+PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i = NULL;
+PFNGLMULTITEXCOORD3IARBPROC glad_glMultiTexCoord3iARB = NULL;
+PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv = NULL;
+PFNGLMULTITEXCOORD3IVARBPROC glad_glMultiTexCoord3ivARB = NULL;
+PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s = NULL;
+PFNGLMULTITEXCOORD3SARBPROC glad_glMultiTexCoord3sARB = NULL;
+PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv = NULL;
+PFNGLMULTITEXCOORD3SVARBPROC glad_glMultiTexCoord3svARB = NULL;
+PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d = NULL;
+PFNGLMULTITEXCOORD4DARBPROC glad_glMultiTexCoord4dARB = NULL;
+PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv = NULL;
+PFNGLMULTITEXCOORD4DVARBPROC glad_glMultiTexCoord4dvARB = NULL;
+PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f = NULL;
+PFNGLMULTITEXCOORD4FARBPROC glad_glMultiTexCoord4fARB = NULL;
+PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv = NULL;
+PFNGLMULTITEXCOORD4FVARBPROC glad_glMultiTexCoord4fvARB = NULL;
+PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i = NULL;
+PFNGLMULTITEXCOORD4IARBPROC glad_glMultiTexCoord4iARB = NULL;
+PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv = NULL;
+PFNGLMULTITEXCOORD4IVARBPROC glad_glMultiTexCoord4ivARB = NULL;
+PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s = NULL;
+PFNGLMULTITEXCOORD4SARBPROC glad_glMultiTexCoord4sARB = NULL;
+PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv = NULL;
+PFNGLMULTITEXCOORD4SVARBPROC glad_glMultiTexCoord4svARB = NULL;
+PFNGLNEWLISTPROC glad_glNewList = NULL;
+PFNGLNORMAL3BPROC glad_glNormal3b = NULL;
+PFNGLNORMAL3BVPROC glad_glNormal3bv = NULL;
+PFNGLNORMAL3DPROC glad_glNormal3d = NULL;
+PFNGLNORMAL3DVPROC glad_glNormal3dv = NULL;
+PFNGLNORMAL3FPROC glad_glNormal3f = NULL;
+PFNGLNORMAL3FVPROC glad_glNormal3fv = NULL;
+PFNGLNORMAL3IPROC glad_glNormal3i = NULL;
+PFNGLNORMAL3IVPROC glad_glNormal3iv = NULL;
+PFNGLNORMAL3SPROC glad_glNormal3s = NULL;
+PFNGLNORMAL3SVPROC glad_glNormal3sv = NULL;
+PFNGLNORMALPOINTERPROC glad_glNormalPointer = NULL;
+PFNGLNORMALPOINTEREXTPROC glad_glNormalPointerEXT = NULL;
+PFNGLOBJECTLABELPROC glad_glObjectLabel = NULL;
+PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel = NULL;
+PFNGLORTHOPROC glad_glOrtho = NULL;
+PFNGLPASSTHROUGHPROC glad_glPassThrough = NULL;
+PFNGLPIXELMAPFVPROC glad_glPixelMapfv = NULL;
+PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv = NULL;
+PFNGLPIXELMAPUSVPROC glad_glPixelMapusv = NULL;
+PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL;
+PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL;
+PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf = NULL;
+PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi = NULL;
+PFNGLPIXELZOOMPROC glad_glPixelZoom = NULL;
+PFNGLPOINTSIZEPROC glad_glPointSize = NULL;
+PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL;
+PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL;
+PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple = NULL;
+PFNGLPOPATTRIBPROC glad_glPopAttrib = NULL;
+PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib = NULL;
+PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup = NULL;
+PFNGLPOPMATRIXPROC glad_glPopMatrix = NULL;
+PFNGLPOPNAMEPROC glad_glPopName = NULL;
+PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures = NULL;
+PFNGLPRIORITIZETEXTURESEXTPROC glad_glPrioritizeTexturesEXT = NULL;
+PFNGLPROGRAMBINARYPROC glad_glProgramBinary = NULL;
+PFNGLPROGRAMENVPARAMETER4DARBPROC glad_glProgramEnvParameter4dARB = NULL;
+PFNGLPROGRAMENVPARAMETER4DVARBPROC glad_glProgramEnvParameter4dvARB = NULL;
+PFNGLPROGRAMENVPARAMETER4FARBPROC glad_glProgramEnvParameter4fARB = NULL;
+PFNGLPROGRAMENVPARAMETER4FVARBPROC glad_glProgramEnvParameter4fvARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4DARBPROC glad_glProgramLocalParameter4dARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glad_glProgramLocalParameter4dvARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4FARBPROC glad_glProgramLocalParameter4fARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glad_glProgramLocalParameter4fvARB = NULL;
+PFNGLPROGRAMPARAMETER4DNVPROC glad_glProgramParameter4dNV = NULL;
+PFNGLPROGRAMPARAMETER4DVNVPROC glad_glProgramParameter4dvNV = NULL;
+PFNGLPROGRAMPARAMETER4FNVPROC glad_glProgramParameter4fNV = NULL;
+PFNGLPROGRAMPARAMETER4FVNVPROC glad_glProgramParameter4fvNV = NULL;
+PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri = NULL;
+PFNGLPROGRAMPARAMETERIARBPROC glad_glProgramParameteriARB = NULL;
+PFNGLPROGRAMPARAMETERIEXTPROC glad_glProgramParameteriEXT = NULL;
+PFNGLPROGRAMPARAMETERS4DVNVPROC glad_glProgramParameters4dvNV = NULL;
+PFNGLPROGRAMPARAMETERS4FVNVPROC glad_glProgramParameters4fvNV = NULL;
+PFNGLPROGRAMSTRINGARBPROC glad_glProgramStringARB = NULL;
+PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d = NULL;
+PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv = NULL;
+PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f = NULL;
+PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv = NULL;
+PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i = NULL;
+PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv = NULL;
+PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui = NULL;
+PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv = NULL;
+PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d = NULL;
+PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv = NULL;
+PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f = NULL;
+PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv = NULL;
+PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i = NULL;
+PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv = NULL;
+PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui = NULL;
+PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv = NULL;
+PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d = NULL;
+PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv = NULL;
+PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f = NULL;
+PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv = NULL;
+PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i = NULL;
+PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv = NULL;
+PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui = NULL;
+PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv = NULL;
+PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d = NULL;
+PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv = NULL;
+PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f = NULL;
+PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv = NULL;
+PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i = NULL;
+PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv = NULL;
+PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui = NULL;
+PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv = NULL;
+PFNGLPROGRAMVERTEXLIMITNVPROC glad_glProgramVertexLimitNV = NULL;
+PFNGLPUSHATTRIBPROC glad_glPushAttrib = NULL;
+PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib = NULL;
+PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup = NULL;
+PFNGLPUSHMATRIXPROC glad_glPushMatrix = NULL;
+PFNGLPUSHNAMEPROC glad_glPushName = NULL;
+PFNGLRASTERPOS2DPROC glad_glRasterPos2d = NULL;
+PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv = NULL;
+PFNGLRASTERPOS2FPROC glad_glRasterPos2f = NULL;
+PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv = NULL;
+PFNGLRASTERPOS2IPROC glad_glRasterPos2i = NULL;
+PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv = NULL;
+PFNGLRASTERPOS2SPROC glad_glRasterPos2s = NULL;
+PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv = NULL;
+PFNGLRASTERPOS3DPROC glad_glRasterPos3d = NULL;
+PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv = NULL;
+PFNGLRASTERPOS3FPROC glad_glRasterPos3f = NULL;
+PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv = NULL;
+PFNGLRASTERPOS3IPROC glad_glRasterPos3i = NULL;
+PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv = NULL;
+PFNGLRASTERPOS3SPROC glad_glRasterPos3s = NULL;
+PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv = NULL;
+PFNGLRASTERPOS4DPROC glad_glRasterPos4d = NULL;
+PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv = NULL;
+PFNGLRASTERPOS4FPROC glad_glRasterPos4f = NULL;
+PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv = NULL;
+PFNGLRASTERPOS4IPROC glad_glRasterPos4i = NULL;
+PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv = NULL;
+PFNGLRASTERPOS4SPROC glad_glRasterPos4s = NULL;
+PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv = NULL;
+PFNGLREADBUFFERPROC glad_glReadBuffer = NULL;
+PFNGLREADPIXELSPROC glad_glReadPixels = NULL;
+PFNGLRECTDPROC glad_glRectd = NULL;
+PFNGLRECTDVPROC glad_glRectdv = NULL;
+PFNGLRECTFPROC glad_glRectf = NULL;
+PFNGLRECTFVPROC glad_glRectfv = NULL;
+PFNGLRECTIPROC glad_glRecti = NULL;
+PFNGLRECTIVPROC glad_glRectiv = NULL;
+PFNGLRECTSPROC glad_glRects = NULL;
+PFNGLRECTSVPROC glad_glRectsv = NULL;
+PFNGLRENDERMODEPROC glad_glRenderMode = NULL;
+PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL;
+PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT = NULL;
+PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL;
+PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glRenderbufferStorageMultisampleEXT = NULL;
+PFNGLREQUESTRESIDENTPROGRAMSNVPROC glad_glRequestResidentProgramsNV = NULL;
+PFNGLRESETHISTOGRAMPROC glad_glResetHistogram = NULL;
+PFNGLRESETMINMAXPROC glad_glResetMinmax = NULL;
+PFNGLROTATEDPROC glad_glRotated = NULL;
+PFNGLROTATEFPROC glad_glRotatef = NULL;
+PFNGLSCALEDPROC glad_glScaled = NULL;
+PFNGLSCALEFPROC glad_glScalef = NULL;
+PFNGLSCISSORPROC glad_glScissor = NULL;
+PFNGLSELECTBUFFERPROC glad_glSelectBuffer = NULL;
+PFNGLSEPARABLEFILTER2DPROC glad_glSeparableFilter2D = NULL;
+PFNGLSHADEMODELPROC glad_glShadeModel = NULL;
+PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL;
+PFNGLSHADERSOURCEARBPROC glad_glShaderSourceARB = NULL;
+PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL;
+PFNGLSTENCILMASKPROC glad_glStencilMask = NULL;
+PFNGLSTENCILOPPROC glad_glStencilOp = NULL;
+PFNGLTEXCOORD1DPROC glad_glTexCoord1d = NULL;
+PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv = NULL;
+PFNGLTEXCOORD1FPROC glad_glTexCoord1f = NULL;
+PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv = NULL;
+PFNGLTEXCOORD1IPROC glad_glTexCoord1i = NULL;
+PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv = NULL;
+PFNGLTEXCOORD1SPROC glad_glTexCoord1s = NULL;
+PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv = NULL;
+PFNGLTEXCOORD2DPROC glad_glTexCoord2d = NULL;
+PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv = NULL;
+PFNGLTEXCOORD2FPROC glad_glTexCoord2f = NULL;
+PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv = NULL;
+PFNGLTEXCOORD2IPROC glad_glTexCoord2i = NULL;
+PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv = NULL;
+PFNGLTEXCOORD2SPROC glad_glTexCoord2s = NULL;
+PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv = NULL;
+PFNGLTEXCOORD3DPROC glad_glTexCoord3d = NULL;
+PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv = NULL;
+PFNGLTEXCOORD3FPROC glad_glTexCoord3f = NULL;
+PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv = NULL;
+PFNGLTEXCOORD3IPROC glad_glTexCoord3i = NULL;
+PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv = NULL;
+PFNGLTEXCOORD3SPROC glad_glTexCoord3s = NULL;
+PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv = NULL;
+PFNGLTEXCOORD4DPROC glad_glTexCoord4d = NULL;
+PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv = NULL;
+PFNGLTEXCOORD4FPROC glad_glTexCoord4f = NULL;
+PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv = NULL;
+PFNGLTEXCOORD4IPROC glad_glTexCoord4i = NULL;
+PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv = NULL;
+PFNGLTEXCOORD4SPROC glad_glTexCoord4s = NULL;
+PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv = NULL;
+PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer = NULL;
+PFNGLTEXCOORDPOINTEREXTPROC glad_glTexCoordPointerEXT = NULL;
+PFNGLTEXENVFPROC glad_glTexEnvf = NULL;
+PFNGLTEXENVFVPROC glad_glTexEnvfv = NULL;
+PFNGLTEXENVIPROC glad_glTexEnvi = NULL;
+PFNGLTEXENVIVPROC glad_glTexEnviv = NULL;
+PFNGLTEXGENDPROC glad_glTexGend = NULL;
+PFNGLTEXGENDVPROC glad_glTexGendv = NULL;
+PFNGLTEXGENFPROC glad_glTexGenf = NULL;
+PFNGLTEXGENFVPROC glad_glTexGenfv = NULL;
+PFNGLTEXGENIPROC glad_glTexGeni = NULL;
+PFNGLTEXGENIVPROC glad_glTexGeniv = NULL;
+PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL;
+PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL;
+PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL;
+PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL;
+PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL;
+PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL;
+PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL;
+PFNGLTEXSUBIMAGE1DEXTPROC glad_glTexSubImage1DEXT = NULL;
+PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL;
+PFNGLTEXSUBIMAGE2DEXTPROC glad_glTexSubImage2DEXT = NULL;
+PFNGLTRACKMATRIXNVPROC glad_glTrackMatrixNV = NULL;
+PFNGLTRANSLATEDPROC glad_glTranslated = NULL;
+PFNGLTRANSLATEFPROC glad_glTranslatef = NULL;
+PFNGLUNIFORM1FPROC glad_glUniform1f = NULL;
+PFNGLUNIFORM1FARBPROC glad_glUniform1fARB = NULL;
+PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL;
+PFNGLUNIFORM1FVARBPROC glad_glUniform1fvARB = NULL;
+PFNGLUNIFORM1IPROC glad_glUniform1i = NULL;
+PFNGLUNIFORM1IARBPROC glad_glUniform1iARB = NULL;
+PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL;
+PFNGLUNIFORM1IVARBPROC glad_glUniform1ivARB = NULL;
+PFNGLUNIFORM2FPROC glad_glUniform2f = NULL;
+PFNGLUNIFORM2FARBPROC glad_glUniform2fARB = NULL;
+PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL;
+PFNGLUNIFORM2FVARBPROC glad_glUniform2fvARB = NULL;
+PFNGLUNIFORM2IPROC glad_glUniform2i = NULL;
+PFNGLUNIFORM2IARBPROC glad_glUniform2iARB = NULL;
+PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL;
+PFNGLUNIFORM2IVARBPROC glad_glUniform2ivARB = NULL;
+PFNGLUNIFORM3FPROC glad_glUniform3f = NULL;
+PFNGLUNIFORM3FARBPROC glad_glUniform3fARB = NULL;
+PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL;
+PFNGLUNIFORM3FVARBPROC glad_glUniform3fvARB = NULL;
+PFNGLUNIFORM3IPROC glad_glUniform3i = NULL;
+PFNGLUNIFORM3IARBPROC glad_glUniform3iARB = NULL;
+PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL;
+PFNGLUNIFORM3IVARBPROC glad_glUniform3ivARB = NULL;
+PFNGLUNIFORM4FPROC glad_glUniform4f = NULL;
+PFNGLUNIFORM4FARBPROC glad_glUniform4fARB = NULL;
+PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL;
+PFNGLUNIFORM4FVARBPROC glad_glUniform4fvARB = NULL;
+PFNGLUNIFORM4IPROC glad_glUniform4i = NULL;
+PFNGLUNIFORM4IARBPROC glad_glUniform4iARB = NULL;
+PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL;
+PFNGLUNIFORM4IVARBPROC glad_glUniform4ivARB = NULL;
+PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL;
+PFNGLUNIFORMMATRIX2FVARBPROC glad_glUniformMatrix2fvARB = NULL;
+PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL;
+PFNGLUNIFORMMATRIX3FVARBPROC glad_glUniformMatrix3fvARB = NULL;
+PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL;
+PFNGLUNIFORMMATRIX4FVARBPROC glad_glUniformMatrix4fvARB = NULL;
+PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL;
+PFNGLUNMAPBUFFERARBPROC glad_glUnmapBufferARB = NULL;
+PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL;
+PFNGLUSEPROGRAMOBJECTARBPROC glad_glUseProgramObjectARB = NULL;
+PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages = NULL;
+PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL;
+PFNGLVALIDATEPROGRAMARBPROC glad_glValidateProgramARB = NULL;
+PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline = NULL;
+PFNGLVERTEX2DPROC glad_glVertex2d = NULL;
+PFNGLVERTEX2DVPROC glad_glVertex2dv = NULL;
+PFNGLVERTEX2FPROC glad_glVertex2f = NULL;
+PFNGLVERTEX2FVPROC glad_glVertex2fv = NULL;
+PFNGLVERTEX2IPROC glad_glVertex2i = NULL;
+PFNGLVERTEX2IVPROC glad_glVertex2iv = NULL;
+PFNGLVERTEX2SPROC glad_glVertex2s = NULL;
+PFNGLVERTEX2SVPROC glad_glVertex2sv = NULL;
+PFNGLVERTEX3DPROC glad_glVertex3d = NULL;
+PFNGLVERTEX3DVPROC glad_glVertex3dv = NULL;
+PFNGLVERTEX3FPROC glad_glVertex3f = NULL;
+PFNGLVERTEX3FVPROC glad_glVertex3fv = NULL;
+PFNGLVERTEX3IPROC glad_glVertex3i = NULL;
+PFNGLVERTEX3IVPROC glad_glVertex3iv = NULL;
+PFNGLVERTEX3SPROC glad_glVertex3s = NULL;
+PFNGLVERTEX3SVPROC glad_glVertex3sv = NULL;
+PFNGLVERTEX4DPROC glad_glVertex4d = NULL;
+PFNGLVERTEX4DVPROC glad_glVertex4dv = NULL;
+PFNGLVERTEX4FPROC glad_glVertex4f = NULL;
+PFNGLVERTEX4FVPROC glad_glVertex4fv = NULL;
+PFNGLVERTEX4IPROC glad_glVertex4i = NULL;
+PFNGLVERTEX4IVPROC glad_glVertex4iv = NULL;
+PFNGLVERTEX4SPROC glad_glVertex4s = NULL;
+PFNGLVERTEX4SVPROC glad_glVertex4sv = NULL;
+PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL;
+PFNGLVERTEXATTRIB1DARBPROC glad_glVertexAttrib1dARB = NULL;
+PFNGLVERTEXATTRIB1DNVPROC glad_glVertexAttrib1dNV = NULL;
+PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL;
+PFNGLVERTEXATTRIB1DVARBPROC glad_glVertexAttrib1dvARB = NULL;
+PFNGLVERTEXATTRIB1DVNVPROC glad_glVertexAttrib1dvNV = NULL;
+PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL;
+PFNGLVERTEXATTRIB1FARBPROC glad_glVertexAttrib1fARB = NULL;
+PFNGLVERTEXATTRIB1FNVPROC glad_glVertexAttrib1fNV = NULL;
+PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL;
+PFNGLVERTEXATTRIB1FVARBPROC glad_glVertexAttrib1fvARB = NULL;
+PFNGLVERTEXATTRIB1FVNVPROC glad_glVertexAttrib1fvNV = NULL;
+PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL;
+PFNGLVERTEXATTRIB1SARBPROC glad_glVertexAttrib1sARB = NULL;
+PFNGLVERTEXATTRIB1SNVPROC glad_glVertexAttrib1sNV = NULL;
+PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL;
+PFNGLVERTEXATTRIB1SVARBPROC glad_glVertexAttrib1svARB = NULL;
+PFNGLVERTEXATTRIB1SVNVPROC glad_glVertexAttrib1svNV = NULL;
+PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL;
+PFNGLVERTEXATTRIB2DARBPROC glad_glVertexAttrib2dARB = NULL;
+PFNGLVERTEXATTRIB2DNVPROC glad_glVertexAttrib2dNV = NULL;
+PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL;
+PFNGLVERTEXATTRIB2DVARBPROC glad_glVertexAttrib2dvARB = NULL;
+PFNGLVERTEXATTRIB2DVNVPROC glad_glVertexAttrib2dvNV = NULL;
+PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL;
+PFNGLVERTEXATTRIB2FARBPROC glad_glVertexAttrib2fARB = NULL;
+PFNGLVERTEXATTRIB2FNVPROC glad_glVertexAttrib2fNV = NULL;
+PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL;
+PFNGLVERTEXATTRIB2FVARBPROC glad_glVertexAttrib2fvARB = NULL;
+PFNGLVERTEXATTRIB2FVNVPROC glad_glVertexAttrib2fvNV = NULL;
+PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL;
+PFNGLVERTEXATTRIB2SARBPROC glad_glVertexAttrib2sARB = NULL;
+PFNGLVERTEXATTRIB2SNVPROC glad_glVertexAttrib2sNV = NULL;
+PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL;
+PFNGLVERTEXATTRIB2SVARBPROC glad_glVertexAttrib2svARB = NULL;
+PFNGLVERTEXATTRIB2SVNVPROC glad_glVertexAttrib2svNV = NULL;
+PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL;
+PFNGLVERTEXATTRIB3DARBPROC glad_glVertexAttrib3dARB = NULL;
+PFNGLVERTEXATTRIB3DNVPROC glad_glVertexAttrib3dNV = NULL;
+PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL;
+PFNGLVERTEXATTRIB3DVARBPROC glad_glVertexAttrib3dvARB = NULL;
+PFNGLVERTEXATTRIB3DVNVPROC glad_glVertexAttrib3dvNV = NULL;
+PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL;
+PFNGLVERTEXATTRIB3FARBPROC glad_glVertexAttrib3fARB = NULL;
+PFNGLVERTEXATTRIB3FNVPROC glad_glVertexAttrib3fNV = NULL;
+PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL;
+PFNGLVERTEXATTRIB3FVARBPROC glad_glVertexAttrib3fvARB = NULL;
+PFNGLVERTEXATTRIB3FVNVPROC glad_glVertexAttrib3fvNV = NULL;
+PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL;
+PFNGLVERTEXATTRIB3SARBPROC glad_glVertexAttrib3sARB = NULL;
+PFNGLVERTEXATTRIB3SNVPROC glad_glVertexAttrib3sNV = NULL;
+PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL;
+PFNGLVERTEXATTRIB3SVARBPROC glad_glVertexAttrib3svARB = NULL;
+PFNGLVERTEXATTRIB3SVNVPROC glad_glVertexAttrib3svNV = NULL;
+PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL;
+PFNGLVERTEXATTRIB4NBVARBPROC glad_glVertexAttrib4NbvARB = NULL;
+PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL;
+PFNGLVERTEXATTRIB4NIVARBPROC glad_glVertexAttrib4NivARB = NULL;
+PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL;
+PFNGLVERTEXATTRIB4NSVARBPROC glad_glVertexAttrib4NsvARB = NULL;
+PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL;
+PFNGLVERTEXATTRIB4NUBARBPROC glad_glVertexAttrib4NubARB = NULL;
+PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL;
+PFNGLVERTEXATTRIB4NUBVARBPROC glad_glVertexAttrib4NubvARB = NULL;
+PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL;
+PFNGLVERTEXATTRIB4NUIVARBPROC glad_glVertexAttrib4NuivARB = NULL;
+PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL;
+PFNGLVERTEXATTRIB4NUSVARBPROC glad_glVertexAttrib4NusvARB = NULL;
+PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL;
+PFNGLVERTEXATTRIB4BVARBPROC glad_glVertexAttrib4bvARB = NULL;
+PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL;
+PFNGLVERTEXATTRIB4DARBPROC glad_glVertexAttrib4dARB = NULL;
+PFNGLVERTEXATTRIB4DNVPROC glad_glVertexAttrib4dNV = NULL;
+PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL;
+PFNGLVERTEXATTRIB4DVARBPROC glad_glVertexAttrib4dvARB = NULL;
+PFNGLVERTEXATTRIB4DVNVPROC glad_glVertexAttrib4dvNV = NULL;
+PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL;
+PFNGLVERTEXATTRIB4FARBPROC glad_glVertexAttrib4fARB = NULL;
+PFNGLVERTEXATTRIB4FNVPROC glad_glVertexAttrib4fNV = NULL;
+PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL;
+PFNGLVERTEXATTRIB4FVARBPROC glad_glVertexAttrib4fvARB = NULL;
+PFNGLVERTEXATTRIB4FVNVPROC glad_glVertexAttrib4fvNV = NULL;
+PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL;
+PFNGLVERTEXATTRIB4IVARBPROC glad_glVertexAttrib4ivARB = NULL;
+PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL;
+PFNGLVERTEXATTRIB4SARBPROC glad_glVertexAttrib4sARB = NULL;
+PFNGLVERTEXATTRIB4SNVPROC glad_glVertexAttrib4sNV = NULL;
+PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL;
+PFNGLVERTEXATTRIB4SVARBPROC glad_glVertexAttrib4svARB = NULL;
+PFNGLVERTEXATTRIB4SVNVPROC glad_glVertexAttrib4svNV = NULL;
+PFNGLVERTEXATTRIB4UBNVPROC glad_glVertexAttrib4ubNV = NULL;
+PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL;
+PFNGLVERTEXATTRIB4UBVARBPROC glad_glVertexAttrib4ubvARB = NULL;
+PFNGLVERTEXATTRIB4UBVNVPROC glad_glVertexAttrib4ubvNV = NULL;
+PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL;
+PFNGLVERTEXATTRIB4UIVARBPROC glad_glVertexAttrib4uivARB = NULL;
+PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL;
+PFNGLVERTEXATTRIB4USVARBPROC glad_glVertexAttrib4usvARB = NULL;
+PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL;
+PFNGLVERTEXATTRIBPOINTERARBPROC glad_glVertexAttribPointerARB = NULL;
+PFNGLVERTEXATTRIBPOINTERNVPROC glad_glVertexAttribPointerNV = NULL;
+PFNGLVERTEXATTRIBS1DVNVPROC glad_glVertexAttribs1dvNV = NULL;
+PFNGLVERTEXATTRIBS1FVNVPROC glad_glVertexAttribs1fvNV = NULL;
+PFNGLVERTEXATTRIBS1SVNVPROC glad_glVertexAttribs1svNV = NULL;
+PFNGLVERTEXATTRIBS2DVNVPROC glad_glVertexAttribs2dvNV = NULL;
+PFNGLVERTEXATTRIBS2FVNVPROC glad_glVertexAttribs2fvNV = NULL;
+PFNGLVERTEXATTRIBS2SVNVPROC glad_glVertexAttribs2svNV = NULL;
+PFNGLVERTEXATTRIBS3DVNVPROC glad_glVertexAttribs3dvNV = NULL;
+PFNGLVERTEXATTRIBS3FVNVPROC glad_glVertexAttribs3fvNV = NULL;
+PFNGLVERTEXATTRIBS3SVNVPROC glad_glVertexAttribs3svNV = NULL;
+PFNGLVERTEXATTRIBS4DVNVPROC glad_glVertexAttribs4dvNV = NULL;
+PFNGLVERTEXATTRIBS4FVNVPROC glad_glVertexAttribs4fvNV = NULL;
+PFNGLVERTEXATTRIBS4SVNVPROC glad_glVertexAttribs4svNV = NULL;
+PFNGLVERTEXATTRIBS4UBVNVPROC glad_glVertexAttribs4ubvNV = NULL;
+PFNGLVERTEXPOINTERPROC glad_glVertexPointer = NULL;
+PFNGLVERTEXPOINTEREXTPROC glad_glVertexPointerEXT = NULL;
+PFNGLVIEWPORTPROC glad_glViewport = NULL;
+PFNGLALPHAFUNCXPROC glad_glAlphaFuncx = NULL;
+PFNGLBINDFRAMEBUFFEROESPROC glad_glBindFramebufferOES = NULL;
+PFNGLBINDRENDERBUFFEROESPROC glad_glBindRenderbufferOES = NULL;
+PFNGLBLENDEQUATIONOESPROC glad_glBlendEquationOES = NULL;
+PFNGLBLENDEQUATIONSEPARATEOESPROC glad_glBlendEquationSeparateOES = NULL;
+PFNGLBLENDFUNCSEPARATEOESPROC glad_glBlendFuncSeparateOES = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSOESPROC glad_glCheckFramebufferStatusOES = NULL;
+PFNGLCLEARCOLORXPROC glad_glClearColorx = NULL;
+PFNGLCLEARDEPTHFPROC glad_glClearDepthf = NULL;
+PFNGLCLEARDEPTHFOESPROC glad_glClearDepthfOES = NULL;
+PFNGLCLEARDEPTHXPROC glad_glClearDepthx = NULL;
+PFNGLCLIPPLANEFPROC glad_glClipPlanef = NULL;
+PFNGLCLIPPLANEFOESPROC glad_glClipPlanefOES = NULL;
+PFNGLCLIPPLANEXPROC glad_glClipPlanex = NULL;
+PFNGLCOLOR4XPROC glad_glColor4x = NULL;
+PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL;
+PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL;
+PFNGLDELETEFRAMEBUFFERSOESPROC glad_glDeleteFramebuffersOES = NULL;
+PFNGLDELETERENDERBUFFERSOESPROC glad_glDeleteRenderbuffersOES = NULL;
+PFNGLDEPTHRANGEFPROC glad_glDepthRangef = NULL;
+PFNGLDEPTHRANGEFOESPROC glad_glDepthRangefOES = NULL;
+PFNGLDEPTHRANGEXPROC glad_glDepthRangex = NULL;
+PFNGLFOGXPROC glad_glFogx = NULL;
+PFNGLFOGXVPROC glad_glFogxv = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFEROESPROC glad_glFramebufferRenderbufferOES = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DOESPROC glad_glFramebufferTexture2DOES = NULL;
+PFNGLFRUSTUMFPROC glad_glFrustumf = NULL;
+PFNGLFRUSTUMFOESPROC glad_glFrustumfOES = NULL;
+PFNGLFRUSTUMXPROC glad_glFrustumx = NULL;
+PFNGLGENFRAMEBUFFERSOESPROC glad_glGenFramebuffersOES = NULL;
+PFNGLGENRENDERBUFFERSOESPROC glad_glGenRenderbuffersOES = NULL;
+PFNGLGENERATEMIPMAPOESPROC glad_glGenerateMipmapOES = NULL;
+PFNGLGETCLIPPLANEFPROC glad_glGetClipPlanef = NULL;
+PFNGLGETCLIPPLANEFOESPROC glad_glGetClipPlanefOES = NULL;
+PFNGLGETCLIPPLANEXPROC glad_glGetClipPlanex = NULL;
+PFNGLGETFIXEDVPROC glad_glGetFixedv = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC glad_glGetFramebufferAttachmentParameterivOES = NULL;
+PFNGLGETLIGHTXVPROC glad_glGetLightxv = NULL;
+PFNGLGETMATERIALXVPROC glad_glGetMaterialxv = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVOESPROC glad_glGetRenderbufferParameterivOES = NULL;
+PFNGLGETTEXENVXVPROC glad_glGetTexEnvxv = NULL;
+PFNGLGETTEXPARAMETERXVPROC glad_glGetTexParameterxv = NULL;
+PFNGLISFRAMEBUFFEROESPROC glad_glIsFramebufferOES = NULL;
+PFNGLISRENDERBUFFEROESPROC glad_glIsRenderbufferOES = NULL;
+PFNGLLIGHTMODELXPROC glad_glLightModelx = NULL;
+PFNGLLIGHTMODELXVPROC glad_glLightModelxv = NULL;
+PFNGLLIGHTXPROC glad_glLightx = NULL;
+PFNGLLIGHTXVPROC glad_glLightxv = NULL;
+PFNGLLINEWIDTHXPROC glad_glLineWidthx = NULL;
+PFNGLLOADMATRIXXPROC glad_glLoadMatrixx = NULL;
+PFNGLMATERIALXPROC glad_glMaterialx = NULL;
+PFNGLMATERIALXVPROC glad_glMaterialxv = NULL;
+PFNGLMULTMATRIXXPROC glad_glMultMatrixx = NULL;
+PFNGLMULTITEXCOORD4XPROC glad_glMultiTexCoord4x = NULL;
+PFNGLNORMAL3XPROC glad_glNormal3x = NULL;
+PFNGLORTHOFPROC glad_glOrthof = NULL;
+PFNGLORTHOFOESPROC glad_glOrthofOES = NULL;
+PFNGLORTHOXPROC glad_glOrthox = NULL;
+PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL;
+PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL;
+PFNGLPOINTPARAMETERXPROC glad_glPointParameterx = NULL;
+PFNGLPOINTPARAMETERXVPROC glad_glPointParameterxv = NULL;
+PFNGLPOINTSIZEXPROC glad_glPointSizex = NULL;
+PFNGLPOLYGONOFFSETXPROC glad_glPolygonOffsetx = NULL;
+PFNGLRENDERBUFFERSTORAGEOESPROC glad_glRenderbufferStorageOES = NULL;
+PFNGLROTATEXPROC glad_glRotatex = NULL;
+PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL;
+PFNGLSAMPLECOVERAGEXPROC glad_glSampleCoveragex = NULL;
+PFNGLSCALEXPROC glad_glScalex = NULL;
+PFNGLTEXENVXPROC glad_glTexEnvx = NULL;
+PFNGLTEXENVXVPROC glad_glTexEnvxv = NULL;
+PFNGLTEXPARAMETERXPROC glad_glTexParameterx = NULL;
+PFNGLTEXPARAMETERXVPROC glad_glTexParameterxv = NULL;
+PFNGLTRANSLATEXPROC glad_glTranslatex = NULL;
+
+
+static void glad_gl_load_GL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_VERSION_1_0) return;
+ glad_glAccum = (PFNGLACCUMPROC) load(userptr, "glAccum");
+ glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc");
+ glad_glBegin = (PFNGLBEGINPROC) load(userptr, "glBegin");
+ glad_glBitmap = (PFNGLBITMAPPROC) load(userptr, "glBitmap");
+ glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc");
+ glad_glCallList = (PFNGLCALLLISTPROC) load(userptr, "glCallList");
+ glad_glCallLists = (PFNGLCALLLISTSPROC) load(userptr, "glCallLists");
+ glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear");
+ glad_glClearAccum = (PFNGLCLEARACCUMPROC) load(userptr, "glClearAccum");
+ glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor");
+ glad_glClearDepth = (PFNGLCLEARDEPTHPROC) load(userptr, "glClearDepth");
+ glad_glClearIndex = (PFNGLCLEARINDEXPROC) load(userptr, "glClearIndex");
+ glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil");
+ glad_glClipPlane = (PFNGLCLIPPLANEPROC) load(userptr, "glClipPlane");
+ glad_glColor3b = (PFNGLCOLOR3BPROC) load(userptr, "glColor3b");
+ glad_glColor3bv = (PFNGLCOLOR3BVPROC) load(userptr, "glColor3bv");
+ glad_glColor3d = (PFNGLCOLOR3DPROC) load(userptr, "glColor3d");
+ glad_glColor3dv = (PFNGLCOLOR3DVPROC) load(userptr, "glColor3dv");
+ glad_glColor3f = (PFNGLCOLOR3FPROC) load(userptr, "glColor3f");
+ glad_glColor3fv = (PFNGLCOLOR3FVPROC) load(userptr, "glColor3fv");
+ glad_glColor3i = (PFNGLCOLOR3IPROC) load(userptr, "glColor3i");
+ glad_glColor3iv = (PFNGLCOLOR3IVPROC) load(userptr, "glColor3iv");
+ glad_glColor3s = (PFNGLCOLOR3SPROC) load(userptr, "glColor3s");
+ glad_glColor3sv = (PFNGLCOLOR3SVPROC) load(userptr, "glColor3sv");
+ glad_glColor3ub = (PFNGLCOLOR3UBPROC) load(userptr, "glColor3ub");
+ glad_glColor3ubv = (PFNGLCOLOR3UBVPROC) load(userptr, "glColor3ubv");
+ glad_glColor3ui = (PFNGLCOLOR3UIPROC) load(userptr, "glColor3ui");
+ glad_glColor3uiv = (PFNGLCOLOR3UIVPROC) load(userptr, "glColor3uiv");
+ glad_glColor3us = (PFNGLCOLOR3USPROC) load(userptr, "glColor3us");
+ glad_glColor3usv = (PFNGLCOLOR3USVPROC) load(userptr, "glColor3usv");
+ glad_glColor4b = (PFNGLCOLOR4BPROC) load(userptr, "glColor4b");
+ glad_glColor4bv = (PFNGLCOLOR4BVPROC) load(userptr, "glColor4bv");
+ glad_glColor4d = (PFNGLCOLOR4DPROC) load(userptr, "glColor4d");
+ glad_glColor4dv = (PFNGLCOLOR4DVPROC) load(userptr, "glColor4dv");
+ glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f");
+ glad_glColor4fv = (PFNGLCOLOR4FVPROC) load(userptr, "glColor4fv");
+ glad_glColor4i = (PFNGLCOLOR4IPROC) load(userptr, "glColor4i");
+ glad_glColor4iv = (PFNGLCOLOR4IVPROC) load(userptr, "glColor4iv");
+ glad_glColor4s = (PFNGLCOLOR4SPROC) load(userptr, "glColor4s");
+ glad_glColor4sv = (PFNGLCOLOR4SVPROC) load(userptr, "glColor4sv");
+ glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub");
+ glad_glColor4ubv = (PFNGLCOLOR4UBVPROC) load(userptr, "glColor4ubv");
+ glad_glColor4ui = (PFNGLCOLOR4UIPROC) load(userptr, "glColor4ui");
+ glad_glColor4uiv = (PFNGLCOLOR4UIVPROC) load(userptr, "glColor4uiv");
+ glad_glColor4us = (PFNGLCOLOR4USPROC) load(userptr, "glColor4us");
+ glad_glColor4usv = (PFNGLCOLOR4USVPROC) load(userptr, "glColor4usv");
+ glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask");
+ glad_glColorMaterial = (PFNGLCOLORMATERIALPROC) load(userptr, "glColorMaterial");
+ glad_glCopyPixels = (PFNGLCOPYPIXELSPROC) load(userptr, "glCopyPixels");
+ glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace");
+ glad_glDeleteLists = (PFNGLDELETELISTSPROC) load(userptr, "glDeleteLists");
+ glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc");
+ glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask");
+ glad_glDepthRange = (PFNGLDEPTHRANGEPROC) load(userptr, "glDepthRange");
+ glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable");
+ glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC) load(userptr, "glDrawBuffer");
+ glad_glDrawPixels = (PFNGLDRAWPIXELSPROC) load(userptr, "glDrawPixels");
+ glad_glEdgeFlag = (PFNGLEDGEFLAGPROC) load(userptr, "glEdgeFlag");
+ glad_glEdgeFlagv = (PFNGLEDGEFLAGVPROC) load(userptr, "glEdgeFlagv");
+ glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable");
+ glad_glEnd = (PFNGLENDPROC) load(userptr, "glEnd");
+ glad_glEndList = (PFNGLENDLISTPROC) load(userptr, "glEndList");
+ glad_glEvalCoord1d = (PFNGLEVALCOORD1DPROC) load(userptr, "glEvalCoord1d");
+ glad_glEvalCoord1dv = (PFNGLEVALCOORD1DVPROC) load(userptr, "glEvalCoord1dv");
+ glad_glEvalCoord1f = (PFNGLEVALCOORD1FPROC) load(userptr, "glEvalCoord1f");
+ glad_glEvalCoord1fv = (PFNGLEVALCOORD1FVPROC) load(userptr, "glEvalCoord1fv");
+ glad_glEvalCoord2d = (PFNGLEVALCOORD2DPROC) load(userptr, "glEvalCoord2d");
+ glad_glEvalCoord2dv = (PFNGLEVALCOORD2DVPROC) load(userptr, "glEvalCoord2dv");
+ glad_glEvalCoord2f = (PFNGLEVALCOORD2FPROC) load(userptr, "glEvalCoord2f");
+ glad_glEvalCoord2fv = (PFNGLEVALCOORD2FVPROC) load(userptr, "glEvalCoord2fv");
+ glad_glEvalMesh1 = (PFNGLEVALMESH1PROC) load(userptr, "glEvalMesh1");
+ glad_glEvalMesh2 = (PFNGLEVALMESH2PROC) load(userptr, "glEvalMesh2");
+ glad_glEvalPoint1 = (PFNGLEVALPOINT1PROC) load(userptr, "glEvalPoint1");
+ glad_glEvalPoint2 = (PFNGLEVALPOINT2PROC) load(userptr, "glEvalPoint2");
+ glad_glFeedbackBuffer = (PFNGLFEEDBACKBUFFERPROC) load(userptr, "glFeedbackBuffer");
+ glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish");
+ glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush");
+ glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf");
+ glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv");
+ glad_glFogi = (PFNGLFOGIPROC) load(userptr, "glFogi");
+ glad_glFogiv = (PFNGLFOGIVPROC) load(userptr, "glFogiv");
+ glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace");
+ glad_glFrustum = (PFNGLFRUSTUMPROC) load(userptr, "glFrustum");
+ glad_glGenLists = (PFNGLGENLISTSPROC) load(userptr, "glGenLists");
+ glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv");
+ glad_glGetClipPlane = (PFNGLGETCLIPPLANEPROC) load(userptr, "glGetClipPlane");
+ glad_glGetDoublev = (PFNGLGETDOUBLEVPROC) load(userptr, "glGetDoublev");
+ glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError");
+ glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv");
+ glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv");
+ glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv");
+ glad_glGetLightiv = (PFNGLGETLIGHTIVPROC) load(userptr, "glGetLightiv");
+ glad_glGetMapdv = (PFNGLGETMAPDVPROC) load(userptr, "glGetMapdv");
+ glad_glGetMapfv = (PFNGLGETMAPFVPROC) load(userptr, "glGetMapfv");
+ glad_glGetMapiv = (PFNGLGETMAPIVPROC) load(userptr, "glGetMapiv");
+ glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv");
+ glad_glGetMaterialiv = (PFNGLGETMATERIALIVPROC) load(userptr, "glGetMaterialiv");
+ glad_glGetPixelMapfv = (PFNGLGETPIXELMAPFVPROC) load(userptr, "glGetPixelMapfv");
+ glad_glGetPixelMapuiv = (PFNGLGETPIXELMAPUIVPROC) load(userptr, "glGetPixelMapuiv");
+ glad_glGetPixelMapusv = (PFNGLGETPIXELMAPUSVPROC) load(userptr, "glGetPixelMapusv");
+ glad_glGetPolygonStipple = (PFNGLGETPOLYGONSTIPPLEPROC) load(userptr, "glGetPolygonStipple");
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv");
+ glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv");
+ glad_glGetTexGendv = (PFNGLGETTEXGENDVPROC) load(userptr, "glGetTexGendv");
+ glad_glGetTexGenfv = (PFNGLGETTEXGENFVPROC) load(userptr, "glGetTexGenfv");
+ glad_glGetTexGeniv = (PFNGLGETTEXGENIVPROC) load(userptr, "glGetTexGeniv");
+ glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC) load(userptr, "glGetTexImage");
+ glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load(userptr, "glGetTexLevelParameterfv");
+ glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load(userptr, "glGetTexLevelParameteriv");
+ glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv");
+ glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv");
+ glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint");
+ glad_glIndexMask = (PFNGLINDEXMASKPROC) load(userptr, "glIndexMask");
+ glad_glIndexd = (PFNGLINDEXDPROC) load(userptr, "glIndexd");
+ glad_glIndexdv = (PFNGLINDEXDVPROC) load(userptr, "glIndexdv");
+ glad_glIndexf = (PFNGLINDEXFPROC) load(userptr, "glIndexf");
+ glad_glIndexfv = (PFNGLINDEXFVPROC) load(userptr, "glIndexfv");
+ glad_glIndexi = (PFNGLINDEXIPROC) load(userptr, "glIndexi");
+ glad_glIndexiv = (PFNGLINDEXIVPROC) load(userptr, "glIndexiv");
+ glad_glIndexs = (PFNGLINDEXSPROC) load(userptr, "glIndexs");
+ glad_glIndexsv = (PFNGLINDEXSVPROC) load(userptr, "glIndexsv");
+ glad_glInitNames = (PFNGLINITNAMESPROC) load(userptr, "glInitNames");
+ glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled");
+ glad_glIsList = (PFNGLISLISTPROC) load(userptr, "glIsList");
+ glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf");
+ glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv");
+ glad_glLightModeli = (PFNGLLIGHTMODELIPROC) load(userptr, "glLightModeli");
+ glad_glLightModeliv = (PFNGLLIGHTMODELIVPROC) load(userptr, "glLightModeliv");
+ glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf");
+ glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv");
+ glad_glLighti = (PFNGLLIGHTIPROC) load(userptr, "glLighti");
+ glad_glLightiv = (PFNGLLIGHTIVPROC) load(userptr, "glLightiv");
+ glad_glLineStipple = (PFNGLLINESTIPPLEPROC) load(userptr, "glLineStipple");
+ glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth");
+ glad_glListBase = (PFNGLLISTBASEPROC) load(userptr, "glListBase");
+ glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity");
+ glad_glLoadMatrixd = (PFNGLLOADMATRIXDPROC) load(userptr, "glLoadMatrixd");
+ glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf");
+ glad_glLoadName = (PFNGLLOADNAMEPROC) load(userptr, "glLoadName");
+ glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp");
+ glad_glMap1d = (PFNGLMAP1DPROC) load(userptr, "glMap1d");
+ glad_glMap1f = (PFNGLMAP1FPROC) load(userptr, "glMap1f");
+ glad_glMap2d = (PFNGLMAP2DPROC) load(userptr, "glMap2d");
+ glad_glMap2f = (PFNGLMAP2FPROC) load(userptr, "glMap2f");
+ glad_glMapGrid1d = (PFNGLMAPGRID1DPROC) load(userptr, "glMapGrid1d");
+ glad_glMapGrid1f = (PFNGLMAPGRID1FPROC) load(userptr, "glMapGrid1f");
+ glad_glMapGrid2d = (PFNGLMAPGRID2DPROC) load(userptr, "glMapGrid2d");
+ glad_glMapGrid2f = (PFNGLMAPGRID2FPROC) load(userptr, "glMapGrid2f");
+ glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf");
+ glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv");
+ glad_glMateriali = (PFNGLMATERIALIPROC) load(userptr, "glMateriali");
+ glad_glMaterialiv = (PFNGLMATERIALIVPROC) load(userptr, "glMaterialiv");
+ glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode");
+ glad_glMultMatrixd = (PFNGLMULTMATRIXDPROC) load(userptr, "glMultMatrixd");
+ glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf");
+ glad_glNewList = (PFNGLNEWLISTPROC) load(userptr, "glNewList");
+ glad_glNormal3b = (PFNGLNORMAL3BPROC) load(userptr, "glNormal3b");
+ glad_glNormal3bv = (PFNGLNORMAL3BVPROC) load(userptr, "glNormal3bv");
+ glad_glNormal3d = (PFNGLNORMAL3DPROC) load(userptr, "glNormal3d");
+ glad_glNormal3dv = (PFNGLNORMAL3DVPROC) load(userptr, "glNormal3dv");
+ glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f");
+ glad_glNormal3fv = (PFNGLNORMAL3FVPROC) load(userptr, "glNormal3fv");
+ glad_glNormal3i = (PFNGLNORMAL3IPROC) load(userptr, "glNormal3i");
+ glad_glNormal3iv = (PFNGLNORMAL3IVPROC) load(userptr, "glNormal3iv");
+ glad_glNormal3s = (PFNGLNORMAL3SPROC) load(userptr, "glNormal3s");
+ glad_glNormal3sv = (PFNGLNORMAL3SVPROC) load(userptr, "glNormal3sv");
+ glad_glOrtho = (PFNGLORTHOPROC) load(userptr, "glOrtho");
+ glad_glPassThrough = (PFNGLPASSTHROUGHPROC) load(userptr, "glPassThrough");
+ glad_glPixelMapfv = (PFNGLPIXELMAPFVPROC) load(userptr, "glPixelMapfv");
+ glad_glPixelMapuiv = (PFNGLPIXELMAPUIVPROC) load(userptr, "glPixelMapuiv");
+ glad_glPixelMapusv = (PFNGLPIXELMAPUSVPROC) load(userptr, "glPixelMapusv");
+ glad_glPixelStoref = (PFNGLPIXELSTOREFPROC) load(userptr, "glPixelStoref");
+ glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei");
+ glad_glPixelTransferf = (PFNGLPIXELTRANSFERFPROC) load(userptr, "glPixelTransferf");
+ glad_glPixelTransferi = (PFNGLPIXELTRANSFERIPROC) load(userptr, "glPixelTransferi");
+ glad_glPixelZoom = (PFNGLPIXELZOOMPROC) load(userptr, "glPixelZoom");
+ glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize");
+ glad_glPolygonMode = (PFNGLPOLYGONMODEPROC) load(userptr, "glPolygonMode");
+ glad_glPolygonStipple = (PFNGLPOLYGONSTIPPLEPROC) load(userptr, "glPolygonStipple");
+ glad_glPopAttrib = (PFNGLPOPATTRIBPROC) load(userptr, "glPopAttrib");
+ glad_glPopMatrix = (PFNGLPOPMATRIXPROC) load(userptr, "glPopMatrix");
+ glad_glPopName = (PFNGLPOPNAMEPROC) load(userptr, "glPopName");
+ glad_glPushAttrib = (PFNGLPUSHATTRIBPROC) load(userptr, "glPushAttrib");
+ glad_glPushMatrix = (PFNGLPUSHMATRIXPROC) load(userptr, "glPushMatrix");
+ glad_glPushName = (PFNGLPUSHNAMEPROC) load(userptr, "glPushName");
+ glad_glRasterPos2d = (PFNGLRASTERPOS2DPROC) load(userptr, "glRasterPos2d");
+ glad_glRasterPos2dv = (PFNGLRASTERPOS2DVPROC) load(userptr, "glRasterPos2dv");
+ glad_glRasterPos2f = (PFNGLRASTERPOS2FPROC) load(userptr, "glRasterPos2f");
+ glad_glRasterPos2fv = (PFNGLRASTERPOS2FVPROC) load(userptr, "glRasterPos2fv");
+ glad_glRasterPos2i = (PFNGLRASTERPOS2IPROC) load(userptr, "glRasterPos2i");
+ glad_glRasterPos2iv = (PFNGLRASTERPOS2IVPROC) load(userptr, "glRasterPos2iv");
+ glad_glRasterPos2s = (PFNGLRASTERPOS2SPROC) load(userptr, "glRasterPos2s");
+ glad_glRasterPos2sv = (PFNGLRASTERPOS2SVPROC) load(userptr, "glRasterPos2sv");
+ glad_glRasterPos3d = (PFNGLRASTERPOS3DPROC) load(userptr, "glRasterPos3d");
+ glad_glRasterPos3dv = (PFNGLRASTERPOS3DVPROC) load(userptr, "glRasterPos3dv");
+ glad_glRasterPos3f = (PFNGLRASTERPOS3FPROC) load(userptr, "glRasterPos3f");
+ glad_glRasterPos3fv = (PFNGLRASTERPOS3FVPROC) load(userptr, "glRasterPos3fv");
+ glad_glRasterPos3i = (PFNGLRASTERPOS3IPROC) load(userptr, "glRasterPos3i");
+ glad_glRasterPos3iv = (PFNGLRASTERPOS3IVPROC) load(userptr, "glRasterPos3iv");
+ glad_glRasterPos3s = (PFNGLRASTERPOS3SPROC) load(userptr, "glRasterPos3s");
+ glad_glRasterPos3sv = (PFNGLRASTERPOS3SVPROC) load(userptr, "glRasterPos3sv");
+ glad_glRasterPos4d = (PFNGLRASTERPOS4DPROC) load(userptr, "glRasterPos4d");
+ glad_glRasterPos4dv = (PFNGLRASTERPOS4DVPROC) load(userptr, "glRasterPos4dv");
+ glad_glRasterPos4f = (PFNGLRASTERPOS4FPROC) load(userptr, "glRasterPos4f");
+ glad_glRasterPos4fv = (PFNGLRASTERPOS4FVPROC) load(userptr, "glRasterPos4fv");
+ glad_glRasterPos4i = (PFNGLRASTERPOS4IPROC) load(userptr, "glRasterPos4i");
+ glad_glRasterPos4iv = (PFNGLRASTERPOS4IVPROC) load(userptr, "glRasterPos4iv");
+ glad_glRasterPos4s = (PFNGLRASTERPOS4SPROC) load(userptr, "glRasterPos4s");
+ glad_glRasterPos4sv = (PFNGLRASTERPOS4SVPROC) load(userptr, "glRasterPos4sv");
+ glad_glReadBuffer = (PFNGLREADBUFFERPROC) load(userptr, "glReadBuffer");
+ glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels");
+ glad_glRectd = (PFNGLRECTDPROC) load(userptr, "glRectd");
+ glad_glRectdv = (PFNGLRECTDVPROC) load(userptr, "glRectdv");
+ glad_glRectf = (PFNGLRECTFPROC) load(userptr, "glRectf");
+ glad_glRectfv = (PFNGLRECTFVPROC) load(userptr, "glRectfv");
+ glad_glRecti = (PFNGLRECTIPROC) load(userptr, "glRecti");
+ glad_glRectiv = (PFNGLRECTIVPROC) load(userptr, "glRectiv");
+ glad_glRects = (PFNGLRECTSPROC) load(userptr, "glRects");
+ glad_glRectsv = (PFNGLRECTSVPROC) load(userptr, "glRectsv");
+ glad_glRenderMode = (PFNGLRENDERMODEPROC) load(userptr, "glRenderMode");
+ glad_glRotated = (PFNGLROTATEDPROC) load(userptr, "glRotated");
+ glad_glRotatef = (PFNGLROTATEFPROC) load(userptr, "glRotatef");
+ glad_glScaled = (PFNGLSCALEDPROC) load(userptr, "glScaled");
+ glad_glScalef = (PFNGLSCALEFPROC) load(userptr, "glScalef");
+ glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor");
+ glad_glSelectBuffer = (PFNGLSELECTBUFFERPROC) load(userptr, "glSelectBuffer");
+ glad_glShadeModel = (PFNGLSHADEMODELPROC) load(userptr, "glShadeModel");
+ glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc");
+ glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask");
+ glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp");
+ glad_glTexCoord1d = (PFNGLTEXCOORD1DPROC) load(userptr, "glTexCoord1d");
+ glad_glTexCoord1dv = (PFNGLTEXCOORD1DVPROC) load(userptr, "glTexCoord1dv");
+ glad_glTexCoord1f = (PFNGLTEXCOORD1FPROC) load(userptr, "glTexCoord1f");
+ glad_glTexCoord1fv = (PFNGLTEXCOORD1FVPROC) load(userptr, "glTexCoord1fv");
+ glad_glTexCoord1i = (PFNGLTEXCOORD1IPROC) load(userptr, "glTexCoord1i");
+ glad_glTexCoord1iv = (PFNGLTEXCOORD1IVPROC) load(userptr, "glTexCoord1iv");
+ glad_glTexCoord1s = (PFNGLTEXCOORD1SPROC) load(userptr, "glTexCoord1s");
+ glad_glTexCoord1sv = (PFNGLTEXCOORD1SVPROC) load(userptr, "glTexCoord1sv");
+ glad_glTexCoord2d = (PFNGLTEXCOORD2DPROC) load(userptr, "glTexCoord2d");
+ glad_glTexCoord2dv = (PFNGLTEXCOORD2DVPROC) load(userptr, "glTexCoord2dv");
+ glad_glTexCoord2f = (PFNGLTEXCOORD2FPROC) load(userptr, "glTexCoord2f");
+ glad_glTexCoord2fv = (PFNGLTEXCOORD2FVPROC) load(userptr, "glTexCoord2fv");
+ glad_glTexCoord2i = (PFNGLTEXCOORD2IPROC) load(userptr, "glTexCoord2i");
+ glad_glTexCoord2iv = (PFNGLTEXCOORD2IVPROC) load(userptr, "glTexCoord2iv");
+ glad_glTexCoord2s = (PFNGLTEXCOORD2SPROC) load(userptr, "glTexCoord2s");
+ glad_glTexCoord2sv = (PFNGLTEXCOORD2SVPROC) load(userptr, "glTexCoord2sv");
+ glad_glTexCoord3d = (PFNGLTEXCOORD3DPROC) load(userptr, "glTexCoord3d");
+ glad_glTexCoord3dv = (PFNGLTEXCOORD3DVPROC) load(userptr, "glTexCoord3dv");
+ glad_glTexCoord3f = (PFNGLTEXCOORD3FPROC) load(userptr, "glTexCoord3f");
+ glad_glTexCoord3fv = (PFNGLTEXCOORD3FVPROC) load(userptr, "glTexCoord3fv");
+ glad_glTexCoord3i = (PFNGLTEXCOORD3IPROC) load(userptr, "glTexCoord3i");
+ glad_glTexCoord3iv = (PFNGLTEXCOORD3IVPROC) load(userptr, "glTexCoord3iv");
+ glad_glTexCoord3s = (PFNGLTEXCOORD3SPROC) load(userptr, "glTexCoord3s");
+ glad_glTexCoord3sv = (PFNGLTEXCOORD3SVPROC) load(userptr, "glTexCoord3sv");
+ glad_glTexCoord4d = (PFNGLTEXCOORD4DPROC) load(userptr, "glTexCoord4d");
+ glad_glTexCoord4dv = (PFNGLTEXCOORD4DVPROC) load(userptr, "glTexCoord4dv");
+ glad_glTexCoord4f = (PFNGLTEXCOORD4FPROC) load(userptr, "glTexCoord4f");
+ glad_glTexCoord4fv = (PFNGLTEXCOORD4FVPROC) load(userptr, "glTexCoord4fv");
+ glad_glTexCoord4i = (PFNGLTEXCOORD4IPROC) load(userptr, "glTexCoord4i");
+ glad_glTexCoord4iv = (PFNGLTEXCOORD4IVPROC) load(userptr, "glTexCoord4iv");
+ glad_glTexCoord4s = (PFNGLTEXCOORD4SPROC) load(userptr, "glTexCoord4s");
+ glad_glTexCoord4sv = (PFNGLTEXCOORD4SVPROC) load(userptr, "glTexCoord4sv");
+ glad_glTexEnvf = (PFNGLTEXENVFPROC) load(userptr, "glTexEnvf");
+ glad_glTexEnvfv = (PFNGLTEXENVFVPROC) load(userptr, "glTexEnvfv");
+ glad_glTexEnvi = (PFNGLTEXENVIPROC) load(userptr, "glTexEnvi");
+ glad_glTexEnviv = (PFNGLTEXENVIVPROC) load(userptr, "glTexEnviv");
+ glad_glTexGend = (PFNGLTEXGENDPROC) load(userptr, "glTexGend");
+ glad_glTexGendv = (PFNGLTEXGENDVPROC) load(userptr, "glTexGendv");
+ glad_glTexGenf = (PFNGLTEXGENFPROC) load(userptr, "glTexGenf");
+ glad_glTexGenfv = (PFNGLTEXGENFVPROC) load(userptr, "glTexGenfv");
+ glad_glTexGeni = (PFNGLTEXGENIPROC) load(userptr, "glTexGeni");
+ glad_glTexGeniv = (PFNGLTEXGENIVPROC) load(userptr, "glTexGeniv");
+ glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC) load(userptr, "glTexImage1D");
+ glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D");
+ glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf");
+ glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv");
+ glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri");
+ glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv");
+ glad_glTranslated = (PFNGLTRANSLATEDPROC) load(userptr, "glTranslated");
+ glad_glTranslatef = (PFNGLTRANSLATEFPROC) load(userptr, "glTranslatef");
+ glad_glVertex2d = (PFNGLVERTEX2DPROC) load(userptr, "glVertex2d");
+ glad_glVertex2dv = (PFNGLVERTEX2DVPROC) load(userptr, "glVertex2dv");
+ glad_glVertex2f = (PFNGLVERTEX2FPROC) load(userptr, "glVertex2f");
+ glad_glVertex2fv = (PFNGLVERTEX2FVPROC) load(userptr, "glVertex2fv");
+ glad_glVertex2i = (PFNGLVERTEX2IPROC) load(userptr, "glVertex2i");
+ glad_glVertex2iv = (PFNGLVERTEX2IVPROC) load(userptr, "glVertex2iv");
+ glad_glVertex2s = (PFNGLVERTEX2SPROC) load(userptr, "glVertex2s");
+ glad_glVertex2sv = (PFNGLVERTEX2SVPROC) load(userptr, "glVertex2sv");
+ glad_glVertex3d = (PFNGLVERTEX3DPROC) load(userptr, "glVertex3d");
+ glad_glVertex3dv = (PFNGLVERTEX3DVPROC) load(userptr, "glVertex3dv");
+ glad_glVertex3f = (PFNGLVERTEX3FPROC) load(userptr, "glVertex3f");
+ glad_glVertex3fv = (PFNGLVERTEX3FVPROC) load(userptr, "glVertex3fv");
+ glad_glVertex3i = (PFNGLVERTEX3IPROC) load(userptr, "glVertex3i");
+ glad_glVertex3iv = (PFNGLVERTEX3IVPROC) load(userptr, "glVertex3iv");
+ glad_glVertex3s = (PFNGLVERTEX3SPROC) load(userptr, "glVertex3s");
+ glad_glVertex3sv = (PFNGLVERTEX3SVPROC) load(userptr, "glVertex3sv");
+ glad_glVertex4d = (PFNGLVERTEX4DPROC) load(userptr, "glVertex4d");
+ glad_glVertex4dv = (PFNGLVERTEX4DVPROC) load(userptr, "glVertex4dv");
+ glad_glVertex4f = (PFNGLVERTEX4FPROC) load(userptr, "glVertex4f");
+ glad_glVertex4fv = (PFNGLVERTEX4FVPROC) load(userptr, "glVertex4fv");
+ glad_glVertex4i = (PFNGLVERTEX4IPROC) load(userptr, "glVertex4i");
+ glad_glVertex4iv = (PFNGLVERTEX4IVPROC) load(userptr, "glVertex4iv");
+ glad_glVertex4s = (PFNGLVERTEX4SPROC) load(userptr, "glVertex4s");
+ glad_glVertex4sv = (PFNGLVERTEX4SVPROC) load(userptr, "glVertex4sv");
+ glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport");
+}
+static void glad_gl_load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_VERSION_1_1) return;
+ glad_glAreTexturesResident = (PFNGLARETEXTURESRESIDENTPROC) load(userptr, "glAreTexturesResident");
+ glad_glArrayElement = (PFNGLARRAYELEMENTPROC) load(userptr, "glArrayElement");
+ glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture");
+ glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer");
+ glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D");
+ glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D");
+ glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D");
+ glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D");
+ glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures");
+ glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState");
+ glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays");
+ glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements");
+ glad_glEdgeFlagPointer = (PFNGLEDGEFLAGPOINTERPROC) load(userptr, "glEdgeFlagPointer");
+ glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState");
+ glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glIndexPointer = (PFNGLINDEXPOINTERPROC) load(userptr, "glIndexPointer");
+ glad_glIndexub = (PFNGLINDEXUBPROC) load(userptr, "glIndexub");
+ glad_glIndexubv = (PFNGLINDEXUBVPROC) load(userptr, "glIndexubv");
+ glad_glInterleavedArrays = (PFNGLINTERLEAVEDARRAYSPROC) load(userptr, "glInterleavedArrays");
+ glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture");
+ glad_glNormalPointer = (PFNGLNORMALPOINTERPROC) load(userptr, "glNormalPointer");
+ glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset");
+ glad_glPopClientAttrib = (PFNGLPOPCLIENTATTRIBPROC) load(userptr, "glPopClientAttrib");
+ glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(userptr, "glPrioritizeTextures");
+ glad_glPushClientAttrib = (PFNGLPUSHCLIENTATTRIBPROC) load(userptr, "glPushClientAttrib");
+ glad_glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load(userptr, "glTexCoordPointer");
+ glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D");
+ glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D");
+ glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer");
+}
+static void glad_gl_load_GL_VERSION_ES_CM_1_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_VERSION_ES_CM_1_0) return;
+ glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture");
+ glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc");
+ glad_glAlphaFuncx = (PFNGLALPHAFUNCXPROC) load(userptr, "glAlphaFuncx");
+ glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer");
+ glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture");
+ glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc");
+ glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData");
+ glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData");
+ glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear");
+ glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor");
+ glad_glClearColorx = (PFNGLCLEARCOLORXPROC) load(userptr, "glClearColorx");
+ glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf");
+ glad_glClearDepthx = (PFNGLCLEARDEPTHXPROC) load(userptr, "glClearDepthx");
+ glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil");
+ glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture");
+ glad_glClipPlanef = (PFNGLCLIPPLANEFPROC) load(userptr, "glClipPlanef");
+ glad_glClipPlanex = (PFNGLCLIPPLANEXPROC) load(userptr, "glClipPlanex");
+ glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f");
+ glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub");
+ glad_glColor4x = (PFNGLCOLOR4XPROC) load(userptr, "glColor4x");
+ glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask");
+ glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer");
+ glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D");
+ glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D");
+ glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D");
+ glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D");
+ glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace");
+ glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers");
+ glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures");
+ glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc");
+ glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask");
+ glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef");
+ glad_glDepthRangex = (PFNGLDEPTHRANGEXPROC) load(userptr, "glDepthRangex");
+ glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable");
+ glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState");
+ glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays");
+ glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements");
+ glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable");
+ glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState");
+ glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish");
+ glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush");
+ glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf");
+ glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv");
+ glad_glFogx = (PFNGLFOGXPROC) load(userptr, "glFogx");
+ glad_glFogxv = (PFNGLFOGXVPROC) load(userptr, "glFogxv");
+ glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace");
+ glad_glFrustumf = (PFNGLFRUSTUMFPROC) load(userptr, "glFrustumf");
+ glad_glFrustumx = (PFNGLFRUSTUMXPROC) load(userptr, "glFrustumx");
+ glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers");
+ glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures");
+ glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv");
+ glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv");
+ glad_glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC) load(userptr, "glGetClipPlanef");
+ glad_glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC) load(userptr, "glGetClipPlanex");
+ glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError");
+ glad_glGetFixedv = (PFNGLGETFIXEDVPROC) load(userptr, "glGetFixedv");
+ glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv");
+ glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv");
+ glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv");
+ glad_glGetLightxv = (PFNGLGETLIGHTXVPROC) load(userptr, "glGetLightxv");
+ glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv");
+ glad_glGetMaterialxv = (PFNGLGETMATERIALXVPROC) load(userptr, "glGetMaterialxv");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv");
+ glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv");
+ glad_glGetTexEnvxv = (PFNGLGETTEXENVXVPROC) load(userptr, "glGetTexEnvxv");
+ glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv");
+ glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv");
+ glad_glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC) load(userptr, "glGetTexParameterxv");
+ glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint");
+ glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer");
+ glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled");
+ glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture");
+ glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf");
+ glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv");
+ glad_glLightModelx = (PFNGLLIGHTMODELXPROC) load(userptr, "glLightModelx");
+ glad_glLightModelxv = (PFNGLLIGHTMODELXVPROC) load(userptr, "glLightModelxv");
+ glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf");
+ glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv");
+ glad_glLightx = (PFNGLLIGHTXPROC) load(userptr, "glLightx");
+ glad_glLightxv = (PFNGLLIGHTXVPROC) load(userptr, "glLightxv");
+ glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth");
+ glad_glLineWidthx = (PFNGLLINEWIDTHXPROC) load(userptr, "glLineWidthx");
+ glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity");
+ glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf");
+ glad_glLoadMatrixx = (PFNGLLOADMATRIXXPROC) load(userptr, "glLoadMatrixx");
+ glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp");
+ glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf");
+ glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv");
+ glad_glMaterialx = (PFNGLMATERIALXPROC) load(userptr, "glMaterialx");
+ glad_glMaterialxv = (PFNGLMATERIALXVPROC) load(userptr, "glMaterialxv");
+ glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode");
+ glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf");
+ glad_glMultMatrixx = (PFNGLMULTMATRIXXPROC) load(userptr, "glMultMatrixx");
+ glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f");
+ glad_glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC) load(userptr, "glMultiTexCoord4x");
+ glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f");
+ glad_glNormal3x = (PFNGLNORMAL3XPROC) load(userptr, "glNormal3x");
+ glad_glNormalPointer = (PFNGLNORMALPOINTERPROC) load(userptr, "glNormalPointer");
+ glad_glOrthof = (PFNGLORTHOFPROC) load(userptr, "glOrthof");
+ glad_glOrthox = (PFNGLORTHOXPROC) load(userptr, "glOrthox");
+ glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei");
+ glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(userptr, "glPointParameterf");
+ glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(userptr, "glPointParameterfv");
+ glad_glPointParameterx = (PFNGLPOINTPARAMETERXPROC) load(userptr, "glPointParameterx");
+ glad_glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC) load(userptr, "glPointParameterxv");
+ glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize");
+ glad_glPointSizex = (PFNGLPOINTSIZEXPROC) load(userptr, "glPointSizex");
+ glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset");
+ glad_glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC) load(userptr, "glPolygonOffsetx");
+ glad_glPopMatrix = (PFNGLPOPMATRIXPROC) load(userptr, "glPopMatrix");
+ glad_glPushMatrix = (PFNGLPUSHMATRIXPROC) load(userptr, "glPushMatrix");
+ glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels");
+ glad_glRotatef = (PFNGLROTATEFPROC) load(userptr, "glRotatef");
+ glad_glRotatex = (PFNGLROTATEXPROC) load(userptr, "glRotatex");
+ glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage");
+ glad_glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC) load(userptr, "glSampleCoveragex");
+ glad_glScalef = (PFNGLSCALEFPROC) load(userptr, "glScalef");
+ glad_glScalex = (PFNGLSCALEXPROC) load(userptr, "glScalex");
+ glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor");
+ glad_glShadeModel = (PFNGLSHADEMODELPROC) load(userptr, "glShadeModel");
+ glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc");
+ glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask");
+ glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp");
+ glad_glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load(userptr, "glTexCoordPointer");
+ glad_glTexEnvf = (PFNGLTEXENVFPROC) load(userptr, "glTexEnvf");
+ glad_glTexEnvfv = (PFNGLTEXENVFVPROC) load(userptr, "glTexEnvfv");
+ glad_glTexEnvi = (PFNGLTEXENVIPROC) load(userptr, "glTexEnvi");
+ glad_glTexEnviv = (PFNGLTEXENVIVPROC) load(userptr, "glTexEnviv");
+ glad_glTexEnvx = (PFNGLTEXENVXPROC) load(userptr, "glTexEnvx");
+ glad_glTexEnvxv = (PFNGLTEXENVXVPROC) load(userptr, "glTexEnvxv");
+ glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D");
+ glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf");
+ glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv");
+ glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri");
+ glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv");
+ glad_glTexParameterx = (PFNGLTEXPARAMETERXPROC) load(userptr, "glTexParameterx");
+ glad_glTexParameterxv = (PFNGLTEXPARAMETERXVPROC) load(userptr, "glTexParameterxv");
+ glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D");
+ glad_glTranslatef = (PFNGLTRANSLATEFPROC) load(userptr, "glTranslatef");
+ glad_glTranslatex = (PFNGLTRANSLATEXPROC) load(userptr, "glTranslatex");
+ glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer");
+ glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport");
+}
+static void glad_gl_load_GL_ARB_copy_buffer( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_copy_buffer) return;
+ glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData");
+}
+static void glad_gl_load_GL_ARB_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_framebuffer_object) return;
+ glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer");
+ glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer");
+ glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer");
+ glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus");
+ glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers");
+ glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers");
+ glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer");
+ glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D");
+ glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D");
+ glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D");
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers");
+ glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers");
+ glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap");
+ glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv");
+ glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv");
+ glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer");
+ glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer");
+ glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage");
+ glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample");
+}
+static void glad_gl_load_GL_ARB_geometry_shader4( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_geometry_shader4) return;
+ glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture");
+ glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC) load(userptr, "glFramebufferTextureARB");
+ glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB");
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) load(userptr, "glFramebufferTextureLayerARB");
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+ glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC) load(userptr, "glProgramParameteriARB");
+}
+static void glad_gl_load_GL_ARB_get_program_binary( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_get_program_binary) return;
+ glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary");
+ glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary");
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+}
+static void glad_gl_load_GL_ARB_imaging( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_imaging) return;
+ glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor");
+ glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation");
+ glad_glColorSubTable = (PFNGLCOLORSUBTABLEPROC) load(userptr, "glColorSubTable");
+ glad_glColorTable = (PFNGLCOLORTABLEPROC) load(userptr, "glColorTable");
+ glad_glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC) load(userptr, "glColorTableParameterfv");
+ glad_glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC) load(userptr, "glColorTableParameteriv");
+ glad_glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC) load(userptr, "glConvolutionFilter1D");
+ glad_glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC) load(userptr, "glConvolutionFilter2D");
+ glad_glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC) load(userptr, "glConvolutionParameterf");
+ glad_glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC) load(userptr, "glConvolutionParameterfv");
+ glad_glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC) load(userptr, "glConvolutionParameteri");
+ glad_glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC) load(userptr, "glConvolutionParameteriv");
+ glad_glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC) load(userptr, "glCopyColorSubTable");
+ glad_glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC) load(userptr, "glCopyColorTable");
+ glad_glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC) load(userptr, "glCopyConvolutionFilter1D");
+ glad_glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC) load(userptr, "glCopyConvolutionFilter2D");
+ glad_glGetColorTable = (PFNGLGETCOLORTABLEPROC) load(userptr, "glGetColorTable");
+ glad_glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC) load(userptr, "glGetColorTableParameterfv");
+ glad_glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC) load(userptr, "glGetColorTableParameteriv");
+ glad_glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC) load(userptr, "glGetConvolutionFilter");
+ glad_glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC) load(userptr, "glGetConvolutionParameterfv");
+ glad_glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC) load(userptr, "glGetConvolutionParameteriv");
+ glad_glGetHistogram = (PFNGLGETHISTOGRAMPROC) load(userptr, "glGetHistogram");
+ glad_glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC) load(userptr, "glGetHistogramParameterfv");
+ glad_glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC) load(userptr, "glGetHistogramParameteriv");
+ glad_glGetMinmax = (PFNGLGETMINMAXPROC) load(userptr, "glGetMinmax");
+ glad_glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC) load(userptr, "glGetMinmaxParameterfv");
+ glad_glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC) load(userptr, "glGetMinmaxParameteriv");
+ glad_glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC) load(userptr, "glGetSeparableFilter");
+ glad_glHistogram = (PFNGLHISTOGRAMPROC) load(userptr, "glHistogram");
+ glad_glMinmax = (PFNGLMINMAXPROC) load(userptr, "glMinmax");
+ glad_glResetHistogram = (PFNGLRESETHISTOGRAMPROC) load(userptr, "glResetHistogram");
+ glad_glResetMinmax = (PFNGLRESETMINMAXPROC) load(userptr, "glResetMinmax");
+ glad_glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC) load(userptr, "glSeparableFilter2D");
+}
+static void glad_gl_load_GL_ARB_multitexture( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_multitexture) return;
+ glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture");
+ glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) load(userptr, "glActiveTextureARB");
+ glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture");
+ glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) load(userptr, "glClientActiveTextureARB");
+ glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC) load(userptr, "glMultiTexCoord1d");
+ glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC) load(userptr, "glMultiTexCoord1dARB");
+ glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC) load(userptr, "glMultiTexCoord1dv");
+ glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC) load(userptr, "glMultiTexCoord1dvARB");
+ glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC) load(userptr, "glMultiTexCoord1f");
+ glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC) load(userptr, "glMultiTexCoord1fARB");
+ glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC) load(userptr, "glMultiTexCoord1fv");
+ glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC) load(userptr, "glMultiTexCoord1fvARB");
+ glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC) load(userptr, "glMultiTexCoord1i");
+ glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC) load(userptr, "glMultiTexCoord1iARB");
+ glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC) load(userptr, "glMultiTexCoord1iv");
+ glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC) load(userptr, "glMultiTexCoord1ivARB");
+ glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC) load(userptr, "glMultiTexCoord1s");
+ glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC) load(userptr, "glMultiTexCoord1sARB");
+ glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC) load(userptr, "glMultiTexCoord1sv");
+ glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC) load(userptr, "glMultiTexCoord1svARB");
+ glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC) load(userptr, "glMultiTexCoord2d");
+ glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC) load(userptr, "glMultiTexCoord2dARB");
+ glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC) load(userptr, "glMultiTexCoord2dv");
+ glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC) load(userptr, "glMultiTexCoord2dvARB");
+ glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) load(userptr, "glMultiTexCoord2f");
+ glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) load(userptr, "glMultiTexCoord2fARB");
+ glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) load(userptr, "glMultiTexCoord2fv");
+ glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC) load(userptr, "glMultiTexCoord2fvARB");
+ glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC) load(userptr, "glMultiTexCoord2i");
+ glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC) load(userptr, "glMultiTexCoord2iARB");
+ glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC) load(userptr, "glMultiTexCoord2iv");
+ glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC) load(userptr, "glMultiTexCoord2ivARB");
+ glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC) load(userptr, "glMultiTexCoord2s");
+ glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC) load(userptr, "glMultiTexCoord2sARB");
+ glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC) load(userptr, "glMultiTexCoord2sv");
+ glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC) load(userptr, "glMultiTexCoord2svARB");
+ glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC) load(userptr, "glMultiTexCoord3d");
+ glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC) load(userptr, "glMultiTexCoord3dARB");
+ glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC) load(userptr, "glMultiTexCoord3dv");
+ glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC) load(userptr, "glMultiTexCoord3dvARB");
+ glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC) load(userptr, "glMultiTexCoord3f");
+ glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC) load(userptr, "glMultiTexCoord3fARB");
+ glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC) load(userptr, "glMultiTexCoord3fv");
+ glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC) load(userptr, "glMultiTexCoord3fvARB");
+ glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC) load(userptr, "glMultiTexCoord3i");
+ glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC) load(userptr, "glMultiTexCoord3iARB");
+ glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC) load(userptr, "glMultiTexCoord3iv");
+ glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC) load(userptr, "glMultiTexCoord3ivARB");
+ glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC) load(userptr, "glMultiTexCoord3s");
+ glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC) load(userptr, "glMultiTexCoord3sARB");
+ glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC) load(userptr, "glMultiTexCoord3sv");
+ glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC) load(userptr, "glMultiTexCoord3svARB");
+ glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC) load(userptr, "glMultiTexCoord4d");
+ glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC) load(userptr, "glMultiTexCoord4dARB");
+ glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC) load(userptr, "glMultiTexCoord4dv");
+ glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC) load(userptr, "glMultiTexCoord4dvARB");
+ glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f");
+ glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC) load(userptr, "glMultiTexCoord4fARB");
+ glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC) load(userptr, "glMultiTexCoord4fv");
+ glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC) load(userptr, "glMultiTexCoord4fvARB");
+ glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC) load(userptr, "glMultiTexCoord4i");
+ glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC) load(userptr, "glMultiTexCoord4iARB");
+ glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC) load(userptr, "glMultiTexCoord4iv");
+ glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC) load(userptr, "glMultiTexCoord4ivARB");
+ glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC) load(userptr, "glMultiTexCoord4s");
+ glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC) load(userptr, "glMultiTexCoord4sARB");
+ glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC) load(userptr, "glMultiTexCoord4sv");
+ glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC) load(userptr, "glMultiTexCoord4svARB");
+}
+static void glad_gl_load_GL_ARB_separate_shader_objects( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_separate_shader_objects) return;
+ glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram");
+ glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(userptr, "glBindProgramPipeline");
+ glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(userptr, "glCreateShaderProgramv");
+ glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(userptr, "glDeleteProgramPipelines");
+ glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(userptr, "glGenProgramPipelines");
+ glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(userptr, "glGetProgramPipelineInfoLog");
+ glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(userptr, "glGetProgramPipelineiv");
+ glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(userptr, "glIsProgramPipeline");
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+ glad_glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load(userptr, "glProgramUniform1d");
+ glad_glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load(userptr, "glProgramUniform1dv");
+ glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(userptr, "glProgramUniform1f");
+ glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(userptr, "glProgramUniform1fv");
+ glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(userptr, "glProgramUniform1i");
+ glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(userptr, "glProgramUniform1iv");
+ glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(userptr, "glProgramUniform1ui");
+ glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(userptr, "glProgramUniform1uiv");
+ glad_glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load(userptr, "glProgramUniform2d");
+ glad_glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load(userptr, "glProgramUniform2dv");
+ glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(userptr, "glProgramUniform2f");
+ glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(userptr, "glProgramUniform2fv");
+ glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(userptr, "glProgramUniform2i");
+ glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(userptr, "glProgramUniform2iv");
+ glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(userptr, "glProgramUniform2ui");
+ glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(userptr, "glProgramUniform2uiv");
+ glad_glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load(userptr, "glProgramUniform3d");
+ glad_glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load(userptr, "glProgramUniform3dv");
+ glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(userptr, "glProgramUniform3f");
+ glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(userptr, "glProgramUniform3fv");
+ glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(userptr, "glProgramUniform3i");
+ glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(userptr, "glProgramUniform3iv");
+ glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(userptr, "glProgramUniform3ui");
+ glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(userptr, "glProgramUniform3uiv");
+ glad_glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load(userptr, "glProgramUniform4d");
+ glad_glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load(userptr, "glProgramUniform4dv");
+ glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(userptr, "glProgramUniform4f");
+ glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(userptr, "glProgramUniform4fv");
+ glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(userptr, "glProgramUniform4i");
+ glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(userptr, "glProgramUniform4iv");
+ glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(userptr, "glProgramUniform4ui");
+ glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(userptr, "glProgramUniform4uiv");
+ glad_glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load(userptr, "glProgramUniformMatrix2dv");
+ glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(userptr, "glProgramUniformMatrix2fv");
+ glad_glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load(userptr, "glProgramUniformMatrix2x3dv");
+ glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(userptr, "glProgramUniformMatrix2x3fv");
+ glad_glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load(userptr, "glProgramUniformMatrix2x4dv");
+ glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(userptr, "glProgramUniformMatrix2x4fv");
+ glad_glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load(userptr, "glProgramUniformMatrix3dv");
+ glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(userptr, "glProgramUniformMatrix3fv");
+ glad_glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load(userptr, "glProgramUniformMatrix3x2dv");
+ glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(userptr, "glProgramUniformMatrix3x2fv");
+ glad_glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load(userptr, "glProgramUniformMatrix3x4dv");
+ glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(userptr, "glProgramUniformMatrix3x4fv");
+ glad_glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load(userptr, "glProgramUniformMatrix4dv");
+ glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(userptr, "glProgramUniformMatrix4fv");
+ glad_glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load(userptr, "glProgramUniformMatrix4x2dv");
+ glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(userptr, "glProgramUniformMatrix4x2fv");
+ glad_glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load(userptr, "glProgramUniformMatrix4x3dv");
+ glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(userptr, "glProgramUniformMatrix4x3fv");
+ glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages");
+ glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline");
+}
+static void glad_gl_load_GL_ARB_shader_objects( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_shader_objects) return;
+ glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) load(userptr, "glAttachObjectARB");
+ glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader");
+ glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader");
+ glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) load(userptr, "glCompileShaderARB");
+ glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram");
+ glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) load(userptr, "glCreateProgramObjectARB");
+ glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader");
+ glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) load(userptr, "glCreateShaderObjectARB");
+ glad_glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) load(userptr, "glDeleteObjectARB");
+ glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) load(userptr, "glDetachObjectARB");
+ glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader");
+ glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform");
+ glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) load(userptr, "glGetActiveUniformARB");
+ glad_glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) load(userptr, "glGetAttachedObjectsARB");
+ glad_glGetHandleARB = (PFNGLGETHANDLEARBPROC) load(userptr, "glGetHandleARB");
+ glad_glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) load(userptr, "glGetInfoLogARB");
+ glad_glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) load(userptr, "glGetObjectParameterfvARB");
+ glad_glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) load(userptr, "glGetObjectParameterivARB");
+ glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource");
+ glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) load(userptr, "glGetShaderSourceARB");
+ glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation");
+ glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) load(userptr, "glGetUniformLocationARB");
+ glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv");
+ glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) load(userptr, "glGetUniformfvARB");
+ glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv");
+ glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) load(userptr, "glGetUniformivARB");
+ glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram");
+ glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) load(userptr, "glLinkProgramARB");
+ glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource");
+ glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) load(userptr, "glShaderSourceARB");
+ glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f");
+ glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC) load(userptr, "glUniform1fARB");
+ glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv");
+ glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) load(userptr, "glUniform1fvARB");
+ glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i");
+ glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC) load(userptr, "glUniform1iARB");
+ glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv");
+ glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) load(userptr, "glUniform1ivARB");
+ glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f");
+ glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC) load(userptr, "glUniform2fARB");
+ glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv");
+ glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) load(userptr, "glUniform2fvARB");
+ glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i");
+ glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC) load(userptr, "glUniform2iARB");
+ glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv");
+ glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) load(userptr, "glUniform2ivARB");
+ glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f");
+ glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC) load(userptr, "glUniform3fARB");
+ glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv");
+ glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) load(userptr, "glUniform3fvARB");
+ glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i");
+ glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC) load(userptr, "glUniform3iARB");
+ glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv");
+ glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) load(userptr, "glUniform3ivARB");
+ glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f");
+ glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC) load(userptr, "glUniform4fARB");
+ glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv");
+ glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) load(userptr, "glUniform4fvARB");
+ glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i");
+ glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC) load(userptr, "glUniform4iARB");
+ glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv");
+ glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) load(userptr, "glUniform4ivARB");
+ glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv");
+ glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) load(userptr, "glUniformMatrix2fvARB");
+ glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv");
+ glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) load(userptr, "glUniformMatrix3fvARB");
+ glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv");
+ glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) load(userptr, "glUniformMatrix4fvARB");
+ glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram");
+ glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) load(userptr, "glUseProgramObjectARB");
+ glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram");
+ glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) load(userptr, "glValidateProgramARB");
+}
+static void glad_gl_load_GL_ARB_vertex_buffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_vertex_buffer_object) return;
+ glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer");
+ glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC) load(userptr, "glBindBufferARB");
+ glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData");
+ glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC) load(userptr, "glBufferDataARB");
+ glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData");
+ glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) load(userptr, "glBufferSubDataARB");
+ glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers");
+ glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) load(userptr, "glDeleteBuffersARB");
+ glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers");
+ glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) load(userptr, "glGenBuffersARB");
+ glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv");
+ glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) load(userptr, "glGetBufferParameterivARB");
+ glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv");
+ glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) load(userptr, "glGetBufferPointervARB");
+ glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData");
+ glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) load(userptr, "glGetBufferSubDataARB");
+ glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer");
+ glad_glIsBufferARB = (PFNGLISBUFFERARBPROC) load(userptr, "glIsBufferARB");
+ glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer");
+ glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) load(userptr, "glMapBufferARB");
+ glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer");
+ glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC) load(userptr, "glUnmapBufferARB");
+}
+static void glad_gl_load_GL_ARB_vertex_program( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_vertex_program) return;
+ glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB");
+ glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB");
+ glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray");
+ glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB");
+ glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray");
+ glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB");
+ glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB");
+ glad_glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) load(userptr, "glGetProgramEnvParameterdvARB");
+ glad_glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) load(userptr, "glGetProgramEnvParameterfvARB");
+ glad_glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) load(userptr, "glGetProgramLocalParameterdvARB");
+ glad_glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) load(userptr, "glGetProgramLocalParameterfvARB");
+ glad_glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) load(userptr, "glGetProgramStringARB");
+ glad_glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) load(userptr, "glGetProgramivARB");
+ glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv");
+ glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB");
+ glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv");
+ glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB");
+ glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv");
+ glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB");
+ glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv");
+ glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB");
+ glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB");
+ glad_glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) load(userptr, "glProgramEnvParameter4dARB");
+ glad_glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) load(userptr, "glProgramEnvParameter4dvARB");
+ glad_glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) load(userptr, "glProgramEnvParameter4fARB");
+ glad_glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) load(userptr, "glProgramEnvParameter4fvARB");
+ glad_glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) load(userptr, "glProgramLocalParameter4dARB");
+ glad_glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) load(userptr, "glProgramLocalParameter4dvARB");
+ glad_glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) load(userptr, "glProgramLocalParameter4fARB");
+ glad_glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) load(userptr, "glProgramLocalParameter4fvARB");
+ glad_glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) load(userptr, "glProgramStringARB");
+ glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d");
+ glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB");
+ glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv");
+ glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB");
+ glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f");
+ glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB");
+ glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv");
+ glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB");
+ glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s");
+ glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB");
+ glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv");
+ glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB");
+ glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d");
+ glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB");
+ glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv");
+ glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB");
+ glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f");
+ glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB");
+ glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv");
+ glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB");
+ glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s");
+ glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB");
+ glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv");
+ glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB");
+ glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d");
+ glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB");
+ glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv");
+ glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB");
+ glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f");
+ glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB");
+ glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv");
+ glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB");
+ glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s");
+ glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB");
+ glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv");
+ glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB");
+ glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv");
+ glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB");
+ glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv");
+ glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB");
+ glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv");
+ glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB");
+ glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub");
+ glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB");
+ glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv");
+ glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB");
+ glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv");
+ glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB");
+ glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv");
+ glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB");
+ glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv");
+ glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB");
+ glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d");
+ glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB");
+ glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv");
+ glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB");
+ glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f");
+ glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB");
+ glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv");
+ glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB");
+ glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv");
+ glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB");
+ glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s");
+ glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB");
+ glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv");
+ glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB");
+ glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv");
+ glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB");
+ glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv");
+ glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB");
+ glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv");
+ glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB");
+ glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer");
+ glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB");
+}
+static void glad_gl_load_GL_ARB_vertex_shader( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_ARB_vertex_shader) return;
+ glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation");
+ glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) load(userptr, "glBindAttribLocationARB");
+ glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray");
+ glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB");
+ glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray");
+ glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB");
+ glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib");
+ glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) load(userptr, "glGetActiveAttribARB");
+ glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation");
+ glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) load(userptr, "glGetAttribLocationARB");
+ glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv");
+ glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB");
+ glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv");
+ glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB");
+ glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv");
+ glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB");
+ glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv");
+ glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB");
+ glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d");
+ glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB");
+ glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv");
+ glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB");
+ glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f");
+ glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB");
+ glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv");
+ glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB");
+ glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s");
+ glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB");
+ glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv");
+ glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB");
+ glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d");
+ glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB");
+ glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv");
+ glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB");
+ glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f");
+ glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB");
+ glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv");
+ glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB");
+ glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s");
+ glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB");
+ glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv");
+ glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB");
+ glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d");
+ glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB");
+ glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv");
+ glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB");
+ glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f");
+ glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB");
+ glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv");
+ glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB");
+ glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s");
+ glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB");
+ glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv");
+ glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB");
+ glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv");
+ glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB");
+ glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv");
+ glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB");
+ glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv");
+ glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB");
+ glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub");
+ glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB");
+ glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv");
+ glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB");
+ glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv");
+ glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB");
+ glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv");
+ glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB");
+ glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv");
+ glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB");
+ glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d");
+ glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB");
+ glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv");
+ glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB");
+ glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f");
+ glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB");
+ glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv");
+ glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB");
+ glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv");
+ glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB");
+ glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s");
+ glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB");
+ glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv");
+ glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB");
+ glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv");
+ glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB");
+ glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv");
+ glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB");
+ glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv");
+ glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB");
+ glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer");
+ glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB");
+}
+static void glad_gl_load_GL_EXT_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_blend_equation_separate) return;
+ glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate");
+ glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC) load(userptr, "glBlendEquationSeparateEXT");
+}
+static void glad_gl_load_GL_EXT_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_blend_func_separate) return;
+ glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate");
+ glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) load(userptr, "glBlendFuncSeparateEXT");
+}
+static void glad_gl_load_GL_EXT_blend_minmax( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_blend_minmax) return;
+ glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation");
+ glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC) load(userptr, "glBlendEquationEXT");
+}
+static void glad_gl_load_GL_EXT_copy_texture( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_copy_texture) return;
+ glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D");
+ glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC) load(userptr, "glCopyTexImage1DEXT");
+ glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D");
+ glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC) load(userptr, "glCopyTexImage2DEXT");
+ glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D");
+ glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC) load(userptr, "glCopyTexSubImage1DEXT");
+ glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D");
+ glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC) load(userptr, "glCopyTexSubImage2DEXT");
+ glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D");
+ glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC) load(userptr, "glCopyTexSubImage3DEXT");
+}
+static void glad_gl_load_GL_EXT_framebuffer_blit( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_framebuffer_blit) return;
+ glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer");
+ glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) load(userptr, "glBlitFramebufferEXT");
+}
+static void glad_gl_load_GL_EXT_framebuffer_multisample( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_framebuffer_multisample) return;
+ glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample");
+ glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) load(userptr, "glRenderbufferStorageMultisampleEXT");
+}
+static void glad_gl_load_GL_EXT_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_framebuffer_object) return;
+ glad_glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) load(userptr, "glBindFramebufferEXT");
+ glad_glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) load(userptr, "glBindRenderbufferEXT");
+ glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus");
+ glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) load(userptr, "glCheckFramebufferStatusEXT");
+ glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers");
+ glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) load(userptr, "glDeleteFramebuffersEXT");
+ glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers");
+ glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) load(userptr, "glDeleteRenderbuffersEXT");
+ glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer");
+ glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) load(userptr, "glFramebufferRenderbufferEXT");
+ glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D");
+ glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) load(userptr, "glFramebufferTexture1DEXT");
+ glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D");
+ glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) load(userptr, "glFramebufferTexture2DEXT");
+ glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D");
+ glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) load(userptr, "glFramebufferTexture3DEXT");
+ glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers");
+ glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) load(userptr, "glGenFramebuffersEXT");
+ glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers");
+ glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) load(userptr, "glGenRenderbuffersEXT");
+ glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap");
+ glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) load(userptr, "glGenerateMipmapEXT");
+ glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv");
+ glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) load(userptr, "glGetFramebufferAttachmentParameterivEXT");
+ glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv");
+ glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetRenderbufferParameterivEXT");
+ glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer");
+ glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) load(userptr, "glIsFramebufferEXT");
+ glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer");
+ glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) load(userptr, "glIsRenderbufferEXT");
+ glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage");
+ glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) load(userptr, "glRenderbufferStorageEXT");
+}
+static void glad_gl_load_GL_EXT_geometry_shader4( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_geometry_shader4) return;
+ glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+ glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC) load(userptr, "glProgramParameteriEXT");
+}
+static void glad_gl_load_GL_EXT_subtexture( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_subtexture) return;
+ glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D");
+ glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC) load(userptr, "glTexSubImage1DEXT");
+ glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D");
+ glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC) load(userptr, "glTexSubImage2DEXT");
+}
+static void glad_gl_load_GL_EXT_texture_array( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_texture_array) return;
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT");
+}
+static void glad_gl_load_GL_EXT_texture_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_texture_object) return;
+ glad_glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC) load(userptr, "glAreTexturesResidentEXT");
+ glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture");
+ glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC) load(userptr, "glBindTextureEXT");
+ glad_glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC) load(userptr, "glDeleteTexturesEXT");
+ glad_glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC) load(userptr, "glGenTexturesEXT");
+ glad_glIsTextureEXT = (PFNGLISTEXTUREEXTPROC) load(userptr, "glIsTextureEXT");
+ glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(userptr, "glPrioritizeTextures");
+ glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC) load(userptr, "glPrioritizeTexturesEXT");
+}
+static void glad_gl_load_GL_EXT_vertex_array( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_EXT_vertex_array) return;
+ glad_glArrayElement = (PFNGLARRAYELEMENTPROC) load(userptr, "glArrayElement");
+ glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC) load(userptr, "glArrayElementEXT");
+ glad_glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC) load(userptr, "glColorPointerEXT");
+ glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays");
+ glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC) load(userptr, "glDrawArraysEXT");
+ glad_glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC) load(userptr, "glEdgeFlagPointerEXT");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC) load(userptr, "glGetPointervEXT");
+ glad_glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC) load(userptr, "glIndexPointerEXT");
+ glad_glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC) load(userptr, "glNormalPointerEXT");
+ glad_glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC) load(userptr, "glTexCoordPointerEXT");
+ glad_glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC) load(userptr, "glVertexPointerEXT");
+}
+static void glad_gl_load_GL_INGR_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_INGR_blend_func_separate) return;
+ glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate");
+ glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC) load(userptr, "glBlendFuncSeparateINGR");
+}
+static void glad_gl_load_GL_KHR_debug( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_KHR_debug) return;
+ glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback");
+ glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl");
+ glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert");
+ glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog");
+ glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel");
+ glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel");
+ glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel");
+ glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel");
+ glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup");
+ glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup");
+}
+static void glad_gl_load_GL_NV_geometry_program4( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_NV_geometry_program4) return;
+ glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture");
+ glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC) load(userptr, "glFramebufferTextureEXT");
+ glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB");
+ glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) load(userptr, "glFramebufferTextureFaceEXT");
+ glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT");
+ glad_glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC) load(userptr, "glProgramVertexLimitNV");
+}
+static void glad_gl_load_GL_NV_vertex_program( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_NV_vertex_program) return;
+ glad_glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC) load(userptr, "glAreProgramsResidentNV");
+ glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB");
+ glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC) load(userptr, "glBindProgramNV");
+ glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB");
+ glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC) load(userptr, "glDeleteProgramsNV");
+ glad_glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC) load(userptr, "glExecuteProgramNV");
+ glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB");
+ glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC) load(userptr, "glGenProgramsNV");
+ glad_glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC) load(userptr, "glGetProgramParameterdvNV");
+ glad_glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC) load(userptr, "glGetProgramParameterfvNV");
+ glad_glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC) load(userptr, "glGetProgramStringNV");
+ glad_glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC) load(userptr, "glGetProgramivNV");
+ glad_glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC) load(userptr, "glGetTrackMatrixivNV");
+ glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv");
+ glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC) load(userptr, "glGetVertexAttribPointervNV");
+ glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv");
+ glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) load(userptr, "glGetVertexAttribdvNV");
+ glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv");
+ glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) load(userptr, "glGetVertexAttribfvNV");
+ glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv");
+ glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) load(userptr, "glGetVertexAttribivNV");
+ glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB");
+ glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC) load(userptr, "glIsProgramNV");
+ glad_glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC) load(userptr, "glLoadProgramNV");
+ glad_glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC) load(userptr, "glProgramParameter4dNV");
+ glad_glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC) load(userptr, "glProgramParameter4dvNV");
+ glad_glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC) load(userptr, "glProgramParameter4fNV");
+ glad_glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC) load(userptr, "glProgramParameter4fvNV");
+ glad_glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC) load(userptr, "glProgramParameters4dvNV");
+ glad_glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC) load(userptr, "glProgramParameters4fvNV");
+ glad_glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC) load(userptr, "glRequestResidentProgramsNV");
+ glad_glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC) load(userptr, "glTrackMatrixNV");
+ glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d");
+ glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC) load(userptr, "glVertexAttrib1dNV");
+ glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv");
+ glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC) load(userptr, "glVertexAttrib1dvNV");
+ glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f");
+ glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC) load(userptr, "glVertexAttrib1fNV");
+ glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv");
+ glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC) load(userptr, "glVertexAttrib1fvNV");
+ glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s");
+ glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC) load(userptr, "glVertexAttrib1sNV");
+ glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv");
+ glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC) load(userptr, "glVertexAttrib1svNV");
+ glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d");
+ glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC) load(userptr, "glVertexAttrib2dNV");
+ glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv");
+ glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC) load(userptr, "glVertexAttrib2dvNV");
+ glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f");
+ glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC) load(userptr, "glVertexAttrib2fNV");
+ glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv");
+ glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC) load(userptr, "glVertexAttrib2fvNV");
+ glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s");
+ glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC) load(userptr, "glVertexAttrib2sNV");
+ glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv");
+ glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC) load(userptr, "glVertexAttrib2svNV");
+ glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d");
+ glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC) load(userptr, "glVertexAttrib3dNV");
+ glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv");
+ glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC) load(userptr, "glVertexAttrib3dvNV");
+ glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f");
+ glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC) load(userptr, "glVertexAttrib3fNV");
+ glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv");
+ glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC) load(userptr, "glVertexAttrib3fvNV");
+ glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s");
+ glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC) load(userptr, "glVertexAttrib3sNV");
+ glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv");
+ glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC) load(userptr, "glVertexAttrib3svNV");
+ glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub");
+ glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv");
+ glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d");
+ glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC) load(userptr, "glVertexAttrib4dNV");
+ glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv");
+ glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC) load(userptr, "glVertexAttrib4dvNV");
+ glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f");
+ glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC) load(userptr, "glVertexAttrib4fNV");
+ glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv");
+ glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC) load(userptr, "glVertexAttrib4fvNV");
+ glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s");
+ glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC) load(userptr, "glVertexAttrib4sNV");
+ glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv");
+ glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC) load(userptr, "glVertexAttrib4svNV");
+ glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC) load(userptr, "glVertexAttrib4ubNV");
+ glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC) load(userptr, "glVertexAttrib4ubvNV");
+ glad_glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC) load(userptr, "glVertexAttribPointerNV");
+ glad_glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC) load(userptr, "glVertexAttribs1dvNV");
+ glad_glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC) load(userptr, "glVertexAttribs1fvNV");
+ glad_glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC) load(userptr, "glVertexAttribs1svNV");
+ glad_glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC) load(userptr, "glVertexAttribs2dvNV");
+ glad_glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC) load(userptr, "glVertexAttribs2fvNV");
+ glad_glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC) load(userptr, "glVertexAttribs2svNV");
+ glad_glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC) load(userptr, "glVertexAttribs3dvNV");
+ glad_glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC) load(userptr, "glVertexAttribs3fvNV");
+ glad_glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC) load(userptr, "glVertexAttribs3svNV");
+ glad_glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC) load(userptr, "glVertexAttribs4dvNV");
+ glad_glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC) load(userptr, "glVertexAttribs4fvNV");
+ glad_glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC) load(userptr, "glVertexAttribs4svNV");
+ glad_glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC) load(userptr, "glVertexAttribs4ubvNV");
+}
+static void glad_gl_load_GL_OES_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_blend_equation_separate) return;
+ glad_glBlendEquationSeparateOES = (PFNGLBLENDEQUATIONSEPARATEOESPROC) load(userptr, "glBlendEquationSeparateOES");
+}
+static void glad_gl_load_GL_OES_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_blend_func_separate) return;
+ glad_glBlendFuncSeparateOES = (PFNGLBLENDFUNCSEPARATEOESPROC) load(userptr, "glBlendFuncSeparateOES");
+}
+static void glad_gl_load_GL_OES_blend_subtract( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_blend_subtract) return;
+ glad_glBlendEquationOES = (PFNGLBLENDEQUATIONOESPROC) load(userptr, "glBlendEquationOES");
+}
+static void glad_gl_load_GL_OES_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_framebuffer_object) return;
+ glad_glBindFramebufferOES = (PFNGLBINDFRAMEBUFFEROESPROC) load(userptr, "glBindFramebufferOES");
+ glad_glBindRenderbufferOES = (PFNGLBINDRENDERBUFFEROESPROC) load(userptr, "glBindRenderbufferOES");
+ glad_glCheckFramebufferStatusOES = (PFNGLCHECKFRAMEBUFFERSTATUSOESPROC) load(userptr, "glCheckFramebufferStatusOES");
+ glad_glDeleteFramebuffersOES = (PFNGLDELETEFRAMEBUFFERSOESPROC) load(userptr, "glDeleteFramebuffersOES");
+ glad_glDeleteRenderbuffersOES = (PFNGLDELETERENDERBUFFERSOESPROC) load(userptr, "glDeleteRenderbuffersOES");
+ glad_glFramebufferRenderbufferOES = (PFNGLFRAMEBUFFERRENDERBUFFEROESPROC) load(userptr, "glFramebufferRenderbufferOES");
+ glad_glFramebufferTexture2DOES = (PFNGLFRAMEBUFFERTEXTURE2DOESPROC) load(userptr, "glFramebufferTexture2DOES");
+ glad_glGenFramebuffersOES = (PFNGLGENFRAMEBUFFERSOESPROC) load(userptr, "glGenFramebuffersOES");
+ glad_glGenRenderbuffersOES = (PFNGLGENRENDERBUFFERSOESPROC) load(userptr, "glGenRenderbuffersOES");
+ glad_glGenerateMipmapOES = (PFNGLGENERATEMIPMAPOESPROC) load(userptr, "glGenerateMipmapOES");
+ glad_glGetFramebufferAttachmentParameterivOES = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC) load(userptr, "glGetFramebufferAttachmentParameterivOES");
+ glad_glGetRenderbufferParameterivOES = (PFNGLGETRENDERBUFFERPARAMETERIVOESPROC) load(userptr, "glGetRenderbufferParameterivOES");
+ glad_glIsFramebufferOES = (PFNGLISFRAMEBUFFEROESPROC) load(userptr, "glIsFramebufferOES");
+ glad_glIsRenderbufferOES = (PFNGLISRENDERBUFFEROESPROC) load(userptr, "glIsRenderbufferOES");
+ glad_glRenderbufferStorageOES = (PFNGLRENDERBUFFERSTORAGEOESPROC) load(userptr, "glRenderbufferStorageOES");
+}
+static void glad_gl_load_GL_OES_single_precision( GLADuserptrloadfunc load, void* userptr) {
+ if(!GLAD_GL_OES_single_precision) return;
+ glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf");
+ glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC) load(userptr, "glClearDepthfOES");
+ glad_glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC) load(userptr, "glClipPlanefOES");
+ glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef");
+ glad_glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC) load(userptr, "glDepthRangefOES");
+ glad_glFrustumfOES = (PFNGLFRUSTUMFOESPROC) load(userptr, "glFrustumfOES");
+ glad_glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC) load(userptr, "glGetClipPlanefOES");
+ glad_glOrthofOES = (PFNGLORTHOFOESPROC) load(userptr, "glOrthofOES");
+}
+
+
+static void glad_gl_resolve_aliases(void) {
+ if (glad_glActiveTexture == NULL && glad_glActiveTextureARB != NULL) glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC)glad_glActiveTextureARB;
+ if (glad_glActiveTextureARB == NULL && glad_glActiveTexture != NULL) glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glad_glActiveTexture;
+ if (glad_glArrayElement == NULL && glad_glArrayElementEXT != NULL) glad_glArrayElement = (PFNGLARRAYELEMENTPROC)glad_glArrayElementEXT;
+ if (glad_glArrayElementEXT == NULL && glad_glArrayElement != NULL) glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glad_glArrayElement;
+ if (glad_glAttachObjectARB == NULL && glad_glAttachShader != NULL) glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glad_glAttachShader;
+ if (glad_glAttachShader == NULL && glad_glAttachObjectARB != NULL) glad_glAttachShader = (PFNGLATTACHSHADERPROC)glad_glAttachObjectARB;
+ if (glad_glBindAttribLocation == NULL && glad_glBindAttribLocationARB != NULL) glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glad_glBindAttribLocationARB;
+ if (glad_glBindAttribLocationARB == NULL && glad_glBindAttribLocation != NULL) glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glad_glBindAttribLocation;
+ if (glad_glBindBuffer == NULL && glad_glBindBufferARB != NULL) glad_glBindBuffer = (PFNGLBINDBUFFERPROC)glad_glBindBufferARB;
+ if (glad_glBindBufferARB == NULL && glad_glBindBuffer != NULL) glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glad_glBindBuffer;
+ if (glad_glBindProgramARB == NULL && glad_glBindProgramNV != NULL) glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glad_glBindProgramNV;
+ if (glad_glBindProgramNV == NULL && glad_glBindProgramARB != NULL) glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glad_glBindProgramARB;
+ if (glad_glBindTexture == NULL && glad_glBindTextureEXT != NULL) glad_glBindTexture = (PFNGLBINDTEXTUREPROC)glad_glBindTextureEXT;
+ if (glad_glBindTextureEXT == NULL && glad_glBindTexture != NULL) glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glad_glBindTexture;
+ if (glad_glBlendEquation == NULL && glad_glBlendEquationEXT != NULL) glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC)glad_glBlendEquationEXT;
+ if (glad_glBlendEquationEXT == NULL && glad_glBlendEquation != NULL) glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glad_glBlendEquation;
+ if (glad_glBlendEquationSeparate == NULL && glad_glBlendEquationSeparateEXT != NULL) glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glad_glBlendEquationSeparateEXT;
+ if (glad_glBlendEquationSeparateEXT == NULL && glad_glBlendEquationSeparate != NULL) glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glad_glBlendEquationSeparate;
+ if (glad_glBlendFuncSeparate == NULL && glad_glBlendFuncSeparateINGR != NULL) glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glad_glBlendFuncSeparateINGR;
+ if (glad_glBlendFuncSeparate == NULL && glad_glBlendFuncSeparateEXT != NULL) glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glad_glBlendFuncSeparateEXT;
+ if (glad_glBlendFuncSeparateEXT == NULL && glad_glBlendFuncSeparate != NULL) glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glad_glBlendFuncSeparate;
+ if (glad_glBlendFuncSeparateEXT == NULL && glad_glBlendFuncSeparateINGR != NULL) glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glad_glBlendFuncSeparateINGR;
+ if (glad_glBlendFuncSeparateINGR == NULL && glad_glBlendFuncSeparate != NULL) glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC)glad_glBlendFuncSeparate;
+ if (glad_glBlendFuncSeparateINGR == NULL && glad_glBlendFuncSeparateEXT != NULL) glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC)glad_glBlendFuncSeparateEXT;
+ if (glad_glBlitFramebuffer == NULL && glad_glBlitFramebufferEXT != NULL) glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glad_glBlitFramebufferEXT;
+ if (glad_glBlitFramebufferEXT == NULL && glad_glBlitFramebuffer != NULL) glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glad_glBlitFramebuffer;
+ if (glad_glBufferData == NULL && glad_glBufferDataARB != NULL) glad_glBufferData = (PFNGLBUFFERDATAPROC)glad_glBufferDataARB;
+ if (glad_glBufferDataARB == NULL && glad_glBufferData != NULL) glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glad_glBufferData;
+ if (glad_glBufferSubData == NULL && glad_glBufferSubDataARB != NULL) glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glad_glBufferSubDataARB;
+ if (glad_glBufferSubDataARB == NULL && glad_glBufferSubData != NULL) glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glad_glBufferSubData;
+ if (glad_glCheckFramebufferStatus == NULL && glad_glCheckFramebufferStatusEXT != NULL) glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glad_glCheckFramebufferStatusEXT;
+ if (glad_glCheckFramebufferStatusEXT == NULL && glad_glCheckFramebufferStatus != NULL) glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glad_glCheckFramebufferStatus;
+ if (glad_glClearDepthf == NULL && glad_glClearDepthfOES != NULL) glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC)glad_glClearDepthfOES;
+ if (glad_glClearDepthfOES == NULL && glad_glClearDepthf != NULL) glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)glad_glClearDepthf;
+ if (glad_glClientActiveTexture == NULL && glad_glClientActiveTextureARB != NULL) glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glad_glClientActiveTextureARB;
+ if (glad_glClientActiveTextureARB == NULL && glad_glClientActiveTexture != NULL) glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glad_glClientActiveTexture;
+ if (glad_glCompileShader == NULL && glad_glCompileShaderARB != NULL) glad_glCompileShader = (PFNGLCOMPILESHADERPROC)glad_glCompileShaderARB;
+ if (glad_glCompileShaderARB == NULL && glad_glCompileShader != NULL) glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glad_glCompileShader;
+ if (glad_glCopyTexImage1D == NULL && glad_glCopyTexImage1DEXT != NULL) glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC)glad_glCopyTexImage1DEXT;
+ if (glad_glCopyTexImage1DEXT == NULL && glad_glCopyTexImage1D != NULL) glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glad_glCopyTexImage1D;
+ if (glad_glCopyTexImage2D == NULL && glad_glCopyTexImage2DEXT != NULL) glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)glad_glCopyTexImage2DEXT;
+ if (glad_glCopyTexImage2DEXT == NULL && glad_glCopyTexImage2D != NULL) glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glad_glCopyTexImage2D;
+ if (glad_glCopyTexSubImage1D == NULL && glad_glCopyTexSubImage1DEXT != NULL) glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC)glad_glCopyTexSubImage1DEXT;
+ if (glad_glCopyTexSubImage1DEXT == NULL && glad_glCopyTexSubImage1D != NULL) glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glad_glCopyTexSubImage1D;
+ if (glad_glCopyTexSubImage2D == NULL && glad_glCopyTexSubImage2DEXT != NULL) glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)glad_glCopyTexSubImage2DEXT;
+ if (glad_glCopyTexSubImage2DEXT == NULL && glad_glCopyTexSubImage2D != NULL) glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glad_glCopyTexSubImage2D;
+ if (glad_glCopyTexSubImage3D == NULL && glad_glCopyTexSubImage3DEXT != NULL) glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glad_glCopyTexSubImage3DEXT;
+ if (glad_glCopyTexSubImage3DEXT == NULL && glad_glCopyTexSubImage3D != NULL) glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glad_glCopyTexSubImage3D;
+ if (glad_glCreateProgram == NULL && glad_glCreateProgramObjectARB != NULL) glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC)glad_glCreateProgramObjectARB;
+ if (glad_glCreateProgramObjectARB == NULL && glad_glCreateProgram != NULL) glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glad_glCreateProgram;
+ if (glad_glCreateShader == NULL && glad_glCreateShaderObjectARB != NULL) glad_glCreateShader = (PFNGLCREATESHADERPROC)glad_glCreateShaderObjectARB;
+ if (glad_glCreateShaderObjectARB == NULL && glad_glCreateShader != NULL) glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glad_glCreateShader;
+ if (glad_glDeleteBuffers == NULL && glad_glDeleteBuffersARB != NULL) glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glad_glDeleteBuffersARB;
+ if (glad_glDeleteBuffersARB == NULL && glad_glDeleteBuffers != NULL) glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glad_glDeleteBuffers;
+ if (glad_glDeleteFramebuffers == NULL && glad_glDeleteFramebuffersEXT != NULL) glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glad_glDeleteFramebuffersEXT;
+ if (glad_glDeleteFramebuffersEXT == NULL && glad_glDeleteFramebuffers != NULL) glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glad_glDeleteFramebuffers;
+ if (glad_glDeleteProgramsARB == NULL && glad_glDeleteProgramsNV != NULL) glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glad_glDeleteProgramsNV;
+ if (glad_glDeleteProgramsNV == NULL && glad_glDeleteProgramsARB != NULL) glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glad_glDeleteProgramsARB;
+ if (glad_glDeleteRenderbuffers == NULL && glad_glDeleteRenderbuffersEXT != NULL) glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glad_glDeleteRenderbuffersEXT;
+ if (glad_glDeleteRenderbuffersEXT == NULL && glad_glDeleteRenderbuffers != NULL) glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glad_glDeleteRenderbuffers;
+ if (glad_glDepthRangef == NULL && glad_glDepthRangefOES != NULL) glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC)glad_glDepthRangefOES;
+ if (glad_glDepthRangefOES == NULL && glad_glDepthRangef != NULL) glad_glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)glad_glDepthRangef;
+ if (glad_glDetachObjectARB == NULL && glad_glDetachShader != NULL) glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glad_glDetachShader;
+ if (glad_glDetachShader == NULL && glad_glDetachObjectARB != NULL) glad_glDetachShader = (PFNGLDETACHSHADERPROC)glad_glDetachObjectARB;
+ if (glad_glDisableVertexAttribArray == NULL && glad_glDisableVertexAttribArrayARB != NULL) glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glad_glDisableVertexAttribArrayARB;
+ if (glad_glDisableVertexAttribArrayARB == NULL && glad_glDisableVertexAttribArray != NULL) glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glad_glDisableVertexAttribArray;
+ if (glad_glDrawArrays == NULL && glad_glDrawArraysEXT != NULL) glad_glDrawArrays = (PFNGLDRAWARRAYSPROC)glad_glDrawArraysEXT;
+ if (glad_glDrawArraysEXT == NULL && glad_glDrawArrays != NULL) glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glad_glDrawArrays;
+ if (glad_glEnableVertexAttribArray == NULL && glad_glEnableVertexAttribArrayARB != NULL) glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glad_glEnableVertexAttribArrayARB;
+ if (glad_glEnableVertexAttribArrayARB == NULL && glad_glEnableVertexAttribArray != NULL) glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glad_glEnableVertexAttribArray;
+ if (glad_glFramebufferRenderbuffer == NULL && glad_glFramebufferRenderbufferEXT != NULL) glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glad_glFramebufferRenderbufferEXT;
+ if (glad_glFramebufferRenderbufferEXT == NULL && glad_glFramebufferRenderbuffer != NULL) glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glad_glFramebufferRenderbuffer;
+ if (glad_glFramebufferTexture == NULL && glad_glFramebufferTextureEXT != NULL) glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glad_glFramebufferTextureEXT;
+ if (glad_glFramebufferTexture == NULL && glad_glFramebufferTextureARB != NULL) glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glad_glFramebufferTextureARB;
+ if (glad_glFramebufferTexture1D == NULL && glad_glFramebufferTexture1DEXT != NULL) glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glad_glFramebufferTexture1DEXT;
+ if (glad_glFramebufferTexture1DEXT == NULL && glad_glFramebufferTexture1D != NULL) glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glad_glFramebufferTexture1D;
+ if (glad_glFramebufferTexture2D == NULL && glad_glFramebufferTexture2DEXT != NULL) glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glad_glFramebufferTexture2DEXT;
+ if (glad_glFramebufferTexture2DEXT == NULL && glad_glFramebufferTexture2D != NULL) glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glad_glFramebufferTexture2D;
+ if (glad_glFramebufferTexture3D == NULL && glad_glFramebufferTexture3DEXT != NULL) glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glad_glFramebufferTexture3DEXT;
+ if (glad_glFramebufferTexture3DEXT == NULL && glad_glFramebufferTexture3D != NULL) glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glad_glFramebufferTexture3D;
+ if (glad_glFramebufferTextureARB == NULL && glad_glFramebufferTextureEXT != NULL) glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glad_glFramebufferTextureEXT;
+ if (glad_glFramebufferTextureARB == NULL && glad_glFramebufferTexture != NULL) glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glad_glFramebufferTexture;
+ if (glad_glFramebufferTextureEXT == NULL && glad_glFramebufferTexture != NULL) glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glad_glFramebufferTexture;
+ if (glad_glFramebufferTextureEXT == NULL && glad_glFramebufferTextureARB != NULL) glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glad_glFramebufferTextureARB;
+ if (glad_glFramebufferTextureFaceARB == NULL && glad_glFramebufferTextureFaceEXT != NULL) glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glad_glFramebufferTextureFaceEXT;
+ if (glad_glFramebufferTextureFaceEXT == NULL && glad_glFramebufferTextureFaceARB != NULL) glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glad_glFramebufferTextureFaceARB;
+ if (glad_glFramebufferTextureLayer == NULL && glad_glFramebufferTextureLayerARB != NULL) glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glad_glFramebufferTextureLayerARB;
+ if (glad_glFramebufferTextureLayer == NULL && glad_glFramebufferTextureLayerEXT != NULL) glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glad_glFramebufferTextureLayerEXT;
+ if (glad_glFramebufferTextureLayerARB == NULL && glad_glFramebufferTextureLayerEXT != NULL) glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glad_glFramebufferTextureLayerEXT;
+ if (glad_glFramebufferTextureLayerARB == NULL && glad_glFramebufferTextureLayer != NULL) glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glad_glFramebufferTextureLayer;
+ if (glad_glFramebufferTextureLayerEXT == NULL && glad_glFramebufferTextureLayerARB != NULL) glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glad_glFramebufferTextureLayerARB;
+ if (glad_glFramebufferTextureLayerEXT == NULL && glad_glFramebufferTextureLayer != NULL) glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glad_glFramebufferTextureLayer;
+ if (glad_glGenBuffers == NULL && glad_glGenBuffersARB != NULL) glad_glGenBuffers = (PFNGLGENBUFFERSPROC)glad_glGenBuffersARB;
+ if (glad_glGenBuffersARB == NULL && glad_glGenBuffers != NULL) glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glad_glGenBuffers;
+ if (glad_glGenerateMipmap == NULL && glad_glGenerateMipmapEXT != NULL) glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glad_glGenerateMipmapEXT;
+ if (glad_glGenerateMipmapEXT == NULL && glad_glGenerateMipmap != NULL) glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glad_glGenerateMipmap;
+ if (glad_glGenFramebuffers == NULL && glad_glGenFramebuffersEXT != NULL) glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glad_glGenFramebuffersEXT;
+ if (glad_glGenFramebuffersEXT == NULL && glad_glGenFramebuffers != NULL) glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glad_glGenFramebuffers;
+ if (glad_glGenProgramsARB == NULL && glad_glGenProgramsNV != NULL) glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glad_glGenProgramsNV;
+ if (glad_glGenProgramsNV == NULL && glad_glGenProgramsARB != NULL) glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glad_glGenProgramsARB;
+ if (glad_glGenRenderbuffers == NULL && glad_glGenRenderbuffersEXT != NULL) glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glad_glGenRenderbuffersEXT;
+ if (glad_glGenRenderbuffersEXT == NULL && glad_glGenRenderbuffers != NULL) glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glad_glGenRenderbuffers;
+ if (glad_glGetActiveAttrib == NULL && glad_glGetActiveAttribARB != NULL) glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glad_glGetActiveAttribARB;
+ if (glad_glGetActiveAttribARB == NULL && glad_glGetActiveAttrib != NULL) glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glad_glGetActiveAttrib;
+ if (glad_glGetActiveUniform == NULL && glad_glGetActiveUniformARB != NULL) glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glad_glGetActiveUniformARB;
+ if (glad_glGetActiveUniformARB == NULL && glad_glGetActiveUniform != NULL) glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glad_glGetActiveUniform;
+ if (glad_glGetAttribLocation == NULL && glad_glGetAttribLocationARB != NULL) glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glad_glGetAttribLocationARB;
+ if (glad_glGetAttribLocationARB == NULL && glad_glGetAttribLocation != NULL) glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glad_glGetAttribLocation;
+ if (glad_glGetBufferParameteriv == NULL && glad_glGetBufferParameterivARB != NULL) glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glad_glGetBufferParameterivARB;
+ if (glad_glGetBufferParameterivARB == NULL && glad_glGetBufferParameteriv != NULL) glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glad_glGetBufferParameteriv;
+ if (glad_glGetBufferPointerv == NULL && glad_glGetBufferPointervARB != NULL) glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glad_glGetBufferPointervARB;
+ if (glad_glGetBufferPointervARB == NULL && glad_glGetBufferPointerv != NULL) glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glad_glGetBufferPointerv;
+ if (glad_glGetBufferSubData == NULL && glad_glGetBufferSubDataARB != NULL) glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glad_glGetBufferSubDataARB;
+ if (glad_glGetBufferSubDataARB == NULL && glad_glGetBufferSubData != NULL) glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glad_glGetBufferSubData;
+ if (glad_glGetFramebufferAttachmentParameteriv == NULL && glad_glGetFramebufferAttachmentParameterivEXT != NULL) glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glad_glGetFramebufferAttachmentParameterivEXT;
+ if (glad_glGetFramebufferAttachmentParameterivEXT == NULL && glad_glGetFramebufferAttachmentParameteriv != NULL) glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glad_glGetFramebufferAttachmentParameteriv;
+ if (glad_glGetPointerv == NULL && glad_glGetPointervEXT != NULL) glad_glGetPointerv = (PFNGLGETPOINTERVPROC)glad_glGetPointervEXT;
+ if (glad_glGetPointervEXT == NULL && glad_glGetPointerv != NULL) glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC)glad_glGetPointerv;
+ if (glad_glGetRenderbufferParameteriv == NULL && glad_glGetRenderbufferParameterivEXT != NULL) glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glad_glGetRenderbufferParameterivEXT;
+ if (glad_glGetRenderbufferParameterivEXT == NULL && glad_glGetRenderbufferParameteriv != NULL) glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glad_glGetRenderbufferParameteriv;
+ if (glad_glGetShaderSource == NULL && glad_glGetShaderSourceARB != NULL) glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glad_glGetShaderSourceARB;
+ if (glad_glGetShaderSourceARB == NULL && glad_glGetShaderSource != NULL) glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glad_glGetShaderSource;
+ if (glad_glGetUniformfv == NULL && glad_glGetUniformfvARB != NULL) glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glad_glGetUniformfvARB;
+ if (glad_glGetUniformfvARB == NULL && glad_glGetUniformfv != NULL) glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glad_glGetUniformfv;
+ if (glad_glGetUniformiv == NULL && glad_glGetUniformivARB != NULL) glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glad_glGetUniformivARB;
+ if (glad_glGetUniformivARB == NULL && glad_glGetUniformiv != NULL) glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glad_glGetUniformiv;
+ if (glad_glGetUniformLocation == NULL && glad_glGetUniformLocationARB != NULL) glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glad_glGetUniformLocationARB;
+ if (glad_glGetUniformLocationARB == NULL && glad_glGetUniformLocation != NULL) glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glad_glGetUniformLocation;
+ if (glad_glGetVertexAttribdv == NULL && glad_glGetVertexAttribdvARB != NULL) glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glad_glGetVertexAttribdvARB;
+ if (glad_glGetVertexAttribdv == NULL && glad_glGetVertexAttribdvNV != NULL) glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glad_glGetVertexAttribdvNV;
+ if (glad_glGetVertexAttribdvARB == NULL && glad_glGetVertexAttribdv != NULL) glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glad_glGetVertexAttribdv;
+ if (glad_glGetVertexAttribdvARB == NULL && glad_glGetVertexAttribdvNV != NULL) glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glad_glGetVertexAttribdvNV;
+ if (glad_glGetVertexAttribdvNV == NULL && glad_glGetVertexAttribdv != NULL) glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glad_glGetVertexAttribdv;
+ if (glad_glGetVertexAttribdvNV == NULL && glad_glGetVertexAttribdvARB != NULL) glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glad_glGetVertexAttribdvARB;
+ if (glad_glGetVertexAttribfv == NULL && glad_glGetVertexAttribfvARB != NULL) glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glad_glGetVertexAttribfvARB;
+ if (glad_glGetVertexAttribfv == NULL && glad_glGetVertexAttribfvNV != NULL) glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glad_glGetVertexAttribfvNV;
+ if (glad_glGetVertexAttribfvARB == NULL && glad_glGetVertexAttribfv != NULL) glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glad_glGetVertexAttribfv;
+ if (glad_glGetVertexAttribfvARB == NULL && glad_glGetVertexAttribfvNV != NULL) glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glad_glGetVertexAttribfvNV;
+ if (glad_glGetVertexAttribfvNV == NULL && glad_glGetVertexAttribfvARB != NULL) glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glad_glGetVertexAttribfvARB;
+ if (glad_glGetVertexAttribfvNV == NULL && glad_glGetVertexAttribfv != NULL) glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glad_glGetVertexAttribfv;
+ if (glad_glGetVertexAttribiv == NULL && glad_glGetVertexAttribivNV != NULL) glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glad_glGetVertexAttribivNV;
+ if (glad_glGetVertexAttribiv == NULL && glad_glGetVertexAttribivARB != NULL) glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glad_glGetVertexAttribivARB;
+ if (glad_glGetVertexAttribivARB == NULL && glad_glGetVertexAttribivNV != NULL) glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glad_glGetVertexAttribivNV;
+ if (glad_glGetVertexAttribivARB == NULL && glad_glGetVertexAttribiv != NULL) glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glad_glGetVertexAttribiv;
+ if (glad_glGetVertexAttribivNV == NULL && glad_glGetVertexAttribiv != NULL) glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glad_glGetVertexAttribiv;
+ if (glad_glGetVertexAttribivNV == NULL && glad_glGetVertexAttribivARB != NULL) glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glad_glGetVertexAttribivARB;
+ if (glad_glGetVertexAttribPointerv == NULL && glad_glGetVertexAttribPointervNV != NULL) glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glad_glGetVertexAttribPointervNV;
+ if (glad_glGetVertexAttribPointerv == NULL && glad_glGetVertexAttribPointervARB != NULL) glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glad_glGetVertexAttribPointervARB;
+ if (glad_glGetVertexAttribPointervARB == NULL && glad_glGetVertexAttribPointervNV != NULL) glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glad_glGetVertexAttribPointervNV;
+ if (glad_glGetVertexAttribPointervARB == NULL && glad_glGetVertexAttribPointerv != NULL) glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glad_glGetVertexAttribPointerv;
+ if (glad_glGetVertexAttribPointervNV == NULL && glad_glGetVertexAttribPointerv != NULL) glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glad_glGetVertexAttribPointerv;
+ if (glad_glGetVertexAttribPointervNV == NULL && glad_glGetVertexAttribPointervARB != NULL) glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glad_glGetVertexAttribPointervARB;
+ if (glad_glIsBuffer == NULL && glad_glIsBufferARB != NULL) glad_glIsBuffer = (PFNGLISBUFFERPROC)glad_glIsBufferARB;
+ if (glad_glIsBufferARB == NULL && glad_glIsBuffer != NULL) glad_glIsBufferARB = (PFNGLISBUFFERARBPROC)glad_glIsBuffer;
+ if (glad_glIsFramebuffer == NULL && glad_glIsFramebufferEXT != NULL) glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glad_glIsFramebufferEXT;
+ if (glad_glIsFramebufferEXT == NULL && glad_glIsFramebuffer != NULL) glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glad_glIsFramebuffer;
+ if (glad_glIsProgramARB == NULL && glad_glIsProgramNV != NULL) glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC)glad_glIsProgramNV;
+ if (glad_glIsProgramNV == NULL && glad_glIsProgramARB != NULL) glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC)glad_glIsProgramARB;
+ if (glad_glIsRenderbuffer == NULL && glad_glIsRenderbufferEXT != NULL) glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glad_glIsRenderbufferEXT;
+ if (glad_glIsRenderbufferEXT == NULL && glad_glIsRenderbuffer != NULL) glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glad_glIsRenderbuffer;
+ if (glad_glLinkProgram == NULL && glad_glLinkProgramARB != NULL) glad_glLinkProgram = (PFNGLLINKPROGRAMPROC)glad_glLinkProgramARB;
+ if (glad_glLinkProgramARB == NULL && glad_glLinkProgram != NULL) glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glad_glLinkProgram;
+ if (glad_glMapBuffer == NULL && glad_glMapBufferARB != NULL) glad_glMapBuffer = (PFNGLMAPBUFFERPROC)glad_glMapBufferARB;
+ if (glad_glMapBufferARB == NULL && glad_glMapBuffer != NULL) glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glad_glMapBuffer;
+ if (glad_glMultiTexCoord1d == NULL && glad_glMultiTexCoord1dARB != NULL) glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glad_glMultiTexCoord1dARB;
+ if (glad_glMultiTexCoord1dARB == NULL && glad_glMultiTexCoord1d != NULL) glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glad_glMultiTexCoord1d;
+ if (glad_glMultiTexCoord1dv == NULL && glad_glMultiTexCoord1dvARB != NULL) glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glad_glMultiTexCoord1dvARB;
+ if (glad_glMultiTexCoord1dvARB == NULL && glad_glMultiTexCoord1dv != NULL) glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glad_glMultiTexCoord1dv;
+ if (glad_glMultiTexCoord1f == NULL && glad_glMultiTexCoord1fARB != NULL) glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glad_glMultiTexCoord1fARB;
+ if (glad_glMultiTexCoord1fARB == NULL && glad_glMultiTexCoord1f != NULL) glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glad_glMultiTexCoord1f;
+ if (glad_glMultiTexCoord1fv == NULL && glad_glMultiTexCoord1fvARB != NULL) glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glad_glMultiTexCoord1fvARB;
+ if (glad_glMultiTexCoord1fvARB == NULL && glad_glMultiTexCoord1fv != NULL) glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glad_glMultiTexCoord1fv;
+ if (glad_glMultiTexCoord1i == NULL && glad_glMultiTexCoord1iARB != NULL) glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glad_glMultiTexCoord1iARB;
+ if (glad_glMultiTexCoord1iARB == NULL && glad_glMultiTexCoord1i != NULL) glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glad_glMultiTexCoord1i;
+ if (glad_glMultiTexCoord1iv == NULL && glad_glMultiTexCoord1ivARB != NULL) glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glad_glMultiTexCoord1ivARB;
+ if (glad_glMultiTexCoord1ivARB == NULL && glad_glMultiTexCoord1iv != NULL) glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glad_glMultiTexCoord1iv;
+ if (glad_glMultiTexCoord1s == NULL && glad_glMultiTexCoord1sARB != NULL) glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glad_glMultiTexCoord1sARB;
+ if (glad_glMultiTexCoord1sARB == NULL && glad_glMultiTexCoord1s != NULL) glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glad_glMultiTexCoord1s;
+ if (glad_glMultiTexCoord1sv == NULL && glad_glMultiTexCoord1svARB != NULL) glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glad_glMultiTexCoord1svARB;
+ if (glad_glMultiTexCoord1svARB == NULL && glad_glMultiTexCoord1sv != NULL) glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glad_glMultiTexCoord1sv;
+ if (glad_glMultiTexCoord2d == NULL && glad_glMultiTexCoord2dARB != NULL) glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glad_glMultiTexCoord2dARB;
+ if (glad_glMultiTexCoord2dARB == NULL && glad_glMultiTexCoord2d != NULL) glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glad_glMultiTexCoord2d;
+ if (glad_glMultiTexCoord2dv == NULL && glad_glMultiTexCoord2dvARB != NULL) glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glad_glMultiTexCoord2dvARB;
+ if (glad_glMultiTexCoord2dvARB == NULL && glad_glMultiTexCoord2dv != NULL) glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glad_glMultiTexCoord2dv;
+ if (glad_glMultiTexCoord2f == NULL && glad_glMultiTexCoord2fARB != NULL) glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glad_glMultiTexCoord2fARB;
+ if (glad_glMultiTexCoord2fARB == NULL && glad_glMultiTexCoord2f != NULL) glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glad_glMultiTexCoord2f;
+ if (glad_glMultiTexCoord2fv == NULL && glad_glMultiTexCoord2fvARB != NULL) glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glad_glMultiTexCoord2fvARB;
+ if (glad_glMultiTexCoord2fvARB == NULL && glad_glMultiTexCoord2fv != NULL) glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glad_glMultiTexCoord2fv;
+ if (glad_glMultiTexCoord2i == NULL && glad_glMultiTexCoord2iARB != NULL) glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glad_glMultiTexCoord2iARB;
+ if (glad_glMultiTexCoord2iARB == NULL && glad_glMultiTexCoord2i != NULL) glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glad_glMultiTexCoord2i;
+ if (glad_glMultiTexCoord2iv == NULL && glad_glMultiTexCoord2ivARB != NULL) glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glad_glMultiTexCoord2ivARB;
+ if (glad_glMultiTexCoord2ivARB == NULL && glad_glMultiTexCoord2iv != NULL) glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glad_glMultiTexCoord2iv;
+ if (glad_glMultiTexCoord2s == NULL && glad_glMultiTexCoord2sARB != NULL) glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glad_glMultiTexCoord2sARB;
+ if (glad_glMultiTexCoord2sARB == NULL && glad_glMultiTexCoord2s != NULL) glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glad_glMultiTexCoord2s;
+ if (glad_glMultiTexCoord2sv == NULL && glad_glMultiTexCoord2svARB != NULL) glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glad_glMultiTexCoord2svARB;
+ if (glad_glMultiTexCoord2svARB == NULL && glad_glMultiTexCoord2sv != NULL) glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glad_glMultiTexCoord2sv;
+ if (glad_glMultiTexCoord3d == NULL && glad_glMultiTexCoord3dARB != NULL) glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glad_glMultiTexCoord3dARB;
+ if (glad_glMultiTexCoord3dARB == NULL && glad_glMultiTexCoord3d != NULL) glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glad_glMultiTexCoord3d;
+ if (glad_glMultiTexCoord3dv == NULL && glad_glMultiTexCoord3dvARB != NULL) glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glad_glMultiTexCoord3dvARB;
+ if (glad_glMultiTexCoord3dvARB == NULL && glad_glMultiTexCoord3dv != NULL) glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glad_glMultiTexCoord3dv;
+ if (glad_glMultiTexCoord3f == NULL && glad_glMultiTexCoord3fARB != NULL) glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glad_glMultiTexCoord3fARB;
+ if (glad_glMultiTexCoord3fARB == NULL && glad_glMultiTexCoord3f != NULL) glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glad_glMultiTexCoord3f;
+ if (glad_glMultiTexCoord3fv == NULL && glad_glMultiTexCoord3fvARB != NULL) glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glad_glMultiTexCoord3fvARB;
+ if (glad_glMultiTexCoord3fvARB == NULL && glad_glMultiTexCoord3fv != NULL) glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glad_glMultiTexCoord3fv;
+ if (glad_glMultiTexCoord3i == NULL && glad_glMultiTexCoord3iARB != NULL) glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glad_glMultiTexCoord3iARB;
+ if (glad_glMultiTexCoord3iARB == NULL && glad_glMultiTexCoord3i != NULL) glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glad_glMultiTexCoord3i;
+ if (glad_glMultiTexCoord3iv == NULL && glad_glMultiTexCoord3ivARB != NULL) glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glad_glMultiTexCoord3ivARB;
+ if (glad_glMultiTexCoord3ivARB == NULL && glad_glMultiTexCoord3iv != NULL) glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glad_glMultiTexCoord3iv;
+ if (glad_glMultiTexCoord3s == NULL && glad_glMultiTexCoord3sARB != NULL) glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glad_glMultiTexCoord3sARB;
+ if (glad_glMultiTexCoord3sARB == NULL && glad_glMultiTexCoord3s != NULL) glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glad_glMultiTexCoord3s;
+ if (glad_glMultiTexCoord3sv == NULL && glad_glMultiTexCoord3svARB != NULL) glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glad_glMultiTexCoord3svARB;
+ if (glad_glMultiTexCoord3svARB == NULL && glad_glMultiTexCoord3sv != NULL) glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glad_glMultiTexCoord3sv;
+ if (glad_glMultiTexCoord4d == NULL && glad_glMultiTexCoord4dARB != NULL) glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glad_glMultiTexCoord4dARB;
+ if (glad_glMultiTexCoord4dARB == NULL && glad_glMultiTexCoord4d != NULL) glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glad_glMultiTexCoord4d;
+ if (glad_glMultiTexCoord4dv == NULL && glad_glMultiTexCoord4dvARB != NULL) glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glad_glMultiTexCoord4dvARB;
+ if (glad_glMultiTexCoord4dvARB == NULL && glad_glMultiTexCoord4dv != NULL) glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glad_glMultiTexCoord4dv;
+ if (glad_glMultiTexCoord4f == NULL && glad_glMultiTexCoord4fARB != NULL) glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glad_glMultiTexCoord4fARB;
+ if (glad_glMultiTexCoord4fARB == NULL && glad_glMultiTexCoord4f != NULL) glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glad_glMultiTexCoord4f;
+ if (glad_glMultiTexCoord4fv == NULL && glad_glMultiTexCoord4fvARB != NULL) glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glad_glMultiTexCoord4fvARB;
+ if (glad_glMultiTexCoord4fvARB == NULL && glad_glMultiTexCoord4fv != NULL) glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glad_glMultiTexCoord4fv;
+ if (glad_glMultiTexCoord4i == NULL && glad_glMultiTexCoord4iARB != NULL) glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glad_glMultiTexCoord4iARB;
+ if (glad_glMultiTexCoord4iARB == NULL && glad_glMultiTexCoord4i != NULL) glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glad_glMultiTexCoord4i;
+ if (glad_glMultiTexCoord4iv == NULL && glad_glMultiTexCoord4ivARB != NULL) glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glad_glMultiTexCoord4ivARB;
+ if (glad_glMultiTexCoord4ivARB == NULL && glad_glMultiTexCoord4iv != NULL) glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glad_glMultiTexCoord4iv;
+ if (glad_glMultiTexCoord4s == NULL && glad_glMultiTexCoord4sARB != NULL) glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glad_glMultiTexCoord4sARB;
+ if (glad_glMultiTexCoord4sARB == NULL && glad_glMultiTexCoord4s != NULL) glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glad_glMultiTexCoord4s;
+ if (glad_glMultiTexCoord4sv == NULL && glad_glMultiTexCoord4svARB != NULL) glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glad_glMultiTexCoord4svARB;
+ if (glad_glMultiTexCoord4svARB == NULL && glad_glMultiTexCoord4sv != NULL) glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glad_glMultiTexCoord4sv;
+ if (glad_glPrioritizeTextures == NULL && glad_glPrioritizeTexturesEXT != NULL) glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC)glad_glPrioritizeTexturesEXT;
+ if (glad_glPrioritizeTexturesEXT == NULL && glad_glPrioritizeTextures != NULL) glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glad_glPrioritizeTextures;
+ if (glad_glProgramParameteri == NULL && glad_glProgramParameteriARB != NULL) glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glad_glProgramParameteriARB;
+ if (glad_glProgramParameteri == NULL && glad_glProgramParameteriEXT != NULL) glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glad_glProgramParameteriEXT;
+ if (glad_glProgramParameteriARB == NULL && glad_glProgramParameteri != NULL) glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glad_glProgramParameteri;
+ if (glad_glProgramParameteriARB == NULL && glad_glProgramParameteriEXT != NULL) glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glad_glProgramParameteriEXT;
+ if (glad_glProgramParameteriEXT == NULL && glad_glProgramParameteriARB != NULL) glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glad_glProgramParameteriARB;
+ if (glad_glProgramParameteriEXT == NULL && glad_glProgramParameteri != NULL) glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glad_glProgramParameteri;
+ if (glad_glRenderbufferStorage == NULL && glad_glRenderbufferStorageEXT != NULL) glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glad_glRenderbufferStorageEXT;
+ if (glad_glRenderbufferStorageEXT == NULL && glad_glRenderbufferStorage != NULL) glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glad_glRenderbufferStorage;
+ if (glad_glRenderbufferStorageMultisample == NULL && glad_glRenderbufferStorageMultisampleEXT != NULL) glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glad_glRenderbufferStorageMultisampleEXT;
+ if (glad_glRenderbufferStorageMultisampleEXT == NULL && glad_glRenderbufferStorageMultisample != NULL) glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glad_glRenderbufferStorageMultisample;
+ if (glad_glShaderSource == NULL && glad_glShaderSourceARB != NULL) glad_glShaderSource = (PFNGLSHADERSOURCEPROC)glad_glShaderSourceARB;
+ if (glad_glShaderSourceARB == NULL && glad_glShaderSource != NULL) glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glad_glShaderSource;
+ if (glad_glTexSubImage1D == NULL && glad_glTexSubImage1DEXT != NULL) glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)glad_glTexSubImage1DEXT;
+ if (glad_glTexSubImage1DEXT == NULL && glad_glTexSubImage1D != NULL) glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glad_glTexSubImage1D;
+ if (glad_glTexSubImage2D == NULL && glad_glTexSubImage2DEXT != NULL) glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)glad_glTexSubImage2DEXT;
+ if (glad_glTexSubImage2DEXT == NULL && glad_glTexSubImage2D != NULL) glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glad_glTexSubImage2D;
+ if (glad_glUniform1f == NULL && glad_glUniform1fARB != NULL) glad_glUniform1f = (PFNGLUNIFORM1FPROC)glad_glUniform1fARB;
+ if (glad_glUniform1fARB == NULL && glad_glUniform1f != NULL) glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glad_glUniform1f;
+ if (glad_glUniform1fv == NULL && glad_glUniform1fvARB != NULL) glad_glUniform1fv = (PFNGLUNIFORM1FVPROC)glad_glUniform1fvARB;
+ if (glad_glUniform1fvARB == NULL && glad_glUniform1fv != NULL) glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glad_glUniform1fv;
+ if (glad_glUniform1i == NULL && glad_glUniform1iARB != NULL) glad_glUniform1i = (PFNGLUNIFORM1IPROC)glad_glUniform1iARB;
+ if (glad_glUniform1iARB == NULL && glad_glUniform1i != NULL) glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glad_glUniform1i;
+ if (glad_glUniform1iv == NULL && glad_glUniform1ivARB != NULL) glad_glUniform1iv = (PFNGLUNIFORM1IVPROC)glad_glUniform1ivARB;
+ if (glad_glUniform1ivARB == NULL && glad_glUniform1iv != NULL) glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glad_glUniform1iv;
+ if (glad_glUniform2f == NULL && glad_glUniform2fARB != NULL) glad_glUniform2f = (PFNGLUNIFORM2FPROC)glad_glUniform2fARB;
+ if (glad_glUniform2fARB == NULL && glad_glUniform2f != NULL) glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glad_glUniform2f;
+ if (glad_glUniform2fv == NULL && glad_glUniform2fvARB != NULL) glad_glUniform2fv = (PFNGLUNIFORM2FVPROC)glad_glUniform2fvARB;
+ if (glad_glUniform2fvARB == NULL && glad_glUniform2fv != NULL) glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glad_glUniform2fv;
+ if (glad_glUniform2i == NULL && glad_glUniform2iARB != NULL) glad_glUniform2i = (PFNGLUNIFORM2IPROC)glad_glUniform2iARB;
+ if (glad_glUniform2iARB == NULL && glad_glUniform2i != NULL) glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glad_glUniform2i;
+ if (glad_glUniform2iv == NULL && glad_glUniform2ivARB != NULL) glad_glUniform2iv = (PFNGLUNIFORM2IVPROC)glad_glUniform2ivARB;
+ if (glad_glUniform2ivARB == NULL && glad_glUniform2iv != NULL) glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glad_glUniform2iv;
+ if (glad_glUniform3f == NULL && glad_glUniform3fARB != NULL) glad_glUniform3f = (PFNGLUNIFORM3FPROC)glad_glUniform3fARB;
+ if (glad_glUniform3fARB == NULL && glad_glUniform3f != NULL) glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glad_glUniform3f;
+ if (glad_glUniform3fv == NULL && glad_glUniform3fvARB != NULL) glad_glUniform3fv = (PFNGLUNIFORM3FVPROC)glad_glUniform3fvARB;
+ if (glad_glUniform3fvARB == NULL && glad_glUniform3fv != NULL) glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glad_glUniform3fv;
+ if (glad_glUniform3i == NULL && glad_glUniform3iARB != NULL) glad_glUniform3i = (PFNGLUNIFORM3IPROC)glad_glUniform3iARB;
+ if (glad_glUniform3iARB == NULL && glad_glUniform3i != NULL) glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glad_glUniform3i;
+ if (glad_glUniform3iv == NULL && glad_glUniform3ivARB != NULL) glad_glUniform3iv = (PFNGLUNIFORM3IVPROC)glad_glUniform3ivARB;
+ if (glad_glUniform3ivARB == NULL && glad_glUniform3iv != NULL) glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glad_glUniform3iv;
+ if (glad_glUniform4f == NULL && glad_glUniform4fARB != NULL) glad_glUniform4f = (PFNGLUNIFORM4FPROC)glad_glUniform4fARB;
+ if (glad_glUniform4fARB == NULL && glad_glUniform4f != NULL) glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glad_glUniform4f;
+ if (glad_glUniform4fv == NULL && glad_glUniform4fvARB != NULL) glad_glUniform4fv = (PFNGLUNIFORM4FVPROC)glad_glUniform4fvARB;
+ if (glad_glUniform4fvARB == NULL && glad_glUniform4fv != NULL) glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glad_glUniform4fv;
+ if (glad_glUniform4i == NULL && glad_glUniform4iARB != NULL) glad_glUniform4i = (PFNGLUNIFORM4IPROC)glad_glUniform4iARB;
+ if (glad_glUniform4iARB == NULL && glad_glUniform4i != NULL) glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glad_glUniform4i;
+ if (glad_glUniform4iv == NULL && glad_glUniform4ivARB != NULL) glad_glUniform4iv = (PFNGLUNIFORM4IVPROC)glad_glUniform4ivARB;
+ if (glad_glUniform4ivARB == NULL && glad_glUniform4iv != NULL) glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glad_glUniform4iv;
+ if (glad_glUniformMatrix2fv == NULL && glad_glUniformMatrix2fvARB != NULL) glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glad_glUniformMatrix2fvARB;
+ if (glad_glUniformMatrix2fvARB == NULL && glad_glUniformMatrix2fv != NULL) glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glad_glUniformMatrix2fv;
+ if (glad_glUniformMatrix3fv == NULL && glad_glUniformMatrix3fvARB != NULL) glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glad_glUniformMatrix3fvARB;
+ if (glad_glUniformMatrix3fvARB == NULL && glad_glUniformMatrix3fv != NULL) glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glad_glUniformMatrix3fv;
+ if (glad_glUniformMatrix4fv == NULL && glad_glUniformMatrix4fvARB != NULL) glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glad_glUniformMatrix4fvARB;
+ if (glad_glUniformMatrix4fvARB == NULL && glad_glUniformMatrix4fv != NULL) glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glad_glUniformMatrix4fv;
+ if (glad_glUnmapBuffer == NULL && glad_glUnmapBufferARB != NULL) glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glad_glUnmapBufferARB;
+ if (glad_glUnmapBufferARB == NULL && glad_glUnmapBuffer != NULL) glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glad_glUnmapBuffer;
+ if (glad_glUseProgram == NULL && glad_glUseProgramObjectARB != NULL) glad_glUseProgram = (PFNGLUSEPROGRAMPROC)glad_glUseProgramObjectARB;
+ if (glad_glUseProgramObjectARB == NULL && glad_glUseProgram != NULL) glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glad_glUseProgram;
+ if (glad_glValidateProgram == NULL && glad_glValidateProgramARB != NULL) glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glad_glValidateProgramARB;
+ if (glad_glValidateProgramARB == NULL && glad_glValidateProgram != NULL) glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glad_glValidateProgram;
+ if (glad_glVertexAttrib1d == NULL && glad_glVertexAttrib1dNV != NULL) glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glad_glVertexAttrib1dNV;
+ if (glad_glVertexAttrib1d == NULL && glad_glVertexAttrib1dARB != NULL) glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glad_glVertexAttrib1dARB;
+ if (glad_glVertexAttrib1dARB == NULL && glad_glVertexAttrib1dNV != NULL) glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glad_glVertexAttrib1dNV;
+ if (glad_glVertexAttrib1dARB == NULL && glad_glVertexAttrib1d != NULL) glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glad_glVertexAttrib1d;
+ if (glad_glVertexAttrib1dNV == NULL && glad_glVertexAttrib1d != NULL) glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glad_glVertexAttrib1d;
+ if (glad_glVertexAttrib1dNV == NULL && glad_glVertexAttrib1dARB != NULL) glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glad_glVertexAttrib1dARB;
+ if (glad_glVertexAttrib1dv == NULL && glad_glVertexAttrib1dvARB != NULL) glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glad_glVertexAttrib1dvARB;
+ if (glad_glVertexAttrib1dv == NULL && glad_glVertexAttrib1dvNV != NULL) glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glad_glVertexAttrib1dvNV;
+ if (glad_glVertexAttrib1dvARB == NULL && glad_glVertexAttrib1dvNV != NULL) glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glad_glVertexAttrib1dvNV;
+ if (glad_glVertexAttrib1dvARB == NULL && glad_glVertexAttrib1dv != NULL) glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glad_glVertexAttrib1dv;
+ if (glad_glVertexAttrib1dvNV == NULL && glad_glVertexAttrib1dvARB != NULL) glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glad_glVertexAttrib1dvARB;
+ if (glad_glVertexAttrib1dvNV == NULL && glad_glVertexAttrib1dv != NULL) glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glad_glVertexAttrib1dv;
+ if (glad_glVertexAttrib1f == NULL && glad_glVertexAttrib1fNV != NULL) glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glad_glVertexAttrib1fNV;
+ if (glad_glVertexAttrib1f == NULL && glad_glVertexAttrib1fARB != NULL) glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glad_glVertexAttrib1fARB;
+ if (glad_glVertexAttrib1fARB == NULL && glad_glVertexAttrib1fNV != NULL) glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glad_glVertexAttrib1fNV;
+ if (glad_glVertexAttrib1fARB == NULL && glad_glVertexAttrib1f != NULL) glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glad_glVertexAttrib1f;
+ if (glad_glVertexAttrib1fNV == NULL && glad_glVertexAttrib1fARB != NULL) glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glad_glVertexAttrib1fARB;
+ if (glad_glVertexAttrib1fNV == NULL && glad_glVertexAttrib1f != NULL) glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glad_glVertexAttrib1f;
+ if (glad_glVertexAttrib1fv == NULL && glad_glVertexAttrib1fvARB != NULL) glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glad_glVertexAttrib1fvARB;
+ if (glad_glVertexAttrib1fv == NULL && glad_glVertexAttrib1fvNV != NULL) glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glad_glVertexAttrib1fvNV;
+ if (glad_glVertexAttrib1fvARB == NULL && glad_glVertexAttrib1fvNV != NULL) glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glad_glVertexAttrib1fvNV;
+ if (glad_glVertexAttrib1fvARB == NULL && glad_glVertexAttrib1fv != NULL) glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glad_glVertexAttrib1fv;
+ if (glad_glVertexAttrib1fvNV == NULL && glad_glVertexAttrib1fvARB != NULL) glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glad_glVertexAttrib1fvARB;
+ if (glad_glVertexAttrib1fvNV == NULL && glad_glVertexAttrib1fv != NULL) glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glad_glVertexAttrib1fv;
+ if (glad_glVertexAttrib1s == NULL && glad_glVertexAttrib1sNV != NULL) glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glad_glVertexAttrib1sNV;
+ if (glad_glVertexAttrib1s == NULL && glad_glVertexAttrib1sARB != NULL) glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glad_glVertexAttrib1sARB;
+ if (glad_glVertexAttrib1sARB == NULL && glad_glVertexAttrib1sNV != NULL) glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glad_glVertexAttrib1sNV;
+ if (glad_glVertexAttrib1sARB == NULL && glad_glVertexAttrib1s != NULL) glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glad_glVertexAttrib1s;
+ if (glad_glVertexAttrib1sNV == NULL && glad_glVertexAttrib1s != NULL) glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glad_glVertexAttrib1s;
+ if (glad_glVertexAttrib1sNV == NULL && glad_glVertexAttrib1sARB != NULL) glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glad_glVertexAttrib1sARB;
+ if (glad_glVertexAttrib1sv == NULL && glad_glVertexAttrib1svNV != NULL) glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glad_glVertexAttrib1svNV;
+ if (glad_glVertexAttrib1sv == NULL && glad_glVertexAttrib1svARB != NULL) glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glad_glVertexAttrib1svARB;
+ if (glad_glVertexAttrib1svARB == NULL && glad_glVertexAttrib1svNV != NULL) glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glad_glVertexAttrib1svNV;
+ if (glad_glVertexAttrib1svARB == NULL && glad_glVertexAttrib1sv != NULL) glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glad_glVertexAttrib1sv;
+ if (glad_glVertexAttrib1svNV == NULL && glad_glVertexAttrib1svARB != NULL) glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glad_glVertexAttrib1svARB;
+ if (glad_glVertexAttrib1svNV == NULL && glad_glVertexAttrib1sv != NULL) glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glad_glVertexAttrib1sv;
+ if (glad_glVertexAttrib2d == NULL && glad_glVertexAttrib2dARB != NULL) glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glad_glVertexAttrib2dARB;
+ if (glad_glVertexAttrib2d == NULL && glad_glVertexAttrib2dNV != NULL) glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glad_glVertexAttrib2dNV;
+ if (glad_glVertexAttrib2dARB == NULL && glad_glVertexAttrib2d != NULL) glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glad_glVertexAttrib2d;
+ if (glad_glVertexAttrib2dARB == NULL && glad_glVertexAttrib2dNV != NULL) glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glad_glVertexAttrib2dNV;
+ if (glad_glVertexAttrib2dNV == NULL && glad_glVertexAttrib2dARB != NULL) glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glad_glVertexAttrib2dARB;
+ if (glad_glVertexAttrib2dNV == NULL && glad_glVertexAttrib2d != NULL) glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glad_glVertexAttrib2d;
+ if (glad_glVertexAttrib2dv == NULL && glad_glVertexAttrib2dvARB != NULL) glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glad_glVertexAttrib2dvARB;
+ if (glad_glVertexAttrib2dv == NULL && glad_glVertexAttrib2dvNV != NULL) glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glad_glVertexAttrib2dvNV;
+ if (glad_glVertexAttrib2dvARB == NULL && glad_glVertexAttrib2dv != NULL) glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glad_glVertexAttrib2dv;
+ if (glad_glVertexAttrib2dvARB == NULL && glad_glVertexAttrib2dvNV != NULL) glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glad_glVertexAttrib2dvNV;
+ if (glad_glVertexAttrib2dvNV == NULL && glad_glVertexAttrib2dv != NULL) glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glad_glVertexAttrib2dv;
+ if (glad_glVertexAttrib2dvNV == NULL && glad_glVertexAttrib2dvARB != NULL) glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glad_glVertexAttrib2dvARB;
+ if (glad_glVertexAttrib2f == NULL && glad_glVertexAttrib2fARB != NULL) glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glad_glVertexAttrib2fARB;
+ if (glad_glVertexAttrib2f == NULL && glad_glVertexAttrib2fNV != NULL) glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glad_glVertexAttrib2fNV;
+ if (glad_glVertexAttrib2fARB == NULL && glad_glVertexAttrib2fNV != NULL) glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glad_glVertexAttrib2fNV;
+ if (glad_glVertexAttrib2fARB == NULL && glad_glVertexAttrib2f != NULL) glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glad_glVertexAttrib2f;
+ if (glad_glVertexAttrib2fNV == NULL && glad_glVertexAttrib2fARB != NULL) glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glad_glVertexAttrib2fARB;
+ if (glad_glVertexAttrib2fNV == NULL && glad_glVertexAttrib2f != NULL) glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glad_glVertexAttrib2f;
+ if (glad_glVertexAttrib2fv == NULL && glad_glVertexAttrib2fvNV != NULL) glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glad_glVertexAttrib2fvNV;
+ if (glad_glVertexAttrib2fv == NULL && glad_glVertexAttrib2fvARB != NULL) glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glad_glVertexAttrib2fvARB;
+ if (glad_glVertexAttrib2fvARB == NULL && glad_glVertexAttrib2fvNV != NULL) glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glad_glVertexAttrib2fvNV;
+ if (glad_glVertexAttrib2fvARB == NULL && glad_glVertexAttrib2fv != NULL) glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glad_glVertexAttrib2fv;
+ if (glad_glVertexAttrib2fvNV == NULL && glad_glVertexAttrib2fvARB != NULL) glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glad_glVertexAttrib2fvARB;
+ if (glad_glVertexAttrib2fvNV == NULL && glad_glVertexAttrib2fv != NULL) glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glad_glVertexAttrib2fv;
+ if (glad_glVertexAttrib2s == NULL && glad_glVertexAttrib2sARB != NULL) glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glad_glVertexAttrib2sARB;
+ if (glad_glVertexAttrib2s == NULL && glad_glVertexAttrib2sNV != NULL) glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glad_glVertexAttrib2sNV;
+ if (glad_glVertexAttrib2sARB == NULL && glad_glVertexAttrib2s != NULL) glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glad_glVertexAttrib2s;
+ if (glad_glVertexAttrib2sARB == NULL && glad_glVertexAttrib2sNV != NULL) glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glad_glVertexAttrib2sNV;
+ if (glad_glVertexAttrib2sNV == NULL && glad_glVertexAttrib2sARB != NULL) glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glad_glVertexAttrib2sARB;
+ if (glad_glVertexAttrib2sNV == NULL && glad_glVertexAttrib2s != NULL) glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glad_glVertexAttrib2s;
+ if (glad_glVertexAttrib2sv == NULL && glad_glVertexAttrib2svARB != NULL) glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glad_glVertexAttrib2svARB;
+ if (glad_glVertexAttrib2sv == NULL && glad_glVertexAttrib2svNV != NULL) glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glad_glVertexAttrib2svNV;
+ if (glad_glVertexAttrib2svARB == NULL && glad_glVertexAttrib2sv != NULL) glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glad_glVertexAttrib2sv;
+ if (glad_glVertexAttrib2svARB == NULL && glad_glVertexAttrib2svNV != NULL) glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glad_glVertexAttrib2svNV;
+ if (glad_glVertexAttrib2svNV == NULL && glad_glVertexAttrib2sv != NULL) glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glad_glVertexAttrib2sv;
+ if (glad_glVertexAttrib2svNV == NULL && glad_glVertexAttrib2svARB != NULL) glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glad_glVertexAttrib2svARB;
+ if (glad_glVertexAttrib3d == NULL && glad_glVertexAttrib3dARB != NULL) glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glad_glVertexAttrib3dARB;
+ if (glad_glVertexAttrib3d == NULL && glad_glVertexAttrib3dNV != NULL) glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glad_glVertexAttrib3dNV;
+ if (glad_glVertexAttrib3dARB == NULL && glad_glVertexAttrib3d != NULL) glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glad_glVertexAttrib3d;
+ if (glad_glVertexAttrib3dARB == NULL && glad_glVertexAttrib3dNV != NULL) glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glad_glVertexAttrib3dNV;
+ if (glad_glVertexAttrib3dNV == NULL && glad_glVertexAttrib3dARB != NULL) glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glad_glVertexAttrib3dARB;
+ if (glad_glVertexAttrib3dNV == NULL && glad_glVertexAttrib3d != NULL) glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glad_glVertexAttrib3d;
+ if (glad_glVertexAttrib3dv == NULL && glad_glVertexAttrib3dvARB != NULL) glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glad_glVertexAttrib3dvARB;
+ if (glad_glVertexAttrib3dv == NULL && glad_glVertexAttrib3dvNV != NULL) glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glad_glVertexAttrib3dvNV;
+ if (glad_glVertexAttrib3dvARB == NULL && glad_glVertexAttrib3dv != NULL) glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glad_glVertexAttrib3dv;
+ if (glad_glVertexAttrib3dvARB == NULL && glad_glVertexAttrib3dvNV != NULL) glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glad_glVertexAttrib3dvNV;
+ if (glad_glVertexAttrib3dvNV == NULL && glad_glVertexAttrib3dv != NULL) glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glad_glVertexAttrib3dv;
+ if (glad_glVertexAttrib3dvNV == NULL && glad_glVertexAttrib3dvARB != NULL) glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glad_glVertexAttrib3dvARB;
+ if (glad_glVertexAttrib3f == NULL && glad_glVertexAttrib3fARB != NULL) glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glad_glVertexAttrib3fARB;
+ if (glad_glVertexAttrib3f == NULL && glad_glVertexAttrib3fNV != NULL) glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glad_glVertexAttrib3fNV;
+ if (glad_glVertexAttrib3fARB == NULL && glad_glVertexAttrib3f != NULL) glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glad_glVertexAttrib3f;
+ if (glad_glVertexAttrib3fARB == NULL && glad_glVertexAttrib3fNV != NULL) glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glad_glVertexAttrib3fNV;
+ if (glad_glVertexAttrib3fNV == NULL && glad_glVertexAttrib3f != NULL) glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glad_glVertexAttrib3f;
+ if (glad_glVertexAttrib3fNV == NULL && glad_glVertexAttrib3fARB != NULL) glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glad_glVertexAttrib3fARB;
+ if (glad_glVertexAttrib3fv == NULL && glad_glVertexAttrib3fvNV != NULL) glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glad_glVertexAttrib3fvNV;
+ if (glad_glVertexAttrib3fv == NULL && glad_glVertexAttrib3fvARB != NULL) glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glad_glVertexAttrib3fvARB;
+ if (glad_glVertexAttrib3fvARB == NULL && glad_glVertexAttrib3fvNV != NULL) glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glad_glVertexAttrib3fvNV;
+ if (glad_glVertexAttrib3fvARB == NULL && glad_glVertexAttrib3fv != NULL) glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glad_glVertexAttrib3fv;
+ if (glad_glVertexAttrib3fvNV == NULL && glad_glVertexAttrib3fv != NULL) glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glad_glVertexAttrib3fv;
+ if (glad_glVertexAttrib3fvNV == NULL && glad_glVertexAttrib3fvARB != NULL) glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glad_glVertexAttrib3fvARB;
+ if (glad_glVertexAttrib3s == NULL && glad_glVertexAttrib3sARB != NULL) glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glad_glVertexAttrib3sARB;
+ if (glad_glVertexAttrib3s == NULL && glad_glVertexAttrib3sNV != NULL) glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glad_glVertexAttrib3sNV;
+ if (glad_glVertexAttrib3sARB == NULL && glad_glVertexAttrib3s != NULL) glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glad_glVertexAttrib3s;
+ if (glad_glVertexAttrib3sARB == NULL && glad_glVertexAttrib3sNV != NULL) glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glad_glVertexAttrib3sNV;
+ if (glad_glVertexAttrib3sNV == NULL && glad_glVertexAttrib3sARB != NULL) glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glad_glVertexAttrib3sARB;
+ if (glad_glVertexAttrib3sNV == NULL && glad_glVertexAttrib3s != NULL) glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glad_glVertexAttrib3s;
+ if (glad_glVertexAttrib3sv == NULL && glad_glVertexAttrib3svARB != NULL) glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glad_glVertexAttrib3svARB;
+ if (glad_glVertexAttrib3sv == NULL && glad_glVertexAttrib3svNV != NULL) glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glad_glVertexAttrib3svNV;
+ if (glad_glVertexAttrib3svARB == NULL && glad_glVertexAttrib3sv != NULL) glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glad_glVertexAttrib3sv;
+ if (glad_glVertexAttrib3svARB == NULL && glad_glVertexAttrib3svNV != NULL) glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glad_glVertexAttrib3svNV;
+ if (glad_glVertexAttrib3svNV == NULL && glad_glVertexAttrib3sv != NULL) glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glad_glVertexAttrib3sv;
+ if (glad_glVertexAttrib3svNV == NULL && glad_glVertexAttrib3svARB != NULL) glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glad_glVertexAttrib3svARB;
+ if (glad_glVertexAttrib4bv == NULL && glad_glVertexAttrib4bvARB != NULL) glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glad_glVertexAttrib4bvARB;
+ if (glad_glVertexAttrib4bvARB == NULL && glad_glVertexAttrib4bv != NULL) glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glad_glVertexAttrib4bv;
+ if (glad_glVertexAttrib4d == NULL && glad_glVertexAttrib4dNV != NULL) glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glad_glVertexAttrib4dNV;
+ if (glad_glVertexAttrib4d == NULL && glad_glVertexAttrib4dARB != NULL) glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glad_glVertexAttrib4dARB;
+ if (glad_glVertexAttrib4dARB == NULL && glad_glVertexAttrib4dNV != NULL) glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glad_glVertexAttrib4dNV;
+ if (glad_glVertexAttrib4dARB == NULL && glad_glVertexAttrib4d != NULL) glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glad_glVertexAttrib4d;
+ if (glad_glVertexAttrib4dNV == NULL && glad_glVertexAttrib4d != NULL) glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glad_glVertexAttrib4d;
+ if (glad_glVertexAttrib4dNV == NULL && glad_glVertexAttrib4dARB != NULL) glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glad_glVertexAttrib4dARB;
+ if (glad_glVertexAttrib4dv == NULL && glad_glVertexAttrib4dvNV != NULL) glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glad_glVertexAttrib4dvNV;
+ if (glad_glVertexAttrib4dv == NULL && glad_glVertexAttrib4dvARB != NULL) glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glad_glVertexAttrib4dvARB;
+ if (glad_glVertexAttrib4dvARB == NULL && glad_glVertexAttrib4dvNV != NULL) glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glad_glVertexAttrib4dvNV;
+ if (glad_glVertexAttrib4dvARB == NULL && glad_glVertexAttrib4dv != NULL) glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glad_glVertexAttrib4dv;
+ if (glad_glVertexAttrib4dvNV == NULL && glad_glVertexAttrib4dvARB != NULL) glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glad_glVertexAttrib4dvARB;
+ if (glad_glVertexAttrib4dvNV == NULL && glad_glVertexAttrib4dv != NULL) glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glad_glVertexAttrib4dv;
+ if (glad_glVertexAttrib4f == NULL && glad_glVertexAttrib4fNV != NULL) glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glad_glVertexAttrib4fNV;
+ if (glad_glVertexAttrib4f == NULL && glad_glVertexAttrib4fARB != NULL) glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glad_glVertexAttrib4fARB;
+ if (glad_glVertexAttrib4fARB == NULL && glad_glVertexAttrib4f != NULL) glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glad_glVertexAttrib4f;
+ if (glad_glVertexAttrib4fARB == NULL && glad_glVertexAttrib4fNV != NULL) glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glad_glVertexAttrib4fNV;
+ if (glad_glVertexAttrib4fNV == NULL && glad_glVertexAttrib4f != NULL) glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glad_glVertexAttrib4f;
+ if (glad_glVertexAttrib4fNV == NULL && glad_glVertexAttrib4fARB != NULL) glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glad_glVertexAttrib4fARB;
+ if (glad_glVertexAttrib4fv == NULL && glad_glVertexAttrib4fvARB != NULL) glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glad_glVertexAttrib4fvARB;
+ if (glad_glVertexAttrib4fv == NULL && glad_glVertexAttrib4fvNV != NULL) glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glad_glVertexAttrib4fvNV;
+ if (glad_glVertexAttrib4fvARB == NULL && glad_glVertexAttrib4fv != NULL) glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glad_glVertexAttrib4fv;
+ if (glad_glVertexAttrib4fvARB == NULL && glad_glVertexAttrib4fvNV != NULL) glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glad_glVertexAttrib4fvNV;
+ if (glad_glVertexAttrib4fvNV == NULL && glad_glVertexAttrib4fv != NULL) glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glad_glVertexAttrib4fv;
+ if (glad_glVertexAttrib4fvNV == NULL && glad_glVertexAttrib4fvARB != NULL) glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glad_glVertexAttrib4fvARB;
+ if (glad_glVertexAttrib4iv == NULL && glad_glVertexAttrib4ivARB != NULL) glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glad_glVertexAttrib4ivARB;
+ if (glad_glVertexAttrib4ivARB == NULL && glad_glVertexAttrib4iv != NULL) glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glad_glVertexAttrib4iv;
+ if (glad_glVertexAttrib4Nbv == NULL && glad_glVertexAttrib4NbvARB != NULL) glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glad_glVertexAttrib4NbvARB;
+ if (glad_glVertexAttrib4NbvARB == NULL && glad_glVertexAttrib4Nbv != NULL) glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glad_glVertexAttrib4Nbv;
+ if (glad_glVertexAttrib4Niv == NULL && glad_glVertexAttrib4NivARB != NULL) glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glad_glVertexAttrib4NivARB;
+ if (glad_glVertexAttrib4NivARB == NULL && glad_glVertexAttrib4Niv != NULL) glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glad_glVertexAttrib4Niv;
+ if (glad_glVertexAttrib4Nsv == NULL && glad_glVertexAttrib4NsvARB != NULL) glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glad_glVertexAttrib4NsvARB;
+ if (glad_glVertexAttrib4NsvARB == NULL && glad_glVertexAttrib4Nsv != NULL) glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glad_glVertexAttrib4Nsv;
+ if (glad_glVertexAttrib4Nub == NULL && glad_glVertexAttrib4ubNV != NULL) glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glad_glVertexAttrib4ubNV;
+ if (glad_glVertexAttrib4Nub == NULL && glad_glVertexAttrib4NubARB != NULL) glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glad_glVertexAttrib4NubARB;
+ if (glad_glVertexAttrib4NubARB == NULL && glad_glVertexAttrib4Nub != NULL) glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glad_glVertexAttrib4Nub;
+ if (glad_glVertexAttrib4NubARB == NULL && glad_glVertexAttrib4ubNV != NULL) glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glad_glVertexAttrib4ubNV;
+ if (glad_glVertexAttrib4Nubv == NULL && glad_glVertexAttrib4ubvNV != NULL) glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glad_glVertexAttrib4ubvNV;
+ if (glad_glVertexAttrib4Nubv == NULL && glad_glVertexAttrib4NubvARB != NULL) glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glad_glVertexAttrib4NubvARB;
+ if (glad_glVertexAttrib4NubvARB == NULL && glad_glVertexAttrib4ubvNV != NULL) glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glad_glVertexAttrib4ubvNV;
+ if (glad_glVertexAttrib4NubvARB == NULL && glad_glVertexAttrib4Nubv != NULL) glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glad_glVertexAttrib4Nubv;
+ if (glad_glVertexAttrib4Nuiv == NULL && glad_glVertexAttrib4NuivARB != NULL) glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glad_glVertexAttrib4NuivARB;
+ if (glad_glVertexAttrib4NuivARB == NULL && glad_glVertexAttrib4Nuiv != NULL) glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glad_glVertexAttrib4Nuiv;
+ if (glad_glVertexAttrib4Nusv == NULL && glad_glVertexAttrib4NusvARB != NULL) glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glad_glVertexAttrib4NusvARB;
+ if (glad_glVertexAttrib4NusvARB == NULL && glad_glVertexAttrib4Nusv != NULL) glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glad_glVertexAttrib4Nusv;
+ if (glad_glVertexAttrib4s == NULL && glad_glVertexAttrib4sNV != NULL) glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glad_glVertexAttrib4sNV;
+ if (glad_glVertexAttrib4s == NULL && glad_glVertexAttrib4sARB != NULL) glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glad_glVertexAttrib4sARB;
+ if (glad_glVertexAttrib4sARB == NULL && glad_glVertexAttrib4sNV != NULL) glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glad_glVertexAttrib4sNV;
+ if (glad_glVertexAttrib4sARB == NULL && glad_glVertexAttrib4s != NULL) glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glad_glVertexAttrib4s;
+ if (glad_glVertexAttrib4sNV == NULL && glad_glVertexAttrib4s != NULL) glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glad_glVertexAttrib4s;
+ if (glad_glVertexAttrib4sNV == NULL && glad_glVertexAttrib4sARB != NULL) glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glad_glVertexAttrib4sARB;
+ if (glad_glVertexAttrib4sv == NULL && glad_glVertexAttrib4svARB != NULL) glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glad_glVertexAttrib4svARB;
+ if (glad_glVertexAttrib4sv == NULL && glad_glVertexAttrib4svNV != NULL) glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glad_glVertexAttrib4svNV;
+ if (glad_glVertexAttrib4svARB == NULL && glad_glVertexAttrib4sv != NULL) glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glad_glVertexAttrib4sv;
+ if (glad_glVertexAttrib4svARB == NULL && glad_glVertexAttrib4svNV != NULL) glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glad_glVertexAttrib4svNV;
+ if (glad_glVertexAttrib4svNV == NULL && glad_glVertexAttrib4svARB != NULL) glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glad_glVertexAttrib4svARB;
+ if (glad_glVertexAttrib4svNV == NULL && glad_glVertexAttrib4sv != NULL) glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glad_glVertexAttrib4sv;
+ if (glad_glVertexAttrib4ubNV == NULL && glad_glVertexAttrib4Nub != NULL) glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glad_glVertexAttrib4Nub;
+ if (glad_glVertexAttrib4ubNV == NULL && glad_glVertexAttrib4NubARB != NULL) glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glad_glVertexAttrib4NubARB;
+ if (glad_glVertexAttrib4ubv == NULL && glad_glVertexAttrib4ubvARB != NULL) glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glad_glVertexAttrib4ubvARB;
+ if (glad_glVertexAttrib4ubvARB == NULL && glad_glVertexAttrib4ubv != NULL) glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glad_glVertexAttrib4ubv;
+ if (glad_glVertexAttrib4ubvNV == NULL && glad_glVertexAttrib4Nubv != NULL) glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glad_glVertexAttrib4Nubv;
+ if (glad_glVertexAttrib4ubvNV == NULL && glad_glVertexAttrib4NubvARB != NULL) glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glad_glVertexAttrib4NubvARB;
+ if (glad_glVertexAttrib4uiv == NULL && glad_glVertexAttrib4uivARB != NULL) glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glad_glVertexAttrib4uivARB;
+ if (glad_glVertexAttrib4uivARB == NULL && glad_glVertexAttrib4uiv != NULL) glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glad_glVertexAttrib4uiv;
+ if (glad_glVertexAttrib4usv == NULL && glad_glVertexAttrib4usvARB != NULL) glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glad_glVertexAttrib4usvARB;
+ if (glad_glVertexAttrib4usvARB == NULL && glad_glVertexAttrib4usv != NULL) glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glad_glVertexAttrib4usv;
+ if (glad_glVertexAttribPointer == NULL && glad_glVertexAttribPointerARB != NULL) glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glad_glVertexAttribPointerARB;
+ if (glad_glVertexAttribPointerARB == NULL && glad_glVertexAttribPointer != NULL) glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glad_glVertexAttribPointer;
+}
+
+#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0)
+#define GLAD_GL_IS_SOME_NEW_VERSION 1
+#else
+#define GLAD_GL_IS_SOME_NEW_VERSION 0
+#endif
+
+static int glad_gl_get_extensions( int version, const char **out_exts, unsigned int *out_num_exts_i, char ***out_exts_i) {
+#if GLAD_GL_IS_SOME_NEW_VERSION
+ if(GLAD_VERSION_MAJOR(version) < 3) {
+#else
+ (void) version;
+ (void) out_num_exts_i;
+ (void) out_exts_i;
+#endif
+ if (glad_glGetString == NULL) {
+ return 0;
+ }
+ *out_exts = (const char *)glad_glGetString(GL_EXTENSIONS);
+#if GLAD_GL_IS_SOME_NEW_VERSION
+ } else {
+ unsigned int index = 0;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (glad_glGetStringi == NULL || glad_glGetIntegerv == NULL) {
+ return 0;
+ }
+ glad_glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i);
+ if (num_exts_i > 0) {
+ exts_i = (char **) malloc(num_exts_i * (sizeof *exts_i));
+ }
+ if (exts_i == NULL) {
+ return 0;
+ }
+ for(index = 0; index < num_exts_i; index++) {
+ const char *gl_str_tmp = (const char*) glad_glGetStringi(GL_EXTENSIONS, index);
+ size_t len = strlen(gl_str_tmp) + 1;
+
+ char *local_str = (char*) malloc(len * sizeof(char));
+ if(local_str != NULL) {
+ memcpy(local_str, gl_str_tmp, len * sizeof(char));
+ }
+
+ exts_i[index] = local_str;
+ }
+
+ *out_num_exts_i = num_exts_i;
+ *out_exts_i = exts_i;
+ }
+#endif
+ return 1;
+}
+static void glad_gl_free_extensions(char **exts_i, unsigned int num_exts_i) {
+ if (exts_i != NULL) {
+ unsigned int index;
+ for(index = 0; index < num_exts_i; index++) {
+ free((void *) (exts_i[index]));
+ }
+ free((void *)exts_i);
+ exts_i = NULL;
+ }
+}
+static int glad_gl_has_extension(int version, const char *exts, unsigned int num_exts_i, char **exts_i, const char *ext) {
+ if(GLAD_VERSION_MAJOR(version) < 3 || !GLAD_GL_IS_SOME_NEW_VERSION) {
+ const char *extensions;
+ const char *loc;
+ const char *terminator;
+ extensions = exts;
+ if(extensions == NULL || ext == NULL) {
+ return 0;
+ }
+ while(1) {
+ loc = strstr(extensions, ext);
+ if(loc == NULL) {
+ return 0;
+ }
+ terminator = loc + strlen(ext);
+ if((loc == extensions || *(loc - 1) == ' ') &&
+ (*terminator == ' ' || *terminator == '\0')) {
+ return 1;
+ }
+ extensions = terminator;
+ }
+ } else {
+ unsigned int index;
+ for(index = 0; index < num_exts_i; index++) {
+ const char *e = exts_i[index];
+ if(strcmp(e, ext) == 0) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const char* name) {
+ return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);
+}
+
+static int glad_gl_find_extensions_gl( int version) {
+ const char *exts = NULL;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (!glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0;
+
+ GLAD_GL_ARB_copy_buffer = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_copy_buffer");
+ GLAD_GL_ARB_fragment_shader = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_fragment_shader");
+ GLAD_GL_ARB_framebuffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_framebuffer_object");
+ GLAD_GL_ARB_geometry_shader4 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_geometry_shader4");
+ GLAD_GL_ARB_get_program_binary = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_get_program_binary");
+ GLAD_GL_ARB_imaging = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_imaging");
+ GLAD_GL_ARB_multitexture = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_multitexture");
+ GLAD_GL_ARB_separate_shader_objects = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_separate_shader_objects");
+ GLAD_GL_ARB_shader_objects = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_objects");
+ GLAD_GL_ARB_shading_language_100 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shading_language_100");
+ GLAD_GL_ARB_texture_non_power_of_two = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_non_power_of_two");
+ GLAD_GL_ARB_vertex_buffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_buffer_object");
+ GLAD_GL_ARB_vertex_program = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_program");
+ GLAD_GL_ARB_vertex_shader = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_shader");
+ GLAD_GL_EXT_blend_equation_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_equation_separate");
+ GLAD_GL_EXT_blend_func_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_func_separate");
+ GLAD_GL_EXT_blend_minmax = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_minmax");
+ GLAD_GL_EXT_blend_subtract = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_subtract");
+ GLAD_GL_EXT_copy_texture = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_copy_texture");
+ GLAD_GL_EXT_framebuffer_blit = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_blit");
+ GLAD_GL_EXT_framebuffer_multisample = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_multisample");
+ GLAD_GL_EXT_framebuffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_object");
+ GLAD_GL_EXT_geometry_shader4 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_geometry_shader4");
+ GLAD_GL_EXT_packed_depth_stencil = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_packed_depth_stencil");
+ GLAD_GL_EXT_subtexture = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_subtexture");
+ GLAD_GL_EXT_texture_array = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_array");
+ GLAD_GL_EXT_texture_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_object");
+ GLAD_GL_EXT_texture_sRGB = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_sRGB");
+ GLAD_GL_EXT_vertex_array = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_vertex_array");
+ GLAD_GL_INGR_blend_func_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_INGR_blend_func_separate");
+ GLAD_GL_KHR_debug = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_debug");
+ GLAD_GL_NV_geometry_program4 = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_NV_geometry_program4");
+ GLAD_GL_NV_vertex_program = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_NV_vertex_program");
+ GLAD_GL_SGIS_texture_edge_clamp = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_SGIS_texture_edge_clamp") | glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_edge_clamp");
+ GLAD_GL_OES_single_precision = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision");
+
+ glad_gl_free_extensions(exts_i, num_exts_i);
+
+ return 1;
+}
+
+static int glad_gl_find_core_gl(void) {
+ int i, major, minor;
+ const char* version;
+ const char* prefixes[] = {
+ "OpenGL ES-CM ",
+ "OpenGL ES-CL ",
+ "OpenGL ES ",
+ NULL
+ };
+ version = (const char*) glad_glGetString(GL_VERSION);
+ if (!version) return 0;
+ for (i = 0; prefixes[i]; i++) {
+ const size_t length = strlen(prefixes[i]);
+ if (strncmp(version, prefixes[i], length) == 0) {
+ version += length;
+ break;
+ }
+ }
+
+ GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor);
+
+ GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
+ GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;
+
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) {
+ int version;
+
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ if(glad_glGetString == NULL) return 0;
+ if(glad_glGetString(GL_VERSION) == NULL) return 0;
+ version = glad_gl_find_core_gl();
+
+ glad_gl_load_GL_VERSION_1_0(load, userptr);
+ glad_gl_load_GL_VERSION_1_1(load, userptr);
+
+ if (!glad_gl_find_extensions_gl(version)) return 0;
+ glad_gl_load_GL_ARB_copy_buffer(load, userptr);
+ glad_gl_load_GL_ARB_framebuffer_object(load, userptr);
+ glad_gl_load_GL_ARB_geometry_shader4(load, userptr);
+ glad_gl_load_GL_ARB_get_program_binary(load, userptr);
+ glad_gl_load_GL_ARB_imaging(load, userptr);
+ glad_gl_load_GL_ARB_multitexture(load, userptr);
+ glad_gl_load_GL_ARB_separate_shader_objects(load, userptr);
+ glad_gl_load_GL_ARB_shader_objects(load, userptr);
+ glad_gl_load_GL_ARB_vertex_buffer_object(load, userptr);
+ glad_gl_load_GL_ARB_vertex_program(load, userptr);
+ glad_gl_load_GL_ARB_vertex_shader(load, userptr);
+ glad_gl_load_GL_EXT_blend_equation_separate(load, userptr);
+ glad_gl_load_GL_EXT_blend_func_separate(load, userptr);
+ glad_gl_load_GL_EXT_blend_minmax(load, userptr);
+ glad_gl_load_GL_EXT_copy_texture(load, userptr);
+ glad_gl_load_GL_EXT_framebuffer_blit(load, userptr);
+ glad_gl_load_GL_EXT_framebuffer_multisample(load, userptr);
+ glad_gl_load_GL_EXT_framebuffer_object(load, userptr);
+ glad_gl_load_GL_EXT_geometry_shader4(load, userptr);
+ glad_gl_load_GL_EXT_subtexture(load, userptr);
+ glad_gl_load_GL_EXT_texture_array(load, userptr);
+ glad_gl_load_GL_EXT_texture_object(load, userptr);
+ glad_gl_load_GL_EXT_vertex_array(load, userptr);
+ glad_gl_load_GL_INGR_blend_func_separate(load, userptr);
+ glad_gl_load_GL_KHR_debug(load, userptr);
+ glad_gl_load_GL_NV_geometry_program4(load, userptr);
+ glad_gl_load_GL_NV_vertex_program(load, userptr);
+ glad_gl_load_GL_OES_single_precision(load, userptr);
+
+
+ glad_gl_resolve_aliases();
+
+ return version;
+}
+
+
+int gladLoadGL( GLADloadfunc load) {
+ return gladLoadGLUserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+static int glad_gl_find_extensions_gles1( int version) {
+ const char *exts = NULL;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (!glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0;
+
+ GLAD_GL_EXT_blend_minmax = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_minmax");
+ GLAD_GL_KHR_debug = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_debug");
+ GLAD_GL_EXT_sRGB = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_sRGB");
+ GLAD_GL_OES_blend_equation_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_equation_separate");
+ GLAD_GL_OES_blend_func_separate = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_func_separate");
+ GLAD_GL_OES_blend_subtract = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_subtract");
+ GLAD_GL_OES_framebuffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_framebuffer_object");
+ GLAD_GL_OES_packed_depth_stencil = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_packed_depth_stencil");
+ GLAD_GL_OES_single_precision = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision");
+ GLAD_GL_OES_texture_npot = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_texture_npot");
+
+ glad_gl_free_extensions(exts_i, num_exts_i);
+
+ return 1;
+}
+
+static int glad_gl_find_core_gles1(void) {
+ int i, major, minor;
+ const char* version;
+ const char* prefixes[] = {
+ "OpenGL ES-CM ",
+ "OpenGL ES-CL ",
+ "OpenGL ES ",
+ NULL
+ };
+ version = (const char*) glad_glGetString(GL_VERSION);
+ if (!version) return 0;
+ for (i = 0; prefixes[i]; i++) {
+ const size_t length = strlen(prefixes[i]);
+ if (strncmp(version, prefixes[i], length) == 0) {
+ version += length;
+ break;
+ }
+ }
+
+ GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor);
+
+ GLAD_GL_VERSION_ES_CM_1_0 = (major == 1 && minor >= 0) || major > 1;
+
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+int gladLoadGLES1UserPtr( GLADuserptrloadfunc load, void *userptr) {
+ int version;
+
+ glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ if(glad_glGetString == NULL) return 0;
+ if(glad_glGetString(GL_VERSION) == NULL) return 0;
+ version = glad_gl_find_core_gles1();
+
+ glad_gl_load_GL_VERSION_ES_CM_1_0(load, userptr);
+
+ if (!glad_gl_find_extensions_gles1(version)) return 0;
+ glad_gl_load_GL_EXT_blend_minmax(load, userptr);
+ glad_gl_load_GL_KHR_debug(load, userptr);
+ glad_gl_load_GL_OES_blend_equation_separate(load, userptr);
+ glad_gl_load_GL_OES_blend_func_separate(load, userptr);
+ glad_gl_load_GL_OES_blend_subtract(load, userptr);
+ glad_gl_load_GL_OES_framebuffer_object(load, userptr);
+ glad_gl_load_GL_OES_single_precision(load, userptr);
+
+
+ glad_gl_resolve_aliases();
+
+ return version;
+}
+
+
+int gladLoadGLES1( GLADloadfunc load) {
+ return gladLoadGLES1UserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+
+
+
+
+
+#endif /* GLAD_GL_IMPLEMENTATION */
+
diff --git a/extlibs/headers/glad/include/glad/egl.h b/extlibs/headers/glad/include/glad/egl.h
new file mode 100644
index 0000000..e365e56
--- /dev/null
+++ b/extlibs/headers/glad/include/glad/egl.h
@@ -0,0 +1,1530 @@
+/**
+ * Loader generated by glad 2.0.0-beta on Sun Jun 26 11:35:02 2022
+ *
+ * Generator: C/C++
+ * Specification: egl
+ * Extensions: 5
+ *
+ * APIs:
+ * - egl=1.5
+ *
+ * Options:
+ * - ALIAS = True
+ * - DEBUG = False
+ * - HEADER_ONLY = True
+ * - LOADER = True
+ * - MX = False
+ * - MX_GLOBAL = False
+ * - ON_DEMAND = False
+ *
+ * Commandline:
+ * --api='egl=1.5' --extensions='EGL_KHR_cl_event2,EGL_KHR_fence_sync,EGL_KHR_image,EGL_KHR_image_base,EGL_KHR_reusable_sync' c --alias --header-only --loader
+ *
+ * Online:
+ * http://glad.sh/#api=egl%3D1.5&extensions=EGL_KHR_cl_event2%2CEGL_KHR_fence_sync%2CEGL_KHR_image%2CEGL_KHR_image_base%2CEGL_KHR_reusable_sync&generator=c&options=ALIAS%2CHEADER_ONLY%2CLOADER
+ *
+ */
+
+#ifndef SF_GLAD_EGL_H_
+#define SF_GLAD_EGL_H_
+
+
+#define SF_GLAD_EGL
+#define GLAD_OPTION_EGL_ALIAS
+#define GLAD_OPTION_EGL_HEADER_ONLY
+#define GLAD_OPTION_EGL_LOADER
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef GLAD_PLATFORM_H_
+#define GLAD_PLATFORM_H_
+
+#ifndef GLAD_PLATFORM_WIN32
+ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)
+ #define GLAD_PLATFORM_WIN32 1
+ #else
+ #define GLAD_PLATFORM_WIN32 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_APPLE
+ #ifdef __APPLE__
+ #define GLAD_PLATFORM_APPLE 1
+ #else
+ #define GLAD_PLATFORM_APPLE 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_EMSCRIPTEN
+ #ifdef __EMSCRIPTEN__
+ #define GLAD_PLATFORM_EMSCRIPTEN 1
+ #else
+ #define GLAD_PLATFORM_EMSCRIPTEN 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_UWP
+ #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY)
+ #ifdef __has_include
+ #if __has_include(<winapifamily.h>)
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #endif
+
+ #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY
+ #include <winapifamily.h>
+ #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ #define GLAD_PLATFORM_UWP 1
+ #endif
+ #endif
+
+ #ifndef GLAD_PLATFORM_UWP
+ #define GLAD_PLATFORM_UWP 0
+ #endif
+#endif
+
+#ifdef __GNUC__
+ #define GLAD_GNUC_EXTENSION __extension__
+#else
+ #define GLAD_GNUC_EXTENSION
+#endif
+
+#ifndef GLAD_API_CALL
+ #if defined(GLAD_API_CALL_EXPORT)
+ #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__)
+ #if defined(GLAD_API_CALL_EXPORT_BUILD)
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllexport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllexport) extern
+ #endif
+ #else
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllimport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllimport) extern
+ #endif
+ #endif
+ #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD)
+ #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+#endif
+
+#ifdef APIENTRY
+ #define GLAD_API_PTR APIENTRY
+#elif GLAD_PLATFORM_WIN32
+ #define GLAD_API_PTR __stdcall
+#else
+ #define GLAD_API_PTR
+#endif
+
+#ifndef GLAPI
+#define GLAPI GLAD_API_CALL
+#endif
+
+#ifndef GLAPIENTRY
+#define GLAPIENTRY GLAD_API_PTR
+#endif
+
+#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor)
+#define GLAD_VERSION_MAJOR(version) (version / 10000)
+#define GLAD_VERSION_MINOR(version) (version % 10000)
+
+#define GLAD_GENERATOR_VERSION "2.0.0-beta"
+
+typedef void (*GLADapiproc)(void);
+
+typedef GLADapiproc (*GLADloadfunc)(const char *name);
+typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name);
+
+typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...);
+typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...);
+
+#endif /* GLAD_PLATFORM_H_ */
+
+#define EGL_ALPHA_FORMAT 0x3088
+#define EGL_ALPHA_FORMAT_NONPRE 0x308B
+#define EGL_ALPHA_FORMAT_PRE 0x308C
+#define EGL_ALPHA_MASK_SIZE 0x303E
+#define EGL_ALPHA_SIZE 0x3021
+#define EGL_BACK_BUFFER 0x3084
+#define EGL_BAD_ACCESS 0x3002
+#define EGL_BAD_ALLOC 0x3003
+#define EGL_BAD_ATTRIBUTE 0x3004
+#define EGL_BAD_CONFIG 0x3005
+#define EGL_BAD_CONTEXT 0x3006
+#define EGL_BAD_CURRENT_SURFACE 0x3007
+#define EGL_BAD_DISPLAY 0x3008
+#define EGL_BAD_MATCH 0x3009
+#define EGL_BAD_NATIVE_PIXMAP 0x300A
+#define EGL_BAD_NATIVE_WINDOW 0x300B
+#define EGL_BAD_PARAMETER 0x300C
+#define EGL_BAD_SURFACE 0x300D
+#define EGL_BIND_TO_TEXTURE_RGB 0x3039
+#define EGL_BIND_TO_TEXTURE_RGBA 0x303A
+#define EGL_BLUE_SIZE 0x3022
+#define EGL_BUFFER_DESTROYED 0x3095
+#define EGL_BUFFER_PRESERVED 0x3094
+#define EGL_BUFFER_SIZE 0x3020
+#define EGL_CLIENT_APIS 0x308D
+#define EGL_CL_EVENT_HANDLE 0x309C
+#define EGL_CL_EVENT_HANDLE_KHR 0x309C
+#define EGL_COLORSPACE 0x3087
+#define EGL_COLORSPACE_LINEAR 0x308A
+#define EGL_COLORSPACE_sRGB 0x3089
+#define EGL_COLOR_BUFFER_TYPE 0x303F
+#define EGL_CONDITION_SATISFIED 0x30F6
+#define EGL_CONDITION_SATISFIED_KHR 0x30F6
+#define EGL_CONFIG_CAVEAT 0x3027
+#define EGL_CONFIG_ID 0x3028
+#define EGL_CONFORMANT 0x3042
+#define EGL_CONTEXT_CLIENT_TYPE 0x3097
+#define EGL_CONTEXT_CLIENT_VERSION 0x3098
+#define EGL_CONTEXT_LOST 0x300E
+#define EGL_CONTEXT_MAJOR_VERSION 0x3098
+#define EGL_CONTEXT_MINOR_VERSION 0x30FB
+#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002
+#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001
+#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0
+#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1
+#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD
+#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD
+#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2
+#define EGL_CORE_NATIVE_ENGINE 0x305B
+#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0)
+#define EGL_DEPTH_SIZE 0x3025
+#define EGL_DISPLAY_SCALING 10000
+#define EGL_DONT_CARE EGL_CAST(EGLint,-1)
+#define EGL_DRAW 0x3059
+#define EGL_EXTENSIONS 0x3055
+#define EGL_FALSE 0
+#define EGL_FOREVER 0xFFFFFFFFFFFFFFFF
+#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFF
+#define EGL_GL_COLORSPACE 0x309D
+#define EGL_GL_COLORSPACE_LINEAR 0x308A
+#define EGL_GL_COLORSPACE_SRGB 0x3089
+#define EGL_GL_RENDERBUFFER 0x30B9
+#define EGL_GL_TEXTURE_2D 0x30B1
+#define EGL_GL_TEXTURE_3D 0x30B2
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7
+#define EGL_GL_TEXTURE_LEVEL 0x30BC
+#define EGL_GL_TEXTURE_ZOFFSET 0x30BD
+#define EGL_GREEN_SIZE 0x3023
+#define EGL_HEIGHT 0x3056
+#define EGL_HORIZONTAL_RESOLUTION 0x3090
+#define EGL_IMAGE_PRESERVED 0x30D2
+#define EGL_IMAGE_PRESERVED_KHR 0x30D2
+#define EGL_LARGEST_PBUFFER 0x3058
+#define EGL_LEVEL 0x3029
+#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF
+#define EGL_LUMINANCE_BUFFER 0x308F
+#define EGL_LUMINANCE_SIZE 0x303D
+#define EGL_MATCH_NATIVE_PIXMAP 0x3041
+#define EGL_MAX_PBUFFER_HEIGHT 0x302A
+#define EGL_MAX_PBUFFER_PIXELS 0x302B
+#define EGL_MAX_PBUFFER_WIDTH 0x302C
+#define EGL_MAX_SWAP_INTERVAL 0x303C
+#define EGL_MIN_SWAP_INTERVAL 0x303B
+#define EGL_MIPMAP_LEVEL 0x3083
+#define EGL_MIPMAP_TEXTURE 0x3082
+#define EGL_MULTISAMPLE_RESOLVE 0x3099
+#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B
+#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200
+#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A
+#define EGL_NATIVE_PIXMAP_KHR 0x30B0
+#define EGL_NATIVE_RENDERABLE 0x302D
+#define EGL_NATIVE_VISUAL_ID 0x302E
+#define EGL_NATIVE_VISUAL_TYPE 0x302F
+#define EGL_NONE 0x3038
+#define EGL_NON_CONFORMANT_CONFIG 0x3051
+#define EGL_NOT_INITIALIZED 0x3001
+#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0)
+#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0)
+#define EGL_NO_IMAGE EGL_CAST(EGLImage,0)
+#define EGL_NO_IMAGE_KHR EGL_CAST(EGLImageKHR,0)
+#define EGL_NO_RESET_NOTIFICATION 0x31BE
+#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0)
+#define EGL_NO_SYNC EGL_CAST(EGLSync,0)
+#define EGL_NO_SYNC_KHR EGL_CAST(EGLSync,0)
+#define EGL_NO_TEXTURE 0x305C
+#define EGL_OPENGL_API 0x30A2
+#define EGL_OPENGL_BIT 0x0008
+#define EGL_OPENGL_ES2_BIT 0x0004
+#define EGL_OPENGL_ES3_BIT 0x00000040
+#define EGL_OPENGL_ES_API 0x30A0
+#define EGL_OPENGL_ES_BIT 0x0001
+#define EGL_OPENVG_API 0x30A1
+#define EGL_OPENVG_BIT 0x0002
+#define EGL_OPENVG_IMAGE 0x3096
+#define EGL_PBUFFER_BIT 0x0001
+#define EGL_PIXEL_ASPECT_RATIO 0x3092
+#define EGL_PIXMAP_BIT 0x0002
+#define EGL_READ 0x305A
+#define EGL_RED_SIZE 0x3024
+#define EGL_RENDERABLE_TYPE 0x3040
+#define EGL_RENDER_BUFFER 0x3086
+#define EGL_RGB_BUFFER 0x308E
+#define EGL_SAMPLES 0x3031
+#define EGL_SAMPLE_BUFFERS 0x3032
+#define EGL_SIGNALED 0x30F2
+#define EGL_SIGNALED_KHR 0x30F2
+#define EGL_SINGLE_BUFFER 0x3085
+#define EGL_SLOW_CONFIG 0x3050
+#define EGL_STENCIL_SIZE 0x3026
+#define EGL_SUCCESS 0x3000
+#define EGL_SURFACE_TYPE 0x3033
+#define EGL_SWAP_BEHAVIOR 0x3093
+#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400
+#define EGL_SYNC_CL_EVENT 0x30FE
+#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF
+#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF
+#define EGL_SYNC_CL_EVENT_KHR 0x30FE
+#define EGL_SYNC_CONDITION 0x30F8
+#define EGL_SYNC_CONDITION_KHR 0x30F8
+#define EGL_SYNC_FENCE 0x30F9
+#define EGL_SYNC_FENCE_KHR 0x30F9
+#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001
+#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0
+#define EGL_SYNC_REUSABLE_KHR 0x30FA
+#define EGL_SYNC_STATUS 0x30F1
+#define EGL_SYNC_STATUS_KHR 0x30F1
+#define EGL_SYNC_TYPE 0x30F7
+#define EGL_SYNC_TYPE_KHR 0x30F7
+#define EGL_TEXTURE_2D 0x305F
+#define EGL_TEXTURE_FORMAT 0x3080
+#define EGL_TEXTURE_RGB 0x305D
+#define EGL_TEXTURE_RGBA 0x305E
+#define EGL_TEXTURE_TARGET 0x3081
+#define EGL_TIMEOUT_EXPIRED 0x30F5
+#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5
+#define EGL_TRANSPARENT_BLUE_VALUE 0x3035
+#define EGL_TRANSPARENT_GREEN_VALUE 0x3036
+#define EGL_TRANSPARENT_RED_VALUE 0x3037
+#define EGL_TRANSPARENT_RGB 0x3052
+#define EGL_TRANSPARENT_TYPE 0x3034
+#define EGL_TRUE 1
+#define EGL_UNKNOWN EGL_CAST(EGLint,-1)
+#define EGL_UNSIGNALED 0x30F3
+#define EGL_UNSIGNALED_KHR 0x30F3
+#define EGL_VENDOR 0x3053
+#define EGL_VERSION 0x3054
+#define EGL_VERTICAL_RESOLUTION 0x3091
+#define EGL_VG_ALPHA_FORMAT 0x3088
+#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B
+#define EGL_VG_ALPHA_FORMAT_PRE 0x308C
+#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040
+#define EGL_VG_COLORSPACE 0x3087
+#define EGL_VG_COLORSPACE_LINEAR 0x308A
+#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020
+#define EGL_VG_COLORSPACE_sRGB 0x3089
+#define EGL_WIDTH 0x3057
+#define EGL_WINDOW_BIT 0x0004
+
+
+#ifndef __khrplatform_h_
+#define __khrplatform_h_
+
+/*
+** Copyright (c) 2008-2018 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+/* Khronos platform-specific types and definitions.
+ *
+ * The master copy of khrplatform.h is maintained in the Khronos EGL
+ * Registry repository at https://github.com/KhronosGroup/EGL-Registry
+ * The last semantic modification to khrplatform.h was at commit ID:
+ * 67a3e0864c2d75ea5287b9f3d2eb74a745936692
+ *
+ * Adopters may modify this file to suit their platform. Adopters are
+ * encouraged to submit platform specific modifications to the Khronos
+ * group so that they can be included in future versions of this file.
+ * Please submit changes by filing pull requests or issues on
+ * the EGL Registry repository linked above.
+ *
+ *
+ * See the Implementer's Guidelines for information about where this file
+ * should be located on your system and for more details of its use:
+ * http://www.khronos.org/registry/implementers_guide.pdf
+ *
+ * This file should be included as
+ * #include <KHR/khrplatform.h>
+ * by Khronos client API header files that use its types and defines.
+ *
+ * The types in khrplatform.h should only be used to define API-specific types.
+ *
+ * Types defined in khrplatform.h:
+ * khronos_int8_t signed 8 bit
+ * khronos_uint8_t unsigned 8 bit
+ * khronos_int16_t signed 16 bit
+ * khronos_uint16_t unsigned 16 bit
+ * khronos_int32_t signed 32 bit
+ * khronos_uint32_t unsigned 32 bit
+ * khronos_int64_t signed 64 bit
+ * khronos_uint64_t unsigned 64 bit
+ * khronos_intptr_t signed same number of bits as a pointer
+ * khronos_uintptr_t unsigned same number of bits as a pointer
+ * khronos_ssize_t signed size
+ * khronos_usize_t unsigned size
+ * khronos_float_t signed 32 bit floating point
+ * khronos_time_ns_t unsigned 64 bit time in nanoseconds
+ * khronos_utime_nanoseconds_t unsigned time interval or absolute time in
+ * nanoseconds
+ * khronos_stime_nanoseconds_t signed time interval in nanoseconds
+ * khronos_boolean_enum_t enumerated boolean type. This should
+ * only be used as a base type when a client API's boolean type is
+ * an enum. Client APIs which use an integer or other type for
+ * booleans cannot use this as the base type for their boolean.
+ *
+ * Tokens defined in khrplatform.h:
+ *
+ * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
+ *
+ * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
+ * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
+ *
+ * Calling convention macros defined in this file:
+ * KHRONOS_APICALL
+ * KHRONOS_GLAD_API_PTR
+ * KHRONOS_APIATTRIBUTES
+ *
+ * These may be used in function prototypes as:
+ *
+ * KHRONOS_APICALL void KHRONOS_GLAD_API_PTR funcname(
+ * int arg1,
+ * int arg2) KHRONOS_APIATTRIBUTES;
+ */
+
+#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC)
+# define KHRONOS_STATIC 1
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APICALL
+ *-------------------------------------------------------------------------
+ * This precedes the return type of the function in the function prototype.
+ */
+#if defined(KHRONOS_STATIC)
+ /* If the preprocessor constant KHRONOS_STATIC is defined, make the
+ * header compatible with static linking. */
+# define KHRONOS_APICALL
+#elif defined(_WIN32)
+# define KHRONOS_APICALL __declspec(dllimport)
+#elif defined (__SYMBIAN32__)
+# define KHRONOS_APICALL IMPORT_C
+#elif defined(__ANDROID__)
+# define KHRONOS_APICALL __attribute__((visibility("default")))
+#else
+# define KHRONOS_APICALL
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_GLAD_API_PTR
+ *-------------------------------------------------------------------------
+ * This follows the return type of the function and precedes the function
+ * name in the function prototype.
+ */
+#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
+ /* Win32 but not WinCE */
+# define KHRONOS_GLAD_API_PTR __stdcall
+#else
+# define KHRONOS_GLAD_API_PTR
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APIATTRIBUTES
+ *-------------------------------------------------------------------------
+ * This follows the closing parenthesis of the function prototype arguments.
+ */
+#if defined (__ARMCC_2__)
+#define KHRONOS_APIATTRIBUTES __softfp
+#else
+#define KHRONOS_APIATTRIBUTES
+#endif
+
+/*-------------------------------------------------------------------------
+ * basic type definitions
+ *-----------------------------------------------------------------------*/
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
+
+
+/*
+ * Using <stdint.h>
+ */
+#include <stdint.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+/*
+ * To support platform where unsigned long cannot be used interchangeably with
+ * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t.
+ * Ideally, we could just use (u)intptr_t everywhere, but this could result in
+ * ABI breakage if khronos_uintptr_t is changed from unsigned long to
+ * unsigned long long or similar (this results in different C++ name mangling).
+ * To avoid changes for existing platforms, we restrict usage of intptr_t to
+ * platforms where the size of a pointer is larger than the size of long.
+ */
+#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__)
+#if __SIZEOF_POINTER__ > __SIZEOF_LONG__
+#define KHRONOS_USE_INTPTR_T
+#endif
+#endif
+
+#elif defined(__VMS ) || defined(__sgi)
+
+/*
+ * Using <inttypes.h>
+ */
+#include <inttypes.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
+
+/*
+ * Win32
+ */
+typedef __int32 khronos_int32_t;
+typedef unsigned __int32 khronos_uint32_t;
+typedef __int64 khronos_int64_t;
+typedef unsigned __int64 khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(__sun__) || defined(__digital__)
+
+/*
+ * Sun or Digital
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#if defined(__arch64__) || defined(_LP64)
+typedef long int khronos_int64_t;
+typedef unsigned long int khronos_uint64_t;
+#else
+typedef long long int khronos_int64_t;
+typedef unsigned long long int khronos_uint64_t;
+#endif /* __arch64__ */
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif 0
+
+/*
+ * Hypothetical platform with no float or int64 support
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#define KHRONOS_SUPPORT_INT64 0
+#define KHRONOS_SUPPORT_FLOAT 0
+
+#else
+
+/*
+ * Generic fallback
+ */
+#include <stdint.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#endif
+
+
+/*
+ * Types that are (so far) the same on all platforms
+ */
+typedef signed char khronos_int8_t;
+typedef unsigned char khronos_uint8_t;
+typedef signed short int khronos_int16_t;
+typedef unsigned short int khronos_uint16_t;
+
+/*
+ * Types that differ between LLP64 and LP64 architectures - in LLP64,
+ * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
+ * to be the only LLP64 architecture in current use.
+ */
+#ifdef KHRONOS_USE_INTPTR_T
+typedef intptr_t khronos_intptr_t;
+typedef uintptr_t khronos_uintptr_t;
+#elif defined(_WIN64)
+typedef signed long long int khronos_intptr_t;
+typedef unsigned long long int khronos_uintptr_t;
+#else
+typedef signed long int khronos_intptr_t;
+typedef unsigned long int khronos_uintptr_t;
+#endif
+
+#if defined(_WIN64)
+typedef signed long long int khronos_ssize_t;
+typedef unsigned long long int khronos_usize_t;
+#else
+typedef signed long int khronos_ssize_t;
+typedef unsigned long int khronos_usize_t;
+#endif
+
+#if KHRONOS_SUPPORT_FLOAT
+/*
+ * Float type
+ */
+typedef float khronos_float_t;
+#endif
+
+#if KHRONOS_SUPPORT_INT64
+/* Time types
+ *
+ * These types can be used to represent a time interval in nanoseconds or
+ * an absolute Unadjusted System Time. Unadjusted System Time is the number
+ * of nanoseconds since some arbitrary system event (e.g. since the last
+ * time the system booted). The Unadjusted System Time is an unsigned
+ * 64 bit value that wraps back to 0 every 584 years. Time intervals
+ * may be either signed or unsigned.
+ */
+typedef khronos_uint64_t khronos_utime_nanoseconds_t;
+typedef khronos_int64_t khronos_stime_nanoseconds_t;
+#endif
+
+/*
+ * Dummy value used to pad enum types to 32 bits.
+ */
+#ifndef KHRONOS_MAX_ENUM
+#define KHRONOS_MAX_ENUM 0x7FFFFFFF
+#endif
+
+/*
+ * Enumerated boolean type
+ *
+ * Values other than zero should be considered to be true. Therefore
+ * comparisons should not be made against KHRONOS_TRUE.
+ */
+typedef enum {
+ KHRONOS_FALSE = 0,
+ KHRONOS_TRUE = 1,
+ KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
+} khronos_boolean_enum_t;
+
+#endif /* __khrplatform_h_ */
+#ifndef __eglplatform_h_
+#define __eglplatform_h_
+
+/*
+** Copyright 2007-2020 The Khronos Group Inc.
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+/* Platform-specific types and definitions for egl.h
+ *
+ * Adopters may modify khrplatform.h and this file to suit their platform.
+ * You are encouraged to submit all modifications to the Khronos group so that
+ * they can be included in future versions of this file. Please submit changes
+ * by filing an issue or pull request on the public Khronos EGL Registry, at
+ * https://www.github.com/KhronosGroup/EGL-Registry/
+ */
+
+/* */
+
+/* Macros used in EGL function prototype declarations.
+ *
+ * EGL functions should be prototyped as:
+ *
+ * EGLAPI return-type EGLGLAD_API_PTR eglFunction(arguments);
+ * typedef return-type (EXPGLAD_API_PTRP PFNEGLFUNCTIONPROC) (arguments);
+ *
+ * KHRONOS_APICALL and KHRONOS_GLAD_API_PTR are defined in KHR/khrplatform.h
+ */
+
+#ifndef EGLAPI
+#define EGLAPI KHRONOS_APICALL
+#endif
+
+#ifndef EGLGLAD_API_PTR
+#define EGLGLAD_API_PTR KHRONOS_GLAD_API_PTR
+#endif
+#define EGLGLAD_API_PTRP EGLGLAD_API_PTR*
+
+/* The types NativeDisplayType, NativeWindowType, and NativePixmapType
+ * are aliases of window-system-dependent types, such as X Display * or
+ * Windows Device Context. They must be defined in platform-specific
+ * code below. The EGL-prefixed versions of Native*Type are the same
+ * types, renamed in EGL 1.3 so all types in the API start with "EGL".
+ *
+ * Khronos STRONGLY RECOMMENDS that you use the default definitions
+ * provided below, since these changes affect both binary and source
+ * portability of applications using EGL running on different EGL
+ * implementations.
+ */
+
+#if defined(EGL_NO_PLATFORM_SPECIFIC_TYPES)
+
+typedef void *EGLNativeDisplayType;
+typedef void *EGLNativePixmapType;
+typedef void *EGLNativeWindowType;
+
+#elif defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN 1
+#endif
+#include <windows.h>
+
+typedef HDC EGLNativeDisplayType;
+typedef HBITMAP EGLNativePixmapType;
+typedef HWND EGLNativeWindowType;
+
+#elif defined(__EMSCRIPTEN__)
+
+typedef int EGLNativeDisplayType;
+typedef int EGLNativePixmapType;
+typedef int EGLNativeWindowType;
+
+#elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */
+
+typedef int EGLNativeDisplayType;
+typedef void *EGLNativePixmapType;
+typedef void *EGLNativeWindowType;
+
+#elif defined(WL_EGL_PLATFORM)
+
+typedef struct wl_display *EGLNativeDisplayType;
+typedef struct wl_egl_pixmap *EGLNativePixmapType;
+typedef struct wl_egl_window *EGLNativeWindowType;
+
+#elif defined(__GBM__)
+
+typedef struct gbm_device *EGLNativeDisplayType;
+typedef struct gbm_bo *EGLNativePixmapType;
+typedef void *EGLNativeWindowType;
+
+#elif defined(__ANDROID__) || defined(ANDROID)
+
+struct ANativeWindow;
+struct egl_native_pixmap_t;
+
+typedef void* EGLNativeDisplayType;
+typedef struct egl_native_pixmap_t* EGLNativePixmapType;
+typedef struct ANativeWindow* EGLNativeWindowType;
+
+#elif defined(USE_OZONE)
+
+typedef intptr_t EGLNativeDisplayType;
+typedef intptr_t EGLNativePixmapType;
+typedef intptr_t EGLNativeWindowType;
+
+#elif defined(USE_X11)
+
+/* X11 (tentative) */
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+typedef Display *EGLNativeDisplayType;
+typedef Pixmap EGLNativePixmapType;
+typedef Window EGLNativeWindowType;
+
+#elif defined(__unix__)
+
+typedef void *EGLNativeDisplayType;
+typedef khronos_uintptr_t EGLNativePixmapType;
+typedef khronos_uintptr_t EGLNativeWindowType;
+
+#elif defined(__APPLE__)
+
+typedef int EGLNativeDisplayType;
+typedef void *EGLNativePixmapType;
+typedef void *EGLNativeWindowType;
+
+#elif defined(__HAIKU__)
+
+#include <kernel/image.h>
+
+typedef void *EGLNativeDisplayType;
+typedef khronos_uintptr_t EGLNativePixmapType;
+typedef khronos_uintptr_t EGLNativeWindowType;
+
+#elif defined(__Fuchsia__)
+
+typedef void *EGLNativeDisplayType;
+typedef khronos_uintptr_t EGLNativePixmapType;
+typedef khronos_uintptr_t EGLNativeWindowType;
+
+#else
+#error "Platform not recognized"
+#endif
+
+/* EGL 1.2 types, renamed for consistency in EGL 1.3 */
+typedef EGLNativeDisplayType NativeDisplayType;
+typedef EGLNativePixmapType NativePixmapType;
+typedef EGLNativeWindowType NativeWindowType;
+
+
+/* Define EGLint. This must be a signed integral type large enough to contain
+ * all legal attribute names and values passed into and out of EGL, whether
+ * their type is boolean, bitmask, enumerant (symbolic constant), integer,
+ * handle, or other. While in general a 32-bit integer will suffice, if
+ * handles are 64 bit types, then EGLint should be defined as a signed 64-bit
+ * integer type.
+ */
+typedef khronos_int32_t EGLint;
+
+
+/* C++ / C typecast macros for special EGL handle values */
+#if defined(__cplusplus)
+#define EGL_CAST(type, value) (static_cast<type>(value))
+#else
+#define EGL_CAST(type, value) ((type) (value))
+#endif
+
+#endif /* __eglplatform_h */
+
+
+
+
+
+
+
+
+
+
+
+struct AHardwareBuffer;
+struct wl_buffer;
+struct wl_display;
+struct wl_resource;
+
+typedef unsigned int EGLBoolean;
+typedef unsigned int EGLenum;
+typedef intptr_t EGLAttribKHR;
+typedef intptr_t EGLAttrib;
+typedef void *EGLClientBuffer;
+typedef void *EGLConfig;
+typedef void *EGLContext;
+typedef void *EGLDeviceEXT;
+typedef void *EGLDisplay;
+typedef void *EGLImage;
+typedef void *EGLImageKHR;
+typedef void *EGLLabelKHR;
+typedef void *EGLObjectKHR;
+typedef void *EGLOutputLayerEXT;
+typedef void *EGLOutputPortEXT;
+typedef void *EGLStreamKHR;
+typedef void *EGLSurface;
+typedef void *EGLSync;
+typedef void *EGLSyncKHR;
+typedef void *EGLSyncNV;
+typedef void (*__eglMustCastToProperFunctionPointerType)(void);
+typedef khronos_utime_nanoseconds_t EGLTimeKHR;
+typedef khronos_utime_nanoseconds_t EGLTime;
+typedef khronos_utime_nanoseconds_t EGLTimeNV;
+typedef khronos_utime_nanoseconds_t EGLuint64NV;
+typedef khronos_uint64_t EGLuint64KHR;
+typedef khronos_stime_nanoseconds_t EGLnsecsANDROID;
+typedef int EGLNativeFileDescriptorKHR;
+typedef khronos_ssize_t EGLsizeiANDROID;
+typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize);
+typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize);
+struct EGLClientPixmapHI {
+ void *pData;
+ EGLint iWidth;
+ EGLint iHeight;
+ EGLint iStride;
+};
+typedef void (GLAD_API_PTR *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message);
+#define PFNEGLBINDWAYLANDDISPLAYWL PFNEGLBINDWAYLANDDISPLAYWLPROC
+#define PFNEGLUNBINDWAYLANDDISPLAYWL PFNEGLUNBINDWAYLANDDISPLAYWLPROC
+#define PFNEGLQUERYWAYLANDBUFFERWL PFNEGLQUERYWAYLANDBUFFERWLPROC
+#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC
+
+
+#define EGL_VERSION_1_0 1
+GLAD_API_CALL int SF_GLAD_EGL_VERSION_1_0;
+#define EGL_VERSION_1_1 1
+GLAD_API_CALL int SF_GLAD_EGL_VERSION_1_1;
+#define EGL_VERSION_1_2 1
+GLAD_API_CALL int SF_GLAD_EGL_VERSION_1_2;
+#define EGL_VERSION_1_3 1
+GLAD_API_CALL int SF_GLAD_EGL_VERSION_1_3;
+#define EGL_VERSION_1_4 1
+GLAD_API_CALL int SF_GLAD_EGL_VERSION_1_4;
+#define EGL_VERSION_1_5 1
+GLAD_API_CALL int SF_GLAD_EGL_VERSION_1_5;
+#define EGL_KHR_cl_event2 1
+GLAD_API_CALL int SF_GLAD_EGL_KHR_cl_event2;
+#define EGL_KHR_fence_sync 1
+GLAD_API_CALL int SF_GLAD_EGL_KHR_fence_sync;
+#define EGL_KHR_image 1
+GLAD_API_CALL int SF_GLAD_EGL_KHR_image;
+#define EGL_KHR_image_base 1
+GLAD_API_CALL int SF_GLAD_EGL_KHR_image_base;
+#define EGL_KHR_reusable_sync 1
+GLAD_API_CALL int SF_GLAD_EGL_KHR_reusable_sync;
+
+
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDAPIPROC)(EGLenum api);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDTEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLCHOOSECONFIGPROC)(EGLDisplay dpy, const EGLint * attrib_list, EGLConfig * configs, EGLint config_size, EGLint * num_config);
+typedef EGLint (GLAD_API_PTR *PFNEGLCLIENTWAITSYNCPROC)(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout);
+typedef EGLint (GLAD_API_PTR *PFNEGLCLIENTWAITSYNCKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLCOPYBUFFERSPROC)(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
+typedef EGLContext (GLAD_API_PTR *PFNEGLCREATECONTEXTPROC)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint * attrib_list);
+typedef EGLImage (GLAD_API_PTR *PFNEGLCREATEIMAGEPROC)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib * attrib_list);
+typedef EGLImageKHR (GLAD_API_PTR *PFNEGLCREATEIMAGEKHRPROC)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint * attrib_list);
+typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC)(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint * attrib_list);
+typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERSURFACEPROC)(EGLDisplay dpy, EGLConfig config, const EGLint * attrib_list);
+typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPIXMAPSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint * attrib_list);
+typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)(EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLAttrib * attrib_list);
+typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, void * native_window, const EGLAttrib * attrib_list);
+typedef EGLSync (GLAD_API_PTR *PFNEGLCREATESYNCPROC)(EGLDisplay dpy, EGLenum type, const EGLAttrib * attrib_list);
+typedef EGLSyncKHR (GLAD_API_PTR *PFNEGLCREATESYNC64KHRPROC)(EGLDisplay dpy, EGLenum type, const EGLAttribKHR * attrib_list);
+typedef EGLSyncKHR (GLAD_API_PTR *PFNEGLCREATESYNCKHRPROC)(EGLDisplay dpy, EGLenum type, const EGLint * attrib_list);
+typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint * attrib_list);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYIMAGEPROC)(EGLDisplay dpy, EGLImage image);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYIMAGEKHRPROC)(EGLDisplay dpy, EGLImageKHR image);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSURFACEPROC)(EGLDisplay dpy, EGLSurface surface);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSYNCPROC)(EGLDisplay dpy, EGLSync sync);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSYNCKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGATTRIBPROC)(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint * value);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGSPROC)(EGLDisplay dpy, EGLConfig * configs, EGLint config_size, EGLint * num_config);
+typedef EGLContext (GLAD_API_PTR *PFNEGLGETCURRENTCONTEXTPROC)(void);
+typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETCURRENTDISPLAYPROC)(void);
+typedef EGLSurface (GLAD_API_PTR *PFNEGLGETCURRENTSURFACEPROC)(EGLint readdraw);
+typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETDISPLAYPROC)(EGLNativeDisplayType display_id);
+typedef EGLint (GLAD_API_PTR *PFNEGLGETERRORPROC)(void);
+typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETPLATFORMDISPLAYPROC)(EGLenum platform, void * native_display, const EGLAttrib * attrib_list);
+typedef __eglMustCastToProperFunctionPointerType (GLAD_API_PTR *PFNEGLGETPROCADDRESSPROC)(const char * procname);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETSYNCATTRIBPROC)(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib * value);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETSYNCATTRIBKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint * value);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLINITIALIZEPROC)(EGLDisplay dpy, EGLint * major, EGLint * minor);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLMAKECURRENTPROC)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
+typedef EGLenum (GLAD_API_PTR *PFNEGLQUERYAPIPROC)(void);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint * value);
+typedef const char * (GLAD_API_PTR *PFNEGLQUERYSTRINGPROC)(EGLDisplay dpy, EGLint name);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYSURFACEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint * value);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETHREADPROC)(void);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLSIGNALSYNCKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLSURFACEATTRIBPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPBUFFERSPROC)(EGLDisplay dpy, EGLSurface surface);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPINTERVALPROC)(EGLDisplay dpy, EGLint interval);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLTERMINATEPROC)(EGLDisplay dpy);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITCLIENTPROC)(void);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITGLPROC)(void);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITNATIVEPROC)(EGLint engine);
+typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITSYNCPROC)(EGLDisplay dpy, EGLSync sync, EGLint flags);
+
+GLAD_API_CALL PFNEGLBINDAPIPROC sf_glad_eglBindAPI;
+#define eglBindAPI sf_glad_eglBindAPI
+GLAD_API_CALL PFNEGLBINDTEXIMAGEPROC sf_glad_eglBindTexImage;
+#define eglBindTexImage sf_glad_eglBindTexImage
+GLAD_API_CALL PFNEGLCHOOSECONFIGPROC sf_glad_eglChooseConfig;
+#define eglChooseConfig sf_glad_eglChooseConfig
+GLAD_API_CALL PFNEGLCLIENTWAITSYNCPROC sf_glad_eglClientWaitSync;
+#define eglClientWaitSync sf_glad_eglClientWaitSync
+GLAD_API_CALL PFNEGLCLIENTWAITSYNCKHRPROC sf_glad_eglClientWaitSyncKHR;
+#define eglClientWaitSyncKHR sf_glad_eglClientWaitSyncKHR
+GLAD_API_CALL PFNEGLCOPYBUFFERSPROC sf_glad_eglCopyBuffers;
+#define eglCopyBuffers sf_glad_eglCopyBuffers
+GLAD_API_CALL PFNEGLCREATECONTEXTPROC sf_glad_eglCreateContext;
+#define eglCreateContext sf_glad_eglCreateContext
+GLAD_API_CALL PFNEGLCREATEIMAGEPROC sf_glad_eglCreateImage;
+#define eglCreateImage sf_glad_eglCreateImage
+GLAD_API_CALL PFNEGLCREATEIMAGEKHRPROC sf_glad_eglCreateImageKHR;
+#define eglCreateImageKHR sf_glad_eglCreateImageKHR
+GLAD_API_CALL PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC sf_glad_eglCreatePbufferFromClientBuffer;
+#define eglCreatePbufferFromClientBuffer sf_glad_eglCreatePbufferFromClientBuffer
+GLAD_API_CALL PFNEGLCREATEPBUFFERSURFACEPROC sf_glad_eglCreatePbufferSurface;
+#define eglCreatePbufferSurface sf_glad_eglCreatePbufferSurface
+GLAD_API_CALL PFNEGLCREATEPIXMAPSURFACEPROC sf_glad_eglCreatePixmapSurface;
+#define eglCreatePixmapSurface sf_glad_eglCreatePixmapSurface
+GLAD_API_CALL PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC sf_glad_eglCreatePlatformPixmapSurface;
+#define eglCreatePlatformPixmapSurface sf_glad_eglCreatePlatformPixmapSurface
+GLAD_API_CALL PFNEGLCREATEPLATFORMWINDOWSURFACEPROC sf_glad_eglCreatePlatformWindowSurface;
+#define eglCreatePlatformWindowSurface sf_glad_eglCreatePlatformWindowSurface
+GLAD_API_CALL PFNEGLCREATESYNCPROC sf_glad_eglCreateSync;
+#define eglCreateSync sf_glad_eglCreateSync
+GLAD_API_CALL PFNEGLCREATESYNC64KHRPROC sf_glad_eglCreateSync64KHR;
+#define eglCreateSync64KHR sf_glad_eglCreateSync64KHR
+GLAD_API_CALL PFNEGLCREATESYNCKHRPROC sf_glad_eglCreateSyncKHR;
+#define eglCreateSyncKHR sf_glad_eglCreateSyncKHR
+GLAD_API_CALL PFNEGLCREATEWINDOWSURFACEPROC sf_glad_eglCreateWindowSurface;
+#define eglCreateWindowSurface sf_glad_eglCreateWindowSurface
+GLAD_API_CALL PFNEGLDESTROYCONTEXTPROC sf_glad_eglDestroyContext;
+#define eglDestroyContext sf_glad_eglDestroyContext
+GLAD_API_CALL PFNEGLDESTROYIMAGEPROC sf_glad_eglDestroyImage;
+#define eglDestroyImage sf_glad_eglDestroyImage
+GLAD_API_CALL PFNEGLDESTROYIMAGEKHRPROC sf_glad_eglDestroyImageKHR;
+#define eglDestroyImageKHR sf_glad_eglDestroyImageKHR
+GLAD_API_CALL PFNEGLDESTROYSURFACEPROC sf_glad_eglDestroySurface;
+#define eglDestroySurface sf_glad_eglDestroySurface
+GLAD_API_CALL PFNEGLDESTROYSYNCPROC sf_glad_eglDestroySync;
+#define eglDestroySync sf_glad_eglDestroySync
+GLAD_API_CALL PFNEGLDESTROYSYNCKHRPROC sf_glad_eglDestroySyncKHR;
+#define eglDestroySyncKHR sf_glad_eglDestroySyncKHR
+GLAD_API_CALL PFNEGLGETCONFIGATTRIBPROC sf_glad_eglGetConfigAttrib;
+#define eglGetConfigAttrib sf_glad_eglGetConfigAttrib
+GLAD_API_CALL PFNEGLGETCONFIGSPROC sf_glad_eglGetConfigs;
+#define eglGetConfigs sf_glad_eglGetConfigs
+GLAD_API_CALL PFNEGLGETCURRENTCONTEXTPROC sf_glad_eglGetCurrentContext;
+#define eglGetCurrentContext sf_glad_eglGetCurrentContext
+GLAD_API_CALL PFNEGLGETCURRENTDISPLAYPROC sf_glad_eglGetCurrentDisplay;
+#define eglGetCurrentDisplay sf_glad_eglGetCurrentDisplay
+GLAD_API_CALL PFNEGLGETCURRENTSURFACEPROC sf_glad_eglGetCurrentSurface;
+#define eglGetCurrentSurface sf_glad_eglGetCurrentSurface
+GLAD_API_CALL PFNEGLGETDISPLAYPROC sf_glad_eglGetDisplay;
+#define eglGetDisplay sf_glad_eglGetDisplay
+GLAD_API_CALL PFNEGLGETERRORPROC sf_glad_eglGetError;
+#define eglGetError sf_glad_eglGetError
+GLAD_API_CALL PFNEGLGETPLATFORMDISPLAYPROC sf_glad_eglGetPlatformDisplay;
+#define eglGetPlatformDisplay sf_glad_eglGetPlatformDisplay
+GLAD_API_CALL PFNEGLGETPROCADDRESSPROC sf_glad_eglGetProcAddress;
+#define eglGetProcAddress sf_glad_eglGetProcAddress
+GLAD_API_CALL PFNEGLGETSYNCATTRIBPROC sf_glad_eglGetSyncAttrib;
+#define eglGetSyncAttrib sf_glad_eglGetSyncAttrib
+GLAD_API_CALL PFNEGLGETSYNCATTRIBKHRPROC sf_glad_eglGetSyncAttribKHR;
+#define eglGetSyncAttribKHR sf_glad_eglGetSyncAttribKHR
+GLAD_API_CALL PFNEGLINITIALIZEPROC sf_glad_eglInitialize;
+#define eglInitialize sf_glad_eglInitialize
+GLAD_API_CALL PFNEGLMAKECURRENTPROC sf_glad_eglMakeCurrent;
+#define eglMakeCurrent sf_glad_eglMakeCurrent
+GLAD_API_CALL PFNEGLQUERYAPIPROC sf_glad_eglQueryAPI;
+#define eglQueryAPI sf_glad_eglQueryAPI
+GLAD_API_CALL PFNEGLQUERYCONTEXTPROC sf_glad_eglQueryContext;
+#define eglQueryContext sf_glad_eglQueryContext
+GLAD_API_CALL PFNEGLQUERYSTRINGPROC sf_glad_eglQueryString;
+#define eglQueryString sf_glad_eglQueryString
+GLAD_API_CALL PFNEGLQUERYSURFACEPROC sf_glad_eglQuerySurface;
+#define eglQuerySurface sf_glad_eglQuerySurface
+GLAD_API_CALL PFNEGLRELEASETEXIMAGEPROC sf_glad_eglReleaseTexImage;
+#define eglReleaseTexImage sf_glad_eglReleaseTexImage
+GLAD_API_CALL PFNEGLRELEASETHREADPROC sf_glad_eglReleaseThread;
+#define eglReleaseThread sf_glad_eglReleaseThread
+GLAD_API_CALL PFNEGLSIGNALSYNCKHRPROC sf_glad_eglSignalSyncKHR;
+#define eglSignalSyncKHR sf_glad_eglSignalSyncKHR
+GLAD_API_CALL PFNEGLSURFACEATTRIBPROC sf_glad_eglSurfaceAttrib;
+#define eglSurfaceAttrib sf_glad_eglSurfaceAttrib
+GLAD_API_CALL PFNEGLSWAPBUFFERSPROC sf_glad_eglSwapBuffers;
+#define eglSwapBuffers sf_glad_eglSwapBuffers
+GLAD_API_CALL PFNEGLSWAPINTERVALPROC sf_glad_eglSwapInterval;
+#define eglSwapInterval sf_glad_eglSwapInterval
+GLAD_API_CALL PFNEGLTERMINATEPROC sf_glad_eglTerminate;
+#define eglTerminate sf_glad_eglTerminate
+GLAD_API_CALL PFNEGLWAITCLIENTPROC sf_glad_eglWaitClient;
+#define eglWaitClient sf_glad_eglWaitClient
+GLAD_API_CALL PFNEGLWAITGLPROC sf_glad_eglWaitGL;
+#define eglWaitGL sf_glad_eglWaitGL
+GLAD_API_CALL PFNEGLWAITNATIVEPROC sf_glad_eglWaitNative;
+#define eglWaitNative sf_glad_eglWaitNative
+GLAD_API_CALL PFNEGLWAITSYNCPROC sf_glad_eglWaitSync;
+#define eglWaitSync sf_glad_eglWaitSync
+
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Source */
+#ifdef SF_GLAD_EGL_IMPLEMENTATION
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef GLAD_IMPL_UTIL_C_
+#define GLAD_IMPL_UTIL_C_
+
+#ifdef _MSC_VER
+#define GLAD_IMPL_UTIL_SSCANF sscanf_s
+#else
+#define GLAD_IMPL_UTIL_SSCANF sscanf
+#endif
+
+#endif /* GLAD_IMPL_UTIL_C_ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+int SF_GLAD_EGL_VERSION_1_0 = 0;
+int SF_GLAD_EGL_VERSION_1_1 = 0;
+int SF_GLAD_EGL_VERSION_1_2 = 0;
+int SF_GLAD_EGL_VERSION_1_3 = 0;
+int SF_GLAD_EGL_VERSION_1_4 = 0;
+int SF_GLAD_EGL_VERSION_1_5 = 0;
+int SF_GLAD_EGL_KHR_cl_event2 = 0;
+int SF_GLAD_EGL_KHR_fence_sync = 0;
+int SF_GLAD_EGL_KHR_image = 0;
+int SF_GLAD_EGL_KHR_image_base = 0;
+int SF_GLAD_EGL_KHR_reusable_sync = 0;
+
+
+
+PFNEGLBINDAPIPROC sf_glad_eglBindAPI = NULL;
+PFNEGLBINDTEXIMAGEPROC sf_glad_eglBindTexImage = NULL;
+PFNEGLCHOOSECONFIGPROC sf_glad_eglChooseConfig = NULL;
+PFNEGLCLIENTWAITSYNCPROC sf_glad_eglClientWaitSync = NULL;
+PFNEGLCLIENTWAITSYNCKHRPROC sf_glad_eglClientWaitSyncKHR = NULL;
+PFNEGLCOPYBUFFERSPROC sf_glad_eglCopyBuffers = NULL;
+PFNEGLCREATECONTEXTPROC sf_glad_eglCreateContext = NULL;
+PFNEGLCREATEIMAGEPROC sf_glad_eglCreateImage = NULL;
+PFNEGLCREATEIMAGEKHRPROC sf_glad_eglCreateImageKHR = NULL;
+PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC sf_glad_eglCreatePbufferFromClientBuffer = NULL;
+PFNEGLCREATEPBUFFERSURFACEPROC sf_glad_eglCreatePbufferSurface = NULL;
+PFNEGLCREATEPIXMAPSURFACEPROC sf_glad_eglCreatePixmapSurface = NULL;
+PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC sf_glad_eglCreatePlatformPixmapSurface = NULL;
+PFNEGLCREATEPLATFORMWINDOWSURFACEPROC sf_glad_eglCreatePlatformWindowSurface = NULL;
+PFNEGLCREATESYNCPROC sf_glad_eglCreateSync = NULL;
+PFNEGLCREATESYNC64KHRPROC sf_glad_eglCreateSync64KHR = NULL;
+PFNEGLCREATESYNCKHRPROC sf_glad_eglCreateSyncKHR = NULL;
+PFNEGLCREATEWINDOWSURFACEPROC sf_glad_eglCreateWindowSurface = NULL;
+PFNEGLDESTROYCONTEXTPROC sf_glad_eglDestroyContext = NULL;
+PFNEGLDESTROYIMAGEPROC sf_glad_eglDestroyImage = NULL;
+PFNEGLDESTROYIMAGEKHRPROC sf_glad_eglDestroyImageKHR = NULL;
+PFNEGLDESTROYSURFACEPROC sf_glad_eglDestroySurface = NULL;
+PFNEGLDESTROYSYNCPROC sf_glad_eglDestroySync = NULL;
+PFNEGLDESTROYSYNCKHRPROC sf_glad_eglDestroySyncKHR = NULL;
+PFNEGLGETCONFIGATTRIBPROC sf_glad_eglGetConfigAttrib = NULL;
+PFNEGLGETCONFIGSPROC sf_glad_eglGetConfigs = NULL;
+PFNEGLGETCURRENTCONTEXTPROC sf_glad_eglGetCurrentContext = NULL;
+PFNEGLGETCURRENTDISPLAYPROC sf_glad_eglGetCurrentDisplay = NULL;
+PFNEGLGETCURRENTSURFACEPROC sf_glad_eglGetCurrentSurface = NULL;
+PFNEGLGETDISPLAYPROC sf_glad_eglGetDisplay = NULL;
+PFNEGLGETERRORPROC sf_glad_eglGetError = NULL;
+PFNEGLGETPLATFORMDISPLAYPROC sf_glad_eglGetPlatformDisplay = NULL;
+PFNEGLGETPROCADDRESSPROC sf_glad_eglGetProcAddress = NULL;
+PFNEGLGETSYNCATTRIBPROC sf_glad_eglGetSyncAttrib = NULL;
+PFNEGLGETSYNCATTRIBKHRPROC sf_glad_eglGetSyncAttribKHR = NULL;
+PFNEGLINITIALIZEPROC sf_glad_eglInitialize = NULL;
+PFNEGLMAKECURRENTPROC sf_glad_eglMakeCurrent = NULL;
+PFNEGLQUERYAPIPROC sf_glad_eglQueryAPI = NULL;
+PFNEGLQUERYCONTEXTPROC sf_glad_eglQueryContext = NULL;
+PFNEGLQUERYSTRINGPROC sf_glad_eglQueryString = NULL;
+PFNEGLQUERYSURFACEPROC sf_glad_eglQuerySurface = NULL;
+PFNEGLRELEASETEXIMAGEPROC sf_glad_eglReleaseTexImage = NULL;
+PFNEGLRELEASETHREADPROC sf_glad_eglReleaseThread = NULL;
+PFNEGLSIGNALSYNCKHRPROC sf_glad_eglSignalSyncKHR = NULL;
+PFNEGLSURFACEATTRIBPROC sf_glad_eglSurfaceAttrib = NULL;
+PFNEGLSWAPBUFFERSPROC sf_glad_eglSwapBuffers = NULL;
+PFNEGLSWAPINTERVALPROC sf_glad_eglSwapInterval = NULL;
+PFNEGLTERMINATEPROC sf_glad_eglTerminate = NULL;
+PFNEGLWAITCLIENTPROC sf_glad_eglWaitClient = NULL;
+PFNEGLWAITGLPROC sf_glad_eglWaitGL = NULL;
+PFNEGLWAITNATIVEPROC sf_glad_eglWaitNative = NULL;
+PFNEGLWAITSYNCPROC sf_glad_eglWaitSync = NULL;
+
+
+static void sf_glad_egl_load_EGL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_EGL_VERSION_1_0) return;
+ sf_glad_eglChooseConfig = (PFNEGLCHOOSECONFIGPROC) load(userptr, "eglChooseConfig");
+ sf_glad_eglCopyBuffers = (PFNEGLCOPYBUFFERSPROC) load(userptr, "eglCopyBuffers");
+ sf_glad_eglCreateContext = (PFNEGLCREATECONTEXTPROC) load(userptr, "eglCreateContext");
+ sf_glad_eglCreatePbufferSurface = (PFNEGLCREATEPBUFFERSURFACEPROC) load(userptr, "eglCreatePbufferSurface");
+ sf_glad_eglCreatePixmapSurface = (PFNEGLCREATEPIXMAPSURFACEPROC) load(userptr, "eglCreatePixmapSurface");
+ sf_glad_eglCreateWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC) load(userptr, "eglCreateWindowSurface");
+ sf_glad_eglDestroyContext = (PFNEGLDESTROYCONTEXTPROC) load(userptr, "eglDestroyContext");
+ sf_glad_eglDestroySurface = (PFNEGLDESTROYSURFACEPROC) load(userptr, "eglDestroySurface");
+ sf_glad_eglGetConfigAttrib = (PFNEGLGETCONFIGATTRIBPROC) load(userptr, "eglGetConfigAttrib");
+ sf_glad_eglGetConfigs = (PFNEGLGETCONFIGSPROC) load(userptr, "eglGetConfigs");
+ sf_glad_eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load(userptr, "eglGetCurrentDisplay");
+ sf_glad_eglGetCurrentSurface = (PFNEGLGETCURRENTSURFACEPROC) load(userptr, "eglGetCurrentSurface");
+ sf_glad_eglGetDisplay = (PFNEGLGETDISPLAYPROC) load(userptr, "eglGetDisplay");
+ sf_glad_eglGetError = (PFNEGLGETERRORPROC) load(userptr, "eglGetError");
+ sf_glad_eglGetProcAddress = (PFNEGLGETPROCADDRESSPROC) load(userptr, "eglGetProcAddress");
+ sf_glad_eglInitialize = (PFNEGLINITIALIZEPROC) load(userptr, "eglInitialize");
+ sf_glad_eglMakeCurrent = (PFNEGLMAKECURRENTPROC) load(userptr, "eglMakeCurrent");
+ sf_glad_eglQueryContext = (PFNEGLQUERYCONTEXTPROC) load(userptr, "eglQueryContext");
+ sf_glad_eglQueryString = (PFNEGLQUERYSTRINGPROC) load(userptr, "eglQueryString");
+ sf_glad_eglQuerySurface = (PFNEGLQUERYSURFACEPROC) load(userptr, "eglQuerySurface");
+ sf_glad_eglSwapBuffers = (PFNEGLSWAPBUFFERSPROC) load(userptr, "eglSwapBuffers");
+ sf_glad_eglTerminate = (PFNEGLTERMINATEPROC) load(userptr, "eglTerminate");
+ sf_glad_eglWaitGL = (PFNEGLWAITGLPROC) load(userptr, "eglWaitGL");
+ sf_glad_eglWaitNative = (PFNEGLWAITNATIVEPROC) load(userptr, "eglWaitNative");
+}
+static void sf_glad_egl_load_EGL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_EGL_VERSION_1_1) return;
+ sf_glad_eglBindTexImage = (PFNEGLBINDTEXIMAGEPROC) load(userptr, "eglBindTexImage");
+ sf_glad_eglReleaseTexImage = (PFNEGLRELEASETEXIMAGEPROC) load(userptr, "eglReleaseTexImage");
+ sf_glad_eglSurfaceAttrib = (PFNEGLSURFACEATTRIBPROC) load(userptr, "eglSurfaceAttrib");
+ sf_glad_eglSwapInterval = (PFNEGLSWAPINTERVALPROC) load(userptr, "eglSwapInterval");
+}
+static void sf_glad_egl_load_EGL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_EGL_VERSION_1_2) return;
+ sf_glad_eglBindAPI = (PFNEGLBINDAPIPROC) load(userptr, "eglBindAPI");
+ sf_glad_eglCreatePbufferFromClientBuffer = (PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) load(userptr, "eglCreatePbufferFromClientBuffer");
+ sf_glad_eglQueryAPI = (PFNEGLQUERYAPIPROC) load(userptr, "eglQueryAPI");
+ sf_glad_eglReleaseThread = (PFNEGLRELEASETHREADPROC) load(userptr, "eglReleaseThread");
+ sf_glad_eglWaitClient = (PFNEGLWAITCLIENTPROC) load(userptr, "eglWaitClient");
+}
+static void sf_glad_egl_load_EGL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_EGL_VERSION_1_4) return;
+ sf_glad_eglGetCurrentContext = (PFNEGLGETCURRENTCONTEXTPROC) load(userptr, "eglGetCurrentContext");
+}
+static void sf_glad_egl_load_EGL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_EGL_VERSION_1_5) return;
+ sf_glad_eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC) load(userptr, "eglClientWaitSync");
+ sf_glad_eglCreateImage = (PFNEGLCREATEIMAGEPROC) load(userptr, "eglCreateImage");
+ sf_glad_eglCreatePlatformPixmapSurface = (PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) load(userptr, "eglCreatePlatformPixmapSurface");
+ sf_glad_eglCreatePlatformWindowSurface = (PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) load(userptr, "eglCreatePlatformWindowSurface");
+ sf_glad_eglCreateSync = (PFNEGLCREATESYNCPROC) load(userptr, "eglCreateSync");
+ sf_glad_eglDestroyImage = (PFNEGLDESTROYIMAGEPROC) load(userptr, "eglDestroyImage");
+ sf_glad_eglDestroySync = (PFNEGLDESTROYSYNCPROC) load(userptr, "eglDestroySync");
+ sf_glad_eglGetPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYPROC) load(userptr, "eglGetPlatformDisplay");
+ sf_glad_eglGetSyncAttrib = (PFNEGLGETSYNCATTRIBPROC) load(userptr, "eglGetSyncAttrib");
+ sf_glad_eglWaitSync = (PFNEGLWAITSYNCPROC) load(userptr, "eglWaitSync");
+}
+static void sf_glad_egl_load_EGL_KHR_cl_event2( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_EGL_KHR_cl_event2) return;
+ sf_glad_eglCreateSync64KHR = (PFNEGLCREATESYNC64KHRPROC) load(userptr, "eglCreateSync64KHR");
+}
+static void sf_glad_egl_load_EGL_KHR_fence_sync( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_EGL_KHR_fence_sync) return;
+ sf_glad_eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC) load(userptr, "eglClientWaitSyncKHR");
+ sf_glad_eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC) load(userptr, "eglCreateSyncKHR");
+ sf_glad_eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC) load(userptr, "eglDestroySyncKHR");
+ sf_glad_eglGetSyncAttribKHR = (PFNEGLGETSYNCATTRIBKHRPROC) load(userptr, "eglGetSyncAttribKHR");
+}
+static void sf_glad_egl_load_EGL_KHR_image( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_EGL_KHR_image) return;
+ sf_glad_eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) load(userptr, "eglCreateImageKHR");
+ sf_glad_eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC) load(userptr, "eglDestroyImageKHR");
+}
+static void sf_glad_egl_load_EGL_KHR_image_base( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_EGL_KHR_image_base) return;
+ sf_glad_eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) load(userptr, "eglCreateImageKHR");
+ sf_glad_eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC) load(userptr, "eglDestroyImageKHR");
+}
+static void sf_glad_egl_load_EGL_KHR_reusable_sync( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_EGL_KHR_reusable_sync) return;
+ sf_glad_eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC) load(userptr, "eglClientWaitSyncKHR");
+ sf_glad_eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC) load(userptr, "eglCreateSyncKHR");
+ sf_glad_eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC) load(userptr, "eglDestroySyncKHR");
+ sf_glad_eglGetSyncAttribKHR = (PFNEGLGETSYNCATTRIBKHRPROC) load(userptr, "eglGetSyncAttribKHR");
+ sf_glad_eglSignalSyncKHR = (PFNEGLSIGNALSYNCKHRPROC) load(userptr, "eglSignalSyncKHR");
+}
+
+
+static void sf_glad_egl_resolve_aliases(void) {
+ if (sf_glad_eglClientWaitSync == NULL && sf_glad_eglClientWaitSyncKHR != NULL) sf_glad_eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC)sf_glad_eglClientWaitSyncKHR;
+ if (sf_glad_eglClientWaitSyncKHR == NULL && sf_glad_eglClientWaitSync != NULL) sf_glad_eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)sf_glad_eglClientWaitSync;
+ if (sf_glad_eglCreateSync == NULL && sf_glad_eglCreateSync64KHR != NULL) sf_glad_eglCreateSync = (PFNEGLCREATESYNCPROC)sf_glad_eglCreateSync64KHR;
+ if (sf_glad_eglCreateSync64KHR == NULL && sf_glad_eglCreateSync != NULL) sf_glad_eglCreateSync64KHR = (PFNEGLCREATESYNC64KHRPROC)sf_glad_eglCreateSync;
+ if (sf_glad_eglDestroyImage == NULL && sf_glad_eglDestroyImageKHR != NULL) sf_glad_eglDestroyImage = (PFNEGLDESTROYIMAGEPROC)sf_glad_eglDestroyImageKHR;
+ if (sf_glad_eglDestroyImageKHR == NULL && sf_glad_eglDestroyImage != NULL) sf_glad_eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC)sf_glad_eglDestroyImage;
+ if (sf_glad_eglDestroySync == NULL && sf_glad_eglDestroySyncKHR != NULL) sf_glad_eglDestroySync = (PFNEGLDESTROYSYNCPROC)sf_glad_eglDestroySyncKHR;
+ if (sf_glad_eglDestroySyncKHR == NULL && sf_glad_eglDestroySync != NULL) sf_glad_eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)sf_glad_eglDestroySync;
+}
+
+static int sf_glad_egl_get_extensions(EGLDisplay display, const char **extensions) {
+ *extensions = eglQueryString(display, EGL_EXTENSIONS);
+
+ return extensions != NULL;
+}
+
+static int sf_glad_egl_has_extension(const char *extensions, const char *ext) {
+ const char *loc;
+ const char *terminator;
+ if(extensions == NULL) {
+ return 0;
+ }
+ while(1) {
+ loc = strstr(extensions, ext);
+ if(loc == NULL) {
+ return 0;
+ }
+ terminator = loc + strlen(ext);
+ if((loc == extensions || *(loc - 1) == ' ') &&
+ (*terminator == ' ' || *terminator == '\0')) {
+ return 1;
+ }
+ extensions = terminator;
+ }
+}
+
+static GLADapiproc sf_glad_egl_get_proc_from_userptr(void *userptr, const char *name) {
+ return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);
+}
+
+static int sf_glad_egl_find_extensions_egl(EGLDisplay display) {
+ const char *extensions;
+ if (!sf_glad_egl_get_extensions(display, &extensions)) return 0;
+
+ SF_GLAD_EGL_KHR_cl_event2 = sf_glad_egl_has_extension(extensions, "EGL_KHR_cl_event2");
+ SF_GLAD_EGL_KHR_fence_sync = sf_glad_egl_has_extension(extensions, "EGL_KHR_fence_sync");
+ SF_GLAD_EGL_KHR_image = sf_glad_egl_has_extension(extensions, "EGL_KHR_image");
+ SF_GLAD_EGL_KHR_image_base = sf_glad_egl_has_extension(extensions, "EGL_KHR_image_base");
+ SF_GLAD_EGL_KHR_reusable_sync = sf_glad_egl_has_extension(extensions, "EGL_KHR_reusable_sync");
+
+ return 1;
+}
+
+static int sf_glad_egl_find_core_egl(EGLDisplay display) {
+ int major, minor;
+ const char *version;
+
+ if (display == NULL) {
+ display = EGL_NO_DISPLAY; /* this is usually NULL, better safe than sorry */
+ }
+ if (display == EGL_NO_DISPLAY) {
+ display = eglGetCurrentDisplay();
+ }
+#ifdef EGL_VERSION_1_4
+ if (display == EGL_NO_DISPLAY) {
+ display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ }
+#endif
+#ifndef EGL_VERSION_1_5
+ if (display == EGL_NO_DISPLAY) {
+ return 0;
+ }
+#endif
+
+ version = eglQueryString(display, EGL_VERSION);
+ (void) eglGetError();
+
+ if (version == NULL) {
+ major = 1;
+ minor = 0;
+ } else {
+ GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor);
+ }
+
+ SF_GLAD_EGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
+ SF_GLAD_EGL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;
+ SF_GLAD_EGL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1;
+ SF_GLAD_EGL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1;
+ SF_GLAD_EGL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1;
+ SF_GLAD_EGL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1;
+
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+static int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void* userptr) {
+ int version;
+ eglGetDisplay = (PFNEGLGETDISPLAYPROC) load(userptr, "eglGetDisplay");
+ eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load(userptr, "eglGetCurrentDisplay");
+ eglQueryString = (PFNEGLQUERYSTRINGPROC) load(userptr, "eglQueryString");
+ eglGetError = (PFNEGLGETERRORPROC) load(userptr, "eglGetError");
+ if (eglGetDisplay == NULL || eglGetCurrentDisplay == NULL || eglQueryString == NULL || eglGetError == NULL) return 0;
+
+ version = sf_glad_egl_find_core_egl(display);
+ if (!version) return 0;
+ sf_glad_egl_load_EGL_VERSION_1_0(load, userptr);
+ sf_glad_egl_load_EGL_VERSION_1_1(load, userptr);
+ sf_glad_egl_load_EGL_VERSION_1_2(load, userptr);
+ sf_glad_egl_load_EGL_VERSION_1_4(load, userptr);
+ sf_glad_egl_load_EGL_VERSION_1_5(load, userptr);
+
+ if (!sf_glad_egl_find_extensions_egl(display)) return 0;
+ sf_glad_egl_load_EGL_KHR_cl_event2(load, userptr);
+ sf_glad_egl_load_EGL_KHR_fence_sync(load, userptr);
+ sf_glad_egl_load_EGL_KHR_image(load, userptr);
+ sf_glad_egl_load_EGL_KHR_image_base(load, userptr);
+ sf_glad_egl_load_EGL_KHR_reusable_sync(load, userptr);
+
+ sf_glad_egl_resolve_aliases();
+
+ return version;
+}
+
+static int gladLoadEGL(EGLDisplay display, GLADloadfunc load) {
+ return gladLoadEGLUserPtr(display, sf_glad_egl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+
+
+#ifdef SF_GLAD_EGL
+
+#ifndef GLAD_LOADER_LIBRARY_C_
+#define GLAD_LOADER_LIBRARY_C_
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#if GLAD_PLATFORM_WIN32
+#include <windows.h>
+#else
+#include <dlfcn.h>
+#endif
+
+
+static void* glad_get_dlopen_handle(const char *lib_names[], int length) {
+ void *handle = NULL;
+ int i;
+
+ for (i = 0; i < length; ++i) {
+#if GLAD_PLATFORM_WIN32
+ #if GLAD_PLATFORM_UWP
+ size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR);
+ LPWSTR buffer = (LPWSTR) malloc(buffer_size);
+ if (buffer != NULL) {
+ int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size);
+ if (ret != 0) {
+ handle = (void*) LoadPackagedLibrary(buffer, 0);
+ }
+ free((void*) buffer);
+ }
+ #else
+ handle = (void*) LoadLibraryA(lib_names[i]);
+ #endif
+#else
+ handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL);
+#endif
+ if (handle != NULL) {
+ return handle;
+ }
+ }
+
+ return NULL;
+}
+
+static void glad_close_dlopen_handle(void* handle) {
+ if (handle != NULL) {
+#if GLAD_PLATFORM_WIN32
+ FreeLibrary((HMODULE) handle);
+#else
+ dlclose(handle);
+#endif
+ }
+}
+
+static GLADapiproc glad_dlsym_handle(void* handle, const char *name) {
+ if (handle == NULL) {
+ return NULL;
+ }
+
+#if GLAD_PLATFORM_WIN32
+ return (GLADapiproc) GetProcAddress((HMODULE) handle, name);
+#else
+ return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name);
+#endif
+}
+
+#endif /* GLAD_LOADER_LIBRARY_C_ */
+
+struct _sf_glad_egl_userptr {
+ void *handle;
+ PFNEGLGETPROCADDRESSPROC get_proc_address_ptr;
+};
+
+static GLADapiproc sf_glad_egl_get_proc(void *vuserptr, const char* name) {
+ struct _sf_glad_egl_userptr userptr = *(struct _sf_glad_egl_userptr*) vuserptr;
+ GLADapiproc result = NULL;
+
+ result = glad_dlsym_handle(userptr.handle, name);
+ if (result == NULL) {
+ result = GLAD_GNUC_EXTENSION (GLADapiproc) userptr.get_proc_address_ptr(name);
+ }
+
+ return result;
+}
+
+static void* _egl_handle = NULL;
+
+static void* sf_glad_egl_dlopen_handle(void) {
+#if GLAD_PLATFORM_APPLE
+ static const char *NAMES[] = {"libEGL.dylib"};
+#elif GLAD_PLATFORM_WIN32
+ static const char *NAMES[] = {"libEGL.dll", "EGL.dll"};
+#else
+ static const char *NAMES[] = {"libEGL.so.1", "libEGL.so"};
+#endif
+
+ if (_egl_handle == NULL) {
+ _egl_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0]));
+ }
+
+ return _egl_handle;
+}
+
+static struct _sf_glad_egl_userptr sf_glad_egl_build_userptr(void *handle) {
+ struct _sf_glad_egl_userptr userptr;
+ userptr.handle = handle;
+ userptr.get_proc_address_ptr = (PFNEGLGETPROCADDRESSPROC) glad_dlsym_handle(handle, "eglGetProcAddress");
+ return userptr;
+}
+
+static void gladLoaderUnloadEGL() {
+ if (_egl_handle != NULL) {
+ glad_close_dlopen_handle(_egl_handle);
+ _egl_handle = NULL;
+ }
+}
+
+static int gladLoaderLoadEGL(EGLDisplay display) {
+ int version = 0;
+ void *handle = NULL;
+ int did_load = 0;
+ struct _sf_glad_egl_userptr userptr;
+
+ did_load = _egl_handle == NULL;
+ handle = sf_glad_egl_dlopen_handle();
+ if (handle != NULL) {
+ userptr = sf_glad_egl_build_userptr(handle);
+
+ if (userptr.get_proc_address_ptr != NULL) {
+ version = gladLoadEGLUserPtr(display, sf_glad_egl_get_proc, &userptr);
+ }
+
+ if (!version && did_load) {
+ gladLoaderUnloadEGL();
+ }
+ }
+
+ return version;
+}
+
+#endif /* SF_GLAD_EGL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SF_GLAD_EGL_IMPLEMENTATION */
+
diff --git a/extlibs/headers/glad/include/glad/gl.h b/extlibs/headers/glad/include/glad/gl.h
new file mode 100644
index 0000000..6d56850
--- /dev/null
+++ b/extlibs/headers/glad/include/glad/gl.h
@@ -0,0 +1,12248 @@
+/**
+ * Loader generated by glad 2.0.0-beta on Sat Mar 27 13:31:41 2021
+ *
+ * Generator: C/C++
+ * Specification: gl
+ * Extensions: 94
+ *
+ * APIs:
+ * - gl:compatibility=4.6
+ * - gles1:common=1.0
+ *
+ * Options:
+ * - MX_GLOBAL = False
+ * - ON_DEMAND = False
+ * - LOADER = False
+ * - ALIAS = True
+ * - HEADER_ONLY = True
+ * - DEBUG = False
+ * - MX = False
+ *
+ * Commandline:
+ * --merge --api='gl:compatibility=4.6,gles1:common=1.0' --extensions='GL_ARB_ES2_compatibility,GL_ARB_ES3_1_compatibility,GL_ARB_base_instance,GL_ARB_blend_func_extended,GL_ARB_buffer_storage,GL_ARB_clear_buffer_object,GL_ARB_clear_texture,GL_ARB_clip_control,GL_ARB_compute_shader,GL_ARB_copy_buffer,GL_ARB_copy_image,GL_ARB_direct_state_access,GL_ARB_draw_elements_base_vertex,GL_ARB_draw_indirect,GL_ARB_fragment_program,GL_ARB_fragment_shader,GL_ARB_framebuffer_no_attachments,GL_ARB_framebuffer_object,GL_ARB_geometry_shader4,GL_ARB_get_program_binary,GL_ARB_get_texture_sub_image,GL_ARB_gpu_shader_fp64,GL_ARB_imaging,GL_ARB_internalformat_query,GL_ARB_internalformat_query2,GL_ARB_invalidate_subdata,GL_ARB_map_buffer_range,GL_ARB_multi_bind,GL_ARB_multi_draw_indirect,GL_ARB_multitexture,GL_ARB_polygon_offset_clamp,GL_ARB_program_interface_query,GL_ARB_provoking_vertex,GL_ARB_sampler_objects,GL_ARB_separate_shader_objects,GL_ARB_shader_atomic_counters,GL_ARB_shader_image_load_store,GL_ARB_shader_objects,GL_ARB_shader_storage_buffer_object,GL_ARB_shader_subroutine,GL_ARB_shading_language_100,GL_ARB_sync,GL_ARB_tessellation_shader,GL_ARB_texture_barrier,GL_ARB_texture_buffer_range,GL_ARB_texture_multisample,GL_ARB_texture_non_power_of_two,GL_ARB_texture_storage,GL_ARB_texture_storage_multisample,GL_ARB_texture_view,GL_ARB_timer_query,GL_ARB_transform_feedback2,GL_ARB_transform_feedback3,GL_ARB_transform_feedback_instanced,GL_ARB_uniform_buffer_object,GL_ARB_vertex_array_object,GL_ARB_vertex_attrib_64bit,GL_ARB_vertex_attrib_binding,GL_ARB_vertex_buffer_object,GL_ARB_vertex_program,GL_ARB_vertex_shader,GL_ARB_vertex_type_2_10_10_10_rev,GL_ARB_viewport_array,GL_EXT_blend_equation_separate,GL_EXT_blend_func_separate,GL_EXT_blend_minmax,GL_EXT_blend_subtract,GL_EXT_copy_texture,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_EXT_geometry_shader4,GL_EXT_packed_depth_stencil,GL_EXT_subtexture,GL_EXT_texture_array,GL_EXT_texture_object,GL_EXT_texture_sRGB,GL_EXT_vertex_array,GL_INGR_blend_func_separate,GL_KHR_debug,GL_KHR_robustness,GL_NV_geometry_program4,GL_NV_vertex_program,GL_OES_single_precision,GL_SGIS_texture_edge_clamp,GL_EXT_sRGB,GL_OES_blend_equation_separate,GL_OES_blend_func_separate,GL_OES_blend_subtract,GL_OES_depth24,GL_OES_depth32,GL_OES_framebuffer_object,GL_OES_packed_depth_stencil,GL_OES_texture_npot' c --alias --header-only
+ *
+ * Online:
+ * http://gen.glad.sh/#profile=gl%3Dcompatibility%2Cgles1%3Dcommon&api=gl%3D4.6%2Cgles1%3D1.0&extensions=GL_ARB_copy_buffer%2CGL_ARB_fragment_shader%2CGL_ARB_framebuffer_object%2CGL_ARB_geometry_shader4%2CGL_ARB_get_program_binary%2CGL_ARB_imaging%2CGL_ARB_multitexture%2CGL_ARB_separate_shader_objects%2CGL_ARB_shader_objects%2CGL_ARB_shading_language_100%2CGL_ARB_texture_non_power_of_two%2CGL_ARB_vertex_buffer_object%2CGL_ARB_vertex_program%2CGL_ARB_vertex_shader%2CGL_EXT_blend_equation_separate%2CGL_EXT_blend_func_separate%2CGL_EXT_blend_minmax%2CGL_EXT_blend_subtract%2CGL_EXT_copy_texture%2CGL_EXT_framebuffer_blit%2CGL_EXT_framebuffer_multisample%2CGL_EXT_framebuffer_object%2CGL_EXT_geometry_shader4%2CGL_EXT_packed_depth_stencil%2CGL_EXT_sRGB%2CGL_EXT_subtexture%2CGL_EXT_texture_array%2CGL_EXT_texture_object%2CGL_EXT_texture_sRGB%2CGL_EXT_vertex_array%2CGL_INGR_blend_func_separate%2CGL_KHR_debug%2CGL_NV_geometry_program4%2CGL_NV_vertex_program%2CGL_OES_blend_equation_separate%2CGL_OES_blend_func_separate%2CGL_OES_blend_subtract%2CGL_OES_depth24%2CGL_OES_depth32%2CGL_OES_framebuffer_object%2CGL_OES_packed_depth_stencil%2CGL_OES_single_precision%2CGL_OES_texture_npot%2CGL_SGIS_texture_edge_clamp&options=ALIAS%2CALIAS%2CHEADER_ONLY%2CMERGE%2CMERGE&generator=c
+ *
+ */
+
+#ifndef SF_GLAD_GL_H_
+#define SF_GLAD_GL_H_
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wreserved-id-macro"
+#endif
+#ifdef __gl_h_
+ #error OpenGL (gl.h) header already included (API: gl), remove previous include!
+#endif
+#define __gl_h_ 1
+#ifdef __gl3_h_
+ #error OpenGL (gl3.h) header already included (API: gl), remove previous include!
+#endif
+#define __gl3_h_ 1
+#ifdef __glext_h_
+ #error OpenGL (glext.h) header already included (API: gl), remove previous include!
+#endif
+#define __glext_h_ 1
+#ifdef __gl3ext_h_
+ #error OpenGL (gl3ext.h) header already included (API: gl), remove previous include!
+#endif
+#define __gl3ext_h_ 1
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+#define SF_GLAD_GL
+#define GLAD_OPTION_GL_ALIAS
+#define GLAD_OPTION_GL_HEADER_ONLY
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef GLAD_PLATFORM_H_
+#define GLAD_PLATFORM_H_
+
+#ifndef GLAD_PLATFORM_WIN32
+ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)
+ #define GLAD_PLATFORM_WIN32 1
+ #else
+ #define GLAD_PLATFORM_WIN32 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_APPLE
+ #ifdef __APPLE__
+ #define GLAD_PLATFORM_APPLE 1
+ #else
+ #define GLAD_PLATFORM_APPLE 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_EMSCRIPTEN
+ #ifdef __EMSCRIPTEN__
+ #define GLAD_PLATFORM_EMSCRIPTEN 1
+ #else
+ #define GLAD_PLATFORM_EMSCRIPTEN 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_UWP
+ #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY)
+ #ifdef __has_include
+ #if __has_include(<winapifamily.h>)
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #endif
+
+ #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY
+ #include <winapifamily.h>
+ #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ #define GLAD_PLATFORM_UWP 1
+ #endif
+ #endif
+
+ #ifndef GLAD_PLATFORM_UWP
+ #define GLAD_PLATFORM_UWP 0
+ #endif
+#endif
+
+#ifdef __GNUC__
+ #define GLAD_GNUC_EXTENSION __extension__
+#else
+ #define GLAD_GNUC_EXTENSION
+#endif
+
+#ifndef GLAD_API_CALL
+ #if defined(GLAD_API_CALL_EXPORT)
+ #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__)
+ #if defined(GLAD_API_CALL_EXPORT_BUILD)
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllexport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllexport) extern
+ #endif
+ #else
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllimport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllimport) extern
+ #endif
+ #endif
+ #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD)
+ #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+#endif
+
+#ifdef APIENTRY
+ #define GLAD_API_PTR APIENTRY
+#elif GLAD_PLATFORM_WIN32
+ #define GLAD_API_PTR __stdcall
+#else
+ #define GLAD_API_PTR
+#endif
+
+#ifndef GLAPI
+#define GLAPI GLAD_API_CALL
+#endif
+
+#ifndef GLAPIENTRY
+#define GLAPIENTRY GLAD_API_PTR
+#endif
+
+#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor)
+#define GLAD_VERSION_MAJOR(version) (version / 10000)
+#define GLAD_VERSION_MINOR(version) (version % 10000)
+
+#define GLAD_GENERATOR_VERSION "2.0.0-beta"
+
+typedef void (*GLADapiproc)(void);
+
+typedef GLADapiproc (*GLADloadfunc)(const char *name);
+typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name);
+
+typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...);
+typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...);
+
+#endif /* GLAD_PLATFORM_H_ */
+
+#define GL_2D 0x0600
+#define GL_2_BYTES 0x1407
+#define GL_3D 0x0601
+#define GL_3D_COLOR 0x0602
+#define GL_3D_COLOR_TEXTURE 0x0603
+#define GL_3_BYTES 0x1408
+#define GL_4D_COLOR_TEXTURE 0x0604
+#define GL_4_BYTES 0x1409
+#define GL_ACCUM 0x0100
+#define GL_ACCUM_ALPHA_BITS 0x0D5B
+#define GL_ACCUM_BLUE_BITS 0x0D5A
+#define GL_ACCUM_BUFFER_BIT 0x00000200
+#define GL_ACCUM_CLEAR_VALUE 0x0B80
+#define GL_ACCUM_GREEN_BITS 0x0D59
+#define GL_ACCUM_RED_BITS 0x0D58
+#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9
+#define GL_ACTIVE_ATTRIBUTES 0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
+#define GL_ACTIVE_PROGRAM 0x8259
+#define GL_ACTIVE_RESOURCES 0x92F5
+#define GL_ACTIVE_SUBROUTINES 0x8DE5
+#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48
+#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6
+#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47
+#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_ACTIVE_TEXTURE_ARB 0x84E0
+#define GL_ACTIVE_UNIFORMS 0x8B86
+#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
+#define GL_ACTIVE_VARIABLES 0x9305
+#define GL_ADD 0x0104
+#define GL_ADD_SIGNED 0x8574
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF
+#define GL_ALL_BARRIER_BITS 0xFFFFFFFF
+#define GL_ALL_SHADER_BITS 0xFFFFFFFF
+#define GL_ALPHA 0x1906
+#define GL_ALPHA12 0x803D
+#define GL_ALPHA16 0x803E
+#define GL_ALPHA4 0x803B
+#define GL_ALPHA8 0x803C
+#define GL_ALPHA_BIAS 0x0D1D
+#define GL_ALPHA_BITS 0x0D55
+#define GL_ALPHA_INTEGER 0x8D97
+#define GL_ALPHA_SCALE 0x0D1C
+#define GL_ALPHA_TEST 0x0BC0
+#define GL_ALPHA_TEST_FUNC 0x0BC1
+#define GL_ALPHA_TEST_REF 0x0BC2
+#define GL_ALREADY_SIGNALED 0x911A
+#define GL_ALWAYS 0x0207
+#define GL_AMBIENT 0x1200
+#define GL_AMBIENT_AND_DIFFUSE 0x1602
+#define GL_AND 0x1501
+#define GL_AND_INVERTED 0x1504
+#define GL_AND_REVERSE 0x1502
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ARRAY_BUFFER_ARB 0x8892
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894
+#define GL_ARRAY_SIZE 0x92FB
+#define GL_ARRAY_STRIDE 0x92FE
+#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000
+#define GL_ATOMIC_COUNTER_BUFFER 0x92C0
+#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5
+#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6
+#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1
+#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4
+#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7
+#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3
+#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2
+#define GL_ATTACHED_SHADERS 0x8B85
+#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645
+#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623
+#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624
+#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625
+#define GL_ATTRIB_STACK_DEPTH 0x0BB0
+#define GL_AUTO_GENERATE_MIPMAP 0x8295
+#define GL_AUTO_NORMAL 0x0D80
+#define GL_AUX0 0x0409
+#define GL_AUX1 0x040A
+#define GL_AUX2 0x040B
+#define GL_AUX3 0x040C
+#define GL_AUX_BUFFERS 0x0C00
+#define GL_BACK 0x0405
+#define GL_BACK_LEFT 0x0402
+#define GL_BACK_RIGHT 0x0403
+#define GL_BGR 0x80E0
+#define GL_BGRA 0x80E1
+#define GL_BGRA_INTEGER 0x8D9B
+#define GL_BGR_INTEGER 0x8D9A
+#define GL_BITMAP 0x1A00
+#define GL_BITMAP_TOKEN 0x0704
+#define GL_BLEND 0x0BE2
+#define GL_BLEND_COLOR 0x8005
+#define GL_BLEND_DST 0x0BE0
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_BLEND_DST_ALPHA_EXT 0x80CA
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_DST_RGB_EXT 0x80C8
+#define GL_BLEND_EQUATION 0x8009
+#define GL_BLEND_EQUATION_ALPHA 0x883D
+#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D
+#define GL_BLEND_EQUATION_EXT 0x8009
+#define GL_BLEND_EQUATION_RGB 0x8009
+#define GL_BLEND_EQUATION_RGB_EXT 0x8009
+#define GL_BLEND_SRC 0x0BE1
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_BLEND_SRC_ALPHA_EXT 0x80CB
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_SRC_RGB_EXT 0x80C9
+#define GL_BLOCK_INDEX 0x92FD
+#define GL_BLUE 0x1905
+#define GL_BLUE_BIAS 0x0D1B
+#define GL_BLUE_BITS 0x0D54
+#define GL_BLUE_INTEGER 0x8D96
+#define GL_BLUE_SCALE 0x0D1A
+#define GL_BOOL 0x8B56
+#define GL_BOOL_ARB 0x8B56
+#define GL_BOOL_VEC2 0x8B57
+#define GL_BOOL_VEC2_ARB 0x8B57
+#define GL_BOOL_VEC3 0x8B58
+#define GL_BOOL_VEC3_ARB 0x8B58
+#define GL_BOOL_VEC4 0x8B59
+#define GL_BOOL_VEC4_ARB 0x8B59
+#define GL_BUFFER 0x82E0
+#define GL_BUFFER_ACCESS 0x88BB
+#define GL_BUFFER_ACCESS_ARB 0x88BB
+#define GL_BUFFER_ACCESS_FLAGS 0x911F
+#define GL_BUFFER_BINDING 0x9302
+#define GL_BUFFER_DATA_SIZE 0x9303
+#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F
+#define GL_BUFFER_MAPPED 0x88BC
+#define GL_BUFFER_MAPPED_ARB 0x88BC
+#define GL_BUFFER_MAP_LENGTH 0x9120
+#define GL_BUFFER_MAP_OFFSET 0x9121
+#define GL_BUFFER_MAP_POINTER 0x88BD
+#define GL_BUFFER_MAP_POINTER_ARB 0x88BD
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_SIZE_ARB 0x8764
+#define GL_BUFFER_STORAGE_FLAGS 0x8220
+#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200
+#define GL_BUFFER_USAGE 0x8765
+#define GL_BUFFER_USAGE_ARB 0x8765
+#define GL_BUFFER_VARIABLE 0x92E5
+#define GL_BYTE 0x1400
+#define GL_C3F_V3F 0x2A24
+#define GL_C4F_N3F_V3F 0x2A26
+#define GL_C4UB_V2F 0x2A22
+#define GL_C4UB_V3F 0x2A23
+#define GL_CAVEAT_SUPPORT 0x82B8
+#define GL_CCW 0x0901
+#define GL_CLAMP 0x2900
+#define GL_CLAMP_FRAGMENT_COLOR 0x891B
+#define GL_CLAMP_READ_COLOR 0x891C
+#define GL_CLAMP_TO_BORDER 0x812D
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_CLAMP_TO_EDGE_SGIS 0x812F
+#define GL_CLAMP_VERTEX_COLOR 0x891A
+#define GL_CLEAR 0x1500
+#define GL_CLEAR_BUFFER 0x82B4
+#define GL_CLEAR_TEXTURE 0x9365
+#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1
+#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
+#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF
+#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1
+#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000
+#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
+#define GL_CLIENT_STORAGE_BIT 0x0200
+#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
+#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6
+#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7
+#define GL_CLIP_DEPTH_MODE 0x935D
+#define GL_CLIP_DISTANCE0 0x3000
+#define GL_CLIP_DISTANCE1 0x3001
+#define GL_CLIP_DISTANCE2 0x3002
+#define GL_CLIP_DISTANCE3 0x3003
+#define GL_CLIP_DISTANCE4 0x3004
+#define GL_CLIP_DISTANCE5 0x3005
+#define GL_CLIP_DISTANCE6 0x3006
+#define GL_CLIP_DISTANCE7 0x3007
+#define GL_CLIP_ORIGIN 0x935C
+#define GL_CLIP_PLANE0 0x3000
+#define GL_CLIP_PLANE1 0x3001
+#define GL_CLIP_PLANE2 0x3002
+#define GL_CLIP_PLANE3 0x3003
+#define GL_CLIP_PLANE4 0x3004
+#define GL_CLIP_PLANE5 0x3005
+#define GL_COEFF 0x0A00
+#define GL_COLOR 0x1800
+#define GL_COLOR_ARRAY 0x8076
+#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
+#define GL_COLOR_ARRAY_COUNT_EXT 0x8084
+#define GL_COLOR_ARRAY_EXT 0x8076
+#define GL_COLOR_ARRAY_POINTER 0x8090
+#define GL_COLOR_ARRAY_POINTER_EXT 0x8090
+#define GL_COLOR_ARRAY_SIZE 0x8081
+#define GL_COLOR_ARRAY_SIZE_EXT 0x8081
+#define GL_COLOR_ARRAY_STRIDE 0x8083
+#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083
+#define GL_COLOR_ARRAY_TYPE 0x8082
+#define GL_COLOR_ARRAY_TYPE_EXT 0x8082
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT13_EXT 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
+#define GL_COLOR_ATTACHMENT16 0x8CF0
+#define GL_COLOR_ATTACHMENT17 0x8CF1
+#define GL_COLOR_ATTACHMENT18 0x8CF2
+#define GL_COLOR_ATTACHMENT19 0x8CF3
+#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT20 0x8CF4
+#define GL_COLOR_ATTACHMENT21 0x8CF5
+#define GL_COLOR_ATTACHMENT22 0x8CF6
+#define GL_COLOR_ATTACHMENT23 0x8CF7
+#define GL_COLOR_ATTACHMENT24 0x8CF8
+#define GL_COLOR_ATTACHMENT25 0x8CF9
+#define GL_COLOR_ATTACHMENT26 0x8CFA
+#define GL_COLOR_ATTACHMENT27 0x8CFB
+#define GL_COLOR_ATTACHMENT28 0x8CFC
+#define GL_COLOR_ATTACHMENT29 0x8CFD
+#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT30 0x8CFE
+#define GL_COLOR_ATTACHMENT31 0x8CFF
+#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_COMPONENTS 0x8283
+#define GL_COLOR_ENCODING 0x8296
+#define GL_COLOR_INDEX 0x1900
+#define GL_COLOR_INDEXES 0x1603
+#define GL_COLOR_LOGIC_OP 0x0BF2
+#define GL_COLOR_MATERIAL 0x0B57
+#define GL_COLOR_MATERIAL_FACE 0x0B55
+#define GL_COLOR_MATERIAL_PARAMETER 0x0B56
+#define GL_COLOR_MATRIX 0x80B1
+#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2
+#define GL_COLOR_RENDERABLE 0x8286
+#define GL_COLOR_SUM 0x8458
+#define GL_COLOR_SUM_ARB 0x8458
+#define GL_COLOR_TABLE 0x80D0
+#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD
+#define GL_COLOR_TABLE_BIAS 0x80D7
+#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC
+#define GL_COLOR_TABLE_FORMAT 0x80D8
+#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB
+#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF
+#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE
+#define GL_COLOR_TABLE_RED_SIZE 0x80DA
+#define GL_COLOR_TABLE_SCALE 0x80D6
+#define GL_COLOR_TABLE_WIDTH 0x80D9
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_COMBINE 0x8570
+#define GL_COMBINE_ALPHA 0x8572
+#define GL_COMBINE_RGB 0x8571
+#define GL_COMMAND_BARRIER_BIT 0x00000040
+#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E
+#define GL_COMPARE_REF_TO_TEXTURE 0x884E
+#define GL_COMPARE_R_TO_TEXTURE 0x884E
+#define GL_COMPATIBLE_SUBROUTINES 0x8E4B
+#define GL_COMPILE 0x1300
+#define GL_COMPILE_AND_EXECUTE 0x1301
+#define GL_COMPILE_STATUS 0x8B81
+#define GL_COMPRESSED_ALPHA 0x84E9
+#define GL_COMPRESSED_INTENSITY 0x84EC
+#define GL_COMPRESSED_LUMINANCE 0x84EA
+#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB
+#define GL_COMPRESSED_R11_EAC 0x9270
+#define GL_COMPRESSED_RED 0x8225
+#define GL_COMPRESSED_RED_RGTC1 0x8DBB
+#define GL_COMPRESSED_RG 0x8226
+#define GL_COMPRESSED_RG11_EAC 0x9272
+#define GL_COMPRESSED_RGB 0x84ED
+#define GL_COMPRESSED_RGB8_ETC2 0x9274
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_RGBA 0x84EE
+#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
+#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C
+#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E
+#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F
+#define GL_COMPRESSED_RG_RGTC2 0x8DBD
+#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
+#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC
+#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
+#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE
+#define GL_COMPRESSED_SLUMINANCE 0x8C4A
+#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B
+#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B
+#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A
+#define GL_COMPRESSED_SRGB 0x8C48
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_COMPRESSED_SRGB8_ETC2 0x9275
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_SRGB_ALPHA 0x8C49
+#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D
+#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
+#define GL_COMPRESSED_SRGB_EXT 0x8C48
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_COMPUTE_SHADER 0x91B9
+#define GL_COMPUTE_SHADER_BIT 0x00000020
+#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5
+#define GL_COMPUTE_SUBROUTINE 0x92ED
+#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3
+#define GL_COMPUTE_TEXTURE 0x82A0
+#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267
+#define GL_CONDITION_SATISFIED 0x911C
+#define GL_CONSTANT 0x8576
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_CONSTANT_ATTENUATION 0x1207
+#define GL_CONSTANT_BORDER 0x8151
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
+#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
+#define GL_CONTEXT_FLAGS 0x821E
+#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
+#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001
+#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008
+#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004
+#define GL_CONTEXT_LOST 0x0507
+#define GL_CONTEXT_PROFILE_MASK 0x9126
+#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB
+#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC
+#define GL_CONTEXT_ROBUST_ACCESS 0x90F3
+#define GL_CONVOLUTION_1D 0x8010
+#define GL_CONVOLUTION_2D 0x8011
+#define GL_CONVOLUTION_BORDER_COLOR 0x8154
+#define GL_CONVOLUTION_BORDER_MODE 0x8013
+#define GL_CONVOLUTION_FILTER_BIAS 0x8015
+#define GL_CONVOLUTION_FILTER_SCALE 0x8014
+#define GL_CONVOLUTION_FORMAT 0x8017
+#define GL_CONVOLUTION_HEIGHT 0x8019
+#define GL_CONVOLUTION_WIDTH 0x8018
+#define GL_COORD_REPLACE 0x8862
+#define GL_COPY 0x1503
+#define GL_COPY_INVERTED 0x150C
+#define GL_COPY_PIXEL_TOKEN 0x0706
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_READ_BUFFER_BINDING 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37
+#define GL_CULL_FACE 0x0B44
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_CURRENT_ATTRIB_NV 0x8626
+#define GL_CURRENT_BIT 0x00000001
+#define GL_CURRENT_COLOR 0x0B00
+#define GL_CURRENT_FOG_COORD 0x8453
+#define GL_CURRENT_FOG_COORDINATE 0x8453
+#define GL_CURRENT_INDEX 0x0B01
+#define GL_CURRENT_MATRIX_ARB 0x8641
+#define GL_CURRENT_MATRIX_NV 0x8641
+#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
+#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640
+#define GL_CURRENT_NORMAL 0x0B02
+#define GL_CURRENT_PROGRAM 0x8B8D
+#define GL_CURRENT_QUERY 0x8865
+#define GL_CURRENT_RASTER_COLOR 0x0B04
+#define GL_CURRENT_RASTER_DISTANCE 0x0B09
+#define GL_CURRENT_RASTER_INDEX 0x0B05
+#define GL_CURRENT_RASTER_POSITION 0x0B07
+#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08
+#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F
+#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06
+#define GL_CURRENT_SECONDARY_COLOR 0x8459
+#define GL_CURRENT_TEXTURE_COORDS 0x0B03
+#define GL_CURRENT_VERTEX_ATTRIB 0x8626
+#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
+#define GL_CW 0x0900
+#define GL_DEBUG_CALLBACK_FUNCTION 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
+#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
+#define GL_DEBUG_LOGGED_MESSAGES 0x9145
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
+#define GL_DEBUG_OUTPUT 0x92E0
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
+#define GL_DEBUG_SEVERITY_HIGH 0x9146
+#define GL_DEBUG_SEVERITY_LOW 0x9148
+#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
+#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
+#define GL_DEBUG_SOURCE_API 0x8246
+#define GL_DEBUG_SOURCE_APPLICATION 0x824A
+#define GL_DEBUG_SOURCE_OTHER 0x824B
+#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
+#define GL_DEBUG_TYPE_ERROR 0x824C
+#define GL_DEBUG_TYPE_MARKER 0x8268
+#define GL_DEBUG_TYPE_OTHER 0x8251
+#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
+#define GL_DEBUG_TYPE_POP_GROUP 0x826A
+#define GL_DEBUG_TYPE_PORTABILITY 0x824F
+#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
+#define GL_DECAL 0x2101
+#define GL_DECR 0x1E03
+#define GL_DECR_WRAP 0x8508
+#define GL_DELETE_STATUS 0x8B80
+#define GL_DEPTH 0x1801
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_DEPTH24_STENCIL8_EXT 0x88F0
+#define GL_DEPTH32F_STENCIL8 0x8CAD
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_DEPTH_ATTACHMENT_EXT 0x8D00
+#define GL_DEPTH_BIAS 0x0D1F
+#define GL_DEPTH_BITS 0x0D56
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_DEPTH_CLAMP 0x864F
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_DEPTH_COMPONENT16 0x81A5
+#define GL_DEPTH_COMPONENT24 0x81A6
+#define GL_DEPTH_COMPONENT32 0x81A7
+#define GL_DEPTH_COMPONENT32F 0x8CAC
+#define GL_DEPTH_COMPONENTS 0x8284
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_RENDERABLE 0x8287
+#define GL_DEPTH_SCALE 0x0D1E
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_DEPTH_STENCIL_EXT 0x84F9
+#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA
+#define GL_DEPTH_TEST 0x0B71
+#define GL_DEPTH_TEXTURE_MODE 0x884B
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DIFFUSE 0x1201
+#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE
+#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF
+#define GL_DISPLAY_LIST 0x82E7
+#define GL_DITHER 0x0BD0
+#define GL_DOMAIN 0x0A02
+#define GL_DONT_CARE 0x1100
+#define GL_DOT3_RGB 0x86AE
+#define GL_DOT3_RGBA 0x86AF
+#define GL_DOUBLE 0x140A
+#define GL_DOUBLEBUFFER 0x0C32
+#define GL_DOUBLE_MAT2 0x8F46
+#define GL_DOUBLE_MAT2x3 0x8F49
+#define GL_DOUBLE_MAT2x4 0x8F4A
+#define GL_DOUBLE_MAT3 0x8F47
+#define GL_DOUBLE_MAT3x2 0x8F4B
+#define GL_DOUBLE_MAT3x4 0x8F4C
+#define GL_DOUBLE_MAT4 0x8F48
+#define GL_DOUBLE_MAT4x2 0x8F4D
+#define GL_DOUBLE_MAT4x3 0x8F4E
+#define GL_DOUBLE_VEC2 0x8FFC
+#define GL_DOUBLE_VEC3 0x8FFD
+#define GL_DOUBLE_VEC4 0x8FFE
+#define GL_DRAW_BUFFER 0x0C01
+#define GL_DRAW_BUFFER0 0x8825
+#define GL_DRAW_BUFFER1 0x8826
+#define GL_DRAW_BUFFER10 0x882F
+#define GL_DRAW_BUFFER11 0x8830
+#define GL_DRAW_BUFFER12 0x8831
+#define GL_DRAW_BUFFER13 0x8832
+#define GL_DRAW_BUFFER14 0x8833
+#define GL_DRAW_BUFFER15 0x8834
+#define GL_DRAW_BUFFER2 0x8827
+#define GL_DRAW_BUFFER3 0x8828
+#define GL_DRAW_BUFFER4 0x8829
+#define GL_DRAW_BUFFER5 0x882A
+#define GL_DRAW_BUFFER6 0x882B
+#define GL_DRAW_BUFFER7 0x882C
+#define GL_DRAW_BUFFER8 0x882D
+#define GL_DRAW_BUFFER9 0x882E
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
+#define GL_DRAW_INDIRECT_BUFFER 0x8F3F
+#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43
+#define GL_DRAW_PIXEL_TOKEN 0x0705
+#define GL_DST_ALPHA 0x0304
+#define GL_DST_COLOR 0x0306
+#define GL_DYNAMIC_COPY 0x88EA
+#define GL_DYNAMIC_COPY_ARB 0x88EA
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_DYNAMIC_DRAW_ARB 0x88E8
+#define GL_DYNAMIC_READ 0x88E9
+#define GL_DYNAMIC_READ_ARB 0x88E9
+#define GL_DYNAMIC_STORAGE_BIT 0x0100
+#define GL_EDGE_FLAG 0x0B43
+#define GL_EDGE_FLAG_ARRAY 0x8079
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B
+#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D
+#define GL_EDGE_FLAG_ARRAY_EXT 0x8079
+#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
+#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093
+#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C
+#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C
+#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
+#define GL_EMISSION 0x1600
+#define GL_ENABLE_BIT 0x00002000
+#define GL_EQUAL 0x0202
+#define GL_EQUIV 0x1509
+#define GL_EVAL_BIT 0x00010000
+#define GL_EXP 0x0800
+#define GL_EXP2 0x0801
+#define GL_EXTENSIONS 0x1F03
+#define GL_EYE_LINEAR 0x2400
+#define GL_EYE_PLANE 0x2502
+#define GL_FALSE 0
+#define GL_FASTEST 0x1101
+#define GL_FEEDBACK 0x1C01
+#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0
+#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1
+#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2
+#define GL_FILL 0x1B02
+#define GL_FILTER 0x829A
+#define GL_FIRST_VERTEX_CONVENTION 0x8E4D
+#define GL_FIXED 0x140C
+#define GL_FIXED_ONLY 0x891D
+#define GL_FLAT 0x1D00
+#define GL_FLOAT 0x1406
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_FLOAT_MAT2 0x8B5A
+#define GL_FLOAT_MAT2_ARB 0x8B5A
+#define GL_FLOAT_MAT2x3 0x8B65
+#define GL_FLOAT_MAT2x4 0x8B66
+#define GL_FLOAT_MAT3 0x8B5B
+#define GL_FLOAT_MAT3_ARB 0x8B5B
+#define GL_FLOAT_MAT3x2 0x8B67
+#define GL_FLOAT_MAT3x4 0x8B68
+#define GL_FLOAT_MAT4 0x8B5C
+#define GL_FLOAT_MAT4_ARB 0x8B5C
+#define GL_FLOAT_MAT4x2 0x8B69
+#define GL_FLOAT_MAT4x3 0x8B6A
+#define GL_FLOAT_VEC2 0x8B50
+#define GL_FLOAT_VEC2_ARB 0x8B50
+#define GL_FLOAT_VEC3 0x8B51
+#define GL_FLOAT_VEC3_ARB 0x8B51
+#define GL_FLOAT_VEC4 0x8B52
+#define GL_FLOAT_VEC4_ARB 0x8B52
+#define GL_FOG 0x0B60
+#define GL_FOG_BIT 0x00000080
+#define GL_FOG_COLOR 0x0B66
+#define GL_FOG_COORD 0x8451
+#define GL_FOG_COORDINATE 0x8451
+#define GL_FOG_COORDINATE_ARRAY 0x8457
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D
+#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456
+#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455
+#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454
+#define GL_FOG_COORDINATE_SOURCE 0x8450
+#define GL_FOG_COORD_ARRAY 0x8457
+#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D
+#define GL_FOG_COORD_ARRAY_POINTER 0x8456
+#define GL_FOG_COORD_ARRAY_STRIDE 0x8455
+#define GL_FOG_COORD_ARRAY_TYPE 0x8454
+#define GL_FOG_COORD_SRC 0x8450
+#define GL_FOG_DENSITY 0x0B62
+#define GL_FOG_END 0x0B64
+#define GL_FOG_HINT 0x0C54
+#define GL_FOG_INDEX 0x0B61
+#define GL_FOG_MODE 0x0B65
+#define GL_FOG_START 0x0B63
+#define GL_FRACTIONAL_EVEN 0x8E7C
+#define GL_FRACTIONAL_ODD 0x8E7B
+#define GL_FRAGMENT_DEPTH 0x8452
+#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D
+#define GL_FRAGMENT_PROGRAM_ARB 0x8804
+#define GL_FRAGMENT_SHADER 0x8B30
+#define GL_FRAGMENT_SHADER_ARB 0x8B30
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B
+#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4
+#define GL_FRAGMENT_SUBROUTINE 0x92EC
+#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2
+#define GL_FRAGMENT_TEXTURE 0x829F
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
+#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_FRAMEBUFFER_BLEND 0x828B
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314
+#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311
+#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312
+#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313
+#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310
+#define GL_FRAMEBUFFER_EXT 0x8D40
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
+#define GL_FRAMEBUFFER_RENDERABLE 0x8289
+#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A
+#define GL_FRAMEBUFFER_SRGB 0x8DB9
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
+#define GL_FRONT 0x0404
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_FRONT_FACE 0x0B46
+#define GL_FRONT_LEFT 0x0400
+#define GL_FRONT_RIGHT 0x0401
+#define GL_FULL_SUPPORT 0x82B7
+#define GL_FUNC_ADD 0x8006
+#define GL_FUNC_ADD_EXT 0x8006
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_SUBTRACT_EXT 0x800A
+#define GL_GENERATE_MIPMAP 0x8191
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_GEOMETRY_INPUT_TYPE 0x8917
+#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB
+#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB
+#define GL_GEOMETRY_OUTPUT_TYPE 0x8918
+#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC
+#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC
+#define GL_GEOMETRY_PROGRAM_NV 0x8C26
+#define GL_GEOMETRY_SHADER 0x8DD9
+#define GL_GEOMETRY_SHADER_ARB 0x8DD9
+#define GL_GEOMETRY_SHADER_BIT 0x00000004
+#define GL_GEOMETRY_SHADER_EXT 0x8DD9
+#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F
+#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3
+#define GL_GEOMETRY_SUBROUTINE 0x92EB
+#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1
+#define GL_GEOMETRY_TEXTURE 0x829E
+#define GL_GEOMETRY_VERTICES_OUT 0x8916
+#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA
+#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA
+#define GL_GEQUAL 0x0206
+#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291
+#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292
+#define GL_GREATER 0x0204
+#define GL_GREEN 0x1904
+#define GL_GREEN_BIAS 0x0D19
+#define GL_GREEN_BITS 0x0D53
+#define GL_GREEN_INTEGER 0x8D95
+#define GL_GREEN_SCALE 0x0D18
+#define GL_GUILTY_CONTEXT_RESET 0x8253
+#define GL_HALF_FLOAT 0x140B
+#define GL_HIGH_FLOAT 0x8DF2
+#define GL_HIGH_INT 0x8DF5
+#define GL_HINT_BIT 0x00008000
+#define GL_HISTOGRAM 0x8024
+#define GL_HISTOGRAM_ALPHA_SIZE 0x802B
+#define GL_HISTOGRAM_BLUE_SIZE 0x802A
+#define GL_HISTOGRAM_FORMAT 0x8027
+#define GL_HISTOGRAM_GREEN_SIZE 0x8029
+#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C
+#define GL_HISTOGRAM_RED_SIZE 0x8028
+#define GL_HISTOGRAM_SINK 0x802D
+#define GL_HISTOGRAM_WIDTH 0x8026
+#define GL_IDENTITY_NV 0x862A
+#define GL_IMAGE_1D 0x904C
+#define GL_IMAGE_1D_ARRAY 0x9052
+#define GL_IMAGE_2D 0x904D
+#define GL_IMAGE_2D_ARRAY 0x9053
+#define GL_IMAGE_2D_MULTISAMPLE 0x9055
+#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056
+#define GL_IMAGE_2D_RECT 0x904F
+#define GL_IMAGE_3D 0x904E
+#define GL_IMAGE_BINDING_ACCESS 0x8F3E
+#define GL_IMAGE_BINDING_FORMAT 0x906E
+#define GL_IMAGE_BINDING_LAYER 0x8F3D
+#define GL_IMAGE_BINDING_LAYERED 0x8F3C
+#define GL_IMAGE_BINDING_LEVEL 0x8F3B
+#define GL_IMAGE_BINDING_NAME 0x8F3A
+#define GL_IMAGE_BUFFER 0x9051
+#define GL_IMAGE_CLASS_10_10_10_2 0x82C3
+#define GL_IMAGE_CLASS_11_11_10 0x82C2
+#define GL_IMAGE_CLASS_1_X_16 0x82BE
+#define GL_IMAGE_CLASS_1_X_32 0x82BB
+#define GL_IMAGE_CLASS_1_X_8 0x82C1
+#define GL_IMAGE_CLASS_2_X_16 0x82BD
+#define GL_IMAGE_CLASS_2_X_32 0x82BA
+#define GL_IMAGE_CLASS_2_X_8 0x82C0
+#define GL_IMAGE_CLASS_4_X_16 0x82BC
+#define GL_IMAGE_CLASS_4_X_32 0x82B9
+#define GL_IMAGE_CLASS_4_X_8 0x82BF
+#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8
+#define GL_IMAGE_CUBE 0x9050
+#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8
+#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7
+#define GL_IMAGE_PIXEL_FORMAT 0x82A9
+#define GL_IMAGE_PIXEL_TYPE 0x82AA
+#define GL_IMAGE_TEXEL_SIZE 0x82A7
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_INCR 0x1E02
+#define GL_INCR_WRAP 0x8507
+#define GL_INDEX 0x8222
+#define GL_INDEX_ARRAY 0x8077
+#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
+#define GL_INDEX_ARRAY_COUNT_EXT 0x8087
+#define GL_INDEX_ARRAY_EXT 0x8077
+#define GL_INDEX_ARRAY_POINTER 0x8091
+#define GL_INDEX_ARRAY_POINTER_EXT 0x8091
+#define GL_INDEX_ARRAY_STRIDE 0x8086
+#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086
+#define GL_INDEX_ARRAY_TYPE 0x8085
+#define GL_INDEX_ARRAY_TYPE_EXT 0x8085
+#define GL_INDEX_BITS 0x0D51
+#define GL_INDEX_CLEAR_VALUE 0x0C20
+#define GL_INDEX_LOGIC_OP 0x0BF1
+#define GL_INDEX_MODE 0x0C30
+#define GL_INDEX_OFFSET 0x0D13
+#define GL_INDEX_SHIFT 0x0D12
+#define GL_INDEX_WRITEMASK 0x0C21
+#define GL_INFO_LOG_LENGTH 0x8B84
+#define GL_INNOCENT_CONTEXT_RESET 0x8254
+#define GL_INT 0x1404
+#define GL_INTENSITY 0x8049
+#define GL_INTENSITY12 0x804C
+#define GL_INTENSITY16 0x804D
+#define GL_INTENSITY4 0x804A
+#define GL_INTENSITY8 0x804B
+#define GL_INTERLEAVED_ATTRIBS 0x8C8C
+#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274
+#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B
+#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273
+#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A
+#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275
+#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C
+#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272
+#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279
+#define GL_INTERNALFORMAT_PREFERRED 0x8270
+#define GL_INTERNALFORMAT_RED_SIZE 0x8271
+#define GL_INTERNALFORMAT_RED_TYPE 0x8278
+#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277
+#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276
+#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D
+#define GL_INTERNALFORMAT_SUPPORTED 0x826F
+#define GL_INTERPOLATE 0x8575
+#define GL_INT_2_10_10_10_REV 0x8D9F
+#define GL_INT_IMAGE_1D 0x9057
+#define GL_INT_IMAGE_1D_ARRAY 0x905D
+#define GL_INT_IMAGE_2D 0x9058
+#define GL_INT_IMAGE_2D_ARRAY 0x905E
+#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060
+#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061
+#define GL_INT_IMAGE_2D_RECT 0x905A
+#define GL_INT_IMAGE_3D 0x9059
+#define GL_INT_IMAGE_BUFFER 0x905C
+#define GL_INT_IMAGE_CUBE 0x905B
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F
+#define GL_INT_SAMPLER_1D 0x8DC9
+#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE
+#define GL_INT_SAMPLER_2D 0x8DCA
+#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
+#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
+#define GL_INT_SAMPLER_2D_RECT 0x8DCD
+#define GL_INT_SAMPLER_3D 0x8DCB
+#define GL_INT_SAMPLER_BUFFER 0x8DD0
+#define GL_INT_SAMPLER_CUBE 0x8DCC
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E
+#define GL_INT_VEC2 0x8B53
+#define GL_INT_VEC2_ARB 0x8B53
+#define GL_INT_VEC3 0x8B54
+#define GL_INT_VEC3_ARB 0x8B54
+#define GL_INT_VEC4 0x8B55
+#define GL_INT_VEC4_ARB 0x8B55
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
+#define GL_INVALID_INDEX 0xFFFFFFFF
+#define GL_INVALID_OPERATION 0x0502
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVERSE_NV 0x862B
+#define GL_INVERSE_TRANSPOSE_NV 0x862D
+#define GL_INVERT 0x150A
+#define GL_ISOLINES 0x8E7A
+#define GL_IS_PER_PATCH 0x92E7
+#define GL_IS_ROW_MAJOR 0x9300
+#define GL_KEEP 0x1E00
+#define GL_LAST_VERTEX_CONVENTION 0x8E4E
+#define GL_LAYER_PROVOKING_VERTEX 0x825E
+#define GL_LEFT 0x0406
+#define GL_LEQUAL 0x0203
+#define GL_LESS 0x0201
+#define GL_LIGHT0 0x4000
+#define GL_LIGHT1 0x4001
+#define GL_LIGHT2 0x4002
+#define GL_LIGHT3 0x4003
+#define GL_LIGHT4 0x4004
+#define GL_LIGHT5 0x4005
+#define GL_LIGHT6 0x4006
+#define GL_LIGHT7 0x4007
+#define GL_LIGHTING 0x0B50
+#define GL_LIGHTING_BIT 0x00000040
+#define GL_LIGHT_MODEL_AMBIENT 0x0B53
+#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8
+#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
+#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
+#define GL_LINE 0x1B01
+#define GL_LINEAR 0x2601
+#define GL_LINEAR_ATTENUATION 0x1208
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_LINES 0x0001
+#define GL_LINES_ADJACENCY 0x000A
+#define GL_LINES_ADJACENCY_ARB 0x000A
+#define GL_LINES_ADJACENCY_EXT 0x000A
+#define GL_LINE_BIT 0x00000004
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_RESET_TOKEN 0x0707
+#define GL_LINE_SMOOTH 0x0B20
+#define GL_LINE_SMOOTH_HINT 0x0C52
+#define GL_LINE_STIPPLE 0x0B24
+#define GL_LINE_STIPPLE_PATTERN 0x0B25
+#define GL_LINE_STIPPLE_REPEAT 0x0B26
+#define GL_LINE_STRIP 0x0003
+#define GL_LINE_STRIP_ADJACENCY 0x000B
+#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B
+#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B
+#define GL_LINE_TOKEN 0x0702
+#define GL_LINE_WIDTH 0x0B21
+#define GL_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_LINE_WIDTH_RANGE 0x0B22
+#define GL_LINK_STATUS 0x8B82
+#define GL_LIST_BASE 0x0B32
+#define GL_LIST_BIT 0x00020000
+#define GL_LIST_INDEX 0x0B33
+#define GL_LIST_MODE 0x0B30
+#define GL_LOAD 0x0101
+#define GL_LOCATION 0x930E
+#define GL_LOCATION_COMPONENT 0x934A
+#define GL_LOCATION_INDEX 0x930F
+#define GL_LOGIC_OP 0x0BF1
+#define GL_LOGIC_OP_MODE 0x0BF0
+#define GL_LOSE_CONTEXT_ON_RESET 0x8252
+#define GL_LOWER_LEFT 0x8CA1
+#define GL_LOW_FLOAT 0x8DF0
+#define GL_LOW_INT 0x8DF3
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE12 0x8041
+#define GL_LUMINANCE12_ALPHA12 0x8047
+#define GL_LUMINANCE12_ALPHA4 0x8046
+#define GL_LUMINANCE16 0x8042
+#define GL_LUMINANCE16_ALPHA16 0x8048
+#define GL_LUMINANCE4 0x803F
+#define GL_LUMINANCE4_ALPHA4 0x8043
+#define GL_LUMINANCE6_ALPHA2 0x8044
+#define GL_LUMINANCE8 0x8040
+#define GL_LUMINANCE8_ALPHA8 0x8045
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_MAJOR_VERSION 0x821B
+#define GL_MANUAL_GENERATE_MIPMAP 0x8294
+#define GL_MAP1_COLOR_4 0x0D90
+#define GL_MAP1_GRID_DOMAIN 0x0DD0
+#define GL_MAP1_GRID_SEGMENTS 0x0DD1
+#define GL_MAP1_INDEX 0x0D91
+#define GL_MAP1_NORMAL 0x0D92
+#define GL_MAP1_TEXTURE_COORD_1 0x0D93
+#define GL_MAP1_TEXTURE_COORD_2 0x0D94
+#define GL_MAP1_TEXTURE_COORD_3 0x0D95
+#define GL_MAP1_TEXTURE_COORD_4 0x0D96
+#define GL_MAP1_VERTEX_3 0x0D97
+#define GL_MAP1_VERTEX_4 0x0D98
+#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660
+#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A
+#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B
+#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C
+#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D
+#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E
+#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F
+#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661
+#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662
+#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663
+#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664
+#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665
+#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666
+#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667
+#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668
+#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669
+#define GL_MAP2_COLOR_4 0x0DB0
+#define GL_MAP2_GRID_DOMAIN 0x0DD2
+#define GL_MAP2_GRID_SEGMENTS 0x0DD3
+#define GL_MAP2_INDEX 0x0DB1
+#define GL_MAP2_NORMAL 0x0DB2
+#define GL_MAP2_TEXTURE_COORD_1 0x0DB3
+#define GL_MAP2_TEXTURE_COORD_2 0x0DB4
+#define GL_MAP2_TEXTURE_COORD_3 0x0DB5
+#define GL_MAP2_TEXTURE_COORD_4 0x0DB6
+#define GL_MAP2_VERTEX_3 0x0DB7
+#define GL_MAP2_VERTEX_4 0x0DB8
+#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670
+#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A
+#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B
+#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C
+#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D
+#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E
+#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F
+#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671
+#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672
+#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673
+#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674
+#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675
+#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676
+#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677
+#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678
+#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679
+#define GL_MAP_COHERENT_BIT 0x0080
+#define GL_MAP_COLOR 0x0D10
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_PERSISTENT_BIT 0x0040
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_STENCIL 0x0D11
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MATRIX0_ARB 0x88C0
+#define GL_MATRIX0_NV 0x8630
+#define GL_MATRIX10_ARB 0x88CA
+#define GL_MATRIX11_ARB 0x88CB
+#define GL_MATRIX12_ARB 0x88CC
+#define GL_MATRIX13_ARB 0x88CD
+#define GL_MATRIX14_ARB 0x88CE
+#define GL_MATRIX15_ARB 0x88CF
+#define GL_MATRIX16_ARB 0x88D0
+#define GL_MATRIX17_ARB 0x88D1
+#define GL_MATRIX18_ARB 0x88D2
+#define GL_MATRIX19_ARB 0x88D3
+#define GL_MATRIX1_ARB 0x88C1
+#define GL_MATRIX1_NV 0x8631
+#define GL_MATRIX20_ARB 0x88D4
+#define GL_MATRIX21_ARB 0x88D5
+#define GL_MATRIX22_ARB 0x88D6
+#define GL_MATRIX23_ARB 0x88D7
+#define GL_MATRIX24_ARB 0x88D8
+#define GL_MATRIX25_ARB 0x88D9
+#define GL_MATRIX26_ARB 0x88DA
+#define GL_MATRIX27_ARB 0x88DB
+#define GL_MATRIX28_ARB 0x88DC
+#define GL_MATRIX29_ARB 0x88DD
+#define GL_MATRIX2_ARB 0x88C2
+#define GL_MATRIX2_NV 0x8632
+#define GL_MATRIX30_ARB 0x88DE
+#define GL_MATRIX31_ARB 0x88DF
+#define GL_MATRIX3_ARB 0x88C3
+#define GL_MATRIX3_NV 0x8633
+#define GL_MATRIX4_ARB 0x88C4
+#define GL_MATRIX4_NV 0x8634
+#define GL_MATRIX5_ARB 0x88C5
+#define GL_MATRIX5_NV 0x8635
+#define GL_MATRIX6_ARB 0x88C6
+#define GL_MATRIX6_NV 0x8636
+#define GL_MATRIX7_ARB 0x88C7
+#define GL_MATRIX7_NV 0x8637
+#define GL_MATRIX8_ARB 0x88C8
+#define GL_MATRIX9_ARB 0x88C9
+#define GL_MATRIX_MODE 0x0BA0
+#define GL_MATRIX_STRIDE 0x92FF
+#define GL_MAX 0x8008
+#define GL_MAX_3D_TEXTURE_SIZE 0x8073
+#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
+#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8
+#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35
+#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B
+#define GL_MAX_CLIP_DISTANCES 0x0D32
+#define GL_MAX_CLIP_PLANES 0x0D32
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3
+#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E
+#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7
+#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1
+#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA
+#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266
+#define GL_MAX_COMBINED_DIMENSIONS 0x8282
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32
+#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF
+#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39
+#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39
+#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC
+#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E
+#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265
+#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264
+#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD
+#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB
+#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262
+#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC
+#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB
+#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263
+#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE
+#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB
+#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF
+#define GL_MAX_CONVOLUTION_HEIGHT 0x801B
+#define GL_MAX_CONVOLUTION_WIDTH 0x801A
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
+#define GL_MAX_CULL_DISTANCES 0x82F9
+#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
+#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
+#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
+#define GL_MAX_DEPTH 0x8280
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F
+#define GL_MAX_DRAW_BUFFERS 0x8824
+#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENT_INDEX 0x8D6B
+#define GL_MAX_EVAL_ORDER 0x0D30
+#define GL_MAX_EXT 0x8008
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0
+#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C
+#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
+#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316
+#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317
+#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318
+#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF
+#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A
+#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1
+#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD
+#define GL_MAX_HEIGHT 0x827F
+#define GL_MAX_IMAGE_SAMPLES 0x906D
+#define GL_MAX_IMAGE_UNITS 0x8F38
+#define GL_MAX_INTEGER_SAMPLES 0x9110
+#define GL_MAX_LABEL_LENGTH 0x82E8
+#define GL_MAX_LAYERS 0x8281
+#define GL_MAX_LIGHTS 0x0D31
+#define GL_MAX_LIST_NESTING 0x0B31
+#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36
+#define GL_MAX_NAME_LENGTH 0x92F6
+#define GL_MAX_NAME_STACK_DEPTH 0x0D37
+#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7
+#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8
+#define GL_MAX_PATCH_VERTICES 0x8E7D
+#define GL_MAX_PIXEL_MAP_TABLE 0x0D34
+#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
+#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B
+#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD
+#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
+#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1
+#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
+#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F
+#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
+#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
+#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E
+#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
+#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
+#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
+#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
+#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810
+#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F
+#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27
+#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9
+#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5
+#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
+#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D
+#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C
+#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28
+#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
+#define GL_MAX_SAMPLES 0x8D57
+#define GL_MAX_SAMPLES_EXT 0x8D57
+#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE
+#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD
+#define GL_MAX_SUBROUTINES 0x8DE7
+#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD
+#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB
+#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C
+#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83
+#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8
+#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81
+#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85
+#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89
+#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE
+#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC
+#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D
+#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86
+#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9
+#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82
+#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A
+#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80
+#define GL_MAX_TESS_GEN_LEVEL 0x8E7E
+#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84
+#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B
+#define GL_MAX_TEXTURE_COORDS 0x8871
+#define GL_MAX_TEXTURE_COORDS_ARB 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
+#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
+#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39
+#define GL_MAX_TEXTURE_UNITS 0x84E2
+#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
+#define GL_MAX_TRACK_MATRICES_NV 0x862F
+#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E
+#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
+#define GL_MAX_UNIFORM_LOCATIONS 0x826E
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B
+#define GL_MAX_VARYING_FLOATS 0x8B4B
+#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B
+#define GL_MAX_VARYING_VECTORS 0x8DFC
+#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2
+#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC
+#define GL_MAX_VERTEX_ATTRIBS 0x8869
+#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
+#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA
+#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9
+#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5
+#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
+#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6
+#define GL_MAX_VERTEX_STREAMS 0x8E71
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A
+#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE
+#define GL_MAX_VIEWPORTS 0x825B
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_MAX_WIDTH 0x827E
+#define GL_MEDIUM_FLOAT 0x8DF1
+#define GL_MEDIUM_INT 0x8DF4
+#define GL_MIN 0x8007
+#define GL_MINMAX 0x802E
+#define GL_MINMAX_FORMAT 0x802F
+#define GL_MINMAX_SINK 0x8030
+#define GL_MINOR_VERSION 0x821C
+#define GL_MIN_EXT 0x8007
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B
+#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC
+#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
+#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37
+#define GL_MIPMAP 0x8293
+#define GL_MIRRORED_REPEAT 0x8370
+#define GL_MIRROR_CLAMP_TO_EDGE 0x8743
+#define GL_MODELVIEW 0x1700
+#define GL_MODELVIEW_MATRIX 0x0BA6
+#define GL_MODELVIEW_PROJECTION_NV 0x8629
+#define GL_MODELVIEW_STACK_DEPTH 0x0BA3
+#define GL_MODULATE 0x2100
+#define GL_MULT 0x0103
+#define GL_MULTISAMPLE 0x809D
+#define GL_MULTISAMPLE_BIT 0x20000000
+#define GL_N3F_V3F 0x2A25
+#define GL_NAME_LENGTH 0x92F9
+#define GL_NAME_STACK_DEPTH 0x0D70
+#define GL_NAND 0x150E
+#define GL_NEAREST 0x2600
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_NEGATIVE_ONE_TO_ONE 0x935E
+#define GL_NEVER 0x0200
+#define GL_NICEST 0x1102
+#define GL_NONE 0
+#define GL_NOOP 0x1505
+#define GL_NOR 0x1508
+#define GL_NORMALIZE 0x0BA1
+#define GL_NORMAL_ARRAY 0x8075
+#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
+#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080
+#define GL_NORMAL_ARRAY_EXT 0x8075
+#define GL_NORMAL_ARRAY_POINTER 0x808F
+#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F
+#define GL_NORMAL_ARRAY_STRIDE 0x807F
+#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F
+#define GL_NORMAL_ARRAY_TYPE 0x807E
+#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E
+#define GL_NORMAL_MAP 0x8511
+#define GL_NOTEQUAL 0x0205
+#define GL_NO_ERROR 0
+#define GL_NO_RESET_NOTIFICATION 0x8261
+#define GL_NUM_ACTIVE_VARIABLES 0x9304
+#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_NUM_EXTENSIONS 0x821D
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_NUM_SAMPLE_COUNTS 0x9380
+#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
+#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9
+#define GL_NUM_SPIR_V_EXTENSIONS 0x9554
+#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89
+#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A
+#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86
+#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
+#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85
+#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81
+#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80
+#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84
+#define GL_OBJECT_LINEAR 0x2401
+#define GL_OBJECT_LINK_STATUS_ARB 0x8B82
+#define GL_OBJECT_PLANE 0x2501
+#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88
+#define GL_OBJECT_SUBTYPE_ARB 0x8B4F
+#define GL_OBJECT_TYPE 0x9112
+#define GL_OBJECT_TYPE_ARB 0x8B4E
+#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83
+#define GL_OFFSET 0x92FC
+#define GL_ONE 1
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB
+#define GL_ONE_MINUS_SRC1_COLOR 0x88FA
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_OPERAND0_ALPHA 0x8598
+#define GL_OPERAND0_RGB 0x8590
+#define GL_OPERAND1_ALPHA 0x8599
+#define GL_OPERAND1_RGB 0x8591
+#define GL_OPERAND2_ALPHA 0x859A
+#define GL_OPERAND2_RGB 0x8592
+#define GL_OR 0x1507
+#define GL_ORDER 0x0A01
+#define GL_OR_INVERTED 0x150D
+#define GL_OR_REVERSE 0x150B
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D
+#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C
+#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E
+#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B
+#define GL_PACK_IMAGE_HEIGHT 0x806C
+#define GL_PACK_LSB_FIRST 0x0D01
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_IMAGES 0x806B
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SWAP_BYTES 0x0D00
+#define GL_PARAMETER_BUFFER 0x80EE
+#define GL_PARAMETER_BUFFER_BINDING 0x80EF
+#define GL_PASS_THROUGH_TOKEN 0x0700
+#define GL_PATCHES 0x000E
+#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73
+#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74
+#define GL_PATCH_VERTICES 0x8E72
+#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50
+#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080
+#define GL_PIXEL_MAP_A_TO_A 0x0C79
+#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9
+#define GL_PIXEL_MAP_B_TO_B 0x0C78
+#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8
+#define GL_PIXEL_MAP_G_TO_G 0x0C77
+#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7
+#define GL_PIXEL_MAP_I_TO_A 0x0C75
+#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5
+#define GL_PIXEL_MAP_I_TO_B 0x0C74
+#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4
+#define GL_PIXEL_MAP_I_TO_G 0x0C73
+#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3
+#define GL_PIXEL_MAP_I_TO_I 0x0C70
+#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0
+#define GL_PIXEL_MAP_I_TO_R 0x0C72
+#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2
+#define GL_PIXEL_MAP_R_TO_R 0x0C76
+#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6
+#define GL_PIXEL_MAP_S_TO_S 0x0C71
+#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1
+#define GL_PIXEL_MODE_BIT 0x00000020
+#define GL_PIXEL_PACK_BUFFER 0x88EB
+#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER 0x88EC
+#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
+#define GL_POINT 0x1B00
+#define GL_POINTS 0x0000
+#define GL_POINT_BIT 0x00000002
+#define GL_POINT_DISTANCE_ATTENUATION 0x8129
+#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128
+#define GL_POINT_SIZE 0x0B11
+#define GL_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_POINT_SIZE_MAX 0x8127
+#define GL_POINT_SIZE_MIN 0x8126
+#define GL_POINT_SIZE_RANGE 0x0B12
+#define GL_POINT_SMOOTH 0x0B10
+#define GL_POINT_SMOOTH_HINT 0x0C51
+#define GL_POINT_SPRITE 0x8861
+#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0
+#define GL_POINT_TOKEN 0x0701
+#define GL_POLYGON 0x0009
+#define GL_POLYGON_BIT 0x00000008
+#define GL_POLYGON_MODE 0x0B40
+#define GL_POLYGON_OFFSET_CLAMP 0x8E1B
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_POLYGON_OFFSET_LINE 0x2A02
+#define GL_POLYGON_OFFSET_POINT 0x2A01
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_SMOOTH 0x0B41
+#define GL_POLYGON_SMOOTH_HINT 0x0C53
+#define GL_POLYGON_STIPPLE 0x0B42
+#define GL_POLYGON_STIPPLE_BIT 0x00000010
+#define GL_POLYGON_TOKEN 0x0703
+#define GL_POSITION 0x1203
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5
+#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8
+#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4
+#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
+#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F
+#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
+#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E
+#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1
+#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
+#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D
+#define GL_POST_CONVOLUTION_RED_BIAS 0x8020
+#define GL_POST_CONVOLUTION_RED_SCALE 0x801C
+#define GL_PREVIOUS 0x8578
+#define GL_PRIMARY_COLOR 0x8577
+#define GL_PRIMITIVES_GENERATED 0x8C87
+#define GL_PRIMITIVES_SUBMITTED 0x82EF
+#define GL_PRIMITIVE_RESTART 0x8F9D
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
+#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221
+#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E
+#define GL_PROGRAM 0x82E2
+#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0
+#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805
+#define GL_PROGRAM_ATTRIBS_ARB 0x88AC
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINDING_ARB 0x8677
+#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B
+#define GL_PROGRAM_ERROR_POSITION_NV 0x864B
+#define GL_PROGRAM_ERROR_STRING_ARB 0x8874
+#define GL_PROGRAM_FORMAT_ARB 0x8876
+#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875
+#define GL_PROGRAM_INPUT 0x92E3
+#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0
+#define GL_PROGRAM_LENGTH_ARB 0x8627
+#define GL_PROGRAM_LENGTH_NV 0x8627
+#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
+#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808
+#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE
+#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
+#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA
+#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
+#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A
+#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809
+#define GL_PROGRAM_OBJECT_ARB 0x8B40
+#define GL_PROGRAM_OUTPUT 0x92E4
+#define GL_PROGRAM_PARAMETERS_ARB 0x88A8
+#define GL_PROGRAM_PARAMETER_NV 0x8644
+#define GL_PROGRAM_PIPELINE 0x82E4
+#define GL_PROGRAM_PIPELINE_BINDING 0x825A
+#define GL_PROGRAM_POINT_SIZE 0x8642
+#define GL_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_PROGRAM_POINT_SIZE_EXT 0x8642
+#define GL_PROGRAM_RESIDENT_NV 0x8647
+#define GL_PROGRAM_SEPARABLE 0x8258
+#define GL_PROGRAM_STRING_ARB 0x8628
+#define GL_PROGRAM_STRING_NV 0x8628
+#define GL_PROGRAM_TARGET_NV 0x8646
+#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4
+#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807
+#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806
+#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
+#define GL_PROJECTION 0x1701
+#define GL_PROJECTION_MATRIX 0x0BA7
+#define GL_PROJECTION_STACK_DEPTH 0x0BA4
+#define GL_PROVOKING_VERTEX 0x8E4F
+#define GL_PROXY_COLOR_TABLE 0x80D3
+#define GL_PROXY_HISTOGRAM 0x8025
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
+#define GL_PROXY_TEXTURE_1D 0x8063
+#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19
+#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19
+#define GL_PROXY_TEXTURE_2D 0x8064
+#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B
+#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103
+#define GL_PROXY_TEXTURE_3D 0x8070
+#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B
+#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7
+#define GL_Q 0x2003
+#define GL_QUADRATIC_ATTENUATION 0x1209
+#define GL_QUADS 0x0007
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C
+#define GL_QUAD_STRIP 0x0008
+#define GL_QUERY 0x82E3
+#define GL_QUERY_BUFFER 0x9192
+#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000
+#define GL_QUERY_BUFFER_BINDING 0x9193
+#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16
+#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A
+#define GL_QUERY_BY_REGION_WAIT 0x8E15
+#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19
+#define GL_QUERY_COUNTER_BITS 0x8864
+#define GL_QUERY_NO_WAIT 0x8E14
+#define GL_QUERY_NO_WAIT_INVERTED 0x8E18
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_QUERY_RESULT_NO_WAIT 0x9194
+#define GL_QUERY_TARGET 0x82EA
+#define GL_QUERY_WAIT 0x8E13
+#define GL_QUERY_WAIT_INVERTED 0x8E17
+#define GL_R 0x2002
+#define GL_R11F_G11F_B10F 0x8C3A
+#define GL_R16 0x822A
+#define GL_R16F 0x822D
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R16_SNORM 0x8F98
+#define GL_R32F 0x822E
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_R3_G3_B2 0x2A10
+#define GL_R8 0x8229
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R8_SNORM 0x8F94
+#define GL_RASTERIZER_DISCARD 0x8C89
+#define GL_READ_BUFFER 0x0C02
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
+#define GL_READ_FRAMEBUFFER_EXT 0x8CA8
+#define GL_READ_ONLY 0x88B8
+#define GL_READ_ONLY_ARB 0x88B8
+#define GL_READ_PIXELS 0x828C
+#define GL_READ_PIXELS_FORMAT 0x828D
+#define GL_READ_PIXELS_TYPE 0x828E
+#define GL_READ_WRITE 0x88BA
+#define GL_READ_WRITE_ARB 0x88BA
+#define GL_RED 0x1903
+#define GL_REDUCE 0x8016
+#define GL_RED_BIAS 0x0D15
+#define GL_RED_BITS 0x0D52
+#define GL_RED_INTEGER 0x8D94
+#define GL_RED_SCALE 0x0D14
+#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B
+#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A
+#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309
+#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307
+#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308
+#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306
+#define GL_REFLECTION_MAP 0x8512
+#define GL_RENDER 0x1C00
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54
+#define GL_RENDERBUFFER_EXT 0x8D41
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
+#define GL_RENDERER 0x1F01
+#define GL_RENDER_MODE 0x0C40
+#define GL_REPEAT 0x2901
+#define GL_REPLACE 0x1E01
+#define GL_REPLICATE_BORDER 0x8153
+#define GL_RESCALE_NORMAL 0x803A
+#define GL_RESET_NOTIFICATION_STRATEGY 0x8256
+#define GL_RETURN 0x0102
+#define GL_RG 0x8227
+#define GL_RG16 0x822C
+#define GL_RG16F 0x822F
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG16_SNORM 0x8F99
+#define GL_RG32F 0x8230
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+#define GL_RG8 0x822B
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB 0x1907
+#define GL_RGB10 0x8052
+#define GL_RGB10_A2 0x8059
+#define GL_RGB10_A2UI 0x906F
+#define GL_RGB12 0x8053
+#define GL_RGB16 0x8054
+#define GL_RGB16F 0x881B
+#define GL_RGB16I 0x8D89
+#define GL_RGB16UI 0x8D77
+#define GL_RGB16_SNORM 0x8F9A
+#define GL_RGB32F 0x8815
+#define GL_RGB32I 0x8D83
+#define GL_RGB32UI 0x8D71
+#define GL_RGB4 0x804F
+#define GL_RGB5 0x8050
+#define GL_RGB565 0x8D62
+#define GL_RGB5_A1 0x8057
+#define GL_RGB8 0x8051
+#define GL_RGB8I 0x8D8F
+#define GL_RGB8UI 0x8D7D
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGB9_E5 0x8C3D
+#define GL_RGBA 0x1908
+#define GL_RGBA12 0x805A
+#define GL_RGBA16 0x805B
+#define GL_RGBA16F 0x881A
+#define GL_RGBA16I 0x8D88
+#define GL_RGBA16UI 0x8D76
+#define GL_RGBA16_SNORM 0x8F9B
+#define GL_RGBA2 0x8055
+#define GL_RGBA32F 0x8814
+#define GL_RGBA32I 0x8D82
+#define GL_RGBA32UI 0x8D70
+#define GL_RGBA4 0x8056
+#define GL_RGBA8 0x8058
+#define GL_RGBA8I 0x8D8E
+#define GL_RGBA8UI 0x8D7C
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_RGBA_INTEGER 0x8D99
+#define GL_RGBA_MODE 0x0C31
+#define GL_RGB_INTEGER 0x8D98
+#define GL_RGB_SCALE 0x8573
+#define GL_RG_INTEGER 0x8228
+#define GL_RIGHT 0x0407
+#define GL_S 0x2000
+#define GL_SAMPLER 0x82E6
+#define GL_SAMPLER_1D 0x8B5D
+#define GL_SAMPLER_1D_ARB 0x8B5D
+#define GL_SAMPLER_1D_ARRAY 0x8DC0
+#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3
+#define GL_SAMPLER_1D_SHADOW 0x8B61
+#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61
+#define GL_SAMPLER_2D 0x8B5E
+#define GL_SAMPLER_2D_ARB 0x8B5E
+#define GL_SAMPLER_2D_ARRAY 0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
+#define GL_SAMPLER_2D_MULTISAMPLE 0x9108
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B
+#define GL_SAMPLER_2D_RECT 0x8B63
+#define GL_SAMPLER_2D_RECT_ARB 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
+#define GL_SAMPLER_2D_SHADOW 0x8B62
+#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62
+#define GL_SAMPLER_3D 0x8B5F
+#define GL_SAMPLER_3D_ARB 0x8B5F
+#define GL_SAMPLER_BINDING 0x8919
+#define GL_SAMPLER_BUFFER 0x8DC2
+#define GL_SAMPLER_CUBE 0x8B60
+#define GL_SAMPLER_CUBE_ARB 0x8B60
+#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D
+#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLES_PASSED 0x8914
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE 0x809F
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SAMPLE_MASK 0x8E51
+#define GL_SAMPLE_MASK_VALUE 0x8E52
+#define GL_SAMPLE_POSITION 0x8E50
+#define GL_SAMPLE_SHADING 0x8C36
+#define GL_SCISSOR_BIT 0x00080000
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_SECONDARY_COLOR_ARRAY 0x845E
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
+#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D
+#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C
+#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B
+#define GL_SELECT 0x1C02
+#define GL_SELECTION_BUFFER_POINTER 0x0DF3
+#define GL_SELECTION_BUFFER_SIZE 0x0DF4
+#define GL_SEPARABLE_2D 0x8012
+#define GL_SEPARATE_ATTRIBS 0x8C8D
+#define GL_SEPARATE_SPECULAR_COLOR 0x81FA
+#define GL_SET 0x150F
+#define GL_SHADER 0x82E1
+#define GL_SHADER_BINARY_FORMATS 0x8DF8
+#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551
+#define GL_SHADER_COMPILER 0x8DFA
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
+#define GL_SHADER_IMAGE_ATOMIC 0x82A6
+#define GL_SHADER_IMAGE_LOAD 0x82A4
+#define GL_SHADER_IMAGE_STORE 0x82A5
+#define GL_SHADER_OBJECT_ARB 0x8B48
+#define GL_SHADER_SOURCE_LENGTH 0x8B88
+#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000
+#define GL_SHADER_STORAGE_BLOCK 0x92E6
+#define GL_SHADER_STORAGE_BUFFER 0x90D2
+#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3
+#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF
+#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5
+#define GL_SHADER_STORAGE_BUFFER_START 0x90D4
+#define GL_SHADER_TYPE 0x8B4F
+#define GL_SHADE_MODEL 0x0B54
+#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
+#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
+#define GL_SHININESS 0x1601
+#define GL_SHORT 0x1402
+#define GL_SIGNALED 0x9119
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC
+#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE
+#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD
+#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF
+#define GL_SINGLE_COLOR 0x81F9
+#define GL_SLUMINANCE 0x8C46
+#define GL_SLUMINANCE8 0x8C47
+#define GL_SLUMINANCE8_ALPHA8 0x8C45
+#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45
+#define GL_SLUMINANCE8_EXT 0x8C47
+#define GL_SLUMINANCE_ALPHA 0x8C44
+#define GL_SLUMINANCE_ALPHA_EXT 0x8C44
+#define GL_SLUMINANCE_EXT 0x8C46
+#define GL_SMOOTH 0x1D01
+#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22
+#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12
+#define GL_SOURCE0_ALPHA 0x8588
+#define GL_SOURCE0_RGB 0x8580
+#define GL_SOURCE1_ALPHA 0x8589
+#define GL_SOURCE1_RGB 0x8581
+#define GL_SOURCE2_ALPHA 0x858A
+#define GL_SOURCE2_RGB 0x8582
+#define GL_SPECULAR 0x1202
+#define GL_SPHERE_MAP 0x2402
+#define GL_SPIR_V_BINARY 0x9552
+#define GL_SPIR_V_EXTENSIONS 0x9553
+#define GL_SPOT_CUTOFF 0x1206
+#define GL_SPOT_DIRECTION 0x1204
+#define GL_SPOT_EXPONENT 0x1205
+#define GL_SRC0_ALPHA 0x8588
+#define GL_SRC0_RGB 0x8580
+#define GL_SRC1_ALPHA 0x8589
+#define GL_SRC1_COLOR 0x88F9
+#define GL_SRC1_RGB 0x8581
+#define GL_SRC2_ALPHA 0x858A
+#define GL_SRC2_RGB 0x8582
+#define GL_SRC_ALPHA 0x0302
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_SRC_COLOR 0x0300
+#define GL_SRGB 0x8C40
+#define GL_SRGB8 0x8C41
+#define GL_SRGB8_ALPHA8 0x8C43
+#define GL_SRGB8_ALPHA8_EXT 0x8C43
+#define GL_SRGB8_EXT 0x8C41
+#define GL_SRGB_ALPHA 0x8C42
+#define GL_SRGB_ALPHA_EXT 0x8C42
+#define GL_SRGB_DECODE_ARB 0x8299
+#define GL_SRGB_EXT 0x8C40
+#define GL_SRGB_READ 0x8297
+#define GL_SRGB_WRITE 0x8298
+#define GL_STACK_OVERFLOW 0x0503
+#define GL_STACK_UNDERFLOW 0x0504
+#define GL_STATIC_COPY 0x88E6
+#define GL_STATIC_COPY_ARB 0x88E6
+#define GL_STATIC_DRAW 0x88E4
+#define GL_STATIC_DRAW_ARB 0x88E4
+#define GL_STATIC_READ 0x88E5
+#define GL_STATIC_READ_ARB 0x88E5
+#define GL_STENCIL 0x1802
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_STENCIL_ATTACHMENT_EXT 0x8D20
+#define GL_STENCIL_BACK_FAIL 0x8801
+#define GL_STENCIL_BACK_FUNC 0x8800
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
+#define GL_STENCIL_BACK_REF 0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
+#define GL_STENCIL_BITS 0x0D57
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_COMPONENTS 0x8285
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_INDEX 0x1901
+#define GL_STENCIL_INDEX1 0x8D46
+#define GL_STENCIL_INDEX16 0x8D49
+#define GL_STENCIL_INDEX16_EXT 0x8D49
+#define GL_STENCIL_INDEX1_EXT 0x8D46
+#define GL_STENCIL_INDEX4 0x8D47
+#define GL_STENCIL_INDEX4_EXT 0x8D47
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_STENCIL_INDEX8_EXT 0x8D48
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_RENDERABLE 0x8288
+#define GL_STENCIL_TEST 0x0B90
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_STEREO 0x0C33
+#define GL_STREAM_COPY 0x88E2
+#define GL_STREAM_COPY_ARB 0x88E2
+#define GL_STREAM_DRAW 0x88E0
+#define GL_STREAM_DRAW_ARB 0x88E0
+#define GL_STREAM_READ 0x88E1
+#define GL_STREAM_READ_ARB 0x88E1
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_SUBTRACT 0x84E7
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_SYNC_STATUS 0x9114
+#define GL_T 0x2001
+#define GL_T2F_C3F_V3F 0x2A2A
+#define GL_T2F_C4F_N3F_V3F 0x2A2C
+#define GL_T2F_C4UB_V3F 0x2A29
+#define GL_T2F_N3F_V3F 0x2A2B
+#define GL_T2F_V3F 0x2A27
+#define GL_T4F_C4F_N3F_V4F 0x2A2D
+#define GL_T4F_V4F 0x2A28
+#define GL_TABLE_TOO_LARGE 0x8031
+#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75
+#define GL_TESS_CONTROL_SHADER 0x8E88
+#define GL_TESS_CONTROL_SHADER_BIT 0x00000008
+#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1
+#define GL_TESS_CONTROL_SUBROUTINE 0x92E9
+#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF
+#define GL_TESS_CONTROL_TEXTURE 0x829C
+#define GL_TESS_EVALUATION_SHADER 0x8E87
+#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010
+#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2
+#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA
+#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0
+#define GL_TESS_EVALUATION_TEXTURE 0x829D
+#define GL_TESS_GEN_MODE 0x8E76
+#define GL_TESS_GEN_POINT_MODE 0x8E79
+#define GL_TESS_GEN_SPACING 0x8E77
+#define GL_TESS_GEN_VERTEX_ORDER 0x8E78
+#define GL_TEXTURE 0x1702
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE0_ARB 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE10_ARB 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE11_ARB 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE12_ARB 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE13_ARB 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE14_ARB 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE15_ARB 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE16_ARB 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE17_ARB 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE18_ARB 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE19_ARB 0x84D3
+#define GL_TEXTURE1_ARB 0x84C1
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE20_ARB 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE21_ARB 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE22_ARB 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE23_ARB 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE24_ARB 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE25_ARB 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE26_ARB 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE27_ARB 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE28_ARB 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE29_ARB 0x84DD
+#define GL_TEXTURE2_ARB 0x84C2
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE30_ARB 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_TEXTURE31_ARB 0x84DF
+#define GL_TEXTURE3_ARB 0x84C3
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE4_ARB 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE5_ARB 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE6_ARB 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE7_ARB 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE8_ARB 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE9_ARB 0x84C9
+#define GL_TEXTURE_1D 0x0DE0
+#define GL_TEXTURE_1D_ARRAY 0x8C18
+#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18
+#define GL_TEXTURE_1D_BINDING_EXT 0x8068
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_TEXTURE_2D_ARRAY 0x8C1A
+#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A
+#define GL_TEXTURE_2D_BINDING_EXT 0x8069
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102
+#define GL_TEXTURE_3D 0x806F
+#define GL_TEXTURE_3D_BINDING_EXT 0x806A
+#define GL_TEXTURE_ALPHA_SIZE 0x805F
+#define GL_TEXTURE_ALPHA_TYPE 0x8C13
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#define GL_TEXTURE_BINDING_1D 0x8068
+#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C
+#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
+#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
+#define GL_TEXTURE_BINDING_3D 0x806A
+#define GL_TEXTURE_BINDING_BUFFER 0x8C2C
+#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A
+#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6
+#define GL_TEXTURE_BIT 0x00040000
+#define GL_TEXTURE_BLUE_SIZE 0x805E
+#define GL_TEXTURE_BLUE_TYPE 0x8C12
+#define GL_TEXTURE_BORDER 0x1005
+#define GL_TEXTURE_BORDER_COLOR 0x1004
+#define GL_TEXTURE_BUFFER 0x8C2A
+#define GL_TEXTURE_BUFFER_BINDING 0x8C2A
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D
+#define GL_TEXTURE_BUFFER_OFFSET 0x919D
+#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F
+#define GL_TEXTURE_BUFFER_SIZE 0x919E
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#define GL_TEXTURE_COMPONENTS 0x1003
+#define GL_TEXTURE_COMPRESSED 0x86A1
+#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2
+#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3
+#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1
+#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0
+#define GL_TEXTURE_COMPRESSION_HINT 0x84EF
+#define GL_TEXTURE_COORD_ARRAY 0x8078
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A
+#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B
+#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078
+#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092
+#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
+#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088
+#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088
+#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A
+#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
+#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089
+#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089
+#define GL_TEXTURE_CUBE_MAP 0x8513
+#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
+#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
+#define GL_TEXTURE_DEPTH 0x8071
+#define GL_TEXTURE_DEPTH_SIZE 0x884A
+#define GL_TEXTURE_DEPTH_TYPE 0x8C16
+#define GL_TEXTURE_ENV 0x2300
+#define GL_TEXTURE_ENV_COLOR 0x2201
+#define GL_TEXTURE_ENV_MODE 0x2200
+#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008
+#define GL_TEXTURE_FILTER_CONTROL 0x8500
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_TEXTURE_GATHER 0x82A2
+#define GL_TEXTURE_GATHER_SHADOW 0x82A3
+#define GL_TEXTURE_GEN_MODE 0x2500
+#define GL_TEXTURE_GEN_Q 0x0C63
+#define GL_TEXTURE_GEN_R 0x0C62
+#define GL_TEXTURE_GEN_S 0x0C60
+#define GL_TEXTURE_GEN_T 0x0C61
+#define GL_TEXTURE_GREEN_SIZE 0x805D
+#define GL_TEXTURE_GREEN_TYPE 0x8C11
+#define GL_TEXTURE_HEIGHT 0x1001
+#define GL_TEXTURE_IMAGE_FORMAT 0x828F
+#define GL_TEXTURE_IMAGE_TYPE 0x8290
+#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
+#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
+#define GL_TEXTURE_INTENSITY_SIZE 0x8061
+#define GL_TEXTURE_INTENSITY_TYPE 0x8C15
+#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
+#define GL_TEXTURE_LOD_BIAS 0x8501
+#define GL_TEXTURE_LUMINANCE_SIZE 0x8060
+#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MATRIX 0x0BA8
+#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#define GL_TEXTURE_MAX_LOD 0x813B
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_MIN_LOD 0x813A
+#define GL_TEXTURE_PRIORITY 0x8066
+#define GL_TEXTURE_PRIORITY_EXT 0x8066
+#define GL_TEXTURE_RECTANGLE 0x84F5
+#define GL_TEXTURE_RED_SIZE 0x805C
+#define GL_TEXTURE_RED_TYPE 0x8C10
+#define GL_TEXTURE_RESIDENT 0x8067
+#define GL_TEXTURE_RESIDENT_EXT 0x8067
+#define GL_TEXTURE_SAMPLES 0x9106
+#define GL_TEXTURE_SHADOW 0x82A1
+#define GL_TEXTURE_SHARED_SIZE 0x8C3F
+#define GL_TEXTURE_STACK_DEPTH 0x0BA5
+#define GL_TEXTURE_STENCIL_SIZE 0x88F1
+#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46
+#define GL_TEXTURE_TARGET 0x1006
+#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100
+#define GL_TEXTURE_VIEW 0x82B5
+#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD
+#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB
+#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE
+#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC
+#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TEXTURE_WRAP_R 0x8072
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_TIMEOUT_EXPIRED 0x911B
+#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF
+#define GL_TIMESTAMP 0x8E28
+#define GL_TIME_ELAPSED 0x88BF
+#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C
+#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D
+#define GL_TRACK_MATRIX_NV 0x8648
+#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649
+#define GL_TRANSFORM_BIT 0x00001000
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800
+#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
+#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C
+#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC
+#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED
+#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4
+#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6
+#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7
+#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3
+#define GL_TRANSPOSE_NV 0x862C
+#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4
+#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLES_ADJACENCY 0x000C
+#define GL_TRIANGLES_ADJACENCY_ARB 0x000C
+#define GL_TRIANGLES_ADJACENCY_EXT 0x000C
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D
+#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D
+#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D
+#define GL_TRUE 1
+#define GL_TYPE 0x92FA
+#define GL_UNDEFINED_VERTEX 0x8260
+#define GL_UNIFORM 0x92E1
+#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
+#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA
+#define GL_UNIFORM_BARRIER_BIT 0x00000004
+#define GL_UNIFORM_BLOCK 0x92E2
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
+#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
+#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BUFFER 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING 0x8A28
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
+#define GL_UNIFORM_BUFFER_START 0x8A29
+#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
+#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
+#define GL_UNIFORM_NAME_LENGTH 0x8A39
+#define GL_UNIFORM_OFFSET 0x8A3B
+#define GL_UNIFORM_SIZE 0x8A38
+#define GL_UNIFORM_TYPE 0x8A37
+#define GL_UNKNOWN_CONTEXT_RESET 0x8255
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129
+#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128
+#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A
+#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127
+#define GL_UNPACK_IMAGE_HEIGHT 0x806E
+#define GL_UNPACK_LSB_FIRST 0x0CF1
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_IMAGES 0x806D
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SWAP_BYTES 0x0CF0
+#define GL_UNSIGNALED 0x9118
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362
+#define GL_UNSIGNED_BYTE_3_3_2 0x8032
+#define GL_UNSIGNED_INT 0x1405
+#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
+#define GL_UNSIGNED_INT_10_10_10_2 0x8036
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_UNSIGNED_INT_24_8_EXT 0x84FA
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
+#define GL_UNSIGNED_INT_8_8_8_8 0x8035
+#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
+#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB
+#define GL_UNSIGNED_INT_IMAGE_1D 0x9062
+#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068
+#define GL_UNSIGNED_INT_IMAGE_2D 0x9063
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C
+#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065
+#define GL_UNSIGNED_INT_IMAGE_3D 0x9064
+#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067
+#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A
+#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1
+#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6
+#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
+#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5
+#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8
+#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F
+#define GL_UNSIGNED_INT_VEC2 0x8DC6
+#define GL_UNSIGNED_INT_VEC3 0x8DC7
+#define GL_UNSIGNED_INT_VEC4 0x8DC8
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364
+#define GL_UPPER_LEFT 0x8CA2
+#define GL_V2F 0x2A20
+#define GL_V3F 0x2A21
+#define GL_VALIDATE_STATUS 0x8B83
+#define GL_VENDOR 0x1F00
+#define GL_VERSION 0x1F02
+#define GL_VERTEX_ARRAY 0x8074
+#define GL_VERTEX_ARRAY_BINDING 0x85B5
+#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
+#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D
+#define GL_VERTEX_ARRAY_EXT 0x8074
+#define GL_VERTEX_ARRAY_POINTER 0x808E
+#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E
+#define GL_VERTEX_ARRAY_SIZE 0x807A
+#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A
+#define GL_VERTEX_ARRAY_STRIDE 0x807C
+#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C
+#define GL_VERTEX_ARRAY_TYPE 0x807B
+#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B
+#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650
+#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A
+#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B
+#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C
+#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D
+#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E
+#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F
+#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651
+#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652
+#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653
+#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654
+#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655
+#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656
+#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657
+#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658
+#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
+#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
+#define GL_VERTEX_ATTRIB_BINDING 0x82D4
+#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5
+#define GL_VERTEX_BINDING_BUFFER 0x8F4F
+#define GL_VERTEX_BINDING_DIVISOR 0x82D6
+#define GL_VERTEX_BINDING_OFFSET 0x82D7
+#define GL_VERTEX_BINDING_STRIDE 0x82D8
+#define GL_VERTEX_PROGRAM_ARB 0x8620
+#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A
+#define GL_VERTEX_PROGRAM_NV 0x8620
+#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642
+#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643
+#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
+#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643
+#define GL_VERTEX_SHADER 0x8B31
+#define GL_VERTEX_SHADER_ARB 0x8B31
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0
+#define GL_VERTEX_STATE_PROGRAM_NV 0x8621
+#define GL_VERTEX_SUBROUTINE 0x92E8
+#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE
+#define GL_VERTEX_TEXTURE 0x829B
+#define GL_VERTICES_SUBMITTED 0x82EE
+#define GL_VIEWPORT 0x0BA2
+#define GL_VIEWPORT_BIT 0x00000800
+#define GL_VIEWPORT_BOUNDS_RANGE 0x825D
+#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F
+#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C
+#define GL_VIEW_CLASS_128_BITS 0x82C4
+#define GL_VIEW_CLASS_16_BITS 0x82CA
+#define GL_VIEW_CLASS_24_BITS 0x82C9
+#define GL_VIEW_CLASS_32_BITS 0x82C8
+#define GL_VIEW_CLASS_48_BITS 0x82C7
+#define GL_VIEW_CLASS_64_BITS 0x82C6
+#define GL_VIEW_CLASS_8_BITS 0x82CB
+#define GL_VIEW_CLASS_96_BITS 0x82C5
+#define GL_VIEW_CLASS_ASTC_10x10_RGBA 0x9393
+#define GL_VIEW_CLASS_ASTC_10x5_RGBA 0x9390
+#define GL_VIEW_CLASS_ASTC_10x6_RGBA 0x9391
+#define GL_VIEW_CLASS_ASTC_10x8_RGBA 0x9392
+#define GL_VIEW_CLASS_ASTC_12x10_RGBA 0x9394
+#define GL_VIEW_CLASS_ASTC_12x12_RGBA 0x9395
+#define GL_VIEW_CLASS_ASTC_4x4_RGBA 0x9388
+#define GL_VIEW_CLASS_ASTC_5x4_RGBA 0x9389
+#define GL_VIEW_CLASS_ASTC_5x5_RGBA 0x938A
+#define GL_VIEW_CLASS_ASTC_6x5_RGBA 0x938B
+#define GL_VIEW_CLASS_ASTC_6x6_RGBA 0x938C
+#define GL_VIEW_CLASS_ASTC_8x5_RGBA 0x938D
+#define GL_VIEW_CLASS_ASTC_8x6_RGBA 0x938E
+#define GL_VIEW_CLASS_ASTC_8x8_RGBA 0x938F
+#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3
+#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2
+#define GL_VIEW_CLASS_EAC_R11 0x9383
+#define GL_VIEW_CLASS_EAC_RG11 0x9384
+#define GL_VIEW_CLASS_ETC2_EAC_RGBA 0x9387
+#define GL_VIEW_CLASS_ETC2_RGB 0x9385
+#define GL_VIEW_CLASS_ETC2_RGBA 0x9386
+#define GL_VIEW_CLASS_RGTC1_RED 0x82D0
+#define GL_VIEW_CLASS_RGTC2_RG 0x82D1
+#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC
+#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD
+#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE
+#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF
+#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6
+#define GL_WAIT_FAILED 0x911D
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E
+#define GL_WRITE_ONLY 0x88B9
+#define GL_WRITE_ONLY_ARB 0x88B9
+#define GL_XOR 0x1506
+#define GL_ZERO 0
+#define GL_ZERO_TO_ONE 0x935F
+#define GL_ZOOM_X 0x0D16
+#define GL_ZOOM_Y 0x0D17
+#define GL_BLEND_DST_ALPHA_OES 0x80CA
+#define GL_BLEND_DST_RGB_OES 0x80C8
+#define GL_BLEND_EQUATION_ALPHA_OES 0x883D
+#define GL_BLEND_EQUATION_OES 0x8009
+#define GL_BLEND_EQUATION_RGB_OES 0x8009
+#define GL_BLEND_SRC_ALPHA_OES 0x80CB
+#define GL_BLEND_SRC_RGB_OES 0x80C9
+#define GL_COLOR_ATTACHMENT0_OES 0x8CE0
+#define GL_DEPTH24_STENCIL8_OES 0x88F0
+#define GL_DEPTH_ATTACHMENT_OES 0x8D00
+#define GL_DEPTH_COMPONENT16_OES 0x81A5
+#define GL_DEPTH_COMPONENT24_OES 0x81A6
+#define GL_DEPTH_COMPONENT32_OES 0x81A7
+#define GL_DEPTH_STENCIL_OES 0x84F9
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES 0x8CD2
+#define GL_FRAMEBUFFER_BINDING_OES 0x8CA6
+#define GL_FRAMEBUFFER_COMPLETE_OES 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES 0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES 0x8CDA
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES 0x8CD7
+#define GL_FRAMEBUFFER_OES 0x8D40
+#define GL_FRAMEBUFFER_UNSUPPORTED_OES 0x8CDD
+#define GL_FUNC_ADD_OES 0x8006
+#define GL_FUNC_REVERSE_SUBTRACT_OES 0x800B
+#define GL_FUNC_SUBTRACT_OES 0x800A
+#define GL_INVALID_FRAMEBUFFER_OPERATION_OES 0x0506
+#define GL_MAX_RENDERBUFFER_SIZE_OES 0x84E8
+#define GL_NONE_OES 0
+#define GL_RENDERBUFFER_ALPHA_SIZE_OES 0x8D53
+#define GL_RENDERBUFFER_BINDING_OES 0x8CA7
+#define GL_RENDERBUFFER_BLUE_SIZE_OES 0x8D52
+#define GL_RENDERBUFFER_DEPTH_SIZE_OES 0x8D54
+#define GL_RENDERBUFFER_GREEN_SIZE_OES 0x8D51
+#define GL_RENDERBUFFER_HEIGHT_OES 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_OES 0x8D44
+#define GL_RENDERBUFFER_OES 0x8D41
+#define GL_RENDERBUFFER_RED_SIZE_OES 0x8D50
+#define GL_RENDERBUFFER_STENCIL_SIZE_OES 0x8D55
+#define GL_RENDERBUFFER_WIDTH_OES 0x8D42
+#define GL_RGB565_OES 0x8D62
+#define GL_RGB5_A1_OES 0x8057
+#define GL_RGBA4_OES 0x8056
+#define GL_STENCIL_ATTACHMENT_OES 0x8D20
+#define GL_UNSIGNED_INT_24_8_OES 0x84FA
+#define GL_VERSION_ES_CL_1_0 1
+#define GL_VERSION_ES_CL_1_1 1
+#define GL_VERSION_ES_CM_1_1 1
+
+
+#ifndef __khrplatform_h_
+#define __khrplatform_h_
+
+/*
+** Copyright (c) 2008-2018 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+/* Khronos platform-specific types and definitions.
+ *
+ * The master copy of khrplatform.h is maintained in the Khronos EGL
+ * Registry repository at https://github.com/KhronosGroup/EGL-Registry
+ * The last semantic modification to khrplatform.h was at commit ID:
+ * 67a3e0864c2d75ea5287b9f3d2eb74a745936692
+ *
+ * Adopters may modify this file to suit their platform. Adopters are
+ * encouraged to submit platform specific modifications to the Khronos
+ * group so that they can be included in future versions of this file.
+ * Please submit changes by filing pull requests or issues on
+ * the EGL Registry repository linked above.
+ *
+ *
+ * See the Implementer's Guidelines for information about where this file
+ * should be located on your system and for more details of its use:
+ * http://www.khronos.org/registry/implementers_guide.pdf
+ *
+ * This file should be included as
+ * #include <KHR/khrplatform.h>
+ * by Khronos client API header files that use its types and defines.
+ *
+ * The types in khrplatform.h should only be used to define API-specific types.
+ *
+ * Types defined in khrplatform.h:
+ * khronos_int8_t signed 8 bit
+ * khronos_uint8_t unsigned 8 bit
+ * khronos_int16_t signed 16 bit
+ * khronos_uint16_t unsigned 16 bit
+ * khronos_int32_t signed 32 bit
+ * khronos_uint32_t unsigned 32 bit
+ * khronos_int64_t signed 64 bit
+ * khronos_uint64_t unsigned 64 bit
+ * khronos_intptr_t signed same number of bits as a pointer
+ * khronos_uintptr_t unsigned same number of bits as a pointer
+ * khronos_ssize_t signed size
+ * khronos_usize_t unsigned size
+ * khronos_float_t signed 32 bit floating point
+ * khronos_time_ns_t unsigned 64 bit time in nanoseconds
+ * khronos_utime_nanoseconds_t unsigned time interval or absolute time in
+ * nanoseconds
+ * khronos_stime_nanoseconds_t signed time interval in nanoseconds
+ * khronos_boolean_enum_t enumerated boolean type. This should
+ * only be used as a base type when a client API's boolean type is
+ * an enum. Client APIs which use an integer or other type for
+ * booleans cannot use this as the base type for their boolean.
+ *
+ * Tokens defined in khrplatform.h:
+ *
+ * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
+ *
+ * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
+ * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
+ *
+ * Calling convention macros defined in this file:
+ * KHRONOS_APICALL
+ * KHRONOS_GLAD_API_PTR
+ * KHRONOS_APIATTRIBUTES
+ *
+ * These may be used in function prototypes as:
+ *
+ * KHRONOS_APICALL void KHRONOS_GLAD_API_PTR funcname(
+ * int arg1,
+ * int arg2) KHRONOS_APIATTRIBUTES;
+ */
+
+#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC)
+# define KHRONOS_STATIC 1
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APICALL
+ *-------------------------------------------------------------------------
+ * This precedes the return type of the function in the function prototype.
+ */
+#if defined(KHRONOS_STATIC)
+ /* If the preprocessor constant KHRONOS_STATIC is defined, make the
+ * header compatible with static linking. */
+# define KHRONOS_APICALL
+#elif defined(_WIN32)
+# define KHRONOS_APICALL __declspec(dllimport)
+#elif defined (__SYMBIAN32__)
+# define KHRONOS_APICALL IMPORT_C
+#elif defined(__ANDROID__)
+# define KHRONOS_APICALL __attribute__((visibility("default")))
+#else
+# define KHRONOS_APICALL
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_GLAD_API_PTR
+ *-------------------------------------------------------------------------
+ * This follows the return type of the function and precedes the function
+ * name in the function prototype.
+ */
+#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
+ /* Win32 but not WinCE */
+# define KHRONOS_GLAD_API_PTR __stdcall
+#else
+# define KHRONOS_GLAD_API_PTR
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APIATTRIBUTES
+ *-------------------------------------------------------------------------
+ * This follows the closing parenthesis of the function prototype arguments.
+ */
+#if defined (__ARMCC_2__)
+#define KHRONOS_APIATTRIBUTES __softfp
+#else
+#define KHRONOS_APIATTRIBUTES
+#endif
+
+/*-------------------------------------------------------------------------
+ * basic type definitions
+ *-----------------------------------------------------------------------*/
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
+
+
+/*
+ * Using <stdint.h>
+ */
+#include <stdint.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(__VMS ) || defined(__sgi)
+
+/*
+ * Using <inttypes.h>
+ */
+#include <inttypes.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
+
+/*
+ * Win32
+ */
+typedef __int32 khronos_int32_t;
+typedef unsigned __int32 khronos_uint32_t;
+typedef __int64 khronos_int64_t;
+typedef unsigned __int64 khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(__sun__) || defined(__digital__)
+
+/*
+ * Sun or Digital
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#if defined(__arch64__) || defined(_LP64)
+typedef long int khronos_int64_t;
+typedef unsigned long int khronos_uint64_t;
+#else
+typedef long long int khronos_int64_t;
+typedef unsigned long long int khronos_uint64_t;
+#endif /* __arch64__ */
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif 0
+
+/*
+ * Hypothetical platform with no float or int64 support
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#define KHRONOS_SUPPORT_INT64 0
+#define KHRONOS_SUPPORT_FLOAT 0
+
+#else
+
+/*
+ * Generic fallback
+ */
+#include <stdint.h>
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#endif
+
+
+/*
+ * Types that are (so far) the same on all platforms
+ */
+typedef signed char khronos_int8_t;
+typedef unsigned char khronos_uint8_t;
+typedef signed short int khronos_int16_t;
+typedef unsigned short int khronos_uint16_t;
+
+/*
+ * Types that differ between LLP64 and LP64 architectures - in LLP64,
+ * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
+ * to be the only LLP64 architecture in current use.
+ */
+#ifdef _WIN64
+typedef signed long long int khronos_intptr_t;
+typedef unsigned long long int khronos_uintptr_t;
+typedef signed long long int khronos_ssize_t;
+typedef unsigned long long int khronos_usize_t;
+#else
+typedef signed long int khronos_intptr_t;
+typedef unsigned long int khronos_uintptr_t;
+typedef signed long int khronos_ssize_t;
+typedef unsigned long int khronos_usize_t;
+#endif
+
+#if KHRONOS_SUPPORT_FLOAT
+/*
+ * Float type
+ */
+typedef float khronos_float_t;
+#endif
+
+#if KHRONOS_SUPPORT_INT64
+/* Time types
+ *
+ * These types can be used to represent a time interval in nanoseconds or
+ * an absolute Unadjusted System Time. Unadjusted System Time is the number
+ * of nanoseconds since some arbitrary system event (e.g. since the last
+ * time the system booted). The Unadjusted System Time is an unsigned
+ * 64 bit value that wraps back to 0 every 584 years. Time intervals
+ * may be either signed or unsigned.
+ */
+typedef khronos_uint64_t khronos_utime_nanoseconds_t;
+typedef khronos_int64_t khronos_stime_nanoseconds_t;
+#endif
+
+/*
+ * Dummy value used to pad enum types to 32 bits.
+ */
+#ifndef KHRONOS_MAX_ENUM
+#define KHRONOS_MAX_ENUM 0x7FFFFFFF
+#endif
+
+/*
+ * Enumerated boolean type
+ *
+ * Values other than zero should be considered to be true. Therefore
+ * comparisons should not be made against KHRONOS_TRUE.
+ */
+typedef enum {
+ KHRONOS_FALSE = 0,
+ KHRONOS_TRUE = 1,
+ KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
+} khronos_boolean_enum_t;
+
+#endif /* __khrplatform_h_ */
+
+typedef unsigned int GLenum;
+
+typedef unsigned char GLboolean;
+
+typedef unsigned int GLbitfield;
+
+typedef void GLvoid;
+
+typedef khronos_int8_t GLbyte;
+
+typedef khronos_uint8_t GLubyte;
+
+typedef khronos_int16_t GLshort;
+
+typedef khronos_uint16_t GLushort;
+
+typedef int GLint;
+
+typedef unsigned int GLuint;
+
+typedef khronos_int32_t GLclampx;
+
+typedef int GLsizei;
+
+typedef khronos_float_t GLfloat;
+
+typedef khronos_float_t GLclampf;
+
+typedef double GLdouble;
+
+typedef double GLclampd;
+
+typedef void *GLeglClientBufferEXT;
+
+typedef void *GLeglImageOES;
+
+typedef char GLchar;
+
+typedef char GLcharARB;
+
+#ifdef __APPLE__
+typedef void *GLhandleARB;
+#else
+typedef unsigned int GLhandleARB;
+#endif
+
+typedef khronos_uint16_t GLhalf;
+
+typedef khronos_uint16_t GLhalfARB;
+
+typedef khronos_int32_t GLfixed;
+
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_intptr_t GLintptr;
+#else
+typedef khronos_intptr_t GLintptr;
+#endif
+
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_intptr_t GLintptrARB;
+#else
+typedef khronos_intptr_t GLintptrARB;
+#endif
+
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_ssize_t GLsizeiptr;
+#else
+typedef khronos_ssize_t GLsizeiptr;
+#endif
+
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+typedef khronos_ssize_t GLsizeiptrARB;
+#else
+typedef khronos_ssize_t GLsizeiptrARB;
+#endif
+
+typedef khronos_int64_t GLint64;
+
+typedef khronos_int64_t GLint64EXT;
+
+typedef khronos_uint64_t GLuint64;
+
+typedef khronos_uint64_t GLuint64EXT;
+
+typedef struct __GLsync *GLsync;
+
+struct _cl_context;
+
+struct _cl_event;
+
+typedef void (GLAD_API_PTR *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+
+typedef void (GLAD_API_PTR *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+
+typedef void (GLAD_API_PTR *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+
+typedef void (GLAD_API_PTR *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam);
+
+typedef unsigned short GLhalfNV;
+
+typedef GLintptr GLvdpauSurfaceNV;
+
+typedef void (GLAD_API_PTR *GLVULKANPROCNV)(void);
+
+
+
+#define GL_VERSION_1_0 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_1_0;
+#define GL_VERSION_1_1 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_1_1;
+#define GL_VERSION_1_2 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_1_2;
+#define GL_VERSION_1_3 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_1_3;
+#define GL_VERSION_1_4 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_1_4;
+#define GL_VERSION_1_5 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_1_5;
+#define GL_VERSION_2_0 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_2_0;
+#define GL_VERSION_2_1 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_2_1;
+#define GL_VERSION_3_0 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_3_0;
+#define GL_VERSION_3_1 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_3_1;
+#define GL_VERSION_3_2 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_3_2;
+#define GL_VERSION_3_3 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_3_3;
+#define GL_VERSION_4_0 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_4_0;
+#define GL_VERSION_4_1 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_4_1;
+#define GL_VERSION_4_2 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_4_2;
+#define GL_VERSION_4_3 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_4_3;
+#define GL_VERSION_4_4 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_4_4;
+#define GL_VERSION_4_5 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_4_5;
+#define GL_VERSION_4_6 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_4_6;
+#define GL_VERSION_ES_CM_1_0 1
+GLAD_API_CALL int SF_GLAD_GL_VERSION_ES_CM_1_0;
+#define GL_ARB_ES2_compatibility 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_ES2_compatibility;
+#define GL_ARB_ES3_1_compatibility 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_ES3_1_compatibility;
+#define GL_ARB_base_instance 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_base_instance;
+#define GL_ARB_blend_func_extended 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_blend_func_extended;
+#define GL_ARB_buffer_storage 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_buffer_storage;
+#define GL_ARB_clear_buffer_object 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_clear_buffer_object;
+#define GL_ARB_clear_texture 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_clear_texture;
+#define GL_ARB_clip_control 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_clip_control;
+#define GL_ARB_compute_shader 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_compute_shader;
+#define GL_ARB_copy_buffer 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_copy_buffer;
+#define GL_ARB_copy_image 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_copy_image;
+#define GL_ARB_direct_state_access 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_direct_state_access;
+#define GL_ARB_draw_elements_base_vertex 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_draw_elements_base_vertex;
+#define GL_ARB_draw_indirect 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_draw_indirect;
+#define GL_ARB_fragment_program 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_fragment_program;
+#define GL_ARB_fragment_shader 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_fragment_shader;
+#define GL_ARB_framebuffer_no_attachments 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_framebuffer_no_attachments;
+#define GL_ARB_framebuffer_object 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_framebuffer_object;
+#define GL_ARB_geometry_shader4 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_geometry_shader4;
+#define GL_ARB_get_program_binary 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_get_program_binary;
+#define GL_ARB_get_texture_sub_image 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_get_texture_sub_image;
+#define GL_ARB_gpu_shader_fp64 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_gpu_shader_fp64;
+#define GL_ARB_imaging 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_imaging;
+#define GL_ARB_internalformat_query 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_internalformat_query;
+#define GL_ARB_internalformat_query2 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_internalformat_query2;
+#define GL_ARB_invalidate_subdata 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_invalidate_subdata;
+#define GL_ARB_map_buffer_range 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_map_buffer_range;
+#define GL_ARB_multi_bind 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_multi_bind;
+#define GL_ARB_multi_draw_indirect 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_multi_draw_indirect;
+#define GL_ARB_multitexture 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_multitexture;
+#define GL_ARB_polygon_offset_clamp 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_polygon_offset_clamp;
+#define GL_ARB_program_interface_query 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_program_interface_query;
+#define GL_ARB_provoking_vertex 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_provoking_vertex;
+#define GL_ARB_sampler_objects 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_sampler_objects;
+#define GL_ARB_separate_shader_objects 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_separate_shader_objects;
+#define GL_ARB_shader_atomic_counters 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_shader_atomic_counters;
+#define GL_ARB_shader_image_load_store 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_shader_image_load_store;
+#define GL_ARB_shader_objects 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_shader_objects;
+#define GL_ARB_shader_storage_buffer_object 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_shader_storage_buffer_object;
+#define GL_ARB_shader_subroutine 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_shader_subroutine;
+#define GL_ARB_shading_language_100 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_shading_language_100;
+#define GL_ARB_sync 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_sync;
+#define GL_ARB_tessellation_shader 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_tessellation_shader;
+#define GL_ARB_texture_barrier 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_texture_barrier;
+#define GL_ARB_texture_buffer_range 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_texture_buffer_range;
+#define GL_ARB_texture_multisample 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_texture_multisample;
+#define GL_ARB_texture_non_power_of_two 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_texture_non_power_of_two;
+#define GL_ARB_texture_storage 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_texture_storage;
+#define GL_ARB_texture_storage_multisample 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_texture_storage_multisample;
+#define GL_ARB_texture_view 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_texture_view;
+#define GL_ARB_timer_query 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_timer_query;
+#define GL_ARB_transform_feedback2 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_transform_feedback2;
+#define GL_ARB_transform_feedback3 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_transform_feedback3;
+#define GL_ARB_transform_feedback_instanced 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_transform_feedback_instanced;
+#define GL_ARB_uniform_buffer_object 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_uniform_buffer_object;
+#define GL_ARB_vertex_array_object 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_array_object;
+#define GL_ARB_vertex_attrib_64bit 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_attrib_64bit;
+#define GL_ARB_vertex_attrib_binding 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_attrib_binding;
+#define GL_ARB_vertex_buffer_object 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_buffer_object;
+#define GL_ARB_vertex_program 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_program;
+#define GL_ARB_vertex_shader 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_shader;
+#define GL_ARB_vertex_type_2_10_10_10_rev 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_type_2_10_10_10_rev;
+#define GL_ARB_viewport_array 1
+GLAD_API_CALL int SF_GLAD_GL_ARB_viewport_array;
+#define GL_EXT_blend_equation_separate 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_blend_equation_separate;
+#define GL_EXT_blend_func_separate 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_blend_func_separate;
+#define GL_EXT_blend_minmax 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_blend_minmax;
+#define GL_EXT_blend_subtract 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_blend_subtract;
+#define GL_EXT_copy_texture 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_copy_texture;
+#define GL_EXT_framebuffer_blit 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_framebuffer_blit;
+#define GL_EXT_framebuffer_multisample 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_framebuffer_multisample;
+#define GL_EXT_framebuffer_object 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_framebuffer_object;
+#define GL_EXT_geometry_shader4 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_geometry_shader4;
+#define GL_EXT_packed_depth_stencil 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_packed_depth_stencil;
+#define GL_EXT_subtexture 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_subtexture;
+#define GL_EXT_texture_array 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_texture_array;
+#define GL_EXT_texture_object 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_texture_object;
+#define GL_EXT_texture_sRGB 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_texture_sRGB;
+#define GL_EXT_vertex_array 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_vertex_array;
+#define GL_INGR_blend_func_separate 1
+GLAD_API_CALL int SF_GLAD_GL_INGR_blend_func_separate;
+#define GL_KHR_debug 1
+GLAD_API_CALL int SF_GLAD_GL_KHR_debug;
+#define GL_KHR_robustness 1
+GLAD_API_CALL int SF_GLAD_GL_KHR_robustness;
+#define GL_NV_geometry_program4 1
+GLAD_API_CALL int SF_GLAD_GL_NV_geometry_program4;
+#define GL_NV_vertex_program 1
+GLAD_API_CALL int SF_GLAD_GL_NV_vertex_program;
+#define GL_OES_single_precision 1
+GLAD_API_CALL int SF_GLAD_GL_OES_single_precision;
+#define GL_SGIS_texture_edge_clamp 1
+GLAD_API_CALL int SF_GLAD_GL_SGIS_texture_edge_clamp;
+#define GL_EXT_sRGB 1
+GLAD_API_CALL int SF_GLAD_GL_EXT_sRGB;
+#define GL_OES_blend_equation_separate 1
+GLAD_API_CALL int SF_GLAD_GL_OES_blend_equation_separate;
+#define GL_OES_blend_func_separate 1
+GLAD_API_CALL int SF_GLAD_GL_OES_blend_func_separate;
+#define GL_OES_blend_subtract 1
+GLAD_API_CALL int SF_GLAD_GL_OES_blend_subtract;
+#define GL_OES_depth24 1
+GLAD_API_CALL int SF_GLAD_GL_OES_depth24;
+#define GL_OES_depth32 1
+GLAD_API_CALL int SF_GLAD_GL_OES_depth32;
+#define GL_OES_framebuffer_object 1
+GLAD_API_CALL int SF_GLAD_GL_OES_framebuffer_object;
+#define GL_OES_packed_depth_stencil 1
+GLAD_API_CALL int SF_GLAD_GL_OES_packed_depth_stencil;
+#define GL_OES_texture_npot 1
+GLAD_API_CALL int SF_GLAD_GL_OES_texture_npot;
+
+
+typedef void (GLAD_API_PTR *PFNGLACCUMPROC)(GLenum op, GLfloat value);
+typedef void (GLAD_API_PTR *PFNGLACTIVESHADERPROGRAMPROC)(GLuint pipeline, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLALPHAFUNCPROC)(GLenum func, GLfloat ref);
+typedef GLboolean (GLAD_API_PTR *PFNGLAREPROGRAMSRESIDENTNVPROC)(GLsizei n, const GLuint * programs, GLboolean * residences);
+typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences);
+typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTEXTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences);
+typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTPROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTEXTPROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLATTACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB obj);
+typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLBEGINPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBEGINQUERYPROC)(GLenum target, GLuint id);
+typedef void (GLAD_API_PTR *PFNGLBEGINQUERYINDEXEDPROC)(GLenum target, GLuint index, GLuint id);
+typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode);
+typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONARBPROC)(GLhandleARB programObj, GLuint index, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERARBPROC)(GLenum target, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERSBASEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLBINDBUFFERSRANGEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizeiptr * sizes);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTUREPROC)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTURESPROC)(GLuint first, GLsizei count, const GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMARBPROC)(GLenum target, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMNVPROC)(GLenum target, GLuint id);
+typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler);
+typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERSPROC)(GLuint first, GLsizei count, const GLuint * samplers);
+typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREEXTPROC)(GLenum target, GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREUNITPROC)(GLuint unit, GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLBINDTEXTURESPROC)(GLuint first, GLsizei count, const GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLBINDTRANSFORMFEEDBACKPROC)(GLenum target, GLuint id);
+typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYPROC)(GLuint array);
+typedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERPROC)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+typedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERSPROC)(GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizei * strides);
+typedef void (GLAD_API_PTR *PFNGLBITMAPPROC)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap);
+typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONEXTPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEIPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONIPROC)(GLuint buf, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEINGRPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEIPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCIPROC)(GLuint buf, GLenum src, GLenum dst);
+typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GLAD_API_PTR *PFNGLBLITNAMEDFRAMEBUFFERPROC)(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage);
+typedef void (GLAD_API_PTR *PFNGLBUFFERDATAARBPROC)(GLenum target, GLsizeiptrARB size, const void * data, GLenum usage);
+typedef void (GLAD_API_PTR *PFNGLBUFFERSTORAGEPROC)(GLenum target, GLsizeiptr size, const void * data, GLbitfield flags);
+typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data);
+typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCALLLISTPROC)(GLuint list);
+typedef void (GLAD_API_PTR *PFNGLCALLLISTSPROC)(GLsizei n, GLenum type, const void * lists);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)(GLuint framebuffer, GLenum target);
+typedef void (GLAD_API_PTR *PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp);
+typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLCLEARACCUMPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERDATAPROC)(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERSUBDATAPROC)(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat d);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFOESPROC)(GLclampf depth);
+typedef void (GLAD_API_PTR *PFNGLCLEARINDEXPROC)(GLfloat c);
+typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERDATAPROC)(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s);
+typedef void (GLAD_API_PTR *PFNGLCLEARTEXIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCLEARTEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREPROC)(GLenum texture);
+typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREARBPROC)(GLenum texture);
+typedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GLAD_API_PTR *PFNGLCLIPCONTROLPROC)(GLenum origin, GLenum depth);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEPROC)(GLenum plane, const GLdouble * equation);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFOESPROC)(GLenum plane, const GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3IPROC)(GLint red, GLint green, GLint blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UBVPROC)(const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3UIVPROC)(const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue);
+typedef void (GLAD_API_PTR *PFNGLCOLOR3USVPROC)(const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4BPROC)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4DPROC)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4FPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4IPROC)(GLint red, GLint green, GLint blue, GLint alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4SPROC)(GLshort red, GLshort green, GLshort blue, GLshort alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UBPROC)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UBVPROC)(const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UIPROC)(GLuint red, GLuint green, GLuint blue, GLuint alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4UIVPROC)(const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4USPROC)(GLushort red, GLushort green, GLushort blue, GLushort alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4USVPROC)(const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GLAD_API_PTR *PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+typedef void (GLAD_API_PTR *PFNGLCOLORMATERIALPROC)(GLenum face, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLCOLORP3UIPROC)(GLenum type, GLuint color);
+typedef void (GLAD_API_PTR *PFNGLCOLORP3UIVPROC)(GLenum type, const GLuint * color);
+typedef void (GLAD_API_PTR *PFNGLCOLORP4UIPROC)(GLenum type, GLuint color);
+typedef void (GLAD_API_PTR *PFNGLCOLORP4UIVPROC)(GLenum type, const GLuint * color);
+typedef void (GLAD_API_PTR *PFNGLCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLCOLORPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * table);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERARBPROC)(GLhandleARB shaderObj);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * image);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * image);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIPROC)(GLenum target, GLenum pname, GLint params);
+typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GLAD_API_PTR *PFNGLCOPYCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYIMAGESUBDATAPROC)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+typedef void (GLAD_API_PTR *PFNGLCOPYNAMEDBUFFERSUBDATAPROC)(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GLAD_API_PTR *PFNGLCOPYPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLCREATEBUFFERSPROC)(GLsizei n, GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLCREATEFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATEPROGRAMOBJECTARBPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLCREATEPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines);
+typedef void (GLAD_API_PTR *PFNGLCREATEQUERIESPROC)(GLenum target, GLsizei n, GLuint * ids);
+typedef void (GLAD_API_PTR *PFNGLCREATERENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLCREATESAMPLERSPROC)(GLsizei n, GLuint * samplers);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATESHADEROBJECTARBPROC)(GLenum shaderType);
+typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar *const* strings);
+typedef void (GLAD_API_PTR *PFNGLCREATETEXTURESPROC)(GLenum target, GLsizei n, GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLCREATETRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint * ids);
+typedef void (GLAD_API_PTR *PFNGLCREATEVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays);
+typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void * userParam);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled);
+typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf);
+typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSARBPROC)(GLsizei n, const GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETELISTSPROC)(GLuint list, GLsizei range);
+typedef void (GLAD_API_PTR *PFNGLDELETEOBJECTARBPROC)(GLhandleARB obj);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint * pipelines);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSARBPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSNVPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint * ids);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint * samplers);
+typedef void (GLAD_API_PTR *PFNGLDELETESHADERPROC)(GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLDELETESYNCPROC)(GLsync sync);
+typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESEXTPROC)(GLsizei n, const GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLDELETETRANSFORMFEEDBACKSPROC)(GLsizei n, const GLuint * ids);
+typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint * arrays);
+typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func);
+typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYDVNVPROC)(GLuint first, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYVPROC)(GLuint first, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDPROC)(GLuint index, GLdouble n, GLdouble f);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDDNVPROC)(GLuint index, GLdouble n, GLdouble f);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFOESPROC)(GLclampf n, GLclampf f);
+typedef void (GLAD_API_PTR *PFNGLDETACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB attachedObj);
+typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap);
+typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEPROC)(GLenum array);
+typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index);
+typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLDISABLEIPROC)(GLenum target, GLuint index);
+typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEPROC)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEINDIRECTPROC)(GLintptr indirect);
+typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count);
+typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSEXTPROC)(GLenum mode, GLint first, GLsizei count);
+typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect);
+typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf);
+typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum * bufs);
+typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices);
+typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex);
+typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect);
+typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount);
+typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLuint baseinstance);
+typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex);
+typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+typedef void (GLAD_API_PTR *PFNGLDRAWPIXELSPROC)(GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices);
+typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex);
+typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKPROC)(GLenum mode, GLuint id);
+typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)(GLenum mode, GLuint id, GLsizei instancecount);
+typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)(GLenum mode, GLuint id, GLuint stream);
+typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPROC)(GLboolean flag);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTERPROC)(GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTEREXTPROC)(GLsizei stride, GLsizei count, const GLboolean * pointer);
+typedef void (GLAD_API_PTR *PFNGLEDGEFLAGVPROC)(const GLboolean * flag);
+typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap);
+typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEPROC)(GLenum array);
+typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index);
+typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLENABLEIPROC)(GLenum target, GLuint index);
+typedef void (GLAD_API_PTR *PFNGLENDPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLENDLISTPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLENDQUERYPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLENDQUERYINDEXEDPROC)(GLenum target, GLuint index);
+typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DPROC)(GLdouble u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DVPROC)(const GLdouble * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FPROC)(GLfloat u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FVPROC)(const GLfloat * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DPROC)(GLdouble u, GLdouble v);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DVPROC)(const GLdouble * u);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FPROC)(GLfloat u, GLfloat v);
+typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FVPROC)(const GLfloat * u);
+typedef void (GLAD_API_PTR *PFNGLEVALMESH1PROC)(GLenum mode, GLint i1, GLint i2);
+typedef void (GLAD_API_PTR *PFNGLEVALMESH2PROC)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+typedef void (GLAD_API_PTR *PFNGLEVALPOINT1PROC)(GLint i);
+typedef void (GLAD_API_PTR *PFNGLEVALPOINT2PROC)(GLint i, GLint j);
+typedef void (GLAD_API_PTR *PFNGLEXECUTEPROGRAMNVPROC)(GLenum target, GLuint id, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLFEEDBACKBUFFERPROC)(GLsizei size, GLenum type, GLfloat * buffer);
+typedef GLsync (GLAD_API_PTR *PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags);
+typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length);
+typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length);
+typedef void (GLAD_API_PTR *PFNGLFOGCOORDPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLFOGCOORDDPROC)(GLdouble coord);
+typedef void (GLAD_API_PTR *PFNGLFOGCOORDDVPROC)(const GLdouble * coord);
+typedef void (GLAD_API_PTR *PFNGLFOGCOORDFPROC)(GLfloat coord);
+typedef void (GLAD_API_PTR *PFNGLFOGCOORDFVPROC)(const GLfloat * coord);
+typedef void (GLAD_API_PTR *PFNGLFOGFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLFOGFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLFOGIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLFOGIVPROC)(GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERPARAMETERIPROC)(GLenum target, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLGENBUFFERSARBPROC)(GLsizei n, GLuint * buffers);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint * framebuffers);
+typedef GLuint (GLAD_API_PTR *PFNGLGENLISTSPROC)(GLsizei range);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSARBPROC)(GLsizei n, GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSNVPROC)(GLsizei n, GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLGENQUERIESPROC)(GLsizei n, GLuint * ids);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint * samplers);
+typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLGENTEXTURESEXTPROC)(GLsizei n, GLuint * textures);
+typedef void (GLAD_API_PTR *PFNGLGENTRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint * ids);
+typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPEXTPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGENERATETEXTUREMIPMAPPROC)(GLuint texture);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)(GLuint program, GLuint bufferIndex, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINENAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint * values);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformName);
+typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint * uniformIndices, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETATTACHEDOBJECTSARBPROC)(GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj);
+typedef void (GLAD_API_PTR *PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * shaders);
+typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean * data);
+typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 * params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVARBPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVARBPROC)(GLenum target, GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data);
+typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEPROC)(GLenum plane, GLdouble * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFOESPROC)(GLenum plane, GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPROC)(GLenum target, GLenum format, GLenum type, void * table);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void * img);
+typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLsizei bufSize, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONFILTERPROC)(GLenum target, GLenum format, GLenum type, void * image);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog);
+typedef void (GLAD_API_PTR *PFNGLGETDOUBLEI_VPROC)(GLenum target, GLuint index, GLdouble * data);
+typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data);
+typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLGETFLOATI_VPROC)(GLenum target, GLuint index, GLfloat * data);
+typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data);
+typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef GLenum (GLAD_API_PTR *PFNGLGETGRAPHICSRESETSTATUSPROC)(void);
+typedef GLhandleARB (GLAD_API_PTR *PFNGLGETHANDLEARBPROC)(GLenum pname);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETINFOLOGARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog);
+typedef void (GLAD_API_PTR *PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 * data);
+typedef void (GLAD_API_PTR *PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 * data);
+typedef void (GLAD_API_PTR *PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint * data);
+typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data);
+typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATI64VPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64 * params);
+typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATIVPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTFVPROC)(GLenum light, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTIVPROC)(GLenum light, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETMAPDVPROC)(GLenum target, GLenum query, GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLGETMAPFVPROC)(GLenum target, GLenum query, GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLGETMAPIVPROC)(GLenum target, GLenum query, GLint * v);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALFVPROC)(GLenum face, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALIVPROC)(GLenum face, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat * val);
+typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)(GLuint buffer, GLenum pname, GLint64 * params);
+typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERIVPROC)(GLuint buffer, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPOINTERVPROC)(GLuint buffer, GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, void * data);
+typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)(GLuint framebuffer, GLenum pname, GLint * param);
+typedef void (GLAD_API_PTR *PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)(GLuint renderbuffer, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERFVARBPROC)(GLhandleARB obj, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERIVARBPROC)(GLhandleARB obj, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETOBJECTPTRLABELPROC)(const void * ptr, GLsizei bufSize, GLsizei * length, GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPFVPROC)(GLenum map, GLfloat * values);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUIVPROC)(GLenum map, GLuint * values);
+typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUSVPROC)(GLenum map, GLushort * values);
+typedef void (GLAD_API_PTR *PFNGLGETPOINTERVPROC)(GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETPOINTERVEXTPROC)(GLenum pname, void ** params);
+typedef void (GLAD_API_PTR *PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte * mask);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINTERFACEIVPROC)(GLuint program, GLenum programInterface, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERDVNVPROC)(GLenum target, GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERFVNVPROC)(GLenum target, GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint * params);
+typedef GLuint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint program, GLenum programInterface, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCENAMEPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEIVPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum * props, GLsizei count, GLsizei * length, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTAGEIVPROC)(GLuint program, GLenum shadertype, GLenum pname, GLint * values);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGARBPROC)(GLenum target, GLenum pname, void * string);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGNVPROC)(GLuint id, GLenum pname, GLubyte * program);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVARBPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVNVPROC)(GLuint id, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
+typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
+typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
+typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
+typedef void (GLAD_API_PTR *PFNGLGETQUERYINDEXEDIVPROC)(GLenum target, GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 * params);
+typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 * params);
+typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint * params);
+typedef void (GLAD_API_PTR *PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint * params);
+typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETSEPARABLEFILTERPROC)(GLenum target, GLenum format, GLenum type, void * row, void * column, void * span);
+typedef void (GLAD_API_PTR *PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog);
+typedef void (GLAD_API_PTR *PFNGLGETSHADERPRECISIONFORMATPROC)(GLenum shadertype, GLenum precisiontype, GLint * range, GLint * precision);
+typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source);
+typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source);
+typedef void (GLAD_API_PTR *PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint * params);
+typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name);
+typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGIPROC)(GLenum name, GLuint index);
+typedef GLuint (GLAD_API_PTR *PFNGLGETSUBROUTINEINDEXPROC)(GLuint program, GLenum shadertype, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)(GLuint program, GLenum shadertype, const GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei * length, GLint * values);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENDVPROC)(GLenum coord, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENFVPROC)(GLenum coord, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXGENIVPROC)(GLenum coord, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERFVPROC)(GLuint texture, GLint level, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERIVPROC)(GLuint texture, GLint level, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, GLuint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXTURESUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLGETTRACKMATRIXIVNVPROC)(GLenum target, GLuint address, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name);
+typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI64_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint64 * param);
+typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint * param);
+typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKIVPROC)(GLuint xfb, GLenum pname, GLint * param);
+typedef GLuint (GLAD_API_PTR *PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar * uniformBlockName);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const* uniformNames, GLuint * uniformIndices);
+typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name);
+typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMSUBROUTINEUIVPROC)(GLenum shadertype, GLint location, GLuint * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMDVPROC)(GLuint program, GLint location, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVARBPROC)(GLhandleARB programObj, GLint location, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVARBPROC)(GLhandleARB programObj, GLint location, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXED64IVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint64 * param);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXEDIVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint * param);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYIVPROC)(GLuint vaobj, GLenum pname, GLint * param);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBLDVPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVARBPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVNVPROC)(GLuint index, GLenum pname, void ** pointer);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVARBPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVNVPROC)(GLuint index, GLenum pname, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVARBPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVNVPROC)(GLuint index, GLenum pname, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVARBPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVNVPROC)(GLuint index, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETNCOLORTABLEPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void * table);
+typedef void (GLAD_API_PTR *PFNGLGETNCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint lod, GLsizei bufSize, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLGETNCONVOLUTIONFILTERPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void * image);
+typedef void (GLAD_API_PTR *PFNGLGETNHISTOGRAMPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void * values);
+typedef void (GLAD_API_PTR *PFNGLGETNMAPDVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLGETNMAPFVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLGETNMAPIVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLint * v);
+typedef void (GLAD_API_PTR *PFNGLGETNMINMAXPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void * values);
+typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPFVPROC)(GLenum map, GLsizei bufSize, GLfloat * values);
+typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUIVPROC)(GLenum map, GLsizei bufSize, GLuint * values);
+typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUSVPROC)(GLenum map, GLsizei bufSize, GLushort * values);
+typedef void (GLAD_API_PTR *PFNGLGETNPOLYGONSTIPPLEPROC)(GLsizei bufSize, GLubyte * pattern);
+typedef void (GLAD_API_PTR *PFNGLGETNSEPARABLEFILTERPROC)(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void * row, GLsizei columnBufSize, void * column, void * span);
+typedef void (GLAD_API_PTR *PFNGLGETNTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMDVPROC)(GLuint program, GLint location, GLsizei bufSize, GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMFVPROC)(GLuint program, GLint location, GLsizei bufSize, GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMUIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint * params);
+typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLHISTOGRAMPROC)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+typedef void (GLAD_API_PTR *PFNGLINDEXMASKPROC)(GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLINDEXPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLINDEXPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLINDEXDPROC)(GLdouble c);
+typedef void (GLAD_API_PTR *PFNGLINDEXDVPROC)(const GLdouble * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXFPROC)(GLfloat c);
+typedef void (GLAD_API_PTR *PFNGLINDEXFVPROC)(const GLfloat * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXIPROC)(GLint c);
+typedef void (GLAD_API_PTR *PFNGLINDEXIVPROC)(const GLint * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXSPROC)(GLshort c);
+typedef void (GLAD_API_PTR *PFNGLINDEXSVPROC)(const GLshort * c);
+typedef void (GLAD_API_PTR *PFNGLINDEXUBPROC)(GLubyte c);
+typedef void (GLAD_API_PTR *PFNGLINDEXUBVPROC)(const GLubyte * c);
+typedef void (GLAD_API_PTR *PFNGLINITNAMESPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLINTERLEAVEDARRAYSPROC)(GLenum format, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length);
+typedef void (GLAD_API_PTR *PFNGLINVALIDATEFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments);
+typedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum * attachments);
+typedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLINVALIDATESUBFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXIMAGEPROC)(GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
+typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERARBPROC)(GLuint buffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap);
+typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIPROC)(GLenum target, GLuint index);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISLISTPROC)(GLuint list);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint program);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMARBPROC)(GLuint program);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMNVPROC)(GLuint id);
+typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYPROC)(GLuint id);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISSAMPLERPROC)(GLuint sampler);
+typedef GLboolean (GLAD_API_PTR *PFNGLISSHADERPROC)(GLuint shader);
+typedef GLboolean (GLAD_API_PTR *PFNGLISSYNCPROC)(GLsync sync);
+typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture);
+typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREEXTPROC)(GLuint texture);
+typedef GLboolean (GLAD_API_PTR *PFNGLISTRANSFORMFEEDBACKPROC)(GLuint id);
+typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYPROC)(GLuint array);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIVPROC)(GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTFPROC)(GLenum light, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTFVPROC)(GLenum light, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLLIGHTIPROC)(GLenum light, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTIVPROC)(GLenum light, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLLINESTIPPLEPROC)(GLint factor, GLushort pattern);
+typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width);
+typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLLISTBASEPROC)(GLuint base);
+typedef void (GLAD_API_PTR *PFNGLLOADIDENTITYPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXDPROC)(const GLdouble * m);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXFPROC)(const GLfloat * m);
+typedef void (GLAD_API_PTR *PFNGLLOADNAMEPROC)(GLuint name);
+typedef void (GLAD_API_PTR *PFNGLLOADPROGRAMNVPROC)(GLenum target, GLuint id, GLsizei len, const GLubyte * program);
+typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXDPROC)(const GLdouble * m);
+typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXFPROC)(const GLfloat * m);
+typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode);
+typedef void (GLAD_API_PTR *PFNGLMAP1DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points);
+typedef void (GLAD_API_PTR *PFNGLMAP1FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points);
+typedef void (GLAD_API_PTR *PFNGLMAP2DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points);
+typedef void (GLAD_API_PTR *PFNGLMAP2FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points);
+typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access);
+typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERARBPROC)(GLenum target, GLenum access);
+typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID1DPROC)(GLint un, GLdouble u1, GLdouble u2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID1FPROC)(GLint un, GLfloat u1, GLfloat u2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID2DPROC)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+typedef void (GLAD_API_PTR *PFNGLMAPGRID2FPROC)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERPROC)(GLuint buffer, GLenum access);
+typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GLAD_API_PTR *PFNGLMATERIALFPROC)(GLenum face, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALFVPROC)(GLenum face, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLMATERIALIPROC)(GLenum face, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALIVPROC)(GLenum face, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLMATRIXMODEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERPROC)(GLbitfield barriers);
+typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERBYREGIONPROC)(GLbitfield barriers);
+typedef void (GLAD_API_PTR *PFNGLMINSAMPLESHADINGPROC)(GLfloat value);
+typedef void (GLAD_API_PTR *PFNGLMINMAXPROC)(GLenum target, GLenum internalformat, GLboolean sink);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXDPROC)(const GLdouble * m);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXFPROC)(const GLfloat * m);
+typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXDPROC)(const GLdouble * m);
+typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXFPROC)(const GLfloat * m);
+typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei drawcount);
+typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect, GLsizei drawcount, GLsizei stride);
+typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC)(GLenum mode, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);
+typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount);
+typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount, const GLint * basevertex);
+typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect, GLsizei drawcount, GLsizei stride);
+typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC)(GLenum mode, GLenum type, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DPROC)(GLenum target, GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DARBPROC)(GLenum target, GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FPROC)(GLenum target, GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FARBPROC)(GLenum target, GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IPROC)(GLenum target, GLint s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IARBPROC)(GLenum target, GLint s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SPROC)(GLenum target, GLshort s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SARBPROC)(GLenum target, GLshort s);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DPROC)(GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DARBPROC)(GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FPROC)(GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FARBPROC)(GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IPROC)(GLenum target, GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IARBPROC)(GLenum target, GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SPROC)(GLenum target, GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SARBPROC)(GLenum target, GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IPROC)(GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IARBPROC)(GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SPROC)(GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVARBPROC)(GLenum target, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVARBPROC)(GLenum target, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IARBPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVARBPROC)(GLenum target, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVARBPROC)(GLenum target, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIPROC)(GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIVPROC)(GLenum texture, GLenum type, const GLuint * coords);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIPROC)(GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIVPROC)(GLenum texture, GLenum type, const GLuint * coords);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIPROC)(GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIVPROC)(GLenum texture, GLenum type, const GLuint * coords);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIPROC)(GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIVPROC)(GLenum texture, GLenum type, const GLuint * coords);
+typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERDATAPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLenum usage);
+typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSTORAGEPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLbitfield flags);
+typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, const void * data);
+typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)(GLuint framebuffer, GLenum buf);
+typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)(GLuint framebuffer, GLsizei n, const GLenum * bufs);
+typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)(GLuint framebuffer, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)(GLuint framebuffer, GLenum src);
+typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEPROC)(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLNEWLISTPROC)(GLuint list, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3BPROC)(GLbyte nx, GLbyte ny, GLbyte nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3DPROC)(GLdouble nx, GLdouble ny, GLdouble nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3FPROC)(GLfloat nx, GLfloat ny, GLfloat nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3IPROC)(GLint nx, GLint ny, GLint nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3SPROC)(GLshort nx, GLshort ny, GLshort nz);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLNORMALP3UIPROC)(GLenum type, GLuint coords);
+typedef void (GLAD_API_PTR *PFNGLNORMALP3UIVPROC)(GLenum type, const GLuint * coords);
+typedef void (GLAD_API_PTR *PFNGLNORMALPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLNORMALPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELPROC)(const void * ptr, GLsizei length, const GLchar * label);
+typedef void (GLAD_API_PTR *PFNGLORTHOPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+typedef void (GLAD_API_PTR *PFNGLORTHOFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLPASSTHROUGHPROC)(GLfloat token);
+typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERFVPROC)(GLenum pname, const GLfloat * values);
+typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERIPROC)(GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPAUSETRANSFORMFEEDBACKPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPFVPROC)(GLenum map, GLsizei mapsize, const GLfloat * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPUIVPROC)(GLenum map, GLsizei mapsize, const GLuint * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELMAPUSVPROC)(GLenum map, GLsizei mapsize, const GLushort * values);
+typedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLPIXELZOOMPROC)(GLfloat xfactor, GLfloat yfactor);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETCLAMPPROC)(GLfloat factor, GLfloat units, GLfloat clamp);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONSTIPPLEPROC)(const GLubyte * mask);
+typedef void (GLAD_API_PTR *PFNGLPOPATTRIBPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPCLIENTATTRIBPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPMATRIXPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPOPNAMEPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index);
+typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESPROC)(GLsizei n, const GLuint * textures, const GLfloat * priorities);
+typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESEXTPROC)(GLsizei n, const GLuint * textures, const GLclampf * priorities);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLsizei length);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DNVPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DVNVPROC)(GLenum target, GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FNVPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FVNVPROC)(GLenum target, GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIARBPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIEXTPROC)(GLuint program, GLenum pname, GLint value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4DVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4FVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMSTRINGARBPROC)(GLenum target, GLenum format, GLsizei len, const void * string);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DPROC)(GLuint program, GLint location, GLdouble v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FPROC)(GLuint program, GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IPROC)(GLuint program, GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIPROC)(GLuint program, GLint location, GLuint v0);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IPROC)(GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLPROGRAMVERTEXLIMITNVPROC)(GLenum target, GLint limit);
+typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLPUSHATTRIBPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message);
+typedef void (GLAD_API_PTR *PFNGLPUSHMATRIXPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLPUSHNAMEPROC)(GLuint name);
+typedef void (GLAD_API_PTR *PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DPROC)(GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FPROC)(GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IPROC)(GLint x, GLint y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SPROC)(GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IPROC)(GLint x, GLint y, GLint z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SPROC)(GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IPROC)(GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src);
+typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels);
+typedef void (GLAD_API_PTR *PFNGLREADNPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void * data);
+typedef void (GLAD_API_PTR *PFNGLRECTDPROC)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+typedef void (GLAD_API_PTR *PFNGLRECTDVPROC)(const GLdouble * v1, const GLdouble * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTFPROC)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+typedef void (GLAD_API_PTR *PFNGLRECTFVPROC)(const GLfloat * v1, const GLfloat * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTIPROC)(GLint x1, GLint y1, GLint x2, GLint y2);
+typedef void (GLAD_API_PTR *PFNGLRECTIVPROC)(const GLint * v1, const GLint * v2);
+typedef void (GLAD_API_PTR *PFNGLRECTSPROC)(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+typedef void (GLAD_API_PTR *PFNGLRECTSVPROC)(const GLshort * v1, const GLshort * v2);
+typedef void (GLAD_API_PTR *PFNGLRELEASESHADERCOMPILERPROC)(void);
+typedef GLint (GLAD_API_PTR *PFNGLRENDERMODEPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLREQUESTRESIDENTPROGRAMSNVPROC)(GLsizei n, const GLuint * programs);
+typedef void (GLAD_API_PTR *PFNGLRESETHISTOGRAMPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLRESETMINMAXPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLRESUMETRANSFORMFEEDBACKPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLROTATEDPROC)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLROTATEFPROC)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert);
+typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask);
+typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint * param);
+typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint * param);
+typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat * param);
+typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint * param);
+typedef void (GLAD_API_PTR *PFNGLSCALEDPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLSCALEFPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLSCISSORARRAYVPROC)(GLuint first, GLsizei count, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDPROC)(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BVPROC)(const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IPROC)(GLint red, GLint green, GLint blue);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBVPROC)(const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIVPROC)(const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USVPROC)(const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIPROC)(GLenum type, GLuint color);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIVPROC)(GLenum type, const GLuint * color);
+typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLSELECTBUFFERPROC)(GLsizei size, GLuint * buffer);
+typedef void (GLAD_API_PTR *PFNGLSEPARABLEFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * row, const void * column);
+typedef void (GLAD_API_PTR *PFNGLSHADEMODELPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLSHADERBINARYPROC)(GLsizei count, const GLuint * shaders, GLenum binaryFormat, const void * binary, GLsizei length);
+typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length);
+typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEARBPROC)(GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint * length);
+typedef void (GLAD_API_PTR *PFNGLSHADERSTORAGEBLOCKBINDINGPROC)(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
+typedef void (GLAD_API_PTR *PFNGLSPECIALIZESHADERPROC)(GLuint shader, const GLchar * pEntryPoint, GLuint numSpecializationConstants, const GLuint * pConstantIndex, const GLuint * pConstantValue);
+typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask);
+typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (GLAD_API_PTR *PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLTEXBUFFERRANGEPROC)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DPROC)(GLdouble s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FPROC)(GLfloat s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IPROC)(GLint s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SPROC)(GLshort s);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DPROC)(GLdouble s, GLdouble t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FPROC)(GLfloat s, GLfloat t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IPROC)(GLint s, GLint t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SPROC)(GLshort s, GLshort t);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DPROC)(GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FPROC)(GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IPROC)(GLint s, GLint t, GLint r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SPROC)(GLshort s, GLshort t, GLshort r);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DPROC)(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FPROC)(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IPROC)(GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SPROC)(GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIPROC)(GLenum type, GLuint coords);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIVPROC)(GLenum type, const GLuint * coords);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIPROC)(GLenum type, GLuint coords);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIVPROC)(GLenum type, const GLuint * coords);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIPROC)(GLenum type, GLuint coords);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIVPROC)(GLenum type, const GLuint * coords);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIPROC)(GLenum type, GLuint coords);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIVPROC)(GLenum type, const GLuint * coords);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLTEXENVFPROC)(GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXENVIPROC)(GLenum target, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENDPROC)(GLenum coord, GLenum pname, GLdouble param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENDVPROC)(GLenum coord, GLenum pname, const GLdouble * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENFPROC)(GLenum coord, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENFVPROC)(GLenum coord, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXGENIPROC)(GLenum coord, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXGENIVPROC)(GLenum coord, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE1DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXTUREBARRIERPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERPROC)(GLuint texture, GLenum internalformat, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERRANGEPROC)(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, const GLint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, const GLuint * params);
+typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFPROC)(GLuint texture, GLenum pname, GLfloat param);
+typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, const GLfloat * param);
+typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIPROC)(GLuint texture, GLenum pname, GLint param);
+typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, const GLint * param);
+typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE1DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels);
+typedef void (GLAD_API_PTR *PFNGLTEXTUREVIEWPROC)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+typedef void (GLAD_API_PTR *PFNGLTRACKMATRIXNVPROC)(GLenum target, GLuint address, GLenum matrix, GLenum transform);
+typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)(GLuint xfb, GLuint index, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEDPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEFPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1DPROC)(GLint location, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1DVPROC)(GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FARBPROC)(GLint location, GLfloat v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IARBPROC)(GLint location, GLint v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2DPROC)(GLint location, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2DVPROC)(GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FARBPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IARBPROC)(GLint location, GLint v0, GLint v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3DVPROC)(GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4DVPROC)(GLint location, GLsizei count, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVARBPROC)(GLint location, GLsizei count, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVARBPROC)(GLint location, GLsizei count, const GLint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
+typedef void (GLAD_API_PTR *PFNGLUNIFORMSUBROUTINESUIVPROC)(GLenum shadertype, GLsizei count, const GLuint * indices);
+typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target);
+typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERARBPROC)(GLenum target);
+typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPNAMEDBUFFERPROC)(GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMOBJECTARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint pipeline);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2DPROC)(GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2FPROC)(GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2IPROC)(GLint x, GLint y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2SPROC)(GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEX2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3DPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3FPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3IPROC)(GLint x, GLint y, GLint z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3SPROC)(GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEX3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4IPROC)(GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEX4SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBBINDINGPROC)(GLuint vaobj, GLuint attribindex, GLuint bindingindex);
+typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBIFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBLFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYBINDINGDIVISORPROC)(GLuint vaobj, GLuint bindingindex, GLuint divisor);
+typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYELEMENTBUFFERPROC)(GLuint vaobj, GLuint buffer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERPROC)(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERSPROC)(GLuint vaobj, GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizei * strides);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DARBPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DNVPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FARBPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FNVPROC)(GLuint index, GLfloat x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SARBPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SNVPROC)(GLuint index, GLshort x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DARBPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DNVPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FARBPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FNVPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SARBPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SNVPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVARBPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVARBPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBARBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVARBPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVARBPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVARBPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVARBPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVARBPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVNVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVARBPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVNVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVARBPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVARBPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVNVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBNVPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVARBPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVNVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVARBPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVARBPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBBINDINGPROC)(GLuint attribindex, GLuint bindingindex);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DPROC)(GLuint index, GLdouble x);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DVPROC)(GLuint index, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERARBPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERNVPROC)(GLuint index, GLint fsize, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4SVNVPROC)(GLuint index, GLsizei count, const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4UBVNVPROC)(GLuint index, GLsizei count, const GLubyte * v);
+typedef void (GLAD_API_PTR *PFNGLVERTEXBINDINGDIVISORPROC)(GLuint bindingindex, GLuint divisor);
+typedef void (GLAD_API_PTR *PFNGLVERTEXP2UIPROC)(GLenum type, GLuint value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXP2UIVPROC)(GLenum type, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXP3UIPROC)(GLenum type, GLuint value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXP3UIVPROC)(GLenum type, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXP4UIPROC)(GLenum type, GLuint value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXP4UIVPROC)(GLenum type, const GLuint * value);
+typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer);
+typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLVIEWPORTARRAYVPROC)(GLuint first, GLsizei count, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFVPROC)(GLuint index, const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DPROC)(GLdouble x, GLdouble y);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FPROC)(GLfloat x, GLfloat y);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IPROC)(GLint x, GLint y);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SPROC)(GLshort x, GLshort y);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DVPROC)(const GLdouble * v);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FVPROC)(const GLfloat * v);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IPROC)(GLint x, GLint y, GLint z);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IVPROC)(const GLint * v);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SPROC)(GLshort x, GLshort y, GLshort z);
+typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SVPROC)(const GLshort * v);
+typedef void (GLAD_API_PTR *PFNGLALPHAFUNCXPROC)(GLenum func, GLfixed ref);
+typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEROESPROC)(GLenum target, GLuint framebuffer);
+typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEROESPROC)(GLenum target, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONOESPROC)(GLenum mode);
+typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEOESPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEOESPROC)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSOESPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLCLEARCOLORXPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHXPROC)(GLfixed depth);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFPROC)(GLenum p, const GLfloat * eqn);
+typedef void (GLAD_API_PTR *PFNGLCLIPPLANEXPROC)(GLenum plane, const GLfixed * equation);
+typedef void (GLAD_API_PTR *PFNGLCOLOR4XPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSOESPROC)(GLsizei n, const GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSOESPROC)(GLsizei n, const GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEXPROC)(GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLFOGXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLFOGXVPROC)(GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEROESPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DOESPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMFPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLFRUSTUMXPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSOESPROC)(GLsizei n, GLuint * framebuffers);
+typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSOESPROC)(GLsizei n, GLuint * renderbuffers);
+typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPOESPROC)(GLenum target);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFPROC)(GLenum plane, GLfloat * equation);
+typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEXPROC)(GLenum plane, GLfixed * equation);
+typedef void (GLAD_API_PTR *PFNGLGETFIXEDVPROC)(GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETLIGHTXVPROC)(GLenum light, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETMATERIALXVPROC)(GLenum face, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVOESPROC)(GLenum target, GLenum pname, GLint * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXENVXVPROC)(GLenum target, GLenum pname, GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERXVPROC)(GLenum target, GLenum pname, GLfixed * params);
+typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFEROESPROC)(GLuint framebuffer);
+typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFEROESPROC)(GLuint renderbuffer);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTMODELXVPROC)(GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTXPROC)(GLenum light, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLLIGHTXVPROC)(GLenum light, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLLINEWIDTHXPROC)(GLfixed width);
+typedef void (GLAD_API_PTR *PFNGLLOADMATRIXXPROC)(const GLfixed * m);
+typedef void (GLAD_API_PTR *PFNGLMATERIALXPROC)(GLenum face, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLMATERIALXVPROC)(GLenum face, GLenum pname, const GLfixed * param);
+typedef void (GLAD_API_PTR *PFNGLMULTMATRIXXPROC)(const GLfixed * m);
+typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4XPROC)(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+typedef void (GLAD_API_PTR *PFNGLNORMAL3XPROC)(GLfixed nx, GLfixed ny, GLfixed nz);
+typedef void (GLAD_API_PTR *PFNGLORTHOFPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAD_API_PTR *PFNGLORTHOXPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERXPROC)(GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERXVPROC)(GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLPOINTSIZEXPROC)(GLfixed size);
+typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETXPROC)(GLfixed factor, GLfixed units);
+typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEOESPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAD_API_PTR *PFNGLROTATEXPROC)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEXPROC)(GLclampx value, GLboolean invert);
+typedef void (GLAD_API_PTR *PFNGLSCALEXPROC)(GLfixed x, GLfixed y, GLfixed z);
+typedef void (GLAD_API_PTR *PFNGLTEXENVXPROC)(GLenum target, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLTEXENVXVPROC)(GLenum target, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERXPROC)(GLenum target, GLenum pname, GLfixed param);
+typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERXVPROC)(GLenum target, GLenum pname, const GLfixed * params);
+typedef void (GLAD_API_PTR *PFNGLTRANSLATEXPROC)(GLfixed x, GLfixed y, GLfixed z);
+
+GLAD_API_CALL PFNGLACCUMPROC sf_glad_glAccum;
+#define glAccum sf_glad_glAccum
+GLAD_API_CALL PFNGLACTIVESHADERPROGRAMPROC sf_glad_glActiveShaderProgram;
+#define glActiveShaderProgram sf_glad_glActiveShaderProgram
+GLAD_API_CALL PFNGLACTIVETEXTUREPROC sf_glad_glActiveTexture;
+#define glActiveTexture sf_glad_glActiveTexture
+GLAD_API_CALL PFNGLACTIVETEXTUREARBPROC sf_glad_glActiveTextureARB;
+#define glActiveTextureARB sf_glad_glActiveTextureARB
+GLAD_API_CALL PFNGLALPHAFUNCPROC sf_glad_glAlphaFunc;
+#define glAlphaFunc sf_glad_glAlphaFunc
+GLAD_API_CALL PFNGLAREPROGRAMSRESIDENTNVPROC sf_glad_glAreProgramsResidentNV;
+#define glAreProgramsResidentNV sf_glad_glAreProgramsResidentNV
+GLAD_API_CALL PFNGLARETEXTURESRESIDENTPROC sf_glad_glAreTexturesResident;
+#define glAreTexturesResident sf_glad_glAreTexturesResident
+GLAD_API_CALL PFNGLARETEXTURESRESIDENTEXTPROC sf_glad_glAreTexturesResidentEXT;
+#define glAreTexturesResidentEXT sf_glad_glAreTexturesResidentEXT
+GLAD_API_CALL PFNGLARRAYELEMENTPROC sf_glad_glArrayElement;
+#define glArrayElement sf_glad_glArrayElement
+GLAD_API_CALL PFNGLARRAYELEMENTEXTPROC sf_glad_glArrayElementEXT;
+#define glArrayElementEXT sf_glad_glArrayElementEXT
+GLAD_API_CALL PFNGLATTACHOBJECTARBPROC sf_glad_glAttachObjectARB;
+#define glAttachObjectARB sf_glad_glAttachObjectARB
+GLAD_API_CALL PFNGLATTACHSHADERPROC sf_glad_glAttachShader;
+#define glAttachShader sf_glad_glAttachShader
+GLAD_API_CALL PFNGLBEGINPROC sf_glad_glBegin;
+#define glBegin sf_glad_glBegin
+GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERPROC sf_glad_glBeginConditionalRender;
+#define glBeginConditionalRender sf_glad_glBeginConditionalRender
+GLAD_API_CALL PFNGLBEGINQUERYPROC sf_glad_glBeginQuery;
+#define glBeginQuery sf_glad_glBeginQuery
+GLAD_API_CALL PFNGLBEGINQUERYINDEXEDPROC sf_glad_glBeginQueryIndexed;
+#define glBeginQueryIndexed sf_glad_glBeginQueryIndexed
+GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKPROC sf_glad_glBeginTransformFeedback;
+#define glBeginTransformFeedback sf_glad_glBeginTransformFeedback
+GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC sf_glad_glBindAttribLocation;
+#define glBindAttribLocation sf_glad_glBindAttribLocation
+GLAD_API_CALL PFNGLBINDATTRIBLOCATIONARBPROC sf_glad_glBindAttribLocationARB;
+#define glBindAttribLocationARB sf_glad_glBindAttribLocationARB
+GLAD_API_CALL PFNGLBINDBUFFERPROC sf_glad_glBindBuffer;
+#define glBindBuffer sf_glad_glBindBuffer
+GLAD_API_CALL PFNGLBINDBUFFERARBPROC sf_glad_glBindBufferARB;
+#define glBindBufferARB sf_glad_glBindBufferARB
+GLAD_API_CALL PFNGLBINDBUFFERBASEPROC sf_glad_glBindBufferBase;
+#define glBindBufferBase sf_glad_glBindBufferBase
+GLAD_API_CALL PFNGLBINDBUFFERRANGEPROC sf_glad_glBindBufferRange;
+#define glBindBufferRange sf_glad_glBindBufferRange
+GLAD_API_CALL PFNGLBINDBUFFERSBASEPROC sf_glad_glBindBuffersBase;
+#define glBindBuffersBase sf_glad_glBindBuffersBase
+GLAD_API_CALL PFNGLBINDBUFFERSRANGEPROC sf_glad_glBindBuffersRange;
+#define glBindBuffersRange sf_glad_glBindBuffersRange
+GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONPROC sf_glad_glBindFragDataLocation;
+#define glBindFragDataLocation sf_glad_glBindFragDataLocation
+GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONINDEXEDPROC sf_glad_glBindFragDataLocationIndexed;
+#define glBindFragDataLocationIndexed sf_glad_glBindFragDataLocationIndexed
+GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC sf_glad_glBindFramebuffer;
+#define glBindFramebuffer sf_glad_glBindFramebuffer
+GLAD_API_CALL PFNGLBINDFRAMEBUFFEREXTPROC sf_glad_glBindFramebufferEXT;
+#define glBindFramebufferEXT sf_glad_glBindFramebufferEXT
+GLAD_API_CALL PFNGLBINDIMAGETEXTUREPROC sf_glad_glBindImageTexture;
+#define glBindImageTexture sf_glad_glBindImageTexture
+GLAD_API_CALL PFNGLBINDIMAGETEXTURESPROC sf_glad_glBindImageTextures;
+#define glBindImageTextures sf_glad_glBindImageTextures
+GLAD_API_CALL PFNGLBINDPROGRAMARBPROC sf_glad_glBindProgramARB;
+#define glBindProgramARB sf_glad_glBindProgramARB
+GLAD_API_CALL PFNGLBINDPROGRAMNVPROC sf_glad_glBindProgramNV;
+#define glBindProgramNV sf_glad_glBindProgramNV
+GLAD_API_CALL PFNGLBINDPROGRAMPIPELINEPROC sf_glad_glBindProgramPipeline;
+#define glBindProgramPipeline sf_glad_glBindProgramPipeline
+GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC sf_glad_glBindRenderbuffer;
+#define glBindRenderbuffer sf_glad_glBindRenderbuffer
+GLAD_API_CALL PFNGLBINDRENDERBUFFEREXTPROC sf_glad_glBindRenderbufferEXT;
+#define glBindRenderbufferEXT sf_glad_glBindRenderbufferEXT
+GLAD_API_CALL PFNGLBINDSAMPLERPROC sf_glad_glBindSampler;
+#define glBindSampler sf_glad_glBindSampler
+GLAD_API_CALL PFNGLBINDSAMPLERSPROC sf_glad_glBindSamplers;
+#define glBindSamplers sf_glad_glBindSamplers
+GLAD_API_CALL PFNGLBINDTEXTUREPROC sf_glad_glBindTexture;
+#define glBindTexture sf_glad_glBindTexture
+GLAD_API_CALL PFNGLBINDTEXTUREEXTPROC sf_glad_glBindTextureEXT;
+#define glBindTextureEXT sf_glad_glBindTextureEXT
+GLAD_API_CALL PFNGLBINDTEXTUREUNITPROC sf_glad_glBindTextureUnit;
+#define glBindTextureUnit sf_glad_glBindTextureUnit
+GLAD_API_CALL PFNGLBINDTEXTURESPROC sf_glad_glBindTextures;
+#define glBindTextures sf_glad_glBindTextures
+GLAD_API_CALL PFNGLBINDTRANSFORMFEEDBACKPROC sf_glad_glBindTransformFeedback;
+#define glBindTransformFeedback sf_glad_glBindTransformFeedback
+GLAD_API_CALL PFNGLBINDVERTEXARRAYPROC sf_glad_glBindVertexArray;
+#define glBindVertexArray sf_glad_glBindVertexArray
+GLAD_API_CALL PFNGLBINDVERTEXBUFFERPROC sf_glad_glBindVertexBuffer;
+#define glBindVertexBuffer sf_glad_glBindVertexBuffer
+GLAD_API_CALL PFNGLBINDVERTEXBUFFERSPROC sf_glad_glBindVertexBuffers;
+#define glBindVertexBuffers sf_glad_glBindVertexBuffers
+GLAD_API_CALL PFNGLBITMAPPROC sf_glad_glBitmap;
+#define glBitmap sf_glad_glBitmap
+GLAD_API_CALL PFNGLBLENDCOLORPROC sf_glad_glBlendColor;
+#define glBlendColor sf_glad_glBlendColor
+GLAD_API_CALL PFNGLBLENDEQUATIONPROC sf_glad_glBlendEquation;
+#define glBlendEquation sf_glad_glBlendEquation
+GLAD_API_CALL PFNGLBLENDEQUATIONEXTPROC sf_glad_glBlendEquationEXT;
+#define glBlendEquationEXT sf_glad_glBlendEquationEXT
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC sf_glad_glBlendEquationSeparate;
+#define glBlendEquationSeparate sf_glad_glBlendEquationSeparate
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEEXTPROC sf_glad_glBlendEquationSeparateEXT;
+#define glBlendEquationSeparateEXT sf_glad_glBlendEquationSeparateEXT
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEIPROC sf_glad_glBlendEquationSeparatei;
+#define glBlendEquationSeparatei sf_glad_glBlendEquationSeparatei
+GLAD_API_CALL PFNGLBLENDEQUATIONIPROC sf_glad_glBlendEquationi;
+#define glBlendEquationi sf_glad_glBlendEquationi
+GLAD_API_CALL PFNGLBLENDFUNCPROC sf_glad_glBlendFunc;
+#define glBlendFunc sf_glad_glBlendFunc
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC sf_glad_glBlendFuncSeparate;
+#define glBlendFuncSeparate sf_glad_glBlendFuncSeparate
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEEXTPROC sf_glad_glBlendFuncSeparateEXT;
+#define glBlendFuncSeparateEXT sf_glad_glBlendFuncSeparateEXT
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEINGRPROC sf_glad_glBlendFuncSeparateINGR;
+#define glBlendFuncSeparateINGR sf_glad_glBlendFuncSeparateINGR
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEIPROC sf_glad_glBlendFuncSeparatei;
+#define glBlendFuncSeparatei sf_glad_glBlendFuncSeparatei
+GLAD_API_CALL PFNGLBLENDFUNCIPROC sf_glad_glBlendFunci;
+#define glBlendFunci sf_glad_glBlendFunci
+GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC sf_glad_glBlitFramebuffer;
+#define glBlitFramebuffer sf_glad_glBlitFramebuffer
+GLAD_API_CALL PFNGLBLITFRAMEBUFFEREXTPROC sf_glad_glBlitFramebufferEXT;
+#define glBlitFramebufferEXT sf_glad_glBlitFramebufferEXT
+GLAD_API_CALL PFNGLBLITNAMEDFRAMEBUFFERPROC sf_glad_glBlitNamedFramebuffer;
+#define glBlitNamedFramebuffer sf_glad_glBlitNamedFramebuffer
+GLAD_API_CALL PFNGLBUFFERDATAPROC sf_glad_glBufferData;
+#define glBufferData sf_glad_glBufferData
+GLAD_API_CALL PFNGLBUFFERDATAARBPROC sf_glad_glBufferDataARB;
+#define glBufferDataARB sf_glad_glBufferDataARB
+GLAD_API_CALL PFNGLBUFFERSTORAGEPROC sf_glad_glBufferStorage;
+#define glBufferStorage sf_glad_glBufferStorage
+GLAD_API_CALL PFNGLBUFFERSUBDATAPROC sf_glad_glBufferSubData;
+#define glBufferSubData sf_glad_glBufferSubData
+GLAD_API_CALL PFNGLBUFFERSUBDATAARBPROC sf_glad_glBufferSubDataARB;
+#define glBufferSubDataARB sf_glad_glBufferSubDataARB
+GLAD_API_CALL PFNGLCALLLISTPROC sf_glad_glCallList;
+#define glCallList sf_glad_glCallList
+GLAD_API_CALL PFNGLCALLLISTSPROC sf_glad_glCallLists;
+#define glCallLists sf_glad_glCallLists
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC sf_glad_glCheckFramebufferStatus;
+#define glCheckFramebufferStatus sf_glad_glCheckFramebufferStatus
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC sf_glad_glCheckFramebufferStatusEXT;
+#define glCheckFramebufferStatusEXT sf_glad_glCheckFramebufferStatusEXT
+GLAD_API_CALL PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC sf_glad_glCheckNamedFramebufferStatus;
+#define glCheckNamedFramebufferStatus sf_glad_glCheckNamedFramebufferStatus
+GLAD_API_CALL PFNGLCLAMPCOLORPROC sf_glad_glClampColor;
+#define glClampColor sf_glad_glClampColor
+GLAD_API_CALL PFNGLCLEARPROC sf_glad_glClear;
+#define glClear sf_glad_glClear
+GLAD_API_CALL PFNGLCLEARACCUMPROC sf_glad_glClearAccum;
+#define glClearAccum sf_glad_glClearAccum
+GLAD_API_CALL PFNGLCLEARBUFFERDATAPROC sf_glad_glClearBufferData;
+#define glClearBufferData sf_glad_glClearBufferData
+GLAD_API_CALL PFNGLCLEARBUFFERSUBDATAPROC sf_glad_glClearBufferSubData;
+#define glClearBufferSubData sf_glad_glClearBufferSubData
+GLAD_API_CALL PFNGLCLEARBUFFERFIPROC sf_glad_glClearBufferfi;
+#define glClearBufferfi sf_glad_glClearBufferfi
+GLAD_API_CALL PFNGLCLEARBUFFERFVPROC sf_glad_glClearBufferfv;
+#define glClearBufferfv sf_glad_glClearBufferfv
+GLAD_API_CALL PFNGLCLEARBUFFERIVPROC sf_glad_glClearBufferiv;
+#define glClearBufferiv sf_glad_glClearBufferiv
+GLAD_API_CALL PFNGLCLEARBUFFERUIVPROC sf_glad_glClearBufferuiv;
+#define glClearBufferuiv sf_glad_glClearBufferuiv
+GLAD_API_CALL PFNGLCLEARCOLORPROC sf_glad_glClearColor;
+#define glClearColor sf_glad_glClearColor
+GLAD_API_CALL PFNGLCLEARDEPTHPROC sf_glad_glClearDepth;
+#define glClearDepth sf_glad_glClearDepth
+GLAD_API_CALL PFNGLCLEARDEPTHFPROC sf_glad_glClearDepthf;
+#define glClearDepthf sf_glad_glClearDepthf
+GLAD_API_CALL PFNGLCLEARDEPTHFOESPROC sf_glad_glClearDepthfOES;
+#define glClearDepthfOES sf_glad_glClearDepthfOES
+GLAD_API_CALL PFNGLCLEARINDEXPROC sf_glad_glClearIndex;
+#define glClearIndex sf_glad_glClearIndex
+GLAD_API_CALL PFNGLCLEARNAMEDBUFFERDATAPROC sf_glad_glClearNamedBufferData;
+#define glClearNamedBufferData sf_glad_glClearNamedBufferData
+GLAD_API_CALL PFNGLCLEARNAMEDBUFFERSUBDATAPROC sf_glad_glClearNamedBufferSubData;
+#define glClearNamedBufferSubData sf_glad_glClearNamedBufferSubData
+GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFIPROC sf_glad_glClearNamedFramebufferfi;
+#define glClearNamedFramebufferfi sf_glad_glClearNamedFramebufferfi
+GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFVPROC sf_glad_glClearNamedFramebufferfv;
+#define glClearNamedFramebufferfv sf_glad_glClearNamedFramebufferfv
+GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERIVPROC sf_glad_glClearNamedFramebufferiv;
+#define glClearNamedFramebufferiv sf_glad_glClearNamedFramebufferiv
+GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC sf_glad_glClearNamedFramebufferuiv;
+#define glClearNamedFramebufferuiv sf_glad_glClearNamedFramebufferuiv
+GLAD_API_CALL PFNGLCLEARSTENCILPROC sf_glad_glClearStencil;
+#define glClearStencil sf_glad_glClearStencil
+GLAD_API_CALL PFNGLCLEARTEXIMAGEPROC sf_glad_glClearTexImage;
+#define glClearTexImage sf_glad_glClearTexImage
+GLAD_API_CALL PFNGLCLEARTEXSUBIMAGEPROC sf_glad_glClearTexSubImage;
+#define glClearTexSubImage sf_glad_glClearTexSubImage
+GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREPROC sf_glad_glClientActiveTexture;
+#define glClientActiveTexture sf_glad_glClientActiveTexture
+GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREARBPROC sf_glad_glClientActiveTextureARB;
+#define glClientActiveTextureARB sf_glad_glClientActiveTextureARB
+GLAD_API_CALL PFNGLCLIENTWAITSYNCPROC sf_glad_glClientWaitSync;
+#define glClientWaitSync sf_glad_glClientWaitSync
+GLAD_API_CALL PFNGLCLIPCONTROLPROC sf_glad_glClipControl;
+#define glClipControl sf_glad_glClipControl
+GLAD_API_CALL PFNGLCLIPPLANEPROC sf_glad_glClipPlane;
+#define glClipPlane sf_glad_glClipPlane
+GLAD_API_CALL PFNGLCLIPPLANEFOESPROC sf_glad_glClipPlanefOES;
+#define glClipPlanefOES sf_glad_glClipPlanefOES
+GLAD_API_CALL PFNGLCOLOR3BPROC sf_glad_glColor3b;
+#define glColor3b sf_glad_glColor3b
+GLAD_API_CALL PFNGLCOLOR3BVPROC sf_glad_glColor3bv;
+#define glColor3bv sf_glad_glColor3bv
+GLAD_API_CALL PFNGLCOLOR3DPROC sf_glad_glColor3d;
+#define glColor3d sf_glad_glColor3d
+GLAD_API_CALL PFNGLCOLOR3DVPROC sf_glad_glColor3dv;
+#define glColor3dv sf_glad_glColor3dv
+GLAD_API_CALL PFNGLCOLOR3FPROC sf_glad_glColor3f;
+#define glColor3f sf_glad_glColor3f
+GLAD_API_CALL PFNGLCOLOR3FVPROC sf_glad_glColor3fv;
+#define glColor3fv sf_glad_glColor3fv
+GLAD_API_CALL PFNGLCOLOR3IPROC sf_glad_glColor3i;
+#define glColor3i sf_glad_glColor3i
+GLAD_API_CALL PFNGLCOLOR3IVPROC sf_glad_glColor3iv;
+#define glColor3iv sf_glad_glColor3iv
+GLAD_API_CALL PFNGLCOLOR3SPROC sf_glad_glColor3s;
+#define glColor3s sf_glad_glColor3s
+GLAD_API_CALL PFNGLCOLOR3SVPROC sf_glad_glColor3sv;
+#define glColor3sv sf_glad_glColor3sv
+GLAD_API_CALL PFNGLCOLOR3UBPROC sf_glad_glColor3ub;
+#define glColor3ub sf_glad_glColor3ub
+GLAD_API_CALL PFNGLCOLOR3UBVPROC sf_glad_glColor3ubv;
+#define glColor3ubv sf_glad_glColor3ubv
+GLAD_API_CALL PFNGLCOLOR3UIPROC sf_glad_glColor3ui;
+#define glColor3ui sf_glad_glColor3ui
+GLAD_API_CALL PFNGLCOLOR3UIVPROC sf_glad_glColor3uiv;
+#define glColor3uiv sf_glad_glColor3uiv
+GLAD_API_CALL PFNGLCOLOR3USPROC sf_glad_glColor3us;
+#define glColor3us sf_glad_glColor3us
+GLAD_API_CALL PFNGLCOLOR3USVPROC sf_glad_glColor3usv;
+#define glColor3usv sf_glad_glColor3usv
+GLAD_API_CALL PFNGLCOLOR4BPROC sf_glad_glColor4b;
+#define glColor4b sf_glad_glColor4b
+GLAD_API_CALL PFNGLCOLOR4BVPROC sf_glad_glColor4bv;
+#define glColor4bv sf_glad_glColor4bv
+GLAD_API_CALL PFNGLCOLOR4DPROC sf_glad_glColor4d;
+#define glColor4d sf_glad_glColor4d
+GLAD_API_CALL PFNGLCOLOR4DVPROC sf_glad_glColor4dv;
+#define glColor4dv sf_glad_glColor4dv
+GLAD_API_CALL PFNGLCOLOR4FPROC sf_glad_glColor4f;
+#define glColor4f sf_glad_glColor4f
+GLAD_API_CALL PFNGLCOLOR4FVPROC sf_glad_glColor4fv;
+#define glColor4fv sf_glad_glColor4fv
+GLAD_API_CALL PFNGLCOLOR4IPROC sf_glad_glColor4i;
+#define glColor4i sf_glad_glColor4i
+GLAD_API_CALL PFNGLCOLOR4IVPROC sf_glad_glColor4iv;
+#define glColor4iv sf_glad_glColor4iv
+GLAD_API_CALL PFNGLCOLOR4SPROC sf_glad_glColor4s;
+#define glColor4s sf_glad_glColor4s
+GLAD_API_CALL PFNGLCOLOR4SVPROC sf_glad_glColor4sv;
+#define glColor4sv sf_glad_glColor4sv
+GLAD_API_CALL PFNGLCOLOR4UBPROC sf_glad_glColor4ub;
+#define glColor4ub sf_glad_glColor4ub
+GLAD_API_CALL PFNGLCOLOR4UBVPROC sf_glad_glColor4ubv;
+#define glColor4ubv sf_glad_glColor4ubv
+GLAD_API_CALL PFNGLCOLOR4UIPROC sf_glad_glColor4ui;
+#define glColor4ui sf_glad_glColor4ui
+GLAD_API_CALL PFNGLCOLOR4UIVPROC sf_glad_glColor4uiv;
+#define glColor4uiv sf_glad_glColor4uiv
+GLAD_API_CALL PFNGLCOLOR4USPROC sf_glad_glColor4us;
+#define glColor4us sf_glad_glColor4us
+GLAD_API_CALL PFNGLCOLOR4USVPROC sf_glad_glColor4usv;
+#define glColor4usv sf_glad_glColor4usv
+GLAD_API_CALL PFNGLCOLORMASKPROC sf_glad_glColorMask;
+#define glColorMask sf_glad_glColorMask
+GLAD_API_CALL PFNGLCOLORMASKIPROC sf_glad_glColorMaski;
+#define glColorMaski sf_glad_glColorMaski
+GLAD_API_CALL PFNGLCOLORMATERIALPROC sf_glad_glColorMaterial;
+#define glColorMaterial sf_glad_glColorMaterial
+GLAD_API_CALL PFNGLCOLORP3UIPROC sf_glad_glColorP3ui;
+#define glColorP3ui sf_glad_glColorP3ui
+GLAD_API_CALL PFNGLCOLORP3UIVPROC sf_glad_glColorP3uiv;
+#define glColorP3uiv sf_glad_glColorP3uiv
+GLAD_API_CALL PFNGLCOLORP4UIPROC sf_glad_glColorP4ui;
+#define glColorP4ui sf_glad_glColorP4ui
+GLAD_API_CALL PFNGLCOLORP4UIVPROC sf_glad_glColorP4uiv;
+#define glColorP4uiv sf_glad_glColorP4uiv
+GLAD_API_CALL PFNGLCOLORPOINTERPROC sf_glad_glColorPointer;
+#define glColorPointer sf_glad_glColorPointer
+GLAD_API_CALL PFNGLCOLORPOINTEREXTPROC sf_glad_glColorPointerEXT;
+#define glColorPointerEXT sf_glad_glColorPointerEXT
+GLAD_API_CALL PFNGLCOLORSUBTABLEPROC sf_glad_glColorSubTable;
+#define glColorSubTable sf_glad_glColorSubTable
+GLAD_API_CALL PFNGLCOLORTABLEPROC sf_glad_glColorTable;
+#define glColorTable sf_glad_glColorTable
+GLAD_API_CALL PFNGLCOLORTABLEPARAMETERFVPROC sf_glad_glColorTableParameterfv;
+#define glColorTableParameterfv sf_glad_glColorTableParameterfv
+GLAD_API_CALL PFNGLCOLORTABLEPARAMETERIVPROC sf_glad_glColorTableParameteriv;
+#define glColorTableParameteriv sf_glad_glColorTableParameteriv
+GLAD_API_CALL PFNGLCOMPILESHADERPROC sf_glad_glCompileShader;
+#define glCompileShader sf_glad_glCompileShader
+GLAD_API_CALL PFNGLCOMPILESHADERARBPROC sf_glad_glCompileShaderARB;
+#define glCompileShaderARB sf_glad_glCompileShaderARB
+GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE1DPROC sf_glad_glCompressedTexImage1D;
+#define glCompressedTexImage1D sf_glad_glCompressedTexImage1D
+GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC sf_glad_glCompressedTexImage2D;
+#define glCompressedTexImage2D sf_glad_glCompressedTexImage2D
+GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DPROC sf_glad_glCompressedTexImage3D;
+#define glCompressedTexImage3D sf_glad_glCompressedTexImage3D
+GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC sf_glad_glCompressedTexSubImage1D;
+#define glCompressedTexSubImage1D sf_glad_glCompressedTexSubImage1D
+GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC sf_glad_glCompressedTexSubImage2D;
+#define glCompressedTexSubImage2D sf_glad_glCompressedTexSubImage2D
+GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC sf_glad_glCompressedTexSubImage3D;
+#define glCompressedTexSubImage3D sf_glad_glCompressedTexSubImage3D
+GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC sf_glad_glCompressedTextureSubImage1D;
+#define glCompressedTextureSubImage1D sf_glad_glCompressedTextureSubImage1D
+GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC sf_glad_glCompressedTextureSubImage2D;
+#define glCompressedTextureSubImage2D sf_glad_glCompressedTextureSubImage2D
+GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC sf_glad_glCompressedTextureSubImage3D;
+#define glCompressedTextureSubImage3D sf_glad_glCompressedTextureSubImage3D
+GLAD_API_CALL PFNGLCONVOLUTIONFILTER1DPROC sf_glad_glConvolutionFilter1D;
+#define glConvolutionFilter1D sf_glad_glConvolutionFilter1D
+GLAD_API_CALL PFNGLCONVOLUTIONFILTER2DPROC sf_glad_glConvolutionFilter2D;
+#define glConvolutionFilter2D sf_glad_glConvolutionFilter2D
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFPROC sf_glad_glConvolutionParameterf;
+#define glConvolutionParameterf sf_glad_glConvolutionParameterf
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFVPROC sf_glad_glConvolutionParameterfv;
+#define glConvolutionParameterfv sf_glad_glConvolutionParameterfv
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIPROC sf_glad_glConvolutionParameteri;
+#define glConvolutionParameteri sf_glad_glConvolutionParameteri
+GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIVPROC sf_glad_glConvolutionParameteriv;
+#define glConvolutionParameteriv sf_glad_glConvolutionParameteriv
+GLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC sf_glad_glCopyBufferSubData;
+#define glCopyBufferSubData sf_glad_glCopyBufferSubData
+GLAD_API_CALL PFNGLCOPYCOLORSUBTABLEPROC sf_glad_glCopyColorSubTable;
+#define glCopyColorSubTable sf_glad_glCopyColorSubTable
+GLAD_API_CALL PFNGLCOPYCOLORTABLEPROC sf_glad_glCopyColorTable;
+#define glCopyColorTable sf_glad_glCopyColorTable
+GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER1DPROC sf_glad_glCopyConvolutionFilter1D;
+#define glCopyConvolutionFilter1D sf_glad_glCopyConvolutionFilter1D
+GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER2DPROC sf_glad_glCopyConvolutionFilter2D;
+#define glCopyConvolutionFilter2D sf_glad_glCopyConvolutionFilter2D
+GLAD_API_CALL PFNGLCOPYIMAGESUBDATAPROC sf_glad_glCopyImageSubData;
+#define glCopyImageSubData sf_glad_glCopyImageSubData
+GLAD_API_CALL PFNGLCOPYNAMEDBUFFERSUBDATAPROC sf_glad_glCopyNamedBufferSubData;
+#define glCopyNamedBufferSubData sf_glad_glCopyNamedBufferSubData
+GLAD_API_CALL PFNGLCOPYPIXELSPROC sf_glad_glCopyPixels;
+#define glCopyPixels sf_glad_glCopyPixels
+GLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC sf_glad_glCopyTexImage1D;
+#define glCopyTexImage1D sf_glad_glCopyTexImage1D
+GLAD_API_CALL PFNGLCOPYTEXIMAGE1DEXTPROC sf_glad_glCopyTexImage1DEXT;
+#define glCopyTexImage1DEXT sf_glad_glCopyTexImage1DEXT
+GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC sf_glad_glCopyTexImage2D;
+#define glCopyTexImage2D sf_glad_glCopyTexImage2D
+GLAD_API_CALL PFNGLCOPYTEXIMAGE2DEXTPROC sf_glad_glCopyTexImage2DEXT;
+#define glCopyTexImage2DEXT sf_glad_glCopyTexImage2DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DPROC sf_glad_glCopyTexSubImage1D;
+#define glCopyTexSubImage1D sf_glad_glCopyTexSubImage1D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DEXTPROC sf_glad_glCopyTexSubImage1DEXT;
+#define glCopyTexSubImage1DEXT sf_glad_glCopyTexSubImage1DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC sf_glad_glCopyTexSubImage2D;
+#define glCopyTexSubImage2D sf_glad_glCopyTexSubImage2D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DEXTPROC sf_glad_glCopyTexSubImage2DEXT;
+#define glCopyTexSubImage2DEXT sf_glad_glCopyTexSubImage2DEXT
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC sf_glad_glCopyTexSubImage3D;
+#define glCopyTexSubImage3D sf_glad_glCopyTexSubImage3D
+GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DEXTPROC sf_glad_glCopyTexSubImage3DEXT;
+#define glCopyTexSubImage3DEXT sf_glad_glCopyTexSubImage3DEXT
+GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE1DPROC sf_glad_glCopyTextureSubImage1D;
+#define glCopyTextureSubImage1D sf_glad_glCopyTextureSubImage1D
+GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE2DPROC sf_glad_glCopyTextureSubImage2D;
+#define glCopyTextureSubImage2D sf_glad_glCopyTextureSubImage2D
+GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE3DPROC sf_glad_glCopyTextureSubImage3D;
+#define glCopyTextureSubImage3D sf_glad_glCopyTextureSubImage3D
+GLAD_API_CALL PFNGLCREATEBUFFERSPROC sf_glad_glCreateBuffers;
+#define glCreateBuffers sf_glad_glCreateBuffers
+GLAD_API_CALL PFNGLCREATEFRAMEBUFFERSPROC sf_glad_glCreateFramebuffers;
+#define glCreateFramebuffers sf_glad_glCreateFramebuffers
+GLAD_API_CALL PFNGLCREATEPROGRAMPROC sf_glad_glCreateProgram;
+#define glCreateProgram sf_glad_glCreateProgram
+GLAD_API_CALL PFNGLCREATEPROGRAMOBJECTARBPROC sf_glad_glCreateProgramObjectARB;
+#define glCreateProgramObjectARB sf_glad_glCreateProgramObjectARB
+GLAD_API_CALL PFNGLCREATEPROGRAMPIPELINESPROC sf_glad_glCreateProgramPipelines;
+#define glCreateProgramPipelines sf_glad_glCreateProgramPipelines
+GLAD_API_CALL PFNGLCREATEQUERIESPROC sf_glad_glCreateQueries;
+#define glCreateQueries sf_glad_glCreateQueries
+GLAD_API_CALL PFNGLCREATERENDERBUFFERSPROC sf_glad_glCreateRenderbuffers;
+#define glCreateRenderbuffers sf_glad_glCreateRenderbuffers
+GLAD_API_CALL PFNGLCREATESAMPLERSPROC sf_glad_glCreateSamplers;
+#define glCreateSamplers sf_glad_glCreateSamplers
+GLAD_API_CALL PFNGLCREATESHADERPROC sf_glad_glCreateShader;
+#define glCreateShader sf_glad_glCreateShader
+GLAD_API_CALL PFNGLCREATESHADEROBJECTARBPROC sf_glad_glCreateShaderObjectARB;
+#define glCreateShaderObjectARB sf_glad_glCreateShaderObjectARB
+GLAD_API_CALL PFNGLCREATESHADERPROGRAMVPROC sf_glad_glCreateShaderProgramv;
+#define glCreateShaderProgramv sf_glad_glCreateShaderProgramv
+GLAD_API_CALL PFNGLCREATETEXTURESPROC sf_glad_glCreateTextures;
+#define glCreateTextures sf_glad_glCreateTextures
+GLAD_API_CALL PFNGLCREATETRANSFORMFEEDBACKSPROC sf_glad_glCreateTransformFeedbacks;
+#define glCreateTransformFeedbacks sf_glad_glCreateTransformFeedbacks
+GLAD_API_CALL PFNGLCREATEVERTEXARRAYSPROC sf_glad_glCreateVertexArrays;
+#define glCreateVertexArrays sf_glad_glCreateVertexArrays
+GLAD_API_CALL PFNGLCULLFACEPROC sf_glad_glCullFace;
+#define glCullFace sf_glad_glCullFace
+GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKPROC sf_glad_glDebugMessageCallback;
+#define glDebugMessageCallback sf_glad_glDebugMessageCallback
+GLAD_API_CALL PFNGLDEBUGMESSAGECONTROLPROC sf_glad_glDebugMessageControl;
+#define glDebugMessageControl sf_glad_glDebugMessageControl
+GLAD_API_CALL PFNGLDEBUGMESSAGEINSERTPROC sf_glad_glDebugMessageInsert;
+#define glDebugMessageInsert sf_glad_glDebugMessageInsert
+GLAD_API_CALL PFNGLDELETEBUFFERSPROC sf_glad_glDeleteBuffers;
+#define glDeleteBuffers sf_glad_glDeleteBuffers
+GLAD_API_CALL PFNGLDELETEBUFFERSARBPROC sf_glad_glDeleteBuffersARB;
+#define glDeleteBuffersARB sf_glad_glDeleteBuffersARB
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC sf_glad_glDeleteFramebuffers;
+#define glDeleteFramebuffers sf_glad_glDeleteFramebuffers
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSEXTPROC sf_glad_glDeleteFramebuffersEXT;
+#define glDeleteFramebuffersEXT sf_glad_glDeleteFramebuffersEXT
+GLAD_API_CALL PFNGLDELETELISTSPROC sf_glad_glDeleteLists;
+#define glDeleteLists sf_glad_glDeleteLists
+GLAD_API_CALL PFNGLDELETEOBJECTARBPROC sf_glad_glDeleteObjectARB;
+#define glDeleteObjectARB sf_glad_glDeleteObjectARB
+GLAD_API_CALL PFNGLDELETEPROGRAMPROC sf_glad_glDeleteProgram;
+#define glDeleteProgram sf_glad_glDeleteProgram
+GLAD_API_CALL PFNGLDELETEPROGRAMPIPELINESPROC sf_glad_glDeleteProgramPipelines;
+#define glDeleteProgramPipelines sf_glad_glDeleteProgramPipelines
+GLAD_API_CALL PFNGLDELETEPROGRAMSARBPROC sf_glad_glDeleteProgramsARB;
+#define glDeleteProgramsARB sf_glad_glDeleteProgramsARB
+GLAD_API_CALL PFNGLDELETEPROGRAMSNVPROC sf_glad_glDeleteProgramsNV;
+#define glDeleteProgramsNV sf_glad_glDeleteProgramsNV
+GLAD_API_CALL PFNGLDELETEQUERIESPROC sf_glad_glDeleteQueries;
+#define glDeleteQueries sf_glad_glDeleteQueries
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC sf_glad_glDeleteRenderbuffers;
+#define glDeleteRenderbuffers sf_glad_glDeleteRenderbuffers
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSEXTPROC sf_glad_glDeleteRenderbuffersEXT;
+#define glDeleteRenderbuffersEXT sf_glad_glDeleteRenderbuffersEXT
+GLAD_API_CALL PFNGLDELETESAMPLERSPROC sf_glad_glDeleteSamplers;
+#define glDeleteSamplers sf_glad_glDeleteSamplers
+GLAD_API_CALL PFNGLDELETESHADERPROC sf_glad_glDeleteShader;
+#define glDeleteShader sf_glad_glDeleteShader
+GLAD_API_CALL PFNGLDELETESYNCPROC sf_glad_glDeleteSync;
+#define glDeleteSync sf_glad_glDeleteSync
+GLAD_API_CALL PFNGLDELETETEXTURESPROC sf_glad_glDeleteTextures;
+#define glDeleteTextures sf_glad_glDeleteTextures
+GLAD_API_CALL PFNGLDELETETEXTURESEXTPROC sf_glad_glDeleteTexturesEXT;
+#define glDeleteTexturesEXT sf_glad_glDeleteTexturesEXT
+GLAD_API_CALL PFNGLDELETETRANSFORMFEEDBACKSPROC sf_glad_glDeleteTransformFeedbacks;
+#define glDeleteTransformFeedbacks sf_glad_glDeleteTransformFeedbacks
+GLAD_API_CALL PFNGLDELETEVERTEXARRAYSPROC sf_glad_glDeleteVertexArrays;
+#define glDeleteVertexArrays sf_glad_glDeleteVertexArrays
+GLAD_API_CALL PFNGLDEPTHFUNCPROC sf_glad_glDepthFunc;
+#define glDepthFunc sf_glad_glDepthFunc
+GLAD_API_CALL PFNGLDEPTHMASKPROC sf_glad_glDepthMask;
+#define glDepthMask sf_glad_glDepthMask
+GLAD_API_CALL PFNGLDEPTHRANGEPROC sf_glad_glDepthRange;
+#define glDepthRange sf_glad_glDepthRange
+GLAD_API_CALL PFNGLDEPTHRANGEARRAYDVNVPROC sf_glad_glDepthRangeArraydvNV;
+#define glDepthRangeArraydvNV sf_glad_glDepthRangeArraydvNV
+GLAD_API_CALL PFNGLDEPTHRANGEARRAYVPROC sf_glad_glDepthRangeArrayv;
+#define glDepthRangeArrayv sf_glad_glDepthRangeArrayv
+GLAD_API_CALL PFNGLDEPTHRANGEINDEXEDPROC sf_glad_glDepthRangeIndexed;
+#define glDepthRangeIndexed sf_glad_glDepthRangeIndexed
+GLAD_API_CALL PFNGLDEPTHRANGEINDEXEDDNVPROC sf_glad_glDepthRangeIndexeddNV;
+#define glDepthRangeIndexeddNV sf_glad_glDepthRangeIndexeddNV
+GLAD_API_CALL PFNGLDEPTHRANGEFPROC sf_glad_glDepthRangef;
+#define glDepthRangef sf_glad_glDepthRangef
+GLAD_API_CALL PFNGLDEPTHRANGEFOESPROC sf_glad_glDepthRangefOES;
+#define glDepthRangefOES sf_glad_glDepthRangefOES
+GLAD_API_CALL PFNGLDETACHOBJECTARBPROC sf_glad_glDetachObjectARB;
+#define glDetachObjectARB sf_glad_glDetachObjectARB
+GLAD_API_CALL PFNGLDETACHSHADERPROC sf_glad_glDetachShader;
+#define glDetachShader sf_glad_glDetachShader
+GLAD_API_CALL PFNGLDISABLEPROC sf_glad_glDisable;
+#define glDisable sf_glad_glDisable
+GLAD_API_CALL PFNGLDISABLECLIENTSTATEPROC sf_glad_glDisableClientState;
+#define glDisableClientState sf_glad_glDisableClientState
+GLAD_API_CALL PFNGLDISABLEVERTEXARRAYATTRIBPROC sf_glad_glDisableVertexArrayAttrib;
+#define glDisableVertexArrayAttrib sf_glad_glDisableVertexArrayAttrib
+GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC sf_glad_glDisableVertexAttribArray;
+#define glDisableVertexAttribArray sf_glad_glDisableVertexAttribArray
+GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYARBPROC sf_glad_glDisableVertexAttribArrayARB;
+#define glDisableVertexAttribArrayARB sf_glad_glDisableVertexAttribArrayARB
+GLAD_API_CALL PFNGLDISABLEIPROC sf_glad_glDisablei;
+#define glDisablei sf_glad_glDisablei
+GLAD_API_CALL PFNGLDISPATCHCOMPUTEPROC sf_glad_glDispatchCompute;
+#define glDispatchCompute sf_glad_glDispatchCompute
+GLAD_API_CALL PFNGLDISPATCHCOMPUTEINDIRECTPROC sf_glad_glDispatchComputeIndirect;
+#define glDispatchComputeIndirect sf_glad_glDispatchComputeIndirect
+GLAD_API_CALL PFNGLDRAWARRAYSPROC sf_glad_glDrawArrays;
+#define glDrawArrays sf_glad_glDrawArrays
+GLAD_API_CALL PFNGLDRAWARRAYSEXTPROC sf_glad_glDrawArraysEXT;
+#define glDrawArraysEXT sf_glad_glDrawArraysEXT
+GLAD_API_CALL PFNGLDRAWARRAYSINDIRECTPROC sf_glad_glDrawArraysIndirect;
+#define glDrawArraysIndirect sf_glad_glDrawArraysIndirect
+GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDPROC sf_glad_glDrawArraysInstanced;
+#define glDrawArraysInstanced sf_glad_glDrawArraysInstanced
+GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC sf_glad_glDrawArraysInstancedBaseInstance;
+#define glDrawArraysInstancedBaseInstance sf_glad_glDrawArraysInstancedBaseInstance
+GLAD_API_CALL PFNGLDRAWBUFFERPROC sf_glad_glDrawBuffer;
+#define glDrawBuffer sf_glad_glDrawBuffer
+GLAD_API_CALL PFNGLDRAWBUFFERSPROC sf_glad_glDrawBuffers;
+#define glDrawBuffers sf_glad_glDrawBuffers
+GLAD_API_CALL PFNGLDRAWELEMENTSPROC sf_glad_glDrawElements;
+#define glDrawElements sf_glad_glDrawElements
+GLAD_API_CALL PFNGLDRAWELEMENTSBASEVERTEXPROC sf_glad_glDrawElementsBaseVertex;
+#define glDrawElementsBaseVertex sf_glad_glDrawElementsBaseVertex
+GLAD_API_CALL PFNGLDRAWELEMENTSINDIRECTPROC sf_glad_glDrawElementsIndirect;
+#define glDrawElementsIndirect sf_glad_glDrawElementsIndirect
+GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDPROC sf_glad_glDrawElementsInstanced;
+#define glDrawElementsInstanced sf_glad_glDrawElementsInstanced
+GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC sf_glad_glDrawElementsInstancedBaseInstance;
+#define glDrawElementsInstancedBaseInstance sf_glad_glDrawElementsInstancedBaseInstance
+GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC sf_glad_glDrawElementsInstancedBaseVertex;
+#define glDrawElementsInstancedBaseVertex sf_glad_glDrawElementsInstancedBaseVertex
+GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC sf_glad_glDrawElementsInstancedBaseVertexBaseInstance;
+#define glDrawElementsInstancedBaseVertexBaseInstance sf_glad_glDrawElementsInstancedBaseVertexBaseInstance
+GLAD_API_CALL PFNGLDRAWPIXELSPROC sf_glad_glDrawPixels;
+#define glDrawPixels sf_glad_glDrawPixels
+GLAD_API_CALL PFNGLDRAWRANGEELEMENTSPROC sf_glad_glDrawRangeElements;
+#define glDrawRangeElements sf_glad_glDrawRangeElements
+GLAD_API_CALL PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC sf_glad_glDrawRangeElementsBaseVertex;
+#define glDrawRangeElementsBaseVertex sf_glad_glDrawRangeElementsBaseVertex
+GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKPROC sf_glad_glDrawTransformFeedback;
+#define glDrawTransformFeedback sf_glad_glDrawTransformFeedback
+GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC sf_glad_glDrawTransformFeedbackInstanced;
+#define glDrawTransformFeedbackInstanced sf_glad_glDrawTransformFeedbackInstanced
+GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC sf_glad_glDrawTransformFeedbackStream;
+#define glDrawTransformFeedbackStream sf_glad_glDrawTransformFeedbackStream
+GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC sf_glad_glDrawTransformFeedbackStreamInstanced;
+#define glDrawTransformFeedbackStreamInstanced sf_glad_glDrawTransformFeedbackStreamInstanced
+GLAD_API_CALL PFNGLEDGEFLAGPROC sf_glad_glEdgeFlag;
+#define glEdgeFlag sf_glad_glEdgeFlag
+GLAD_API_CALL PFNGLEDGEFLAGPOINTERPROC sf_glad_glEdgeFlagPointer;
+#define glEdgeFlagPointer sf_glad_glEdgeFlagPointer
+GLAD_API_CALL PFNGLEDGEFLAGPOINTEREXTPROC sf_glad_glEdgeFlagPointerEXT;
+#define glEdgeFlagPointerEXT sf_glad_glEdgeFlagPointerEXT
+GLAD_API_CALL PFNGLEDGEFLAGVPROC sf_glad_glEdgeFlagv;
+#define glEdgeFlagv sf_glad_glEdgeFlagv
+GLAD_API_CALL PFNGLENABLEPROC sf_glad_glEnable;
+#define glEnable sf_glad_glEnable
+GLAD_API_CALL PFNGLENABLECLIENTSTATEPROC sf_glad_glEnableClientState;
+#define glEnableClientState sf_glad_glEnableClientState
+GLAD_API_CALL PFNGLENABLEVERTEXARRAYATTRIBPROC sf_glad_glEnableVertexArrayAttrib;
+#define glEnableVertexArrayAttrib sf_glad_glEnableVertexArrayAttrib
+GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC sf_glad_glEnableVertexAttribArray;
+#define glEnableVertexAttribArray sf_glad_glEnableVertexAttribArray
+GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYARBPROC sf_glad_glEnableVertexAttribArrayARB;
+#define glEnableVertexAttribArrayARB sf_glad_glEnableVertexAttribArrayARB
+GLAD_API_CALL PFNGLENABLEIPROC sf_glad_glEnablei;
+#define glEnablei sf_glad_glEnablei
+GLAD_API_CALL PFNGLENDPROC sf_glad_glEnd;
+#define glEnd sf_glad_glEnd
+GLAD_API_CALL PFNGLENDCONDITIONALRENDERPROC sf_glad_glEndConditionalRender;
+#define glEndConditionalRender sf_glad_glEndConditionalRender
+GLAD_API_CALL PFNGLENDLISTPROC sf_glad_glEndList;
+#define glEndList sf_glad_glEndList
+GLAD_API_CALL PFNGLENDQUERYPROC sf_glad_glEndQuery;
+#define glEndQuery sf_glad_glEndQuery
+GLAD_API_CALL PFNGLENDQUERYINDEXEDPROC sf_glad_glEndQueryIndexed;
+#define glEndQueryIndexed sf_glad_glEndQueryIndexed
+GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKPROC sf_glad_glEndTransformFeedback;
+#define glEndTransformFeedback sf_glad_glEndTransformFeedback
+GLAD_API_CALL PFNGLEVALCOORD1DPROC sf_glad_glEvalCoord1d;
+#define glEvalCoord1d sf_glad_glEvalCoord1d
+GLAD_API_CALL PFNGLEVALCOORD1DVPROC sf_glad_glEvalCoord1dv;
+#define glEvalCoord1dv sf_glad_glEvalCoord1dv
+GLAD_API_CALL PFNGLEVALCOORD1FPROC sf_glad_glEvalCoord1f;
+#define glEvalCoord1f sf_glad_glEvalCoord1f
+GLAD_API_CALL PFNGLEVALCOORD1FVPROC sf_glad_glEvalCoord1fv;
+#define glEvalCoord1fv sf_glad_glEvalCoord1fv
+GLAD_API_CALL PFNGLEVALCOORD2DPROC sf_glad_glEvalCoord2d;
+#define glEvalCoord2d sf_glad_glEvalCoord2d
+GLAD_API_CALL PFNGLEVALCOORD2DVPROC sf_glad_glEvalCoord2dv;
+#define glEvalCoord2dv sf_glad_glEvalCoord2dv
+GLAD_API_CALL PFNGLEVALCOORD2FPROC sf_glad_glEvalCoord2f;
+#define glEvalCoord2f sf_glad_glEvalCoord2f
+GLAD_API_CALL PFNGLEVALCOORD2FVPROC sf_glad_glEvalCoord2fv;
+#define glEvalCoord2fv sf_glad_glEvalCoord2fv
+GLAD_API_CALL PFNGLEVALMESH1PROC sf_glad_glEvalMesh1;
+#define glEvalMesh1 sf_glad_glEvalMesh1
+GLAD_API_CALL PFNGLEVALMESH2PROC sf_glad_glEvalMesh2;
+#define glEvalMesh2 sf_glad_glEvalMesh2
+GLAD_API_CALL PFNGLEVALPOINT1PROC sf_glad_glEvalPoint1;
+#define glEvalPoint1 sf_glad_glEvalPoint1
+GLAD_API_CALL PFNGLEVALPOINT2PROC sf_glad_glEvalPoint2;
+#define glEvalPoint2 sf_glad_glEvalPoint2
+GLAD_API_CALL PFNGLEXECUTEPROGRAMNVPROC sf_glad_glExecuteProgramNV;
+#define glExecuteProgramNV sf_glad_glExecuteProgramNV
+GLAD_API_CALL PFNGLFEEDBACKBUFFERPROC sf_glad_glFeedbackBuffer;
+#define glFeedbackBuffer sf_glad_glFeedbackBuffer
+GLAD_API_CALL PFNGLFENCESYNCPROC sf_glad_glFenceSync;
+#define glFenceSync sf_glad_glFenceSync
+GLAD_API_CALL PFNGLFINISHPROC sf_glad_glFinish;
+#define glFinish sf_glad_glFinish
+GLAD_API_CALL PFNGLFLUSHPROC sf_glad_glFlush;
+#define glFlush sf_glad_glFlush
+GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEPROC sf_glad_glFlushMappedBufferRange;
+#define glFlushMappedBufferRange sf_glad_glFlushMappedBufferRange
+GLAD_API_CALL PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC sf_glad_glFlushMappedNamedBufferRange;
+#define glFlushMappedNamedBufferRange sf_glad_glFlushMappedNamedBufferRange
+GLAD_API_CALL PFNGLFOGCOORDPOINTERPROC sf_glad_glFogCoordPointer;
+#define glFogCoordPointer sf_glad_glFogCoordPointer
+GLAD_API_CALL PFNGLFOGCOORDDPROC sf_glad_glFogCoordd;
+#define glFogCoordd sf_glad_glFogCoordd
+GLAD_API_CALL PFNGLFOGCOORDDVPROC sf_glad_glFogCoorddv;
+#define glFogCoorddv sf_glad_glFogCoorddv
+GLAD_API_CALL PFNGLFOGCOORDFPROC sf_glad_glFogCoordf;
+#define glFogCoordf sf_glad_glFogCoordf
+GLAD_API_CALL PFNGLFOGCOORDFVPROC sf_glad_glFogCoordfv;
+#define glFogCoordfv sf_glad_glFogCoordfv
+GLAD_API_CALL PFNGLFOGFPROC sf_glad_glFogf;
+#define glFogf sf_glad_glFogf
+GLAD_API_CALL PFNGLFOGFVPROC sf_glad_glFogfv;
+#define glFogfv sf_glad_glFogfv
+GLAD_API_CALL PFNGLFOGIPROC sf_glad_glFogi;
+#define glFogi sf_glad_glFogi
+GLAD_API_CALL PFNGLFOGIVPROC sf_glad_glFogiv;
+#define glFogiv sf_glad_glFogiv
+GLAD_API_CALL PFNGLFRAMEBUFFERPARAMETERIPROC sf_glad_glFramebufferParameteri;
+#define glFramebufferParameteri sf_glad_glFramebufferParameteri
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC sf_glad_glFramebufferRenderbuffer;
+#define glFramebufferRenderbuffer sf_glad_glFramebufferRenderbuffer
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC sf_glad_glFramebufferRenderbufferEXT;
+#define glFramebufferRenderbufferEXT sf_glad_glFramebufferRenderbufferEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREPROC sf_glad_glFramebufferTexture;
+#define glFramebufferTexture sf_glad_glFramebufferTexture
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DPROC sf_glad_glFramebufferTexture1D;
+#define glFramebufferTexture1D sf_glad_glFramebufferTexture1D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DEXTPROC sf_glad_glFramebufferTexture1DEXT;
+#define glFramebufferTexture1DEXT sf_glad_glFramebufferTexture1DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC sf_glad_glFramebufferTexture2D;
+#define glFramebufferTexture2D sf_glad_glFramebufferTexture2D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DEXTPROC sf_glad_glFramebufferTexture2DEXT;
+#define glFramebufferTexture2DEXT sf_glad_glFramebufferTexture2DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DPROC sf_glad_glFramebufferTexture3D;
+#define glFramebufferTexture3D sf_glad_glFramebufferTexture3D
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DEXTPROC sf_glad_glFramebufferTexture3DEXT;
+#define glFramebufferTexture3DEXT sf_glad_glFramebufferTexture3DEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREARBPROC sf_glad_glFramebufferTextureARB;
+#define glFramebufferTextureARB sf_glad_glFramebufferTextureARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREEXTPROC sf_glad_glFramebufferTextureEXT;
+#define glFramebufferTextureEXT sf_glad_glFramebufferTextureEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEARBPROC sf_glad_glFramebufferTextureFaceARB;
+#define glFramebufferTextureFaceARB sf_glad_glFramebufferTextureFaceARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC sf_glad_glFramebufferTextureFaceEXT;
+#define glFramebufferTextureFaceEXT sf_glad_glFramebufferTextureFaceEXT
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC sf_glad_glFramebufferTextureLayer;
+#define glFramebufferTextureLayer sf_glad_glFramebufferTextureLayer
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERARBPROC sf_glad_glFramebufferTextureLayerARB;
+#define glFramebufferTextureLayerARB sf_glad_glFramebufferTextureLayerARB
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC sf_glad_glFramebufferTextureLayerEXT;
+#define glFramebufferTextureLayerEXT sf_glad_glFramebufferTextureLayerEXT
+GLAD_API_CALL PFNGLFRONTFACEPROC sf_glad_glFrontFace;
+#define glFrontFace sf_glad_glFrontFace
+GLAD_API_CALL PFNGLFRUSTUMPROC sf_glad_glFrustum;
+#define glFrustum sf_glad_glFrustum
+GLAD_API_CALL PFNGLFRUSTUMFOESPROC sf_glad_glFrustumfOES;
+#define glFrustumfOES sf_glad_glFrustumfOES
+GLAD_API_CALL PFNGLGENBUFFERSPROC sf_glad_glGenBuffers;
+#define glGenBuffers sf_glad_glGenBuffers
+GLAD_API_CALL PFNGLGENBUFFERSARBPROC sf_glad_glGenBuffersARB;
+#define glGenBuffersARB sf_glad_glGenBuffersARB
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC sf_glad_glGenFramebuffers;
+#define glGenFramebuffers sf_glad_glGenFramebuffers
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSEXTPROC sf_glad_glGenFramebuffersEXT;
+#define glGenFramebuffersEXT sf_glad_glGenFramebuffersEXT
+GLAD_API_CALL PFNGLGENLISTSPROC sf_glad_glGenLists;
+#define glGenLists sf_glad_glGenLists
+GLAD_API_CALL PFNGLGENPROGRAMPIPELINESPROC sf_glad_glGenProgramPipelines;
+#define glGenProgramPipelines sf_glad_glGenProgramPipelines
+GLAD_API_CALL PFNGLGENPROGRAMSARBPROC sf_glad_glGenProgramsARB;
+#define glGenProgramsARB sf_glad_glGenProgramsARB
+GLAD_API_CALL PFNGLGENPROGRAMSNVPROC sf_glad_glGenProgramsNV;
+#define glGenProgramsNV sf_glad_glGenProgramsNV
+GLAD_API_CALL PFNGLGENQUERIESPROC sf_glad_glGenQueries;
+#define glGenQueries sf_glad_glGenQueries
+GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC sf_glad_glGenRenderbuffers;
+#define glGenRenderbuffers sf_glad_glGenRenderbuffers
+GLAD_API_CALL PFNGLGENRENDERBUFFERSEXTPROC sf_glad_glGenRenderbuffersEXT;
+#define glGenRenderbuffersEXT sf_glad_glGenRenderbuffersEXT
+GLAD_API_CALL PFNGLGENSAMPLERSPROC sf_glad_glGenSamplers;
+#define glGenSamplers sf_glad_glGenSamplers
+GLAD_API_CALL PFNGLGENTEXTURESPROC sf_glad_glGenTextures;
+#define glGenTextures sf_glad_glGenTextures
+GLAD_API_CALL PFNGLGENTEXTURESEXTPROC sf_glad_glGenTexturesEXT;
+#define glGenTexturesEXT sf_glad_glGenTexturesEXT
+GLAD_API_CALL PFNGLGENTRANSFORMFEEDBACKSPROC sf_glad_glGenTransformFeedbacks;
+#define glGenTransformFeedbacks sf_glad_glGenTransformFeedbacks
+GLAD_API_CALL PFNGLGENVERTEXARRAYSPROC sf_glad_glGenVertexArrays;
+#define glGenVertexArrays sf_glad_glGenVertexArrays
+GLAD_API_CALL PFNGLGENERATEMIPMAPPROC sf_glad_glGenerateMipmap;
+#define glGenerateMipmap sf_glad_glGenerateMipmap
+GLAD_API_CALL PFNGLGENERATEMIPMAPEXTPROC sf_glad_glGenerateMipmapEXT;
+#define glGenerateMipmapEXT sf_glad_glGenerateMipmapEXT
+GLAD_API_CALL PFNGLGENERATETEXTUREMIPMAPPROC sf_glad_glGenerateTextureMipmap;
+#define glGenerateTextureMipmap sf_glad_glGenerateTextureMipmap
+GLAD_API_CALL PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC sf_glad_glGetActiveAtomicCounterBufferiv;
+#define glGetActiveAtomicCounterBufferiv sf_glad_glGetActiveAtomicCounterBufferiv
+GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC sf_glad_glGetActiveAttrib;
+#define glGetActiveAttrib sf_glad_glGetActiveAttrib
+GLAD_API_CALL PFNGLGETACTIVEATTRIBARBPROC sf_glad_glGetActiveAttribARB;
+#define glGetActiveAttribARB sf_glad_glGetActiveAttribARB
+GLAD_API_CALL PFNGLGETACTIVESUBROUTINENAMEPROC sf_glad_glGetActiveSubroutineName;
+#define glGetActiveSubroutineName sf_glad_glGetActiveSubroutineName
+GLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC sf_glad_glGetActiveSubroutineUniformName;
+#define glGetActiveSubroutineUniformName sf_glad_glGetActiveSubroutineUniformName
+GLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC sf_glad_glGetActiveSubroutineUniformiv;
+#define glGetActiveSubroutineUniformiv sf_glad_glGetActiveSubroutineUniformiv
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC sf_glad_glGetActiveUniform;
+#define glGetActiveUniform sf_glad_glGetActiveUniform
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMARBPROC sf_glad_glGetActiveUniformARB;
+#define glGetActiveUniformARB sf_glad_glGetActiveUniformARB
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC sf_glad_glGetActiveUniformBlockName;
+#define glGetActiveUniformBlockName sf_glad_glGetActiveUniformBlockName
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKIVPROC sf_glad_glGetActiveUniformBlockiv;
+#define glGetActiveUniformBlockiv sf_glad_glGetActiveUniformBlockiv
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMNAMEPROC sf_glad_glGetActiveUniformName;
+#define glGetActiveUniformName sf_glad_glGetActiveUniformName
+GLAD_API_CALL PFNGLGETACTIVEUNIFORMSIVPROC sf_glad_glGetActiveUniformsiv;
+#define glGetActiveUniformsiv sf_glad_glGetActiveUniformsiv
+GLAD_API_CALL PFNGLGETATTACHEDOBJECTSARBPROC sf_glad_glGetAttachedObjectsARB;
+#define glGetAttachedObjectsARB sf_glad_glGetAttachedObjectsARB
+GLAD_API_CALL PFNGLGETATTACHEDSHADERSPROC sf_glad_glGetAttachedShaders;
+#define glGetAttachedShaders sf_glad_glGetAttachedShaders
+GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC sf_glad_glGetAttribLocation;
+#define glGetAttribLocation sf_glad_glGetAttribLocation
+GLAD_API_CALL PFNGLGETATTRIBLOCATIONARBPROC sf_glad_glGetAttribLocationARB;
+#define glGetAttribLocationARB sf_glad_glGetAttribLocationARB
+GLAD_API_CALL PFNGLGETBOOLEANI_VPROC sf_glad_glGetBooleani_v;
+#define glGetBooleani_v sf_glad_glGetBooleani_v
+GLAD_API_CALL PFNGLGETBOOLEANVPROC sf_glad_glGetBooleanv;
+#define glGetBooleanv sf_glad_glGetBooleanv
+GLAD_API_CALL PFNGLGETBUFFERPARAMETERI64VPROC sf_glad_glGetBufferParameteri64v;
+#define glGetBufferParameteri64v sf_glad_glGetBufferParameteri64v
+GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC sf_glad_glGetBufferParameteriv;
+#define glGetBufferParameteriv sf_glad_glGetBufferParameteriv
+GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVARBPROC sf_glad_glGetBufferParameterivARB;
+#define glGetBufferParameterivARB sf_glad_glGetBufferParameterivARB
+GLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC sf_glad_glGetBufferPointerv;
+#define glGetBufferPointerv sf_glad_glGetBufferPointerv
+GLAD_API_CALL PFNGLGETBUFFERPOINTERVARBPROC sf_glad_glGetBufferPointervARB;
+#define glGetBufferPointervARB sf_glad_glGetBufferPointervARB
+GLAD_API_CALL PFNGLGETBUFFERSUBDATAPROC sf_glad_glGetBufferSubData;
+#define glGetBufferSubData sf_glad_glGetBufferSubData
+GLAD_API_CALL PFNGLGETBUFFERSUBDATAARBPROC sf_glad_glGetBufferSubDataARB;
+#define glGetBufferSubDataARB sf_glad_glGetBufferSubDataARB
+GLAD_API_CALL PFNGLGETCLIPPLANEPROC sf_glad_glGetClipPlane;
+#define glGetClipPlane sf_glad_glGetClipPlane
+GLAD_API_CALL PFNGLGETCLIPPLANEFOESPROC sf_glad_glGetClipPlanefOES;
+#define glGetClipPlanefOES sf_glad_glGetClipPlanefOES
+GLAD_API_CALL PFNGLGETCOLORTABLEPROC sf_glad_glGetColorTable;
+#define glGetColorTable sf_glad_glGetColorTable
+GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERFVPROC sf_glad_glGetColorTableParameterfv;
+#define glGetColorTableParameterfv sf_glad_glGetColorTableParameterfv
+GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERIVPROC sf_glad_glGetColorTableParameteriv;
+#define glGetColorTableParameteriv sf_glad_glGetColorTableParameteriv
+GLAD_API_CALL PFNGLGETCOMPRESSEDTEXIMAGEPROC sf_glad_glGetCompressedTexImage;
+#define glGetCompressedTexImage sf_glad_glGetCompressedTexImage
+GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC sf_glad_glGetCompressedTextureImage;
+#define glGetCompressedTextureImage sf_glad_glGetCompressedTextureImage
+GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC sf_glad_glGetCompressedTextureSubImage;
+#define glGetCompressedTextureSubImage sf_glad_glGetCompressedTextureSubImage
+GLAD_API_CALL PFNGLGETCONVOLUTIONFILTERPROC sf_glad_glGetConvolutionFilter;
+#define glGetConvolutionFilter sf_glad_glGetConvolutionFilter
+GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERFVPROC sf_glad_glGetConvolutionParameterfv;
+#define glGetConvolutionParameterfv sf_glad_glGetConvolutionParameterfv
+GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERIVPROC sf_glad_glGetConvolutionParameteriv;
+#define glGetConvolutionParameteriv sf_glad_glGetConvolutionParameteriv
+GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGPROC sf_glad_glGetDebugMessageLog;
+#define glGetDebugMessageLog sf_glad_glGetDebugMessageLog
+GLAD_API_CALL PFNGLGETDOUBLEI_VPROC sf_glad_glGetDoublei_v;
+#define glGetDoublei_v sf_glad_glGetDoublei_v
+GLAD_API_CALL PFNGLGETDOUBLEVPROC sf_glad_glGetDoublev;
+#define glGetDoublev sf_glad_glGetDoublev
+GLAD_API_CALL PFNGLGETERRORPROC sf_glad_glGetError;
+#define glGetError sf_glad_glGetError
+GLAD_API_CALL PFNGLGETFLOATI_VPROC sf_glad_glGetFloati_v;
+#define glGetFloati_v sf_glad_glGetFloati_v
+GLAD_API_CALL PFNGLGETFLOATVPROC sf_glad_glGetFloatv;
+#define glGetFloatv sf_glad_glGetFloatv
+GLAD_API_CALL PFNGLGETFRAGDATAINDEXPROC sf_glad_glGetFragDataIndex;
+#define glGetFragDataIndex sf_glad_glGetFragDataIndex
+GLAD_API_CALL PFNGLGETFRAGDATALOCATIONPROC sf_glad_glGetFragDataLocation;
+#define glGetFragDataLocation sf_glad_glGetFragDataLocation
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC sf_glad_glGetFramebufferAttachmentParameteriv;
+#define glGetFramebufferAttachmentParameteriv sf_glad_glGetFramebufferAttachmentParameteriv
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC sf_glad_glGetFramebufferAttachmentParameterivEXT;
+#define glGetFramebufferAttachmentParameterivEXT sf_glad_glGetFramebufferAttachmentParameterivEXT
+GLAD_API_CALL PFNGLGETFRAMEBUFFERPARAMETERIVPROC sf_glad_glGetFramebufferParameteriv;
+#define glGetFramebufferParameteriv sf_glad_glGetFramebufferParameteriv
+GLAD_API_CALL PFNGLGETGRAPHICSRESETSTATUSPROC sf_glad_glGetGraphicsResetStatus;
+#define glGetGraphicsResetStatus sf_glad_glGetGraphicsResetStatus
+GLAD_API_CALL PFNGLGETHANDLEARBPROC sf_glad_glGetHandleARB;
+#define glGetHandleARB sf_glad_glGetHandleARB
+GLAD_API_CALL PFNGLGETHISTOGRAMPROC sf_glad_glGetHistogram;
+#define glGetHistogram sf_glad_glGetHistogram
+GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERFVPROC sf_glad_glGetHistogramParameterfv;
+#define glGetHistogramParameterfv sf_glad_glGetHistogramParameterfv
+GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERIVPROC sf_glad_glGetHistogramParameteriv;
+#define glGetHistogramParameteriv sf_glad_glGetHistogramParameteriv
+GLAD_API_CALL PFNGLGETINFOLOGARBPROC sf_glad_glGetInfoLogARB;
+#define glGetInfoLogARB sf_glad_glGetInfoLogARB
+GLAD_API_CALL PFNGLGETINTEGER64I_VPROC sf_glad_glGetInteger64i_v;
+#define glGetInteger64i_v sf_glad_glGetInteger64i_v
+GLAD_API_CALL PFNGLGETINTEGER64VPROC sf_glad_glGetInteger64v;
+#define glGetInteger64v sf_glad_glGetInteger64v
+GLAD_API_CALL PFNGLGETINTEGERI_VPROC sf_glad_glGetIntegeri_v;
+#define glGetIntegeri_v sf_glad_glGetIntegeri_v
+GLAD_API_CALL PFNGLGETINTEGERVPROC sf_glad_glGetIntegerv;
+#define glGetIntegerv sf_glad_glGetIntegerv
+GLAD_API_CALL PFNGLGETINTERNALFORMATI64VPROC sf_glad_glGetInternalformati64v;
+#define glGetInternalformati64v sf_glad_glGetInternalformati64v
+GLAD_API_CALL PFNGLGETINTERNALFORMATIVPROC sf_glad_glGetInternalformativ;
+#define glGetInternalformativ sf_glad_glGetInternalformativ
+GLAD_API_CALL PFNGLGETLIGHTFVPROC sf_glad_glGetLightfv;
+#define glGetLightfv sf_glad_glGetLightfv
+GLAD_API_CALL PFNGLGETLIGHTIVPROC sf_glad_glGetLightiv;
+#define glGetLightiv sf_glad_glGetLightiv
+GLAD_API_CALL PFNGLGETMAPDVPROC sf_glad_glGetMapdv;
+#define glGetMapdv sf_glad_glGetMapdv
+GLAD_API_CALL PFNGLGETMAPFVPROC sf_glad_glGetMapfv;
+#define glGetMapfv sf_glad_glGetMapfv
+GLAD_API_CALL PFNGLGETMAPIVPROC sf_glad_glGetMapiv;
+#define glGetMapiv sf_glad_glGetMapiv
+GLAD_API_CALL PFNGLGETMATERIALFVPROC sf_glad_glGetMaterialfv;
+#define glGetMaterialfv sf_glad_glGetMaterialfv
+GLAD_API_CALL PFNGLGETMATERIALIVPROC sf_glad_glGetMaterialiv;
+#define glGetMaterialiv sf_glad_glGetMaterialiv
+GLAD_API_CALL PFNGLGETMINMAXPROC sf_glad_glGetMinmax;
+#define glGetMinmax sf_glad_glGetMinmax
+GLAD_API_CALL PFNGLGETMINMAXPARAMETERFVPROC sf_glad_glGetMinmaxParameterfv;
+#define glGetMinmaxParameterfv sf_glad_glGetMinmaxParameterfv
+GLAD_API_CALL PFNGLGETMINMAXPARAMETERIVPROC sf_glad_glGetMinmaxParameteriv;
+#define glGetMinmaxParameteriv sf_glad_glGetMinmaxParameteriv
+GLAD_API_CALL PFNGLGETMULTISAMPLEFVPROC sf_glad_glGetMultisamplefv;
+#define glGetMultisamplefv sf_glad_glGetMultisamplefv
+GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERI64VPROC sf_glad_glGetNamedBufferParameteri64v;
+#define glGetNamedBufferParameteri64v sf_glad_glGetNamedBufferParameteri64v
+GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERIVPROC sf_glad_glGetNamedBufferParameteriv;
+#define glGetNamedBufferParameteriv sf_glad_glGetNamedBufferParameteriv
+GLAD_API_CALL PFNGLGETNAMEDBUFFERPOINTERVPROC sf_glad_glGetNamedBufferPointerv;
+#define glGetNamedBufferPointerv sf_glad_glGetNamedBufferPointerv
+GLAD_API_CALL PFNGLGETNAMEDBUFFERSUBDATAPROC sf_glad_glGetNamedBufferSubData;
+#define glGetNamedBufferSubData sf_glad_glGetNamedBufferSubData
+GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC sf_glad_glGetNamedFramebufferAttachmentParameteriv;
+#define glGetNamedFramebufferAttachmentParameteriv sf_glad_glGetNamedFramebufferAttachmentParameteriv
+GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC sf_glad_glGetNamedFramebufferParameteriv;
+#define glGetNamedFramebufferParameteriv sf_glad_glGetNamedFramebufferParameteriv
+GLAD_API_CALL PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC sf_glad_glGetNamedRenderbufferParameteriv;
+#define glGetNamedRenderbufferParameteriv sf_glad_glGetNamedRenderbufferParameteriv
+GLAD_API_CALL PFNGLGETOBJECTLABELPROC sf_glad_glGetObjectLabel;
+#define glGetObjectLabel sf_glad_glGetObjectLabel
+GLAD_API_CALL PFNGLGETOBJECTPARAMETERFVARBPROC sf_glad_glGetObjectParameterfvARB;
+#define glGetObjectParameterfvARB sf_glad_glGetObjectParameterfvARB
+GLAD_API_CALL PFNGLGETOBJECTPARAMETERIVARBPROC sf_glad_glGetObjectParameterivARB;
+#define glGetObjectParameterivARB sf_glad_glGetObjectParameterivARB
+GLAD_API_CALL PFNGLGETOBJECTPTRLABELPROC sf_glad_glGetObjectPtrLabel;
+#define glGetObjectPtrLabel sf_glad_glGetObjectPtrLabel
+GLAD_API_CALL PFNGLGETPIXELMAPFVPROC sf_glad_glGetPixelMapfv;
+#define glGetPixelMapfv sf_glad_glGetPixelMapfv
+GLAD_API_CALL PFNGLGETPIXELMAPUIVPROC sf_glad_glGetPixelMapuiv;
+#define glGetPixelMapuiv sf_glad_glGetPixelMapuiv
+GLAD_API_CALL PFNGLGETPIXELMAPUSVPROC sf_glad_glGetPixelMapusv;
+#define glGetPixelMapusv sf_glad_glGetPixelMapusv
+GLAD_API_CALL PFNGLGETPOINTERVPROC sf_glad_glGetPointerv;
+#define glGetPointerv sf_glad_glGetPointerv
+GLAD_API_CALL PFNGLGETPOINTERVEXTPROC sf_glad_glGetPointervEXT;
+#define glGetPointervEXT sf_glad_glGetPointervEXT
+GLAD_API_CALL PFNGLGETPOLYGONSTIPPLEPROC sf_glad_glGetPolygonStipple;
+#define glGetPolygonStipple sf_glad_glGetPolygonStipple
+GLAD_API_CALL PFNGLGETPROGRAMBINARYPROC sf_glad_glGetProgramBinary;
+#define glGetProgramBinary sf_glad_glGetProgramBinary
+GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERDVARBPROC sf_glad_glGetProgramEnvParameterdvARB;
+#define glGetProgramEnvParameterdvARB sf_glad_glGetProgramEnvParameterdvARB
+GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERFVARBPROC sf_glad_glGetProgramEnvParameterfvARB;
+#define glGetProgramEnvParameterfvARB sf_glad_glGetProgramEnvParameterfvARB
+GLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC sf_glad_glGetProgramInfoLog;
+#define glGetProgramInfoLog sf_glad_glGetProgramInfoLog
+GLAD_API_CALL PFNGLGETPROGRAMINTERFACEIVPROC sf_glad_glGetProgramInterfaceiv;
+#define glGetProgramInterfaceiv sf_glad_glGetProgramInterfaceiv
+GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC sf_glad_glGetProgramLocalParameterdvARB;
+#define glGetProgramLocalParameterdvARB sf_glad_glGetProgramLocalParameterdvARB
+GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC sf_glad_glGetProgramLocalParameterfvARB;
+#define glGetProgramLocalParameterfvARB sf_glad_glGetProgramLocalParameterfvARB
+GLAD_API_CALL PFNGLGETPROGRAMPARAMETERDVNVPROC sf_glad_glGetProgramParameterdvNV;
+#define glGetProgramParameterdvNV sf_glad_glGetProgramParameterdvNV
+GLAD_API_CALL PFNGLGETPROGRAMPARAMETERFVNVPROC sf_glad_glGetProgramParameterfvNV;
+#define glGetProgramParameterfvNV sf_glad_glGetProgramParameterfvNV
+GLAD_API_CALL PFNGLGETPROGRAMPIPELINEINFOLOGPROC sf_glad_glGetProgramPipelineInfoLog;
+#define glGetProgramPipelineInfoLog sf_glad_glGetProgramPipelineInfoLog
+GLAD_API_CALL PFNGLGETPROGRAMPIPELINEIVPROC sf_glad_glGetProgramPipelineiv;
+#define glGetProgramPipelineiv sf_glad_glGetProgramPipelineiv
+GLAD_API_CALL PFNGLGETPROGRAMRESOURCEINDEXPROC sf_glad_glGetProgramResourceIndex;
+#define glGetProgramResourceIndex sf_glad_glGetProgramResourceIndex
+GLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONPROC sf_glad_glGetProgramResourceLocation;
+#define glGetProgramResourceLocation sf_glad_glGetProgramResourceLocation
+GLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC sf_glad_glGetProgramResourceLocationIndex;
+#define glGetProgramResourceLocationIndex sf_glad_glGetProgramResourceLocationIndex
+GLAD_API_CALL PFNGLGETPROGRAMRESOURCENAMEPROC sf_glad_glGetProgramResourceName;
+#define glGetProgramResourceName sf_glad_glGetProgramResourceName
+GLAD_API_CALL PFNGLGETPROGRAMRESOURCEIVPROC sf_glad_glGetProgramResourceiv;
+#define glGetProgramResourceiv sf_glad_glGetProgramResourceiv
+GLAD_API_CALL PFNGLGETPROGRAMSTAGEIVPROC sf_glad_glGetProgramStageiv;
+#define glGetProgramStageiv sf_glad_glGetProgramStageiv
+GLAD_API_CALL PFNGLGETPROGRAMSTRINGARBPROC sf_glad_glGetProgramStringARB;
+#define glGetProgramStringARB sf_glad_glGetProgramStringARB
+GLAD_API_CALL PFNGLGETPROGRAMSTRINGNVPROC sf_glad_glGetProgramStringNV;
+#define glGetProgramStringNV sf_glad_glGetProgramStringNV
+GLAD_API_CALL PFNGLGETPROGRAMIVPROC sf_glad_glGetProgramiv;
+#define glGetProgramiv sf_glad_glGetProgramiv
+GLAD_API_CALL PFNGLGETPROGRAMIVARBPROC sf_glad_glGetProgramivARB;
+#define glGetProgramivARB sf_glad_glGetProgramivARB
+GLAD_API_CALL PFNGLGETPROGRAMIVNVPROC sf_glad_glGetProgramivNV;
+#define glGetProgramivNV sf_glad_glGetProgramivNV
+GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTI64VPROC sf_glad_glGetQueryBufferObjecti64v;
+#define glGetQueryBufferObjecti64v sf_glad_glGetQueryBufferObjecti64v
+GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTIVPROC sf_glad_glGetQueryBufferObjectiv;
+#define glGetQueryBufferObjectiv sf_glad_glGetQueryBufferObjectiv
+GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUI64VPROC sf_glad_glGetQueryBufferObjectui64v;
+#define glGetQueryBufferObjectui64v sf_glad_glGetQueryBufferObjectui64v
+GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUIVPROC sf_glad_glGetQueryBufferObjectuiv;
+#define glGetQueryBufferObjectuiv sf_glad_glGetQueryBufferObjectuiv
+GLAD_API_CALL PFNGLGETQUERYINDEXEDIVPROC sf_glad_glGetQueryIndexediv;
+#define glGetQueryIndexediv sf_glad_glGetQueryIndexediv
+GLAD_API_CALL PFNGLGETQUERYOBJECTI64VPROC sf_glad_glGetQueryObjecti64v;
+#define glGetQueryObjecti64v sf_glad_glGetQueryObjecti64v
+GLAD_API_CALL PFNGLGETQUERYOBJECTIVPROC sf_glad_glGetQueryObjectiv;
+#define glGetQueryObjectiv sf_glad_glGetQueryObjectiv
+GLAD_API_CALL PFNGLGETQUERYOBJECTUI64VPROC sf_glad_glGetQueryObjectui64v;
+#define glGetQueryObjectui64v sf_glad_glGetQueryObjectui64v
+GLAD_API_CALL PFNGLGETQUERYOBJECTUIVPROC sf_glad_glGetQueryObjectuiv;
+#define glGetQueryObjectuiv sf_glad_glGetQueryObjectuiv
+GLAD_API_CALL PFNGLGETQUERYIVPROC sf_glad_glGetQueryiv;
+#define glGetQueryiv sf_glad_glGetQueryiv
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC sf_glad_glGetRenderbufferParameteriv;
+#define glGetRenderbufferParameteriv sf_glad_glGetRenderbufferParameteriv
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC sf_glad_glGetRenderbufferParameterivEXT;
+#define glGetRenderbufferParameterivEXT sf_glad_glGetRenderbufferParameterivEXT
+GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIIVPROC sf_glad_glGetSamplerParameterIiv;
+#define glGetSamplerParameterIiv sf_glad_glGetSamplerParameterIiv
+GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIUIVPROC sf_glad_glGetSamplerParameterIuiv;
+#define glGetSamplerParameterIuiv sf_glad_glGetSamplerParameterIuiv
+GLAD_API_CALL PFNGLGETSAMPLERPARAMETERFVPROC sf_glad_glGetSamplerParameterfv;
+#define glGetSamplerParameterfv sf_glad_glGetSamplerParameterfv
+GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIVPROC sf_glad_glGetSamplerParameteriv;
+#define glGetSamplerParameteriv sf_glad_glGetSamplerParameteriv
+GLAD_API_CALL PFNGLGETSEPARABLEFILTERPROC sf_glad_glGetSeparableFilter;
+#define glGetSeparableFilter sf_glad_glGetSeparableFilter
+GLAD_API_CALL PFNGLGETSHADERINFOLOGPROC sf_glad_glGetShaderInfoLog;
+#define glGetShaderInfoLog sf_glad_glGetShaderInfoLog
+GLAD_API_CALL PFNGLGETSHADERPRECISIONFORMATPROC sf_glad_glGetShaderPrecisionFormat;
+#define glGetShaderPrecisionFormat sf_glad_glGetShaderPrecisionFormat
+GLAD_API_CALL PFNGLGETSHADERSOURCEPROC sf_glad_glGetShaderSource;
+#define glGetShaderSource sf_glad_glGetShaderSource
+GLAD_API_CALL PFNGLGETSHADERSOURCEARBPROC sf_glad_glGetShaderSourceARB;
+#define glGetShaderSourceARB sf_glad_glGetShaderSourceARB
+GLAD_API_CALL PFNGLGETSHADERIVPROC sf_glad_glGetShaderiv;
+#define glGetShaderiv sf_glad_glGetShaderiv
+GLAD_API_CALL PFNGLGETSTRINGPROC sf_glad_glGetString;
+#define glGetString sf_glad_glGetString
+GLAD_API_CALL PFNGLGETSTRINGIPROC sf_glad_glGetStringi;
+#define glGetStringi sf_glad_glGetStringi
+GLAD_API_CALL PFNGLGETSUBROUTINEINDEXPROC sf_glad_glGetSubroutineIndex;
+#define glGetSubroutineIndex sf_glad_glGetSubroutineIndex
+GLAD_API_CALL PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC sf_glad_glGetSubroutineUniformLocation;
+#define glGetSubroutineUniformLocation sf_glad_glGetSubroutineUniformLocation
+GLAD_API_CALL PFNGLGETSYNCIVPROC sf_glad_glGetSynciv;
+#define glGetSynciv sf_glad_glGetSynciv
+GLAD_API_CALL PFNGLGETTEXENVFVPROC sf_glad_glGetTexEnvfv;
+#define glGetTexEnvfv sf_glad_glGetTexEnvfv
+GLAD_API_CALL PFNGLGETTEXENVIVPROC sf_glad_glGetTexEnviv;
+#define glGetTexEnviv sf_glad_glGetTexEnviv
+GLAD_API_CALL PFNGLGETTEXGENDVPROC sf_glad_glGetTexGendv;
+#define glGetTexGendv sf_glad_glGetTexGendv
+GLAD_API_CALL PFNGLGETTEXGENFVPROC sf_glad_glGetTexGenfv;
+#define glGetTexGenfv sf_glad_glGetTexGenfv
+GLAD_API_CALL PFNGLGETTEXGENIVPROC sf_glad_glGetTexGeniv;
+#define glGetTexGeniv sf_glad_glGetTexGeniv
+GLAD_API_CALL PFNGLGETTEXIMAGEPROC sf_glad_glGetTexImage;
+#define glGetTexImage sf_glad_glGetTexImage
+GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC sf_glad_glGetTexLevelParameterfv;
+#define glGetTexLevelParameterfv sf_glad_glGetTexLevelParameterfv
+GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC sf_glad_glGetTexLevelParameteriv;
+#define glGetTexLevelParameteriv sf_glad_glGetTexLevelParameteriv
+GLAD_API_CALL PFNGLGETTEXPARAMETERIIVPROC sf_glad_glGetTexParameterIiv;
+#define glGetTexParameterIiv sf_glad_glGetTexParameterIiv
+GLAD_API_CALL PFNGLGETTEXPARAMETERIUIVPROC sf_glad_glGetTexParameterIuiv;
+#define glGetTexParameterIuiv sf_glad_glGetTexParameterIuiv
+GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC sf_glad_glGetTexParameterfv;
+#define glGetTexParameterfv sf_glad_glGetTexParameterfv
+GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC sf_glad_glGetTexParameteriv;
+#define glGetTexParameteriv sf_glad_glGetTexParameteriv
+GLAD_API_CALL PFNGLGETTEXTUREIMAGEPROC sf_glad_glGetTextureImage;
+#define glGetTextureImage sf_glad_glGetTextureImage
+GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERFVPROC sf_glad_glGetTextureLevelParameterfv;
+#define glGetTextureLevelParameterfv sf_glad_glGetTextureLevelParameterfv
+GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERIVPROC sf_glad_glGetTextureLevelParameteriv;
+#define glGetTextureLevelParameteriv sf_glad_glGetTextureLevelParameteriv
+GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIIVPROC sf_glad_glGetTextureParameterIiv;
+#define glGetTextureParameterIiv sf_glad_glGetTextureParameterIiv
+GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIUIVPROC sf_glad_glGetTextureParameterIuiv;
+#define glGetTextureParameterIuiv sf_glad_glGetTextureParameterIuiv
+GLAD_API_CALL PFNGLGETTEXTUREPARAMETERFVPROC sf_glad_glGetTextureParameterfv;
+#define glGetTextureParameterfv sf_glad_glGetTextureParameterfv
+GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIVPROC sf_glad_glGetTextureParameteriv;
+#define glGetTextureParameteriv sf_glad_glGetTextureParameteriv
+GLAD_API_CALL PFNGLGETTEXTURESUBIMAGEPROC sf_glad_glGetTextureSubImage;
+#define glGetTextureSubImage sf_glad_glGetTextureSubImage
+GLAD_API_CALL PFNGLGETTRACKMATRIXIVNVPROC sf_glad_glGetTrackMatrixivNV;
+#define glGetTrackMatrixivNV sf_glad_glGetTrackMatrixivNV
+GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGPROC sf_glad_glGetTransformFeedbackVarying;
+#define glGetTransformFeedbackVarying sf_glad_glGetTransformFeedbackVarying
+GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI64_VPROC sf_glad_glGetTransformFeedbacki64_v;
+#define glGetTransformFeedbacki64_v sf_glad_glGetTransformFeedbacki64_v
+GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI_VPROC sf_glad_glGetTransformFeedbacki_v;
+#define glGetTransformFeedbacki_v sf_glad_glGetTransformFeedbacki_v
+GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKIVPROC sf_glad_glGetTransformFeedbackiv;
+#define glGetTransformFeedbackiv sf_glad_glGetTransformFeedbackiv
+GLAD_API_CALL PFNGLGETUNIFORMBLOCKINDEXPROC sf_glad_glGetUniformBlockIndex;
+#define glGetUniformBlockIndex sf_glad_glGetUniformBlockIndex
+GLAD_API_CALL PFNGLGETUNIFORMINDICESPROC sf_glad_glGetUniformIndices;
+#define glGetUniformIndices sf_glad_glGetUniformIndices
+GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC sf_glad_glGetUniformLocation;
+#define glGetUniformLocation sf_glad_glGetUniformLocation
+GLAD_API_CALL PFNGLGETUNIFORMLOCATIONARBPROC sf_glad_glGetUniformLocationARB;
+#define glGetUniformLocationARB sf_glad_glGetUniformLocationARB
+GLAD_API_CALL PFNGLGETUNIFORMSUBROUTINEUIVPROC sf_glad_glGetUniformSubroutineuiv;
+#define glGetUniformSubroutineuiv sf_glad_glGetUniformSubroutineuiv
+GLAD_API_CALL PFNGLGETUNIFORMDVPROC sf_glad_glGetUniformdv;
+#define glGetUniformdv sf_glad_glGetUniformdv
+GLAD_API_CALL PFNGLGETUNIFORMFVPROC sf_glad_glGetUniformfv;
+#define glGetUniformfv sf_glad_glGetUniformfv
+GLAD_API_CALL PFNGLGETUNIFORMFVARBPROC sf_glad_glGetUniformfvARB;
+#define glGetUniformfvARB sf_glad_glGetUniformfvARB
+GLAD_API_CALL PFNGLGETUNIFORMIVPROC sf_glad_glGetUniformiv;
+#define glGetUniformiv sf_glad_glGetUniformiv
+GLAD_API_CALL PFNGLGETUNIFORMIVARBPROC sf_glad_glGetUniformivARB;
+#define glGetUniformivARB sf_glad_glGetUniformivARB
+GLAD_API_CALL PFNGLGETUNIFORMUIVPROC sf_glad_glGetUniformuiv;
+#define glGetUniformuiv sf_glad_glGetUniformuiv
+GLAD_API_CALL PFNGLGETVERTEXARRAYINDEXED64IVPROC sf_glad_glGetVertexArrayIndexed64iv;
+#define glGetVertexArrayIndexed64iv sf_glad_glGetVertexArrayIndexed64iv
+GLAD_API_CALL PFNGLGETVERTEXARRAYINDEXEDIVPROC sf_glad_glGetVertexArrayIndexediv;
+#define glGetVertexArrayIndexediv sf_glad_glGetVertexArrayIndexediv
+GLAD_API_CALL PFNGLGETVERTEXARRAYIVPROC sf_glad_glGetVertexArrayiv;
+#define glGetVertexArrayiv sf_glad_glGetVertexArrayiv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIIVPROC sf_glad_glGetVertexAttribIiv;
+#define glGetVertexAttribIiv sf_glad_glGetVertexAttribIiv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVPROC sf_glad_glGetVertexAttribIuiv;
+#define glGetVertexAttribIuiv sf_glad_glGetVertexAttribIuiv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBLDVPROC sf_glad_glGetVertexAttribLdv;
+#define glGetVertexAttribLdv sf_glad_glGetVertexAttribLdv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC sf_glad_glGetVertexAttribPointerv;
+#define glGetVertexAttribPointerv sf_glad_glGetVertexAttribPointerv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVARBPROC sf_glad_glGetVertexAttribPointervARB;
+#define glGetVertexAttribPointervARB sf_glad_glGetVertexAttribPointervARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVNVPROC sf_glad_glGetVertexAttribPointervNV;
+#define glGetVertexAttribPointervNV sf_glad_glGetVertexAttribPointervNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVPROC sf_glad_glGetVertexAttribdv;
+#define glGetVertexAttribdv sf_glad_glGetVertexAttribdv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVARBPROC sf_glad_glGetVertexAttribdvARB;
+#define glGetVertexAttribdvARB sf_glad_glGetVertexAttribdvARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBDVNVPROC sf_glad_glGetVertexAttribdvNV;
+#define glGetVertexAttribdvNV sf_glad_glGetVertexAttribdvNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC sf_glad_glGetVertexAttribfv;
+#define glGetVertexAttribfv sf_glad_glGetVertexAttribfv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVARBPROC sf_glad_glGetVertexAttribfvARB;
+#define glGetVertexAttribfvARB sf_glad_glGetVertexAttribfvARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBFVNVPROC sf_glad_glGetVertexAttribfvNV;
+#define glGetVertexAttribfvNV sf_glad_glGetVertexAttribfvNV
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC sf_glad_glGetVertexAttribiv;
+#define glGetVertexAttribiv sf_glad_glGetVertexAttribiv
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVARBPROC sf_glad_glGetVertexAttribivARB;
+#define glGetVertexAttribivARB sf_glad_glGetVertexAttribivARB
+GLAD_API_CALL PFNGLGETVERTEXATTRIBIVNVPROC sf_glad_glGetVertexAttribivNV;
+#define glGetVertexAttribivNV sf_glad_glGetVertexAttribivNV
+GLAD_API_CALL PFNGLGETNCOLORTABLEPROC sf_glad_glGetnColorTable;
+#define glGetnColorTable sf_glad_glGetnColorTable
+GLAD_API_CALL PFNGLGETNCOMPRESSEDTEXIMAGEPROC sf_glad_glGetnCompressedTexImage;
+#define glGetnCompressedTexImage sf_glad_glGetnCompressedTexImage
+GLAD_API_CALL PFNGLGETNCONVOLUTIONFILTERPROC sf_glad_glGetnConvolutionFilter;
+#define glGetnConvolutionFilter sf_glad_glGetnConvolutionFilter
+GLAD_API_CALL PFNGLGETNHISTOGRAMPROC sf_glad_glGetnHistogram;
+#define glGetnHistogram sf_glad_glGetnHistogram
+GLAD_API_CALL PFNGLGETNMAPDVPROC sf_glad_glGetnMapdv;
+#define glGetnMapdv sf_glad_glGetnMapdv
+GLAD_API_CALL PFNGLGETNMAPFVPROC sf_glad_glGetnMapfv;
+#define glGetnMapfv sf_glad_glGetnMapfv
+GLAD_API_CALL PFNGLGETNMAPIVPROC sf_glad_glGetnMapiv;
+#define glGetnMapiv sf_glad_glGetnMapiv
+GLAD_API_CALL PFNGLGETNMINMAXPROC sf_glad_glGetnMinmax;
+#define glGetnMinmax sf_glad_glGetnMinmax
+GLAD_API_CALL PFNGLGETNPIXELMAPFVPROC sf_glad_glGetnPixelMapfv;
+#define glGetnPixelMapfv sf_glad_glGetnPixelMapfv
+GLAD_API_CALL PFNGLGETNPIXELMAPUIVPROC sf_glad_glGetnPixelMapuiv;
+#define glGetnPixelMapuiv sf_glad_glGetnPixelMapuiv
+GLAD_API_CALL PFNGLGETNPIXELMAPUSVPROC sf_glad_glGetnPixelMapusv;
+#define glGetnPixelMapusv sf_glad_glGetnPixelMapusv
+GLAD_API_CALL PFNGLGETNPOLYGONSTIPPLEPROC sf_glad_glGetnPolygonStipple;
+#define glGetnPolygonStipple sf_glad_glGetnPolygonStipple
+GLAD_API_CALL PFNGLGETNSEPARABLEFILTERPROC sf_glad_glGetnSeparableFilter;
+#define glGetnSeparableFilter sf_glad_glGetnSeparableFilter
+GLAD_API_CALL PFNGLGETNTEXIMAGEPROC sf_glad_glGetnTexImage;
+#define glGetnTexImage sf_glad_glGetnTexImage
+GLAD_API_CALL PFNGLGETNUNIFORMDVPROC sf_glad_glGetnUniformdv;
+#define glGetnUniformdv sf_glad_glGetnUniformdv
+GLAD_API_CALL PFNGLGETNUNIFORMFVPROC sf_glad_glGetnUniformfv;
+#define glGetnUniformfv sf_glad_glGetnUniformfv
+GLAD_API_CALL PFNGLGETNUNIFORMIVPROC sf_glad_glGetnUniformiv;
+#define glGetnUniformiv sf_glad_glGetnUniformiv
+GLAD_API_CALL PFNGLGETNUNIFORMUIVPROC sf_glad_glGetnUniformuiv;
+#define glGetnUniformuiv sf_glad_glGetnUniformuiv
+GLAD_API_CALL PFNGLHINTPROC sf_glad_glHint;
+#define glHint sf_glad_glHint
+GLAD_API_CALL PFNGLHISTOGRAMPROC sf_glad_glHistogram;
+#define glHistogram sf_glad_glHistogram
+GLAD_API_CALL PFNGLINDEXMASKPROC sf_glad_glIndexMask;
+#define glIndexMask sf_glad_glIndexMask
+GLAD_API_CALL PFNGLINDEXPOINTERPROC sf_glad_glIndexPointer;
+#define glIndexPointer sf_glad_glIndexPointer
+GLAD_API_CALL PFNGLINDEXPOINTEREXTPROC sf_glad_glIndexPointerEXT;
+#define glIndexPointerEXT sf_glad_glIndexPointerEXT
+GLAD_API_CALL PFNGLINDEXDPROC sf_glad_glIndexd;
+#define glIndexd sf_glad_glIndexd
+GLAD_API_CALL PFNGLINDEXDVPROC sf_glad_glIndexdv;
+#define glIndexdv sf_glad_glIndexdv
+GLAD_API_CALL PFNGLINDEXFPROC sf_glad_glIndexf;
+#define glIndexf sf_glad_glIndexf
+GLAD_API_CALL PFNGLINDEXFVPROC sf_glad_glIndexfv;
+#define glIndexfv sf_glad_glIndexfv
+GLAD_API_CALL PFNGLINDEXIPROC sf_glad_glIndexi;
+#define glIndexi sf_glad_glIndexi
+GLAD_API_CALL PFNGLINDEXIVPROC sf_glad_glIndexiv;
+#define glIndexiv sf_glad_glIndexiv
+GLAD_API_CALL PFNGLINDEXSPROC sf_glad_glIndexs;
+#define glIndexs sf_glad_glIndexs
+GLAD_API_CALL PFNGLINDEXSVPROC sf_glad_glIndexsv;
+#define glIndexsv sf_glad_glIndexsv
+GLAD_API_CALL PFNGLINDEXUBPROC sf_glad_glIndexub;
+#define glIndexub sf_glad_glIndexub
+GLAD_API_CALL PFNGLINDEXUBVPROC sf_glad_glIndexubv;
+#define glIndexubv sf_glad_glIndexubv
+GLAD_API_CALL PFNGLINITNAMESPROC sf_glad_glInitNames;
+#define glInitNames sf_glad_glInitNames
+GLAD_API_CALL PFNGLINTERLEAVEDARRAYSPROC sf_glad_glInterleavedArrays;
+#define glInterleavedArrays sf_glad_glInterleavedArrays
+GLAD_API_CALL PFNGLINVALIDATEBUFFERDATAPROC sf_glad_glInvalidateBufferData;
+#define glInvalidateBufferData sf_glad_glInvalidateBufferData
+GLAD_API_CALL PFNGLINVALIDATEBUFFERSUBDATAPROC sf_glad_glInvalidateBufferSubData;
+#define glInvalidateBufferSubData sf_glad_glInvalidateBufferSubData
+GLAD_API_CALL PFNGLINVALIDATEFRAMEBUFFERPROC sf_glad_glInvalidateFramebuffer;
+#define glInvalidateFramebuffer sf_glad_glInvalidateFramebuffer
+GLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC sf_glad_glInvalidateNamedFramebufferData;
+#define glInvalidateNamedFramebufferData sf_glad_glInvalidateNamedFramebufferData
+GLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC sf_glad_glInvalidateNamedFramebufferSubData;
+#define glInvalidateNamedFramebufferSubData sf_glad_glInvalidateNamedFramebufferSubData
+GLAD_API_CALL PFNGLINVALIDATESUBFRAMEBUFFERPROC sf_glad_glInvalidateSubFramebuffer;
+#define glInvalidateSubFramebuffer sf_glad_glInvalidateSubFramebuffer
+GLAD_API_CALL PFNGLINVALIDATETEXIMAGEPROC sf_glad_glInvalidateTexImage;
+#define glInvalidateTexImage sf_glad_glInvalidateTexImage
+GLAD_API_CALL PFNGLINVALIDATETEXSUBIMAGEPROC sf_glad_glInvalidateTexSubImage;
+#define glInvalidateTexSubImage sf_glad_glInvalidateTexSubImage
+GLAD_API_CALL PFNGLISBUFFERPROC sf_glad_glIsBuffer;
+#define glIsBuffer sf_glad_glIsBuffer
+GLAD_API_CALL PFNGLISBUFFERARBPROC sf_glad_glIsBufferARB;
+#define glIsBufferARB sf_glad_glIsBufferARB
+GLAD_API_CALL PFNGLISENABLEDPROC sf_glad_glIsEnabled;
+#define glIsEnabled sf_glad_glIsEnabled
+GLAD_API_CALL PFNGLISENABLEDIPROC sf_glad_glIsEnabledi;
+#define glIsEnabledi sf_glad_glIsEnabledi
+GLAD_API_CALL PFNGLISFRAMEBUFFERPROC sf_glad_glIsFramebuffer;
+#define glIsFramebuffer sf_glad_glIsFramebuffer
+GLAD_API_CALL PFNGLISFRAMEBUFFEREXTPROC sf_glad_glIsFramebufferEXT;
+#define glIsFramebufferEXT sf_glad_glIsFramebufferEXT
+GLAD_API_CALL PFNGLISLISTPROC sf_glad_glIsList;
+#define glIsList sf_glad_glIsList
+GLAD_API_CALL PFNGLISPROGRAMPROC sf_glad_glIsProgram;
+#define glIsProgram sf_glad_glIsProgram
+GLAD_API_CALL PFNGLISPROGRAMARBPROC sf_glad_glIsProgramARB;
+#define glIsProgramARB sf_glad_glIsProgramARB
+GLAD_API_CALL PFNGLISPROGRAMNVPROC sf_glad_glIsProgramNV;
+#define glIsProgramNV sf_glad_glIsProgramNV
+GLAD_API_CALL PFNGLISPROGRAMPIPELINEPROC sf_glad_glIsProgramPipeline;
+#define glIsProgramPipeline sf_glad_glIsProgramPipeline
+GLAD_API_CALL PFNGLISQUERYPROC sf_glad_glIsQuery;
+#define glIsQuery sf_glad_glIsQuery
+GLAD_API_CALL PFNGLISRENDERBUFFERPROC sf_glad_glIsRenderbuffer;
+#define glIsRenderbuffer sf_glad_glIsRenderbuffer
+GLAD_API_CALL PFNGLISRENDERBUFFEREXTPROC sf_glad_glIsRenderbufferEXT;
+#define glIsRenderbufferEXT sf_glad_glIsRenderbufferEXT
+GLAD_API_CALL PFNGLISSAMPLERPROC sf_glad_glIsSampler;
+#define glIsSampler sf_glad_glIsSampler
+GLAD_API_CALL PFNGLISSHADERPROC sf_glad_glIsShader;
+#define glIsShader sf_glad_glIsShader
+GLAD_API_CALL PFNGLISSYNCPROC sf_glad_glIsSync;
+#define glIsSync sf_glad_glIsSync
+GLAD_API_CALL PFNGLISTEXTUREPROC sf_glad_glIsTexture;
+#define glIsTexture sf_glad_glIsTexture
+GLAD_API_CALL PFNGLISTEXTUREEXTPROC sf_glad_glIsTextureEXT;
+#define glIsTextureEXT sf_glad_glIsTextureEXT
+GLAD_API_CALL PFNGLISTRANSFORMFEEDBACKPROC sf_glad_glIsTransformFeedback;
+#define glIsTransformFeedback sf_glad_glIsTransformFeedback
+GLAD_API_CALL PFNGLISVERTEXARRAYPROC sf_glad_glIsVertexArray;
+#define glIsVertexArray sf_glad_glIsVertexArray
+GLAD_API_CALL PFNGLLIGHTMODELFPROC sf_glad_glLightModelf;
+#define glLightModelf sf_glad_glLightModelf
+GLAD_API_CALL PFNGLLIGHTMODELFVPROC sf_glad_glLightModelfv;
+#define glLightModelfv sf_glad_glLightModelfv
+GLAD_API_CALL PFNGLLIGHTMODELIPROC sf_glad_glLightModeli;
+#define glLightModeli sf_glad_glLightModeli
+GLAD_API_CALL PFNGLLIGHTMODELIVPROC sf_glad_glLightModeliv;
+#define glLightModeliv sf_glad_glLightModeliv
+GLAD_API_CALL PFNGLLIGHTFPROC sf_glad_glLightf;
+#define glLightf sf_glad_glLightf
+GLAD_API_CALL PFNGLLIGHTFVPROC sf_glad_glLightfv;
+#define glLightfv sf_glad_glLightfv
+GLAD_API_CALL PFNGLLIGHTIPROC sf_glad_glLighti;
+#define glLighti sf_glad_glLighti
+GLAD_API_CALL PFNGLLIGHTIVPROC sf_glad_glLightiv;
+#define glLightiv sf_glad_glLightiv
+GLAD_API_CALL PFNGLLINESTIPPLEPROC sf_glad_glLineStipple;
+#define glLineStipple sf_glad_glLineStipple
+GLAD_API_CALL PFNGLLINEWIDTHPROC sf_glad_glLineWidth;
+#define glLineWidth sf_glad_glLineWidth
+GLAD_API_CALL PFNGLLINKPROGRAMPROC sf_glad_glLinkProgram;
+#define glLinkProgram sf_glad_glLinkProgram
+GLAD_API_CALL PFNGLLINKPROGRAMARBPROC sf_glad_glLinkProgramARB;
+#define glLinkProgramARB sf_glad_glLinkProgramARB
+GLAD_API_CALL PFNGLLISTBASEPROC sf_glad_glListBase;
+#define glListBase sf_glad_glListBase
+GLAD_API_CALL PFNGLLOADIDENTITYPROC sf_glad_glLoadIdentity;
+#define glLoadIdentity sf_glad_glLoadIdentity
+GLAD_API_CALL PFNGLLOADMATRIXDPROC sf_glad_glLoadMatrixd;
+#define glLoadMatrixd sf_glad_glLoadMatrixd
+GLAD_API_CALL PFNGLLOADMATRIXFPROC sf_glad_glLoadMatrixf;
+#define glLoadMatrixf sf_glad_glLoadMatrixf
+GLAD_API_CALL PFNGLLOADNAMEPROC sf_glad_glLoadName;
+#define glLoadName sf_glad_glLoadName
+GLAD_API_CALL PFNGLLOADPROGRAMNVPROC sf_glad_glLoadProgramNV;
+#define glLoadProgramNV sf_glad_glLoadProgramNV
+GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXDPROC sf_glad_glLoadTransposeMatrixd;
+#define glLoadTransposeMatrixd sf_glad_glLoadTransposeMatrixd
+GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXFPROC sf_glad_glLoadTransposeMatrixf;
+#define glLoadTransposeMatrixf sf_glad_glLoadTransposeMatrixf
+GLAD_API_CALL PFNGLLOGICOPPROC sf_glad_glLogicOp;
+#define glLogicOp sf_glad_glLogicOp
+GLAD_API_CALL PFNGLMAP1DPROC sf_glad_glMap1d;
+#define glMap1d sf_glad_glMap1d
+GLAD_API_CALL PFNGLMAP1FPROC sf_glad_glMap1f;
+#define glMap1f sf_glad_glMap1f
+GLAD_API_CALL PFNGLMAP2DPROC sf_glad_glMap2d;
+#define glMap2d sf_glad_glMap2d
+GLAD_API_CALL PFNGLMAP2FPROC sf_glad_glMap2f;
+#define glMap2f sf_glad_glMap2f
+GLAD_API_CALL PFNGLMAPBUFFERPROC sf_glad_glMapBuffer;
+#define glMapBuffer sf_glad_glMapBuffer
+GLAD_API_CALL PFNGLMAPBUFFERARBPROC sf_glad_glMapBufferARB;
+#define glMapBufferARB sf_glad_glMapBufferARB
+GLAD_API_CALL PFNGLMAPBUFFERRANGEPROC sf_glad_glMapBufferRange;
+#define glMapBufferRange sf_glad_glMapBufferRange
+GLAD_API_CALL PFNGLMAPGRID1DPROC sf_glad_glMapGrid1d;
+#define glMapGrid1d sf_glad_glMapGrid1d
+GLAD_API_CALL PFNGLMAPGRID1FPROC sf_glad_glMapGrid1f;
+#define glMapGrid1f sf_glad_glMapGrid1f
+GLAD_API_CALL PFNGLMAPGRID2DPROC sf_glad_glMapGrid2d;
+#define glMapGrid2d sf_glad_glMapGrid2d
+GLAD_API_CALL PFNGLMAPGRID2FPROC sf_glad_glMapGrid2f;
+#define glMapGrid2f sf_glad_glMapGrid2f
+GLAD_API_CALL PFNGLMAPNAMEDBUFFERPROC sf_glad_glMapNamedBuffer;
+#define glMapNamedBuffer sf_glad_glMapNamedBuffer
+GLAD_API_CALL PFNGLMAPNAMEDBUFFERRANGEPROC sf_glad_glMapNamedBufferRange;
+#define glMapNamedBufferRange sf_glad_glMapNamedBufferRange
+GLAD_API_CALL PFNGLMATERIALFPROC sf_glad_glMaterialf;
+#define glMaterialf sf_glad_glMaterialf
+GLAD_API_CALL PFNGLMATERIALFVPROC sf_glad_glMaterialfv;
+#define glMaterialfv sf_glad_glMaterialfv
+GLAD_API_CALL PFNGLMATERIALIPROC sf_glad_glMateriali;
+#define glMateriali sf_glad_glMateriali
+GLAD_API_CALL PFNGLMATERIALIVPROC sf_glad_glMaterialiv;
+#define glMaterialiv sf_glad_glMaterialiv
+GLAD_API_CALL PFNGLMATRIXMODEPROC sf_glad_glMatrixMode;
+#define glMatrixMode sf_glad_glMatrixMode
+GLAD_API_CALL PFNGLMEMORYBARRIERPROC sf_glad_glMemoryBarrier;
+#define glMemoryBarrier sf_glad_glMemoryBarrier
+GLAD_API_CALL PFNGLMEMORYBARRIERBYREGIONPROC sf_glad_glMemoryBarrierByRegion;
+#define glMemoryBarrierByRegion sf_glad_glMemoryBarrierByRegion
+GLAD_API_CALL PFNGLMINSAMPLESHADINGPROC sf_glad_glMinSampleShading;
+#define glMinSampleShading sf_glad_glMinSampleShading
+GLAD_API_CALL PFNGLMINMAXPROC sf_glad_glMinmax;
+#define glMinmax sf_glad_glMinmax
+GLAD_API_CALL PFNGLMULTMATRIXDPROC sf_glad_glMultMatrixd;
+#define glMultMatrixd sf_glad_glMultMatrixd
+GLAD_API_CALL PFNGLMULTMATRIXFPROC sf_glad_glMultMatrixf;
+#define glMultMatrixf sf_glad_glMultMatrixf
+GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXDPROC sf_glad_glMultTransposeMatrixd;
+#define glMultTransposeMatrixd sf_glad_glMultTransposeMatrixd
+GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXFPROC sf_glad_glMultTransposeMatrixf;
+#define glMultTransposeMatrixf sf_glad_glMultTransposeMatrixf
+GLAD_API_CALL PFNGLMULTIDRAWARRAYSPROC sf_glad_glMultiDrawArrays;
+#define glMultiDrawArrays sf_glad_glMultiDrawArrays
+GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTPROC sf_glad_glMultiDrawArraysIndirect;
+#define glMultiDrawArraysIndirect sf_glad_glMultiDrawArraysIndirect
+GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC sf_glad_glMultiDrawArraysIndirectCount;
+#define glMultiDrawArraysIndirectCount sf_glad_glMultiDrawArraysIndirectCount
+GLAD_API_CALL PFNGLMULTIDRAWELEMENTSPROC sf_glad_glMultiDrawElements;
+#define glMultiDrawElements sf_glad_glMultiDrawElements
+GLAD_API_CALL PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC sf_glad_glMultiDrawElementsBaseVertex;
+#define glMultiDrawElementsBaseVertex sf_glad_glMultiDrawElementsBaseVertex
+GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTPROC sf_glad_glMultiDrawElementsIndirect;
+#define glMultiDrawElementsIndirect sf_glad_glMultiDrawElementsIndirect
+GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC sf_glad_glMultiDrawElementsIndirectCount;
+#define glMultiDrawElementsIndirectCount sf_glad_glMultiDrawElementsIndirectCount
+GLAD_API_CALL PFNGLMULTITEXCOORD1DPROC sf_glad_glMultiTexCoord1d;
+#define glMultiTexCoord1d sf_glad_glMultiTexCoord1d
+GLAD_API_CALL PFNGLMULTITEXCOORD1DARBPROC sf_glad_glMultiTexCoord1dARB;
+#define glMultiTexCoord1dARB sf_glad_glMultiTexCoord1dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1DVPROC sf_glad_glMultiTexCoord1dv;
+#define glMultiTexCoord1dv sf_glad_glMultiTexCoord1dv
+GLAD_API_CALL PFNGLMULTITEXCOORD1DVARBPROC sf_glad_glMultiTexCoord1dvARB;
+#define glMultiTexCoord1dvARB sf_glad_glMultiTexCoord1dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1FPROC sf_glad_glMultiTexCoord1f;
+#define glMultiTexCoord1f sf_glad_glMultiTexCoord1f
+GLAD_API_CALL PFNGLMULTITEXCOORD1FARBPROC sf_glad_glMultiTexCoord1fARB;
+#define glMultiTexCoord1fARB sf_glad_glMultiTexCoord1fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1FVPROC sf_glad_glMultiTexCoord1fv;
+#define glMultiTexCoord1fv sf_glad_glMultiTexCoord1fv
+GLAD_API_CALL PFNGLMULTITEXCOORD1FVARBPROC sf_glad_glMultiTexCoord1fvARB;
+#define glMultiTexCoord1fvARB sf_glad_glMultiTexCoord1fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1IPROC sf_glad_glMultiTexCoord1i;
+#define glMultiTexCoord1i sf_glad_glMultiTexCoord1i
+GLAD_API_CALL PFNGLMULTITEXCOORD1IARBPROC sf_glad_glMultiTexCoord1iARB;
+#define glMultiTexCoord1iARB sf_glad_glMultiTexCoord1iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1IVPROC sf_glad_glMultiTexCoord1iv;
+#define glMultiTexCoord1iv sf_glad_glMultiTexCoord1iv
+GLAD_API_CALL PFNGLMULTITEXCOORD1IVARBPROC sf_glad_glMultiTexCoord1ivARB;
+#define glMultiTexCoord1ivARB sf_glad_glMultiTexCoord1ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1SPROC sf_glad_glMultiTexCoord1s;
+#define glMultiTexCoord1s sf_glad_glMultiTexCoord1s
+GLAD_API_CALL PFNGLMULTITEXCOORD1SARBPROC sf_glad_glMultiTexCoord1sARB;
+#define glMultiTexCoord1sARB sf_glad_glMultiTexCoord1sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD1SVPROC sf_glad_glMultiTexCoord1sv;
+#define glMultiTexCoord1sv sf_glad_glMultiTexCoord1sv
+GLAD_API_CALL PFNGLMULTITEXCOORD1SVARBPROC sf_glad_glMultiTexCoord1svARB;
+#define glMultiTexCoord1svARB sf_glad_glMultiTexCoord1svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2DPROC sf_glad_glMultiTexCoord2d;
+#define glMultiTexCoord2d sf_glad_glMultiTexCoord2d
+GLAD_API_CALL PFNGLMULTITEXCOORD2DARBPROC sf_glad_glMultiTexCoord2dARB;
+#define glMultiTexCoord2dARB sf_glad_glMultiTexCoord2dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2DVPROC sf_glad_glMultiTexCoord2dv;
+#define glMultiTexCoord2dv sf_glad_glMultiTexCoord2dv
+GLAD_API_CALL PFNGLMULTITEXCOORD2DVARBPROC sf_glad_glMultiTexCoord2dvARB;
+#define glMultiTexCoord2dvARB sf_glad_glMultiTexCoord2dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2FPROC sf_glad_glMultiTexCoord2f;
+#define glMultiTexCoord2f sf_glad_glMultiTexCoord2f
+GLAD_API_CALL PFNGLMULTITEXCOORD2FARBPROC sf_glad_glMultiTexCoord2fARB;
+#define glMultiTexCoord2fARB sf_glad_glMultiTexCoord2fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2FVPROC sf_glad_glMultiTexCoord2fv;
+#define glMultiTexCoord2fv sf_glad_glMultiTexCoord2fv
+GLAD_API_CALL PFNGLMULTITEXCOORD2FVARBPROC sf_glad_glMultiTexCoord2fvARB;
+#define glMultiTexCoord2fvARB sf_glad_glMultiTexCoord2fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2IPROC sf_glad_glMultiTexCoord2i;
+#define glMultiTexCoord2i sf_glad_glMultiTexCoord2i
+GLAD_API_CALL PFNGLMULTITEXCOORD2IARBPROC sf_glad_glMultiTexCoord2iARB;
+#define glMultiTexCoord2iARB sf_glad_glMultiTexCoord2iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2IVPROC sf_glad_glMultiTexCoord2iv;
+#define glMultiTexCoord2iv sf_glad_glMultiTexCoord2iv
+GLAD_API_CALL PFNGLMULTITEXCOORD2IVARBPROC sf_glad_glMultiTexCoord2ivARB;
+#define glMultiTexCoord2ivARB sf_glad_glMultiTexCoord2ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2SPROC sf_glad_glMultiTexCoord2s;
+#define glMultiTexCoord2s sf_glad_glMultiTexCoord2s
+GLAD_API_CALL PFNGLMULTITEXCOORD2SARBPROC sf_glad_glMultiTexCoord2sARB;
+#define glMultiTexCoord2sARB sf_glad_glMultiTexCoord2sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD2SVPROC sf_glad_glMultiTexCoord2sv;
+#define glMultiTexCoord2sv sf_glad_glMultiTexCoord2sv
+GLAD_API_CALL PFNGLMULTITEXCOORD2SVARBPROC sf_glad_glMultiTexCoord2svARB;
+#define glMultiTexCoord2svARB sf_glad_glMultiTexCoord2svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3DPROC sf_glad_glMultiTexCoord3d;
+#define glMultiTexCoord3d sf_glad_glMultiTexCoord3d
+GLAD_API_CALL PFNGLMULTITEXCOORD3DARBPROC sf_glad_glMultiTexCoord3dARB;
+#define glMultiTexCoord3dARB sf_glad_glMultiTexCoord3dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3DVPROC sf_glad_glMultiTexCoord3dv;
+#define glMultiTexCoord3dv sf_glad_glMultiTexCoord3dv
+GLAD_API_CALL PFNGLMULTITEXCOORD3DVARBPROC sf_glad_glMultiTexCoord3dvARB;
+#define glMultiTexCoord3dvARB sf_glad_glMultiTexCoord3dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3FPROC sf_glad_glMultiTexCoord3f;
+#define glMultiTexCoord3f sf_glad_glMultiTexCoord3f
+GLAD_API_CALL PFNGLMULTITEXCOORD3FARBPROC sf_glad_glMultiTexCoord3fARB;
+#define glMultiTexCoord3fARB sf_glad_glMultiTexCoord3fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3FVPROC sf_glad_glMultiTexCoord3fv;
+#define glMultiTexCoord3fv sf_glad_glMultiTexCoord3fv
+GLAD_API_CALL PFNGLMULTITEXCOORD3FVARBPROC sf_glad_glMultiTexCoord3fvARB;
+#define glMultiTexCoord3fvARB sf_glad_glMultiTexCoord3fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3IPROC sf_glad_glMultiTexCoord3i;
+#define glMultiTexCoord3i sf_glad_glMultiTexCoord3i
+GLAD_API_CALL PFNGLMULTITEXCOORD3IARBPROC sf_glad_glMultiTexCoord3iARB;
+#define glMultiTexCoord3iARB sf_glad_glMultiTexCoord3iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3IVPROC sf_glad_glMultiTexCoord3iv;
+#define glMultiTexCoord3iv sf_glad_glMultiTexCoord3iv
+GLAD_API_CALL PFNGLMULTITEXCOORD3IVARBPROC sf_glad_glMultiTexCoord3ivARB;
+#define glMultiTexCoord3ivARB sf_glad_glMultiTexCoord3ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3SPROC sf_glad_glMultiTexCoord3s;
+#define glMultiTexCoord3s sf_glad_glMultiTexCoord3s
+GLAD_API_CALL PFNGLMULTITEXCOORD3SARBPROC sf_glad_glMultiTexCoord3sARB;
+#define glMultiTexCoord3sARB sf_glad_glMultiTexCoord3sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD3SVPROC sf_glad_glMultiTexCoord3sv;
+#define glMultiTexCoord3sv sf_glad_glMultiTexCoord3sv
+GLAD_API_CALL PFNGLMULTITEXCOORD3SVARBPROC sf_glad_glMultiTexCoord3svARB;
+#define glMultiTexCoord3svARB sf_glad_glMultiTexCoord3svARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4DPROC sf_glad_glMultiTexCoord4d;
+#define glMultiTexCoord4d sf_glad_glMultiTexCoord4d
+GLAD_API_CALL PFNGLMULTITEXCOORD4DARBPROC sf_glad_glMultiTexCoord4dARB;
+#define glMultiTexCoord4dARB sf_glad_glMultiTexCoord4dARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4DVPROC sf_glad_glMultiTexCoord4dv;
+#define glMultiTexCoord4dv sf_glad_glMultiTexCoord4dv
+GLAD_API_CALL PFNGLMULTITEXCOORD4DVARBPROC sf_glad_glMultiTexCoord4dvARB;
+#define glMultiTexCoord4dvARB sf_glad_glMultiTexCoord4dvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4FPROC sf_glad_glMultiTexCoord4f;
+#define glMultiTexCoord4f sf_glad_glMultiTexCoord4f
+GLAD_API_CALL PFNGLMULTITEXCOORD4FARBPROC sf_glad_glMultiTexCoord4fARB;
+#define glMultiTexCoord4fARB sf_glad_glMultiTexCoord4fARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4FVPROC sf_glad_glMultiTexCoord4fv;
+#define glMultiTexCoord4fv sf_glad_glMultiTexCoord4fv
+GLAD_API_CALL PFNGLMULTITEXCOORD4FVARBPROC sf_glad_glMultiTexCoord4fvARB;
+#define glMultiTexCoord4fvARB sf_glad_glMultiTexCoord4fvARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4IPROC sf_glad_glMultiTexCoord4i;
+#define glMultiTexCoord4i sf_glad_glMultiTexCoord4i
+GLAD_API_CALL PFNGLMULTITEXCOORD4IARBPROC sf_glad_glMultiTexCoord4iARB;
+#define glMultiTexCoord4iARB sf_glad_glMultiTexCoord4iARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4IVPROC sf_glad_glMultiTexCoord4iv;
+#define glMultiTexCoord4iv sf_glad_glMultiTexCoord4iv
+GLAD_API_CALL PFNGLMULTITEXCOORD4IVARBPROC sf_glad_glMultiTexCoord4ivARB;
+#define glMultiTexCoord4ivARB sf_glad_glMultiTexCoord4ivARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4SPROC sf_glad_glMultiTexCoord4s;
+#define glMultiTexCoord4s sf_glad_glMultiTexCoord4s
+GLAD_API_CALL PFNGLMULTITEXCOORD4SARBPROC sf_glad_glMultiTexCoord4sARB;
+#define glMultiTexCoord4sARB sf_glad_glMultiTexCoord4sARB
+GLAD_API_CALL PFNGLMULTITEXCOORD4SVPROC sf_glad_glMultiTexCoord4sv;
+#define glMultiTexCoord4sv sf_glad_glMultiTexCoord4sv
+GLAD_API_CALL PFNGLMULTITEXCOORD4SVARBPROC sf_glad_glMultiTexCoord4svARB;
+#define glMultiTexCoord4svARB sf_glad_glMultiTexCoord4svARB
+GLAD_API_CALL PFNGLMULTITEXCOORDP1UIPROC sf_glad_glMultiTexCoordP1ui;
+#define glMultiTexCoordP1ui sf_glad_glMultiTexCoordP1ui
+GLAD_API_CALL PFNGLMULTITEXCOORDP1UIVPROC sf_glad_glMultiTexCoordP1uiv;
+#define glMultiTexCoordP1uiv sf_glad_glMultiTexCoordP1uiv
+GLAD_API_CALL PFNGLMULTITEXCOORDP2UIPROC sf_glad_glMultiTexCoordP2ui;
+#define glMultiTexCoordP2ui sf_glad_glMultiTexCoordP2ui
+GLAD_API_CALL PFNGLMULTITEXCOORDP2UIVPROC sf_glad_glMultiTexCoordP2uiv;
+#define glMultiTexCoordP2uiv sf_glad_glMultiTexCoordP2uiv
+GLAD_API_CALL PFNGLMULTITEXCOORDP3UIPROC sf_glad_glMultiTexCoordP3ui;
+#define glMultiTexCoordP3ui sf_glad_glMultiTexCoordP3ui
+GLAD_API_CALL PFNGLMULTITEXCOORDP3UIVPROC sf_glad_glMultiTexCoordP3uiv;
+#define glMultiTexCoordP3uiv sf_glad_glMultiTexCoordP3uiv
+GLAD_API_CALL PFNGLMULTITEXCOORDP4UIPROC sf_glad_glMultiTexCoordP4ui;
+#define glMultiTexCoordP4ui sf_glad_glMultiTexCoordP4ui
+GLAD_API_CALL PFNGLMULTITEXCOORDP4UIVPROC sf_glad_glMultiTexCoordP4uiv;
+#define glMultiTexCoordP4uiv sf_glad_glMultiTexCoordP4uiv
+GLAD_API_CALL PFNGLNAMEDBUFFERDATAPROC sf_glad_glNamedBufferData;
+#define glNamedBufferData sf_glad_glNamedBufferData
+GLAD_API_CALL PFNGLNAMEDBUFFERSTORAGEPROC sf_glad_glNamedBufferStorage;
+#define glNamedBufferStorage sf_glad_glNamedBufferStorage
+GLAD_API_CALL PFNGLNAMEDBUFFERSUBDATAPROC sf_glad_glNamedBufferSubData;
+#define glNamedBufferSubData sf_glad_glNamedBufferSubData
+GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC sf_glad_glNamedFramebufferDrawBuffer;
+#define glNamedFramebufferDrawBuffer sf_glad_glNamedFramebufferDrawBuffer
+GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC sf_glad_glNamedFramebufferDrawBuffers;
+#define glNamedFramebufferDrawBuffers sf_glad_glNamedFramebufferDrawBuffers
+GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC sf_glad_glNamedFramebufferParameteri;
+#define glNamedFramebufferParameteri sf_glad_glNamedFramebufferParameteri
+GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC sf_glad_glNamedFramebufferReadBuffer;
+#define glNamedFramebufferReadBuffer sf_glad_glNamedFramebufferReadBuffer
+GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC sf_glad_glNamedFramebufferRenderbuffer;
+#define glNamedFramebufferRenderbuffer sf_glad_glNamedFramebufferRenderbuffer
+GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTUREPROC sf_glad_glNamedFramebufferTexture;
+#define glNamedFramebufferTexture sf_glad_glNamedFramebufferTexture
+GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC sf_glad_glNamedFramebufferTextureLayer;
+#define glNamedFramebufferTextureLayer sf_glad_glNamedFramebufferTextureLayer
+GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEPROC sf_glad_glNamedRenderbufferStorage;
+#define glNamedRenderbufferStorage sf_glad_glNamedRenderbufferStorage
+GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC sf_glad_glNamedRenderbufferStorageMultisample;
+#define glNamedRenderbufferStorageMultisample sf_glad_glNamedRenderbufferStorageMultisample
+GLAD_API_CALL PFNGLNEWLISTPROC sf_glad_glNewList;
+#define glNewList sf_glad_glNewList
+GLAD_API_CALL PFNGLNORMAL3BPROC sf_glad_glNormal3b;
+#define glNormal3b sf_glad_glNormal3b
+GLAD_API_CALL PFNGLNORMAL3BVPROC sf_glad_glNormal3bv;
+#define glNormal3bv sf_glad_glNormal3bv
+GLAD_API_CALL PFNGLNORMAL3DPROC sf_glad_glNormal3d;
+#define glNormal3d sf_glad_glNormal3d
+GLAD_API_CALL PFNGLNORMAL3DVPROC sf_glad_glNormal3dv;
+#define glNormal3dv sf_glad_glNormal3dv
+GLAD_API_CALL PFNGLNORMAL3FPROC sf_glad_glNormal3f;
+#define glNormal3f sf_glad_glNormal3f
+GLAD_API_CALL PFNGLNORMAL3FVPROC sf_glad_glNormal3fv;
+#define glNormal3fv sf_glad_glNormal3fv
+GLAD_API_CALL PFNGLNORMAL3IPROC sf_glad_glNormal3i;
+#define glNormal3i sf_glad_glNormal3i
+GLAD_API_CALL PFNGLNORMAL3IVPROC sf_glad_glNormal3iv;
+#define glNormal3iv sf_glad_glNormal3iv
+GLAD_API_CALL PFNGLNORMAL3SPROC sf_glad_glNormal3s;
+#define glNormal3s sf_glad_glNormal3s
+GLAD_API_CALL PFNGLNORMAL3SVPROC sf_glad_glNormal3sv;
+#define glNormal3sv sf_glad_glNormal3sv
+GLAD_API_CALL PFNGLNORMALP3UIPROC sf_glad_glNormalP3ui;
+#define glNormalP3ui sf_glad_glNormalP3ui
+GLAD_API_CALL PFNGLNORMALP3UIVPROC sf_glad_glNormalP3uiv;
+#define glNormalP3uiv sf_glad_glNormalP3uiv
+GLAD_API_CALL PFNGLNORMALPOINTERPROC sf_glad_glNormalPointer;
+#define glNormalPointer sf_glad_glNormalPointer
+GLAD_API_CALL PFNGLNORMALPOINTEREXTPROC sf_glad_glNormalPointerEXT;
+#define glNormalPointerEXT sf_glad_glNormalPointerEXT
+GLAD_API_CALL PFNGLOBJECTLABELPROC sf_glad_glObjectLabel;
+#define glObjectLabel sf_glad_glObjectLabel
+GLAD_API_CALL PFNGLOBJECTPTRLABELPROC sf_glad_glObjectPtrLabel;
+#define glObjectPtrLabel sf_glad_glObjectPtrLabel
+GLAD_API_CALL PFNGLORTHOPROC sf_glad_glOrtho;
+#define glOrtho sf_glad_glOrtho
+GLAD_API_CALL PFNGLORTHOFOESPROC sf_glad_glOrthofOES;
+#define glOrthofOES sf_glad_glOrthofOES
+GLAD_API_CALL PFNGLPASSTHROUGHPROC sf_glad_glPassThrough;
+#define glPassThrough sf_glad_glPassThrough
+GLAD_API_CALL PFNGLPATCHPARAMETERFVPROC sf_glad_glPatchParameterfv;
+#define glPatchParameterfv sf_glad_glPatchParameterfv
+GLAD_API_CALL PFNGLPATCHPARAMETERIPROC sf_glad_glPatchParameteri;
+#define glPatchParameteri sf_glad_glPatchParameteri
+GLAD_API_CALL PFNGLPAUSETRANSFORMFEEDBACKPROC sf_glad_glPauseTransformFeedback;
+#define glPauseTransformFeedback sf_glad_glPauseTransformFeedback
+GLAD_API_CALL PFNGLPIXELMAPFVPROC sf_glad_glPixelMapfv;
+#define glPixelMapfv sf_glad_glPixelMapfv
+GLAD_API_CALL PFNGLPIXELMAPUIVPROC sf_glad_glPixelMapuiv;
+#define glPixelMapuiv sf_glad_glPixelMapuiv
+GLAD_API_CALL PFNGLPIXELMAPUSVPROC sf_glad_glPixelMapusv;
+#define glPixelMapusv sf_glad_glPixelMapusv
+GLAD_API_CALL PFNGLPIXELSTOREFPROC sf_glad_glPixelStoref;
+#define glPixelStoref sf_glad_glPixelStoref
+GLAD_API_CALL PFNGLPIXELSTOREIPROC sf_glad_glPixelStorei;
+#define glPixelStorei sf_glad_glPixelStorei
+GLAD_API_CALL PFNGLPIXELTRANSFERFPROC sf_glad_glPixelTransferf;
+#define glPixelTransferf sf_glad_glPixelTransferf
+GLAD_API_CALL PFNGLPIXELTRANSFERIPROC sf_glad_glPixelTransferi;
+#define glPixelTransferi sf_glad_glPixelTransferi
+GLAD_API_CALL PFNGLPIXELZOOMPROC sf_glad_glPixelZoom;
+#define glPixelZoom sf_glad_glPixelZoom
+GLAD_API_CALL PFNGLPOINTPARAMETERFPROC sf_glad_glPointParameterf;
+#define glPointParameterf sf_glad_glPointParameterf
+GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC sf_glad_glPointParameterfv;
+#define glPointParameterfv sf_glad_glPointParameterfv
+GLAD_API_CALL PFNGLPOINTPARAMETERIPROC sf_glad_glPointParameteri;
+#define glPointParameteri sf_glad_glPointParameteri
+GLAD_API_CALL PFNGLPOINTPARAMETERIVPROC sf_glad_glPointParameteriv;
+#define glPointParameteriv sf_glad_glPointParameteriv
+GLAD_API_CALL PFNGLPOINTSIZEPROC sf_glad_glPointSize;
+#define glPointSize sf_glad_glPointSize
+GLAD_API_CALL PFNGLPOLYGONMODEPROC sf_glad_glPolygonMode;
+#define glPolygonMode sf_glad_glPolygonMode
+GLAD_API_CALL PFNGLPOLYGONOFFSETPROC sf_glad_glPolygonOffset;
+#define glPolygonOffset sf_glad_glPolygonOffset
+GLAD_API_CALL PFNGLPOLYGONOFFSETCLAMPPROC sf_glad_glPolygonOffsetClamp;
+#define glPolygonOffsetClamp sf_glad_glPolygonOffsetClamp
+GLAD_API_CALL PFNGLPOLYGONSTIPPLEPROC sf_glad_glPolygonStipple;
+#define glPolygonStipple sf_glad_glPolygonStipple
+GLAD_API_CALL PFNGLPOPATTRIBPROC sf_glad_glPopAttrib;
+#define glPopAttrib sf_glad_glPopAttrib
+GLAD_API_CALL PFNGLPOPCLIENTATTRIBPROC sf_glad_glPopClientAttrib;
+#define glPopClientAttrib sf_glad_glPopClientAttrib
+GLAD_API_CALL PFNGLPOPDEBUGGROUPPROC sf_glad_glPopDebugGroup;
+#define glPopDebugGroup sf_glad_glPopDebugGroup
+GLAD_API_CALL PFNGLPOPMATRIXPROC sf_glad_glPopMatrix;
+#define glPopMatrix sf_glad_glPopMatrix
+GLAD_API_CALL PFNGLPOPNAMEPROC sf_glad_glPopName;
+#define glPopName sf_glad_glPopName
+GLAD_API_CALL PFNGLPRIMITIVERESTARTINDEXPROC sf_glad_glPrimitiveRestartIndex;
+#define glPrimitiveRestartIndex sf_glad_glPrimitiveRestartIndex
+GLAD_API_CALL PFNGLPRIORITIZETEXTURESPROC sf_glad_glPrioritizeTextures;
+#define glPrioritizeTextures sf_glad_glPrioritizeTextures
+GLAD_API_CALL PFNGLPRIORITIZETEXTURESEXTPROC sf_glad_glPrioritizeTexturesEXT;
+#define glPrioritizeTexturesEXT sf_glad_glPrioritizeTexturesEXT
+GLAD_API_CALL PFNGLPROGRAMBINARYPROC sf_glad_glProgramBinary;
+#define glProgramBinary sf_glad_glProgramBinary
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DARBPROC sf_glad_glProgramEnvParameter4dARB;
+#define glProgramEnvParameter4dARB sf_glad_glProgramEnvParameter4dARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DVARBPROC sf_glad_glProgramEnvParameter4dvARB;
+#define glProgramEnvParameter4dvARB sf_glad_glProgramEnvParameter4dvARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FARBPROC sf_glad_glProgramEnvParameter4fARB;
+#define glProgramEnvParameter4fARB sf_glad_glProgramEnvParameter4fARB
+GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FVARBPROC sf_glad_glProgramEnvParameter4fvARB;
+#define glProgramEnvParameter4fvARB sf_glad_glProgramEnvParameter4fvARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DARBPROC sf_glad_glProgramLocalParameter4dARB;
+#define glProgramLocalParameter4dARB sf_glad_glProgramLocalParameter4dARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DVARBPROC sf_glad_glProgramLocalParameter4dvARB;
+#define glProgramLocalParameter4dvARB sf_glad_glProgramLocalParameter4dvARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FARBPROC sf_glad_glProgramLocalParameter4fARB;
+#define glProgramLocalParameter4fARB sf_glad_glProgramLocalParameter4fARB
+GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FVARBPROC sf_glad_glProgramLocalParameter4fvARB;
+#define glProgramLocalParameter4fvARB sf_glad_glProgramLocalParameter4fvARB
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4DNVPROC sf_glad_glProgramParameter4dNV;
+#define glProgramParameter4dNV sf_glad_glProgramParameter4dNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4DVNVPROC sf_glad_glProgramParameter4dvNV;
+#define glProgramParameter4dvNV sf_glad_glProgramParameter4dvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4FNVPROC sf_glad_glProgramParameter4fNV;
+#define glProgramParameter4fNV sf_glad_glProgramParameter4fNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETER4FVNVPROC sf_glad_glProgramParameter4fvNV;
+#define glProgramParameter4fvNV sf_glad_glProgramParameter4fvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIPROC sf_glad_glProgramParameteri;
+#define glProgramParameteri sf_glad_glProgramParameteri
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIARBPROC sf_glad_glProgramParameteriARB;
+#define glProgramParameteriARB sf_glad_glProgramParameteriARB
+GLAD_API_CALL PFNGLPROGRAMPARAMETERIEXTPROC sf_glad_glProgramParameteriEXT;
+#define glProgramParameteriEXT sf_glad_glProgramParameteriEXT
+GLAD_API_CALL PFNGLPROGRAMPARAMETERS4DVNVPROC sf_glad_glProgramParameters4dvNV;
+#define glProgramParameters4dvNV sf_glad_glProgramParameters4dvNV
+GLAD_API_CALL PFNGLPROGRAMPARAMETERS4FVNVPROC sf_glad_glProgramParameters4fvNV;
+#define glProgramParameters4fvNV sf_glad_glProgramParameters4fvNV
+GLAD_API_CALL PFNGLPROGRAMSTRINGARBPROC sf_glad_glProgramStringARB;
+#define glProgramStringARB sf_glad_glProgramStringARB
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1DPROC sf_glad_glProgramUniform1d;
+#define glProgramUniform1d sf_glad_glProgramUniform1d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1DVPROC sf_glad_glProgramUniform1dv;
+#define glProgramUniform1dv sf_glad_glProgramUniform1dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1FPROC sf_glad_glProgramUniform1f;
+#define glProgramUniform1f sf_glad_glProgramUniform1f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1FVPROC sf_glad_glProgramUniform1fv;
+#define glProgramUniform1fv sf_glad_glProgramUniform1fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1IPROC sf_glad_glProgramUniform1i;
+#define glProgramUniform1i sf_glad_glProgramUniform1i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1IVPROC sf_glad_glProgramUniform1iv;
+#define glProgramUniform1iv sf_glad_glProgramUniform1iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIPROC sf_glad_glProgramUniform1ui;
+#define glProgramUniform1ui sf_glad_glProgramUniform1ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIVPROC sf_glad_glProgramUniform1uiv;
+#define glProgramUniform1uiv sf_glad_glProgramUniform1uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2DPROC sf_glad_glProgramUniform2d;
+#define glProgramUniform2d sf_glad_glProgramUniform2d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2DVPROC sf_glad_glProgramUniform2dv;
+#define glProgramUniform2dv sf_glad_glProgramUniform2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2FPROC sf_glad_glProgramUniform2f;
+#define glProgramUniform2f sf_glad_glProgramUniform2f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2FVPROC sf_glad_glProgramUniform2fv;
+#define glProgramUniform2fv sf_glad_glProgramUniform2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2IPROC sf_glad_glProgramUniform2i;
+#define glProgramUniform2i sf_glad_glProgramUniform2i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2IVPROC sf_glad_glProgramUniform2iv;
+#define glProgramUniform2iv sf_glad_glProgramUniform2iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIPROC sf_glad_glProgramUniform2ui;
+#define glProgramUniform2ui sf_glad_glProgramUniform2ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIVPROC sf_glad_glProgramUniform2uiv;
+#define glProgramUniform2uiv sf_glad_glProgramUniform2uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3DPROC sf_glad_glProgramUniform3d;
+#define glProgramUniform3d sf_glad_glProgramUniform3d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3DVPROC sf_glad_glProgramUniform3dv;
+#define glProgramUniform3dv sf_glad_glProgramUniform3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3FPROC sf_glad_glProgramUniform3f;
+#define glProgramUniform3f sf_glad_glProgramUniform3f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3FVPROC sf_glad_glProgramUniform3fv;
+#define glProgramUniform3fv sf_glad_glProgramUniform3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3IPROC sf_glad_glProgramUniform3i;
+#define glProgramUniform3i sf_glad_glProgramUniform3i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3IVPROC sf_glad_glProgramUniform3iv;
+#define glProgramUniform3iv sf_glad_glProgramUniform3iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIPROC sf_glad_glProgramUniform3ui;
+#define glProgramUniform3ui sf_glad_glProgramUniform3ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIVPROC sf_glad_glProgramUniform3uiv;
+#define glProgramUniform3uiv sf_glad_glProgramUniform3uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4DPROC sf_glad_glProgramUniform4d;
+#define glProgramUniform4d sf_glad_glProgramUniform4d
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4DVPROC sf_glad_glProgramUniform4dv;
+#define glProgramUniform4dv sf_glad_glProgramUniform4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4FPROC sf_glad_glProgramUniform4f;
+#define glProgramUniform4f sf_glad_glProgramUniform4f
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4FVPROC sf_glad_glProgramUniform4fv;
+#define glProgramUniform4fv sf_glad_glProgramUniform4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4IPROC sf_glad_glProgramUniform4i;
+#define glProgramUniform4i sf_glad_glProgramUniform4i
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4IVPROC sf_glad_glProgramUniform4iv;
+#define glProgramUniform4iv sf_glad_glProgramUniform4iv
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIPROC sf_glad_glProgramUniform4ui;
+#define glProgramUniform4ui sf_glad_glProgramUniform4ui
+GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIVPROC sf_glad_glProgramUniform4uiv;
+#define glProgramUniform4uiv sf_glad_glProgramUniform4uiv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2DVPROC sf_glad_glProgramUniformMatrix2dv;
+#define glProgramUniformMatrix2dv sf_glad_glProgramUniformMatrix2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2FVPROC sf_glad_glProgramUniformMatrix2fv;
+#define glProgramUniformMatrix2fv sf_glad_glProgramUniformMatrix2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC sf_glad_glProgramUniformMatrix2x3dv;
+#define glProgramUniformMatrix2x3dv sf_glad_glProgramUniformMatrix2x3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC sf_glad_glProgramUniformMatrix2x3fv;
+#define glProgramUniformMatrix2x3fv sf_glad_glProgramUniformMatrix2x3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC sf_glad_glProgramUniformMatrix2x4dv;
+#define glProgramUniformMatrix2x4dv sf_glad_glProgramUniformMatrix2x4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC sf_glad_glProgramUniformMatrix2x4fv;
+#define glProgramUniformMatrix2x4fv sf_glad_glProgramUniformMatrix2x4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3DVPROC sf_glad_glProgramUniformMatrix3dv;
+#define glProgramUniformMatrix3dv sf_glad_glProgramUniformMatrix3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3FVPROC sf_glad_glProgramUniformMatrix3fv;
+#define glProgramUniformMatrix3fv sf_glad_glProgramUniformMatrix3fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC sf_glad_glProgramUniformMatrix3x2dv;
+#define glProgramUniformMatrix3x2dv sf_glad_glProgramUniformMatrix3x2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC sf_glad_glProgramUniformMatrix3x2fv;
+#define glProgramUniformMatrix3x2fv sf_glad_glProgramUniformMatrix3x2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC sf_glad_glProgramUniformMatrix3x4dv;
+#define glProgramUniformMatrix3x4dv sf_glad_glProgramUniformMatrix3x4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC sf_glad_glProgramUniformMatrix3x4fv;
+#define glProgramUniformMatrix3x4fv sf_glad_glProgramUniformMatrix3x4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4DVPROC sf_glad_glProgramUniformMatrix4dv;
+#define glProgramUniformMatrix4dv sf_glad_glProgramUniformMatrix4dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4FVPROC sf_glad_glProgramUniformMatrix4fv;
+#define glProgramUniformMatrix4fv sf_glad_glProgramUniformMatrix4fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC sf_glad_glProgramUniformMatrix4x2dv;
+#define glProgramUniformMatrix4x2dv sf_glad_glProgramUniformMatrix4x2dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC sf_glad_glProgramUniformMatrix4x2fv;
+#define glProgramUniformMatrix4x2fv sf_glad_glProgramUniformMatrix4x2fv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC sf_glad_glProgramUniformMatrix4x3dv;
+#define glProgramUniformMatrix4x3dv sf_glad_glProgramUniformMatrix4x3dv
+GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC sf_glad_glProgramUniformMatrix4x3fv;
+#define glProgramUniformMatrix4x3fv sf_glad_glProgramUniformMatrix4x3fv
+GLAD_API_CALL PFNGLPROGRAMVERTEXLIMITNVPROC sf_glad_glProgramVertexLimitNV;
+#define glProgramVertexLimitNV sf_glad_glProgramVertexLimitNV
+GLAD_API_CALL PFNGLPROVOKINGVERTEXPROC sf_glad_glProvokingVertex;
+#define glProvokingVertex sf_glad_glProvokingVertex
+GLAD_API_CALL PFNGLPUSHATTRIBPROC sf_glad_glPushAttrib;
+#define glPushAttrib sf_glad_glPushAttrib
+GLAD_API_CALL PFNGLPUSHCLIENTATTRIBPROC sf_glad_glPushClientAttrib;
+#define glPushClientAttrib sf_glad_glPushClientAttrib
+GLAD_API_CALL PFNGLPUSHDEBUGGROUPPROC sf_glad_glPushDebugGroup;
+#define glPushDebugGroup sf_glad_glPushDebugGroup
+GLAD_API_CALL PFNGLPUSHMATRIXPROC sf_glad_glPushMatrix;
+#define glPushMatrix sf_glad_glPushMatrix
+GLAD_API_CALL PFNGLPUSHNAMEPROC sf_glad_glPushName;
+#define glPushName sf_glad_glPushName
+GLAD_API_CALL PFNGLQUERYCOUNTERPROC sf_glad_glQueryCounter;
+#define glQueryCounter sf_glad_glQueryCounter
+GLAD_API_CALL PFNGLRASTERPOS2DPROC sf_glad_glRasterPos2d;
+#define glRasterPos2d sf_glad_glRasterPos2d
+GLAD_API_CALL PFNGLRASTERPOS2DVPROC sf_glad_glRasterPos2dv;
+#define glRasterPos2dv sf_glad_glRasterPos2dv
+GLAD_API_CALL PFNGLRASTERPOS2FPROC sf_glad_glRasterPos2f;
+#define glRasterPos2f sf_glad_glRasterPos2f
+GLAD_API_CALL PFNGLRASTERPOS2FVPROC sf_glad_glRasterPos2fv;
+#define glRasterPos2fv sf_glad_glRasterPos2fv
+GLAD_API_CALL PFNGLRASTERPOS2IPROC sf_glad_glRasterPos2i;
+#define glRasterPos2i sf_glad_glRasterPos2i
+GLAD_API_CALL PFNGLRASTERPOS2IVPROC sf_glad_glRasterPos2iv;
+#define glRasterPos2iv sf_glad_glRasterPos2iv
+GLAD_API_CALL PFNGLRASTERPOS2SPROC sf_glad_glRasterPos2s;
+#define glRasterPos2s sf_glad_glRasterPos2s
+GLAD_API_CALL PFNGLRASTERPOS2SVPROC sf_glad_glRasterPos2sv;
+#define glRasterPos2sv sf_glad_glRasterPos2sv
+GLAD_API_CALL PFNGLRASTERPOS3DPROC sf_glad_glRasterPos3d;
+#define glRasterPos3d sf_glad_glRasterPos3d
+GLAD_API_CALL PFNGLRASTERPOS3DVPROC sf_glad_glRasterPos3dv;
+#define glRasterPos3dv sf_glad_glRasterPos3dv
+GLAD_API_CALL PFNGLRASTERPOS3FPROC sf_glad_glRasterPos3f;
+#define glRasterPos3f sf_glad_glRasterPos3f
+GLAD_API_CALL PFNGLRASTERPOS3FVPROC sf_glad_glRasterPos3fv;
+#define glRasterPos3fv sf_glad_glRasterPos3fv
+GLAD_API_CALL PFNGLRASTERPOS3IPROC sf_glad_glRasterPos3i;
+#define glRasterPos3i sf_glad_glRasterPos3i
+GLAD_API_CALL PFNGLRASTERPOS3IVPROC sf_glad_glRasterPos3iv;
+#define glRasterPos3iv sf_glad_glRasterPos3iv
+GLAD_API_CALL PFNGLRASTERPOS3SPROC sf_glad_glRasterPos3s;
+#define glRasterPos3s sf_glad_glRasterPos3s
+GLAD_API_CALL PFNGLRASTERPOS3SVPROC sf_glad_glRasterPos3sv;
+#define glRasterPos3sv sf_glad_glRasterPos3sv
+GLAD_API_CALL PFNGLRASTERPOS4DPROC sf_glad_glRasterPos4d;
+#define glRasterPos4d sf_glad_glRasterPos4d
+GLAD_API_CALL PFNGLRASTERPOS4DVPROC sf_glad_glRasterPos4dv;
+#define glRasterPos4dv sf_glad_glRasterPos4dv
+GLAD_API_CALL PFNGLRASTERPOS4FPROC sf_glad_glRasterPos4f;
+#define glRasterPos4f sf_glad_glRasterPos4f
+GLAD_API_CALL PFNGLRASTERPOS4FVPROC sf_glad_glRasterPos4fv;
+#define glRasterPos4fv sf_glad_glRasterPos4fv
+GLAD_API_CALL PFNGLRASTERPOS4IPROC sf_glad_glRasterPos4i;
+#define glRasterPos4i sf_glad_glRasterPos4i
+GLAD_API_CALL PFNGLRASTERPOS4IVPROC sf_glad_glRasterPos4iv;
+#define glRasterPos4iv sf_glad_glRasterPos4iv
+GLAD_API_CALL PFNGLRASTERPOS4SPROC sf_glad_glRasterPos4s;
+#define glRasterPos4s sf_glad_glRasterPos4s
+GLAD_API_CALL PFNGLRASTERPOS4SVPROC sf_glad_glRasterPos4sv;
+#define glRasterPos4sv sf_glad_glRasterPos4sv
+GLAD_API_CALL PFNGLREADBUFFERPROC sf_glad_glReadBuffer;
+#define glReadBuffer sf_glad_glReadBuffer
+GLAD_API_CALL PFNGLREADPIXELSPROC sf_glad_glReadPixels;
+#define glReadPixels sf_glad_glReadPixels
+GLAD_API_CALL PFNGLREADNPIXELSPROC sf_glad_glReadnPixels;
+#define glReadnPixels sf_glad_glReadnPixels
+GLAD_API_CALL PFNGLRECTDPROC sf_glad_glRectd;
+#define glRectd sf_glad_glRectd
+GLAD_API_CALL PFNGLRECTDVPROC sf_glad_glRectdv;
+#define glRectdv sf_glad_glRectdv
+GLAD_API_CALL PFNGLRECTFPROC sf_glad_glRectf;
+#define glRectf sf_glad_glRectf
+GLAD_API_CALL PFNGLRECTFVPROC sf_glad_glRectfv;
+#define glRectfv sf_glad_glRectfv
+GLAD_API_CALL PFNGLRECTIPROC sf_glad_glRecti;
+#define glRecti sf_glad_glRecti
+GLAD_API_CALL PFNGLRECTIVPROC sf_glad_glRectiv;
+#define glRectiv sf_glad_glRectiv
+GLAD_API_CALL PFNGLRECTSPROC sf_glad_glRects;
+#define glRects sf_glad_glRects
+GLAD_API_CALL PFNGLRECTSVPROC sf_glad_glRectsv;
+#define glRectsv sf_glad_glRectsv
+GLAD_API_CALL PFNGLRELEASESHADERCOMPILERPROC sf_glad_glReleaseShaderCompiler;
+#define glReleaseShaderCompiler sf_glad_glReleaseShaderCompiler
+GLAD_API_CALL PFNGLRENDERMODEPROC sf_glad_glRenderMode;
+#define glRenderMode sf_glad_glRenderMode
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC sf_glad_glRenderbufferStorage;
+#define glRenderbufferStorage sf_glad_glRenderbufferStorage
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEEXTPROC sf_glad_glRenderbufferStorageEXT;
+#define glRenderbufferStorageEXT sf_glad_glRenderbufferStorageEXT
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC sf_glad_glRenderbufferStorageMultisample;
+#define glRenderbufferStorageMultisample sf_glad_glRenderbufferStorageMultisample
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC sf_glad_glRenderbufferStorageMultisampleEXT;
+#define glRenderbufferStorageMultisampleEXT sf_glad_glRenderbufferStorageMultisampleEXT
+GLAD_API_CALL PFNGLREQUESTRESIDENTPROGRAMSNVPROC sf_glad_glRequestResidentProgramsNV;
+#define glRequestResidentProgramsNV sf_glad_glRequestResidentProgramsNV
+GLAD_API_CALL PFNGLRESETHISTOGRAMPROC sf_glad_glResetHistogram;
+#define glResetHistogram sf_glad_glResetHistogram
+GLAD_API_CALL PFNGLRESETMINMAXPROC sf_glad_glResetMinmax;
+#define glResetMinmax sf_glad_glResetMinmax
+GLAD_API_CALL PFNGLRESUMETRANSFORMFEEDBACKPROC sf_glad_glResumeTransformFeedback;
+#define glResumeTransformFeedback sf_glad_glResumeTransformFeedback
+GLAD_API_CALL PFNGLROTATEDPROC sf_glad_glRotated;
+#define glRotated sf_glad_glRotated
+GLAD_API_CALL PFNGLROTATEFPROC sf_glad_glRotatef;
+#define glRotatef sf_glad_glRotatef
+GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC sf_glad_glSampleCoverage;
+#define glSampleCoverage sf_glad_glSampleCoverage
+GLAD_API_CALL PFNGLSAMPLEMASKIPROC sf_glad_glSampleMaski;
+#define glSampleMaski sf_glad_glSampleMaski
+GLAD_API_CALL PFNGLSAMPLERPARAMETERIIVPROC sf_glad_glSamplerParameterIiv;
+#define glSamplerParameterIiv sf_glad_glSamplerParameterIiv
+GLAD_API_CALL PFNGLSAMPLERPARAMETERIUIVPROC sf_glad_glSamplerParameterIuiv;
+#define glSamplerParameterIuiv sf_glad_glSamplerParameterIuiv
+GLAD_API_CALL PFNGLSAMPLERPARAMETERFPROC sf_glad_glSamplerParameterf;
+#define glSamplerParameterf sf_glad_glSamplerParameterf
+GLAD_API_CALL PFNGLSAMPLERPARAMETERFVPROC sf_glad_glSamplerParameterfv;
+#define glSamplerParameterfv sf_glad_glSamplerParameterfv
+GLAD_API_CALL PFNGLSAMPLERPARAMETERIPROC sf_glad_glSamplerParameteri;
+#define glSamplerParameteri sf_glad_glSamplerParameteri
+GLAD_API_CALL PFNGLSAMPLERPARAMETERIVPROC sf_glad_glSamplerParameteriv;
+#define glSamplerParameteriv sf_glad_glSamplerParameteriv
+GLAD_API_CALL PFNGLSCALEDPROC sf_glad_glScaled;
+#define glScaled sf_glad_glScaled
+GLAD_API_CALL PFNGLSCALEFPROC sf_glad_glScalef;
+#define glScalef sf_glad_glScalef
+GLAD_API_CALL PFNGLSCISSORPROC sf_glad_glScissor;
+#define glScissor sf_glad_glScissor
+GLAD_API_CALL PFNGLSCISSORARRAYVPROC sf_glad_glScissorArrayv;
+#define glScissorArrayv sf_glad_glScissorArrayv
+GLAD_API_CALL PFNGLSCISSORINDEXEDPROC sf_glad_glScissorIndexed;
+#define glScissorIndexed sf_glad_glScissorIndexed
+GLAD_API_CALL PFNGLSCISSORINDEXEDVPROC sf_glad_glScissorIndexedv;
+#define glScissorIndexedv sf_glad_glScissorIndexedv
+GLAD_API_CALL PFNGLSECONDARYCOLOR3BPROC sf_glad_glSecondaryColor3b;
+#define glSecondaryColor3b sf_glad_glSecondaryColor3b
+GLAD_API_CALL PFNGLSECONDARYCOLOR3BVPROC sf_glad_glSecondaryColor3bv;
+#define glSecondaryColor3bv sf_glad_glSecondaryColor3bv
+GLAD_API_CALL PFNGLSECONDARYCOLOR3DPROC sf_glad_glSecondaryColor3d;
+#define glSecondaryColor3d sf_glad_glSecondaryColor3d
+GLAD_API_CALL PFNGLSECONDARYCOLOR3DVPROC sf_glad_glSecondaryColor3dv;
+#define glSecondaryColor3dv sf_glad_glSecondaryColor3dv
+GLAD_API_CALL PFNGLSECONDARYCOLOR3FPROC sf_glad_glSecondaryColor3f;
+#define glSecondaryColor3f sf_glad_glSecondaryColor3f
+GLAD_API_CALL PFNGLSECONDARYCOLOR3FVPROC sf_glad_glSecondaryColor3fv;
+#define glSecondaryColor3fv sf_glad_glSecondaryColor3fv
+GLAD_API_CALL PFNGLSECONDARYCOLOR3IPROC sf_glad_glSecondaryColor3i;
+#define glSecondaryColor3i sf_glad_glSecondaryColor3i
+GLAD_API_CALL PFNGLSECONDARYCOLOR3IVPROC sf_glad_glSecondaryColor3iv;
+#define glSecondaryColor3iv sf_glad_glSecondaryColor3iv
+GLAD_API_CALL PFNGLSECONDARYCOLOR3SPROC sf_glad_glSecondaryColor3s;
+#define glSecondaryColor3s sf_glad_glSecondaryColor3s
+GLAD_API_CALL PFNGLSECONDARYCOLOR3SVPROC sf_glad_glSecondaryColor3sv;
+#define glSecondaryColor3sv sf_glad_glSecondaryColor3sv
+GLAD_API_CALL PFNGLSECONDARYCOLOR3UBPROC sf_glad_glSecondaryColor3ub;
+#define glSecondaryColor3ub sf_glad_glSecondaryColor3ub
+GLAD_API_CALL PFNGLSECONDARYCOLOR3UBVPROC sf_glad_glSecondaryColor3ubv;
+#define glSecondaryColor3ubv sf_glad_glSecondaryColor3ubv
+GLAD_API_CALL PFNGLSECONDARYCOLOR3UIPROC sf_glad_glSecondaryColor3ui;
+#define glSecondaryColor3ui sf_glad_glSecondaryColor3ui
+GLAD_API_CALL PFNGLSECONDARYCOLOR3UIVPROC sf_glad_glSecondaryColor3uiv;
+#define glSecondaryColor3uiv sf_glad_glSecondaryColor3uiv
+GLAD_API_CALL PFNGLSECONDARYCOLOR3USPROC sf_glad_glSecondaryColor3us;
+#define glSecondaryColor3us sf_glad_glSecondaryColor3us
+GLAD_API_CALL PFNGLSECONDARYCOLOR3USVPROC sf_glad_glSecondaryColor3usv;
+#define glSecondaryColor3usv sf_glad_glSecondaryColor3usv
+GLAD_API_CALL PFNGLSECONDARYCOLORP3UIPROC sf_glad_glSecondaryColorP3ui;
+#define glSecondaryColorP3ui sf_glad_glSecondaryColorP3ui
+GLAD_API_CALL PFNGLSECONDARYCOLORP3UIVPROC sf_glad_glSecondaryColorP3uiv;
+#define glSecondaryColorP3uiv sf_glad_glSecondaryColorP3uiv
+GLAD_API_CALL PFNGLSECONDARYCOLORPOINTERPROC sf_glad_glSecondaryColorPointer;
+#define glSecondaryColorPointer sf_glad_glSecondaryColorPointer
+GLAD_API_CALL PFNGLSELECTBUFFERPROC sf_glad_glSelectBuffer;
+#define glSelectBuffer sf_glad_glSelectBuffer
+GLAD_API_CALL PFNGLSEPARABLEFILTER2DPROC sf_glad_glSeparableFilter2D;
+#define glSeparableFilter2D sf_glad_glSeparableFilter2D
+GLAD_API_CALL PFNGLSHADEMODELPROC sf_glad_glShadeModel;
+#define glShadeModel sf_glad_glShadeModel
+GLAD_API_CALL PFNGLSHADERBINARYPROC sf_glad_glShaderBinary;
+#define glShaderBinary sf_glad_glShaderBinary
+GLAD_API_CALL PFNGLSHADERSOURCEPROC sf_glad_glShaderSource;
+#define glShaderSource sf_glad_glShaderSource
+GLAD_API_CALL PFNGLSHADERSOURCEARBPROC sf_glad_glShaderSourceARB;
+#define glShaderSourceARB sf_glad_glShaderSourceARB
+GLAD_API_CALL PFNGLSHADERSTORAGEBLOCKBINDINGPROC sf_glad_glShaderStorageBlockBinding;
+#define glShaderStorageBlockBinding sf_glad_glShaderStorageBlockBinding
+GLAD_API_CALL PFNGLSPECIALIZESHADERPROC sf_glad_glSpecializeShader;
+#define glSpecializeShader sf_glad_glSpecializeShader
+GLAD_API_CALL PFNGLSTENCILFUNCPROC sf_glad_glStencilFunc;
+#define glStencilFunc sf_glad_glStencilFunc
+GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEPROC sf_glad_glStencilFuncSeparate;
+#define glStencilFuncSeparate sf_glad_glStencilFuncSeparate
+GLAD_API_CALL PFNGLSTENCILMASKPROC sf_glad_glStencilMask;
+#define glStencilMask sf_glad_glStencilMask
+GLAD_API_CALL PFNGLSTENCILMASKSEPARATEPROC sf_glad_glStencilMaskSeparate;
+#define glStencilMaskSeparate sf_glad_glStencilMaskSeparate
+GLAD_API_CALL PFNGLSTENCILOPPROC sf_glad_glStencilOp;
+#define glStencilOp sf_glad_glStencilOp
+GLAD_API_CALL PFNGLSTENCILOPSEPARATEPROC sf_glad_glStencilOpSeparate;
+#define glStencilOpSeparate sf_glad_glStencilOpSeparate
+GLAD_API_CALL PFNGLTEXBUFFERPROC sf_glad_glTexBuffer;
+#define glTexBuffer sf_glad_glTexBuffer
+GLAD_API_CALL PFNGLTEXBUFFERRANGEPROC sf_glad_glTexBufferRange;
+#define glTexBufferRange sf_glad_glTexBufferRange
+GLAD_API_CALL PFNGLTEXCOORD1DPROC sf_glad_glTexCoord1d;
+#define glTexCoord1d sf_glad_glTexCoord1d
+GLAD_API_CALL PFNGLTEXCOORD1DVPROC sf_glad_glTexCoord1dv;
+#define glTexCoord1dv sf_glad_glTexCoord1dv
+GLAD_API_CALL PFNGLTEXCOORD1FPROC sf_glad_glTexCoord1f;
+#define glTexCoord1f sf_glad_glTexCoord1f
+GLAD_API_CALL PFNGLTEXCOORD1FVPROC sf_glad_glTexCoord1fv;
+#define glTexCoord1fv sf_glad_glTexCoord1fv
+GLAD_API_CALL PFNGLTEXCOORD1IPROC sf_glad_glTexCoord1i;
+#define glTexCoord1i sf_glad_glTexCoord1i
+GLAD_API_CALL PFNGLTEXCOORD1IVPROC sf_glad_glTexCoord1iv;
+#define glTexCoord1iv sf_glad_glTexCoord1iv
+GLAD_API_CALL PFNGLTEXCOORD1SPROC sf_glad_glTexCoord1s;
+#define glTexCoord1s sf_glad_glTexCoord1s
+GLAD_API_CALL PFNGLTEXCOORD1SVPROC sf_glad_glTexCoord1sv;
+#define glTexCoord1sv sf_glad_glTexCoord1sv
+GLAD_API_CALL PFNGLTEXCOORD2DPROC sf_glad_glTexCoord2d;
+#define glTexCoord2d sf_glad_glTexCoord2d
+GLAD_API_CALL PFNGLTEXCOORD2DVPROC sf_glad_glTexCoord2dv;
+#define glTexCoord2dv sf_glad_glTexCoord2dv
+GLAD_API_CALL PFNGLTEXCOORD2FPROC sf_glad_glTexCoord2f;
+#define glTexCoord2f sf_glad_glTexCoord2f
+GLAD_API_CALL PFNGLTEXCOORD2FVPROC sf_glad_glTexCoord2fv;
+#define glTexCoord2fv sf_glad_glTexCoord2fv
+GLAD_API_CALL PFNGLTEXCOORD2IPROC sf_glad_glTexCoord2i;
+#define glTexCoord2i sf_glad_glTexCoord2i
+GLAD_API_CALL PFNGLTEXCOORD2IVPROC sf_glad_glTexCoord2iv;
+#define glTexCoord2iv sf_glad_glTexCoord2iv
+GLAD_API_CALL PFNGLTEXCOORD2SPROC sf_glad_glTexCoord2s;
+#define glTexCoord2s sf_glad_glTexCoord2s
+GLAD_API_CALL PFNGLTEXCOORD2SVPROC sf_glad_glTexCoord2sv;
+#define glTexCoord2sv sf_glad_glTexCoord2sv
+GLAD_API_CALL PFNGLTEXCOORD3DPROC sf_glad_glTexCoord3d;
+#define glTexCoord3d sf_glad_glTexCoord3d
+GLAD_API_CALL PFNGLTEXCOORD3DVPROC sf_glad_glTexCoord3dv;
+#define glTexCoord3dv sf_glad_glTexCoord3dv
+GLAD_API_CALL PFNGLTEXCOORD3FPROC sf_glad_glTexCoord3f;
+#define glTexCoord3f sf_glad_glTexCoord3f
+GLAD_API_CALL PFNGLTEXCOORD3FVPROC sf_glad_glTexCoord3fv;
+#define glTexCoord3fv sf_glad_glTexCoord3fv
+GLAD_API_CALL PFNGLTEXCOORD3IPROC sf_glad_glTexCoord3i;
+#define glTexCoord3i sf_glad_glTexCoord3i
+GLAD_API_CALL PFNGLTEXCOORD3IVPROC sf_glad_glTexCoord3iv;
+#define glTexCoord3iv sf_glad_glTexCoord3iv
+GLAD_API_CALL PFNGLTEXCOORD3SPROC sf_glad_glTexCoord3s;
+#define glTexCoord3s sf_glad_glTexCoord3s
+GLAD_API_CALL PFNGLTEXCOORD3SVPROC sf_glad_glTexCoord3sv;
+#define glTexCoord3sv sf_glad_glTexCoord3sv
+GLAD_API_CALL PFNGLTEXCOORD4DPROC sf_glad_glTexCoord4d;
+#define glTexCoord4d sf_glad_glTexCoord4d
+GLAD_API_CALL PFNGLTEXCOORD4DVPROC sf_glad_glTexCoord4dv;
+#define glTexCoord4dv sf_glad_glTexCoord4dv
+GLAD_API_CALL PFNGLTEXCOORD4FPROC sf_glad_glTexCoord4f;
+#define glTexCoord4f sf_glad_glTexCoord4f
+GLAD_API_CALL PFNGLTEXCOORD4FVPROC sf_glad_glTexCoord4fv;
+#define glTexCoord4fv sf_glad_glTexCoord4fv
+GLAD_API_CALL PFNGLTEXCOORD4IPROC sf_glad_glTexCoord4i;
+#define glTexCoord4i sf_glad_glTexCoord4i
+GLAD_API_CALL PFNGLTEXCOORD4IVPROC sf_glad_glTexCoord4iv;
+#define glTexCoord4iv sf_glad_glTexCoord4iv
+GLAD_API_CALL PFNGLTEXCOORD4SPROC sf_glad_glTexCoord4s;
+#define glTexCoord4s sf_glad_glTexCoord4s
+GLAD_API_CALL PFNGLTEXCOORD4SVPROC sf_glad_glTexCoord4sv;
+#define glTexCoord4sv sf_glad_glTexCoord4sv
+GLAD_API_CALL PFNGLTEXCOORDP1UIPROC sf_glad_glTexCoordP1ui;
+#define glTexCoordP1ui sf_glad_glTexCoordP1ui
+GLAD_API_CALL PFNGLTEXCOORDP1UIVPROC sf_glad_glTexCoordP1uiv;
+#define glTexCoordP1uiv sf_glad_glTexCoordP1uiv
+GLAD_API_CALL PFNGLTEXCOORDP2UIPROC sf_glad_glTexCoordP2ui;
+#define glTexCoordP2ui sf_glad_glTexCoordP2ui
+GLAD_API_CALL PFNGLTEXCOORDP2UIVPROC sf_glad_glTexCoordP2uiv;
+#define glTexCoordP2uiv sf_glad_glTexCoordP2uiv
+GLAD_API_CALL PFNGLTEXCOORDP3UIPROC sf_glad_glTexCoordP3ui;
+#define glTexCoordP3ui sf_glad_glTexCoordP3ui
+GLAD_API_CALL PFNGLTEXCOORDP3UIVPROC sf_glad_glTexCoordP3uiv;
+#define glTexCoordP3uiv sf_glad_glTexCoordP3uiv
+GLAD_API_CALL PFNGLTEXCOORDP4UIPROC sf_glad_glTexCoordP4ui;
+#define glTexCoordP4ui sf_glad_glTexCoordP4ui
+GLAD_API_CALL PFNGLTEXCOORDP4UIVPROC sf_glad_glTexCoordP4uiv;
+#define glTexCoordP4uiv sf_glad_glTexCoordP4uiv
+GLAD_API_CALL PFNGLTEXCOORDPOINTERPROC sf_glad_glTexCoordPointer;
+#define glTexCoordPointer sf_glad_glTexCoordPointer
+GLAD_API_CALL PFNGLTEXCOORDPOINTEREXTPROC sf_glad_glTexCoordPointerEXT;
+#define glTexCoordPointerEXT sf_glad_glTexCoordPointerEXT
+GLAD_API_CALL PFNGLTEXENVFPROC sf_glad_glTexEnvf;
+#define glTexEnvf sf_glad_glTexEnvf
+GLAD_API_CALL PFNGLTEXENVFVPROC sf_glad_glTexEnvfv;
+#define glTexEnvfv sf_glad_glTexEnvfv
+GLAD_API_CALL PFNGLTEXENVIPROC sf_glad_glTexEnvi;
+#define glTexEnvi sf_glad_glTexEnvi
+GLAD_API_CALL PFNGLTEXENVIVPROC sf_glad_glTexEnviv;
+#define glTexEnviv sf_glad_glTexEnviv
+GLAD_API_CALL PFNGLTEXGENDPROC sf_glad_glTexGend;
+#define glTexGend sf_glad_glTexGend
+GLAD_API_CALL PFNGLTEXGENDVPROC sf_glad_glTexGendv;
+#define glTexGendv sf_glad_glTexGendv
+GLAD_API_CALL PFNGLTEXGENFPROC sf_glad_glTexGenf;
+#define glTexGenf sf_glad_glTexGenf
+GLAD_API_CALL PFNGLTEXGENFVPROC sf_glad_glTexGenfv;
+#define glTexGenfv sf_glad_glTexGenfv
+GLAD_API_CALL PFNGLTEXGENIPROC sf_glad_glTexGeni;
+#define glTexGeni sf_glad_glTexGeni
+GLAD_API_CALL PFNGLTEXGENIVPROC sf_glad_glTexGeniv;
+#define glTexGeniv sf_glad_glTexGeniv
+GLAD_API_CALL PFNGLTEXIMAGE1DPROC sf_glad_glTexImage1D;
+#define glTexImage1D sf_glad_glTexImage1D
+GLAD_API_CALL PFNGLTEXIMAGE2DPROC sf_glad_glTexImage2D;
+#define glTexImage2D sf_glad_glTexImage2D
+GLAD_API_CALL PFNGLTEXIMAGE2DMULTISAMPLEPROC sf_glad_glTexImage2DMultisample;
+#define glTexImage2DMultisample sf_glad_glTexImage2DMultisample
+GLAD_API_CALL PFNGLTEXIMAGE3DPROC sf_glad_glTexImage3D;
+#define glTexImage3D sf_glad_glTexImage3D
+GLAD_API_CALL PFNGLTEXIMAGE3DMULTISAMPLEPROC sf_glad_glTexImage3DMultisample;
+#define glTexImage3DMultisample sf_glad_glTexImage3DMultisample
+GLAD_API_CALL PFNGLTEXPARAMETERIIVPROC sf_glad_glTexParameterIiv;
+#define glTexParameterIiv sf_glad_glTexParameterIiv
+GLAD_API_CALL PFNGLTEXPARAMETERIUIVPROC sf_glad_glTexParameterIuiv;
+#define glTexParameterIuiv sf_glad_glTexParameterIuiv
+GLAD_API_CALL PFNGLTEXPARAMETERFPROC sf_glad_glTexParameterf;
+#define glTexParameterf sf_glad_glTexParameterf
+GLAD_API_CALL PFNGLTEXPARAMETERFVPROC sf_glad_glTexParameterfv;
+#define glTexParameterfv sf_glad_glTexParameterfv
+GLAD_API_CALL PFNGLTEXPARAMETERIPROC sf_glad_glTexParameteri;
+#define glTexParameteri sf_glad_glTexParameteri
+GLAD_API_CALL PFNGLTEXPARAMETERIVPROC sf_glad_glTexParameteriv;
+#define glTexParameteriv sf_glad_glTexParameteriv
+GLAD_API_CALL PFNGLTEXSTORAGE1DPROC sf_glad_glTexStorage1D;
+#define glTexStorage1D sf_glad_glTexStorage1D
+GLAD_API_CALL PFNGLTEXSTORAGE2DPROC sf_glad_glTexStorage2D;
+#define glTexStorage2D sf_glad_glTexStorage2D
+GLAD_API_CALL PFNGLTEXSTORAGE2DMULTISAMPLEPROC sf_glad_glTexStorage2DMultisample;
+#define glTexStorage2DMultisample sf_glad_glTexStorage2DMultisample
+GLAD_API_CALL PFNGLTEXSTORAGE3DPROC sf_glad_glTexStorage3D;
+#define glTexStorage3D sf_glad_glTexStorage3D
+GLAD_API_CALL PFNGLTEXSTORAGE3DMULTISAMPLEPROC sf_glad_glTexStorage3DMultisample;
+#define glTexStorage3DMultisample sf_glad_glTexStorage3DMultisample
+GLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC sf_glad_glTexSubImage1D;
+#define glTexSubImage1D sf_glad_glTexSubImage1D
+GLAD_API_CALL PFNGLTEXSUBIMAGE1DEXTPROC sf_glad_glTexSubImage1DEXT;
+#define glTexSubImage1DEXT sf_glad_glTexSubImage1DEXT
+GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC sf_glad_glTexSubImage2D;
+#define glTexSubImage2D sf_glad_glTexSubImage2D
+GLAD_API_CALL PFNGLTEXSUBIMAGE2DEXTPROC sf_glad_glTexSubImage2DEXT;
+#define glTexSubImage2DEXT sf_glad_glTexSubImage2DEXT
+GLAD_API_CALL PFNGLTEXSUBIMAGE3DPROC sf_glad_glTexSubImage3D;
+#define glTexSubImage3D sf_glad_glTexSubImage3D
+GLAD_API_CALL PFNGLTEXTUREBARRIERPROC sf_glad_glTextureBarrier;
+#define glTextureBarrier sf_glad_glTextureBarrier
+GLAD_API_CALL PFNGLTEXTUREBUFFERPROC sf_glad_glTextureBuffer;
+#define glTextureBuffer sf_glad_glTextureBuffer
+GLAD_API_CALL PFNGLTEXTUREBUFFERRANGEPROC sf_glad_glTextureBufferRange;
+#define glTextureBufferRange sf_glad_glTextureBufferRange
+GLAD_API_CALL PFNGLTEXTUREPARAMETERIIVPROC sf_glad_glTextureParameterIiv;
+#define glTextureParameterIiv sf_glad_glTextureParameterIiv
+GLAD_API_CALL PFNGLTEXTUREPARAMETERIUIVPROC sf_glad_glTextureParameterIuiv;
+#define glTextureParameterIuiv sf_glad_glTextureParameterIuiv
+GLAD_API_CALL PFNGLTEXTUREPARAMETERFPROC sf_glad_glTextureParameterf;
+#define glTextureParameterf sf_glad_glTextureParameterf
+GLAD_API_CALL PFNGLTEXTUREPARAMETERFVPROC sf_glad_glTextureParameterfv;
+#define glTextureParameterfv sf_glad_glTextureParameterfv
+GLAD_API_CALL PFNGLTEXTUREPARAMETERIPROC sf_glad_glTextureParameteri;
+#define glTextureParameteri sf_glad_glTextureParameteri
+GLAD_API_CALL PFNGLTEXTUREPARAMETERIVPROC sf_glad_glTextureParameteriv;
+#define glTextureParameteriv sf_glad_glTextureParameteriv
+GLAD_API_CALL PFNGLTEXTURESTORAGE1DPROC sf_glad_glTextureStorage1D;
+#define glTextureStorage1D sf_glad_glTextureStorage1D
+GLAD_API_CALL PFNGLTEXTURESTORAGE2DPROC sf_glad_glTextureStorage2D;
+#define glTextureStorage2D sf_glad_glTextureStorage2D
+GLAD_API_CALL PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC sf_glad_glTextureStorage2DMultisample;
+#define glTextureStorage2DMultisample sf_glad_glTextureStorage2DMultisample
+GLAD_API_CALL PFNGLTEXTURESTORAGE3DPROC sf_glad_glTextureStorage3D;
+#define glTextureStorage3D sf_glad_glTextureStorage3D
+GLAD_API_CALL PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC sf_glad_glTextureStorage3DMultisample;
+#define glTextureStorage3DMultisample sf_glad_glTextureStorage3DMultisample
+GLAD_API_CALL PFNGLTEXTURESUBIMAGE1DPROC sf_glad_glTextureSubImage1D;
+#define glTextureSubImage1D sf_glad_glTextureSubImage1D
+GLAD_API_CALL PFNGLTEXTURESUBIMAGE2DPROC sf_glad_glTextureSubImage2D;
+#define glTextureSubImage2D sf_glad_glTextureSubImage2D
+GLAD_API_CALL PFNGLTEXTURESUBIMAGE3DPROC sf_glad_glTextureSubImage3D;
+#define glTextureSubImage3D sf_glad_glTextureSubImage3D
+GLAD_API_CALL PFNGLTEXTUREVIEWPROC sf_glad_glTextureView;
+#define glTextureView sf_glad_glTextureView
+GLAD_API_CALL PFNGLTRACKMATRIXNVPROC sf_glad_glTrackMatrixNV;
+#define glTrackMatrixNV sf_glad_glTrackMatrixNV
+GLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC sf_glad_glTransformFeedbackBufferBase;
+#define glTransformFeedbackBufferBase sf_glad_glTransformFeedbackBufferBase
+GLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC sf_glad_glTransformFeedbackBufferRange;
+#define glTransformFeedbackBufferRange sf_glad_glTransformFeedbackBufferRange
+GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSPROC sf_glad_glTransformFeedbackVaryings;
+#define glTransformFeedbackVaryings sf_glad_glTransformFeedbackVaryings
+GLAD_API_CALL PFNGLTRANSLATEDPROC sf_glad_glTranslated;
+#define glTranslated sf_glad_glTranslated
+GLAD_API_CALL PFNGLTRANSLATEFPROC sf_glad_glTranslatef;
+#define glTranslatef sf_glad_glTranslatef
+GLAD_API_CALL PFNGLUNIFORM1DPROC sf_glad_glUniform1d;
+#define glUniform1d sf_glad_glUniform1d
+GLAD_API_CALL PFNGLUNIFORM1DVPROC sf_glad_glUniform1dv;
+#define glUniform1dv sf_glad_glUniform1dv
+GLAD_API_CALL PFNGLUNIFORM1FPROC sf_glad_glUniform1f;
+#define glUniform1f sf_glad_glUniform1f
+GLAD_API_CALL PFNGLUNIFORM1FARBPROC sf_glad_glUniform1fARB;
+#define glUniform1fARB sf_glad_glUniform1fARB
+GLAD_API_CALL PFNGLUNIFORM1FVPROC sf_glad_glUniform1fv;
+#define glUniform1fv sf_glad_glUniform1fv
+GLAD_API_CALL PFNGLUNIFORM1FVARBPROC sf_glad_glUniform1fvARB;
+#define glUniform1fvARB sf_glad_glUniform1fvARB
+GLAD_API_CALL PFNGLUNIFORM1IPROC sf_glad_glUniform1i;
+#define glUniform1i sf_glad_glUniform1i
+GLAD_API_CALL PFNGLUNIFORM1IARBPROC sf_glad_glUniform1iARB;
+#define glUniform1iARB sf_glad_glUniform1iARB
+GLAD_API_CALL PFNGLUNIFORM1IVPROC sf_glad_glUniform1iv;
+#define glUniform1iv sf_glad_glUniform1iv
+GLAD_API_CALL PFNGLUNIFORM1IVARBPROC sf_glad_glUniform1ivARB;
+#define glUniform1ivARB sf_glad_glUniform1ivARB
+GLAD_API_CALL PFNGLUNIFORM1UIPROC sf_glad_glUniform1ui;
+#define glUniform1ui sf_glad_glUniform1ui
+GLAD_API_CALL PFNGLUNIFORM1UIVPROC sf_glad_glUniform1uiv;
+#define glUniform1uiv sf_glad_glUniform1uiv
+GLAD_API_CALL PFNGLUNIFORM2DPROC sf_glad_glUniform2d;
+#define glUniform2d sf_glad_glUniform2d
+GLAD_API_CALL PFNGLUNIFORM2DVPROC sf_glad_glUniform2dv;
+#define glUniform2dv sf_glad_glUniform2dv
+GLAD_API_CALL PFNGLUNIFORM2FPROC sf_glad_glUniform2f;
+#define glUniform2f sf_glad_glUniform2f
+GLAD_API_CALL PFNGLUNIFORM2FARBPROC sf_glad_glUniform2fARB;
+#define glUniform2fARB sf_glad_glUniform2fARB
+GLAD_API_CALL PFNGLUNIFORM2FVPROC sf_glad_glUniform2fv;
+#define glUniform2fv sf_glad_glUniform2fv
+GLAD_API_CALL PFNGLUNIFORM2FVARBPROC sf_glad_glUniform2fvARB;
+#define glUniform2fvARB sf_glad_glUniform2fvARB
+GLAD_API_CALL PFNGLUNIFORM2IPROC sf_glad_glUniform2i;
+#define glUniform2i sf_glad_glUniform2i
+GLAD_API_CALL PFNGLUNIFORM2IARBPROC sf_glad_glUniform2iARB;
+#define glUniform2iARB sf_glad_glUniform2iARB
+GLAD_API_CALL PFNGLUNIFORM2IVPROC sf_glad_glUniform2iv;
+#define glUniform2iv sf_glad_glUniform2iv
+GLAD_API_CALL PFNGLUNIFORM2IVARBPROC sf_glad_glUniform2ivARB;
+#define glUniform2ivARB sf_glad_glUniform2ivARB
+GLAD_API_CALL PFNGLUNIFORM2UIPROC sf_glad_glUniform2ui;
+#define glUniform2ui sf_glad_glUniform2ui
+GLAD_API_CALL PFNGLUNIFORM2UIVPROC sf_glad_glUniform2uiv;
+#define glUniform2uiv sf_glad_glUniform2uiv
+GLAD_API_CALL PFNGLUNIFORM3DPROC sf_glad_glUniform3d;
+#define glUniform3d sf_glad_glUniform3d
+GLAD_API_CALL PFNGLUNIFORM3DVPROC sf_glad_glUniform3dv;
+#define glUniform3dv sf_glad_glUniform3dv
+GLAD_API_CALL PFNGLUNIFORM3FPROC sf_glad_glUniform3f;
+#define glUniform3f sf_glad_glUniform3f
+GLAD_API_CALL PFNGLUNIFORM3FARBPROC sf_glad_glUniform3fARB;
+#define glUniform3fARB sf_glad_glUniform3fARB
+GLAD_API_CALL PFNGLUNIFORM3FVPROC sf_glad_glUniform3fv;
+#define glUniform3fv sf_glad_glUniform3fv
+GLAD_API_CALL PFNGLUNIFORM3FVARBPROC sf_glad_glUniform3fvARB;
+#define glUniform3fvARB sf_glad_glUniform3fvARB
+GLAD_API_CALL PFNGLUNIFORM3IPROC sf_glad_glUniform3i;
+#define glUniform3i sf_glad_glUniform3i
+GLAD_API_CALL PFNGLUNIFORM3IARBPROC sf_glad_glUniform3iARB;
+#define glUniform3iARB sf_glad_glUniform3iARB
+GLAD_API_CALL PFNGLUNIFORM3IVPROC sf_glad_glUniform3iv;
+#define glUniform3iv sf_glad_glUniform3iv
+GLAD_API_CALL PFNGLUNIFORM3IVARBPROC sf_glad_glUniform3ivARB;
+#define glUniform3ivARB sf_glad_glUniform3ivARB
+GLAD_API_CALL PFNGLUNIFORM3UIPROC sf_glad_glUniform3ui;
+#define glUniform3ui sf_glad_glUniform3ui
+GLAD_API_CALL PFNGLUNIFORM3UIVPROC sf_glad_glUniform3uiv;
+#define glUniform3uiv sf_glad_glUniform3uiv
+GLAD_API_CALL PFNGLUNIFORM4DPROC sf_glad_glUniform4d;
+#define glUniform4d sf_glad_glUniform4d
+GLAD_API_CALL PFNGLUNIFORM4DVPROC sf_glad_glUniform4dv;
+#define glUniform4dv sf_glad_glUniform4dv
+GLAD_API_CALL PFNGLUNIFORM4FPROC sf_glad_glUniform4f;
+#define glUniform4f sf_glad_glUniform4f
+GLAD_API_CALL PFNGLUNIFORM4FARBPROC sf_glad_glUniform4fARB;
+#define glUniform4fARB sf_glad_glUniform4fARB
+GLAD_API_CALL PFNGLUNIFORM4FVPROC sf_glad_glUniform4fv;
+#define glUniform4fv sf_glad_glUniform4fv
+GLAD_API_CALL PFNGLUNIFORM4FVARBPROC sf_glad_glUniform4fvARB;
+#define glUniform4fvARB sf_glad_glUniform4fvARB
+GLAD_API_CALL PFNGLUNIFORM4IPROC sf_glad_glUniform4i;
+#define glUniform4i sf_glad_glUniform4i
+GLAD_API_CALL PFNGLUNIFORM4IARBPROC sf_glad_glUniform4iARB;
+#define glUniform4iARB sf_glad_glUniform4iARB
+GLAD_API_CALL PFNGLUNIFORM4IVPROC sf_glad_glUniform4iv;
+#define glUniform4iv sf_glad_glUniform4iv
+GLAD_API_CALL PFNGLUNIFORM4IVARBPROC sf_glad_glUniform4ivARB;
+#define glUniform4ivARB sf_glad_glUniform4ivARB
+GLAD_API_CALL PFNGLUNIFORM4UIPROC sf_glad_glUniform4ui;
+#define glUniform4ui sf_glad_glUniform4ui
+GLAD_API_CALL PFNGLUNIFORM4UIVPROC sf_glad_glUniform4uiv;
+#define glUniform4uiv sf_glad_glUniform4uiv
+GLAD_API_CALL PFNGLUNIFORMBLOCKBINDINGPROC sf_glad_glUniformBlockBinding;
+#define glUniformBlockBinding sf_glad_glUniformBlockBinding
+GLAD_API_CALL PFNGLUNIFORMMATRIX2DVPROC sf_glad_glUniformMatrix2dv;
+#define glUniformMatrix2dv sf_glad_glUniformMatrix2dv
+GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC sf_glad_glUniformMatrix2fv;
+#define glUniformMatrix2fv sf_glad_glUniformMatrix2fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX2FVARBPROC sf_glad_glUniformMatrix2fvARB;
+#define glUniformMatrix2fvARB sf_glad_glUniformMatrix2fvARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX2X3DVPROC sf_glad_glUniformMatrix2x3dv;
+#define glUniformMatrix2x3dv sf_glad_glUniformMatrix2x3dv
+GLAD_API_CALL PFNGLUNIFORMMATRIX2X3FVPROC sf_glad_glUniformMatrix2x3fv;
+#define glUniformMatrix2x3fv sf_glad_glUniformMatrix2x3fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX2X4DVPROC sf_glad_glUniformMatrix2x4dv;
+#define glUniformMatrix2x4dv sf_glad_glUniformMatrix2x4dv
+GLAD_API_CALL PFNGLUNIFORMMATRIX2X4FVPROC sf_glad_glUniformMatrix2x4fv;
+#define glUniformMatrix2x4fv sf_glad_glUniformMatrix2x4fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX3DVPROC sf_glad_glUniformMatrix3dv;
+#define glUniformMatrix3dv sf_glad_glUniformMatrix3dv
+GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC sf_glad_glUniformMatrix3fv;
+#define glUniformMatrix3fv sf_glad_glUniformMatrix3fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX3FVARBPROC sf_glad_glUniformMatrix3fvARB;
+#define glUniformMatrix3fvARB sf_glad_glUniformMatrix3fvARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX3X2DVPROC sf_glad_glUniformMatrix3x2dv;
+#define glUniformMatrix3x2dv sf_glad_glUniformMatrix3x2dv
+GLAD_API_CALL PFNGLUNIFORMMATRIX3X2FVPROC sf_glad_glUniformMatrix3x2fv;
+#define glUniformMatrix3x2fv sf_glad_glUniformMatrix3x2fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX3X4DVPROC sf_glad_glUniformMatrix3x4dv;
+#define glUniformMatrix3x4dv sf_glad_glUniformMatrix3x4dv
+GLAD_API_CALL PFNGLUNIFORMMATRIX3X4FVPROC sf_glad_glUniformMatrix3x4fv;
+#define glUniformMatrix3x4fv sf_glad_glUniformMatrix3x4fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX4DVPROC sf_glad_glUniformMatrix4dv;
+#define glUniformMatrix4dv sf_glad_glUniformMatrix4dv
+GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC sf_glad_glUniformMatrix4fv;
+#define glUniformMatrix4fv sf_glad_glUniformMatrix4fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX4FVARBPROC sf_glad_glUniformMatrix4fvARB;
+#define glUniformMatrix4fvARB sf_glad_glUniformMatrix4fvARB
+GLAD_API_CALL PFNGLUNIFORMMATRIX4X2DVPROC sf_glad_glUniformMatrix4x2dv;
+#define glUniformMatrix4x2dv sf_glad_glUniformMatrix4x2dv
+GLAD_API_CALL PFNGLUNIFORMMATRIX4X2FVPROC sf_glad_glUniformMatrix4x2fv;
+#define glUniformMatrix4x2fv sf_glad_glUniformMatrix4x2fv
+GLAD_API_CALL PFNGLUNIFORMMATRIX4X3DVPROC sf_glad_glUniformMatrix4x3dv;
+#define glUniformMatrix4x3dv sf_glad_glUniformMatrix4x3dv
+GLAD_API_CALL PFNGLUNIFORMMATRIX4X3FVPROC sf_glad_glUniformMatrix4x3fv;
+#define glUniformMatrix4x3fv sf_glad_glUniformMatrix4x3fv
+GLAD_API_CALL PFNGLUNIFORMSUBROUTINESUIVPROC sf_glad_glUniformSubroutinesuiv;
+#define glUniformSubroutinesuiv sf_glad_glUniformSubroutinesuiv
+GLAD_API_CALL PFNGLUNMAPBUFFERPROC sf_glad_glUnmapBuffer;
+#define glUnmapBuffer sf_glad_glUnmapBuffer
+GLAD_API_CALL PFNGLUNMAPBUFFERARBPROC sf_glad_glUnmapBufferARB;
+#define glUnmapBufferARB sf_glad_glUnmapBufferARB
+GLAD_API_CALL PFNGLUNMAPNAMEDBUFFERPROC sf_glad_glUnmapNamedBuffer;
+#define glUnmapNamedBuffer sf_glad_glUnmapNamedBuffer
+GLAD_API_CALL PFNGLUSEPROGRAMPROC sf_glad_glUseProgram;
+#define glUseProgram sf_glad_glUseProgram
+GLAD_API_CALL PFNGLUSEPROGRAMOBJECTARBPROC sf_glad_glUseProgramObjectARB;
+#define glUseProgramObjectARB sf_glad_glUseProgramObjectARB
+GLAD_API_CALL PFNGLUSEPROGRAMSTAGESPROC sf_glad_glUseProgramStages;
+#define glUseProgramStages sf_glad_glUseProgramStages
+GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC sf_glad_glValidateProgram;
+#define glValidateProgram sf_glad_glValidateProgram
+GLAD_API_CALL PFNGLVALIDATEPROGRAMARBPROC sf_glad_glValidateProgramARB;
+#define glValidateProgramARB sf_glad_glValidateProgramARB
+GLAD_API_CALL PFNGLVALIDATEPROGRAMPIPELINEPROC sf_glad_glValidateProgramPipeline;
+#define glValidateProgramPipeline sf_glad_glValidateProgramPipeline
+GLAD_API_CALL PFNGLVERTEX2DPROC sf_glad_glVertex2d;
+#define glVertex2d sf_glad_glVertex2d
+GLAD_API_CALL PFNGLVERTEX2DVPROC sf_glad_glVertex2dv;
+#define glVertex2dv sf_glad_glVertex2dv
+GLAD_API_CALL PFNGLVERTEX2FPROC sf_glad_glVertex2f;
+#define glVertex2f sf_glad_glVertex2f
+GLAD_API_CALL PFNGLVERTEX2FVPROC sf_glad_glVertex2fv;
+#define glVertex2fv sf_glad_glVertex2fv
+GLAD_API_CALL PFNGLVERTEX2IPROC sf_glad_glVertex2i;
+#define glVertex2i sf_glad_glVertex2i
+GLAD_API_CALL PFNGLVERTEX2IVPROC sf_glad_glVertex2iv;
+#define glVertex2iv sf_glad_glVertex2iv
+GLAD_API_CALL PFNGLVERTEX2SPROC sf_glad_glVertex2s;
+#define glVertex2s sf_glad_glVertex2s
+GLAD_API_CALL PFNGLVERTEX2SVPROC sf_glad_glVertex2sv;
+#define glVertex2sv sf_glad_glVertex2sv
+GLAD_API_CALL PFNGLVERTEX3DPROC sf_glad_glVertex3d;
+#define glVertex3d sf_glad_glVertex3d
+GLAD_API_CALL PFNGLVERTEX3DVPROC sf_glad_glVertex3dv;
+#define glVertex3dv sf_glad_glVertex3dv
+GLAD_API_CALL PFNGLVERTEX3FPROC sf_glad_glVertex3f;
+#define glVertex3f sf_glad_glVertex3f
+GLAD_API_CALL PFNGLVERTEX3FVPROC sf_glad_glVertex3fv;
+#define glVertex3fv sf_glad_glVertex3fv
+GLAD_API_CALL PFNGLVERTEX3IPROC sf_glad_glVertex3i;
+#define glVertex3i sf_glad_glVertex3i
+GLAD_API_CALL PFNGLVERTEX3IVPROC sf_glad_glVertex3iv;
+#define glVertex3iv sf_glad_glVertex3iv
+GLAD_API_CALL PFNGLVERTEX3SPROC sf_glad_glVertex3s;
+#define glVertex3s sf_glad_glVertex3s
+GLAD_API_CALL PFNGLVERTEX3SVPROC sf_glad_glVertex3sv;
+#define glVertex3sv sf_glad_glVertex3sv
+GLAD_API_CALL PFNGLVERTEX4DPROC sf_glad_glVertex4d;
+#define glVertex4d sf_glad_glVertex4d
+GLAD_API_CALL PFNGLVERTEX4DVPROC sf_glad_glVertex4dv;
+#define glVertex4dv sf_glad_glVertex4dv
+GLAD_API_CALL PFNGLVERTEX4FPROC sf_glad_glVertex4f;
+#define glVertex4f sf_glad_glVertex4f
+GLAD_API_CALL PFNGLVERTEX4FVPROC sf_glad_glVertex4fv;
+#define glVertex4fv sf_glad_glVertex4fv
+GLAD_API_CALL PFNGLVERTEX4IPROC sf_glad_glVertex4i;
+#define glVertex4i sf_glad_glVertex4i
+GLAD_API_CALL PFNGLVERTEX4IVPROC sf_glad_glVertex4iv;
+#define glVertex4iv sf_glad_glVertex4iv
+GLAD_API_CALL PFNGLVERTEX4SPROC sf_glad_glVertex4s;
+#define glVertex4s sf_glad_glVertex4s
+GLAD_API_CALL PFNGLVERTEX4SVPROC sf_glad_glVertex4sv;
+#define glVertex4sv sf_glad_glVertex4sv
+GLAD_API_CALL PFNGLVERTEXARRAYATTRIBBINDINGPROC sf_glad_glVertexArrayAttribBinding;
+#define glVertexArrayAttribBinding sf_glad_glVertexArrayAttribBinding
+GLAD_API_CALL PFNGLVERTEXARRAYATTRIBFORMATPROC sf_glad_glVertexArrayAttribFormat;
+#define glVertexArrayAttribFormat sf_glad_glVertexArrayAttribFormat
+GLAD_API_CALL PFNGLVERTEXARRAYATTRIBIFORMATPROC sf_glad_glVertexArrayAttribIFormat;
+#define glVertexArrayAttribIFormat sf_glad_glVertexArrayAttribIFormat
+GLAD_API_CALL PFNGLVERTEXARRAYATTRIBLFORMATPROC sf_glad_glVertexArrayAttribLFormat;
+#define glVertexArrayAttribLFormat sf_glad_glVertexArrayAttribLFormat
+GLAD_API_CALL PFNGLVERTEXARRAYBINDINGDIVISORPROC sf_glad_glVertexArrayBindingDivisor;
+#define glVertexArrayBindingDivisor sf_glad_glVertexArrayBindingDivisor
+GLAD_API_CALL PFNGLVERTEXARRAYELEMENTBUFFERPROC sf_glad_glVertexArrayElementBuffer;
+#define glVertexArrayElementBuffer sf_glad_glVertexArrayElementBuffer
+GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERPROC sf_glad_glVertexArrayVertexBuffer;
+#define glVertexArrayVertexBuffer sf_glad_glVertexArrayVertexBuffer
+GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERSPROC sf_glad_glVertexArrayVertexBuffers;
+#define glVertexArrayVertexBuffers sf_glad_glVertexArrayVertexBuffers
+GLAD_API_CALL PFNGLVERTEXATTRIB1DPROC sf_glad_glVertexAttrib1d;
+#define glVertexAttrib1d sf_glad_glVertexAttrib1d
+GLAD_API_CALL PFNGLVERTEXATTRIB1DARBPROC sf_glad_glVertexAttrib1dARB;
+#define glVertexAttrib1dARB sf_glad_glVertexAttrib1dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1DNVPROC sf_glad_glVertexAttrib1dNV;
+#define glVertexAttrib1dNV sf_glad_glVertexAttrib1dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVPROC sf_glad_glVertexAttrib1dv;
+#define glVertexAttrib1dv sf_glad_glVertexAttrib1dv
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVARBPROC sf_glad_glVertexAttrib1dvARB;
+#define glVertexAttrib1dvARB sf_glad_glVertexAttrib1dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1DVNVPROC sf_glad_glVertexAttrib1dvNV;
+#define glVertexAttrib1dvNV sf_glad_glVertexAttrib1dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC sf_glad_glVertexAttrib1f;
+#define glVertexAttrib1f sf_glad_glVertexAttrib1f
+GLAD_API_CALL PFNGLVERTEXATTRIB1FARBPROC sf_glad_glVertexAttrib1fARB;
+#define glVertexAttrib1fARB sf_glad_glVertexAttrib1fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1FNVPROC sf_glad_glVertexAttrib1fNV;
+#define glVertexAttrib1fNV sf_glad_glVertexAttrib1fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC sf_glad_glVertexAttrib1fv;
+#define glVertexAttrib1fv sf_glad_glVertexAttrib1fv
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVARBPROC sf_glad_glVertexAttrib1fvARB;
+#define glVertexAttrib1fvARB sf_glad_glVertexAttrib1fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1FVNVPROC sf_glad_glVertexAttrib1fvNV;
+#define glVertexAttrib1fvNV sf_glad_glVertexAttrib1fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1SPROC sf_glad_glVertexAttrib1s;
+#define glVertexAttrib1s sf_glad_glVertexAttrib1s
+GLAD_API_CALL PFNGLVERTEXATTRIB1SARBPROC sf_glad_glVertexAttrib1sARB;
+#define glVertexAttrib1sARB sf_glad_glVertexAttrib1sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1SNVPROC sf_glad_glVertexAttrib1sNV;
+#define glVertexAttrib1sNV sf_glad_glVertexAttrib1sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVPROC sf_glad_glVertexAttrib1sv;
+#define glVertexAttrib1sv sf_glad_glVertexAttrib1sv
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVARBPROC sf_glad_glVertexAttrib1svARB;
+#define glVertexAttrib1svARB sf_glad_glVertexAttrib1svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB1SVNVPROC sf_glad_glVertexAttrib1svNV;
+#define glVertexAttrib1svNV sf_glad_glVertexAttrib1svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2DPROC sf_glad_glVertexAttrib2d;
+#define glVertexAttrib2d sf_glad_glVertexAttrib2d
+GLAD_API_CALL PFNGLVERTEXATTRIB2DARBPROC sf_glad_glVertexAttrib2dARB;
+#define glVertexAttrib2dARB sf_glad_glVertexAttrib2dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2DNVPROC sf_glad_glVertexAttrib2dNV;
+#define glVertexAttrib2dNV sf_glad_glVertexAttrib2dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVPROC sf_glad_glVertexAttrib2dv;
+#define glVertexAttrib2dv sf_glad_glVertexAttrib2dv
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVARBPROC sf_glad_glVertexAttrib2dvARB;
+#define glVertexAttrib2dvARB sf_glad_glVertexAttrib2dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2DVNVPROC sf_glad_glVertexAttrib2dvNV;
+#define glVertexAttrib2dvNV sf_glad_glVertexAttrib2dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC sf_glad_glVertexAttrib2f;
+#define glVertexAttrib2f sf_glad_glVertexAttrib2f
+GLAD_API_CALL PFNGLVERTEXATTRIB2FARBPROC sf_glad_glVertexAttrib2fARB;
+#define glVertexAttrib2fARB sf_glad_glVertexAttrib2fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2FNVPROC sf_glad_glVertexAttrib2fNV;
+#define glVertexAttrib2fNV sf_glad_glVertexAttrib2fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC sf_glad_glVertexAttrib2fv;
+#define glVertexAttrib2fv sf_glad_glVertexAttrib2fv
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVARBPROC sf_glad_glVertexAttrib2fvARB;
+#define glVertexAttrib2fvARB sf_glad_glVertexAttrib2fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2FVNVPROC sf_glad_glVertexAttrib2fvNV;
+#define glVertexAttrib2fvNV sf_glad_glVertexAttrib2fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2SPROC sf_glad_glVertexAttrib2s;
+#define glVertexAttrib2s sf_glad_glVertexAttrib2s
+GLAD_API_CALL PFNGLVERTEXATTRIB2SARBPROC sf_glad_glVertexAttrib2sARB;
+#define glVertexAttrib2sARB sf_glad_glVertexAttrib2sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2SNVPROC sf_glad_glVertexAttrib2sNV;
+#define glVertexAttrib2sNV sf_glad_glVertexAttrib2sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVPROC sf_glad_glVertexAttrib2sv;
+#define glVertexAttrib2sv sf_glad_glVertexAttrib2sv
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVARBPROC sf_glad_glVertexAttrib2svARB;
+#define glVertexAttrib2svARB sf_glad_glVertexAttrib2svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB2SVNVPROC sf_glad_glVertexAttrib2svNV;
+#define glVertexAttrib2svNV sf_glad_glVertexAttrib2svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3DPROC sf_glad_glVertexAttrib3d;
+#define glVertexAttrib3d sf_glad_glVertexAttrib3d
+GLAD_API_CALL PFNGLVERTEXATTRIB3DARBPROC sf_glad_glVertexAttrib3dARB;
+#define glVertexAttrib3dARB sf_glad_glVertexAttrib3dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3DNVPROC sf_glad_glVertexAttrib3dNV;
+#define glVertexAttrib3dNV sf_glad_glVertexAttrib3dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVPROC sf_glad_glVertexAttrib3dv;
+#define glVertexAttrib3dv sf_glad_glVertexAttrib3dv
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVARBPROC sf_glad_glVertexAttrib3dvARB;
+#define glVertexAttrib3dvARB sf_glad_glVertexAttrib3dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3DVNVPROC sf_glad_glVertexAttrib3dvNV;
+#define glVertexAttrib3dvNV sf_glad_glVertexAttrib3dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC sf_glad_glVertexAttrib3f;
+#define glVertexAttrib3f sf_glad_glVertexAttrib3f
+GLAD_API_CALL PFNGLVERTEXATTRIB3FARBPROC sf_glad_glVertexAttrib3fARB;
+#define glVertexAttrib3fARB sf_glad_glVertexAttrib3fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3FNVPROC sf_glad_glVertexAttrib3fNV;
+#define glVertexAttrib3fNV sf_glad_glVertexAttrib3fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC sf_glad_glVertexAttrib3fv;
+#define glVertexAttrib3fv sf_glad_glVertexAttrib3fv
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVARBPROC sf_glad_glVertexAttrib3fvARB;
+#define glVertexAttrib3fvARB sf_glad_glVertexAttrib3fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3FVNVPROC sf_glad_glVertexAttrib3fvNV;
+#define glVertexAttrib3fvNV sf_glad_glVertexAttrib3fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3SPROC sf_glad_glVertexAttrib3s;
+#define glVertexAttrib3s sf_glad_glVertexAttrib3s
+GLAD_API_CALL PFNGLVERTEXATTRIB3SARBPROC sf_glad_glVertexAttrib3sARB;
+#define glVertexAttrib3sARB sf_glad_glVertexAttrib3sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3SNVPROC sf_glad_glVertexAttrib3sNV;
+#define glVertexAttrib3sNV sf_glad_glVertexAttrib3sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVPROC sf_glad_glVertexAttrib3sv;
+#define glVertexAttrib3sv sf_glad_glVertexAttrib3sv
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVARBPROC sf_glad_glVertexAttrib3svARB;
+#define glVertexAttrib3svARB sf_glad_glVertexAttrib3svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB3SVNVPROC sf_glad_glVertexAttrib3svNV;
+#define glVertexAttrib3svNV sf_glad_glVertexAttrib3svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4NBVPROC sf_glad_glVertexAttrib4Nbv;
+#define glVertexAttrib4Nbv sf_glad_glVertexAttrib4Nbv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NBVARBPROC sf_glad_glVertexAttrib4NbvARB;
+#define glVertexAttrib4NbvARB sf_glad_glVertexAttrib4NbvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NIVPROC sf_glad_glVertexAttrib4Niv;
+#define glVertexAttrib4Niv sf_glad_glVertexAttrib4Niv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NIVARBPROC sf_glad_glVertexAttrib4NivARB;
+#define glVertexAttrib4NivARB sf_glad_glVertexAttrib4NivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NSVPROC sf_glad_glVertexAttrib4Nsv;
+#define glVertexAttrib4Nsv sf_glad_glVertexAttrib4Nsv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NSVARBPROC sf_glad_glVertexAttrib4NsvARB;
+#define glVertexAttrib4NsvARB sf_glad_glVertexAttrib4NsvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBPROC sf_glad_glVertexAttrib4Nub;
+#define glVertexAttrib4Nub sf_glad_glVertexAttrib4Nub
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBARBPROC sf_glad_glVertexAttrib4NubARB;
+#define glVertexAttrib4NubARB sf_glad_glVertexAttrib4NubARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVPROC sf_glad_glVertexAttrib4Nubv;
+#define glVertexAttrib4Nubv sf_glad_glVertexAttrib4Nubv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVARBPROC sf_glad_glVertexAttrib4NubvARB;
+#define glVertexAttrib4NubvARB sf_glad_glVertexAttrib4NubvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVPROC sf_glad_glVertexAttrib4Nuiv;
+#define glVertexAttrib4Nuiv sf_glad_glVertexAttrib4Nuiv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVARBPROC sf_glad_glVertexAttrib4NuivARB;
+#define glVertexAttrib4NuivARB sf_glad_glVertexAttrib4NuivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVPROC sf_glad_glVertexAttrib4Nusv;
+#define glVertexAttrib4Nusv sf_glad_glVertexAttrib4Nusv
+GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVARBPROC sf_glad_glVertexAttrib4NusvARB;
+#define glVertexAttrib4NusvARB sf_glad_glVertexAttrib4NusvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4BVPROC sf_glad_glVertexAttrib4bv;
+#define glVertexAttrib4bv sf_glad_glVertexAttrib4bv
+GLAD_API_CALL PFNGLVERTEXATTRIB4BVARBPROC sf_glad_glVertexAttrib4bvARB;
+#define glVertexAttrib4bvARB sf_glad_glVertexAttrib4bvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DPROC sf_glad_glVertexAttrib4d;
+#define glVertexAttrib4d sf_glad_glVertexAttrib4d
+GLAD_API_CALL PFNGLVERTEXATTRIB4DARBPROC sf_glad_glVertexAttrib4dARB;
+#define glVertexAttrib4dARB sf_glad_glVertexAttrib4dARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DNVPROC sf_glad_glVertexAttrib4dNV;
+#define glVertexAttrib4dNV sf_glad_glVertexAttrib4dNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVPROC sf_glad_glVertexAttrib4dv;
+#define glVertexAttrib4dv sf_glad_glVertexAttrib4dv
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVARBPROC sf_glad_glVertexAttrib4dvARB;
+#define glVertexAttrib4dvARB sf_glad_glVertexAttrib4dvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4DVNVPROC sf_glad_glVertexAttrib4dvNV;
+#define glVertexAttrib4dvNV sf_glad_glVertexAttrib4dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC sf_glad_glVertexAttrib4f;
+#define glVertexAttrib4f sf_glad_glVertexAttrib4f
+GLAD_API_CALL PFNGLVERTEXATTRIB4FARBPROC sf_glad_glVertexAttrib4fARB;
+#define glVertexAttrib4fARB sf_glad_glVertexAttrib4fARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4FNVPROC sf_glad_glVertexAttrib4fNV;
+#define glVertexAttrib4fNV sf_glad_glVertexAttrib4fNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC sf_glad_glVertexAttrib4fv;
+#define glVertexAttrib4fv sf_glad_glVertexAttrib4fv
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVARBPROC sf_glad_glVertexAttrib4fvARB;
+#define glVertexAttrib4fvARB sf_glad_glVertexAttrib4fvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4FVNVPROC sf_glad_glVertexAttrib4fvNV;
+#define glVertexAttrib4fvNV sf_glad_glVertexAttrib4fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4IVPROC sf_glad_glVertexAttrib4iv;
+#define glVertexAttrib4iv sf_glad_glVertexAttrib4iv
+GLAD_API_CALL PFNGLVERTEXATTRIB4IVARBPROC sf_glad_glVertexAttrib4ivARB;
+#define glVertexAttrib4ivARB sf_glad_glVertexAttrib4ivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SPROC sf_glad_glVertexAttrib4s;
+#define glVertexAttrib4s sf_glad_glVertexAttrib4s
+GLAD_API_CALL PFNGLVERTEXATTRIB4SARBPROC sf_glad_glVertexAttrib4sARB;
+#define glVertexAttrib4sARB sf_glad_glVertexAttrib4sARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SNVPROC sf_glad_glVertexAttrib4sNV;
+#define glVertexAttrib4sNV sf_glad_glVertexAttrib4sNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVPROC sf_glad_glVertexAttrib4sv;
+#define glVertexAttrib4sv sf_glad_glVertexAttrib4sv
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVARBPROC sf_glad_glVertexAttrib4svARB;
+#define glVertexAttrib4svARB sf_glad_glVertexAttrib4svARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4SVNVPROC sf_glad_glVertexAttrib4svNV;
+#define glVertexAttrib4svNV sf_glad_glVertexAttrib4svNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBNVPROC sf_glad_glVertexAttrib4ubNV;
+#define glVertexAttrib4ubNV sf_glad_glVertexAttrib4ubNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVPROC sf_glad_glVertexAttrib4ubv;
+#define glVertexAttrib4ubv sf_glad_glVertexAttrib4ubv
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVARBPROC sf_glad_glVertexAttrib4ubvARB;
+#define glVertexAttrib4ubvARB sf_glad_glVertexAttrib4ubvARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4UBVNVPROC sf_glad_glVertexAttrib4ubvNV;
+#define glVertexAttrib4ubvNV sf_glad_glVertexAttrib4ubvNV
+GLAD_API_CALL PFNGLVERTEXATTRIB4UIVPROC sf_glad_glVertexAttrib4uiv;
+#define glVertexAttrib4uiv sf_glad_glVertexAttrib4uiv
+GLAD_API_CALL PFNGLVERTEXATTRIB4UIVARBPROC sf_glad_glVertexAttrib4uivARB;
+#define glVertexAttrib4uivARB sf_glad_glVertexAttrib4uivARB
+GLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC sf_glad_glVertexAttrib4usv;
+#define glVertexAttrib4usv sf_glad_glVertexAttrib4usv
+GLAD_API_CALL PFNGLVERTEXATTRIB4USVARBPROC sf_glad_glVertexAttrib4usvARB;
+#define glVertexAttrib4usvARB sf_glad_glVertexAttrib4usvARB
+GLAD_API_CALL PFNGLVERTEXATTRIBBINDINGPROC sf_glad_glVertexAttribBinding;
+#define glVertexAttribBinding sf_glad_glVertexAttribBinding
+GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORPROC sf_glad_glVertexAttribDivisor;
+#define glVertexAttribDivisor sf_glad_glVertexAttribDivisor
+GLAD_API_CALL PFNGLVERTEXATTRIBFORMATPROC sf_glad_glVertexAttribFormat;
+#define glVertexAttribFormat sf_glad_glVertexAttribFormat
+GLAD_API_CALL PFNGLVERTEXATTRIBI1IPROC sf_glad_glVertexAttribI1i;
+#define glVertexAttribI1i sf_glad_glVertexAttribI1i
+GLAD_API_CALL PFNGLVERTEXATTRIBI1IVPROC sf_glad_glVertexAttribI1iv;
+#define glVertexAttribI1iv sf_glad_glVertexAttribI1iv
+GLAD_API_CALL PFNGLVERTEXATTRIBI1UIPROC sf_glad_glVertexAttribI1ui;
+#define glVertexAttribI1ui sf_glad_glVertexAttribI1ui
+GLAD_API_CALL PFNGLVERTEXATTRIBI1UIVPROC sf_glad_glVertexAttribI1uiv;
+#define glVertexAttribI1uiv sf_glad_glVertexAttribI1uiv
+GLAD_API_CALL PFNGLVERTEXATTRIBI2IPROC sf_glad_glVertexAttribI2i;
+#define glVertexAttribI2i sf_glad_glVertexAttribI2i
+GLAD_API_CALL PFNGLVERTEXATTRIBI2IVPROC sf_glad_glVertexAttribI2iv;
+#define glVertexAttribI2iv sf_glad_glVertexAttribI2iv
+GLAD_API_CALL PFNGLVERTEXATTRIBI2UIPROC sf_glad_glVertexAttribI2ui;
+#define glVertexAttribI2ui sf_glad_glVertexAttribI2ui
+GLAD_API_CALL PFNGLVERTEXATTRIBI2UIVPROC sf_glad_glVertexAttribI2uiv;
+#define glVertexAttribI2uiv sf_glad_glVertexAttribI2uiv
+GLAD_API_CALL PFNGLVERTEXATTRIBI3IPROC sf_glad_glVertexAttribI3i;
+#define glVertexAttribI3i sf_glad_glVertexAttribI3i
+GLAD_API_CALL PFNGLVERTEXATTRIBI3IVPROC sf_glad_glVertexAttribI3iv;
+#define glVertexAttribI3iv sf_glad_glVertexAttribI3iv
+GLAD_API_CALL PFNGLVERTEXATTRIBI3UIPROC sf_glad_glVertexAttribI3ui;
+#define glVertexAttribI3ui sf_glad_glVertexAttribI3ui
+GLAD_API_CALL PFNGLVERTEXATTRIBI3UIVPROC sf_glad_glVertexAttribI3uiv;
+#define glVertexAttribI3uiv sf_glad_glVertexAttribI3uiv
+GLAD_API_CALL PFNGLVERTEXATTRIBI4BVPROC sf_glad_glVertexAttribI4bv;
+#define glVertexAttribI4bv sf_glad_glVertexAttribI4bv
+GLAD_API_CALL PFNGLVERTEXATTRIBI4IPROC sf_glad_glVertexAttribI4i;
+#define glVertexAttribI4i sf_glad_glVertexAttribI4i
+GLAD_API_CALL PFNGLVERTEXATTRIBI4IVPROC sf_glad_glVertexAttribI4iv;
+#define glVertexAttribI4iv sf_glad_glVertexAttribI4iv
+GLAD_API_CALL PFNGLVERTEXATTRIBI4SVPROC sf_glad_glVertexAttribI4sv;
+#define glVertexAttribI4sv sf_glad_glVertexAttribI4sv
+GLAD_API_CALL PFNGLVERTEXATTRIBI4UBVPROC sf_glad_glVertexAttribI4ubv;
+#define glVertexAttribI4ubv sf_glad_glVertexAttribI4ubv
+GLAD_API_CALL PFNGLVERTEXATTRIBI4UIPROC sf_glad_glVertexAttribI4ui;
+#define glVertexAttribI4ui sf_glad_glVertexAttribI4ui
+GLAD_API_CALL PFNGLVERTEXATTRIBI4UIVPROC sf_glad_glVertexAttribI4uiv;
+#define glVertexAttribI4uiv sf_glad_glVertexAttribI4uiv
+GLAD_API_CALL PFNGLVERTEXATTRIBI4USVPROC sf_glad_glVertexAttribI4usv;
+#define glVertexAttribI4usv sf_glad_glVertexAttribI4usv
+GLAD_API_CALL PFNGLVERTEXATTRIBIFORMATPROC sf_glad_glVertexAttribIFormat;
+#define glVertexAttribIFormat sf_glad_glVertexAttribIFormat
+GLAD_API_CALL PFNGLVERTEXATTRIBIPOINTERPROC sf_glad_glVertexAttribIPointer;
+#define glVertexAttribIPointer sf_glad_glVertexAttribIPointer
+GLAD_API_CALL PFNGLVERTEXATTRIBL1DPROC sf_glad_glVertexAttribL1d;
+#define glVertexAttribL1d sf_glad_glVertexAttribL1d
+GLAD_API_CALL PFNGLVERTEXATTRIBL1DVPROC sf_glad_glVertexAttribL1dv;
+#define glVertexAttribL1dv sf_glad_glVertexAttribL1dv
+GLAD_API_CALL PFNGLVERTEXATTRIBL2DPROC sf_glad_glVertexAttribL2d;
+#define glVertexAttribL2d sf_glad_glVertexAttribL2d
+GLAD_API_CALL PFNGLVERTEXATTRIBL2DVPROC sf_glad_glVertexAttribL2dv;
+#define glVertexAttribL2dv sf_glad_glVertexAttribL2dv
+GLAD_API_CALL PFNGLVERTEXATTRIBL3DPROC sf_glad_glVertexAttribL3d;
+#define glVertexAttribL3d sf_glad_glVertexAttribL3d
+GLAD_API_CALL PFNGLVERTEXATTRIBL3DVPROC sf_glad_glVertexAttribL3dv;
+#define glVertexAttribL3dv sf_glad_glVertexAttribL3dv
+GLAD_API_CALL PFNGLVERTEXATTRIBL4DPROC sf_glad_glVertexAttribL4d;
+#define glVertexAttribL4d sf_glad_glVertexAttribL4d
+GLAD_API_CALL PFNGLVERTEXATTRIBL4DVPROC sf_glad_glVertexAttribL4dv;
+#define glVertexAttribL4dv sf_glad_glVertexAttribL4dv
+GLAD_API_CALL PFNGLVERTEXATTRIBLFORMATPROC sf_glad_glVertexAttribLFormat;
+#define glVertexAttribLFormat sf_glad_glVertexAttribLFormat
+GLAD_API_CALL PFNGLVERTEXATTRIBLPOINTERPROC sf_glad_glVertexAttribLPointer;
+#define glVertexAttribLPointer sf_glad_glVertexAttribLPointer
+GLAD_API_CALL PFNGLVERTEXATTRIBP1UIPROC sf_glad_glVertexAttribP1ui;
+#define glVertexAttribP1ui sf_glad_glVertexAttribP1ui
+GLAD_API_CALL PFNGLVERTEXATTRIBP1UIVPROC sf_glad_glVertexAttribP1uiv;
+#define glVertexAttribP1uiv sf_glad_glVertexAttribP1uiv
+GLAD_API_CALL PFNGLVERTEXATTRIBP2UIPROC sf_glad_glVertexAttribP2ui;
+#define glVertexAttribP2ui sf_glad_glVertexAttribP2ui
+GLAD_API_CALL PFNGLVERTEXATTRIBP2UIVPROC sf_glad_glVertexAttribP2uiv;
+#define glVertexAttribP2uiv sf_glad_glVertexAttribP2uiv
+GLAD_API_CALL PFNGLVERTEXATTRIBP3UIPROC sf_glad_glVertexAttribP3ui;
+#define glVertexAttribP3ui sf_glad_glVertexAttribP3ui
+GLAD_API_CALL PFNGLVERTEXATTRIBP3UIVPROC sf_glad_glVertexAttribP3uiv;
+#define glVertexAttribP3uiv sf_glad_glVertexAttribP3uiv
+GLAD_API_CALL PFNGLVERTEXATTRIBP4UIPROC sf_glad_glVertexAttribP4ui;
+#define glVertexAttribP4ui sf_glad_glVertexAttribP4ui
+GLAD_API_CALL PFNGLVERTEXATTRIBP4UIVPROC sf_glad_glVertexAttribP4uiv;
+#define glVertexAttribP4uiv sf_glad_glVertexAttribP4uiv
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC sf_glad_glVertexAttribPointer;
+#define glVertexAttribPointer sf_glad_glVertexAttribPointer
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERARBPROC sf_glad_glVertexAttribPointerARB;
+#define glVertexAttribPointerARB sf_glad_glVertexAttribPointerARB
+GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERNVPROC sf_glad_glVertexAttribPointerNV;
+#define glVertexAttribPointerNV sf_glad_glVertexAttribPointerNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1DVNVPROC sf_glad_glVertexAttribs1dvNV;
+#define glVertexAttribs1dvNV sf_glad_glVertexAttribs1dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1FVNVPROC sf_glad_glVertexAttribs1fvNV;
+#define glVertexAttribs1fvNV sf_glad_glVertexAttribs1fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS1SVNVPROC sf_glad_glVertexAttribs1svNV;
+#define glVertexAttribs1svNV sf_glad_glVertexAttribs1svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2DVNVPROC sf_glad_glVertexAttribs2dvNV;
+#define glVertexAttribs2dvNV sf_glad_glVertexAttribs2dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2FVNVPROC sf_glad_glVertexAttribs2fvNV;
+#define glVertexAttribs2fvNV sf_glad_glVertexAttribs2fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS2SVNVPROC sf_glad_glVertexAttribs2svNV;
+#define glVertexAttribs2svNV sf_glad_glVertexAttribs2svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3DVNVPROC sf_glad_glVertexAttribs3dvNV;
+#define glVertexAttribs3dvNV sf_glad_glVertexAttribs3dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3FVNVPROC sf_glad_glVertexAttribs3fvNV;
+#define glVertexAttribs3fvNV sf_glad_glVertexAttribs3fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS3SVNVPROC sf_glad_glVertexAttribs3svNV;
+#define glVertexAttribs3svNV sf_glad_glVertexAttribs3svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4DVNVPROC sf_glad_glVertexAttribs4dvNV;
+#define glVertexAttribs4dvNV sf_glad_glVertexAttribs4dvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4FVNVPROC sf_glad_glVertexAttribs4fvNV;
+#define glVertexAttribs4fvNV sf_glad_glVertexAttribs4fvNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4SVNVPROC sf_glad_glVertexAttribs4svNV;
+#define glVertexAttribs4svNV sf_glad_glVertexAttribs4svNV
+GLAD_API_CALL PFNGLVERTEXATTRIBS4UBVNVPROC sf_glad_glVertexAttribs4ubvNV;
+#define glVertexAttribs4ubvNV sf_glad_glVertexAttribs4ubvNV
+GLAD_API_CALL PFNGLVERTEXBINDINGDIVISORPROC sf_glad_glVertexBindingDivisor;
+#define glVertexBindingDivisor sf_glad_glVertexBindingDivisor
+GLAD_API_CALL PFNGLVERTEXP2UIPROC sf_glad_glVertexP2ui;
+#define glVertexP2ui sf_glad_glVertexP2ui
+GLAD_API_CALL PFNGLVERTEXP2UIVPROC sf_glad_glVertexP2uiv;
+#define glVertexP2uiv sf_glad_glVertexP2uiv
+GLAD_API_CALL PFNGLVERTEXP3UIPROC sf_glad_glVertexP3ui;
+#define glVertexP3ui sf_glad_glVertexP3ui
+GLAD_API_CALL PFNGLVERTEXP3UIVPROC sf_glad_glVertexP3uiv;
+#define glVertexP3uiv sf_glad_glVertexP3uiv
+GLAD_API_CALL PFNGLVERTEXP4UIPROC sf_glad_glVertexP4ui;
+#define glVertexP4ui sf_glad_glVertexP4ui
+GLAD_API_CALL PFNGLVERTEXP4UIVPROC sf_glad_glVertexP4uiv;
+#define glVertexP4uiv sf_glad_glVertexP4uiv
+GLAD_API_CALL PFNGLVERTEXPOINTERPROC sf_glad_glVertexPointer;
+#define glVertexPointer sf_glad_glVertexPointer
+GLAD_API_CALL PFNGLVERTEXPOINTEREXTPROC sf_glad_glVertexPointerEXT;
+#define glVertexPointerEXT sf_glad_glVertexPointerEXT
+GLAD_API_CALL PFNGLVIEWPORTPROC sf_glad_glViewport;
+#define glViewport sf_glad_glViewport
+GLAD_API_CALL PFNGLVIEWPORTARRAYVPROC sf_glad_glViewportArrayv;
+#define glViewportArrayv sf_glad_glViewportArrayv
+GLAD_API_CALL PFNGLVIEWPORTINDEXEDFPROC sf_glad_glViewportIndexedf;
+#define glViewportIndexedf sf_glad_glViewportIndexedf
+GLAD_API_CALL PFNGLVIEWPORTINDEXEDFVPROC sf_glad_glViewportIndexedfv;
+#define glViewportIndexedfv sf_glad_glViewportIndexedfv
+GLAD_API_CALL PFNGLWAITSYNCPROC sf_glad_glWaitSync;
+#define glWaitSync sf_glad_glWaitSync
+GLAD_API_CALL PFNGLWINDOWPOS2DPROC sf_glad_glWindowPos2d;
+#define glWindowPos2d sf_glad_glWindowPos2d
+GLAD_API_CALL PFNGLWINDOWPOS2DVPROC sf_glad_glWindowPos2dv;
+#define glWindowPos2dv sf_glad_glWindowPos2dv
+GLAD_API_CALL PFNGLWINDOWPOS2FPROC sf_glad_glWindowPos2f;
+#define glWindowPos2f sf_glad_glWindowPos2f
+GLAD_API_CALL PFNGLWINDOWPOS2FVPROC sf_glad_glWindowPos2fv;
+#define glWindowPos2fv sf_glad_glWindowPos2fv
+GLAD_API_CALL PFNGLWINDOWPOS2IPROC sf_glad_glWindowPos2i;
+#define glWindowPos2i sf_glad_glWindowPos2i
+GLAD_API_CALL PFNGLWINDOWPOS2IVPROC sf_glad_glWindowPos2iv;
+#define glWindowPos2iv sf_glad_glWindowPos2iv
+GLAD_API_CALL PFNGLWINDOWPOS2SPROC sf_glad_glWindowPos2s;
+#define glWindowPos2s sf_glad_glWindowPos2s
+GLAD_API_CALL PFNGLWINDOWPOS2SVPROC sf_glad_glWindowPos2sv;
+#define glWindowPos2sv sf_glad_glWindowPos2sv
+GLAD_API_CALL PFNGLWINDOWPOS3DPROC sf_glad_glWindowPos3d;
+#define glWindowPos3d sf_glad_glWindowPos3d
+GLAD_API_CALL PFNGLWINDOWPOS3DVPROC sf_glad_glWindowPos3dv;
+#define glWindowPos3dv sf_glad_glWindowPos3dv
+GLAD_API_CALL PFNGLWINDOWPOS3FPROC sf_glad_glWindowPos3f;
+#define glWindowPos3f sf_glad_glWindowPos3f
+GLAD_API_CALL PFNGLWINDOWPOS3FVPROC sf_glad_glWindowPos3fv;
+#define glWindowPos3fv sf_glad_glWindowPos3fv
+GLAD_API_CALL PFNGLWINDOWPOS3IPROC sf_glad_glWindowPos3i;
+#define glWindowPos3i sf_glad_glWindowPos3i
+GLAD_API_CALL PFNGLWINDOWPOS3IVPROC sf_glad_glWindowPos3iv;
+#define glWindowPos3iv sf_glad_glWindowPos3iv
+GLAD_API_CALL PFNGLWINDOWPOS3SPROC sf_glad_glWindowPos3s;
+#define glWindowPos3s sf_glad_glWindowPos3s
+GLAD_API_CALL PFNGLWINDOWPOS3SVPROC sf_glad_glWindowPos3sv;
+#define glWindowPos3sv sf_glad_glWindowPos3sv
+GLAD_API_CALL PFNGLALPHAFUNCXPROC sf_glad_glAlphaFuncx;
+#define glAlphaFuncx sf_glad_glAlphaFuncx
+GLAD_API_CALL PFNGLBINDFRAMEBUFFEROESPROC sf_glad_glBindFramebufferOES;
+#define glBindFramebufferOES sf_glad_glBindFramebufferOES
+GLAD_API_CALL PFNGLBINDRENDERBUFFEROESPROC sf_glad_glBindRenderbufferOES;
+#define glBindRenderbufferOES sf_glad_glBindRenderbufferOES
+GLAD_API_CALL PFNGLBLENDEQUATIONOESPROC sf_glad_glBlendEquationOES;
+#define glBlendEquationOES sf_glad_glBlendEquationOES
+GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEOESPROC sf_glad_glBlendEquationSeparateOES;
+#define glBlendEquationSeparateOES sf_glad_glBlendEquationSeparateOES
+GLAD_API_CALL PFNGLBLENDFUNCSEPARATEOESPROC sf_glad_glBlendFuncSeparateOES;
+#define glBlendFuncSeparateOES sf_glad_glBlendFuncSeparateOES
+GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSOESPROC sf_glad_glCheckFramebufferStatusOES;
+#define glCheckFramebufferStatusOES sf_glad_glCheckFramebufferStatusOES
+GLAD_API_CALL PFNGLCLEARCOLORXPROC sf_glad_glClearColorx;
+#define glClearColorx sf_glad_glClearColorx
+GLAD_API_CALL PFNGLCLEARDEPTHXPROC sf_glad_glClearDepthx;
+#define glClearDepthx sf_glad_glClearDepthx
+GLAD_API_CALL PFNGLCLIPPLANEFPROC sf_glad_glClipPlanef;
+#define glClipPlanef sf_glad_glClipPlanef
+GLAD_API_CALL PFNGLCLIPPLANEXPROC sf_glad_glClipPlanex;
+#define glClipPlanex sf_glad_glClipPlanex
+GLAD_API_CALL PFNGLCOLOR4XPROC sf_glad_glColor4x;
+#define glColor4x sf_glad_glColor4x
+GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSOESPROC sf_glad_glDeleteFramebuffersOES;
+#define glDeleteFramebuffersOES sf_glad_glDeleteFramebuffersOES
+GLAD_API_CALL PFNGLDELETERENDERBUFFERSOESPROC sf_glad_glDeleteRenderbuffersOES;
+#define glDeleteRenderbuffersOES sf_glad_glDeleteRenderbuffersOES
+GLAD_API_CALL PFNGLDEPTHRANGEXPROC sf_glad_glDepthRangex;
+#define glDepthRangex sf_glad_glDepthRangex
+GLAD_API_CALL PFNGLFOGXPROC sf_glad_glFogx;
+#define glFogx sf_glad_glFogx
+GLAD_API_CALL PFNGLFOGXVPROC sf_glad_glFogxv;
+#define glFogxv sf_glad_glFogxv
+GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFEROESPROC sf_glad_glFramebufferRenderbufferOES;
+#define glFramebufferRenderbufferOES sf_glad_glFramebufferRenderbufferOES
+GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DOESPROC sf_glad_glFramebufferTexture2DOES;
+#define glFramebufferTexture2DOES sf_glad_glFramebufferTexture2DOES
+GLAD_API_CALL PFNGLFRUSTUMFPROC sf_glad_glFrustumf;
+#define glFrustumf sf_glad_glFrustumf
+GLAD_API_CALL PFNGLFRUSTUMXPROC sf_glad_glFrustumx;
+#define glFrustumx sf_glad_glFrustumx
+GLAD_API_CALL PFNGLGENFRAMEBUFFERSOESPROC sf_glad_glGenFramebuffersOES;
+#define glGenFramebuffersOES sf_glad_glGenFramebuffersOES
+GLAD_API_CALL PFNGLGENRENDERBUFFERSOESPROC sf_glad_glGenRenderbuffersOES;
+#define glGenRenderbuffersOES sf_glad_glGenRenderbuffersOES
+GLAD_API_CALL PFNGLGENERATEMIPMAPOESPROC sf_glad_glGenerateMipmapOES;
+#define glGenerateMipmapOES sf_glad_glGenerateMipmapOES
+GLAD_API_CALL PFNGLGETCLIPPLANEFPROC sf_glad_glGetClipPlanef;
+#define glGetClipPlanef sf_glad_glGetClipPlanef
+GLAD_API_CALL PFNGLGETCLIPPLANEXPROC sf_glad_glGetClipPlanex;
+#define glGetClipPlanex sf_glad_glGetClipPlanex
+GLAD_API_CALL PFNGLGETFIXEDVPROC sf_glad_glGetFixedv;
+#define glGetFixedv sf_glad_glGetFixedv
+GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC sf_glad_glGetFramebufferAttachmentParameterivOES;
+#define glGetFramebufferAttachmentParameterivOES sf_glad_glGetFramebufferAttachmentParameterivOES
+GLAD_API_CALL PFNGLGETLIGHTXVPROC sf_glad_glGetLightxv;
+#define glGetLightxv sf_glad_glGetLightxv
+GLAD_API_CALL PFNGLGETMATERIALXVPROC sf_glad_glGetMaterialxv;
+#define glGetMaterialxv sf_glad_glGetMaterialxv
+GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVOESPROC sf_glad_glGetRenderbufferParameterivOES;
+#define glGetRenderbufferParameterivOES sf_glad_glGetRenderbufferParameterivOES
+GLAD_API_CALL PFNGLGETTEXENVXVPROC sf_glad_glGetTexEnvxv;
+#define glGetTexEnvxv sf_glad_glGetTexEnvxv
+GLAD_API_CALL PFNGLGETTEXPARAMETERXVPROC sf_glad_glGetTexParameterxv;
+#define glGetTexParameterxv sf_glad_glGetTexParameterxv
+GLAD_API_CALL PFNGLISFRAMEBUFFEROESPROC sf_glad_glIsFramebufferOES;
+#define glIsFramebufferOES sf_glad_glIsFramebufferOES
+GLAD_API_CALL PFNGLISRENDERBUFFEROESPROC sf_glad_glIsRenderbufferOES;
+#define glIsRenderbufferOES sf_glad_glIsRenderbufferOES
+GLAD_API_CALL PFNGLLIGHTMODELXPROC sf_glad_glLightModelx;
+#define glLightModelx sf_glad_glLightModelx
+GLAD_API_CALL PFNGLLIGHTMODELXVPROC sf_glad_glLightModelxv;
+#define glLightModelxv sf_glad_glLightModelxv
+GLAD_API_CALL PFNGLLIGHTXPROC sf_glad_glLightx;
+#define glLightx sf_glad_glLightx
+GLAD_API_CALL PFNGLLIGHTXVPROC sf_glad_glLightxv;
+#define glLightxv sf_glad_glLightxv
+GLAD_API_CALL PFNGLLINEWIDTHXPROC sf_glad_glLineWidthx;
+#define glLineWidthx sf_glad_glLineWidthx
+GLAD_API_CALL PFNGLLOADMATRIXXPROC sf_glad_glLoadMatrixx;
+#define glLoadMatrixx sf_glad_glLoadMatrixx
+GLAD_API_CALL PFNGLMATERIALXPROC sf_glad_glMaterialx;
+#define glMaterialx sf_glad_glMaterialx
+GLAD_API_CALL PFNGLMATERIALXVPROC sf_glad_glMaterialxv;
+#define glMaterialxv sf_glad_glMaterialxv
+GLAD_API_CALL PFNGLMULTMATRIXXPROC sf_glad_glMultMatrixx;
+#define glMultMatrixx sf_glad_glMultMatrixx
+GLAD_API_CALL PFNGLMULTITEXCOORD4XPROC sf_glad_glMultiTexCoord4x;
+#define glMultiTexCoord4x sf_glad_glMultiTexCoord4x
+GLAD_API_CALL PFNGLNORMAL3XPROC sf_glad_glNormal3x;
+#define glNormal3x sf_glad_glNormal3x
+GLAD_API_CALL PFNGLORTHOFPROC sf_glad_glOrthof;
+#define glOrthof sf_glad_glOrthof
+GLAD_API_CALL PFNGLORTHOXPROC sf_glad_glOrthox;
+#define glOrthox sf_glad_glOrthox
+GLAD_API_CALL PFNGLPOINTPARAMETERXPROC sf_glad_glPointParameterx;
+#define glPointParameterx sf_glad_glPointParameterx
+GLAD_API_CALL PFNGLPOINTPARAMETERXVPROC sf_glad_glPointParameterxv;
+#define glPointParameterxv sf_glad_glPointParameterxv
+GLAD_API_CALL PFNGLPOINTSIZEXPROC sf_glad_glPointSizex;
+#define glPointSizex sf_glad_glPointSizex
+GLAD_API_CALL PFNGLPOLYGONOFFSETXPROC sf_glad_glPolygonOffsetx;
+#define glPolygonOffsetx sf_glad_glPolygonOffsetx
+GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEOESPROC sf_glad_glRenderbufferStorageOES;
+#define glRenderbufferStorageOES sf_glad_glRenderbufferStorageOES
+GLAD_API_CALL PFNGLROTATEXPROC sf_glad_glRotatex;
+#define glRotatex sf_glad_glRotatex
+GLAD_API_CALL PFNGLSAMPLECOVERAGEXPROC sf_glad_glSampleCoveragex;
+#define glSampleCoveragex sf_glad_glSampleCoveragex
+GLAD_API_CALL PFNGLSCALEXPROC sf_glad_glScalex;
+#define glScalex sf_glad_glScalex
+GLAD_API_CALL PFNGLTEXENVXPROC sf_glad_glTexEnvx;
+#define glTexEnvx sf_glad_glTexEnvx
+GLAD_API_CALL PFNGLTEXENVXVPROC sf_glad_glTexEnvxv;
+#define glTexEnvxv sf_glad_glTexEnvxv
+GLAD_API_CALL PFNGLTEXPARAMETERXPROC sf_glad_glTexParameterx;
+#define glTexParameterx sf_glad_glTexParameterx
+GLAD_API_CALL PFNGLTEXPARAMETERXVPROC sf_glad_glTexParameterxv;
+#define glTexParameterxv sf_glad_glTexParameterxv
+GLAD_API_CALL PFNGLTRANSLATEXPROC sf_glad_glTranslatex;
+#define glTranslatex sf_glad_glTranslatex
+
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Source */
+#ifdef SF_GLAD_GL_IMPLEMENTATION
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef GLAD_IMPL_UTIL_C_
+#define GLAD_IMPL_UTIL_C_
+
+#ifdef _MSC_VER
+#define GLAD_IMPL_UTIL_SSCANF sscanf_s
+#else
+#define GLAD_IMPL_UTIL_SSCANF sscanf
+#endif
+
+#endif /* GLAD_IMPL_UTIL_C_ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+int SF_GLAD_GL_VERSION_1_0 = 0;
+int SF_GLAD_GL_VERSION_1_1 = 0;
+int SF_GLAD_GL_VERSION_1_2 = 0;
+int SF_GLAD_GL_VERSION_1_3 = 0;
+int SF_GLAD_GL_VERSION_1_4 = 0;
+int SF_GLAD_GL_VERSION_1_5 = 0;
+int SF_GLAD_GL_VERSION_2_0 = 0;
+int SF_GLAD_GL_VERSION_2_1 = 0;
+int SF_GLAD_GL_VERSION_3_0 = 0;
+int SF_GLAD_GL_VERSION_3_1 = 0;
+int SF_GLAD_GL_VERSION_3_2 = 0;
+int SF_GLAD_GL_VERSION_3_3 = 0;
+int SF_GLAD_GL_VERSION_4_0 = 0;
+int SF_GLAD_GL_VERSION_4_1 = 0;
+int SF_GLAD_GL_VERSION_4_2 = 0;
+int SF_GLAD_GL_VERSION_4_3 = 0;
+int SF_GLAD_GL_VERSION_4_4 = 0;
+int SF_GLAD_GL_VERSION_4_5 = 0;
+int SF_GLAD_GL_VERSION_4_6 = 0;
+int SF_GLAD_GL_VERSION_ES_CM_1_0 = 0;
+int SF_GLAD_GL_ARB_ES2_compatibility = 0;
+int SF_GLAD_GL_ARB_ES3_1_compatibility = 0;
+int SF_GLAD_GL_ARB_base_instance = 0;
+int SF_GLAD_GL_ARB_blend_func_extended = 0;
+int SF_GLAD_GL_ARB_buffer_storage = 0;
+int SF_GLAD_GL_ARB_clear_buffer_object = 0;
+int SF_GLAD_GL_ARB_clear_texture = 0;
+int SF_GLAD_GL_ARB_clip_control = 0;
+int SF_GLAD_GL_ARB_compute_shader = 0;
+int SF_GLAD_GL_ARB_copy_buffer = 0;
+int SF_GLAD_GL_ARB_copy_image = 0;
+int SF_GLAD_GL_ARB_direct_state_access = 0;
+int SF_GLAD_GL_ARB_draw_elements_base_vertex = 0;
+int SF_GLAD_GL_ARB_draw_indirect = 0;
+int SF_GLAD_GL_ARB_fragment_program = 0;
+int SF_GLAD_GL_ARB_fragment_shader = 0;
+int SF_GLAD_GL_ARB_framebuffer_no_attachments = 0;
+int SF_GLAD_GL_ARB_framebuffer_object = 0;
+int SF_GLAD_GL_ARB_geometry_shader4 = 0;
+int SF_GLAD_GL_ARB_get_program_binary = 0;
+int SF_GLAD_GL_ARB_get_texture_sub_image = 0;
+int SF_GLAD_GL_ARB_gpu_shader_fp64 = 0;
+int SF_GLAD_GL_ARB_imaging = 0;
+int SF_GLAD_GL_ARB_internalformat_query = 0;
+int SF_GLAD_GL_ARB_internalformat_query2 = 0;
+int SF_GLAD_GL_ARB_invalidate_subdata = 0;
+int SF_GLAD_GL_ARB_map_buffer_range = 0;
+int SF_GLAD_GL_ARB_multi_bind = 0;
+int SF_GLAD_GL_ARB_multi_draw_indirect = 0;
+int SF_GLAD_GL_ARB_multitexture = 0;
+int SF_GLAD_GL_ARB_polygon_offset_clamp = 0;
+int SF_GLAD_GL_ARB_program_interface_query = 0;
+int SF_GLAD_GL_ARB_provoking_vertex = 0;
+int SF_GLAD_GL_ARB_sampler_objects = 0;
+int SF_GLAD_GL_ARB_separate_shader_objects = 0;
+int SF_GLAD_GL_ARB_shader_atomic_counters = 0;
+int SF_GLAD_GL_ARB_shader_image_load_store = 0;
+int SF_GLAD_GL_ARB_shader_objects = 0;
+int SF_GLAD_GL_ARB_shader_storage_buffer_object = 0;
+int SF_GLAD_GL_ARB_shader_subroutine = 0;
+int SF_GLAD_GL_ARB_shading_language_100 = 0;
+int SF_GLAD_GL_ARB_sync = 0;
+int SF_GLAD_GL_ARB_tessellation_shader = 0;
+int SF_GLAD_GL_ARB_texture_barrier = 0;
+int SF_GLAD_GL_ARB_texture_buffer_range = 0;
+int SF_GLAD_GL_ARB_texture_multisample = 0;
+int SF_GLAD_GL_ARB_texture_non_power_of_two = 0;
+int SF_GLAD_GL_ARB_texture_storage = 0;
+int SF_GLAD_GL_ARB_texture_storage_multisample = 0;
+int SF_GLAD_GL_ARB_texture_view = 0;
+int SF_GLAD_GL_ARB_timer_query = 0;
+int SF_GLAD_GL_ARB_transform_feedback2 = 0;
+int SF_GLAD_GL_ARB_transform_feedback3 = 0;
+int SF_GLAD_GL_ARB_transform_feedback_instanced = 0;
+int SF_GLAD_GL_ARB_uniform_buffer_object = 0;
+int SF_GLAD_GL_ARB_vertex_array_object = 0;
+int SF_GLAD_GL_ARB_vertex_attrib_64bit = 0;
+int SF_GLAD_GL_ARB_vertex_attrib_binding = 0;
+int SF_GLAD_GL_ARB_vertex_buffer_object = 0;
+int SF_GLAD_GL_ARB_vertex_program = 0;
+int SF_GLAD_GL_ARB_vertex_shader = 0;
+int SF_GLAD_GL_ARB_vertex_type_2_10_10_10_rev = 0;
+int SF_GLAD_GL_ARB_viewport_array = 0;
+int SF_GLAD_GL_EXT_blend_equation_separate = 0;
+int SF_GLAD_GL_EXT_blend_func_separate = 0;
+int SF_GLAD_GL_EXT_blend_minmax = 0;
+int SF_GLAD_GL_EXT_blend_subtract = 0;
+int SF_GLAD_GL_EXT_copy_texture = 0;
+int SF_GLAD_GL_EXT_framebuffer_blit = 0;
+int SF_GLAD_GL_EXT_framebuffer_multisample = 0;
+int SF_GLAD_GL_EXT_framebuffer_object = 0;
+int SF_GLAD_GL_EXT_geometry_shader4 = 0;
+int SF_GLAD_GL_EXT_packed_depth_stencil = 0;
+int SF_GLAD_GL_EXT_subtexture = 0;
+int SF_GLAD_GL_EXT_texture_array = 0;
+int SF_GLAD_GL_EXT_texture_object = 0;
+int SF_GLAD_GL_EXT_texture_sRGB = 0;
+int SF_GLAD_GL_EXT_vertex_array = 0;
+int SF_GLAD_GL_INGR_blend_func_separate = 0;
+int SF_GLAD_GL_KHR_debug = 0;
+int SF_GLAD_GL_KHR_robustness = 0;
+int SF_GLAD_GL_NV_geometry_program4 = 0;
+int SF_GLAD_GL_NV_vertex_program = 0;
+int SF_GLAD_GL_OES_single_precision = 0;
+int SF_GLAD_GL_SGIS_texture_edge_clamp = 0;
+int SF_GLAD_GL_EXT_sRGB = 0;
+int SF_GLAD_GL_OES_blend_equation_separate = 0;
+int SF_GLAD_GL_OES_blend_func_separate = 0;
+int SF_GLAD_GL_OES_blend_subtract = 0;
+int SF_GLAD_GL_OES_depth24 = 0;
+int SF_GLAD_GL_OES_depth32 = 0;
+int SF_GLAD_GL_OES_framebuffer_object = 0;
+int SF_GLAD_GL_OES_packed_depth_stencil = 0;
+int SF_GLAD_GL_OES_texture_npot = 0;
+
+
+
+PFNGLACCUMPROC sf_glad_glAccum = NULL;
+PFNGLACTIVESHADERPROGRAMPROC sf_glad_glActiveShaderProgram = NULL;
+PFNGLACTIVETEXTUREPROC sf_glad_glActiveTexture = NULL;
+PFNGLACTIVETEXTUREARBPROC sf_glad_glActiveTextureARB = NULL;
+PFNGLALPHAFUNCPROC sf_glad_glAlphaFunc = NULL;
+PFNGLAREPROGRAMSRESIDENTNVPROC sf_glad_glAreProgramsResidentNV = NULL;
+PFNGLARETEXTURESRESIDENTPROC sf_glad_glAreTexturesResident = NULL;
+PFNGLARETEXTURESRESIDENTEXTPROC sf_glad_glAreTexturesResidentEXT = NULL;
+PFNGLARRAYELEMENTPROC sf_glad_glArrayElement = NULL;
+PFNGLARRAYELEMENTEXTPROC sf_glad_glArrayElementEXT = NULL;
+PFNGLATTACHOBJECTARBPROC sf_glad_glAttachObjectARB = NULL;
+PFNGLATTACHSHADERPROC sf_glad_glAttachShader = NULL;
+PFNGLBEGINPROC sf_glad_glBegin = NULL;
+PFNGLBEGINCONDITIONALRENDERPROC sf_glad_glBeginConditionalRender = NULL;
+PFNGLBEGINQUERYPROC sf_glad_glBeginQuery = NULL;
+PFNGLBEGINQUERYINDEXEDPROC sf_glad_glBeginQueryIndexed = NULL;
+PFNGLBEGINTRANSFORMFEEDBACKPROC sf_glad_glBeginTransformFeedback = NULL;
+PFNGLBINDATTRIBLOCATIONPROC sf_glad_glBindAttribLocation = NULL;
+PFNGLBINDATTRIBLOCATIONARBPROC sf_glad_glBindAttribLocationARB = NULL;
+PFNGLBINDBUFFERPROC sf_glad_glBindBuffer = NULL;
+PFNGLBINDBUFFERARBPROC sf_glad_glBindBufferARB = NULL;
+PFNGLBINDBUFFERBASEPROC sf_glad_glBindBufferBase = NULL;
+PFNGLBINDBUFFERRANGEPROC sf_glad_glBindBufferRange = NULL;
+PFNGLBINDBUFFERSBASEPROC sf_glad_glBindBuffersBase = NULL;
+PFNGLBINDBUFFERSRANGEPROC sf_glad_glBindBuffersRange = NULL;
+PFNGLBINDFRAGDATALOCATIONPROC sf_glad_glBindFragDataLocation = NULL;
+PFNGLBINDFRAGDATALOCATIONINDEXEDPROC sf_glad_glBindFragDataLocationIndexed = NULL;
+PFNGLBINDFRAMEBUFFERPROC sf_glad_glBindFramebuffer = NULL;
+PFNGLBINDFRAMEBUFFEREXTPROC sf_glad_glBindFramebufferEXT = NULL;
+PFNGLBINDIMAGETEXTUREPROC sf_glad_glBindImageTexture = NULL;
+PFNGLBINDIMAGETEXTURESPROC sf_glad_glBindImageTextures = NULL;
+PFNGLBINDPROGRAMARBPROC sf_glad_glBindProgramARB = NULL;
+PFNGLBINDPROGRAMNVPROC sf_glad_glBindProgramNV = NULL;
+PFNGLBINDPROGRAMPIPELINEPROC sf_glad_glBindProgramPipeline = NULL;
+PFNGLBINDRENDERBUFFERPROC sf_glad_glBindRenderbuffer = NULL;
+PFNGLBINDRENDERBUFFEREXTPROC sf_glad_glBindRenderbufferEXT = NULL;
+PFNGLBINDSAMPLERPROC sf_glad_glBindSampler = NULL;
+PFNGLBINDSAMPLERSPROC sf_glad_glBindSamplers = NULL;
+PFNGLBINDTEXTUREPROC sf_glad_glBindTexture = NULL;
+PFNGLBINDTEXTUREEXTPROC sf_glad_glBindTextureEXT = NULL;
+PFNGLBINDTEXTUREUNITPROC sf_glad_glBindTextureUnit = NULL;
+PFNGLBINDTEXTURESPROC sf_glad_glBindTextures = NULL;
+PFNGLBINDTRANSFORMFEEDBACKPROC sf_glad_glBindTransformFeedback = NULL;
+PFNGLBINDVERTEXARRAYPROC sf_glad_glBindVertexArray = NULL;
+PFNGLBINDVERTEXBUFFERPROC sf_glad_glBindVertexBuffer = NULL;
+PFNGLBINDVERTEXBUFFERSPROC sf_glad_glBindVertexBuffers = NULL;
+PFNGLBITMAPPROC sf_glad_glBitmap = NULL;
+PFNGLBLENDCOLORPROC sf_glad_glBlendColor = NULL;
+PFNGLBLENDEQUATIONPROC sf_glad_glBlendEquation = NULL;
+PFNGLBLENDEQUATIONEXTPROC sf_glad_glBlendEquationEXT = NULL;
+PFNGLBLENDEQUATIONSEPARATEPROC sf_glad_glBlendEquationSeparate = NULL;
+PFNGLBLENDEQUATIONSEPARATEEXTPROC sf_glad_glBlendEquationSeparateEXT = NULL;
+PFNGLBLENDEQUATIONSEPARATEIPROC sf_glad_glBlendEquationSeparatei = NULL;
+PFNGLBLENDEQUATIONIPROC sf_glad_glBlendEquationi = NULL;
+PFNGLBLENDFUNCPROC sf_glad_glBlendFunc = NULL;
+PFNGLBLENDFUNCSEPARATEPROC sf_glad_glBlendFuncSeparate = NULL;
+PFNGLBLENDFUNCSEPARATEEXTPROC sf_glad_glBlendFuncSeparateEXT = NULL;
+PFNGLBLENDFUNCSEPARATEINGRPROC sf_glad_glBlendFuncSeparateINGR = NULL;
+PFNGLBLENDFUNCSEPARATEIPROC sf_glad_glBlendFuncSeparatei = NULL;
+PFNGLBLENDFUNCIPROC sf_glad_glBlendFunci = NULL;
+PFNGLBLITFRAMEBUFFERPROC sf_glad_glBlitFramebuffer = NULL;
+PFNGLBLITFRAMEBUFFEREXTPROC sf_glad_glBlitFramebufferEXT = NULL;
+PFNGLBLITNAMEDFRAMEBUFFERPROC sf_glad_glBlitNamedFramebuffer = NULL;
+PFNGLBUFFERDATAPROC sf_glad_glBufferData = NULL;
+PFNGLBUFFERDATAARBPROC sf_glad_glBufferDataARB = NULL;
+PFNGLBUFFERSTORAGEPROC sf_glad_glBufferStorage = NULL;
+PFNGLBUFFERSUBDATAPROC sf_glad_glBufferSubData = NULL;
+PFNGLBUFFERSUBDATAARBPROC sf_glad_glBufferSubDataARB = NULL;
+PFNGLCALLLISTPROC sf_glad_glCallList = NULL;
+PFNGLCALLLISTSPROC sf_glad_glCallLists = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSPROC sf_glad_glCheckFramebufferStatus = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC sf_glad_glCheckFramebufferStatusEXT = NULL;
+PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC sf_glad_glCheckNamedFramebufferStatus = NULL;
+PFNGLCLAMPCOLORPROC sf_glad_glClampColor = NULL;
+PFNGLCLEARPROC sf_glad_glClear = NULL;
+PFNGLCLEARACCUMPROC sf_glad_glClearAccum = NULL;
+PFNGLCLEARBUFFERDATAPROC sf_glad_glClearBufferData = NULL;
+PFNGLCLEARBUFFERSUBDATAPROC sf_glad_glClearBufferSubData = NULL;
+PFNGLCLEARBUFFERFIPROC sf_glad_glClearBufferfi = NULL;
+PFNGLCLEARBUFFERFVPROC sf_glad_glClearBufferfv = NULL;
+PFNGLCLEARBUFFERIVPROC sf_glad_glClearBufferiv = NULL;
+PFNGLCLEARBUFFERUIVPROC sf_glad_glClearBufferuiv = NULL;
+PFNGLCLEARCOLORPROC sf_glad_glClearColor = NULL;
+PFNGLCLEARDEPTHPROC sf_glad_glClearDepth = NULL;
+PFNGLCLEARDEPTHFPROC sf_glad_glClearDepthf = NULL;
+PFNGLCLEARDEPTHFOESPROC sf_glad_glClearDepthfOES = NULL;
+PFNGLCLEARINDEXPROC sf_glad_glClearIndex = NULL;
+PFNGLCLEARNAMEDBUFFERDATAPROC sf_glad_glClearNamedBufferData = NULL;
+PFNGLCLEARNAMEDBUFFERSUBDATAPROC sf_glad_glClearNamedBufferSubData = NULL;
+PFNGLCLEARNAMEDFRAMEBUFFERFIPROC sf_glad_glClearNamedFramebufferfi = NULL;
+PFNGLCLEARNAMEDFRAMEBUFFERFVPROC sf_glad_glClearNamedFramebufferfv = NULL;
+PFNGLCLEARNAMEDFRAMEBUFFERIVPROC sf_glad_glClearNamedFramebufferiv = NULL;
+PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC sf_glad_glClearNamedFramebufferuiv = NULL;
+PFNGLCLEARSTENCILPROC sf_glad_glClearStencil = NULL;
+PFNGLCLEARTEXIMAGEPROC sf_glad_glClearTexImage = NULL;
+PFNGLCLEARTEXSUBIMAGEPROC sf_glad_glClearTexSubImage = NULL;
+PFNGLCLIENTACTIVETEXTUREPROC sf_glad_glClientActiveTexture = NULL;
+PFNGLCLIENTACTIVETEXTUREARBPROC sf_glad_glClientActiveTextureARB = NULL;
+PFNGLCLIENTWAITSYNCPROC sf_glad_glClientWaitSync = NULL;
+PFNGLCLIPCONTROLPROC sf_glad_glClipControl = NULL;
+PFNGLCLIPPLANEPROC sf_glad_glClipPlane = NULL;
+PFNGLCLIPPLANEFOESPROC sf_glad_glClipPlanefOES = NULL;
+PFNGLCOLOR3BPROC sf_glad_glColor3b = NULL;
+PFNGLCOLOR3BVPROC sf_glad_glColor3bv = NULL;
+PFNGLCOLOR3DPROC sf_glad_glColor3d = NULL;
+PFNGLCOLOR3DVPROC sf_glad_glColor3dv = NULL;
+PFNGLCOLOR3FPROC sf_glad_glColor3f = NULL;
+PFNGLCOLOR3FVPROC sf_glad_glColor3fv = NULL;
+PFNGLCOLOR3IPROC sf_glad_glColor3i = NULL;
+PFNGLCOLOR3IVPROC sf_glad_glColor3iv = NULL;
+PFNGLCOLOR3SPROC sf_glad_glColor3s = NULL;
+PFNGLCOLOR3SVPROC sf_glad_glColor3sv = NULL;
+PFNGLCOLOR3UBPROC sf_glad_glColor3ub = NULL;
+PFNGLCOLOR3UBVPROC sf_glad_glColor3ubv = NULL;
+PFNGLCOLOR3UIPROC sf_glad_glColor3ui = NULL;
+PFNGLCOLOR3UIVPROC sf_glad_glColor3uiv = NULL;
+PFNGLCOLOR3USPROC sf_glad_glColor3us = NULL;
+PFNGLCOLOR3USVPROC sf_glad_glColor3usv = NULL;
+PFNGLCOLOR4BPROC sf_glad_glColor4b = NULL;
+PFNGLCOLOR4BVPROC sf_glad_glColor4bv = NULL;
+PFNGLCOLOR4DPROC sf_glad_glColor4d = NULL;
+PFNGLCOLOR4DVPROC sf_glad_glColor4dv = NULL;
+PFNGLCOLOR4FPROC sf_glad_glColor4f = NULL;
+PFNGLCOLOR4FVPROC sf_glad_glColor4fv = NULL;
+PFNGLCOLOR4IPROC sf_glad_glColor4i = NULL;
+PFNGLCOLOR4IVPROC sf_glad_glColor4iv = NULL;
+PFNGLCOLOR4SPROC sf_glad_glColor4s = NULL;
+PFNGLCOLOR4SVPROC sf_glad_glColor4sv = NULL;
+PFNGLCOLOR4UBPROC sf_glad_glColor4ub = NULL;
+PFNGLCOLOR4UBVPROC sf_glad_glColor4ubv = NULL;
+PFNGLCOLOR4UIPROC sf_glad_glColor4ui = NULL;
+PFNGLCOLOR4UIVPROC sf_glad_glColor4uiv = NULL;
+PFNGLCOLOR4USPROC sf_glad_glColor4us = NULL;
+PFNGLCOLOR4USVPROC sf_glad_glColor4usv = NULL;
+PFNGLCOLORMASKPROC sf_glad_glColorMask = NULL;
+PFNGLCOLORMASKIPROC sf_glad_glColorMaski = NULL;
+PFNGLCOLORMATERIALPROC sf_glad_glColorMaterial = NULL;
+PFNGLCOLORP3UIPROC sf_glad_glColorP3ui = NULL;
+PFNGLCOLORP3UIVPROC sf_glad_glColorP3uiv = NULL;
+PFNGLCOLORP4UIPROC sf_glad_glColorP4ui = NULL;
+PFNGLCOLORP4UIVPROC sf_glad_glColorP4uiv = NULL;
+PFNGLCOLORPOINTERPROC sf_glad_glColorPointer = NULL;
+PFNGLCOLORPOINTEREXTPROC sf_glad_glColorPointerEXT = NULL;
+PFNGLCOLORSUBTABLEPROC sf_glad_glColorSubTable = NULL;
+PFNGLCOLORTABLEPROC sf_glad_glColorTable = NULL;
+PFNGLCOLORTABLEPARAMETERFVPROC sf_glad_glColorTableParameterfv = NULL;
+PFNGLCOLORTABLEPARAMETERIVPROC sf_glad_glColorTableParameteriv = NULL;
+PFNGLCOMPILESHADERPROC sf_glad_glCompileShader = NULL;
+PFNGLCOMPILESHADERARBPROC sf_glad_glCompileShaderARB = NULL;
+PFNGLCOMPRESSEDTEXIMAGE1DPROC sf_glad_glCompressedTexImage1D = NULL;
+PFNGLCOMPRESSEDTEXIMAGE2DPROC sf_glad_glCompressedTexImage2D = NULL;
+PFNGLCOMPRESSEDTEXIMAGE3DPROC sf_glad_glCompressedTexImage3D = NULL;
+PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC sf_glad_glCompressedTexSubImage1D = NULL;
+PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC sf_glad_glCompressedTexSubImage2D = NULL;
+PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC sf_glad_glCompressedTexSubImage3D = NULL;
+PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC sf_glad_glCompressedTextureSubImage1D = NULL;
+PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC sf_glad_glCompressedTextureSubImage2D = NULL;
+PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC sf_glad_glCompressedTextureSubImage3D = NULL;
+PFNGLCONVOLUTIONFILTER1DPROC sf_glad_glConvolutionFilter1D = NULL;
+PFNGLCONVOLUTIONFILTER2DPROC sf_glad_glConvolutionFilter2D = NULL;
+PFNGLCONVOLUTIONPARAMETERFPROC sf_glad_glConvolutionParameterf = NULL;
+PFNGLCONVOLUTIONPARAMETERFVPROC sf_glad_glConvolutionParameterfv = NULL;
+PFNGLCONVOLUTIONPARAMETERIPROC sf_glad_glConvolutionParameteri = NULL;
+PFNGLCONVOLUTIONPARAMETERIVPROC sf_glad_glConvolutionParameteriv = NULL;
+PFNGLCOPYBUFFERSUBDATAPROC sf_glad_glCopyBufferSubData = NULL;
+PFNGLCOPYCOLORSUBTABLEPROC sf_glad_glCopyColorSubTable = NULL;
+PFNGLCOPYCOLORTABLEPROC sf_glad_glCopyColorTable = NULL;
+PFNGLCOPYCONVOLUTIONFILTER1DPROC sf_glad_glCopyConvolutionFilter1D = NULL;
+PFNGLCOPYCONVOLUTIONFILTER2DPROC sf_glad_glCopyConvolutionFilter2D = NULL;
+PFNGLCOPYIMAGESUBDATAPROC sf_glad_glCopyImageSubData = NULL;
+PFNGLCOPYNAMEDBUFFERSUBDATAPROC sf_glad_glCopyNamedBufferSubData = NULL;
+PFNGLCOPYPIXELSPROC sf_glad_glCopyPixels = NULL;
+PFNGLCOPYTEXIMAGE1DPROC sf_glad_glCopyTexImage1D = NULL;
+PFNGLCOPYTEXIMAGE1DEXTPROC sf_glad_glCopyTexImage1DEXT = NULL;
+PFNGLCOPYTEXIMAGE2DPROC sf_glad_glCopyTexImage2D = NULL;
+PFNGLCOPYTEXIMAGE2DEXTPROC sf_glad_glCopyTexImage2DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE1DPROC sf_glad_glCopyTexSubImage1D = NULL;
+PFNGLCOPYTEXSUBIMAGE1DEXTPROC sf_glad_glCopyTexSubImage1DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE2DPROC sf_glad_glCopyTexSubImage2D = NULL;
+PFNGLCOPYTEXSUBIMAGE2DEXTPROC sf_glad_glCopyTexSubImage2DEXT = NULL;
+PFNGLCOPYTEXSUBIMAGE3DPROC sf_glad_glCopyTexSubImage3D = NULL;
+PFNGLCOPYTEXSUBIMAGE3DEXTPROC sf_glad_glCopyTexSubImage3DEXT = NULL;
+PFNGLCOPYTEXTURESUBIMAGE1DPROC sf_glad_glCopyTextureSubImage1D = NULL;
+PFNGLCOPYTEXTURESUBIMAGE2DPROC sf_glad_glCopyTextureSubImage2D = NULL;
+PFNGLCOPYTEXTURESUBIMAGE3DPROC sf_glad_glCopyTextureSubImage3D = NULL;
+PFNGLCREATEBUFFERSPROC sf_glad_glCreateBuffers = NULL;
+PFNGLCREATEFRAMEBUFFERSPROC sf_glad_glCreateFramebuffers = NULL;
+PFNGLCREATEPROGRAMPROC sf_glad_glCreateProgram = NULL;
+PFNGLCREATEPROGRAMOBJECTARBPROC sf_glad_glCreateProgramObjectARB = NULL;
+PFNGLCREATEPROGRAMPIPELINESPROC sf_glad_glCreateProgramPipelines = NULL;
+PFNGLCREATEQUERIESPROC sf_glad_glCreateQueries = NULL;
+PFNGLCREATERENDERBUFFERSPROC sf_glad_glCreateRenderbuffers = NULL;
+PFNGLCREATESAMPLERSPROC sf_glad_glCreateSamplers = NULL;
+PFNGLCREATESHADERPROC sf_glad_glCreateShader = NULL;
+PFNGLCREATESHADEROBJECTARBPROC sf_glad_glCreateShaderObjectARB = NULL;
+PFNGLCREATESHADERPROGRAMVPROC sf_glad_glCreateShaderProgramv = NULL;
+PFNGLCREATETEXTURESPROC sf_glad_glCreateTextures = NULL;
+PFNGLCREATETRANSFORMFEEDBACKSPROC sf_glad_glCreateTransformFeedbacks = NULL;
+PFNGLCREATEVERTEXARRAYSPROC sf_glad_glCreateVertexArrays = NULL;
+PFNGLCULLFACEPROC sf_glad_glCullFace = NULL;
+PFNGLDEBUGMESSAGECALLBACKPROC sf_glad_glDebugMessageCallback = NULL;
+PFNGLDEBUGMESSAGECONTROLPROC sf_glad_glDebugMessageControl = NULL;
+PFNGLDEBUGMESSAGEINSERTPROC sf_glad_glDebugMessageInsert = NULL;
+PFNGLDELETEBUFFERSPROC sf_glad_glDeleteBuffers = NULL;
+PFNGLDELETEBUFFERSARBPROC sf_glad_glDeleteBuffersARB = NULL;
+PFNGLDELETEFRAMEBUFFERSPROC sf_glad_glDeleteFramebuffers = NULL;
+PFNGLDELETEFRAMEBUFFERSEXTPROC sf_glad_glDeleteFramebuffersEXT = NULL;
+PFNGLDELETELISTSPROC sf_glad_glDeleteLists = NULL;
+PFNGLDELETEOBJECTARBPROC sf_glad_glDeleteObjectARB = NULL;
+PFNGLDELETEPROGRAMPROC sf_glad_glDeleteProgram = NULL;
+PFNGLDELETEPROGRAMPIPELINESPROC sf_glad_glDeleteProgramPipelines = NULL;
+PFNGLDELETEPROGRAMSARBPROC sf_glad_glDeleteProgramsARB = NULL;
+PFNGLDELETEPROGRAMSNVPROC sf_glad_glDeleteProgramsNV = NULL;
+PFNGLDELETEQUERIESPROC sf_glad_glDeleteQueries = NULL;
+PFNGLDELETERENDERBUFFERSPROC sf_glad_glDeleteRenderbuffers = NULL;
+PFNGLDELETERENDERBUFFERSEXTPROC sf_glad_glDeleteRenderbuffersEXT = NULL;
+PFNGLDELETESAMPLERSPROC sf_glad_glDeleteSamplers = NULL;
+PFNGLDELETESHADERPROC sf_glad_glDeleteShader = NULL;
+PFNGLDELETESYNCPROC sf_glad_glDeleteSync = NULL;
+PFNGLDELETETEXTURESPROC sf_glad_glDeleteTextures = NULL;
+PFNGLDELETETEXTURESEXTPROC sf_glad_glDeleteTexturesEXT = NULL;
+PFNGLDELETETRANSFORMFEEDBACKSPROC sf_glad_glDeleteTransformFeedbacks = NULL;
+PFNGLDELETEVERTEXARRAYSPROC sf_glad_glDeleteVertexArrays = NULL;
+PFNGLDEPTHFUNCPROC sf_glad_glDepthFunc = NULL;
+PFNGLDEPTHMASKPROC sf_glad_glDepthMask = NULL;
+PFNGLDEPTHRANGEPROC sf_glad_glDepthRange = NULL;
+PFNGLDEPTHRANGEARRAYDVNVPROC sf_glad_glDepthRangeArraydvNV = NULL;
+PFNGLDEPTHRANGEARRAYVPROC sf_glad_glDepthRangeArrayv = NULL;
+PFNGLDEPTHRANGEINDEXEDPROC sf_glad_glDepthRangeIndexed = NULL;
+PFNGLDEPTHRANGEINDEXEDDNVPROC sf_glad_glDepthRangeIndexeddNV = NULL;
+PFNGLDEPTHRANGEFPROC sf_glad_glDepthRangef = NULL;
+PFNGLDEPTHRANGEFOESPROC sf_glad_glDepthRangefOES = NULL;
+PFNGLDETACHOBJECTARBPROC sf_glad_glDetachObjectARB = NULL;
+PFNGLDETACHSHADERPROC sf_glad_glDetachShader = NULL;
+PFNGLDISABLEPROC sf_glad_glDisable = NULL;
+PFNGLDISABLECLIENTSTATEPROC sf_glad_glDisableClientState = NULL;
+PFNGLDISABLEVERTEXARRAYATTRIBPROC sf_glad_glDisableVertexArrayAttrib = NULL;
+PFNGLDISABLEVERTEXATTRIBARRAYPROC sf_glad_glDisableVertexAttribArray = NULL;
+PFNGLDISABLEVERTEXATTRIBARRAYARBPROC sf_glad_glDisableVertexAttribArrayARB = NULL;
+PFNGLDISABLEIPROC sf_glad_glDisablei = NULL;
+PFNGLDISPATCHCOMPUTEPROC sf_glad_glDispatchCompute = NULL;
+PFNGLDISPATCHCOMPUTEINDIRECTPROC sf_glad_glDispatchComputeIndirect = NULL;
+PFNGLDRAWARRAYSPROC sf_glad_glDrawArrays = NULL;
+PFNGLDRAWARRAYSEXTPROC sf_glad_glDrawArraysEXT = NULL;
+PFNGLDRAWARRAYSINDIRECTPROC sf_glad_glDrawArraysIndirect = NULL;
+PFNGLDRAWARRAYSINSTANCEDPROC sf_glad_glDrawArraysInstanced = NULL;
+PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC sf_glad_glDrawArraysInstancedBaseInstance = NULL;
+PFNGLDRAWBUFFERPROC sf_glad_glDrawBuffer = NULL;
+PFNGLDRAWBUFFERSPROC sf_glad_glDrawBuffers = NULL;
+PFNGLDRAWELEMENTSPROC sf_glad_glDrawElements = NULL;
+PFNGLDRAWELEMENTSBASEVERTEXPROC sf_glad_glDrawElementsBaseVertex = NULL;
+PFNGLDRAWELEMENTSINDIRECTPROC sf_glad_glDrawElementsIndirect = NULL;
+PFNGLDRAWELEMENTSINSTANCEDPROC sf_glad_glDrawElementsInstanced = NULL;
+PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC sf_glad_glDrawElementsInstancedBaseInstance = NULL;
+PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC sf_glad_glDrawElementsInstancedBaseVertex = NULL;
+PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC sf_glad_glDrawElementsInstancedBaseVertexBaseInstance = NULL;
+PFNGLDRAWPIXELSPROC sf_glad_glDrawPixels = NULL;
+PFNGLDRAWRANGEELEMENTSPROC sf_glad_glDrawRangeElements = NULL;
+PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC sf_glad_glDrawRangeElementsBaseVertex = NULL;
+PFNGLDRAWTRANSFORMFEEDBACKPROC sf_glad_glDrawTransformFeedback = NULL;
+PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC sf_glad_glDrawTransformFeedbackInstanced = NULL;
+PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC sf_glad_glDrawTransformFeedbackStream = NULL;
+PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC sf_glad_glDrawTransformFeedbackStreamInstanced = NULL;
+PFNGLEDGEFLAGPROC sf_glad_glEdgeFlag = NULL;
+PFNGLEDGEFLAGPOINTERPROC sf_glad_glEdgeFlagPointer = NULL;
+PFNGLEDGEFLAGPOINTEREXTPROC sf_glad_glEdgeFlagPointerEXT = NULL;
+PFNGLEDGEFLAGVPROC sf_glad_glEdgeFlagv = NULL;
+PFNGLENABLEPROC sf_glad_glEnable = NULL;
+PFNGLENABLECLIENTSTATEPROC sf_glad_glEnableClientState = NULL;
+PFNGLENABLEVERTEXARRAYATTRIBPROC sf_glad_glEnableVertexArrayAttrib = NULL;
+PFNGLENABLEVERTEXATTRIBARRAYPROC sf_glad_glEnableVertexAttribArray = NULL;
+PFNGLENABLEVERTEXATTRIBARRAYARBPROC sf_glad_glEnableVertexAttribArrayARB = NULL;
+PFNGLENABLEIPROC sf_glad_glEnablei = NULL;
+PFNGLENDPROC sf_glad_glEnd = NULL;
+PFNGLENDCONDITIONALRENDERPROC sf_glad_glEndConditionalRender = NULL;
+PFNGLENDLISTPROC sf_glad_glEndList = NULL;
+PFNGLENDQUERYPROC sf_glad_glEndQuery = NULL;
+PFNGLENDQUERYINDEXEDPROC sf_glad_glEndQueryIndexed = NULL;
+PFNGLENDTRANSFORMFEEDBACKPROC sf_glad_glEndTransformFeedback = NULL;
+PFNGLEVALCOORD1DPROC sf_glad_glEvalCoord1d = NULL;
+PFNGLEVALCOORD1DVPROC sf_glad_glEvalCoord1dv = NULL;
+PFNGLEVALCOORD1FPROC sf_glad_glEvalCoord1f = NULL;
+PFNGLEVALCOORD1FVPROC sf_glad_glEvalCoord1fv = NULL;
+PFNGLEVALCOORD2DPROC sf_glad_glEvalCoord2d = NULL;
+PFNGLEVALCOORD2DVPROC sf_glad_glEvalCoord2dv = NULL;
+PFNGLEVALCOORD2FPROC sf_glad_glEvalCoord2f = NULL;
+PFNGLEVALCOORD2FVPROC sf_glad_glEvalCoord2fv = NULL;
+PFNGLEVALMESH1PROC sf_glad_glEvalMesh1 = NULL;
+PFNGLEVALMESH2PROC sf_glad_glEvalMesh2 = NULL;
+PFNGLEVALPOINT1PROC sf_glad_glEvalPoint1 = NULL;
+PFNGLEVALPOINT2PROC sf_glad_glEvalPoint2 = NULL;
+PFNGLEXECUTEPROGRAMNVPROC sf_glad_glExecuteProgramNV = NULL;
+PFNGLFEEDBACKBUFFERPROC sf_glad_glFeedbackBuffer = NULL;
+PFNGLFENCESYNCPROC sf_glad_glFenceSync = NULL;
+PFNGLFINISHPROC sf_glad_glFinish = NULL;
+PFNGLFLUSHPROC sf_glad_glFlush = NULL;
+PFNGLFLUSHMAPPEDBUFFERRANGEPROC sf_glad_glFlushMappedBufferRange = NULL;
+PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC sf_glad_glFlushMappedNamedBufferRange = NULL;
+PFNGLFOGCOORDPOINTERPROC sf_glad_glFogCoordPointer = NULL;
+PFNGLFOGCOORDDPROC sf_glad_glFogCoordd = NULL;
+PFNGLFOGCOORDDVPROC sf_glad_glFogCoorddv = NULL;
+PFNGLFOGCOORDFPROC sf_glad_glFogCoordf = NULL;
+PFNGLFOGCOORDFVPROC sf_glad_glFogCoordfv = NULL;
+PFNGLFOGFPROC sf_glad_glFogf = NULL;
+PFNGLFOGFVPROC sf_glad_glFogfv = NULL;
+PFNGLFOGIPROC sf_glad_glFogi = NULL;
+PFNGLFOGIVPROC sf_glad_glFogiv = NULL;
+PFNGLFRAMEBUFFERPARAMETERIPROC sf_glad_glFramebufferParameteri = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFERPROC sf_glad_glFramebufferRenderbuffer = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC sf_glad_glFramebufferRenderbufferEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREPROC sf_glad_glFramebufferTexture = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DPROC sf_glad_glFramebufferTexture1D = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DEXTPROC sf_glad_glFramebufferTexture1DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DPROC sf_glad_glFramebufferTexture2D = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DEXTPROC sf_glad_glFramebufferTexture2DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DPROC sf_glad_glFramebufferTexture3D = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DEXTPROC sf_glad_glFramebufferTexture3DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREARBPROC sf_glad_glFramebufferTextureARB = NULL;
+PFNGLFRAMEBUFFERTEXTUREEXTPROC sf_glad_glFramebufferTextureEXT = NULL;
+PFNGLFRAMEBUFFERTEXTUREFACEARBPROC sf_glad_glFramebufferTextureFaceARB = NULL;
+PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC sf_glad_glFramebufferTextureFaceEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERPROC sf_glad_glFramebufferTextureLayer = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERARBPROC sf_glad_glFramebufferTextureLayerARB = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC sf_glad_glFramebufferTextureLayerEXT = NULL;
+PFNGLFRONTFACEPROC sf_glad_glFrontFace = NULL;
+PFNGLFRUSTUMPROC sf_glad_glFrustum = NULL;
+PFNGLFRUSTUMFOESPROC sf_glad_glFrustumfOES = NULL;
+PFNGLGENBUFFERSPROC sf_glad_glGenBuffers = NULL;
+PFNGLGENBUFFERSARBPROC sf_glad_glGenBuffersARB = NULL;
+PFNGLGENFRAMEBUFFERSPROC sf_glad_glGenFramebuffers = NULL;
+PFNGLGENFRAMEBUFFERSEXTPROC sf_glad_glGenFramebuffersEXT = NULL;
+PFNGLGENLISTSPROC sf_glad_glGenLists = NULL;
+PFNGLGENPROGRAMPIPELINESPROC sf_glad_glGenProgramPipelines = NULL;
+PFNGLGENPROGRAMSARBPROC sf_glad_glGenProgramsARB = NULL;
+PFNGLGENPROGRAMSNVPROC sf_glad_glGenProgramsNV = NULL;
+PFNGLGENQUERIESPROC sf_glad_glGenQueries = NULL;
+PFNGLGENRENDERBUFFERSPROC sf_glad_glGenRenderbuffers = NULL;
+PFNGLGENRENDERBUFFERSEXTPROC sf_glad_glGenRenderbuffersEXT = NULL;
+PFNGLGENSAMPLERSPROC sf_glad_glGenSamplers = NULL;
+PFNGLGENTEXTURESPROC sf_glad_glGenTextures = NULL;
+PFNGLGENTEXTURESEXTPROC sf_glad_glGenTexturesEXT = NULL;
+PFNGLGENTRANSFORMFEEDBACKSPROC sf_glad_glGenTransformFeedbacks = NULL;
+PFNGLGENVERTEXARRAYSPROC sf_glad_glGenVertexArrays = NULL;
+PFNGLGENERATEMIPMAPPROC sf_glad_glGenerateMipmap = NULL;
+PFNGLGENERATEMIPMAPEXTPROC sf_glad_glGenerateMipmapEXT = NULL;
+PFNGLGENERATETEXTUREMIPMAPPROC sf_glad_glGenerateTextureMipmap = NULL;
+PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC sf_glad_glGetActiveAtomicCounterBufferiv = NULL;
+PFNGLGETACTIVEATTRIBPROC sf_glad_glGetActiveAttrib = NULL;
+PFNGLGETACTIVEATTRIBARBPROC sf_glad_glGetActiveAttribARB = NULL;
+PFNGLGETACTIVESUBROUTINENAMEPROC sf_glad_glGetActiveSubroutineName = NULL;
+PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC sf_glad_glGetActiveSubroutineUniformName = NULL;
+PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC sf_glad_glGetActiveSubroutineUniformiv = NULL;
+PFNGLGETACTIVEUNIFORMPROC sf_glad_glGetActiveUniform = NULL;
+PFNGLGETACTIVEUNIFORMARBPROC sf_glad_glGetActiveUniformARB = NULL;
+PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC sf_glad_glGetActiveUniformBlockName = NULL;
+PFNGLGETACTIVEUNIFORMBLOCKIVPROC sf_glad_glGetActiveUniformBlockiv = NULL;
+PFNGLGETACTIVEUNIFORMNAMEPROC sf_glad_glGetActiveUniformName = NULL;
+PFNGLGETACTIVEUNIFORMSIVPROC sf_glad_glGetActiveUniformsiv = NULL;
+PFNGLGETATTACHEDOBJECTSARBPROC sf_glad_glGetAttachedObjectsARB = NULL;
+PFNGLGETATTACHEDSHADERSPROC sf_glad_glGetAttachedShaders = NULL;
+PFNGLGETATTRIBLOCATIONPROC sf_glad_glGetAttribLocation = NULL;
+PFNGLGETATTRIBLOCATIONARBPROC sf_glad_glGetAttribLocationARB = NULL;
+PFNGLGETBOOLEANI_VPROC sf_glad_glGetBooleani_v = NULL;
+PFNGLGETBOOLEANVPROC sf_glad_glGetBooleanv = NULL;
+PFNGLGETBUFFERPARAMETERI64VPROC sf_glad_glGetBufferParameteri64v = NULL;
+PFNGLGETBUFFERPARAMETERIVPROC sf_glad_glGetBufferParameteriv = NULL;
+PFNGLGETBUFFERPARAMETERIVARBPROC sf_glad_glGetBufferParameterivARB = NULL;
+PFNGLGETBUFFERPOINTERVPROC sf_glad_glGetBufferPointerv = NULL;
+PFNGLGETBUFFERPOINTERVARBPROC sf_glad_glGetBufferPointervARB = NULL;
+PFNGLGETBUFFERSUBDATAPROC sf_glad_glGetBufferSubData = NULL;
+PFNGLGETBUFFERSUBDATAARBPROC sf_glad_glGetBufferSubDataARB = NULL;
+PFNGLGETCLIPPLANEPROC sf_glad_glGetClipPlane = NULL;
+PFNGLGETCLIPPLANEFOESPROC sf_glad_glGetClipPlanefOES = NULL;
+PFNGLGETCOLORTABLEPROC sf_glad_glGetColorTable = NULL;
+PFNGLGETCOLORTABLEPARAMETERFVPROC sf_glad_glGetColorTableParameterfv = NULL;
+PFNGLGETCOLORTABLEPARAMETERIVPROC sf_glad_glGetColorTableParameteriv = NULL;
+PFNGLGETCOMPRESSEDTEXIMAGEPROC sf_glad_glGetCompressedTexImage = NULL;
+PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC sf_glad_glGetCompressedTextureImage = NULL;
+PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC sf_glad_glGetCompressedTextureSubImage = NULL;
+PFNGLGETCONVOLUTIONFILTERPROC sf_glad_glGetConvolutionFilter = NULL;
+PFNGLGETCONVOLUTIONPARAMETERFVPROC sf_glad_glGetConvolutionParameterfv = NULL;
+PFNGLGETCONVOLUTIONPARAMETERIVPROC sf_glad_glGetConvolutionParameteriv = NULL;
+PFNGLGETDEBUGMESSAGELOGPROC sf_glad_glGetDebugMessageLog = NULL;
+PFNGLGETDOUBLEI_VPROC sf_glad_glGetDoublei_v = NULL;
+PFNGLGETDOUBLEVPROC sf_glad_glGetDoublev = NULL;
+PFNGLGETERRORPROC sf_glad_glGetError = NULL;
+PFNGLGETFLOATI_VPROC sf_glad_glGetFloati_v = NULL;
+PFNGLGETFLOATVPROC sf_glad_glGetFloatv = NULL;
+PFNGLGETFRAGDATAINDEXPROC sf_glad_glGetFragDataIndex = NULL;
+PFNGLGETFRAGDATALOCATIONPROC sf_glad_glGetFragDataLocation = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC sf_glad_glGetFramebufferAttachmentParameteriv = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC sf_glad_glGetFramebufferAttachmentParameterivEXT = NULL;
+PFNGLGETFRAMEBUFFERPARAMETERIVPROC sf_glad_glGetFramebufferParameteriv = NULL;
+PFNGLGETGRAPHICSRESETSTATUSPROC sf_glad_glGetGraphicsResetStatus = NULL;
+PFNGLGETHANDLEARBPROC sf_glad_glGetHandleARB = NULL;
+PFNGLGETHISTOGRAMPROC sf_glad_glGetHistogram = NULL;
+PFNGLGETHISTOGRAMPARAMETERFVPROC sf_glad_glGetHistogramParameterfv = NULL;
+PFNGLGETHISTOGRAMPARAMETERIVPROC sf_glad_glGetHistogramParameteriv = NULL;
+PFNGLGETINFOLOGARBPROC sf_glad_glGetInfoLogARB = NULL;
+PFNGLGETINTEGER64I_VPROC sf_glad_glGetInteger64i_v = NULL;
+PFNGLGETINTEGER64VPROC sf_glad_glGetInteger64v = NULL;
+PFNGLGETINTEGERI_VPROC sf_glad_glGetIntegeri_v = NULL;
+PFNGLGETINTEGERVPROC sf_glad_glGetIntegerv = NULL;
+PFNGLGETINTERNALFORMATI64VPROC sf_glad_glGetInternalformati64v = NULL;
+PFNGLGETINTERNALFORMATIVPROC sf_glad_glGetInternalformativ = NULL;
+PFNGLGETLIGHTFVPROC sf_glad_glGetLightfv = NULL;
+PFNGLGETLIGHTIVPROC sf_glad_glGetLightiv = NULL;
+PFNGLGETMAPDVPROC sf_glad_glGetMapdv = NULL;
+PFNGLGETMAPFVPROC sf_glad_glGetMapfv = NULL;
+PFNGLGETMAPIVPROC sf_glad_glGetMapiv = NULL;
+PFNGLGETMATERIALFVPROC sf_glad_glGetMaterialfv = NULL;
+PFNGLGETMATERIALIVPROC sf_glad_glGetMaterialiv = NULL;
+PFNGLGETMINMAXPROC sf_glad_glGetMinmax = NULL;
+PFNGLGETMINMAXPARAMETERFVPROC sf_glad_glGetMinmaxParameterfv = NULL;
+PFNGLGETMINMAXPARAMETERIVPROC sf_glad_glGetMinmaxParameteriv = NULL;
+PFNGLGETMULTISAMPLEFVPROC sf_glad_glGetMultisamplefv = NULL;
+PFNGLGETNAMEDBUFFERPARAMETERI64VPROC sf_glad_glGetNamedBufferParameteri64v = NULL;
+PFNGLGETNAMEDBUFFERPARAMETERIVPROC sf_glad_glGetNamedBufferParameteriv = NULL;
+PFNGLGETNAMEDBUFFERPOINTERVPROC sf_glad_glGetNamedBufferPointerv = NULL;
+PFNGLGETNAMEDBUFFERSUBDATAPROC sf_glad_glGetNamedBufferSubData = NULL;
+PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC sf_glad_glGetNamedFramebufferAttachmentParameteriv = NULL;
+PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC sf_glad_glGetNamedFramebufferParameteriv = NULL;
+PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC sf_glad_glGetNamedRenderbufferParameteriv = NULL;
+PFNGLGETOBJECTLABELPROC sf_glad_glGetObjectLabel = NULL;
+PFNGLGETOBJECTPARAMETERFVARBPROC sf_glad_glGetObjectParameterfvARB = NULL;
+PFNGLGETOBJECTPARAMETERIVARBPROC sf_glad_glGetObjectParameterivARB = NULL;
+PFNGLGETOBJECTPTRLABELPROC sf_glad_glGetObjectPtrLabel = NULL;
+PFNGLGETPIXELMAPFVPROC sf_glad_glGetPixelMapfv = NULL;
+PFNGLGETPIXELMAPUIVPROC sf_glad_glGetPixelMapuiv = NULL;
+PFNGLGETPIXELMAPUSVPROC sf_glad_glGetPixelMapusv = NULL;
+PFNGLGETPOINTERVPROC sf_glad_glGetPointerv = NULL;
+PFNGLGETPOINTERVEXTPROC sf_glad_glGetPointervEXT = NULL;
+PFNGLGETPOLYGONSTIPPLEPROC sf_glad_glGetPolygonStipple = NULL;
+PFNGLGETPROGRAMBINARYPROC sf_glad_glGetProgramBinary = NULL;
+PFNGLGETPROGRAMENVPARAMETERDVARBPROC sf_glad_glGetProgramEnvParameterdvARB = NULL;
+PFNGLGETPROGRAMENVPARAMETERFVARBPROC sf_glad_glGetProgramEnvParameterfvARB = NULL;
+PFNGLGETPROGRAMINFOLOGPROC sf_glad_glGetProgramInfoLog = NULL;
+PFNGLGETPROGRAMINTERFACEIVPROC sf_glad_glGetProgramInterfaceiv = NULL;
+PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC sf_glad_glGetProgramLocalParameterdvARB = NULL;
+PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC sf_glad_glGetProgramLocalParameterfvARB = NULL;
+PFNGLGETPROGRAMPARAMETERDVNVPROC sf_glad_glGetProgramParameterdvNV = NULL;
+PFNGLGETPROGRAMPARAMETERFVNVPROC sf_glad_glGetProgramParameterfvNV = NULL;
+PFNGLGETPROGRAMPIPELINEINFOLOGPROC sf_glad_glGetProgramPipelineInfoLog = NULL;
+PFNGLGETPROGRAMPIPELINEIVPROC sf_glad_glGetProgramPipelineiv = NULL;
+PFNGLGETPROGRAMRESOURCEINDEXPROC sf_glad_glGetProgramResourceIndex = NULL;
+PFNGLGETPROGRAMRESOURCELOCATIONPROC sf_glad_glGetProgramResourceLocation = NULL;
+PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC sf_glad_glGetProgramResourceLocationIndex = NULL;
+PFNGLGETPROGRAMRESOURCENAMEPROC sf_glad_glGetProgramResourceName = NULL;
+PFNGLGETPROGRAMRESOURCEIVPROC sf_glad_glGetProgramResourceiv = NULL;
+PFNGLGETPROGRAMSTAGEIVPROC sf_glad_glGetProgramStageiv = NULL;
+PFNGLGETPROGRAMSTRINGARBPROC sf_glad_glGetProgramStringARB = NULL;
+PFNGLGETPROGRAMSTRINGNVPROC sf_glad_glGetProgramStringNV = NULL;
+PFNGLGETPROGRAMIVPROC sf_glad_glGetProgramiv = NULL;
+PFNGLGETPROGRAMIVARBPROC sf_glad_glGetProgramivARB = NULL;
+PFNGLGETPROGRAMIVNVPROC sf_glad_glGetProgramivNV = NULL;
+PFNGLGETQUERYBUFFEROBJECTI64VPROC sf_glad_glGetQueryBufferObjecti64v = NULL;
+PFNGLGETQUERYBUFFEROBJECTIVPROC sf_glad_glGetQueryBufferObjectiv = NULL;
+PFNGLGETQUERYBUFFEROBJECTUI64VPROC sf_glad_glGetQueryBufferObjectui64v = NULL;
+PFNGLGETQUERYBUFFEROBJECTUIVPROC sf_glad_glGetQueryBufferObjectuiv = NULL;
+PFNGLGETQUERYINDEXEDIVPROC sf_glad_glGetQueryIndexediv = NULL;
+PFNGLGETQUERYOBJECTI64VPROC sf_glad_glGetQueryObjecti64v = NULL;
+PFNGLGETQUERYOBJECTIVPROC sf_glad_glGetQueryObjectiv = NULL;
+PFNGLGETQUERYOBJECTUI64VPROC sf_glad_glGetQueryObjectui64v = NULL;
+PFNGLGETQUERYOBJECTUIVPROC sf_glad_glGetQueryObjectuiv = NULL;
+PFNGLGETQUERYIVPROC sf_glad_glGetQueryiv = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVPROC sf_glad_glGetRenderbufferParameteriv = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC sf_glad_glGetRenderbufferParameterivEXT = NULL;
+PFNGLGETSAMPLERPARAMETERIIVPROC sf_glad_glGetSamplerParameterIiv = NULL;
+PFNGLGETSAMPLERPARAMETERIUIVPROC sf_glad_glGetSamplerParameterIuiv = NULL;
+PFNGLGETSAMPLERPARAMETERFVPROC sf_glad_glGetSamplerParameterfv = NULL;
+PFNGLGETSAMPLERPARAMETERIVPROC sf_glad_glGetSamplerParameteriv = NULL;
+PFNGLGETSEPARABLEFILTERPROC sf_glad_glGetSeparableFilter = NULL;
+PFNGLGETSHADERINFOLOGPROC sf_glad_glGetShaderInfoLog = NULL;
+PFNGLGETSHADERPRECISIONFORMATPROC sf_glad_glGetShaderPrecisionFormat = NULL;
+PFNGLGETSHADERSOURCEPROC sf_glad_glGetShaderSource = NULL;
+PFNGLGETSHADERSOURCEARBPROC sf_glad_glGetShaderSourceARB = NULL;
+PFNGLGETSHADERIVPROC sf_glad_glGetShaderiv = NULL;
+PFNGLGETSTRINGPROC sf_glad_glGetString = NULL;
+PFNGLGETSTRINGIPROC sf_glad_glGetStringi = NULL;
+PFNGLGETSUBROUTINEINDEXPROC sf_glad_glGetSubroutineIndex = NULL;
+PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC sf_glad_glGetSubroutineUniformLocation = NULL;
+PFNGLGETSYNCIVPROC sf_glad_glGetSynciv = NULL;
+PFNGLGETTEXENVFVPROC sf_glad_glGetTexEnvfv = NULL;
+PFNGLGETTEXENVIVPROC sf_glad_glGetTexEnviv = NULL;
+PFNGLGETTEXGENDVPROC sf_glad_glGetTexGendv = NULL;
+PFNGLGETTEXGENFVPROC sf_glad_glGetTexGenfv = NULL;
+PFNGLGETTEXGENIVPROC sf_glad_glGetTexGeniv = NULL;
+PFNGLGETTEXIMAGEPROC sf_glad_glGetTexImage = NULL;
+PFNGLGETTEXLEVELPARAMETERFVPROC sf_glad_glGetTexLevelParameterfv = NULL;
+PFNGLGETTEXLEVELPARAMETERIVPROC sf_glad_glGetTexLevelParameteriv = NULL;
+PFNGLGETTEXPARAMETERIIVPROC sf_glad_glGetTexParameterIiv = NULL;
+PFNGLGETTEXPARAMETERIUIVPROC sf_glad_glGetTexParameterIuiv = NULL;
+PFNGLGETTEXPARAMETERFVPROC sf_glad_glGetTexParameterfv = NULL;
+PFNGLGETTEXPARAMETERIVPROC sf_glad_glGetTexParameteriv = NULL;
+PFNGLGETTEXTUREIMAGEPROC sf_glad_glGetTextureImage = NULL;
+PFNGLGETTEXTURELEVELPARAMETERFVPROC sf_glad_glGetTextureLevelParameterfv = NULL;
+PFNGLGETTEXTURELEVELPARAMETERIVPROC sf_glad_glGetTextureLevelParameteriv = NULL;
+PFNGLGETTEXTUREPARAMETERIIVPROC sf_glad_glGetTextureParameterIiv = NULL;
+PFNGLGETTEXTUREPARAMETERIUIVPROC sf_glad_glGetTextureParameterIuiv = NULL;
+PFNGLGETTEXTUREPARAMETERFVPROC sf_glad_glGetTextureParameterfv = NULL;
+PFNGLGETTEXTUREPARAMETERIVPROC sf_glad_glGetTextureParameteriv = NULL;
+PFNGLGETTEXTURESUBIMAGEPROC sf_glad_glGetTextureSubImage = NULL;
+PFNGLGETTRACKMATRIXIVNVPROC sf_glad_glGetTrackMatrixivNV = NULL;
+PFNGLGETTRANSFORMFEEDBACKVARYINGPROC sf_glad_glGetTransformFeedbackVarying = NULL;
+PFNGLGETTRANSFORMFEEDBACKI64_VPROC sf_glad_glGetTransformFeedbacki64_v = NULL;
+PFNGLGETTRANSFORMFEEDBACKI_VPROC sf_glad_glGetTransformFeedbacki_v = NULL;
+PFNGLGETTRANSFORMFEEDBACKIVPROC sf_glad_glGetTransformFeedbackiv = NULL;
+PFNGLGETUNIFORMBLOCKINDEXPROC sf_glad_glGetUniformBlockIndex = NULL;
+PFNGLGETUNIFORMINDICESPROC sf_glad_glGetUniformIndices = NULL;
+PFNGLGETUNIFORMLOCATIONPROC sf_glad_glGetUniformLocation = NULL;
+PFNGLGETUNIFORMLOCATIONARBPROC sf_glad_glGetUniformLocationARB = NULL;
+PFNGLGETUNIFORMSUBROUTINEUIVPROC sf_glad_glGetUniformSubroutineuiv = NULL;
+PFNGLGETUNIFORMDVPROC sf_glad_glGetUniformdv = NULL;
+PFNGLGETUNIFORMFVPROC sf_glad_glGetUniformfv = NULL;
+PFNGLGETUNIFORMFVARBPROC sf_glad_glGetUniformfvARB = NULL;
+PFNGLGETUNIFORMIVPROC sf_glad_glGetUniformiv = NULL;
+PFNGLGETUNIFORMIVARBPROC sf_glad_glGetUniformivARB = NULL;
+PFNGLGETUNIFORMUIVPROC sf_glad_glGetUniformuiv = NULL;
+PFNGLGETVERTEXARRAYINDEXED64IVPROC sf_glad_glGetVertexArrayIndexed64iv = NULL;
+PFNGLGETVERTEXARRAYINDEXEDIVPROC sf_glad_glGetVertexArrayIndexediv = NULL;
+PFNGLGETVERTEXARRAYIVPROC sf_glad_glGetVertexArrayiv = NULL;
+PFNGLGETVERTEXATTRIBIIVPROC sf_glad_glGetVertexAttribIiv = NULL;
+PFNGLGETVERTEXATTRIBIUIVPROC sf_glad_glGetVertexAttribIuiv = NULL;
+PFNGLGETVERTEXATTRIBLDVPROC sf_glad_glGetVertexAttribLdv = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVPROC sf_glad_glGetVertexAttribPointerv = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVARBPROC sf_glad_glGetVertexAttribPointervARB = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVNVPROC sf_glad_glGetVertexAttribPointervNV = NULL;
+PFNGLGETVERTEXATTRIBDVPROC sf_glad_glGetVertexAttribdv = NULL;
+PFNGLGETVERTEXATTRIBDVARBPROC sf_glad_glGetVertexAttribdvARB = NULL;
+PFNGLGETVERTEXATTRIBDVNVPROC sf_glad_glGetVertexAttribdvNV = NULL;
+PFNGLGETVERTEXATTRIBFVPROC sf_glad_glGetVertexAttribfv = NULL;
+PFNGLGETVERTEXATTRIBFVARBPROC sf_glad_glGetVertexAttribfvARB = NULL;
+PFNGLGETVERTEXATTRIBFVNVPROC sf_glad_glGetVertexAttribfvNV = NULL;
+PFNGLGETVERTEXATTRIBIVPROC sf_glad_glGetVertexAttribiv = NULL;
+PFNGLGETVERTEXATTRIBIVARBPROC sf_glad_glGetVertexAttribivARB = NULL;
+PFNGLGETVERTEXATTRIBIVNVPROC sf_glad_glGetVertexAttribivNV = NULL;
+PFNGLGETNCOLORTABLEPROC sf_glad_glGetnColorTable = NULL;
+PFNGLGETNCOMPRESSEDTEXIMAGEPROC sf_glad_glGetnCompressedTexImage = NULL;
+PFNGLGETNCONVOLUTIONFILTERPROC sf_glad_glGetnConvolutionFilter = NULL;
+PFNGLGETNHISTOGRAMPROC sf_glad_glGetnHistogram = NULL;
+PFNGLGETNMAPDVPROC sf_glad_glGetnMapdv = NULL;
+PFNGLGETNMAPFVPROC sf_glad_glGetnMapfv = NULL;
+PFNGLGETNMAPIVPROC sf_glad_glGetnMapiv = NULL;
+PFNGLGETNMINMAXPROC sf_glad_glGetnMinmax = NULL;
+PFNGLGETNPIXELMAPFVPROC sf_glad_glGetnPixelMapfv = NULL;
+PFNGLGETNPIXELMAPUIVPROC sf_glad_glGetnPixelMapuiv = NULL;
+PFNGLGETNPIXELMAPUSVPROC sf_glad_glGetnPixelMapusv = NULL;
+PFNGLGETNPOLYGONSTIPPLEPROC sf_glad_glGetnPolygonStipple = NULL;
+PFNGLGETNSEPARABLEFILTERPROC sf_glad_glGetnSeparableFilter = NULL;
+PFNGLGETNTEXIMAGEPROC sf_glad_glGetnTexImage = NULL;
+PFNGLGETNUNIFORMDVPROC sf_glad_glGetnUniformdv = NULL;
+PFNGLGETNUNIFORMFVPROC sf_glad_glGetnUniformfv = NULL;
+PFNGLGETNUNIFORMIVPROC sf_glad_glGetnUniformiv = NULL;
+PFNGLGETNUNIFORMUIVPROC sf_glad_glGetnUniformuiv = NULL;
+PFNGLHINTPROC sf_glad_glHint = NULL;
+PFNGLHISTOGRAMPROC sf_glad_glHistogram = NULL;
+PFNGLINDEXMASKPROC sf_glad_glIndexMask = NULL;
+PFNGLINDEXPOINTERPROC sf_glad_glIndexPointer = NULL;
+PFNGLINDEXPOINTEREXTPROC sf_glad_glIndexPointerEXT = NULL;
+PFNGLINDEXDPROC sf_glad_glIndexd = NULL;
+PFNGLINDEXDVPROC sf_glad_glIndexdv = NULL;
+PFNGLINDEXFPROC sf_glad_glIndexf = NULL;
+PFNGLINDEXFVPROC sf_glad_glIndexfv = NULL;
+PFNGLINDEXIPROC sf_glad_glIndexi = NULL;
+PFNGLINDEXIVPROC sf_glad_glIndexiv = NULL;
+PFNGLINDEXSPROC sf_glad_glIndexs = NULL;
+PFNGLINDEXSVPROC sf_glad_glIndexsv = NULL;
+PFNGLINDEXUBPROC sf_glad_glIndexub = NULL;
+PFNGLINDEXUBVPROC sf_glad_glIndexubv = NULL;
+PFNGLINITNAMESPROC sf_glad_glInitNames = NULL;
+PFNGLINTERLEAVEDARRAYSPROC sf_glad_glInterleavedArrays = NULL;
+PFNGLINVALIDATEBUFFERDATAPROC sf_glad_glInvalidateBufferData = NULL;
+PFNGLINVALIDATEBUFFERSUBDATAPROC sf_glad_glInvalidateBufferSubData = NULL;
+PFNGLINVALIDATEFRAMEBUFFERPROC sf_glad_glInvalidateFramebuffer = NULL;
+PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC sf_glad_glInvalidateNamedFramebufferData = NULL;
+PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC sf_glad_glInvalidateNamedFramebufferSubData = NULL;
+PFNGLINVALIDATESUBFRAMEBUFFERPROC sf_glad_glInvalidateSubFramebuffer = NULL;
+PFNGLINVALIDATETEXIMAGEPROC sf_glad_glInvalidateTexImage = NULL;
+PFNGLINVALIDATETEXSUBIMAGEPROC sf_glad_glInvalidateTexSubImage = NULL;
+PFNGLISBUFFERPROC sf_glad_glIsBuffer = NULL;
+PFNGLISBUFFERARBPROC sf_glad_glIsBufferARB = NULL;
+PFNGLISENABLEDPROC sf_glad_glIsEnabled = NULL;
+PFNGLISENABLEDIPROC sf_glad_glIsEnabledi = NULL;
+PFNGLISFRAMEBUFFERPROC sf_glad_glIsFramebuffer = NULL;
+PFNGLISFRAMEBUFFEREXTPROC sf_glad_glIsFramebufferEXT = NULL;
+PFNGLISLISTPROC sf_glad_glIsList = NULL;
+PFNGLISPROGRAMPROC sf_glad_glIsProgram = NULL;
+PFNGLISPROGRAMARBPROC sf_glad_glIsProgramARB = NULL;
+PFNGLISPROGRAMNVPROC sf_glad_glIsProgramNV = NULL;
+PFNGLISPROGRAMPIPELINEPROC sf_glad_glIsProgramPipeline = NULL;
+PFNGLISQUERYPROC sf_glad_glIsQuery = NULL;
+PFNGLISRENDERBUFFERPROC sf_glad_glIsRenderbuffer = NULL;
+PFNGLISRENDERBUFFEREXTPROC sf_glad_glIsRenderbufferEXT = NULL;
+PFNGLISSAMPLERPROC sf_glad_glIsSampler = NULL;
+PFNGLISSHADERPROC sf_glad_glIsShader = NULL;
+PFNGLISSYNCPROC sf_glad_glIsSync = NULL;
+PFNGLISTEXTUREPROC sf_glad_glIsTexture = NULL;
+PFNGLISTEXTUREEXTPROC sf_glad_glIsTextureEXT = NULL;
+PFNGLISTRANSFORMFEEDBACKPROC sf_glad_glIsTransformFeedback = NULL;
+PFNGLISVERTEXARRAYPROC sf_glad_glIsVertexArray = NULL;
+PFNGLLIGHTMODELFPROC sf_glad_glLightModelf = NULL;
+PFNGLLIGHTMODELFVPROC sf_glad_glLightModelfv = NULL;
+PFNGLLIGHTMODELIPROC sf_glad_glLightModeli = NULL;
+PFNGLLIGHTMODELIVPROC sf_glad_glLightModeliv = NULL;
+PFNGLLIGHTFPROC sf_glad_glLightf = NULL;
+PFNGLLIGHTFVPROC sf_glad_glLightfv = NULL;
+PFNGLLIGHTIPROC sf_glad_glLighti = NULL;
+PFNGLLIGHTIVPROC sf_glad_glLightiv = NULL;
+PFNGLLINESTIPPLEPROC sf_glad_glLineStipple = NULL;
+PFNGLLINEWIDTHPROC sf_glad_glLineWidth = NULL;
+PFNGLLINKPROGRAMPROC sf_glad_glLinkProgram = NULL;
+PFNGLLINKPROGRAMARBPROC sf_glad_glLinkProgramARB = NULL;
+PFNGLLISTBASEPROC sf_glad_glListBase = NULL;
+PFNGLLOADIDENTITYPROC sf_glad_glLoadIdentity = NULL;
+PFNGLLOADMATRIXDPROC sf_glad_glLoadMatrixd = NULL;
+PFNGLLOADMATRIXFPROC sf_glad_glLoadMatrixf = NULL;
+PFNGLLOADNAMEPROC sf_glad_glLoadName = NULL;
+PFNGLLOADPROGRAMNVPROC sf_glad_glLoadProgramNV = NULL;
+PFNGLLOADTRANSPOSEMATRIXDPROC sf_glad_glLoadTransposeMatrixd = NULL;
+PFNGLLOADTRANSPOSEMATRIXFPROC sf_glad_glLoadTransposeMatrixf = NULL;
+PFNGLLOGICOPPROC sf_glad_glLogicOp = NULL;
+PFNGLMAP1DPROC sf_glad_glMap1d = NULL;
+PFNGLMAP1FPROC sf_glad_glMap1f = NULL;
+PFNGLMAP2DPROC sf_glad_glMap2d = NULL;
+PFNGLMAP2FPROC sf_glad_glMap2f = NULL;
+PFNGLMAPBUFFERPROC sf_glad_glMapBuffer = NULL;
+PFNGLMAPBUFFERARBPROC sf_glad_glMapBufferARB = NULL;
+PFNGLMAPBUFFERRANGEPROC sf_glad_glMapBufferRange = NULL;
+PFNGLMAPGRID1DPROC sf_glad_glMapGrid1d = NULL;
+PFNGLMAPGRID1FPROC sf_glad_glMapGrid1f = NULL;
+PFNGLMAPGRID2DPROC sf_glad_glMapGrid2d = NULL;
+PFNGLMAPGRID2FPROC sf_glad_glMapGrid2f = NULL;
+PFNGLMAPNAMEDBUFFERPROC sf_glad_glMapNamedBuffer = NULL;
+PFNGLMAPNAMEDBUFFERRANGEPROC sf_glad_glMapNamedBufferRange = NULL;
+PFNGLMATERIALFPROC sf_glad_glMaterialf = NULL;
+PFNGLMATERIALFVPROC sf_glad_glMaterialfv = NULL;
+PFNGLMATERIALIPROC sf_glad_glMateriali = NULL;
+PFNGLMATERIALIVPROC sf_glad_glMaterialiv = NULL;
+PFNGLMATRIXMODEPROC sf_glad_glMatrixMode = NULL;
+PFNGLMEMORYBARRIERPROC sf_glad_glMemoryBarrier = NULL;
+PFNGLMEMORYBARRIERBYREGIONPROC sf_glad_glMemoryBarrierByRegion = NULL;
+PFNGLMINSAMPLESHADINGPROC sf_glad_glMinSampleShading = NULL;
+PFNGLMINMAXPROC sf_glad_glMinmax = NULL;
+PFNGLMULTMATRIXDPROC sf_glad_glMultMatrixd = NULL;
+PFNGLMULTMATRIXFPROC sf_glad_glMultMatrixf = NULL;
+PFNGLMULTTRANSPOSEMATRIXDPROC sf_glad_glMultTransposeMatrixd = NULL;
+PFNGLMULTTRANSPOSEMATRIXFPROC sf_glad_glMultTransposeMatrixf = NULL;
+PFNGLMULTIDRAWARRAYSPROC sf_glad_glMultiDrawArrays = NULL;
+PFNGLMULTIDRAWARRAYSINDIRECTPROC sf_glad_glMultiDrawArraysIndirect = NULL;
+PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC sf_glad_glMultiDrawArraysIndirectCount = NULL;
+PFNGLMULTIDRAWELEMENTSPROC sf_glad_glMultiDrawElements = NULL;
+PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC sf_glad_glMultiDrawElementsBaseVertex = NULL;
+PFNGLMULTIDRAWELEMENTSINDIRECTPROC sf_glad_glMultiDrawElementsIndirect = NULL;
+PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC sf_glad_glMultiDrawElementsIndirectCount = NULL;
+PFNGLMULTITEXCOORD1DPROC sf_glad_glMultiTexCoord1d = NULL;
+PFNGLMULTITEXCOORD1DARBPROC sf_glad_glMultiTexCoord1dARB = NULL;
+PFNGLMULTITEXCOORD1DVPROC sf_glad_glMultiTexCoord1dv = NULL;
+PFNGLMULTITEXCOORD1DVARBPROC sf_glad_glMultiTexCoord1dvARB = NULL;
+PFNGLMULTITEXCOORD1FPROC sf_glad_glMultiTexCoord1f = NULL;
+PFNGLMULTITEXCOORD1FARBPROC sf_glad_glMultiTexCoord1fARB = NULL;
+PFNGLMULTITEXCOORD1FVPROC sf_glad_glMultiTexCoord1fv = NULL;
+PFNGLMULTITEXCOORD1FVARBPROC sf_glad_glMultiTexCoord1fvARB = NULL;
+PFNGLMULTITEXCOORD1IPROC sf_glad_glMultiTexCoord1i = NULL;
+PFNGLMULTITEXCOORD1IARBPROC sf_glad_glMultiTexCoord1iARB = NULL;
+PFNGLMULTITEXCOORD1IVPROC sf_glad_glMultiTexCoord1iv = NULL;
+PFNGLMULTITEXCOORD1IVARBPROC sf_glad_glMultiTexCoord1ivARB = NULL;
+PFNGLMULTITEXCOORD1SPROC sf_glad_glMultiTexCoord1s = NULL;
+PFNGLMULTITEXCOORD1SARBPROC sf_glad_glMultiTexCoord1sARB = NULL;
+PFNGLMULTITEXCOORD1SVPROC sf_glad_glMultiTexCoord1sv = NULL;
+PFNGLMULTITEXCOORD1SVARBPROC sf_glad_glMultiTexCoord1svARB = NULL;
+PFNGLMULTITEXCOORD2DPROC sf_glad_glMultiTexCoord2d = NULL;
+PFNGLMULTITEXCOORD2DARBPROC sf_glad_glMultiTexCoord2dARB = NULL;
+PFNGLMULTITEXCOORD2DVPROC sf_glad_glMultiTexCoord2dv = NULL;
+PFNGLMULTITEXCOORD2DVARBPROC sf_glad_glMultiTexCoord2dvARB = NULL;
+PFNGLMULTITEXCOORD2FPROC sf_glad_glMultiTexCoord2f = NULL;
+PFNGLMULTITEXCOORD2FARBPROC sf_glad_glMultiTexCoord2fARB = NULL;
+PFNGLMULTITEXCOORD2FVPROC sf_glad_glMultiTexCoord2fv = NULL;
+PFNGLMULTITEXCOORD2FVARBPROC sf_glad_glMultiTexCoord2fvARB = NULL;
+PFNGLMULTITEXCOORD2IPROC sf_glad_glMultiTexCoord2i = NULL;
+PFNGLMULTITEXCOORD2IARBPROC sf_glad_glMultiTexCoord2iARB = NULL;
+PFNGLMULTITEXCOORD2IVPROC sf_glad_glMultiTexCoord2iv = NULL;
+PFNGLMULTITEXCOORD2IVARBPROC sf_glad_glMultiTexCoord2ivARB = NULL;
+PFNGLMULTITEXCOORD2SPROC sf_glad_glMultiTexCoord2s = NULL;
+PFNGLMULTITEXCOORD2SARBPROC sf_glad_glMultiTexCoord2sARB = NULL;
+PFNGLMULTITEXCOORD2SVPROC sf_glad_glMultiTexCoord2sv = NULL;
+PFNGLMULTITEXCOORD2SVARBPROC sf_glad_glMultiTexCoord2svARB = NULL;
+PFNGLMULTITEXCOORD3DPROC sf_glad_glMultiTexCoord3d = NULL;
+PFNGLMULTITEXCOORD3DARBPROC sf_glad_glMultiTexCoord3dARB = NULL;
+PFNGLMULTITEXCOORD3DVPROC sf_glad_glMultiTexCoord3dv = NULL;
+PFNGLMULTITEXCOORD3DVARBPROC sf_glad_glMultiTexCoord3dvARB = NULL;
+PFNGLMULTITEXCOORD3FPROC sf_glad_glMultiTexCoord3f = NULL;
+PFNGLMULTITEXCOORD3FARBPROC sf_glad_glMultiTexCoord3fARB = NULL;
+PFNGLMULTITEXCOORD3FVPROC sf_glad_glMultiTexCoord3fv = NULL;
+PFNGLMULTITEXCOORD3FVARBPROC sf_glad_glMultiTexCoord3fvARB = NULL;
+PFNGLMULTITEXCOORD3IPROC sf_glad_glMultiTexCoord3i = NULL;
+PFNGLMULTITEXCOORD3IARBPROC sf_glad_glMultiTexCoord3iARB = NULL;
+PFNGLMULTITEXCOORD3IVPROC sf_glad_glMultiTexCoord3iv = NULL;
+PFNGLMULTITEXCOORD3IVARBPROC sf_glad_glMultiTexCoord3ivARB = NULL;
+PFNGLMULTITEXCOORD3SPROC sf_glad_glMultiTexCoord3s = NULL;
+PFNGLMULTITEXCOORD3SARBPROC sf_glad_glMultiTexCoord3sARB = NULL;
+PFNGLMULTITEXCOORD3SVPROC sf_glad_glMultiTexCoord3sv = NULL;
+PFNGLMULTITEXCOORD3SVARBPROC sf_glad_glMultiTexCoord3svARB = NULL;
+PFNGLMULTITEXCOORD4DPROC sf_glad_glMultiTexCoord4d = NULL;
+PFNGLMULTITEXCOORD4DARBPROC sf_glad_glMultiTexCoord4dARB = NULL;
+PFNGLMULTITEXCOORD4DVPROC sf_glad_glMultiTexCoord4dv = NULL;
+PFNGLMULTITEXCOORD4DVARBPROC sf_glad_glMultiTexCoord4dvARB = NULL;
+PFNGLMULTITEXCOORD4FPROC sf_glad_glMultiTexCoord4f = NULL;
+PFNGLMULTITEXCOORD4FARBPROC sf_glad_glMultiTexCoord4fARB = NULL;
+PFNGLMULTITEXCOORD4FVPROC sf_glad_glMultiTexCoord4fv = NULL;
+PFNGLMULTITEXCOORD4FVARBPROC sf_glad_glMultiTexCoord4fvARB = NULL;
+PFNGLMULTITEXCOORD4IPROC sf_glad_glMultiTexCoord4i = NULL;
+PFNGLMULTITEXCOORD4IARBPROC sf_glad_glMultiTexCoord4iARB = NULL;
+PFNGLMULTITEXCOORD4IVPROC sf_glad_glMultiTexCoord4iv = NULL;
+PFNGLMULTITEXCOORD4IVARBPROC sf_glad_glMultiTexCoord4ivARB = NULL;
+PFNGLMULTITEXCOORD4SPROC sf_glad_glMultiTexCoord4s = NULL;
+PFNGLMULTITEXCOORD4SARBPROC sf_glad_glMultiTexCoord4sARB = NULL;
+PFNGLMULTITEXCOORD4SVPROC sf_glad_glMultiTexCoord4sv = NULL;
+PFNGLMULTITEXCOORD4SVARBPROC sf_glad_glMultiTexCoord4svARB = NULL;
+PFNGLMULTITEXCOORDP1UIPROC sf_glad_glMultiTexCoordP1ui = NULL;
+PFNGLMULTITEXCOORDP1UIVPROC sf_glad_glMultiTexCoordP1uiv = NULL;
+PFNGLMULTITEXCOORDP2UIPROC sf_glad_glMultiTexCoordP2ui = NULL;
+PFNGLMULTITEXCOORDP2UIVPROC sf_glad_glMultiTexCoordP2uiv = NULL;
+PFNGLMULTITEXCOORDP3UIPROC sf_glad_glMultiTexCoordP3ui = NULL;
+PFNGLMULTITEXCOORDP3UIVPROC sf_glad_glMultiTexCoordP3uiv = NULL;
+PFNGLMULTITEXCOORDP4UIPROC sf_glad_glMultiTexCoordP4ui = NULL;
+PFNGLMULTITEXCOORDP4UIVPROC sf_glad_glMultiTexCoordP4uiv = NULL;
+PFNGLNAMEDBUFFERDATAPROC sf_glad_glNamedBufferData = NULL;
+PFNGLNAMEDBUFFERSTORAGEPROC sf_glad_glNamedBufferStorage = NULL;
+PFNGLNAMEDBUFFERSUBDATAPROC sf_glad_glNamedBufferSubData = NULL;
+PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC sf_glad_glNamedFramebufferDrawBuffer = NULL;
+PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC sf_glad_glNamedFramebufferDrawBuffers = NULL;
+PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC sf_glad_glNamedFramebufferParameteri = NULL;
+PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC sf_glad_glNamedFramebufferReadBuffer = NULL;
+PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC sf_glad_glNamedFramebufferRenderbuffer = NULL;
+PFNGLNAMEDFRAMEBUFFERTEXTUREPROC sf_glad_glNamedFramebufferTexture = NULL;
+PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC sf_glad_glNamedFramebufferTextureLayer = NULL;
+PFNGLNAMEDRENDERBUFFERSTORAGEPROC sf_glad_glNamedRenderbufferStorage = NULL;
+PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC sf_glad_glNamedRenderbufferStorageMultisample = NULL;
+PFNGLNEWLISTPROC sf_glad_glNewList = NULL;
+PFNGLNORMAL3BPROC sf_glad_glNormal3b = NULL;
+PFNGLNORMAL3BVPROC sf_glad_glNormal3bv = NULL;
+PFNGLNORMAL3DPROC sf_glad_glNormal3d = NULL;
+PFNGLNORMAL3DVPROC sf_glad_glNormal3dv = NULL;
+PFNGLNORMAL3FPROC sf_glad_glNormal3f = NULL;
+PFNGLNORMAL3FVPROC sf_glad_glNormal3fv = NULL;
+PFNGLNORMAL3IPROC sf_glad_glNormal3i = NULL;
+PFNGLNORMAL3IVPROC sf_glad_glNormal3iv = NULL;
+PFNGLNORMAL3SPROC sf_glad_glNormal3s = NULL;
+PFNGLNORMAL3SVPROC sf_glad_glNormal3sv = NULL;
+PFNGLNORMALP3UIPROC sf_glad_glNormalP3ui = NULL;
+PFNGLNORMALP3UIVPROC sf_glad_glNormalP3uiv = NULL;
+PFNGLNORMALPOINTERPROC sf_glad_glNormalPointer = NULL;
+PFNGLNORMALPOINTEREXTPROC sf_glad_glNormalPointerEXT = NULL;
+PFNGLOBJECTLABELPROC sf_glad_glObjectLabel = NULL;
+PFNGLOBJECTPTRLABELPROC sf_glad_glObjectPtrLabel = NULL;
+PFNGLORTHOPROC sf_glad_glOrtho = NULL;
+PFNGLORTHOFOESPROC sf_glad_glOrthofOES = NULL;
+PFNGLPASSTHROUGHPROC sf_glad_glPassThrough = NULL;
+PFNGLPATCHPARAMETERFVPROC sf_glad_glPatchParameterfv = NULL;
+PFNGLPATCHPARAMETERIPROC sf_glad_glPatchParameteri = NULL;
+PFNGLPAUSETRANSFORMFEEDBACKPROC sf_glad_glPauseTransformFeedback = NULL;
+PFNGLPIXELMAPFVPROC sf_glad_glPixelMapfv = NULL;
+PFNGLPIXELMAPUIVPROC sf_glad_glPixelMapuiv = NULL;
+PFNGLPIXELMAPUSVPROC sf_glad_glPixelMapusv = NULL;
+PFNGLPIXELSTOREFPROC sf_glad_glPixelStoref = NULL;
+PFNGLPIXELSTOREIPROC sf_glad_glPixelStorei = NULL;
+PFNGLPIXELTRANSFERFPROC sf_glad_glPixelTransferf = NULL;
+PFNGLPIXELTRANSFERIPROC sf_glad_glPixelTransferi = NULL;
+PFNGLPIXELZOOMPROC sf_glad_glPixelZoom = NULL;
+PFNGLPOINTPARAMETERFPROC sf_glad_glPointParameterf = NULL;
+PFNGLPOINTPARAMETERFVPROC sf_glad_glPointParameterfv = NULL;
+PFNGLPOINTPARAMETERIPROC sf_glad_glPointParameteri = NULL;
+PFNGLPOINTPARAMETERIVPROC sf_glad_glPointParameteriv = NULL;
+PFNGLPOINTSIZEPROC sf_glad_glPointSize = NULL;
+PFNGLPOLYGONMODEPROC sf_glad_glPolygonMode = NULL;
+PFNGLPOLYGONOFFSETPROC sf_glad_glPolygonOffset = NULL;
+PFNGLPOLYGONOFFSETCLAMPPROC sf_glad_glPolygonOffsetClamp = NULL;
+PFNGLPOLYGONSTIPPLEPROC sf_glad_glPolygonStipple = NULL;
+PFNGLPOPATTRIBPROC sf_glad_glPopAttrib = NULL;
+PFNGLPOPCLIENTATTRIBPROC sf_glad_glPopClientAttrib = NULL;
+PFNGLPOPDEBUGGROUPPROC sf_glad_glPopDebugGroup = NULL;
+PFNGLPOPMATRIXPROC sf_glad_glPopMatrix = NULL;
+PFNGLPOPNAMEPROC sf_glad_glPopName = NULL;
+PFNGLPRIMITIVERESTARTINDEXPROC sf_glad_glPrimitiveRestartIndex = NULL;
+PFNGLPRIORITIZETEXTURESPROC sf_glad_glPrioritizeTextures = NULL;
+PFNGLPRIORITIZETEXTURESEXTPROC sf_glad_glPrioritizeTexturesEXT = NULL;
+PFNGLPROGRAMBINARYPROC sf_glad_glProgramBinary = NULL;
+PFNGLPROGRAMENVPARAMETER4DARBPROC sf_glad_glProgramEnvParameter4dARB = NULL;
+PFNGLPROGRAMENVPARAMETER4DVARBPROC sf_glad_glProgramEnvParameter4dvARB = NULL;
+PFNGLPROGRAMENVPARAMETER4FARBPROC sf_glad_glProgramEnvParameter4fARB = NULL;
+PFNGLPROGRAMENVPARAMETER4FVARBPROC sf_glad_glProgramEnvParameter4fvARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4DARBPROC sf_glad_glProgramLocalParameter4dARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4DVARBPROC sf_glad_glProgramLocalParameter4dvARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4FARBPROC sf_glad_glProgramLocalParameter4fARB = NULL;
+PFNGLPROGRAMLOCALPARAMETER4FVARBPROC sf_glad_glProgramLocalParameter4fvARB = NULL;
+PFNGLPROGRAMPARAMETER4DNVPROC sf_glad_glProgramParameter4dNV = NULL;
+PFNGLPROGRAMPARAMETER4DVNVPROC sf_glad_glProgramParameter4dvNV = NULL;
+PFNGLPROGRAMPARAMETER4FNVPROC sf_glad_glProgramParameter4fNV = NULL;
+PFNGLPROGRAMPARAMETER4FVNVPROC sf_glad_glProgramParameter4fvNV = NULL;
+PFNGLPROGRAMPARAMETERIPROC sf_glad_glProgramParameteri = NULL;
+PFNGLPROGRAMPARAMETERIARBPROC sf_glad_glProgramParameteriARB = NULL;
+PFNGLPROGRAMPARAMETERIEXTPROC sf_glad_glProgramParameteriEXT = NULL;
+PFNGLPROGRAMPARAMETERS4DVNVPROC sf_glad_glProgramParameters4dvNV = NULL;
+PFNGLPROGRAMPARAMETERS4FVNVPROC sf_glad_glProgramParameters4fvNV = NULL;
+PFNGLPROGRAMSTRINGARBPROC sf_glad_glProgramStringARB = NULL;
+PFNGLPROGRAMUNIFORM1DPROC sf_glad_glProgramUniform1d = NULL;
+PFNGLPROGRAMUNIFORM1DVPROC sf_glad_glProgramUniform1dv = NULL;
+PFNGLPROGRAMUNIFORM1FPROC sf_glad_glProgramUniform1f = NULL;
+PFNGLPROGRAMUNIFORM1FVPROC sf_glad_glProgramUniform1fv = NULL;
+PFNGLPROGRAMUNIFORM1IPROC sf_glad_glProgramUniform1i = NULL;
+PFNGLPROGRAMUNIFORM1IVPROC sf_glad_glProgramUniform1iv = NULL;
+PFNGLPROGRAMUNIFORM1UIPROC sf_glad_glProgramUniform1ui = NULL;
+PFNGLPROGRAMUNIFORM1UIVPROC sf_glad_glProgramUniform1uiv = NULL;
+PFNGLPROGRAMUNIFORM2DPROC sf_glad_glProgramUniform2d = NULL;
+PFNGLPROGRAMUNIFORM2DVPROC sf_glad_glProgramUniform2dv = NULL;
+PFNGLPROGRAMUNIFORM2FPROC sf_glad_glProgramUniform2f = NULL;
+PFNGLPROGRAMUNIFORM2FVPROC sf_glad_glProgramUniform2fv = NULL;
+PFNGLPROGRAMUNIFORM2IPROC sf_glad_glProgramUniform2i = NULL;
+PFNGLPROGRAMUNIFORM2IVPROC sf_glad_glProgramUniform2iv = NULL;
+PFNGLPROGRAMUNIFORM2UIPROC sf_glad_glProgramUniform2ui = NULL;
+PFNGLPROGRAMUNIFORM2UIVPROC sf_glad_glProgramUniform2uiv = NULL;
+PFNGLPROGRAMUNIFORM3DPROC sf_glad_glProgramUniform3d = NULL;
+PFNGLPROGRAMUNIFORM3DVPROC sf_glad_glProgramUniform3dv = NULL;
+PFNGLPROGRAMUNIFORM3FPROC sf_glad_glProgramUniform3f = NULL;
+PFNGLPROGRAMUNIFORM3FVPROC sf_glad_glProgramUniform3fv = NULL;
+PFNGLPROGRAMUNIFORM3IPROC sf_glad_glProgramUniform3i = NULL;
+PFNGLPROGRAMUNIFORM3IVPROC sf_glad_glProgramUniform3iv = NULL;
+PFNGLPROGRAMUNIFORM3UIPROC sf_glad_glProgramUniform3ui = NULL;
+PFNGLPROGRAMUNIFORM3UIVPROC sf_glad_glProgramUniform3uiv = NULL;
+PFNGLPROGRAMUNIFORM4DPROC sf_glad_glProgramUniform4d = NULL;
+PFNGLPROGRAMUNIFORM4DVPROC sf_glad_glProgramUniform4dv = NULL;
+PFNGLPROGRAMUNIFORM4FPROC sf_glad_glProgramUniform4f = NULL;
+PFNGLPROGRAMUNIFORM4FVPROC sf_glad_glProgramUniform4fv = NULL;
+PFNGLPROGRAMUNIFORM4IPROC sf_glad_glProgramUniform4i = NULL;
+PFNGLPROGRAMUNIFORM4IVPROC sf_glad_glProgramUniform4iv = NULL;
+PFNGLPROGRAMUNIFORM4UIPROC sf_glad_glProgramUniform4ui = NULL;
+PFNGLPROGRAMUNIFORM4UIVPROC sf_glad_glProgramUniform4uiv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2DVPROC sf_glad_glProgramUniformMatrix2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2FVPROC sf_glad_glProgramUniformMatrix2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC sf_glad_glProgramUniformMatrix2x3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC sf_glad_glProgramUniformMatrix2x3fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC sf_glad_glProgramUniformMatrix2x4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC sf_glad_glProgramUniformMatrix2x4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3DVPROC sf_glad_glProgramUniformMatrix3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3FVPROC sf_glad_glProgramUniformMatrix3fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC sf_glad_glProgramUniformMatrix3x2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC sf_glad_glProgramUniformMatrix3x2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC sf_glad_glProgramUniformMatrix3x4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC sf_glad_glProgramUniformMatrix3x4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4DVPROC sf_glad_glProgramUniformMatrix4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4FVPROC sf_glad_glProgramUniformMatrix4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC sf_glad_glProgramUniformMatrix4x2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC sf_glad_glProgramUniformMatrix4x2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC sf_glad_glProgramUniformMatrix4x3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC sf_glad_glProgramUniformMatrix4x3fv = NULL;
+PFNGLPROGRAMVERTEXLIMITNVPROC sf_glad_glProgramVertexLimitNV = NULL;
+PFNGLPROVOKINGVERTEXPROC sf_glad_glProvokingVertex = NULL;
+PFNGLPUSHATTRIBPROC sf_glad_glPushAttrib = NULL;
+PFNGLPUSHCLIENTATTRIBPROC sf_glad_glPushClientAttrib = NULL;
+PFNGLPUSHDEBUGGROUPPROC sf_glad_glPushDebugGroup = NULL;
+PFNGLPUSHMATRIXPROC sf_glad_glPushMatrix = NULL;
+PFNGLPUSHNAMEPROC sf_glad_glPushName = NULL;
+PFNGLQUERYCOUNTERPROC sf_glad_glQueryCounter = NULL;
+PFNGLRASTERPOS2DPROC sf_glad_glRasterPos2d = NULL;
+PFNGLRASTERPOS2DVPROC sf_glad_glRasterPos2dv = NULL;
+PFNGLRASTERPOS2FPROC sf_glad_glRasterPos2f = NULL;
+PFNGLRASTERPOS2FVPROC sf_glad_glRasterPos2fv = NULL;
+PFNGLRASTERPOS2IPROC sf_glad_glRasterPos2i = NULL;
+PFNGLRASTERPOS2IVPROC sf_glad_glRasterPos2iv = NULL;
+PFNGLRASTERPOS2SPROC sf_glad_glRasterPos2s = NULL;
+PFNGLRASTERPOS2SVPROC sf_glad_glRasterPos2sv = NULL;
+PFNGLRASTERPOS3DPROC sf_glad_glRasterPos3d = NULL;
+PFNGLRASTERPOS3DVPROC sf_glad_glRasterPos3dv = NULL;
+PFNGLRASTERPOS3FPROC sf_glad_glRasterPos3f = NULL;
+PFNGLRASTERPOS3FVPROC sf_glad_glRasterPos3fv = NULL;
+PFNGLRASTERPOS3IPROC sf_glad_glRasterPos3i = NULL;
+PFNGLRASTERPOS3IVPROC sf_glad_glRasterPos3iv = NULL;
+PFNGLRASTERPOS3SPROC sf_glad_glRasterPos3s = NULL;
+PFNGLRASTERPOS3SVPROC sf_glad_glRasterPos3sv = NULL;
+PFNGLRASTERPOS4DPROC sf_glad_glRasterPos4d = NULL;
+PFNGLRASTERPOS4DVPROC sf_glad_glRasterPos4dv = NULL;
+PFNGLRASTERPOS4FPROC sf_glad_glRasterPos4f = NULL;
+PFNGLRASTERPOS4FVPROC sf_glad_glRasterPos4fv = NULL;
+PFNGLRASTERPOS4IPROC sf_glad_glRasterPos4i = NULL;
+PFNGLRASTERPOS4IVPROC sf_glad_glRasterPos4iv = NULL;
+PFNGLRASTERPOS4SPROC sf_glad_glRasterPos4s = NULL;
+PFNGLRASTERPOS4SVPROC sf_glad_glRasterPos4sv = NULL;
+PFNGLREADBUFFERPROC sf_glad_glReadBuffer = NULL;
+PFNGLREADPIXELSPROC sf_glad_glReadPixels = NULL;
+PFNGLREADNPIXELSPROC sf_glad_glReadnPixels = NULL;
+PFNGLRECTDPROC sf_glad_glRectd = NULL;
+PFNGLRECTDVPROC sf_glad_glRectdv = NULL;
+PFNGLRECTFPROC sf_glad_glRectf = NULL;
+PFNGLRECTFVPROC sf_glad_glRectfv = NULL;
+PFNGLRECTIPROC sf_glad_glRecti = NULL;
+PFNGLRECTIVPROC sf_glad_glRectiv = NULL;
+PFNGLRECTSPROC sf_glad_glRects = NULL;
+PFNGLRECTSVPROC sf_glad_glRectsv = NULL;
+PFNGLRELEASESHADERCOMPILERPROC sf_glad_glReleaseShaderCompiler = NULL;
+PFNGLRENDERMODEPROC sf_glad_glRenderMode = NULL;
+PFNGLRENDERBUFFERSTORAGEPROC sf_glad_glRenderbufferStorage = NULL;
+PFNGLRENDERBUFFERSTORAGEEXTPROC sf_glad_glRenderbufferStorageEXT = NULL;
+PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC sf_glad_glRenderbufferStorageMultisample = NULL;
+PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC sf_glad_glRenderbufferStorageMultisampleEXT = NULL;
+PFNGLREQUESTRESIDENTPROGRAMSNVPROC sf_glad_glRequestResidentProgramsNV = NULL;
+PFNGLRESETHISTOGRAMPROC sf_glad_glResetHistogram = NULL;
+PFNGLRESETMINMAXPROC sf_glad_glResetMinmax = NULL;
+PFNGLRESUMETRANSFORMFEEDBACKPROC sf_glad_glResumeTransformFeedback = NULL;
+PFNGLROTATEDPROC sf_glad_glRotated = NULL;
+PFNGLROTATEFPROC sf_glad_glRotatef = NULL;
+PFNGLSAMPLECOVERAGEPROC sf_glad_glSampleCoverage = NULL;
+PFNGLSAMPLEMASKIPROC sf_glad_glSampleMaski = NULL;
+PFNGLSAMPLERPARAMETERIIVPROC sf_glad_glSamplerParameterIiv = NULL;
+PFNGLSAMPLERPARAMETERIUIVPROC sf_glad_glSamplerParameterIuiv = NULL;
+PFNGLSAMPLERPARAMETERFPROC sf_glad_glSamplerParameterf = NULL;
+PFNGLSAMPLERPARAMETERFVPROC sf_glad_glSamplerParameterfv = NULL;
+PFNGLSAMPLERPARAMETERIPROC sf_glad_glSamplerParameteri = NULL;
+PFNGLSAMPLERPARAMETERIVPROC sf_glad_glSamplerParameteriv = NULL;
+PFNGLSCALEDPROC sf_glad_glScaled = NULL;
+PFNGLSCALEFPROC sf_glad_glScalef = NULL;
+PFNGLSCISSORPROC sf_glad_glScissor = NULL;
+PFNGLSCISSORARRAYVPROC sf_glad_glScissorArrayv = NULL;
+PFNGLSCISSORINDEXEDPROC sf_glad_glScissorIndexed = NULL;
+PFNGLSCISSORINDEXEDVPROC sf_glad_glScissorIndexedv = NULL;
+PFNGLSECONDARYCOLOR3BPROC sf_glad_glSecondaryColor3b = NULL;
+PFNGLSECONDARYCOLOR3BVPROC sf_glad_glSecondaryColor3bv = NULL;
+PFNGLSECONDARYCOLOR3DPROC sf_glad_glSecondaryColor3d = NULL;
+PFNGLSECONDARYCOLOR3DVPROC sf_glad_glSecondaryColor3dv = NULL;
+PFNGLSECONDARYCOLOR3FPROC sf_glad_glSecondaryColor3f = NULL;
+PFNGLSECONDARYCOLOR3FVPROC sf_glad_glSecondaryColor3fv = NULL;
+PFNGLSECONDARYCOLOR3IPROC sf_glad_glSecondaryColor3i = NULL;
+PFNGLSECONDARYCOLOR3IVPROC sf_glad_glSecondaryColor3iv = NULL;
+PFNGLSECONDARYCOLOR3SPROC sf_glad_glSecondaryColor3s = NULL;
+PFNGLSECONDARYCOLOR3SVPROC sf_glad_glSecondaryColor3sv = NULL;
+PFNGLSECONDARYCOLOR3UBPROC sf_glad_glSecondaryColor3ub = NULL;
+PFNGLSECONDARYCOLOR3UBVPROC sf_glad_glSecondaryColor3ubv = NULL;
+PFNGLSECONDARYCOLOR3UIPROC sf_glad_glSecondaryColor3ui = NULL;
+PFNGLSECONDARYCOLOR3UIVPROC sf_glad_glSecondaryColor3uiv = NULL;
+PFNGLSECONDARYCOLOR3USPROC sf_glad_glSecondaryColor3us = NULL;
+PFNGLSECONDARYCOLOR3USVPROC sf_glad_glSecondaryColor3usv = NULL;
+PFNGLSECONDARYCOLORP3UIPROC sf_glad_glSecondaryColorP3ui = NULL;
+PFNGLSECONDARYCOLORP3UIVPROC sf_glad_glSecondaryColorP3uiv = NULL;
+PFNGLSECONDARYCOLORPOINTERPROC sf_glad_glSecondaryColorPointer = NULL;
+PFNGLSELECTBUFFERPROC sf_glad_glSelectBuffer = NULL;
+PFNGLSEPARABLEFILTER2DPROC sf_glad_glSeparableFilter2D = NULL;
+PFNGLSHADEMODELPROC sf_glad_glShadeModel = NULL;
+PFNGLSHADERBINARYPROC sf_glad_glShaderBinary = NULL;
+PFNGLSHADERSOURCEPROC sf_glad_glShaderSource = NULL;
+PFNGLSHADERSOURCEARBPROC sf_glad_glShaderSourceARB = NULL;
+PFNGLSHADERSTORAGEBLOCKBINDINGPROC sf_glad_glShaderStorageBlockBinding = NULL;
+PFNGLSPECIALIZESHADERPROC sf_glad_glSpecializeShader = NULL;
+PFNGLSTENCILFUNCPROC sf_glad_glStencilFunc = NULL;
+PFNGLSTENCILFUNCSEPARATEPROC sf_glad_glStencilFuncSeparate = NULL;
+PFNGLSTENCILMASKPROC sf_glad_glStencilMask = NULL;
+PFNGLSTENCILMASKSEPARATEPROC sf_glad_glStencilMaskSeparate = NULL;
+PFNGLSTENCILOPPROC sf_glad_glStencilOp = NULL;
+PFNGLSTENCILOPSEPARATEPROC sf_glad_glStencilOpSeparate = NULL;
+PFNGLTEXBUFFERPROC sf_glad_glTexBuffer = NULL;
+PFNGLTEXBUFFERRANGEPROC sf_glad_glTexBufferRange = NULL;
+PFNGLTEXCOORD1DPROC sf_glad_glTexCoord1d = NULL;
+PFNGLTEXCOORD1DVPROC sf_glad_glTexCoord1dv = NULL;
+PFNGLTEXCOORD1FPROC sf_glad_glTexCoord1f = NULL;
+PFNGLTEXCOORD1FVPROC sf_glad_glTexCoord1fv = NULL;
+PFNGLTEXCOORD1IPROC sf_glad_glTexCoord1i = NULL;
+PFNGLTEXCOORD1IVPROC sf_glad_glTexCoord1iv = NULL;
+PFNGLTEXCOORD1SPROC sf_glad_glTexCoord1s = NULL;
+PFNGLTEXCOORD1SVPROC sf_glad_glTexCoord1sv = NULL;
+PFNGLTEXCOORD2DPROC sf_glad_glTexCoord2d = NULL;
+PFNGLTEXCOORD2DVPROC sf_glad_glTexCoord2dv = NULL;
+PFNGLTEXCOORD2FPROC sf_glad_glTexCoord2f = NULL;
+PFNGLTEXCOORD2FVPROC sf_glad_glTexCoord2fv = NULL;
+PFNGLTEXCOORD2IPROC sf_glad_glTexCoord2i = NULL;
+PFNGLTEXCOORD2IVPROC sf_glad_glTexCoord2iv = NULL;
+PFNGLTEXCOORD2SPROC sf_glad_glTexCoord2s = NULL;
+PFNGLTEXCOORD2SVPROC sf_glad_glTexCoord2sv = NULL;
+PFNGLTEXCOORD3DPROC sf_glad_glTexCoord3d = NULL;
+PFNGLTEXCOORD3DVPROC sf_glad_glTexCoord3dv = NULL;
+PFNGLTEXCOORD3FPROC sf_glad_glTexCoord3f = NULL;
+PFNGLTEXCOORD3FVPROC sf_glad_glTexCoord3fv = NULL;
+PFNGLTEXCOORD3IPROC sf_glad_glTexCoord3i = NULL;
+PFNGLTEXCOORD3IVPROC sf_glad_glTexCoord3iv = NULL;
+PFNGLTEXCOORD3SPROC sf_glad_glTexCoord3s = NULL;
+PFNGLTEXCOORD3SVPROC sf_glad_glTexCoord3sv = NULL;
+PFNGLTEXCOORD4DPROC sf_glad_glTexCoord4d = NULL;
+PFNGLTEXCOORD4DVPROC sf_glad_glTexCoord4dv = NULL;
+PFNGLTEXCOORD4FPROC sf_glad_glTexCoord4f = NULL;
+PFNGLTEXCOORD4FVPROC sf_glad_glTexCoord4fv = NULL;
+PFNGLTEXCOORD4IPROC sf_glad_glTexCoord4i = NULL;
+PFNGLTEXCOORD4IVPROC sf_glad_glTexCoord4iv = NULL;
+PFNGLTEXCOORD4SPROC sf_glad_glTexCoord4s = NULL;
+PFNGLTEXCOORD4SVPROC sf_glad_glTexCoord4sv = NULL;
+PFNGLTEXCOORDP1UIPROC sf_glad_glTexCoordP1ui = NULL;
+PFNGLTEXCOORDP1UIVPROC sf_glad_glTexCoordP1uiv = NULL;
+PFNGLTEXCOORDP2UIPROC sf_glad_glTexCoordP2ui = NULL;
+PFNGLTEXCOORDP2UIVPROC sf_glad_glTexCoordP2uiv = NULL;
+PFNGLTEXCOORDP3UIPROC sf_glad_glTexCoordP3ui = NULL;
+PFNGLTEXCOORDP3UIVPROC sf_glad_glTexCoordP3uiv = NULL;
+PFNGLTEXCOORDP4UIPROC sf_glad_glTexCoordP4ui = NULL;
+PFNGLTEXCOORDP4UIVPROC sf_glad_glTexCoordP4uiv = NULL;
+PFNGLTEXCOORDPOINTERPROC sf_glad_glTexCoordPointer = NULL;
+PFNGLTEXCOORDPOINTEREXTPROC sf_glad_glTexCoordPointerEXT = NULL;
+PFNGLTEXENVFPROC sf_glad_glTexEnvf = NULL;
+PFNGLTEXENVFVPROC sf_glad_glTexEnvfv = NULL;
+PFNGLTEXENVIPROC sf_glad_glTexEnvi = NULL;
+PFNGLTEXENVIVPROC sf_glad_glTexEnviv = NULL;
+PFNGLTEXGENDPROC sf_glad_glTexGend = NULL;
+PFNGLTEXGENDVPROC sf_glad_glTexGendv = NULL;
+PFNGLTEXGENFPROC sf_glad_glTexGenf = NULL;
+PFNGLTEXGENFVPROC sf_glad_glTexGenfv = NULL;
+PFNGLTEXGENIPROC sf_glad_glTexGeni = NULL;
+PFNGLTEXGENIVPROC sf_glad_glTexGeniv = NULL;
+PFNGLTEXIMAGE1DPROC sf_glad_glTexImage1D = NULL;
+PFNGLTEXIMAGE2DPROC sf_glad_glTexImage2D = NULL;
+PFNGLTEXIMAGE2DMULTISAMPLEPROC sf_glad_glTexImage2DMultisample = NULL;
+PFNGLTEXIMAGE3DPROC sf_glad_glTexImage3D = NULL;
+PFNGLTEXIMAGE3DMULTISAMPLEPROC sf_glad_glTexImage3DMultisample = NULL;
+PFNGLTEXPARAMETERIIVPROC sf_glad_glTexParameterIiv = NULL;
+PFNGLTEXPARAMETERIUIVPROC sf_glad_glTexParameterIuiv = NULL;
+PFNGLTEXPARAMETERFPROC sf_glad_glTexParameterf = NULL;
+PFNGLTEXPARAMETERFVPROC sf_glad_glTexParameterfv = NULL;
+PFNGLTEXPARAMETERIPROC sf_glad_glTexParameteri = NULL;
+PFNGLTEXPARAMETERIVPROC sf_glad_glTexParameteriv = NULL;
+PFNGLTEXSTORAGE1DPROC sf_glad_glTexStorage1D = NULL;
+PFNGLTEXSTORAGE2DPROC sf_glad_glTexStorage2D = NULL;
+PFNGLTEXSTORAGE2DMULTISAMPLEPROC sf_glad_glTexStorage2DMultisample = NULL;
+PFNGLTEXSTORAGE3DPROC sf_glad_glTexStorage3D = NULL;
+PFNGLTEXSTORAGE3DMULTISAMPLEPROC sf_glad_glTexStorage3DMultisample = NULL;
+PFNGLTEXSUBIMAGE1DPROC sf_glad_glTexSubImage1D = NULL;
+PFNGLTEXSUBIMAGE1DEXTPROC sf_glad_glTexSubImage1DEXT = NULL;
+PFNGLTEXSUBIMAGE2DPROC sf_glad_glTexSubImage2D = NULL;
+PFNGLTEXSUBIMAGE2DEXTPROC sf_glad_glTexSubImage2DEXT = NULL;
+PFNGLTEXSUBIMAGE3DPROC sf_glad_glTexSubImage3D = NULL;
+PFNGLTEXTUREBARRIERPROC sf_glad_glTextureBarrier = NULL;
+PFNGLTEXTUREBUFFERPROC sf_glad_glTextureBuffer = NULL;
+PFNGLTEXTUREBUFFERRANGEPROC sf_glad_glTextureBufferRange = NULL;
+PFNGLTEXTUREPARAMETERIIVPROC sf_glad_glTextureParameterIiv = NULL;
+PFNGLTEXTUREPARAMETERIUIVPROC sf_glad_glTextureParameterIuiv = NULL;
+PFNGLTEXTUREPARAMETERFPROC sf_glad_glTextureParameterf = NULL;
+PFNGLTEXTUREPARAMETERFVPROC sf_glad_glTextureParameterfv = NULL;
+PFNGLTEXTUREPARAMETERIPROC sf_glad_glTextureParameteri = NULL;
+PFNGLTEXTUREPARAMETERIVPROC sf_glad_glTextureParameteriv = NULL;
+PFNGLTEXTURESTORAGE1DPROC sf_glad_glTextureStorage1D = NULL;
+PFNGLTEXTURESTORAGE2DPROC sf_glad_glTextureStorage2D = NULL;
+PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC sf_glad_glTextureStorage2DMultisample = NULL;
+PFNGLTEXTURESTORAGE3DPROC sf_glad_glTextureStorage3D = NULL;
+PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC sf_glad_glTextureStorage3DMultisample = NULL;
+PFNGLTEXTURESUBIMAGE1DPROC sf_glad_glTextureSubImage1D = NULL;
+PFNGLTEXTURESUBIMAGE2DPROC sf_glad_glTextureSubImage2D = NULL;
+PFNGLTEXTURESUBIMAGE3DPROC sf_glad_glTextureSubImage3D = NULL;
+PFNGLTEXTUREVIEWPROC sf_glad_glTextureView = NULL;
+PFNGLTRACKMATRIXNVPROC sf_glad_glTrackMatrixNV = NULL;
+PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC sf_glad_glTransformFeedbackBufferBase = NULL;
+PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC sf_glad_glTransformFeedbackBufferRange = NULL;
+PFNGLTRANSFORMFEEDBACKVARYINGSPROC sf_glad_glTransformFeedbackVaryings = NULL;
+PFNGLTRANSLATEDPROC sf_glad_glTranslated = NULL;
+PFNGLTRANSLATEFPROC sf_glad_glTranslatef = NULL;
+PFNGLUNIFORM1DPROC sf_glad_glUniform1d = NULL;
+PFNGLUNIFORM1DVPROC sf_glad_glUniform1dv = NULL;
+PFNGLUNIFORM1FPROC sf_glad_glUniform1f = NULL;
+PFNGLUNIFORM1FARBPROC sf_glad_glUniform1fARB = NULL;
+PFNGLUNIFORM1FVPROC sf_glad_glUniform1fv = NULL;
+PFNGLUNIFORM1FVARBPROC sf_glad_glUniform1fvARB = NULL;
+PFNGLUNIFORM1IPROC sf_glad_glUniform1i = NULL;
+PFNGLUNIFORM1IARBPROC sf_glad_glUniform1iARB = NULL;
+PFNGLUNIFORM1IVPROC sf_glad_glUniform1iv = NULL;
+PFNGLUNIFORM1IVARBPROC sf_glad_glUniform1ivARB = NULL;
+PFNGLUNIFORM1UIPROC sf_glad_glUniform1ui = NULL;
+PFNGLUNIFORM1UIVPROC sf_glad_glUniform1uiv = NULL;
+PFNGLUNIFORM2DPROC sf_glad_glUniform2d = NULL;
+PFNGLUNIFORM2DVPROC sf_glad_glUniform2dv = NULL;
+PFNGLUNIFORM2FPROC sf_glad_glUniform2f = NULL;
+PFNGLUNIFORM2FARBPROC sf_glad_glUniform2fARB = NULL;
+PFNGLUNIFORM2FVPROC sf_glad_glUniform2fv = NULL;
+PFNGLUNIFORM2FVARBPROC sf_glad_glUniform2fvARB = NULL;
+PFNGLUNIFORM2IPROC sf_glad_glUniform2i = NULL;
+PFNGLUNIFORM2IARBPROC sf_glad_glUniform2iARB = NULL;
+PFNGLUNIFORM2IVPROC sf_glad_glUniform2iv = NULL;
+PFNGLUNIFORM2IVARBPROC sf_glad_glUniform2ivARB = NULL;
+PFNGLUNIFORM2UIPROC sf_glad_glUniform2ui = NULL;
+PFNGLUNIFORM2UIVPROC sf_glad_glUniform2uiv = NULL;
+PFNGLUNIFORM3DPROC sf_glad_glUniform3d = NULL;
+PFNGLUNIFORM3DVPROC sf_glad_glUniform3dv = NULL;
+PFNGLUNIFORM3FPROC sf_glad_glUniform3f = NULL;
+PFNGLUNIFORM3FARBPROC sf_glad_glUniform3fARB = NULL;
+PFNGLUNIFORM3FVPROC sf_glad_glUniform3fv = NULL;
+PFNGLUNIFORM3FVARBPROC sf_glad_glUniform3fvARB = NULL;
+PFNGLUNIFORM3IPROC sf_glad_glUniform3i = NULL;
+PFNGLUNIFORM3IARBPROC sf_glad_glUniform3iARB = NULL;
+PFNGLUNIFORM3IVPROC sf_glad_glUniform3iv = NULL;
+PFNGLUNIFORM3IVARBPROC sf_glad_glUniform3ivARB = NULL;
+PFNGLUNIFORM3UIPROC sf_glad_glUniform3ui = NULL;
+PFNGLUNIFORM3UIVPROC sf_glad_glUniform3uiv = NULL;
+PFNGLUNIFORM4DPROC sf_glad_glUniform4d = NULL;
+PFNGLUNIFORM4DVPROC sf_glad_glUniform4dv = NULL;
+PFNGLUNIFORM4FPROC sf_glad_glUniform4f = NULL;
+PFNGLUNIFORM4FARBPROC sf_glad_glUniform4fARB = NULL;
+PFNGLUNIFORM4FVPROC sf_glad_glUniform4fv = NULL;
+PFNGLUNIFORM4FVARBPROC sf_glad_glUniform4fvARB = NULL;
+PFNGLUNIFORM4IPROC sf_glad_glUniform4i = NULL;
+PFNGLUNIFORM4IARBPROC sf_glad_glUniform4iARB = NULL;
+PFNGLUNIFORM4IVPROC sf_glad_glUniform4iv = NULL;
+PFNGLUNIFORM4IVARBPROC sf_glad_glUniform4ivARB = NULL;
+PFNGLUNIFORM4UIPROC sf_glad_glUniform4ui = NULL;
+PFNGLUNIFORM4UIVPROC sf_glad_glUniform4uiv = NULL;
+PFNGLUNIFORMBLOCKBINDINGPROC sf_glad_glUniformBlockBinding = NULL;
+PFNGLUNIFORMMATRIX2DVPROC sf_glad_glUniformMatrix2dv = NULL;
+PFNGLUNIFORMMATRIX2FVPROC sf_glad_glUniformMatrix2fv = NULL;
+PFNGLUNIFORMMATRIX2FVARBPROC sf_glad_glUniformMatrix2fvARB = NULL;
+PFNGLUNIFORMMATRIX2X3DVPROC sf_glad_glUniformMatrix2x3dv = NULL;
+PFNGLUNIFORMMATRIX2X3FVPROC sf_glad_glUniformMatrix2x3fv = NULL;
+PFNGLUNIFORMMATRIX2X4DVPROC sf_glad_glUniformMatrix2x4dv = NULL;
+PFNGLUNIFORMMATRIX2X4FVPROC sf_glad_glUniformMatrix2x4fv = NULL;
+PFNGLUNIFORMMATRIX3DVPROC sf_glad_glUniformMatrix3dv = NULL;
+PFNGLUNIFORMMATRIX3FVPROC sf_glad_glUniformMatrix3fv = NULL;
+PFNGLUNIFORMMATRIX3FVARBPROC sf_glad_glUniformMatrix3fvARB = NULL;
+PFNGLUNIFORMMATRIX3X2DVPROC sf_glad_glUniformMatrix3x2dv = NULL;
+PFNGLUNIFORMMATRIX3X2FVPROC sf_glad_glUniformMatrix3x2fv = NULL;
+PFNGLUNIFORMMATRIX3X4DVPROC sf_glad_glUniformMatrix3x4dv = NULL;
+PFNGLUNIFORMMATRIX3X4FVPROC sf_glad_glUniformMatrix3x4fv = NULL;
+PFNGLUNIFORMMATRIX4DVPROC sf_glad_glUniformMatrix4dv = NULL;
+PFNGLUNIFORMMATRIX4FVPROC sf_glad_glUniformMatrix4fv = NULL;
+PFNGLUNIFORMMATRIX4FVARBPROC sf_glad_glUniformMatrix4fvARB = NULL;
+PFNGLUNIFORMMATRIX4X2DVPROC sf_glad_glUniformMatrix4x2dv = NULL;
+PFNGLUNIFORMMATRIX4X2FVPROC sf_glad_glUniformMatrix4x2fv = NULL;
+PFNGLUNIFORMMATRIX4X3DVPROC sf_glad_glUniformMatrix4x3dv = NULL;
+PFNGLUNIFORMMATRIX4X3FVPROC sf_glad_glUniformMatrix4x3fv = NULL;
+PFNGLUNIFORMSUBROUTINESUIVPROC sf_glad_glUniformSubroutinesuiv = NULL;
+PFNGLUNMAPBUFFERPROC sf_glad_glUnmapBuffer = NULL;
+PFNGLUNMAPBUFFERARBPROC sf_glad_glUnmapBufferARB = NULL;
+PFNGLUNMAPNAMEDBUFFERPROC sf_glad_glUnmapNamedBuffer = NULL;
+PFNGLUSEPROGRAMPROC sf_glad_glUseProgram = NULL;
+PFNGLUSEPROGRAMOBJECTARBPROC sf_glad_glUseProgramObjectARB = NULL;
+PFNGLUSEPROGRAMSTAGESPROC sf_glad_glUseProgramStages = NULL;
+PFNGLVALIDATEPROGRAMPROC sf_glad_glValidateProgram = NULL;
+PFNGLVALIDATEPROGRAMARBPROC sf_glad_glValidateProgramARB = NULL;
+PFNGLVALIDATEPROGRAMPIPELINEPROC sf_glad_glValidateProgramPipeline = NULL;
+PFNGLVERTEX2DPROC sf_glad_glVertex2d = NULL;
+PFNGLVERTEX2DVPROC sf_glad_glVertex2dv = NULL;
+PFNGLVERTEX2FPROC sf_glad_glVertex2f = NULL;
+PFNGLVERTEX2FVPROC sf_glad_glVertex2fv = NULL;
+PFNGLVERTEX2IPROC sf_glad_glVertex2i = NULL;
+PFNGLVERTEX2IVPROC sf_glad_glVertex2iv = NULL;
+PFNGLVERTEX2SPROC sf_glad_glVertex2s = NULL;
+PFNGLVERTEX2SVPROC sf_glad_glVertex2sv = NULL;
+PFNGLVERTEX3DPROC sf_glad_glVertex3d = NULL;
+PFNGLVERTEX3DVPROC sf_glad_glVertex3dv = NULL;
+PFNGLVERTEX3FPROC sf_glad_glVertex3f = NULL;
+PFNGLVERTEX3FVPROC sf_glad_glVertex3fv = NULL;
+PFNGLVERTEX3IPROC sf_glad_glVertex3i = NULL;
+PFNGLVERTEX3IVPROC sf_glad_glVertex3iv = NULL;
+PFNGLVERTEX3SPROC sf_glad_glVertex3s = NULL;
+PFNGLVERTEX3SVPROC sf_glad_glVertex3sv = NULL;
+PFNGLVERTEX4DPROC sf_glad_glVertex4d = NULL;
+PFNGLVERTEX4DVPROC sf_glad_glVertex4dv = NULL;
+PFNGLVERTEX4FPROC sf_glad_glVertex4f = NULL;
+PFNGLVERTEX4FVPROC sf_glad_glVertex4fv = NULL;
+PFNGLVERTEX4IPROC sf_glad_glVertex4i = NULL;
+PFNGLVERTEX4IVPROC sf_glad_glVertex4iv = NULL;
+PFNGLVERTEX4SPROC sf_glad_glVertex4s = NULL;
+PFNGLVERTEX4SVPROC sf_glad_glVertex4sv = NULL;
+PFNGLVERTEXARRAYATTRIBBINDINGPROC sf_glad_glVertexArrayAttribBinding = NULL;
+PFNGLVERTEXARRAYATTRIBFORMATPROC sf_glad_glVertexArrayAttribFormat = NULL;
+PFNGLVERTEXARRAYATTRIBIFORMATPROC sf_glad_glVertexArrayAttribIFormat = NULL;
+PFNGLVERTEXARRAYATTRIBLFORMATPROC sf_glad_glVertexArrayAttribLFormat = NULL;
+PFNGLVERTEXARRAYBINDINGDIVISORPROC sf_glad_glVertexArrayBindingDivisor = NULL;
+PFNGLVERTEXARRAYELEMENTBUFFERPROC sf_glad_glVertexArrayElementBuffer = NULL;
+PFNGLVERTEXARRAYVERTEXBUFFERPROC sf_glad_glVertexArrayVertexBuffer = NULL;
+PFNGLVERTEXARRAYVERTEXBUFFERSPROC sf_glad_glVertexArrayVertexBuffers = NULL;
+PFNGLVERTEXATTRIB1DPROC sf_glad_glVertexAttrib1d = NULL;
+PFNGLVERTEXATTRIB1DARBPROC sf_glad_glVertexAttrib1dARB = NULL;
+PFNGLVERTEXATTRIB1DNVPROC sf_glad_glVertexAttrib1dNV = NULL;
+PFNGLVERTEXATTRIB1DVPROC sf_glad_glVertexAttrib1dv = NULL;
+PFNGLVERTEXATTRIB1DVARBPROC sf_glad_glVertexAttrib1dvARB = NULL;
+PFNGLVERTEXATTRIB1DVNVPROC sf_glad_glVertexAttrib1dvNV = NULL;
+PFNGLVERTEXATTRIB1FPROC sf_glad_glVertexAttrib1f = NULL;
+PFNGLVERTEXATTRIB1FARBPROC sf_glad_glVertexAttrib1fARB = NULL;
+PFNGLVERTEXATTRIB1FNVPROC sf_glad_glVertexAttrib1fNV = NULL;
+PFNGLVERTEXATTRIB1FVPROC sf_glad_glVertexAttrib1fv = NULL;
+PFNGLVERTEXATTRIB1FVARBPROC sf_glad_glVertexAttrib1fvARB = NULL;
+PFNGLVERTEXATTRIB1FVNVPROC sf_glad_glVertexAttrib1fvNV = NULL;
+PFNGLVERTEXATTRIB1SPROC sf_glad_glVertexAttrib1s = NULL;
+PFNGLVERTEXATTRIB1SARBPROC sf_glad_glVertexAttrib1sARB = NULL;
+PFNGLVERTEXATTRIB1SNVPROC sf_glad_glVertexAttrib1sNV = NULL;
+PFNGLVERTEXATTRIB1SVPROC sf_glad_glVertexAttrib1sv = NULL;
+PFNGLVERTEXATTRIB1SVARBPROC sf_glad_glVertexAttrib1svARB = NULL;
+PFNGLVERTEXATTRIB1SVNVPROC sf_glad_glVertexAttrib1svNV = NULL;
+PFNGLVERTEXATTRIB2DPROC sf_glad_glVertexAttrib2d = NULL;
+PFNGLVERTEXATTRIB2DARBPROC sf_glad_glVertexAttrib2dARB = NULL;
+PFNGLVERTEXATTRIB2DNVPROC sf_glad_glVertexAttrib2dNV = NULL;
+PFNGLVERTEXATTRIB2DVPROC sf_glad_glVertexAttrib2dv = NULL;
+PFNGLVERTEXATTRIB2DVARBPROC sf_glad_glVertexAttrib2dvARB = NULL;
+PFNGLVERTEXATTRIB2DVNVPROC sf_glad_glVertexAttrib2dvNV = NULL;
+PFNGLVERTEXATTRIB2FPROC sf_glad_glVertexAttrib2f = NULL;
+PFNGLVERTEXATTRIB2FARBPROC sf_glad_glVertexAttrib2fARB = NULL;
+PFNGLVERTEXATTRIB2FNVPROC sf_glad_glVertexAttrib2fNV = NULL;
+PFNGLVERTEXATTRIB2FVPROC sf_glad_glVertexAttrib2fv = NULL;
+PFNGLVERTEXATTRIB2FVARBPROC sf_glad_glVertexAttrib2fvARB = NULL;
+PFNGLVERTEXATTRIB2FVNVPROC sf_glad_glVertexAttrib2fvNV = NULL;
+PFNGLVERTEXATTRIB2SPROC sf_glad_glVertexAttrib2s = NULL;
+PFNGLVERTEXATTRIB2SARBPROC sf_glad_glVertexAttrib2sARB = NULL;
+PFNGLVERTEXATTRIB2SNVPROC sf_glad_glVertexAttrib2sNV = NULL;
+PFNGLVERTEXATTRIB2SVPROC sf_glad_glVertexAttrib2sv = NULL;
+PFNGLVERTEXATTRIB2SVARBPROC sf_glad_glVertexAttrib2svARB = NULL;
+PFNGLVERTEXATTRIB2SVNVPROC sf_glad_glVertexAttrib2svNV = NULL;
+PFNGLVERTEXATTRIB3DPROC sf_glad_glVertexAttrib3d = NULL;
+PFNGLVERTEXATTRIB3DARBPROC sf_glad_glVertexAttrib3dARB = NULL;
+PFNGLVERTEXATTRIB3DNVPROC sf_glad_glVertexAttrib3dNV = NULL;
+PFNGLVERTEXATTRIB3DVPROC sf_glad_glVertexAttrib3dv = NULL;
+PFNGLVERTEXATTRIB3DVARBPROC sf_glad_glVertexAttrib3dvARB = NULL;
+PFNGLVERTEXATTRIB3DVNVPROC sf_glad_glVertexAttrib3dvNV = NULL;
+PFNGLVERTEXATTRIB3FPROC sf_glad_glVertexAttrib3f = NULL;
+PFNGLVERTEXATTRIB3FARBPROC sf_glad_glVertexAttrib3fARB = NULL;
+PFNGLVERTEXATTRIB3FNVPROC sf_glad_glVertexAttrib3fNV = NULL;
+PFNGLVERTEXATTRIB3FVPROC sf_glad_glVertexAttrib3fv = NULL;
+PFNGLVERTEXATTRIB3FVARBPROC sf_glad_glVertexAttrib3fvARB = NULL;
+PFNGLVERTEXATTRIB3FVNVPROC sf_glad_glVertexAttrib3fvNV = NULL;
+PFNGLVERTEXATTRIB3SPROC sf_glad_glVertexAttrib3s = NULL;
+PFNGLVERTEXATTRIB3SARBPROC sf_glad_glVertexAttrib3sARB = NULL;
+PFNGLVERTEXATTRIB3SNVPROC sf_glad_glVertexAttrib3sNV = NULL;
+PFNGLVERTEXATTRIB3SVPROC sf_glad_glVertexAttrib3sv = NULL;
+PFNGLVERTEXATTRIB3SVARBPROC sf_glad_glVertexAttrib3svARB = NULL;
+PFNGLVERTEXATTRIB3SVNVPROC sf_glad_glVertexAttrib3svNV = NULL;
+PFNGLVERTEXATTRIB4NBVPROC sf_glad_glVertexAttrib4Nbv = NULL;
+PFNGLVERTEXATTRIB4NBVARBPROC sf_glad_glVertexAttrib4NbvARB = NULL;
+PFNGLVERTEXATTRIB4NIVPROC sf_glad_glVertexAttrib4Niv = NULL;
+PFNGLVERTEXATTRIB4NIVARBPROC sf_glad_glVertexAttrib4NivARB = NULL;
+PFNGLVERTEXATTRIB4NSVPROC sf_glad_glVertexAttrib4Nsv = NULL;
+PFNGLVERTEXATTRIB4NSVARBPROC sf_glad_glVertexAttrib4NsvARB = NULL;
+PFNGLVERTEXATTRIB4NUBPROC sf_glad_glVertexAttrib4Nub = NULL;
+PFNGLVERTEXATTRIB4NUBARBPROC sf_glad_glVertexAttrib4NubARB = NULL;
+PFNGLVERTEXATTRIB4NUBVPROC sf_glad_glVertexAttrib4Nubv = NULL;
+PFNGLVERTEXATTRIB4NUBVARBPROC sf_glad_glVertexAttrib4NubvARB = NULL;
+PFNGLVERTEXATTRIB4NUIVPROC sf_glad_glVertexAttrib4Nuiv = NULL;
+PFNGLVERTEXATTRIB4NUIVARBPROC sf_glad_glVertexAttrib4NuivARB = NULL;
+PFNGLVERTEXATTRIB4NUSVPROC sf_glad_glVertexAttrib4Nusv = NULL;
+PFNGLVERTEXATTRIB4NUSVARBPROC sf_glad_glVertexAttrib4NusvARB = NULL;
+PFNGLVERTEXATTRIB4BVPROC sf_glad_glVertexAttrib4bv = NULL;
+PFNGLVERTEXATTRIB4BVARBPROC sf_glad_glVertexAttrib4bvARB = NULL;
+PFNGLVERTEXATTRIB4DPROC sf_glad_glVertexAttrib4d = NULL;
+PFNGLVERTEXATTRIB4DARBPROC sf_glad_glVertexAttrib4dARB = NULL;
+PFNGLVERTEXATTRIB4DNVPROC sf_glad_glVertexAttrib4dNV = NULL;
+PFNGLVERTEXATTRIB4DVPROC sf_glad_glVertexAttrib4dv = NULL;
+PFNGLVERTEXATTRIB4DVARBPROC sf_glad_glVertexAttrib4dvARB = NULL;
+PFNGLVERTEXATTRIB4DVNVPROC sf_glad_glVertexAttrib4dvNV = NULL;
+PFNGLVERTEXATTRIB4FPROC sf_glad_glVertexAttrib4f = NULL;
+PFNGLVERTEXATTRIB4FARBPROC sf_glad_glVertexAttrib4fARB = NULL;
+PFNGLVERTEXATTRIB4FNVPROC sf_glad_glVertexAttrib4fNV = NULL;
+PFNGLVERTEXATTRIB4FVPROC sf_glad_glVertexAttrib4fv = NULL;
+PFNGLVERTEXATTRIB4FVARBPROC sf_glad_glVertexAttrib4fvARB = NULL;
+PFNGLVERTEXATTRIB4FVNVPROC sf_glad_glVertexAttrib4fvNV = NULL;
+PFNGLVERTEXATTRIB4IVPROC sf_glad_glVertexAttrib4iv = NULL;
+PFNGLVERTEXATTRIB4IVARBPROC sf_glad_glVertexAttrib4ivARB = NULL;
+PFNGLVERTEXATTRIB4SPROC sf_glad_glVertexAttrib4s = NULL;
+PFNGLVERTEXATTRIB4SARBPROC sf_glad_glVertexAttrib4sARB = NULL;
+PFNGLVERTEXATTRIB4SNVPROC sf_glad_glVertexAttrib4sNV = NULL;
+PFNGLVERTEXATTRIB4SVPROC sf_glad_glVertexAttrib4sv = NULL;
+PFNGLVERTEXATTRIB4SVARBPROC sf_glad_glVertexAttrib4svARB = NULL;
+PFNGLVERTEXATTRIB4SVNVPROC sf_glad_glVertexAttrib4svNV = NULL;
+PFNGLVERTEXATTRIB4UBNVPROC sf_glad_glVertexAttrib4ubNV = NULL;
+PFNGLVERTEXATTRIB4UBVPROC sf_glad_glVertexAttrib4ubv = NULL;
+PFNGLVERTEXATTRIB4UBVARBPROC sf_glad_glVertexAttrib4ubvARB = NULL;
+PFNGLVERTEXATTRIB4UBVNVPROC sf_glad_glVertexAttrib4ubvNV = NULL;
+PFNGLVERTEXATTRIB4UIVPROC sf_glad_glVertexAttrib4uiv = NULL;
+PFNGLVERTEXATTRIB4UIVARBPROC sf_glad_glVertexAttrib4uivARB = NULL;
+PFNGLVERTEXATTRIB4USVPROC sf_glad_glVertexAttrib4usv = NULL;
+PFNGLVERTEXATTRIB4USVARBPROC sf_glad_glVertexAttrib4usvARB = NULL;
+PFNGLVERTEXATTRIBBINDINGPROC sf_glad_glVertexAttribBinding = NULL;
+PFNGLVERTEXATTRIBDIVISORPROC sf_glad_glVertexAttribDivisor = NULL;
+PFNGLVERTEXATTRIBFORMATPROC sf_glad_glVertexAttribFormat = NULL;
+PFNGLVERTEXATTRIBI1IPROC sf_glad_glVertexAttribI1i = NULL;
+PFNGLVERTEXATTRIBI1IVPROC sf_glad_glVertexAttribI1iv = NULL;
+PFNGLVERTEXATTRIBI1UIPROC sf_glad_glVertexAttribI1ui = NULL;
+PFNGLVERTEXATTRIBI1UIVPROC sf_glad_glVertexAttribI1uiv = NULL;
+PFNGLVERTEXATTRIBI2IPROC sf_glad_glVertexAttribI2i = NULL;
+PFNGLVERTEXATTRIBI2IVPROC sf_glad_glVertexAttribI2iv = NULL;
+PFNGLVERTEXATTRIBI2UIPROC sf_glad_glVertexAttribI2ui = NULL;
+PFNGLVERTEXATTRIBI2UIVPROC sf_glad_glVertexAttribI2uiv = NULL;
+PFNGLVERTEXATTRIBI3IPROC sf_glad_glVertexAttribI3i = NULL;
+PFNGLVERTEXATTRIBI3IVPROC sf_glad_glVertexAttribI3iv = NULL;
+PFNGLVERTEXATTRIBI3UIPROC sf_glad_glVertexAttribI3ui = NULL;
+PFNGLVERTEXATTRIBI3UIVPROC sf_glad_glVertexAttribI3uiv = NULL;
+PFNGLVERTEXATTRIBI4BVPROC sf_glad_glVertexAttribI4bv = NULL;
+PFNGLVERTEXATTRIBI4IPROC sf_glad_glVertexAttribI4i = NULL;
+PFNGLVERTEXATTRIBI4IVPROC sf_glad_glVertexAttribI4iv = NULL;
+PFNGLVERTEXATTRIBI4SVPROC sf_glad_glVertexAttribI4sv = NULL;
+PFNGLVERTEXATTRIBI4UBVPROC sf_glad_glVertexAttribI4ubv = NULL;
+PFNGLVERTEXATTRIBI4UIPROC sf_glad_glVertexAttribI4ui = NULL;
+PFNGLVERTEXATTRIBI4UIVPROC sf_glad_glVertexAttribI4uiv = NULL;
+PFNGLVERTEXATTRIBI4USVPROC sf_glad_glVertexAttribI4usv = NULL;
+PFNGLVERTEXATTRIBIFORMATPROC sf_glad_glVertexAttribIFormat = NULL;
+PFNGLVERTEXATTRIBIPOINTERPROC sf_glad_glVertexAttribIPointer = NULL;
+PFNGLVERTEXATTRIBL1DPROC sf_glad_glVertexAttribL1d = NULL;
+PFNGLVERTEXATTRIBL1DVPROC sf_glad_glVertexAttribL1dv = NULL;
+PFNGLVERTEXATTRIBL2DPROC sf_glad_glVertexAttribL2d = NULL;
+PFNGLVERTEXATTRIBL2DVPROC sf_glad_glVertexAttribL2dv = NULL;
+PFNGLVERTEXATTRIBL3DPROC sf_glad_glVertexAttribL3d = NULL;
+PFNGLVERTEXATTRIBL3DVPROC sf_glad_glVertexAttribL3dv = NULL;
+PFNGLVERTEXATTRIBL4DPROC sf_glad_glVertexAttribL4d = NULL;
+PFNGLVERTEXATTRIBL4DVPROC sf_glad_glVertexAttribL4dv = NULL;
+PFNGLVERTEXATTRIBLFORMATPROC sf_glad_glVertexAttribLFormat = NULL;
+PFNGLVERTEXATTRIBLPOINTERPROC sf_glad_glVertexAttribLPointer = NULL;
+PFNGLVERTEXATTRIBP1UIPROC sf_glad_glVertexAttribP1ui = NULL;
+PFNGLVERTEXATTRIBP1UIVPROC sf_glad_glVertexAttribP1uiv = NULL;
+PFNGLVERTEXATTRIBP2UIPROC sf_glad_glVertexAttribP2ui = NULL;
+PFNGLVERTEXATTRIBP2UIVPROC sf_glad_glVertexAttribP2uiv = NULL;
+PFNGLVERTEXATTRIBP3UIPROC sf_glad_glVertexAttribP3ui = NULL;
+PFNGLVERTEXATTRIBP3UIVPROC sf_glad_glVertexAttribP3uiv = NULL;
+PFNGLVERTEXATTRIBP4UIPROC sf_glad_glVertexAttribP4ui = NULL;
+PFNGLVERTEXATTRIBP4UIVPROC sf_glad_glVertexAttribP4uiv = NULL;
+PFNGLVERTEXATTRIBPOINTERPROC sf_glad_glVertexAttribPointer = NULL;
+PFNGLVERTEXATTRIBPOINTERARBPROC sf_glad_glVertexAttribPointerARB = NULL;
+PFNGLVERTEXATTRIBPOINTERNVPROC sf_glad_glVertexAttribPointerNV = NULL;
+PFNGLVERTEXATTRIBS1DVNVPROC sf_glad_glVertexAttribs1dvNV = NULL;
+PFNGLVERTEXATTRIBS1FVNVPROC sf_glad_glVertexAttribs1fvNV = NULL;
+PFNGLVERTEXATTRIBS1SVNVPROC sf_glad_glVertexAttribs1svNV = NULL;
+PFNGLVERTEXATTRIBS2DVNVPROC sf_glad_glVertexAttribs2dvNV = NULL;
+PFNGLVERTEXATTRIBS2FVNVPROC sf_glad_glVertexAttribs2fvNV = NULL;
+PFNGLVERTEXATTRIBS2SVNVPROC sf_glad_glVertexAttribs2svNV = NULL;
+PFNGLVERTEXATTRIBS3DVNVPROC sf_glad_glVertexAttribs3dvNV = NULL;
+PFNGLVERTEXATTRIBS3FVNVPROC sf_glad_glVertexAttribs3fvNV = NULL;
+PFNGLVERTEXATTRIBS3SVNVPROC sf_glad_glVertexAttribs3svNV = NULL;
+PFNGLVERTEXATTRIBS4DVNVPROC sf_glad_glVertexAttribs4dvNV = NULL;
+PFNGLVERTEXATTRIBS4FVNVPROC sf_glad_glVertexAttribs4fvNV = NULL;
+PFNGLVERTEXATTRIBS4SVNVPROC sf_glad_glVertexAttribs4svNV = NULL;
+PFNGLVERTEXATTRIBS4UBVNVPROC sf_glad_glVertexAttribs4ubvNV = NULL;
+PFNGLVERTEXBINDINGDIVISORPROC sf_glad_glVertexBindingDivisor = NULL;
+PFNGLVERTEXP2UIPROC sf_glad_glVertexP2ui = NULL;
+PFNGLVERTEXP2UIVPROC sf_glad_glVertexP2uiv = NULL;
+PFNGLVERTEXP3UIPROC sf_glad_glVertexP3ui = NULL;
+PFNGLVERTEXP3UIVPROC sf_glad_glVertexP3uiv = NULL;
+PFNGLVERTEXP4UIPROC sf_glad_glVertexP4ui = NULL;
+PFNGLVERTEXP4UIVPROC sf_glad_glVertexP4uiv = NULL;
+PFNGLVERTEXPOINTERPROC sf_glad_glVertexPointer = NULL;
+PFNGLVERTEXPOINTEREXTPROC sf_glad_glVertexPointerEXT = NULL;
+PFNGLVIEWPORTPROC sf_glad_glViewport = NULL;
+PFNGLVIEWPORTARRAYVPROC sf_glad_glViewportArrayv = NULL;
+PFNGLVIEWPORTINDEXEDFPROC sf_glad_glViewportIndexedf = NULL;
+PFNGLVIEWPORTINDEXEDFVPROC sf_glad_glViewportIndexedfv = NULL;
+PFNGLWAITSYNCPROC sf_glad_glWaitSync = NULL;
+PFNGLWINDOWPOS2DPROC sf_glad_glWindowPos2d = NULL;
+PFNGLWINDOWPOS2DVPROC sf_glad_glWindowPos2dv = NULL;
+PFNGLWINDOWPOS2FPROC sf_glad_glWindowPos2f = NULL;
+PFNGLWINDOWPOS2FVPROC sf_glad_glWindowPos2fv = NULL;
+PFNGLWINDOWPOS2IPROC sf_glad_glWindowPos2i = NULL;
+PFNGLWINDOWPOS2IVPROC sf_glad_glWindowPos2iv = NULL;
+PFNGLWINDOWPOS2SPROC sf_glad_glWindowPos2s = NULL;
+PFNGLWINDOWPOS2SVPROC sf_glad_glWindowPos2sv = NULL;
+PFNGLWINDOWPOS3DPROC sf_glad_glWindowPos3d = NULL;
+PFNGLWINDOWPOS3DVPROC sf_glad_glWindowPos3dv = NULL;
+PFNGLWINDOWPOS3FPROC sf_glad_glWindowPos3f = NULL;
+PFNGLWINDOWPOS3FVPROC sf_glad_glWindowPos3fv = NULL;
+PFNGLWINDOWPOS3IPROC sf_glad_glWindowPos3i = NULL;
+PFNGLWINDOWPOS3IVPROC sf_glad_glWindowPos3iv = NULL;
+PFNGLWINDOWPOS3SPROC sf_glad_glWindowPos3s = NULL;
+PFNGLWINDOWPOS3SVPROC sf_glad_glWindowPos3sv = NULL;
+PFNGLALPHAFUNCXPROC sf_glad_glAlphaFuncx = NULL;
+PFNGLBINDFRAMEBUFFEROESPROC sf_glad_glBindFramebufferOES = NULL;
+PFNGLBINDRENDERBUFFEROESPROC sf_glad_glBindRenderbufferOES = NULL;
+PFNGLBLENDEQUATIONOESPROC sf_glad_glBlendEquationOES = NULL;
+PFNGLBLENDEQUATIONSEPARATEOESPROC sf_glad_glBlendEquationSeparateOES = NULL;
+PFNGLBLENDFUNCSEPARATEOESPROC sf_glad_glBlendFuncSeparateOES = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSOESPROC sf_glad_glCheckFramebufferStatusOES = NULL;
+PFNGLCLEARCOLORXPROC sf_glad_glClearColorx = NULL;
+PFNGLCLEARDEPTHXPROC sf_glad_glClearDepthx = NULL;
+PFNGLCLIPPLANEFPROC sf_glad_glClipPlanef = NULL;
+PFNGLCLIPPLANEXPROC sf_glad_glClipPlanex = NULL;
+PFNGLCOLOR4XPROC sf_glad_glColor4x = NULL;
+PFNGLDELETEFRAMEBUFFERSOESPROC sf_glad_glDeleteFramebuffersOES = NULL;
+PFNGLDELETERENDERBUFFERSOESPROC sf_glad_glDeleteRenderbuffersOES = NULL;
+PFNGLDEPTHRANGEXPROC sf_glad_glDepthRangex = NULL;
+PFNGLFOGXPROC sf_glad_glFogx = NULL;
+PFNGLFOGXVPROC sf_glad_glFogxv = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFEROESPROC sf_glad_glFramebufferRenderbufferOES = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DOESPROC sf_glad_glFramebufferTexture2DOES = NULL;
+PFNGLFRUSTUMFPROC sf_glad_glFrustumf = NULL;
+PFNGLFRUSTUMXPROC sf_glad_glFrustumx = NULL;
+PFNGLGENFRAMEBUFFERSOESPROC sf_glad_glGenFramebuffersOES = NULL;
+PFNGLGENRENDERBUFFERSOESPROC sf_glad_glGenRenderbuffersOES = NULL;
+PFNGLGENERATEMIPMAPOESPROC sf_glad_glGenerateMipmapOES = NULL;
+PFNGLGETCLIPPLANEFPROC sf_glad_glGetClipPlanef = NULL;
+PFNGLGETCLIPPLANEXPROC sf_glad_glGetClipPlanex = NULL;
+PFNGLGETFIXEDVPROC sf_glad_glGetFixedv = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC sf_glad_glGetFramebufferAttachmentParameterivOES = NULL;
+PFNGLGETLIGHTXVPROC sf_glad_glGetLightxv = NULL;
+PFNGLGETMATERIALXVPROC sf_glad_glGetMaterialxv = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVOESPROC sf_glad_glGetRenderbufferParameterivOES = NULL;
+PFNGLGETTEXENVXVPROC sf_glad_glGetTexEnvxv = NULL;
+PFNGLGETTEXPARAMETERXVPROC sf_glad_glGetTexParameterxv = NULL;
+PFNGLISFRAMEBUFFEROESPROC sf_glad_glIsFramebufferOES = NULL;
+PFNGLISRENDERBUFFEROESPROC sf_glad_glIsRenderbufferOES = NULL;
+PFNGLLIGHTMODELXPROC sf_glad_glLightModelx = NULL;
+PFNGLLIGHTMODELXVPROC sf_glad_glLightModelxv = NULL;
+PFNGLLIGHTXPROC sf_glad_glLightx = NULL;
+PFNGLLIGHTXVPROC sf_glad_glLightxv = NULL;
+PFNGLLINEWIDTHXPROC sf_glad_glLineWidthx = NULL;
+PFNGLLOADMATRIXXPROC sf_glad_glLoadMatrixx = NULL;
+PFNGLMATERIALXPROC sf_glad_glMaterialx = NULL;
+PFNGLMATERIALXVPROC sf_glad_glMaterialxv = NULL;
+PFNGLMULTMATRIXXPROC sf_glad_glMultMatrixx = NULL;
+PFNGLMULTITEXCOORD4XPROC sf_glad_glMultiTexCoord4x = NULL;
+PFNGLNORMAL3XPROC sf_glad_glNormal3x = NULL;
+PFNGLORTHOFPROC sf_glad_glOrthof = NULL;
+PFNGLORTHOXPROC sf_glad_glOrthox = NULL;
+PFNGLPOINTPARAMETERXPROC sf_glad_glPointParameterx = NULL;
+PFNGLPOINTPARAMETERXVPROC sf_glad_glPointParameterxv = NULL;
+PFNGLPOINTSIZEXPROC sf_glad_glPointSizex = NULL;
+PFNGLPOLYGONOFFSETXPROC sf_glad_glPolygonOffsetx = NULL;
+PFNGLRENDERBUFFERSTORAGEOESPROC sf_glad_glRenderbufferStorageOES = NULL;
+PFNGLROTATEXPROC sf_glad_glRotatex = NULL;
+PFNGLSAMPLECOVERAGEXPROC sf_glad_glSampleCoveragex = NULL;
+PFNGLSCALEXPROC sf_glad_glScalex = NULL;
+PFNGLTEXENVXPROC sf_glad_glTexEnvx = NULL;
+PFNGLTEXENVXVPROC sf_glad_glTexEnvxv = NULL;
+PFNGLTEXPARAMETERXPROC sf_glad_glTexParameterx = NULL;
+PFNGLTEXPARAMETERXVPROC sf_glad_glTexParameterxv = NULL;
+PFNGLTRANSLATEXPROC sf_glad_glTranslatex = NULL;
+
+
+static void sf_glad_gl_load_GL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_1_0) return;
+ sf_glad_glAccum = (PFNGLACCUMPROC) load(userptr, "glAccum");
+ sf_glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc");
+ sf_glad_glBegin = (PFNGLBEGINPROC) load(userptr, "glBegin");
+ sf_glad_glBitmap = (PFNGLBITMAPPROC) load(userptr, "glBitmap");
+ sf_glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc");
+ sf_glad_glCallList = (PFNGLCALLLISTPROC) load(userptr, "glCallList");
+ sf_glad_glCallLists = (PFNGLCALLLISTSPROC) load(userptr, "glCallLists");
+ sf_glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear");
+ sf_glad_glClearAccum = (PFNGLCLEARACCUMPROC) load(userptr, "glClearAccum");
+ sf_glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor");
+ sf_glad_glClearDepth = (PFNGLCLEARDEPTHPROC) load(userptr, "glClearDepth");
+ sf_glad_glClearIndex = (PFNGLCLEARINDEXPROC) load(userptr, "glClearIndex");
+ sf_glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil");
+ sf_glad_glClipPlane = (PFNGLCLIPPLANEPROC) load(userptr, "glClipPlane");
+ sf_glad_glColor3b = (PFNGLCOLOR3BPROC) load(userptr, "glColor3b");
+ sf_glad_glColor3bv = (PFNGLCOLOR3BVPROC) load(userptr, "glColor3bv");
+ sf_glad_glColor3d = (PFNGLCOLOR3DPROC) load(userptr, "glColor3d");
+ sf_glad_glColor3dv = (PFNGLCOLOR3DVPROC) load(userptr, "glColor3dv");
+ sf_glad_glColor3f = (PFNGLCOLOR3FPROC) load(userptr, "glColor3f");
+ sf_glad_glColor3fv = (PFNGLCOLOR3FVPROC) load(userptr, "glColor3fv");
+ sf_glad_glColor3i = (PFNGLCOLOR3IPROC) load(userptr, "glColor3i");
+ sf_glad_glColor3iv = (PFNGLCOLOR3IVPROC) load(userptr, "glColor3iv");
+ sf_glad_glColor3s = (PFNGLCOLOR3SPROC) load(userptr, "glColor3s");
+ sf_glad_glColor3sv = (PFNGLCOLOR3SVPROC) load(userptr, "glColor3sv");
+ sf_glad_glColor3ub = (PFNGLCOLOR3UBPROC) load(userptr, "glColor3ub");
+ sf_glad_glColor3ubv = (PFNGLCOLOR3UBVPROC) load(userptr, "glColor3ubv");
+ sf_glad_glColor3ui = (PFNGLCOLOR3UIPROC) load(userptr, "glColor3ui");
+ sf_glad_glColor3uiv = (PFNGLCOLOR3UIVPROC) load(userptr, "glColor3uiv");
+ sf_glad_glColor3us = (PFNGLCOLOR3USPROC) load(userptr, "glColor3us");
+ sf_glad_glColor3usv = (PFNGLCOLOR3USVPROC) load(userptr, "glColor3usv");
+ sf_glad_glColor4b = (PFNGLCOLOR4BPROC) load(userptr, "glColor4b");
+ sf_glad_glColor4bv = (PFNGLCOLOR4BVPROC) load(userptr, "glColor4bv");
+ sf_glad_glColor4d = (PFNGLCOLOR4DPROC) load(userptr, "glColor4d");
+ sf_glad_glColor4dv = (PFNGLCOLOR4DVPROC) load(userptr, "glColor4dv");
+ sf_glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f");
+ sf_glad_glColor4fv = (PFNGLCOLOR4FVPROC) load(userptr, "glColor4fv");
+ sf_glad_glColor4i = (PFNGLCOLOR4IPROC) load(userptr, "glColor4i");
+ sf_glad_glColor4iv = (PFNGLCOLOR4IVPROC) load(userptr, "glColor4iv");
+ sf_glad_glColor4s = (PFNGLCOLOR4SPROC) load(userptr, "glColor4s");
+ sf_glad_glColor4sv = (PFNGLCOLOR4SVPROC) load(userptr, "glColor4sv");
+ sf_glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub");
+ sf_glad_glColor4ubv = (PFNGLCOLOR4UBVPROC) load(userptr, "glColor4ubv");
+ sf_glad_glColor4ui = (PFNGLCOLOR4UIPROC) load(userptr, "glColor4ui");
+ sf_glad_glColor4uiv = (PFNGLCOLOR4UIVPROC) load(userptr, "glColor4uiv");
+ sf_glad_glColor4us = (PFNGLCOLOR4USPROC) load(userptr, "glColor4us");
+ sf_glad_glColor4usv = (PFNGLCOLOR4USVPROC) load(userptr, "glColor4usv");
+ sf_glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask");
+ sf_glad_glColorMaterial = (PFNGLCOLORMATERIALPROC) load(userptr, "glColorMaterial");
+ sf_glad_glCopyPixels = (PFNGLCOPYPIXELSPROC) load(userptr, "glCopyPixels");
+ sf_glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace");
+ sf_glad_glDeleteLists = (PFNGLDELETELISTSPROC) load(userptr, "glDeleteLists");
+ sf_glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc");
+ sf_glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask");
+ sf_glad_glDepthRange = (PFNGLDEPTHRANGEPROC) load(userptr, "glDepthRange");
+ sf_glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable");
+ sf_glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC) load(userptr, "glDrawBuffer");
+ sf_glad_glDrawPixels = (PFNGLDRAWPIXELSPROC) load(userptr, "glDrawPixels");
+ sf_glad_glEdgeFlag = (PFNGLEDGEFLAGPROC) load(userptr, "glEdgeFlag");
+ sf_glad_glEdgeFlagv = (PFNGLEDGEFLAGVPROC) load(userptr, "glEdgeFlagv");
+ sf_glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable");
+ sf_glad_glEnd = (PFNGLENDPROC) load(userptr, "glEnd");
+ sf_glad_glEndList = (PFNGLENDLISTPROC) load(userptr, "glEndList");
+ sf_glad_glEvalCoord1d = (PFNGLEVALCOORD1DPROC) load(userptr, "glEvalCoord1d");
+ sf_glad_glEvalCoord1dv = (PFNGLEVALCOORD1DVPROC) load(userptr, "glEvalCoord1dv");
+ sf_glad_glEvalCoord1f = (PFNGLEVALCOORD1FPROC) load(userptr, "glEvalCoord1f");
+ sf_glad_glEvalCoord1fv = (PFNGLEVALCOORD1FVPROC) load(userptr, "glEvalCoord1fv");
+ sf_glad_glEvalCoord2d = (PFNGLEVALCOORD2DPROC) load(userptr, "glEvalCoord2d");
+ sf_glad_glEvalCoord2dv = (PFNGLEVALCOORD2DVPROC) load(userptr, "glEvalCoord2dv");
+ sf_glad_glEvalCoord2f = (PFNGLEVALCOORD2FPROC) load(userptr, "glEvalCoord2f");
+ sf_glad_glEvalCoord2fv = (PFNGLEVALCOORD2FVPROC) load(userptr, "glEvalCoord2fv");
+ sf_glad_glEvalMesh1 = (PFNGLEVALMESH1PROC) load(userptr, "glEvalMesh1");
+ sf_glad_glEvalMesh2 = (PFNGLEVALMESH2PROC) load(userptr, "glEvalMesh2");
+ sf_glad_glEvalPoint1 = (PFNGLEVALPOINT1PROC) load(userptr, "glEvalPoint1");
+ sf_glad_glEvalPoint2 = (PFNGLEVALPOINT2PROC) load(userptr, "glEvalPoint2");
+ sf_glad_glFeedbackBuffer = (PFNGLFEEDBACKBUFFERPROC) load(userptr, "glFeedbackBuffer");
+ sf_glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish");
+ sf_glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush");
+ sf_glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf");
+ sf_glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv");
+ sf_glad_glFogi = (PFNGLFOGIPROC) load(userptr, "glFogi");
+ sf_glad_glFogiv = (PFNGLFOGIVPROC) load(userptr, "glFogiv");
+ sf_glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace");
+ sf_glad_glFrustum = (PFNGLFRUSTUMPROC) load(userptr, "glFrustum");
+ sf_glad_glGenLists = (PFNGLGENLISTSPROC) load(userptr, "glGenLists");
+ sf_glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv");
+ sf_glad_glGetClipPlane = (PFNGLGETCLIPPLANEPROC) load(userptr, "glGetClipPlane");
+ sf_glad_glGetDoublev = (PFNGLGETDOUBLEVPROC) load(userptr, "glGetDoublev");
+ sf_glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError");
+ sf_glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv");
+ sf_glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv");
+ sf_glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv");
+ sf_glad_glGetLightiv = (PFNGLGETLIGHTIVPROC) load(userptr, "glGetLightiv");
+ sf_glad_glGetMapdv = (PFNGLGETMAPDVPROC) load(userptr, "glGetMapdv");
+ sf_glad_glGetMapfv = (PFNGLGETMAPFVPROC) load(userptr, "glGetMapfv");
+ sf_glad_glGetMapiv = (PFNGLGETMAPIVPROC) load(userptr, "glGetMapiv");
+ sf_glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv");
+ sf_glad_glGetMaterialiv = (PFNGLGETMATERIALIVPROC) load(userptr, "glGetMaterialiv");
+ sf_glad_glGetPixelMapfv = (PFNGLGETPIXELMAPFVPROC) load(userptr, "glGetPixelMapfv");
+ sf_glad_glGetPixelMapuiv = (PFNGLGETPIXELMAPUIVPROC) load(userptr, "glGetPixelMapuiv");
+ sf_glad_glGetPixelMapusv = (PFNGLGETPIXELMAPUSVPROC) load(userptr, "glGetPixelMapusv");
+ sf_glad_glGetPolygonStipple = (PFNGLGETPOLYGONSTIPPLEPROC) load(userptr, "glGetPolygonStipple");
+ sf_glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ sf_glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv");
+ sf_glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv");
+ sf_glad_glGetTexGendv = (PFNGLGETTEXGENDVPROC) load(userptr, "glGetTexGendv");
+ sf_glad_glGetTexGenfv = (PFNGLGETTEXGENFVPROC) load(userptr, "glGetTexGenfv");
+ sf_glad_glGetTexGeniv = (PFNGLGETTEXGENIVPROC) load(userptr, "glGetTexGeniv");
+ sf_glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC) load(userptr, "glGetTexImage");
+ sf_glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load(userptr, "glGetTexLevelParameterfv");
+ sf_glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load(userptr, "glGetTexLevelParameteriv");
+ sf_glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv");
+ sf_glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv");
+ sf_glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint");
+ sf_glad_glIndexMask = (PFNGLINDEXMASKPROC) load(userptr, "glIndexMask");
+ sf_glad_glIndexd = (PFNGLINDEXDPROC) load(userptr, "glIndexd");
+ sf_glad_glIndexdv = (PFNGLINDEXDVPROC) load(userptr, "glIndexdv");
+ sf_glad_glIndexf = (PFNGLINDEXFPROC) load(userptr, "glIndexf");
+ sf_glad_glIndexfv = (PFNGLINDEXFVPROC) load(userptr, "glIndexfv");
+ sf_glad_glIndexi = (PFNGLINDEXIPROC) load(userptr, "glIndexi");
+ sf_glad_glIndexiv = (PFNGLINDEXIVPROC) load(userptr, "glIndexiv");
+ sf_glad_glIndexs = (PFNGLINDEXSPROC) load(userptr, "glIndexs");
+ sf_glad_glIndexsv = (PFNGLINDEXSVPROC) load(userptr, "glIndexsv");
+ sf_glad_glInitNames = (PFNGLINITNAMESPROC) load(userptr, "glInitNames");
+ sf_glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled");
+ sf_glad_glIsList = (PFNGLISLISTPROC) load(userptr, "glIsList");
+ sf_glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf");
+ sf_glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv");
+ sf_glad_glLightModeli = (PFNGLLIGHTMODELIPROC) load(userptr, "glLightModeli");
+ sf_glad_glLightModeliv = (PFNGLLIGHTMODELIVPROC) load(userptr, "glLightModeliv");
+ sf_glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf");
+ sf_glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv");
+ sf_glad_glLighti = (PFNGLLIGHTIPROC) load(userptr, "glLighti");
+ sf_glad_glLightiv = (PFNGLLIGHTIVPROC) load(userptr, "glLightiv");
+ sf_glad_glLineStipple = (PFNGLLINESTIPPLEPROC) load(userptr, "glLineStipple");
+ sf_glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth");
+ sf_glad_glListBase = (PFNGLLISTBASEPROC) load(userptr, "glListBase");
+ sf_glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity");
+ sf_glad_glLoadMatrixd = (PFNGLLOADMATRIXDPROC) load(userptr, "glLoadMatrixd");
+ sf_glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf");
+ sf_glad_glLoadName = (PFNGLLOADNAMEPROC) load(userptr, "glLoadName");
+ sf_glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp");
+ sf_glad_glMap1d = (PFNGLMAP1DPROC) load(userptr, "glMap1d");
+ sf_glad_glMap1f = (PFNGLMAP1FPROC) load(userptr, "glMap1f");
+ sf_glad_glMap2d = (PFNGLMAP2DPROC) load(userptr, "glMap2d");
+ sf_glad_glMap2f = (PFNGLMAP2FPROC) load(userptr, "glMap2f");
+ sf_glad_glMapGrid1d = (PFNGLMAPGRID1DPROC) load(userptr, "glMapGrid1d");
+ sf_glad_glMapGrid1f = (PFNGLMAPGRID1FPROC) load(userptr, "glMapGrid1f");
+ sf_glad_glMapGrid2d = (PFNGLMAPGRID2DPROC) load(userptr, "glMapGrid2d");
+ sf_glad_glMapGrid2f = (PFNGLMAPGRID2FPROC) load(userptr, "glMapGrid2f");
+ sf_glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf");
+ sf_glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv");
+ sf_glad_glMateriali = (PFNGLMATERIALIPROC) load(userptr, "glMateriali");
+ sf_glad_glMaterialiv = (PFNGLMATERIALIVPROC) load(userptr, "glMaterialiv");
+ sf_glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode");
+ sf_glad_glMultMatrixd = (PFNGLMULTMATRIXDPROC) load(userptr, "glMultMatrixd");
+ sf_glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf");
+ sf_glad_glNewList = (PFNGLNEWLISTPROC) load(userptr, "glNewList");
+ sf_glad_glNormal3b = (PFNGLNORMAL3BPROC) load(userptr, "glNormal3b");
+ sf_glad_glNormal3bv = (PFNGLNORMAL3BVPROC) load(userptr, "glNormal3bv");
+ sf_glad_glNormal3d = (PFNGLNORMAL3DPROC) load(userptr, "glNormal3d");
+ sf_glad_glNormal3dv = (PFNGLNORMAL3DVPROC) load(userptr, "glNormal3dv");
+ sf_glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f");
+ sf_glad_glNormal3fv = (PFNGLNORMAL3FVPROC) load(userptr, "glNormal3fv");
+ sf_glad_glNormal3i = (PFNGLNORMAL3IPROC) load(userptr, "glNormal3i");
+ sf_glad_glNormal3iv = (PFNGLNORMAL3IVPROC) load(userptr, "glNormal3iv");
+ sf_glad_glNormal3s = (PFNGLNORMAL3SPROC) load(userptr, "glNormal3s");
+ sf_glad_glNormal3sv = (PFNGLNORMAL3SVPROC) load(userptr, "glNormal3sv");
+ sf_glad_glOrtho = (PFNGLORTHOPROC) load(userptr, "glOrtho");
+ sf_glad_glPassThrough = (PFNGLPASSTHROUGHPROC) load(userptr, "glPassThrough");
+ sf_glad_glPixelMapfv = (PFNGLPIXELMAPFVPROC) load(userptr, "glPixelMapfv");
+ sf_glad_glPixelMapuiv = (PFNGLPIXELMAPUIVPROC) load(userptr, "glPixelMapuiv");
+ sf_glad_glPixelMapusv = (PFNGLPIXELMAPUSVPROC) load(userptr, "glPixelMapusv");
+ sf_glad_glPixelStoref = (PFNGLPIXELSTOREFPROC) load(userptr, "glPixelStoref");
+ sf_glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei");
+ sf_glad_glPixelTransferf = (PFNGLPIXELTRANSFERFPROC) load(userptr, "glPixelTransferf");
+ sf_glad_glPixelTransferi = (PFNGLPIXELTRANSFERIPROC) load(userptr, "glPixelTransferi");
+ sf_glad_glPixelZoom = (PFNGLPIXELZOOMPROC) load(userptr, "glPixelZoom");
+ sf_glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize");
+ sf_glad_glPolygonMode = (PFNGLPOLYGONMODEPROC) load(userptr, "glPolygonMode");
+ sf_glad_glPolygonStipple = (PFNGLPOLYGONSTIPPLEPROC) load(userptr, "glPolygonStipple");
+ sf_glad_glPopAttrib = (PFNGLPOPATTRIBPROC) load(userptr, "glPopAttrib");
+ sf_glad_glPopMatrix = (PFNGLPOPMATRIXPROC) load(userptr, "glPopMatrix");
+ sf_glad_glPopName = (PFNGLPOPNAMEPROC) load(userptr, "glPopName");
+ sf_glad_glPushAttrib = (PFNGLPUSHATTRIBPROC) load(userptr, "glPushAttrib");
+ sf_glad_glPushMatrix = (PFNGLPUSHMATRIXPROC) load(userptr, "glPushMatrix");
+ sf_glad_glPushName = (PFNGLPUSHNAMEPROC) load(userptr, "glPushName");
+ sf_glad_glRasterPos2d = (PFNGLRASTERPOS2DPROC) load(userptr, "glRasterPos2d");
+ sf_glad_glRasterPos2dv = (PFNGLRASTERPOS2DVPROC) load(userptr, "glRasterPos2dv");
+ sf_glad_glRasterPos2f = (PFNGLRASTERPOS2FPROC) load(userptr, "glRasterPos2f");
+ sf_glad_glRasterPos2fv = (PFNGLRASTERPOS2FVPROC) load(userptr, "glRasterPos2fv");
+ sf_glad_glRasterPos2i = (PFNGLRASTERPOS2IPROC) load(userptr, "glRasterPos2i");
+ sf_glad_glRasterPos2iv = (PFNGLRASTERPOS2IVPROC) load(userptr, "glRasterPos2iv");
+ sf_glad_glRasterPos2s = (PFNGLRASTERPOS2SPROC) load(userptr, "glRasterPos2s");
+ sf_glad_glRasterPos2sv = (PFNGLRASTERPOS2SVPROC) load(userptr, "glRasterPos2sv");
+ sf_glad_glRasterPos3d = (PFNGLRASTERPOS3DPROC) load(userptr, "glRasterPos3d");
+ sf_glad_glRasterPos3dv = (PFNGLRASTERPOS3DVPROC) load(userptr, "glRasterPos3dv");
+ sf_glad_glRasterPos3f = (PFNGLRASTERPOS3FPROC) load(userptr, "glRasterPos3f");
+ sf_glad_glRasterPos3fv = (PFNGLRASTERPOS3FVPROC) load(userptr, "glRasterPos3fv");
+ sf_glad_glRasterPos3i = (PFNGLRASTERPOS3IPROC) load(userptr, "glRasterPos3i");
+ sf_glad_glRasterPos3iv = (PFNGLRASTERPOS3IVPROC) load(userptr, "glRasterPos3iv");
+ sf_glad_glRasterPos3s = (PFNGLRASTERPOS3SPROC) load(userptr, "glRasterPos3s");
+ sf_glad_glRasterPos3sv = (PFNGLRASTERPOS3SVPROC) load(userptr, "glRasterPos3sv");
+ sf_glad_glRasterPos4d = (PFNGLRASTERPOS4DPROC) load(userptr, "glRasterPos4d");
+ sf_glad_glRasterPos4dv = (PFNGLRASTERPOS4DVPROC) load(userptr, "glRasterPos4dv");
+ sf_glad_glRasterPos4f = (PFNGLRASTERPOS4FPROC) load(userptr, "glRasterPos4f");
+ sf_glad_glRasterPos4fv = (PFNGLRASTERPOS4FVPROC) load(userptr, "glRasterPos4fv");
+ sf_glad_glRasterPos4i = (PFNGLRASTERPOS4IPROC) load(userptr, "glRasterPos4i");
+ sf_glad_glRasterPos4iv = (PFNGLRASTERPOS4IVPROC) load(userptr, "glRasterPos4iv");
+ sf_glad_glRasterPos4s = (PFNGLRASTERPOS4SPROC) load(userptr, "glRasterPos4s");
+ sf_glad_glRasterPos4sv = (PFNGLRASTERPOS4SVPROC) load(userptr, "glRasterPos4sv");
+ sf_glad_glReadBuffer = (PFNGLREADBUFFERPROC) load(userptr, "glReadBuffer");
+ sf_glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels");
+ sf_glad_glRectd = (PFNGLRECTDPROC) load(userptr, "glRectd");
+ sf_glad_glRectdv = (PFNGLRECTDVPROC) load(userptr, "glRectdv");
+ sf_glad_glRectf = (PFNGLRECTFPROC) load(userptr, "glRectf");
+ sf_glad_glRectfv = (PFNGLRECTFVPROC) load(userptr, "glRectfv");
+ sf_glad_glRecti = (PFNGLRECTIPROC) load(userptr, "glRecti");
+ sf_glad_glRectiv = (PFNGLRECTIVPROC) load(userptr, "glRectiv");
+ sf_glad_glRects = (PFNGLRECTSPROC) load(userptr, "glRects");
+ sf_glad_glRectsv = (PFNGLRECTSVPROC) load(userptr, "glRectsv");
+ sf_glad_glRenderMode = (PFNGLRENDERMODEPROC) load(userptr, "glRenderMode");
+ sf_glad_glRotated = (PFNGLROTATEDPROC) load(userptr, "glRotated");
+ sf_glad_glRotatef = (PFNGLROTATEFPROC) load(userptr, "glRotatef");
+ sf_glad_glScaled = (PFNGLSCALEDPROC) load(userptr, "glScaled");
+ sf_glad_glScalef = (PFNGLSCALEFPROC) load(userptr, "glScalef");
+ sf_glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor");
+ sf_glad_glSelectBuffer = (PFNGLSELECTBUFFERPROC) load(userptr, "glSelectBuffer");
+ sf_glad_glShadeModel = (PFNGLSHADEMODELPROC) load(userptr, "glShadeModel");
+ sf_glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc");
+ sf_glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask");
+ sf_glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp");
+ sf_glad_glTexCoord1d = (PFNGLTEXCOORD1DPROC) load(userptr, "glTexCoord1d");
+ sf_glad_glTexCoord1dv = (PFNGLTEXCOORD1DVPROC) load(userptr, "glTexCoord1dv");
+ sf_glad_glTexCoord1f = (PFNGLTEXCOORD1FPROC) load(userptr, "glTexCoord1f");
+ sf_glad_glTexCoord1fv = (PFNGLTEXCOORD1FVPROC) load(userptr, "glTexCoord1fv");
+ sf_glad_glTexCoord1i = (PFNGLTEXCOORD1IPROC) load(userptr, "glTexCoord1i");
+ sf_glad_glTexCoord1iv = (PFNGLTEXCOORD1IVPROC) load(userptr, "glTexCoord1iv");
+ sf_glad_glTexCoord1s = (PFNGLTEXCOORD1SPROC) load(userptr, "glTexCoord1s");
+ sf_glad_glTexCoord1sv = (PFNGLTEXCOORD1SVPROC) load(userptr, "glTexCoord1sv");
+ sf_glad_glTexCoord2d = (PFNGLTEXCOORD2DPROC) load(userptr, "glTexCoord2d");
+ sf_glad_glTexCoord2dv = (PFNGLTEXCOORD2DVPROC) load(userptr, "glTexCoord2dv");
+ sf_glad_glTexCoord2f = (PFNGLTEXCOORD2FPROC) load(userptr, "glTexCoord2f");
+ sf_glad_glTexCoord2fv = (PFNGLTEXCOORD2FVPROC) load(userptr, "glTexCoord2fv");
+ sf_glad_glTexCoord2i = (PFNGLTEXCOORD2IPROC) load(userptr, "glTexCoord2i");
+ sf_glad_glTexCoord2iv = (PFNGLTEXCOORD2IVPROC) load(userptr, "glTexCoord2iv");
+ sf_glad_glTexCoord2s = (PFNGLTEXCOORD2SPROC) load(userptr, "glTexCoord2s");
+ sf_glad_glTexCoord2sv = (PFNGLTEXCOORD2SVPROC) load(userptr, "glTexCoord2sv");
+ sf_glad_glTexCoord3d = (PFNGLTEXCOORD3DPROC) load(userptr, "glTexCoord3d");
+ sf_glad_glTexCoord3dv = (PFNGLTEXCOORD3DVPROC) load(userptr, "glTexCoord3dv");
+ sf_glad_glTexCoord3f = (PFNGLTEXCOORD3FPROC) load(userptr, "glTexCoord3f");
+ sf_glad_glTexCoord3fv = (PFNGLTEXCOORD3FVPROC) load(userptr, "glTexCoord3fv");
+ sf_glad_glTexCoord3i = (PFNGLTEXCOORD3IPROC) load(userptr, "glTexCoord3i");
+ sf_glad_glTexCoord3iv = (PFNGLTEXCOORD3IVPROC) load(userptr, "glTexCoord3iv");
+ sf_glad_glTexCoord3s = (PFNGLTEXCOORD3SPROC) load(userptr, "glTexCoord3s");
+ sf_glad_glTexCoord3sv = (PFNGLTEXCOORD3SVPROC) load(userptr, "glTexCoord3sv");
+ sf_glad_glTexCoord4d = (PFNGLTEXCOORD4DPROC) load(userptr, "glTexCoord4d");
+ sf_glad_glTexCoord4dv = (PFNGLTEXCOORD4DVPROC) load(userptr, "glTexCoord4dv");
+ sf_glad_glTexCoord4f = (PFNGLTEXCOORD4FPROC) load(userptr, "glTexCoord4f");
+ sf_glad_glTexCoord4fv = (PFNGLTEXCOORD4FVPROC) load(userptr, "glTexCoord4fv");
+ sf_glad_glTexCoord4i = (PFNGLTEXCOORD4IPROC) load(userptr, "glTexCoord4i");
+ sf_glad_glTexCoord4iv = (PFNGLTEXCOORD4IVPROC) load(userptr, "glTexCoord4iv");
+ sf_glad_glTexCoord4s = (PFNGLTEXCOORD4SPROC) load(userptr, "glTexCoord4s");
+ sf_glad_glTexCoord4sv = (PFNGLTEXCOORD4SVPROC) load(userptr, "glTexCoord4sv");
+ sf_glad_glTexEnvf = (PFNGLTEXENVFPROC) load(userptr, "glTexEnvf");
+ sf_glad_glTexEnvfv = (PFNGLTEXENVFVPROC) load(userptr, "glTexEnvfv");
+ sf_glad_glTexEnvi = (PFNGLTEXENVIPROC) load(userptr, "glTexEnvi");
+ sf_glad_glTexEnviv = (PFNGLTEXENVIVPROC) load(userptr, "glTexEnviv");
+ sf_glad_glTexGend = (PFNGLTEXGENDPROC) load(userptr, "glTexGend");
+ sf_glad_glTexGendv = (PFNGLTEXGENDVPROC) load(userptr, "glTexGendv");
+ sf_glad_glTexGenf = (PFNGLTEXGENFPROC) load(userptr, "glTexGenf");
+ sf_glad_glTexGenfv = (PFNGLTEXGENFVPROC) load(userptr, "glTexGenfv");
+ sf_glad_glTexGeni = (PFNGLTEXGENIPROC) load(userptr, "glTexGeni");
+ sf_glad_glTexGeniv = (PFNGLTEXGENIVPROC) load(userptr, "glTexGeniv");
+ sf_glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC) load(userptr, "glTexImage1D");
+ sf_glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D");
+ sf_glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf");
+ sf_glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv");
+ sf_glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri");
+ sf_glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv");
+ sf_glad_glTranslated = (PFNGLTRANSLATEDPROC) load(userptr, "glTranslated");
+ sf_glad_glTranslatef = (PFNGLTRANSLATEFPROC) load(userptr, "glTranslatef");
+ sf_glad_glVertex2d = (PFNGLVERTEX2DPROC) load(userptr, "glVertex2d");
+ sf_glad_glVertex2dv = (PFNGLVERTEX2DVPROC) load(userptr, "glVertex2dv");
+ sf_glad_glVertex2f = (PFNGLVERTEX2FPROC) load(userptr, "glVertex2f");
+ sf_glad_glVertex2fv = (PFNGLVERTEX2FVPROC) load(userptr, "glVertex2fv");
+ sf_glad_glVertex2i = (PFNGLVERTEX2IPROC) load(userptr, "glVertex2i");
+ sf_glad_glVertex2iv = (PFNGLVERTEX2IVPROC) load(userptr, "glVertex2iv");
+ sf_glad_glVertex2s = (PFNGLVERTEX2SPROC) load(userptr, "glVertex2s");
+ sf_glad_glVertex2sv = (PFNGLVERTEX2SVPROC) load(userptr, "glVertex2sv");
+ sf_glad_glVertex3d = (PFNGLVERTEX3DPROC) load(userptr, "glVertex3d");
+ sf_glad_glVertex3dv = (PFNGLVERTEX3DVPROC) load(userptr, "glVertex3dv");
+ sf_glad_glVertex3f = (PFNGLVERTEX3FPROC) load(userptr, "glVertex3f");
+ sf_glad_glVertex3fv = (PFNGLVERTEX3FVPROC) load(userptr, "glVertex3fv");
+ sf_glad_glVertex3i = (PFNGLVERTEX3IPROC) load(userptr, "glVertex3i");
+ sf_glad_glVertex3iv = (PFNGLVERTEX3IVPROC) load(userptr, "glVertex3iv");
+ sf_glad_glVertex3s = (PFNGLVERTEX3SPROC) load(userptr, "glVertex3s");
+ sf_glad_glVertex3sv = (PFNGLVERTEX3SVPROC) load(userptr, "glVertex3sv");
+ sf_glad_glVertex4d = (PFNGLVERTEX4DPROC) load(userptr, "glVertex4d");
+ sf_glad_glVertex4dv = (PFNGLVERTEX4DVPROC) load(userptr, "glVertex4dv");
+ sf_glad_glVertex4f = (PFNGLVERTEX4FPROC) load(userptr, "glVertex4f");
+ sf_glad_glVertex4fv = (PFNGLVERTEX4FVPROC) load(userptr, "glVertex4fv");
+ sf_glad_glVertex4i = (PFNGLVERTEX4IPROC) load(userptr, "glVertex4i");
+ sf_glad_glVertex4iv = (PFNGLVERTEX4IVPROC) load(userptr, "glVertex4iv");
+ sf_glad_glVertex4s = (PFNGLVERTEX4SPROC) load(userptr, "glVertex4s");
+ sf_glad_glVertex4sv = (PFNGLVERTEX4SVPROC) load(userptr, "glVertex4sv");
+ sf_glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport");
+}
+static void sf_glad_gl_load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_1_1) return;
+ sf_glad_glAreTexturesResident = (PFNGLARETEXTURESRESIDENTPROC) load(userptr, "glAreTexturesResident");
+ sf_glad_glArrayElement = (PFNGLARRAYELEMENTPROC) load(userptr, "glArrayElement");
+ sf_glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture");
+ sf_glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer");
+ sf_glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D");
+ sf_glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D");
+ sf_glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D");
+ sf_glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D");
+ sf_glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures");
+ sf_glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState");
+ sf_glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays");
+ sf_glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements");
+ sf_glad_glEdgeFlagPointer = (PFNGLEDGEFLAGPOINTERPROC) load(userptr, "glEdgeFlagPointer");
+ sf_glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState");
+ sf_glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures");
+ sf_glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ sf_glad_glIndexPointer = (PFNGLINDEXPOINTERPROC) load(userptr, "glIndexPointer");
+ sf_glad_glIndexub = (PFNGLINDEXUBPROC) load(userptr, "glIndexub");
+ sf_glad_glIndexubv = (PFNGLINDEXUBVPROC) load(userptr, "glIndexubv");
+ sf_glad_glInterleavedArrays = (PFNGLINTERLEAVEDARRAYSPROC) load(userptr, "glInterleavedArrays");
+ sf_glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture");
+ sf_glad_glNormalPointer = (PFNGLNORMALPOINTERPROC) load(userptr, "glNormalPointer");
+ sf_glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset");
+ sf_glad_glPopClientAttrib = (PFNGLPOPCLIENTATTRIBPROC) load(userptr, "glPopClientAttrib");
+ sf_glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(userptr, "glPrioritizeTextures");
+ sf_glad_glPushClientAttrib = (PFNGLPUSHCLIENTATTRIBPROC) load(userptr, "glPushClientAttrib");
+ sf_glad_glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load(userptr, "glTexCoordPointer");
+ sf_glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D");
+ sf_glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D");
+ sf_glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer");
+}
+static void sf_glad_gl_load_GL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_1_2) return;
+ sf_glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D");
+ sf_glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) load(userptr, "glDrawRangeElements");
+ sf_glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC) load(userptr, "glTexImage3D");
+ sf_glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) load(userptr, "glTexSubImage3D");
+}
+static void sf_glad_gl_load_GL_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_1_3) return;
+ sf_glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture");
+ sf_glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture");
+ sf_glad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC) load(userptr, "glCompressedTexImage1D");
+ sf_glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D");
+ sf_glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) load(userptr, "glCompressedTexImage3D");
+ sf_glad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) load(userptr, "glCompressedTexSubImage1D");
+ sf_glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D");
+ sf_glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) load(userptr, "glCompressedTexSubImage3D");
+ sf_glad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) load(userptr, "glGetCompressedTexImage");
+ sf_glad_glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC) load(userptr, "glLoadTransposeMatrixd");
+ sf_glad_glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC) load(userptr, "glLoadTransposeMatrixf");
+ sf_glad_glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC) load(userptr, "glMultTransposeMatrixd");
+ sf_glad_glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC) load(userptr, "glMultTransposeMatrixf");
+ sf_glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC) load(userptr, "glMultiTexCoord1d");
+ sf_glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC) load(userptr, "glMultiTexCoord1dv");
+ sf_glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC) load(userptr, "glMultiTexCoord1f");
+ sf_glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC) load(userptr, "glMultiTexCoord1fv");
+ sf_glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC) load(userptr, "glMultiTexCoord1i");
+ sf_glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC) load(userptr, "glMultiTexCoord1iv");
+ sf_glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC) load(userptr, "glMultiTexCoord1s");
+ sf_glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC) load(userptr, "glMultiTexCoord1sv");
+ sf_glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC) load(userptr, "glMultiTexCoord2d");
+ sf_glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC) load(userptr, "glMultiTexCoord2dv");
+ sf_glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) load(userptr, "glMultiTexCoord2f");
+ sf_glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) load(userptr, "glMultiTexCoord2fv");
+ sf_glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC) load(userptr, "glMultiTexCoord2i");
+ sf_glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC) load(userptr, "glMultiTexCoord2iv");
+ sf_glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC) load(userptr, "glMultiTexCoord2s");
+ sf_glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC) load(userptr, "glMultiTexCoord2sv");
+ sf_glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC) load(userptr, "glMultiTexCoord3d");
+ sf_glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC) load(userptr, "glMultiTexCoord3dv");
+ sf_glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC) load(userptr, "glMultiTexCoord3f");
+ sf_glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC) load(userptr, "glMultiTexCoord3fv");
+ sf_glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC) load(userptr, "glMultiTexCoord3i");
+ sf_glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC) load(userptr, "glMultiTexCoord3iv");
+ sf_glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC) load(userptr, "glMultiTexCoord3s");
+ sf_glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC) load(userptr, "glMultiTexCoord3sv");
+ sf_glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC) load(userptr, "glMultiTexCoord4d");
+ sf_glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC) load(userptr, "glMultiTexCoord4dv");
+ sf_glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f");
+ sf_glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC) load(userptr, "glMultiTexCoord4fv");
+ sf_glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC) load(userptr, "glMultiTexCoord4i");
+ sf_glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC) load(userptr, "glMultiTexCoord4iv");
+ sf_glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC) load(userptr, "glMultiTexCoord4s");
+ sf_glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC) load(userptr, "glMultiTexCoord4sv");
+ sf_glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage");
+}
+static void sf_glad_gl_load_GL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_1_4) return;
+ sf_glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor");
+ sf_glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation");
+ sf_glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate");
+ sf_glad_glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC) load(userptr, "glFogCoordPointer");
+ sf_glad_glFogCoordd = (PFNGLFOGCOORDDPROC) load(userptr, "glFogCoordd");
+ sf_glad_glFogCoorddv = (PFNGLFOGCOORDDVPROC) load(userptr, "glFogCoorddv");
+ sf_glad_glFogCoordf = (PFNGLFOGCOORDFPROC) load(userptr, "glFogCoordf");
+ sf_glad_glFogCoordfv = (PFNGLFOGCOORDFVPROC) load(userptr, "glFogCoordfv");
+ sf_glad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC) load(userptr, "glMultiDrawArrays");
+ sf_glad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC) load(userptr, "glMultiDrawElements");
+ sf_glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(userptr, "glPointParameterf");
+ sf_glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(userptr, "glPointParameterfv");
+ sf_glad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC) load(userptr, "glPointParameteri");
+ sf_glad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC) load(userptr, "glPointParameteriv");
+ sf_glad_glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC) load(userptr, "glSecondaryColor3b");
+ sf_glad_glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC) load(userptr, "glSecondaryColor3bv");
+ sf_glad_glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC) load(userptr, "glSecondaryColor3d");
+ sf_glad_glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC) load(userptr, "glSecondaryColor3dv");
+ sf_glad_glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC) load(userptr, "glSecondaryColor3f");
+ sf_glad_glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC) load(userptr, "glSecondaryColor3fv");
+ sf_glad_glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC) load(userptr, "glSecondaryColor3i");
+ sf_glad_glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC) load(userptr, "glSecondaryColor3iv");
+ sf_glad_glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC) load(userptr, "glSecondaryColor3s");
+ sf_glad_glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC) load(userptr, "glSecondaryColor3sv");
+ sf_glad_glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC) load(userptr, "glSecondaryColor3ub");
+ sf_glad_glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC) load(userptr, "glSecondaryColor3ubv");
+ sf_glad_glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC) load(userptr, "glSecondaryColor3ui");
+ sf_glad_glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC) load(userptr, "glSecondaryColor3uiv");
+ sf_glad_glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC) load(userptr, "glSecondaryColor3us");
+ sf_glad_glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC) load(userptr, "glSecondaryColor3usv");
+ sf_glad_glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC) load(userptr, "glSecondaryColorPointer");
+ sf_glad_glWindowPos2d = (PFNGLWINDOWPOS2DPROC) load(userptr, "glWindowPos2d");
+ sf_glad_glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC) load(userptr, "glWindowPos2dv");
+ sf_glad_glWindowPos2f = (PFNGLWINDOWPOS2FPROC) load(userptr, "glWindowPos2f");
+ sf_glad_glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC) load(userptr, "glWindowPos2fv");
+ sf_glad_glWindowPos2i = (PFNGLWINDOWPOS2IPROC) load(userptr, "glWindowPos2i");
+ sf_glad_glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC) load(userptr, "glWindowPos2iv");
+ sf_glad_glWindowPos2s = (PFNGLWINDOWPOS2SPROC) load(userptr, "glWindowPos2s");
+ sf_glad_glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC) load(userptr, "glWindowPos2sv");
+ sf_glad_glWindowPos3d = (PFNGLWINDOWPOS3DPROC) load(userptr, "glWindowPos3d");
+ sf_glad_glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC) load(userptr, "glWindowPos3dv");
+ sf_glad_glWindowPos3f = (PFNGLWINDOWPOS3FPROC) load(userptr, "glWindowPos3f");
+ sf_glad_glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC) load(userptr, "glWindowPos3fv");
+ sf_glad_glWindowPos3i = (PFNGLWINDOWPOS3IPROC) load(userptr, "glWindowPos3i");
+ sf_glad_glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC) load(userptr, "glWindowPos3iv");
+ sf_glad_glWindowPos3s = (PFNGLWINDOWPOS3SPROC) load(userptr, "glWindowPos3s");
+ sf_glad_glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC) load(userptr, "glWindowPos3sv");
+}
+static void sf_glad_gl_load_GL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_1_5) return;
+ sf_glad_glBeginQuery = (PFNGLBEGINQUERYPROC) load(userptr, "glBeginQuery");
+ sf_glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer");
+ sf_glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData");
+ sf_glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData");
+ sf_glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers");
+ sf_glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC) load(userptr, "glDeleteQueries");
+ sf_glad_glEndQuery = (PFNGLENDQUERYPROC) load(userptr, "glEndQuery");
+ sf_glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers");
+ sf_glad_glGenQueries = (PFNGLGENQUERIESPROC) load(userptr, "glGenQueries");
+ sf_glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv");
+ sf_glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv");
+ sf_glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData");
+ sf_glad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC) load(userptr, "glGetQueryObjectiv");
+ sf_glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) load(userptr, "glGetQueryObjectuiv");
+ sf_glad_glGetQueryiv = (PFNGLGETQUERYIVPROC) load(userptr, "glGetQueryiv");
+ sf_glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer");
+ sf_glad_glIsQuery = (PFNGLISQUERYPROC) load(userptr, "glIsQuery");
+ sf_glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer");
+ sf_glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer");
+}
+static void sf_glad_gl_load_GL_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_2_0) return;
+ sf_glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader");
+ sf_glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation");
+ sf_glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate");
+ sf_glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader");
+ sf_glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram");
+ sf_glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader");
+ sf_glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load(userptr, "glDeleteProgram");
+ sf_glad_glDeleteShader = (PFNGLDELETESHADERPROC) load(userptr, "glDeleteShader");
+ sf_glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader");
+ sf_glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray");
+ sf_glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC) load(userptr, "glDrawBuffers");
+ sf_glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray");
+ sf_glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib");
+ sf_glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform");
+ sf_glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load(userptr, "glGetAttachedShaders");
+ sf_glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation");
+ sf_glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load(userptr, "glGetProgramInfoLog");
+ sf_glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load(userptr, "glGetProgramiv");
+ sf_glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load(userptr, "glGetShaderInfoLog");
+ sf_glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource");
+ sf_glad_glGetShaderiv = (PFNGLGETSHADERIVPROC) load(userptr, "glGetShaderiv");
+ sf_glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation");
+ sf_glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv");
+ sf_glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv");
+ sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv");
+ sf_glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv");
+ sf_glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv");
+ sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv");
+ sf_glad_glIsProgram = (PFNGLISPROGRAMPROC) load(userptr, "glIsProgram");
+ sf_glad_glIsShader = (PFNGLISSHADERPROC) load(userptr, "glIsShader");
+ sf_glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram");
+ sf_glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource");
+ sf_glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load(userptr, "glStencilFuncSeparate");
+ sf_glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load(userptr, "glStencilMaskSeparate");
+ sf_glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load(userptr, "glStencilOpSeparate");
+ sf_glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f");
+ sf_glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv");
+ sf_glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i");
+ sf_glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv");
+ sf_glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f");
+ sf_glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv");
+ sf_glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i");
+ sf_glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv");
+ sf_glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f");
+ sf_glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv");
+ sf_glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i");
+ sf_glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv");
+ sf_glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f");
+ sf_glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv");
+ sf_glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i");
+ sf_glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv");
+ sf_glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv");
+ sf_glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv");
+ sf_glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv");
+ sf_glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram");
+ sf_glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram");
+ sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d");
+ sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv");
+ sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f");
+ sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv");
+ sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s");
+ sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv");
+ sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d");
+ sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv");
+ sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f");
+ sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv");
+ sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s");
+ sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv");
+ sf_glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d");
+ sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv");
+ sf_glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f");
+ sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv");
+ sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s");
+ sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv");
+ sf_glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv");
+ sf_glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv");
+ sf_glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv");
+ sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub");
+ sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv");
+ sf_glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv");
+ sf_glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv");
+ sf_glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv");
+ sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d");
+ sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv");
+ sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f");
+ sf_glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv");
+ sf_glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv");
+ sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s");
+ sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv");
+ sf_glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv");
+ sf_glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv");
+ sf_glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv");
+ sf_glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer");
+}
+static void sf_glad_gl_load_GL_VERSION_2_1( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_2_1) return;
+ sf_glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) load(userptr, "glUniformMatrix2x3fv");
+ sf_glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) load(userptr, "glUniformMatrix2x4fv");
+ sf_glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) load(userptr, "glUniformMatrix3x2fv");
+ sf_glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) load(userptr, "glUniformMatrix3x4fv");
+ sf_glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) load(userptr, "glUniformMatrix4x2fv");
+ sf_glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) load(userptr, "glUniformMatrix4x3fv");
+}
+static void sf_glad_gl_load_GL_VERSION_3_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_3_0) return;
+ sf_glad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC) load(userptr, "glBeginConditionalRender");
+ sf_glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) load(userptr, "glBeginTransformFeedback");
+ sf_glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase");
+ sf_glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange");
+ sf_glad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC) load(userptr, "glBindFragDataLocation");
+ sf_glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer");
+ sf_glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer");
+ sf_glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray");
+ sf_glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer");
+ sf_glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus");
+ sf_glad_glClampColor = (PFNGLCLAMPCOLORPROC) load(userptr, "glClampColor");
+ sf_glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC) load(userptr, "glClearBufferfi");
+ sf_glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) load(userptr, "glClearBufferfv");
+ sf_glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) load(userptr, "glClearBufferiv");
+ sf_glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) load(userptr, "glClearBufferuiv");
+ sf_glad_glColorMaski = (PFNGLCOLORMASKIPROC) load(userptr, "glColorMaski");
+ sf_glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers");
+ sf_glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers");
+ sf_glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays");
+ sf_glad_glDisablei = (PFNGLDISABLEIPROC) load(userptr, "glDisablei");
+ sf_glad_glEnablei = (PFNGLENABLEIPROC) load(userptr, "glEnablei");
+ sf_glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC) load(userptr, "glEndConditionalRender");
+ sf_glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) load(userptr, "glEndTransformFeedback");
+ sf_glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange");
+ sf_glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer");
+ sf_glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D");
+ sf_glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D");
+ sf_glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D");
+ sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ sf_glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers");
+ sf_glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers");
+ sf_glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays");
+ sf_glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap");
+ sf_glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) load(userptr, "glGetBooleani_v");
+ sf_glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) load(userptr, "glGetFragDataLocation");
+ sf_glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv");
+ sf_glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v");
+ sf_glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv");
+ sf_glad_glGetStringi = (PFNGLGETSTRINGIPROC) load(userptr, "glGetStringi");
+ sf_glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) load(userptr, "glGetTexParameterIiv");
+ sf_glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) load(userptr, "glGetTexParameterIuiv");
+ sf_glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) load(userptr, "glGetTransformFeedbackVarying");
+ sf_glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) load(userptr, "glGetUniformuiv");
+ sf_glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) load(userptr, "glGetVertexAttribIiv");
+ sf_glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) load(userptr, "glGetVertexAttribIuiv");
+ sf_glad_glIsEnabledi = (PFNGLISENABLEDIPROC) load(userptr, "glIsEnabledi");
+ sf_glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer");
+ sf_glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer");
+ sf_glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray");
+ sf_glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange");
+ sf_glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage");
+ sf_glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample");
+ sf_glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) load(userptr, "glTexParameterIiv");
+ sf_glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) load(userptr, "glTexParameterIuiv");
+ sf_glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) load(userptr, "glTransformFeedbackVaryings");
+ sf_glad_glUniform1ui = (PFNGLUNIFORM1UIPROC) load(userptr, "glUniform1ui");
+ sf_glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC) load(userptr, "glUniform1uiv");
+ sf_glad_glUniform2ui = (PFNGLUNIFORM2UIPROC) load(userptr, "glUniform2ui");
+ sf_glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC) load(userptr, "glUniform2uiv");
+ sf_glad_glUniform3ui = (PFNGLUNIFORM3UIPROC) load(userptr, "glUniform3ui");
+ sf_glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC) load(userptr, "glUniform3uiv");
+ sf_glad_glUniform4ui = (PFNGLUNIFORM4UIPROC) load(userptr, "glUniform4ui");
+ sf_glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC) load(userptr, "glUniform4uiv");
+ sf_glad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC) load(userptr, "glVertexAttribI1i");
+ sf_glad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC) load(userptr, "glVertexAttribI1iv");
+ sf_glad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC) load(userptr, "glVertexAttribI1ui");
+ sf_glad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC) load(userptr, "glVertexAttribI1uiv");
+ sf_glad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC) load(userptr, "glVertexAttribI2i");
+ sf_glad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC) load(userptr, "glVertexAttribI2iv");
+ sf_glad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC) load(userptr, "glVertexAttribI2ui");
+ sf_glad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC) load(userptr, "glVertexAttribI2uiv");
+ sf_glad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC) load(userptr, "glVertexAttribI3i");
+ sf_glad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC) load(userptr, "glVertexAttribI3iv");
+ sf_glad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC) load(userptr, "glVertexAttribI3ui");
+ sf_glad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC) load(userptr, "glVertexAttribI3uiv");
+ sf_glad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC) load(userptr, "glVertexAttribI4bv");
+ sf_glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) load(userptr, "glVertexAttribI4i");
+ sf_glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) load(userptr, "glVertexAttribI4iv");
+ sf_glad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC) load(userptr, "glVertexAttribI4sv");
+ sf_glad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC) load(userptr, "glVertexAttribI4ubv");
+ sf_glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) load(userptr, "glVertexAttribI4ui");
+ sf_glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) load(userptr, "glVertexAttribI4uiv");
+ sf_glad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC) load(userptr, "glVertexAttribI4usv");
+ sf_glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) load(userptr, "glVertexAttribIPointer");
+}
+static void sf_glad_gl_load_GL_VERSION_3_1( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_3_1) return;
+ sf_glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase");
+ sf_glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange");
+ sf_glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData");
+ sf_glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) load(userptr, "glDrawArraysInstanced");
+ sf_glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) load(userptr, "glDrawElementsInstanced");
+ sf_glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName");
+ sf_glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv");
+ sf_glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(userptr, "glGetActiveUniformName");
+ sf_glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv");
+ sf_glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v");
+ sf_glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex");
+ sf_glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices");
+ sf_glad_glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC) load(userptr, "glPrimitiveRestartIndex");
+ sf_glad_glTexBuffer = (PFNGLTEXBUFFERPROC) load(userptr, "glTexBuffer");
+ sf_glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding");
+}
+static void sf_glad_gl_load_GL_VERSION_3_2( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_3_2) return;
+ sf_glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync");
+ sf_glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync");
+ sf_glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex");
+ sf_glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex");
+ sf_glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex");
+ sf_glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync");
+ sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture");
+ sf_glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) load(userptr, "glGetBufferParameteri64v");
+ sf_glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) load(userptr, "glGetInteger64i_v");
+ sf_glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v");
+ sf_glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv");
+ sf_glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv");
+ sf_glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync");
+ sf_glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glMultiDrawElementsBaseVertex");
+ sf_glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(userptr, "glProvokingVertex");
+ sf_glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski");
+ sf_glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(userptr, "glTexImage2DMultisample");
+ sf_glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(userptr, "glTexImage3DMultisample");
+ sf_glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync");
+}
+static void sf_glad_gl_load_GL_VERSION_3_3( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_3_3) return;
+ sf_glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(userptr, "glBindFragDataLocationIndexed");
+ sf_glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler");
+ sf_glad_glColorP3ui = (PFNGLCOLORP3UIPROC) load(userptr, "glColorP3ui");
+ sf_glad_glColorP3uiv = (PFNGLCOLORP3UIVPROC) load(userptr, "glColorP3uiv");
+ sf_glad_glColorP4ui = (PFNGLCOLORP4UIPROC) load(userptr, "glColorP4ui");
+ sf_glad_glColorP4uiv = (PFNGLCOLORP4UIVPROC) load(userptr, "glColorP4uiv");
+ sf_glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers");
+ sf_glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers");
+ sf_glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(userptr, "glGetFragDataIndex");
+ sf_glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(userptr, "glGetQueryObjecti64v");
+ sf_glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(userptr, "glGetQueryObjectui64v");
+ sf_glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv");
+ sf_glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv");
+ sf_glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv");
+ sf_glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv");
+ sf_glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler");
+ sf_glad_glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) load(userptr, "glMultiTexCoordP1ui");
+ sf_glad_glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) load(userptr, "glMultiTexCoordP1uiv");
+ sf_glad_glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) load(userptr, "glMultiTexCoordP2ui");
+ sf_glad_glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) load(userptr, "glMultiTexCoordP2uiv");
+ sf_glad_glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) load(userptr, "glMultiTexCoordP3ui");
+ sf_glad_glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) load(userptr, "glMultiTexCoordP3uiv");
+ sf_glad_glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) load(userptr, "glMultiTexCoordP4ui");
+ sf_glad_glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) load(userptr, "glMultiTexCoordP4uiv");
+ sf_glad_glNormalP3ui = (PFNGLNORMALP3UIPROC) load(userptr, "glNormalP3ui");
+ sf_glad_glNormalP3uiv = (PFNGLNORMALP3UIVPROC) load(userptr, "glNormalP3uiv");
+ sf_glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(userptr, "glQueryCounter");
+ sf_glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv");
+ sf_glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv");
+ sf_glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf");
+ sf_glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv");
+ sf_glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri");
+ sf_glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv");
+ sf_glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) load(userptr, "glSecondaryColorP3ui");
+ sf_glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) load(userptr, "glSecondaryColorP3uiv");
+ sf_glad_glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) load(userptr, "glTexCoordP1ui");
+ sf_glad_glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) load(userptr, "glTexCoordP1uiv");
+ sf_glad_glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) load(userptr, "glTexCoordP2ui");
+ sf_glad_glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) load(userptr, "glTexCoordP2uiv");
+ sf_glad_glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) load(userptr, "glTexCoordP3ui");
+ sf_glad_glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) load(userptr, "glTexCoordP3uiv");
+ sf_glad_glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) load(userptr, "glTexCoordP4ui");
+ sf_glad_glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) load(userptr, "glTexCoordP4uiv");
+ sf_glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) load(userptr, "glVertexAttribDivisor");
+ sf_glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(userptr, "glVertexAttribP1ui");
+ sf_glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(userptr, "glVertexAttribP1uiv");
+ sf_glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(userptr, "glVertexAttribP2ui");
+ sf_glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(userptr, "glVertexAttribP2uiv");
+ sf_glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(userptr, "glVertexAttribP3ui");
+ sf_glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(userptr, "glVertexAttribP3uiv");
+ sf_glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui");
+ sf_glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv");
+ sf_glad_glVertexP2ui = (PFNGLVERTEXP2UIPROC) load(userptr, "glVertexP2ui");
+ sf_glad_glVertexP2uiv = (PFNGLVERTEXP2UIVPROC) load(userptr, "glVertexP2uiv");
+ sf_glad_glVertexP3ui = (PFNGLVERTEXP3UIPROC) load(userptr, "glVertexP3ui");
+ sf_glad_glVertexP3uiv = (PFNGLVERTEXP3UIVPROC) load(userptr, "glVertexP3uiv");
+ sf_glad_glVertexP4ui = (PFNGLVERTEXP4UIPROC) load(userptr, "glVertexP4ui");
+ sf_glad_glVertexP4uiv = (PFNGLVERTEXP4UIVPROC) load(userptr, "glVertexP4uiv");
+}
+static void sf_glad_gl_load_GL_VERSION_4_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_4_0) return;
+ sf_glad_glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) load(userptr, "glBeginQueryIndexed");
+ sf_glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load(userptr, "glBindTransformFeedback");
+ sf_glad_glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC) load(userptr, "glBlendEquationSeparatei");
+ sf_glad_glBlendEquationi = (PFNGLBLENDEQUATIONIPROC) load(userptr, "glBlendEquationi");
+ sf_glad_glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC) load(userptr, "glBlendFuncSeparatei");
+ sf_glad_glBlendFunci = (PFNGLBLENDFUNCIPROC) load(userptr, "glBlendFunci");
+ sf_glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load(userptr, "glDeleteTransformFeedbacks");
+ sf_glad_glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) load(userptr, "glDrawArraysIndirect");
+ sf_glad_glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) load(userptr, "glDrawElementsIndirect");
+ sf_glad_glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) load(userptr, "glDrawTransformFeedback");
+ sf_glad_glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) load(userptr, "glDrawTransformFeedbackStream");
+ sf_glad_glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) load(userptr, "glEndQueryIndexed");
+ sf_glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load(userptr, "glGenTransformFeedbacks");
+ sf_glad_glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) load(userptr, "glGetActiveSubroutineName");
+ sf_glad_glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) load(userptr, "glGetActiveSubroutineUniformName");
+ sf_glad_glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) load(userptr, "glGetActiveSubroutineUniformiv");
+ sf_glad_glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) load(userptr, "glGetProgramStageiv");
+ sf_glad_glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) load(userptr, "glGetQueryIndexediv");
+ sf_glad_glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) load(userptr, "glGetSubroutineIndex");
+ sf_glad_glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) load(userptr, "glGetSubroutineUniformLocation");
+ sf_glad_glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) load(userptr, "glGetUniformSubroutineuiv");
+ sf_glad_glGetUniformdv = (PFNGLGETUNIFORMDVPROC) load(userptr, "glGetUniformdv");
+ sf_glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load(userptr, "glIsTransformFeedback");
+ sf_glad_glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC) load(userptr, "glMinSampleShading");
+ sf_glad_glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) load(userptr, "glPatchParameterfv");
+ sf_glad_glPatchParameteri = (PFNGLPATCHPARAMETERIPROC) load(userptr, "glPatchParameteri");
+ sf_glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load(userptr, "glPauseTransformFeedback");
+ sf_glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load(userptr, "glResumeTransformFeedback");
+ sf_glad_glUniform1d = (PFNGLUNIFORM1DPROC) load(userptr, "glUniform1d");
+ sf_glad_glUniform1dv = (PFNGLUNIFORM1DVPROC) load(userptr, "glUniform1dv");
+ sf_glad_glUniform2d = (PFNGLUNIFORM2DPROC) load(userptr, "glUniform2d");
+ sf_glad_glUniform2dv = (PFNGLUNIFORM2DVPROC) load(userptr, "glUniform2dv");
+ sf_glad_glUniform3d = (PFNGLUNIFORM3DPROC) load(userptr, "glUniform3d");
+ sf_glad_glUniform3dv = (PFNGLUNIFORM3DVPROC) load(userptr, "glUniform3dv");
+ sf_glad_glUniform4d = (PFNGLUNIFORM4DPROC) load(userptr, "glUniform4d");
+ sf_glad_glUniform4dv = (PFNGLUNIFORM4DVPROC) load(userptr, "glUniform4dv");
+ sf_glad_glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) load(userptr, "glUniformMatrix2dv");
+ sf_glad_glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) load(userptr, "glUniformMatrix2x3dv");
+ sf_glad_glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) load(userptr, "glUniformMatrix2x4dv");
+ sf_glad_glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) load(userptr, "glUniformMatrix3dv");
+ sf_glad_glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) load(userptr, "glUniformMatrix3x2dv");
+ sf_glad_glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) load(userptr, "glUniformMatrix3x4dv");
+ sf_glad_glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) load(userptr, "glUniformMatrix4dv");
+ sf_glad_glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) load(userptr, "glUniformMatrix4x2dv");
+ sf_glad_glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) load(userptr, "glUniformMatrix4x3dv");
+ sf_glad_glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) load(userptr, "glUniformSubroutinesuiv");
+}
+static void sf_glad_gl_load_GL_VERSION_4_1( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_4_1) return;
+ sf_glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram");
+ sf_glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(userptr, "glBindProgramPipeline");
+ sf_glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf");
+ sf_glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(userptr, "glCreateShaderProgramv");
+ sf_glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(userptr, "glDeleteProgramPipelines");
+ sf_glad_glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) load(userptr, "glDepthRangeArrayv");
+ sf_glad_glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) load(userptr, "glDepthRangeIndexed");
+ sf_glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef");
+ sf_glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(userptr, "glGenProgramPipelines");
+ sf_glad_glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC) load(userptr, "glGetDoublei_v");
+ sf_glad_glGetFloati_v = (PFNGLGETFLOATI_VPROC) load(userptr, "glGetFloati_v");
+ sf_glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary");
+ sf_glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(userptr, "glGetProgramPipelineInfoLog");
+ sf_glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(userptr, "glGetProgramPipelineiv");
+ sf_glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(userptr, "glGetShaderPrecisionFormat");
+ sf_glad_glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) load(userptr, "glGetVertexAttribLdv");
+ sf_glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(userptr, "glIsProgramPipeline");
+ sf_glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary");
+ sf_glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+ sf_glad_glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load(userptr, "glProgramUniform1d");
+ sf_glad_glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load(userptr, "glProgramUniform1dv");
+ sf_glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(userptr, "glProgramUniform1f");
+ sf_glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(userptr, "glProgramUniform1fv");
+ sf_glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(userptr, "glProgramUniform1i");
+ sf_glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(userptr, "glProgramUniform1iv");
+ sf_glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(userptr, "glProgramUniform1ui");
+ sf_glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(userptr, "glProgramUniform1uiv");
+ sf_glad_glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load(userptr, "glProgramUniform2d");
+ sf_glad_glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load(userptr, "glProgramUniform2dv");
+ sf_glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(userptr, "glProgramUniform2f");
+ sf_glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(userptr, "glProgramUniform2fv");
+ sf_glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(userptr, "glProgramUniform2i");
+ sf_glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(userptr, "glProgramUniform2iv");
+ sf_glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(userptr, "glProgramUniform2ui");
+ sf_glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(userptr, "glProgramUniform2uiv");
+ sf_glad_glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load(userptr, "glProgramUniform3d");
+ sf_glad_glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load(userptr, "glProgramUniform3dv");
+ sf_glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(userptr, "glProgramUniform3f");
+ sf_glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(userptr, "glProgramUniform3fv");
+ sf_glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(userptr, "glProgramUniform3i");
+ sf_glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(userptr, "glProgramUniform3iv");
+ sf_glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(userptr, "glProgramUniform3ui");
+ sf_glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(userptr, "glProgramUniform3uiv");
+ sf_glad_glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load(userptr, "glProgramUniform4d");
+ sf_glad_glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load(userptr, "glProgramUniform4dv");
+ sf_glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(userptr, "glProgramUniform4f");
+ sf_glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(userptr, "glProgramUniform4fv");
+ sf_glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(userptr, "glProgramUniform4i");
+ sf_glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(userptr, "glProgramUniform4iv");
+ sf_glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(userptr, "glProgramUniform4ui");
+ sf_glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(userptr, "glProgramUniform4uiv");
+ sf_glad_glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load(userptr, "glProgramUniformMatrix2dv");
+ sf_glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(userptr, "glProgramUniformMatrix2fv");
+ sf_glad_glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load(userptr, "glProgramUniformMatrix2x3dv");
+ sf_glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(userptr, "glProgramUniformMatrix2x3fv");
+ sf_glad_glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load(userptr, "glProgramUniformMatrix2x4dv");
+ sf_glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(userptr, "glProgramUniformMatrix2x4fv");
+ sf_glad_glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load(userptr, "glProgramUniformMatrix3dv");
+ sf_glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(userptr, "glProgramUniformMatrix3fv");
+ sf_glad_glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load(userptr, "glProgramUniformMatrix3x2dv");
+ sf_glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(userptr, "glProgramUniformMatrix3x2fv");
+ sf_glad_glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load(userptr, "glProgramUniformMatrix3x4dv");
+ sf_glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(userptr, "glProgramUniformMatrix3x4fv");
+ sf_glad_glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load(userptr, "glProgramUniformMatrix4dv");
+ sf_glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(userptr, "glProgramUniformMatrix4fv");
+ sf_glad_glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load(userptr, "glProgramUniformMatrix4x2dv");
+ sf_glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(userptr, "glProgramUniformMatrix4x2fv");
+ sf_glad_glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load(userptr, "glProgramUniformMatrix4x3dv");
+ sf_glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(userptr, "glProgramUniformMatrix4x3fv");
+ sf_glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(userptr, "glReleaseShaderCompiler");
+ sf_glad_glScissorArrayv = (PFNGLSCISSORARRAYVPROC) load(userptr, "glScissorArrayv");
+ sf_glad_glScissorIndexed = (PFNGLSCISSORINDEXEDPROC) load(userptr, "glScissorIndexed");
+ sf_glad_glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) load(userptr, "glScissorIndexedv");
+ sf_glad_glShaderBinary = (PFNGLSHADERBINARYPROC) load(userptr, "glShaderBinary");
+ sf_glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages");
+ sf_glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline");
+ sf_glad_glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) load(userptr, "glVertexAttribL1d");
+ sf_glad_glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) load(userptr, "glVertexAttribL1dv");
+ sf_glad_glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) load(userptr, "glVertexAttribL2d");
+ sf_glad_glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) load(userptr, "glVertexAttribL2dv");
+ sf_glad_glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) load(userptr, "glVertexAttribL3d");
+ sf_glad_glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) load(userptr, "glVertexAttribL3dv");
+ sf_glad_glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) load(userptr, "glVertexAttribL4d");
+ sf_glad_glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) load(userptr, "glVertexAttribL4dv");
+ sf_glad_glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) load(userptr, "glVertexAttribLPointer");
+ sf_glad_glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) load(userptr, "glViewportArrayv");
+ sf_glad_glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) load(userptr, "glViewportIndexedf");
+ sf_glad_glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) load(userptr, "glViewportIndexedfv");
+}
+static void sf_glad_gl_load_GL_VERSION_4_2( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_4_2) return;
+ sf_glad_glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) load(userptr, "glBindImageTexture");
+ sf_glad_glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawArraysInstancedBaseInstance");
+ sf_glad_glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseInstance");
+ sf_glad_glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseVertexBaseInstance");
+ sf_glad_glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackInstanced");
+ sf_glad_glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackStreamInstanced");
+ sf_glad_glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) load(userptr, "glGetActiveAtomicCounterBufferiv");
+ sf_glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load(userptr, "glGetInternalformativ");
+ sf_glad_glMemoryBarrier = (PFNGLMEMORYBARRIERPROC) load(userptr, "glMemoryBarrier");
+ sf_glad_glTexStorage1D = (PFNGLTEXSTORAGE1DPROC) load(userptr, "glTexStorage1D");
+ sf_glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) load(userptr, "glTexStorage2D");
+ sf_glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) load(userptr, "glTexStorage3D");
+}
+static void sf_glad_gl_load_GL_VERSION_4_3( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_4_3) return;
+ sf_glad_glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) load(userptr, "glBindVertexBuffer");
+ sf_glad_glClearBufferData = (PFNGLCLEARBUFFERDATAPROC) load(userptr, "glClearBufferData");
+ sf_glad_glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) load(userptr, "glClearBufferSubData");
+ sf_glad_glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) load(userptr, "glCopyImageSubData");
+ sf_glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback");
+ sf_glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl");
+ sf_glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert");
+ sf_glad_glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) load(userptr, "glDispatchCompute");
+ sf_glad_glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) load(userptr, "glDispatchComputeIndirect");
+ sf_glad_glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) load(userptr, "glFramebufferParameteri");
+ sf_glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog");
+ sf_glad_glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetFramebufferParameteriv");
+ sf_glad_glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) load(userptr, "glGetInternalformati64v");
+ sf_glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel");
+ sf_glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel");
+ sf_glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ sf_glad_glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) load(userptr, "glGetProgramInterfaceiv");
+ sf_glad_glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) load(userptr, "glGetProgramResourceIndex");
+ sf_glad_glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) load(userptr, "glGetProgramResourceLocation");
+ sf_glad_glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) load(userptr, "glGetProgramResourceLocationIndex");
+ sf_glad_glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) load(userptr, "glGetProgramResourceName");
+ sf_glad_glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) load(userptr, "glGetProgramResourceiv");
+ sf_glad_glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) load(userptr, "glInvalidateBufferData");
+ sf_glad_glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) load(userptr, "glInvalidateBufferSubData");
+ sf_glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load(userptr, "glInvalidateFramebuffer");
+ sf_glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load(userptr, "glInvalidateSubFramebuffer");
+ sf_glad_glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) load(userptr, "glInvalidateTexImage");
+ sf_glad_glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) load(userptr, "glInvalidateTexSubImage");
+ sf_glad_glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) load(userptr, "glMultiDrawArraysIndirect");
+ sf_glad_glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) load(userptr, "glMultiDrawElementsIndirect");
+ sf_glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel");
+ sf_glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel");
+ sf_glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup");
+ sf_glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup");
+ sf_glad_glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) load(userptr, "glShaderStorageBlockBinding");
+ sf_glad_glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) load(userptr, "glTexBufferRange");
+ sf_glad_glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) load(userptr, "glTexStorage2DMultisample");
+ sf_glad_glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) load(userptr, "glTexStorage3DMultisample");
+ sf_glad_glTextureView = (PFNGLTEXTUREVIEWPROC) load(userptr, "glTextureView");
+ sf_glad_glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) load(userptr, "glVertexAttribBinding");
+ sf_glad_glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) load(userptr, "glVertexAttribFormat");
+ sf_glad_glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) load(userptr, "glVertexAttribIFormat");
+ sf_glad_glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) load(userptr, "glVertexAttribLFormat");
+ sf_glad_glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) load(userptr, "glVertexBindingDivisor");
+}
+static void sf_glad_gl_load_GL_VERSION_4_4( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_4_4) return;
+ sf_glad_glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC) load(userptr, "glBindBuffersBase");
+ sf_glad_glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC) load(userptr, "glBindBuffersRange");
+ sf_glad_glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC) load(userptr, "glBindImageTextures");
+ sf_glad_glBindSamplers = (PFNGLBINDSAMPLERSPROC) load(userptr, "glBindSamplers");
+ sf_glad_glBindTextures = (PFNGLBINDTEXTURESPROC) load(userptr, "glBindTextures");
+ sf_glad_glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC) load(userptr, "glBindVertexBuffers");
+ sf_glad_glBufferStorage = (PFNGLBUFFERSTORAGEPROC) load(userptr, "glBufferStorage");
+ sf_glad_glClearTexImage = (PFNGLCLEARTEXIMAGEPROC) load(userptr, "glClearTexImage");
+ sf_glad_glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC) load(userptr, "glClearTexSubImage");
+}
+static void sf_glad_gl_load_GL_VERSION_4_5( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_4_5) return;
+ sf_glad_glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC) load(userptr, "glBindTextureUnit");
+ sf_glad_glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC) load(userptr, "glBlitNamedFramebuffer");
+ sf_glad_glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckNamedFramebufferStatus");
+ sf_glad_glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC) load(userptr, "glClearNamedBufferData");
+ sf_glad_glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC) load(userptr, "glClearNamedBufferSubData");
+ sf_glad_glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) load(userptr, "glClearNamedFramebufferfi");
+ sf_glad_glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) load(userptr, "glClearNamedFramebufferfv");
+ sf_glad_glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) load(userptr, "glClearNamedFramebufferiv");
+ sf_glad_glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) load(userptr, "glClearNamedFramebufferuiv");
+ sf_glad_glClipControl = (PFNGLCLIPCONTROLPROC) load(userptr, "glClipControl");
+ sf_glad_glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) load(userptr, "glCompressedTextureSubImage1D");
+ sf_glad_glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) load(userptr, "glCompressedTextureSubImage2D");
+ sf_glad_glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) load(userptr, "glCompressedTextureSubImage3D");
+ sf_glad_glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC) load(userptr, "glCopyNamedBufferSubData");
+ sf_glad_glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC) load(userptr, "glCopyTextureSubImage1D");
+ sf_glad_glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC) load(userptr, "glCopyTextureSubImage2D");
+ sf_glad_glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC) load(userptr, "glCopyTextureSubImage3D");
+ sf_glad_glCreateBuffers = (PFNGLCREATEBUFFERSPROC) load(userptr, "glCreateBuffers");
+ sf_glad_glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC) load(userptr, "glCreateFramebuffers");
+ sf_glad_glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC) load(userptr, "glCreateProgramPipelines");
+ sf_glad_glCreateQueries = (PFNGLCREATEQUERIESPROC) load(userptr, "glCreateQueries");
+ sf_glad_glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC) load(userptr, "glCreateRenderbuffers");
+ sf_glad_glCreateSamplers = (PFNGLCREATESAMPLERSPROC) load(userptr, "glCreateSamplers");
+ sf_glad_glCreateTextures = (PFNGLCREATETEXTURESPROC) load(userptr, "glCreateTextures");
+ sf_glad_glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC) load(userptr, "glCreateTransformFeedbacks");
+ sf_glad_glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC) load(userptr, "glCreateVertexArrays");
+ sf_glad_glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC) load(userptr, "glDisableVertexArrayAttrib");
+ sf_glad_glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC) load(userptr, "glEnableVertexArrayAttrib");
+ sf_glad_glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) load(userptr, "glFlushMappedNamedBufferRange");
+ sf_glad_glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC) load(userptr, "glGenerateTextureMipmap");
+ sf_glad_glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) load(userptr, "glGetCompressedTextureImage");
+ sf_glad_glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) load(userptr, "glGetCompressedTextureSubImage");
+ sf_glad_glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC) load(userptr, "glGetGraphicsResetStatus");
+ sf_glad_glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) load(userptr, "glGetNamedBufferParameteri64v");
+ sf_glad_glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedBufferParameteriv");
+ sf_glad_glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC) load(userptr, "glGetNamedBufferPointerv");
+ sf_glad_glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC) load(userptr, "glGetNamedBufferSubData");
+ sf_glad_glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferAttachmentParameteriv");
+ sf_glad_glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferParameteriv");
+ sf_glad_glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedRenderbufferParameteriv");
+ sf_glad_glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC) load(userptr, "glGetQueryBufferObjecti64v");
+ sf_glad_glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC) load(userptr, "glGetQueryBufferObjectiv");
+ sf_glad_glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC) load(userptr, "glGetQueryBufferObjectui64v");
+ sf_glad_glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC) load(userptr, "glGetQueryBufferObjectuiv");
+ sf_glad_glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC) load(userptr, "glGetTextureImage");
+ sf_glad_glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC) load(userptr, "glGetTextureLevelParameterfv");
+ sf_glad_glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC) load(userptr, "glGetTextureLevelParameteriv");
+ sf_glad_glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC) load(userptr, "glGetTextureParameterIiv");
+ sf_glad_glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC) load(userptr, "glGetTextureParameterIuiv");
+ sf_glad_glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC) load(userptr, "glGetTextureParameterfv");
+ sf_glad_glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC) load(userptr, "glGetTextureParameteriv");
+ sf_glad_glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC) load(userptr, "glGetTextureSubImage");
+ sf_glad_glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC) load(userptr, "glGetTransformFeedbacki64_v");
+ sf_glad_glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC) load(userptr, "glGetTransformFeedbacki_v");
+ sf_glad_glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC) load(userptr, "glGetTransformFeedbackiv");
+ sf_glad_glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC) load(userptr, "glGetVertexArrayIndexed64iv");
+ sf_glad_glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC) load(userptr, "glGetVertexArrayIndexediv");
+ sf_glad_glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC) load(userptr, "glGetVertexArrayiv");
+ sf_glad_glGetnColorTable = (PFNGLGETNCOLORTABLEPROC) load(userptr, "glGetnColorTable");
+ sf_glad_glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC) load(userptr, "glGetnCompressedTexImage");
+ sf_glad_glGetnConvolutionFilter = (PFNGLGETNCONVOLUTIONFILTERPROC) load(userptr, "glGetnConvolutionFilter");
+ sf_glad_glGetnHistogram = (PFNGLGETNHISTOGRAMPROC) load(userptr, "glGetnHistogram");
+ sf_glad_glGetnMapdv = (PFNGLGETNMAPDVPROC) load(userptr, "glGetnMapdv");
+ sf_glad_glGetnMapfv = (PFNGLGETNMAPFVPROC) load(userptr, "glGetnMapfv");
+ sf_glad_glGetnMapiv = (PFNGLGETNMAPIVPROC) load(userptr, "glGetnMapiv");
+ sf_glad_glGetnMinmax = (PFNGLGETNMINMAXPROC) load(userptr, "glGetnMinmax");
+ sf_glad_glGetnPixelMapfv = (PFNGLGETNPIXELMAPFVPROC) load(userptr, "glGetnPixelMapfv");
+ sf_glad_glGetnPixelMapuiv = (PFNGLGETNPIXELMAPUIVPROC) load(userptr, "glGetnPixelMapuiv");
+ sf_glad_glGetnPixelMapusv = (PFNGLGETNPIXELMAPUSVPROC) load(userptr, "glGetnPixelMapusv");
+ sf_glad_glGetnPolygonStipple = (PFNGLGETNPOLYGONSTIPPLEPROC) load(userptr, "glGetnPolygonStipple");
+ sf_glad_glGetnSeparableFilter = (PFNGLGETNSEPARABLEFILTERPROC) load(userptr, "glGetnSeparableFilter");
+ sf_glad_glGetnTexImage = (PFNGLGETNTEXIMAGEPROC) load(userptr, "glGetnTexImage");
+ sf_glad_glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC) load(userptr, "glGetnUniformdv");
+ sf_glad_glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC) load(userptr, "glGetnUniformfv");
+ sf_glad_glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC) load(userptr, "glGetnUniformiv");
+ sf_glad_glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC) load(userptr, "glGetnUniformuiv");
+ sf_glad_glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) load(userptr, "glInvalidateNamedFramebufferData");
+ sf_glad_glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) load(userptr, "glInvalidateNamedFramebufferSubData");
+ sf_glad_glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC) load(userptr, "glMapNamedBuffer");
+ sf_glad_glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC) load(userptr, "glMapNamedBufferRange");
+ sf_glad_glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC) load(userptr, "glMemoryBarrierByRegion");
+ sf_glad_glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC) load(userptr, "glNamedBufferData");
+ sf_glad_glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC) load(userptr, "glNamedBufferStorage");
+ sf_glad_glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC) load(userptr, "glNamedBufferSubData");
+ sf_glad_glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) load(userptr, "glNamedFramebufferDrawBuffer");
+ sf_glad_glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) load(userptr, "glNamedFramebufferDrawBuffers");
+ sf_glad_glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) load(userptr, "glNamedFramebufferParameteri");
+ sf_glad_glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) load(userptr, "glNamedFramebufferReadBuffer");
+ sf_glad_glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glNamedFramebufferRenderbuffer");
+ sf_glad_glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) load(userptr, "glNamedFramebufferTexture");
+ sf_glad_glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glNamedFramebufferTextureLayer");
+ sf_glad_glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC) load(userptr, "glNamedRenderbufferStorage");
+ sf_glad_glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glNamedRenderbufferStorageMultisample");
+ sf_glad_glReadnPixels = (PFNGLREADNPIXELSPROC) load(userptr, "glReadnPixels");
+ sf_glad_glTextureBarrier = (PFNGLTEXTUREBARRIERPROC) load(userptr, "glTextureBarrier");
+ sf_glad_glTextureBuffer = (PFNGLTEXTUREBUFFERPROC) load(userptr, "glTextureBuffer");
+ sf_glad_glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC) load(userptr, "glTextureBufferRange");
+ sf_glad_glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC) load(userptr, "glTextureParameterIiv");
+ sf_glad_glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC) load(userptr, "glTextureParameterIuiv");
+ sf_glad_glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC) load(userptr, "glTextureParameterf");
+ sf_glad_glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC) load(userptr, "glTextureParameterfv");
+ sf_glad_glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC) load(userptr, "glTextureParameteri");
+ sf_glad_glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC) load(userptr, "glTextureParameteriv");
+ sf_glad_glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC) load(userptr, "glTextureStorage1D");
+ sf_glad_glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC) load(userptr, "glTextureStorage2D");
+ sf_glad_glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) load(userptr, "glTextureStorage2DMultisample");
+ sf_glad_glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC) load(userptr, "glTextureStorage3D");
+ sf_glad_glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) load(userptr, "glTextureStorage3DMultisample");
+ sf_glad_glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC) load(userptr, "glTextureSubImage1D");
+ sf_glad_glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC) load(userptr, "glTextureSubImage2D");
+ sf_glad_glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC) load(userptr, "glTextureSubImage3D");
+ sf_glad_glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) load(userptr, "glTransformFeedbackBufferBase");
+ sf_glad_glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) load(userptr, "glTransformFeedbackBufferRange");
+ sf_glad_glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC) load(userptr, "glUnmapNamedBuffer");
+ sf_glad_glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC) load(userptr, "glVertexArrayAttribBinding");
+ sf_glad_glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC) load(userptr, "glVertexArrayAttribFormat");
+ sf_glad_glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC) load(userptr, "glVertexArrayAttribIFormat");
+ sf_glad_glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC) load(userptr, "glVertexArrayAttribLFormat");
+ sf_glad_glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC) load(userptr, "glVertexArrayBindingDivisor");
+ sf_glad_glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC) load(userptr, "glVertexArrayElementBuffer");
+ sf_glad_glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC) load(userptr, "glVertexArrayVertexBuffer");
+ sf_glad_glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC) load(userptr, "glVertexArrayVertexBuffers");
+}
+static void sf_glad_gl_load_GL_VERSION_4_6( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_4_6) return;
+ sf_glad_glMultiDrawArraysIndirectCount = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) load(userptr, "glMultiDrawArraysIndirectCount");
+ sf_glad_glMultiDrawElementsIndirectCount = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) load(userptr, "glMultiDrawElementsIndirectCount");
+ sf_glad_glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC) load(userptr, "glPolygonOffsetClamp");
+ sf_glad_glSpecializeShader = (PFNGLSPECIALIZESHADERPROC) load(userptr, "glSpecializeShader");
+}
+static void sf_glad_gl_load_GL_VERSION_ES_CM_1_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_VERSION_ES_CM_1_0) return;
+ sf_glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture");
+ sf_glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc");
+ sf_glad_glAlphaFuncx = (PFNGLALPHAFUNCXPROC) load(userptr, "glAlphaFuncx");
+ sf_glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer");
+ sf_glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture");
+ sf_glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc");
+ sf_glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData");
+ sf_glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData");
+ sf_glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear");
+ sf_glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor");
+ sf_glad_glClearColorx = (PFNGLCLEARCOLORXPROC) load(userptr, "glClearColorx");
+ sf_glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf");
+ sf_glad_glClearDepthx = (PFNGLCLEARDEPTHXPROC) load(userptr, "glClearDepthx");
+ sf_glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil");
+ sf_glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture");
+ sf_glad_glClipPlanef = (PFNGLCLIPPLANEFPROC) load(userptr, "glClipPlanef");
+ sf_glad_glClipPlanex = (PFNGLCLIPPLANEXPROC) load(userptr, "glClipPlanex");
+ sf_glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f");
+ sf_glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub");
+ sf_glad_glColor4x = (PFNGLCOLOR4XPROC) load(userptr, "glColor4x");
+ sf_glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask");
+ sf_glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer");
+ sf_glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D");
+ sf_glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D");
+ sf_glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D");
+ sf_glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D");
+ sf_glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace");
+ sf_glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers");
+ sf_glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures");
+ sf_glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc");
+ sf_glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask");
+ sf_glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef");
+ sf_glad_glDepthRangex = (PFNGLDEPTHRANGEXPROC) load(userptr, "glDepthRangex");
+ sf_glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable");
+ sf_glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState");
+ sf_glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays");
+ sf_glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements");
+ sf_glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable");
+ sf_glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState");
+ sf_glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish");
+ sf_glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush");
+ sf_glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf");
+ sf_glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv");
+ sf_glad_glFogx = (PFNGLFOGXPROC) load(userptr, "glFogx");
+ sf_glad_glFogxv = (PFNGLFOGXVPROC) load(userptr, "glFogxv");
+ sf_glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace");
+ sf_glad_glFrustumf = (PFNGLFRUSTUMFPROC) load(userptr, "glFrustumf");
+ sf_glad_glFrustumx = (PFNGLFRUSTUMXPROC) load(userptr, "glFrustumx");
+ sf_glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers");
+ sf_glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures");
+ sf_glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv");
+ sf_glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv");
+ sf_glad_glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC) load(userptr, "glGetClipPlanef");
+ sf_glad_glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC) load(userptr, "glGetClipPlanex");
+ sf_glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError");
+ sf_glad_glGetFixedv = (PFNGLGETFIXEDVPROC) load(userptr, "glGetFixedv");
+ sf_glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv");
+ sf_glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv");
+ sf_glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv");
+ sf_glad_glGetLightxv = (PFNGLGETLIGHTXVPROC) load(userptr, "glGetLightxv");
+ sf_glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv");
+ sf_glad_glGetMaterialxv = (PFNGLGETMATERIALXVPROC) load(userptr, "glGetMaterialxv");
+ sf_glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ sf_glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ sf_glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv");
+ sf_glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv");
+ sf_glad_glGetTexEnvxv = (PFNGLGETTEXENVXVPROC) load(userptr, "glGetTexEnvxv");
+ sf_glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv");
+ sf_glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv");
+ sf_glad_glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC) load(userptr, "glGetTexParameterxv");
+ sf_glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint");
+ sf_glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer");
+ sf_glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled");
+ sf_glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture");
+ sf_glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf");
+ sf_glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv");
+ sf_glad_glLightModelx = (PFNGLLIGHTMODELXPROC) load(userptr, "glLightModelx");
+ sf_glad_glLightModelxv = (PFNGLLIGHTMODELXVPROC) load(userptr, "glLightModelxv");
+ sf_glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf");
+ sf_glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv");
+ sf_glad_glLightx = (PFNGLLIGHTXPROC) load(userptr, "glLightx");
+ sf_glad_glLightxv = (PFNGLLIGHTXVPROC) load(userptr, "glLightxv");
+ sf_glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth");
+ sf_glad_glLineWidthx = (PFNGLLINEWIDTHXPROC) load(userptr, "glLineWidthx");
+ sf_glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity");
+ sf_glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf");
+ sf_glad_glLoadMatrixx = (PFNGLLOADMATRIXXPROC) load(userptr, "glLoadMatrixx");
+ sf_glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp");
+ sf_glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf");
+ sf_glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv");
+ sf_glad_glMaterialx = (PFNGLMATERIALXPROC) load(userptr, "glMaterialx");
+ sf_glad_glMaterialxv = (PFNGLMATERIALXVPROC) load(userptr, "glMaterialxv");
+ sf_glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode");
+ sf_glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf");
+ sf_glad_glMultMatrixx = (PFNGLMULTMATRIXXPROC) load(userptr, "glMultMatrixx");
+ sf_glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f");
+ sf_glad_glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC) load(userptr, "glMultiTexCoord4x");
+ sf_glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f");
+ sf_glad_glNormal3x = (PFNGLNORMAL3XPROC) load(userptr, "glNormal3x");
+ sf_glad_glNormalPointer = (PFNGLNORMALPOINTERPROC) load(userptr, "glNormalPointer");
+ sf_glad_glOrthof = (PFNGLORTHOFPROC) load(userptr, "glOrthof");
+ sf_glad_glOrthox = (PFNGLORTHOXPROC) load(userptr, "glOrthox");
+ sf_glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei");
+ sf_glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(userptr, "glPointParameterf");
+ sf_glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(userptr, "glPointParameterfv");
+ sf_glad_glPointParameterx = (PFNGLPOINTPARAMETERXPROC) load(userptr, "glPointParameterx");
+ sf_glad_glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC) load(userptr, "glPointParameterxv");
+ sf_glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize");
+ sf_glad_glPointSizex = (PFNGLPOINTSIZEXPROC) load(userptr, "glPointSizex");
+ sf_glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset");
+ sf_glad_glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC) load(userptr, "glPolygonOffsetx");
+ sf_glad_glPopMatrix = (PFNGLPOPMATRIXPROC) load(userptr, "glPopMatrix");
+ sf_glad_glPushMatrix = (PFNGLPUSHMATRIXPROC) load(userptr, "glPushMatrix");
+ sf_glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels");
+ sf_glad_glRotatef = (PFNGLROTATEFPROC) load(userptr, "glRotatef");
+ sf_glad_glRotatex = (PFNGLROTATEXPROC) load(userptr, "glRotatex");
+ sf_glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage");
+ sf_glad_glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC) load(userptr, "glSampleCoveragex");
+ sf_glad_glScalef = (PFNGLSCALEFPROC) load(userptr, "glScalef");
+ sf_glad_glScalex = (PFNGLSCALEXPROC) load(userptr, "glScalex");
+ sf_glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor");
+ sf_glad_glShadeModel = (PFNGLSHADEMODELPROC) load(userptr, "glShadeModel");
+ sf_glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc");
+ sf_glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask");
+ sf_glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp");
+ sf_glad_glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load(userptr, "glTexCoordPointer");
+ sf_glad_glTexEnvf = (PFNGLTEXENVFPROC) load(userptr, "glTexEnvf");
+ sf_glad_glTexEnvfv = (PFNGLTEXENVFVPROC) load(userptr, "glTexEnvfv");
+ sf_glad_glTexEnvi = (PFNGLTEXENVIPROC) load(userptr, "glTexEnvi");
+ sf_glad_glTexEnviv = (PFNGLTEXENVIVPROC) load(userptr, "glTexEnviv");
+ sf_glad_glTexEnvx = (PFNGLTEXENVXPROC) load(userptr, "glTexEnvx");
+ sf_glad_glTexEnvxv = (PFNGLTEXENVXVPROC) load(userptr, "glTexEnvxv");
+ sf_glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D");
+ sf_glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf");
+ sf_glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv");
+ sf_glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri");
+ sf_glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv");
+ sf_glad_glTexParameterx = (PFNGLTEXPARAMETERXPROC) load(userptr, "glTexParameterx");
+ sf_glad_glTexParameterxv = (PFNGLTEXPARAMETERXVPROC) load(userptr, "glTexParameterxv");
+ sf_glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D");
+ sf_glad_glTranslatef = (PFNGLTRANSLATEFPROC) load(userptr, "glTranslatef");
+ sf_glad_glTranslatex = (PFNGLTRANSLATEXPROC) load(userptr, "glTranslatex");
+ sf_glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer");
+ sf_glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport");
+}
+static void sf_glad_gl_load_GL_ARB_ES2_compatibility( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_ES2_compatibility) return;
+ sf_glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf");
+ sf_glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef");
+ sf_glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(userptr, "glGetShaderPrecisionFormat");
+ sf_glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(userptr, "glReleaseShaderCompiler");
+ sf_glad_glShaderBinary = (PFNGLSHADERBINARYPROC) load(userptr, "glShaderBinary");
+}
+static void sf_glad_gl_load_GL_ARB_ES3_1_compatibility( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_ES3_1_compatibility) return;
+ sf_glad_glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC) load(userptr, "glMemoryBarrierByRegion");
+}
+static void sf_glad_gl_load_GL_ARB_base_instance( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_base_instance) return;
+ sf_glad_glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawArraysInstancedBaseInstance");
+ sf_glad_glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseInstance");
+ sf_glad_glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseVertexBaseInstance");
+}
+static void sf_glad_gl_load_GL_ARB_blend_func_extended( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_blend_func_extended) return;
+ sf_glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(userptr, "glBindFragDataLocationIndexed");
+ sf_glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(userptr, "glGetFragDataIndex");
+}
+static void sf_glad_gl_load_GL_ARB_buffer_storage( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_buffer_storage) return;
+ sf_glad_glBufferStorage = (PFNGLBUFFERSTORAGEPROC) load(userptr, "glBufferStorage");
+}
+static void sf_glad_gl_load_GL_ARB_clear_buffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_clear_buffer_object) return;
+ sf_glad_glClearBufferData = (PFNGLCLEARBUFFERDATAPROC) load(userptr, "glClearBufferData");
+ sf_glad_glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) load(userptr, "glClearBufferSubData");
+}
+static void sf_glad_gl_load_GL_ARB_clear_texture( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_clear_texture) return;
+ sf_glad_glClearTexImage = (PFNGLCLEARTEXIMAGEPROC) load(userptr, "glClearTexImage");
+ sf_glad_glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC) load(userptr, "glClearTexSubImage");
+}
+static void sf_glad_gl_load_GL_ARB_clip_control( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_clip_control) return;
+ sf_glad_glClipControl = (PFNGLCLIPCONTROLPROC) load(userptr, "glClipControl");
+}
+static void sf_glad_gl_load_GL_ARB_compute_shader( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_compute_shader) return;
+ sf_glad_glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) load(userptr, "glDispatchCompute");
+ sf_glad_glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) load(userptr, "glDispatchComputeIndirect");
+}
+static void sf_glad_gl_load_GL_ARB_copy_buffer( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_copy_buffer) return;
+ sf_glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData");
+}
+static void sf_glad_gl_load_GL_ARB_copy_image( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_copy_image) return;
+ sf_glad_glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) load(userptr, "glCopyImageSubData");
+}
+static void sf_glad_gl_load_GL_ARB_direct_state_access( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_direct_state_access) return;
+ sf_glad_glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC) load(userptr, "glBindTextureUnit");
+ sf_glad_glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC) load(userptr, "glBlitNamedFramebuffer");
+ sf_glad_glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckNamedFramebufferStatus");
+ sf_glad_glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC) load(userptr, "glClearNamedBufferData");
+ sf_glad_glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC) load(userptr, "glClearNamedBufferSubData");
+ sf_glad_glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) load(userptr, "glClearNamedFramebufferfi");
+ sf_glad_glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) load(userptr, "glClearNamedFramebufferfv");
+ sf_glad_glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) load(userptr, "glClearNamedFramebufferiv");
+ sf_glad_glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) load(userptr, "glClearNamedFramebufferuiv");
+ sf_glad_glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) load(userptr, "glCompressedTextureSubImage1D");
+ sf_glad_glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) load(userptr, "glCompressedTextureSubImage2D");
+ sf_glad_glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) load(userptr, "glCompressedTextureSubImage3D");
+ sf_glad_glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC) load(userptr, "glCopyNamedBufferSubData");
+ sf_glad_glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC) load(userptr, "glCopyTextureSubImage1D");
+ sf_glad_glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC) load(userptr, "glCopyTextureSubImage2D");
+ sf_glad_glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC) load(userptr, "glCopyTextureSubImage3D");
+ sf_glad_glCreateBuffers = (PFNGLCREATEBUFFERSPROC) load(userptr, "glCreateBuffers");
+ sf_glad_glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC) load(userptr, "glCreateFramebuffers");
+ sf_glad_glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC) load(userptr, "glCreateProgramPipelines");
+ sf_glad_glCreateQueries = (PFNGLCREATEQUERIESPROC) load(userptr, "glCreateQueries");
+ sf_glad_glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC) load(userptr, "glCreateRenderbuffers");
+ sf_glad_glCreateSamplers = (PFNGLCREATESAMPLERSPROC) load(userptr, "glCreateSamplers");
+ sf_glad_glCreateTextures = (PFNGLCREATETEXTURESPROC) load(userptr, "glCreateTextures");
+ sf_glad_glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC) load(userptr, "glCreateTransformFeedbacks");
+ sf_glad_glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC) load(userptr, "glCreateVertexArrays");
+ sf_glad_glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC) load(userptr, "glDisableVertexArrayAttrib");
+ sf_glad_glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC) load(userptr, "glEnableVertexArrayAttrib");
+ sf_glad_glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) load(userptr, "glFlushMappedNamedBufferRange");
+ sf_glad_glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC) load(userptr, "glGenerateTextureMipmap");
+ sf_glad_glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) load(userptr, "glGetCompressedTextureImage");
+ sf_glad_glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) load(userptr, "glGetNamedBufferParameteri64v");
+ sf_glad_glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedBufferParameteriv");
+ sf_glad_glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC) load(userptr, "glGetNamedBufferPointerv");
+ sf_glad_glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC) load(userptr, "glGetNamedBufferSubData");
+ sf_glad_glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferAttachmentParameteriv");
+ sf_glad_glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferParameteriv");
+ sf_glad_glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedRenderbufferParameteriv");
+ sf_glad_glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC) load(userptr, "glGetQueryBufferObjecti64v");
+ sf_glad_glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC) load(userptr, "glGetQueryBufferObjectiv");
+ sf_glad_glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC) load(userptr, "glGetQueryBufferObjectui64v");
+ sf_glad_glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC) load(userptr, "glGetQueryBufferObjectuiv");
+ sf_glad_glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC) load(userptr, "glGetTextureImage");
+ sf_glad_glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC) load(userptr, "glGetTextureLevelParameterfv");
+ sf_glad_glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC) load(userptr, "glGetTextureLevelParameteriv");
+ sf_glad_glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC) load(userptr, "glGetTextureParameterIiv");
+ sf_glad_glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC) load(userptr, "glGetTextureParameterIuiv");
+ sf_glad_glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC) load(userptr, "glGetTextureParameterfv");
+ sf_glad_glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC) load(userptr, "glGetTextureParameteriv");
+ sf_glad_glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC) load(userptr, "glGetTransformFeedbacki64_v");
+ sf_glad_glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC) load(userptr, "glGetTransformFeedbacki_v");
+ sf_glad_glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC) load(userptr, "glGetTransformFeedbackiv");
+ sf_glad_glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC) load(userptr, "glGetVertexArrayIndexed64iv");
+ sf_glad_glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC) load(userptr, "glGetVertexArrayIndexediv");
+ sf_glad_glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC) load(userptr, "glGetVertexArrayiv");
+ sf_glad_glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) load(userptr, "glInvalidateNamedFramebufferData");
+ sf_glad_glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) load(userptr, "glInvalidateNamedFramebufferSubData");
+ sf_glad_glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC) load(userptr, "glMapNamedBuffer");
+ sf_glad_glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC) load(userptr, "glMapNamedBufferRange");
+ sf_glad_glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC) load(userptr, "glNamedBufferData");
+ sf_glad_glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC) load(userptr, "glNamedBufferStorage");
+ sf_glad_glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC) load(userptr, "glNamedBufferSubData");
+ sf_glad_glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) load(userptr, "glNamedFramebufferDrawBuffer");
+ sf_glad_glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) load(userptr, "glNamedFramebufferDrawBuffers");
+ sf_glad_glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) load(userptr, "glNamedFramebufferParameteri");
+ sf_glad_glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) load(userptr, "glNamedFramebufferReadBuffer");
+ sf_glad_glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glNamedFramebufferRenderbuffer");
+ sf_glad_glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) load(userptr, "glNamedFramebufferTexture");
+ sf_glad_glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glNamedFramebufferTextureLayer");
+ sf_glad_glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC) load(userptr, "glNamedRenderbufferStorage");
+ sf_glad_glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glNamedRenderbufferStorageMultisample");
+ sf_glad_glTextureBuffer = (PFNGLTEXTUREBUFFERPROC) load(userptr, "glTextureBuffer");
+ sf_glad_glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC) load(userptr, "glTextureBufferRange");
+ sf_glad_glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC) load(userptr, "glTextureParameterIiv");
+ sf_glad_glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC) load(userptr, "glTextureParameterIuiv");
+ sf_glad_glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC) load(userptr, "glTextureParameterf");
+ sf_glad_glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC) load(userptr, "glTextureParameterfv");
+ sf_glad_glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC) load(userptr, "glTextureParameteri");
+ sf_glad_glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC) load(userptr, "glTextureParameteriv");
+ sf_glad_glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC) load(userptr, "glTextureStorage1D");
+ sf_glad_glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC) load(userptr, "glTextureStorage2D");
+ sf_glad_glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) load(userptr, "glTextureStorage2DMultisample");
+ sf_glad_glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC) load(userptr, "glTextureStorage3D");
+ sf_glad_glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) load(userptr, "glTextureStorage3DMultisample");
+ sf_glad_glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC) load(userptr, "glTextureSubImage1D");
+ sf_glad_glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC) load(userptr, "glTextureSubImage2D");
+ sf_glad_glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC) load(userptr, "glTextureSubImage3D");
+ sf_glad_glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) load(userptr, "glTransformFeedbackBufferBase");
+ sf_glad_glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) load(userptr, "glTransformFeedbackBufferRange");
+ sf_glad_glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC) load(userptr, "glUnmapNamedBuffer");
+ sf_glad_glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC) load(userptr, "glVertexArrayAttribBinding");
+ sf_glad_glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC) load(userptr, "glVertexArrayAttribFormat");
+ sf_glad_glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC) load(userptr, "glVertexArrayAttribIFormat");
+ sf_glad_glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC) load(userptr, "glVertexArrayAttribLFormat");
+ sf_glad_glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC) load(userptr, "glVertexArrayBindingDivisor");
+ sf_glad_glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC) load(userptr, "glVertexArrayElementBuffer");
+ sf_glad_glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC) load(userptr, "glVertexArrayVertexBuffer");
+ sf_glad_glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC) load(userptr, "glVertexArrayVertexBuffers");
+}
+static void sf_glad_gl_load_GL_ARB_draw_elements_base_vertex( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_draw_elements_base_vertex) return;
+ sf_glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex");
+ sf_glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex");
+ sf_glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex");
+ sf_glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glMultiDrawElementsBaseVertex");
+}
+static void sf_glad_gl_load_GL_ARB_draw_indirect( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_draw_indirect) return;
+ sf_glad_glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) load(userptr, "glDrawArraysIndirect");
+ sf_glad_glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) load(userptr, "glDrawElementsIndirect");
+}
+static void sf_glad_gl_load_GL_ARB_fragment_program( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_fragment_program) return;
+ sf_glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB");
+ sf_glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB");
+ sf_glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB");
+ sf_glad_glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) load(userptr, "glGetProgramEnvParameterdvARB");
+ sf_glad_glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) load(userptr, "glGetProgramEnvParameterfvARB");
+ sf_glad_glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) load(userptr, "glGetProgramLocalParameterdvARB");
+ sf_glad_glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) load(userptr, "glGetProgramLocalParameterfvARB");
+ sf_glad_glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) load(userptr, "glGetProgramStringARB");
+ sf_glad_glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) load(userptr, "glGetProgramivARB");
+ sf_glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB");
+ sf_glad_glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) load(userptr, "glProgramEnvParameter4dARB");
+ sf_glad_glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) load(userptr, "glProgramEnvParameter4dvARB");
+ sf_glad_glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) load(userptr, "glProgramEnvParameter4fARB");
+ sf_glad_glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) load(userptr, "glProgramEnvParameter4fvARB");
+ sf_glad_glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) load(userptr, "glProgramLocalParameter4dARB");
+ sf_glad_glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) load(userptr, "glProgramLocalParameter4dvARB");
+ sf_glad_glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) load(userptr, "glProgramLocalParameter4fARB");
+ sf_glad_glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) load(userptr, "glProgramLocalParameter4fvARB");
+ sf_glad_glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) load(userptr, "glProgramStringARB");
+}
+static void sf_glad_gl_load_GL_ARB_framebuffer_no_attachments( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_framebuffer_no_attachments) return;
+ sf_glad_glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) load(userptr, "glFramebufferParameteri");
+ sf_glad_glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetFramebufferParameteriv");
+}
+static void sf_glad_gl_load_GL_ARB_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_framebuffer_object) return;
+ sf_glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer");
+ sf_glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer");
+ sf_glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer");
+ sf_glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus");
+ sf_glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers");
+ sf_glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers");
+ sf_glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer");
+ sf_glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D");
+ sf_glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D");
+ sf_glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D");
+ sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer");
+ sf_glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers");
+ sf_glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers");
+ sf_glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap");
+ sf_glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv");
+ sf_glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv");
+ sf_glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer");
+ sf_glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer");
+ sf_glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage");
+ sf_glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample");
+}
+static void sf_glad_gl_load_GL_ARB_geometry_shader4( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_geometry_shader4) return;
+ sf_glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC) load(userptr, "glFramebufferTextureARB");
+ sf_glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB");
+ sf_glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) load(userptr, "glFramebufferTextureLayerARB");
+ sf_glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC) load(userptr, "glProgramParameteriARB");
+}
+static void sf_glad_gl_load_GL_ARB_get_program_binary( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_get_program_binary) return;
+ sf_glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary");
+ sf_glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary");
+ sf_glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+}
+static void sf_glad_gl_load_GL_ARB_get_texture_sub_image( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_get_texture_sub_image) return;
+ sf_glad_glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) load(userptr, "glGetCompressedTextureSubImage");
+ sf_glad_glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC) load(userptr, "glGetTextureSubImage");
+}
+static void sf_glad_gl_load_GL_ARB_gpu_shader_fp64( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_gpu_shader_fp64) return;
+ sf_glad_glGetUniformdv = (PFNGLGETUNIFORMDVPROC) load(userptr, "glGetUniformdv");
+ sf_glad_glUniform1d = (PFNGLUNIFORM1DPROC) load(userptr, "glUniform1d");
+ sf_glad_glUniform1dv = (PFNGLUNIFORM1DVPROC) load(userptr, "glUniform1dv");
+ sf_glad_glUniform2d = (PFNGLUNIFORM2DPROC) load(userptr, "glUniform2d");
+ sf_glad_glUniform2dv = (PFNGLUNIFORM2DVPROC) load(userptr, "glUniform2dv");
+ sf_glad_glUniform3d = (PFNGLUNIFORM3DPROC) load(userptr, "glUniform3d");
+ sf_glad_glUniform3dv = (PFNGLUNIFORM3DVPROC) load(userptr, "glUniform3dv");
+ sf_glad_glUniform4d = (PFNGLUNIFORM4DPROC) load(userptr, "glUniform4d");
+ sf_glad_glUniform4dv = (PFNGLUNIFORM4DVPROC) load(userptr, "glUniform4dv");
+ sf_glad_glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) load(userptr, "glUniformMatrix2dv");
+ sf_glad_glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) load(userptr, "glUniformMatrix2x3dv");
+ sf_glad_glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) load(userptr, "glUniformMatrix2x4dv");
+ sf_glad_glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) load(userptr, "glUniformMatrix3dv");
+ sf_glad_glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) load(userptr, "glUniformMatrix3x2dv");
+ sf_glad_glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) load(userptr, "glUniformMatrix3x4dv");
+ sf_glad_glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) load(userptr, "glUniformMatrix4dv");
+ sf_glad_glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) load(userptr, "glUniformMatrix4x2dv");
+ sf_glad_glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) load(userptr, "glUniformMatrix4x3dv");
+}
+static void sf_glad_gl_load_GL_ARB_imaging( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_imaging) return;
+ sf_glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor");
+ sf_glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation");
+ sf_glad_glColorSubTable = (PFNGLCOLORSUBTABLEPROC) load(userptr, "glColorSubTable");
+ sf_glad_glColorTable = (PFNGLCOLORTABLEPROC) load(userptr, "glColorTable");
+ sf_glad_glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC) load(userptr, "glColorTableParameterfv");
+ sf_glad_glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC) load(userptr, "glColorTableParameteriv");
+ sf_glad_glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC) load(userptr, "glConvolutionFilter1D");
+ sf_glad_glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC) load(userptr, "glConvolutionFilter2D");
+ sf_glad_glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC) load(userptr, "glConvolutionParameterf");
+ sf_glad_glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC) load(userptr, "glConvolutionParameterfv");
+ sf_glad_glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC) load(userptr, "glConvolutionParameteri");
+ sf_glad_glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC) load(userptr, "glConvolutionParameteriv");
+ sf_glad_glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC) load(userptr, "glCopyColorSubTable");
+ sf_glad_glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC) load(userptr, "glCopyColorTable");
+ sf_glad_glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC) load(userptr, "glCopyConvolutionFilter1D");
+ sf_glad_glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC) load(userptr, "glCopyConvolutionFilter2D");
+ sf_glad_glGetColorTable = (PFNGLGETCOLORTABLEPROC) load(userptr, "glGetColorTable");
+ sf_glad_glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC) load(userptr, "glGetColorTableParameterfv");
+ sf_glad_glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC) load(userptr, "glGetColorTableParameteriv");
+ sf_glad_glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC) load(userptr, "glGetConvolutionFilter");
+ sf_glad_glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC) load(userptr, "glGetConvolutionParameterfv");
+ sf_glad_glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC) load(userptr, "glGetConvolutionParameteriv");
+ sf_glad_glGetHistogram = (PFNGLGETHISTOGRAMPROC) load(userptr, "glGetHistogram");
+ sf_glad_glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC) load(userptr, "glGetHistogramParameterfv");
+ sf_glad_glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC) load(userptr, "glGetHistogramParameteriv");
+ sf_glad_glGetMinmax = (PFNGLGETMINMAXPROC) load(userptr, "glGetMinmax");
+ sf_glad_glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC) load(userptr, "glGetMinmaxParameterfv");
+ sf_glad_glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC) load(userptr, "glGetMinmaxParameteriv");
+ sf_glad_glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC) load(userptr, "glGetSeparableFilter");
+ sf_glad_glHistogram = (PFNGLHISTOGRAMPROC) load(userptr, "glHistogram");
+ sf_glad_glMinmax = (PFNGLMINMAXPROC) load(userptr, "glMinmax");
+ sf_glad_glResetHistogram = (PFNGLRESETHISTOGRAMPROC) load(userptr, "glResetHistogram");
+ sf_glad_glResetMinmax = (PFNGLRESETMINMAXPROC) load(userptr, "glResetMinmax");
+ sf_glad_glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC) load(userptr, "glSeparableFilter2D");
+}
+static void sf_glad_gl_load_GL_ARB_internalformat_query( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_internalformat_query) return;
+ sf_glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load(userptr, "glGetInternalformativ");
+}
+static void sf_glad_gl_load_GL_ARB_internalformat_query2( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_internalformat_query2) return;
+ sf_glad_glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) load(userptr, "glGetInternalformati64v");
+}
+static void sf_glad_gl_load_GL_ARB_invalidate_subdata( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_invalidate_subdata) return;
+ sf_glad_glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) load(userptr, "glInvalidateBufferData");
+ sf_glad_glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) load(userptr, "glInvalidateBufferSubData");
+ sf_glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load(userptr, "glInvalidateFramebuffer");
+ sf_glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load(userptr, "glInvalidateSubFramebuffer");
+ sf_glad_glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) load(userptr, "glInvalidateTexImage");
+ sf_glad_glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) load(userptr, "glInvalidateTexSubImage");
+}
+static void sf_glad_gl_load_GL_ARB_map_buffer_range( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_map_buffer_range) return;
+ sf_glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange");
+ sf_glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange");
+}
+static void sf_glad_gl_load_GL_ARB_multi_bind( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_multi_bind) return;
+ sf_glad_glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC) load(userptr, "glBindBuffersBase");
+ sf_glad_glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC) load(userptr, "glBindBuffersRange");
+ sf_glad_glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC) load(userptr, "glBindImageTextures");
+ sf_glad_glBindSamplers = (PFNGLBINDSAMPLERSPROC) load(userptr, "glBindSamplers");
+ sf_glad_glBindTextures = (PFNGLBINDTEXTURESPROC) load(userptr, "glBindTextures");
+ sf_glad_glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC) load(userptr, "glBindVertexBuffers");
+}
+static void sf_glad_gl_load_GL_ARB_multi_draw_indirect( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_multi_draw_indirect) return;
+ sf_glad_glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) load(userptr, "glMultiDrawArraysIndirect");
+ sf_glad_glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) load(userptr, "glMultiDrawElementsIndirect");
+}
+static void sf_glad_gl_load_GL_ARB_multitexture( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_multitexture) return;
+ sf_glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) load(userptr, "glActiveTextureARB");
+ sf_glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) load(userptr, "glClientActiveTextureARB");
+ sf_glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC) load(userptr, "glMultiTexCoord1dARB");
+ sf_glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC) load(userptr, "glMultiTexCoord1dvARB");
+ sf_glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC) load(userptr, "glMultiTexCoord1fARB");
+ sf_glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC) load(userptr, "glMultiTexCoord1fvARB");
+ sf_glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC) load(userptr, "glMultiTexCoord1iARB");
+ sf_glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC) load(userptr, "glMultiTexCoord1ivARB");
+ sf_glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC) load(userptr, "glMultiTexCoord1sARB");
+ sf_glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC) load(userptr, "glMultiTexCoord1svARB");
+ sf_glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC) load(userptr, "glMultiTexCoord2dARB");
+ sf_glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC) load(userptr, "glMultiTexCoord2dvARB");
+ sf_glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) load(userptr, "glMultiTexCoord2fARB");
+ sf_glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC) load(userptr, "glMultiTexCoord2fvARB");
+ sf_glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC) load(userptr, "glMultiTexCoord2iARB");
+ sf_glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC) load(userptr, "glMultiTexCoord2ivARB");
+ sf_glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC) load(userptr, "glMultiTexCoord2sARB");
+ sf_glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC) load(userptr, "glMultiTexCoord2svARB");
+ sf_glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC) load(userptr, "glMultiTexCoord3dARB");
+ sf_glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC) load(userptr, "glMultiTexCoord3dvARB");
+ sf_glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC) load(userptr, "glMultiTexCoord3fARB");
+ sf_glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC) load(userptr, "glMultiTexCoord3fvARB");
+ sf_glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC) load(userptr, "glMultiTexCoord3iARB");
+ sf_glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC) load(userptr, "glMultiTexCoord3ivARB");
+ sf_glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC) load(userptr, "glMultiTexCoord3sARB");
+ sf_glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC) load(userptr, "glMultiTexCoord3svARB");
+ sf_glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC) load(userptr, "glMultiTexCoord4dARB");
+ sf_glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC) load(userptr, "glMultiTexCoord4dvARB");
+ sf_glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC) load(userptr, "glMultiTexCoord4fARB");
+ sf_glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC) load(userptr, "glMultiTexCoord4fvARB");
+ sf_glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC) load(userptr, "glMultiTexCoord4iARB");
+ sf_glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC) load(userptr, "glMultiTexCoord4ivARB");
+ sf_glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC) load(userptr, "glMultiTexCoord4sARB");
+ sf_glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC) load(userptr, "glMultiTexCoord4svARB");
+}
+static void sf_glad_gl_load_GL_ARB_polygon_offset_clamp( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_polygon_offset_clamp) return;
+ sf_glad_glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC) load(userptr, "glPolygonOffsetClamp");
+}
+static void sf_glad_gl_load_GL_ARB_program_interface_query( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_program_interface_query) return;
+ sf_glad_glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) load(userptr, "glGetProgramInterfaceiv");
+ sf_glad_glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) load(userptr, "glGetProgramResourceIndex");
+ sf_glad_glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) load(userptr, "glGetProgramResourceLocation");
+ sf_glad_glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) load(userptr, "glGetProgramResourceLocationIndex");
+ sf_glad_glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) load(userptr, "glGetProgramResourceName");
+ sf_glad_glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) load(userptr, "glGetProgramResourceiv");
+}
+static void sf_glad_gl_load_GL_ARB_provoking_vertex( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_provoking_vertex) return;
+ sf_glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(userptr, "glProvokingVertex");
+}
+static void sf_glad_gl_load_GL_ARB_sampler_objects( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_sampler_objects) return;
+ sf_glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler");
+ sf_glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers");
+ sf_glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers");
+ sf_glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv");
+ sf_glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv");
+ sf_glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv");
+ sf_glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv");
+ sf_glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler");
+ sf_glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv");
+ sf_glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv");
+ sf_glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf");
+ sf_glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv");
+ sf_glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri");
+ sf_glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv");
+}
+static void sf_glad_gl_load_GL_ARB_separate_shader_objects( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_separate_shader_objects) return;
+ sf_glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram");
+ sf_glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(userptr, "glBindProgramPipeline");
+ sf_glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(userptr, "glCreateShaderProgramv");
+ sf_glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(userptr, "glDeleteProgramPipelines");
+ sf_glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(userptr, "glGenProgramPipelines");
+ sf_glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(userptr, "glGetProgramPipelineInfoLog");
+ sf_glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(userptr, "glGetProgramPipelineiv");
+ sf_glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(userptr, "glIsProgramPipeline");
+ sf_glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
+ sf_glad_glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load(userptr, "glProgramUniform1d");
+ sf_glad_glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load(userptr, "glProgramUniform1dv");
+ sf_glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(userptr, "glProgramUniform1f");
+ sf_glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(userptr, "glProgramUniform1fv");
+ sf_glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(userptr, "glProgramUniform1i");
+ sf_glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(userptr, "glProgramUniform1iv");
+ sf_glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(userptr, "glProgramUniform1ui");
+ sf_glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(userptr, "glProgramUniform1uiv");
+ sf_glad_glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load(userptr, "glProgramUniform2d");
+ sf_glad_glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load(userptr, "glProgramUniform2dv");
+ sf_glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(userptr, "glProgramUniform2f");
+ sf_glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(userptr, "glProgramUniform2fv");
+ sf_glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(userptr, "glProgramUniform2i");
+ sf_glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(userptr, "glProgramUniform2iv");
+ sf_glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(userptr, "glProgramUniform2ui");
+ sf_glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(userptr, "glProgramUniform2uiv");
+ sf_glad_glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load(userptr, "glProgramUniform3d");
+ sf_glad_glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load(userptr, "glProgramUniform3dv");
+ sf_glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(userptr, "glProgramUniform3f");
+ sf_glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(userptr, "glProgramUniform3fv");
+ sf_glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(userptr, "glProgramUniform3i");
+ sf_glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(userptr, "glProgramUniform3iv");
+ sf_glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(userptr, "glProgramUniform3ui");
+ sf_glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(userptr, "glProgramUniform3uiv");
+ sf_glad_glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load(userptr, "glProgramUniform4d");
+ sf_glad_glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load(userptr, "glProgramUniform4dv");
+ sf_glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(userptr, "glProgramUniform4f");
+ sf_glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(userptr, "glProgramUniform4fv");
+ sf_glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(userptr, "glProgramUniform4i");
+ sf_glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(userptr, "glProgramUniform4iv");
+ sf_glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(userptr, "glProgramUniform4ui");
+ sf_glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(userptr, "glProgramUniform4uiv");
+ sf_glad_glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load(userptr, "glProgramUniformMatrix2dv");
+ sf_glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(userptr, "glProgramUniformMatrix2fv");
+ sf_glad_glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load(userptr, "glProgramUniformMatrix2x3dv");
+ sf_glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(userptr, "glProgramUniformMatrix2x3fv");
+ sf_glad_glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load(userptr, "glProgramUniformMatrix2x4dv");
+ sf_glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(userptr, "glProgramUniformMatrix2x4fv");
+ sf_glad_glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load(userptr, "glProgramUniformMatrix3dv");
+ sf_glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(userptr, "glProgramUniformMatrix3fv");
+ sf_glad_glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load(userptr, "glProgramUniformMatrix3x2dv");
+ sf_glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(userptr, "glProgramUniformMatrix3x2fv");
+ sf_glad_glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load(userptr, "glProgramUniformMatrix3x4dv");
+ sf_glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(userptr, "glProgramUniformMatrix3x4fv");
+ sf_glad_glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load(userptr, "glProgramUniformMatrix4dv");
+ sf_glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(userptr, "glProgramUniformMatrix4fv");
+ sf_glad_glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load(userptr, "glProgramUniformMatrix4x2dv");
+ sf_glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(userptr, "glProgramUniformMatrix4x2fv");
+ sf_glad_glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load(userptr, "glProgramUniformMatrix4x3dv");
+ sf_glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(userptr, "glProgramUniformMatrix4x3fv");
+ sf_glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages");
+ sf_glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline");
+}
+static void sf_glad_gl_load_GL_ARB_shader_atomic_counters( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_shader_atomic_counters) return;
+ sf_glad_glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) load(userptr, "glGetActiveAtomicCounterBufferiv");
+}
+static void sf_glad_gl_load_GL_ARB_shader_image_load_store( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_shader_image_load_store) return;
+ sf_glad_glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) load(userptr, "glBindImageTexture");
+ sf_glad_glMemoryBarrier = (PFNGLMEMORYBARRIERPROC) load(userptr, "glMemoryBarrier");
+}
+static void sf_glad_gl_load_GL_ARB_shader_objects( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_shader_objects) return;
+ sf_glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) load(userptr, "glAttachObjectARB");
+ sf_glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) load(userptr, "glCompileShaderARB");
+ sf_glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) load(userptr, "glCreateProgramObjectARB");
+ sf_glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) load(userptr, "glCreateShaderObjectARB");
+ sf_glad_glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) load(userptr, "glDeleteObjectARB");
+ sf_glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) load(userptr, "glDetachObjectARB");
+ sf_glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) load(userptr, "glGetActiveUniformARB");
+ sf_glad_glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) load(userptr, "glGetAttachedObjectsARB");
+ sf_glad_glGetHandleARB = (PFNGLGETHANDLEARBPROC) load(userptr, "glGetHandleARB");
+ sf_glad_glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) load(userptr, "glGetInfoLogARB");
+ sf_glad_glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) load(userptr, "glGetObjectParameterfvARB");
+ sf_glad_glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) load(userptr, "glGetObjectParameterivARB");
+ sf_glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) load(userptr, "glGetShaderSourceARB");
+ sf_glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) load(userptr, "glGetUniformLocationARB");
+ sf_glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) load(userptr, "glGetUniformfvARB");
+ sf_glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) load(userptr, "glGetUniformivARB");
+ sf_glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) load(userptr, "glLinkProgramARB");
+ sf_glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) load(userptr, "glShaderSourceARB");
+ sf_glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC) load(userptr, "glUniform1fARB");
+ sf_glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) load(userptr, "glUniform1fvARB");
+ sf_glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC) load(userptr, "glUniform1iARB");
+ sf_glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) load(userptr, "glUniform1ivARB");
+ sf_glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC) load(userptr, "glUniform2fARB");
+ sf_glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) load(userptr, "glUniform2fvARB");
+ sf_glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC) load(userptr, "glUniform2iARB");
+ sf_glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) load(userptr, "glUniform2ivARB");
+ sf_glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC) load(userptr, "glUniform3fARB");
+ sf_glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) load(userptr, "glUniform3fvARB");
+ sf_glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC) load(userptr, "glUniform3iARB");
+ sf_glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) load(userptr, "glUniform3ivARB");
+ sf_glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC) load(userptr, "glUniform4fARB");
+ sf_glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) load(userptr, "glUniform4fvARB");
+ sf_glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC) load(userptr, "glUniform4iARB");
+ sf_glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) load(userptr, "glUniform4ivARB");
+ sf_glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) load(userptr, "glUniformMatrix2fvARB");
+ sf_glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) load(userptr, "glUniformMatrix3fvARB");
+ sf_glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) load(userptr, "glUniformMatrix4fvARB");
+ sf_glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) load(userptr, "glUseProgramObjectARB");
+ sf_glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) load(userptr, "glValidateProgramARB");
+}
+static void sf_glad_gl_load_GL_ARB_shader_storage_buffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_shader_storage_buffer_object) return;
+ sf_glad_glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) load(userptr, "glShaderStorageBlockBinding");
+}
+static void sf_glad_gl_load_GL_ARB_shader_subroutine( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_shader_subroutine) return;
+ sf_glad_glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) load(userptr, "glGetActiveSubroutineName");
+ sf_glad_glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) load(userptr, "glGetActiveSubroutineUniformName");
+ sf_glad_glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) load(userptr, "glGetActiveSubroutineUniformiv");
+ sf_glad_glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) load(userptr, "glGetProgramStageiv");
+ sf_glad_glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) load(userptr, "glGetSubroutineIndex");
+ sf_glad_glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) load(userptr, "glGetSubroutineUniformLocation");
+ sf_glad_glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) load(userptr, "glGetUniformSubroutineuiv");
+ sf_glad_glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) load(userptr, "glUniformSubroutinesuiv");
+}
+static void sf_glad_gl_load_GL_ARB_sync( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_sync) return;
+ sf_glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync");
+ sf_glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync");
+ sf_glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync");
+ sf_glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v");
+ sf_glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv");
+ sf_glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync");
+ sf_glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync");
+}
+static void sf_glad_gl_load_GL_ARB_tessellation_shader( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_tessellation_shader) return;
+ sf_glad_glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) load(userptr, "glPatchParameterfv");
+ sf_glad_glPatchParameteri = (PFNGLPATCHPARAMETERIPROC) load(userptr, "glPatchParameteri");
+}
+static void sf_glad_gl_load_GL_ARB_texture_barrier( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_texture_barrier) return;
+ sf_glad_glTextureBarrier = (PFNGLTEXTUREBARRIERPROC) load(userptr, "glTextureBarrier");
+}
+static void sf_glad_gl_load_GL_ARB_texture_buffer_range( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_texture_buffer_range) return;
+ sf_glad_glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) load(userptr, "glTexBufferRange");
+}
+static void sf_glad_gl_load_GL_ARB_texture_multisample( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_texture_multisample) return;
+ sf_glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv");
+ sf_glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski");
+ sf_glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(userptr, "glTexImage2DMultisample");
+ sf_glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(userptr, "glTexImage3DMultisample");
+}
+static void sf_glad_gl_load_GL_ARB_texture_storage( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_texture_storage) return;
+ sf_glad_glTexStorage1D = (PFNGLTEXSTORAGE1DPROC) load(userptr, "glTexStorage1D");
+ sf_glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) load(userptr, "glTexStorage2D");
+ sf_glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) load(userptr, "glTexStorage3D");
+}
+static void sf_glad_gl_load_GL_ARB_texture_storage_multisample( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_texture_storage_multisample) return;
+ sf_glad_glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) load(userptr, "glTexStorage2DMultisample");
+ sf_glad_glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) load(userptr, "glTexStorage3DMultisample");
+}
+static void sf_glad_gl_load_GL_ARB_texture_view( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_texture_view) return;
+ sf_glad_glTextureView = (PFNGLTEXTUREVIEWPROC) load(userptr, "glTextureView");
+}
+static void sf_glad_gl_load_GL_ARB_timer_query( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_timer_query) return;
+ sf_glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(userptr, "glGetQueryObjecti64v");
+ sf_glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(userptr, "glGetQueryObjectui64v");
+ sf_glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(userptr, "glQueryCounter");
+}
+static void sf_glad_gl_load_GL_ARB_transform_feedback2( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_transform_feedback2) return;
+ sf_glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load(userptr, "glBindTransformFeedback");
+ sf_glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load(userptr, "glDeleteTransformFeedbacks");
+ sf_glad_glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) load(userptr, "glDrawTransformFeedback");
+ sf_glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load(userptr, "glGenTransformFeedbacks");
+ sf_glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load(userptr, "glIsTransformFeedback");
+ sf_glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load(userptr, "glPauseTransformFeedback");
+ sf_glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load(userptr, "glResumeTransformFeedback");
+}
+static void sf_glad_gl_load_GL_ARB_transform_feedback3( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_transform_feedback3) return;
+ sf_glad_glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) load(userptr, "glBeginQueryIndexed");
+ sf_glad_glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) load(userptr, "glDrawTransformFeedbackStream");
+ sf_glad_glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) load(userptr, "glEndQueryIndexed");
+ sf_glad_glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) load(userptr, "glGetQueryIndexediv");
+}
+static void sf_glad_gl_load_GL_ARB_transform_feedback_instanced( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_transform_feedback_instanced) return;
+ sf_glad_glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackInstanced");
+ sf_glad_glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackStreamInstanced");
+}
+static void sf_glad_gl_load_GL_ARB_uniform_buffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_uniform_buffer_object) return;
+ sf_glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase");
+ sf_glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange");
+ sf_glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName");
+ sf_glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv");
+ sf_glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(userptr, "glGetActiveUniformName");
+ sf_glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv");
+ sf_glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v");
+ sf_glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex");
+ sf_glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices");
+ sf_glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding");
+}
+static void sf_glad_gl_load_GL_ARB_vertex_array_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_vertex_array_object) return;
+ sf_glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray");
+ sf_glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays");
+ sf_glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays");
+ sf_glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray");
+}
+static void sf_glad_gl_load_GL_ARB_vertex_attrib_64bit( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_vertex_attrib_64bit) return;
+ sf_glad_glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) load(userptr, "glGetVertexAttribLdv");
+ sf_glad_glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) load(userptr, "glVertexAttribL1d");
+ sf_glad_glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) load(userptr, "glVertexAttribL1dv");
+ sf_glad_glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) load(userptr, "glVertexAttribL2d");
+ sf_glad_glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) load(userptr, "glVertexAttribL2dv");
+ sf_glad_glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) load(userptr, "glVertexAttribL3d");
+ sf_glad_glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) load(userptr, "glVertexAttribL3dv");
+ sf_glad_glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) load(userptr, "glVertexAttribL4d");
+ sf_glad_glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) load(userptr, "glVertexAttribL4dv");
+ sf_glad_glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) load(userptr, "glVertexAttribLPointer");
+}
+static void sf_glad_gl_load_GL_ARB_vertex_attrib_binding( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_vertex_attrib_binding) return;
+ sf_glad_glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) load(userptr, "glBindVertexBuffer");
+ sf_glad_glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) load(userptr, "glVertexAttribBinding");
+ sf_glad_glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) load(userptr, "glVertexAttribFormat");
+ sf_glad_glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) load(userptr, "glVertexAttribIFormat");
+ sf_glad_glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) load(userptr, "glVertexAttribLFormat");
+ sf_glad_glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) load(userptr, "glVertexBindingDivisor");
+}
+static void sf_glad_gl_load_GL_ARB_vertex_buffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_vertex_buffer_object) return;
+ sf_glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC) load(userptr, "glBindBufferARB");
+ sf_glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC) load(userptr, "glBufferDataARB");
+ sf_glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) load(userptr, "glBufferSubDataARB");
+ sf_glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) load(userptr, "glDeleteBuffersARB");
+ sf_glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) load(userptr, "glGenBuffersARB");
+ sf_glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) load(userptr, "glGetBufferParameterivARB");
+ sf_glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) load(userptr, "glGetBufferPointervARB");
+ sf_glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) load(userptr, "glGetBufferSubDataARB");
+ sf_glad_glIsBufferARB = (PFNGLISBUFFERARBPROC) load(userptr, "glIsBufferARB");
+ sf_glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) load(userptr, "glMapBufferARB");
+ sf_glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC) load(userptr, "glUnmapBufferARB");
+}
+static void sf_glad_gl_load_GL_ARB_vertex_program( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_vertex_program) return;
+ sf_glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB");
+ sf_glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB");
+ sf_glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB");
+ sf_glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB");
+ sf_glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB");
+ sf_glad_glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) load(userptr, "glGetProgramEnvParameterdvARB");
+ sf_glad_glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) load(userptr, "glGetProgramEnvParameterfvARB");
+ sf_glad_glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) load(userptr, "glGetProgramLocalParameterdvARB");
+ sf_glad_glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) load(userptr, "glGetProgramLocalParameterfvARB");
+ sf_glad_glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) load(userptr, "glGetProgramStringARB");
+ sf_glad_glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) load(userptr, "glGetProgramivARB");
+ sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB");
+ sf_glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB");
+ sf_glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB");
+ sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB");
+ sf_glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB");
+ sf_glad_glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) load(userptr, "glProgramEnvParameter4dARB");
+ sf_glad_glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) load(userptr, "glProgramEnvParameter4dvARB");
+ sf_glad_glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) load(userptr, "glProgramEnvParameter4fARB");
+ sf_glad_glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) load(userptr, "glProgramEnvParameter4fvARB");
+ sf_glad_glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) load(userptr, "glProgramLocalParameter4dARB");
+ sf_glad_glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) load(userptr, "glProgramLocalParameter4dvARB");
+ sf_glad_glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) load(userptr, "glProgramLocalParameter4fARB");
+ sf_glad_glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) load(userptr, "glProgramLocalParameter4fvARB");
+ sf_glad_glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) load(userptr, "glProgramStringARB");
+ sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB");
+ sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB");
+ sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB");
+ sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB");
+ sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB");
+ sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB");
+ sf_glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB");
+ sf_glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB");
+ sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB");
+ sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB");
+ sf_glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB");
+ sf_glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB");
+ sf_glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB");
+ sf_glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB");
+ sf_glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB");
+ sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB");
+ sf_glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB");
+ sf_glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB");
+ sf_glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB");
+ sf_glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB");
+ sf_glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB");
+ sf_glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB");
+ sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB");
+ sf_glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB");
+ sf_glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB");
+ sf_glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB");
+ sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB");
+ sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB");
+ sf_glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB");
+ sf_glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB");
+ sf_glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB");
+ sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB");
+ sf_glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB");
+ sf_glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB");
+ sf_glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB");
+ sf_glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB");
+ sf_glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB");
+}
+static void sf_glad_gl_load_GL_ARB_vertex_shader( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_vertex_shader) return;
+ sf_glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) load(userptr, "glBindAttribLocationARB");
+ sf_glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB");
+ sf_glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB");
+ sf_glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) load(userptr, "glGetActiveAttribARB");
+ sf_glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) load(userptr, "glGetAttribLocationARB");
+ sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB");
+ sf_glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB");
+ sf_glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB");
+ sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB");
+ sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB");
+ sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB");
+ sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB");
+ sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB");
+ sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB");
+ sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB");
+ sf_glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB");
+ sf_glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB");
+ sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB");
+ sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB");
+ sf_glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB");
+ sf_glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB");
+ sf_glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB");
+ sf_glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB");
+ sf_glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB");
+ sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB");
+ sf_glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB");
+ sf_glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB");
+ sf_glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB");
+ sf_glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB");
+ sf_glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB");
+ sf_glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB");
+ sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB");
+ sf_glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB");
+ sf_glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB");
+ sf_glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB");
+ sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB");
+ sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB");
+ sf_glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB");
+ sf_glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB");
+ sf_glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB");
+ sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB");
+ sf_glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB");
+ sf_glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB");
+ sf_glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB");
+ sf_glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB");
+ sf_glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB");
+}
+static void sf_glad_gl_load_GL_ARB_vertex_type_2_10_10_10_rev( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_vertex_type_2_10_10_10_rev) return;
+ sf_glad_glColorP3ui = (PFNGLCOLORP3UIPROC) load(userptr, "glColorP3ui");
+ sf_glad_glColorP3uiv = (PFNGLCOLORP3UIVPROC) load(userptr, "glColorP3uiv");
+ sf_glad_glColorP4ui = (PFNGLCOLORP4UIPROC) load(userptr, "glColorP4ui");
+ sf_glad_glColorP4uiv = (PFNGLCOLORP4UIVPROC) load(userptr, "glColorP4uiv");
+ sf_glad_glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) load(userptr, "glMultiTexCoordP1ui");
+ sf_glad_glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) load(userptr, "glMultiTexCoordP1uiv");
+ sf_glad_glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) load(userptr, "glMultiTexCoordP2ui");
+ sf_glad_glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) load(userptr, "glMultiTexCoordP2uiv");
+ sf_glad_glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) load(userptr, "glMultiTexCoordP3ui");
+ sf_glad_glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) load(userptr, "glMultiTexCoordP3uiv");
+ sf_glad_glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) load(userptr, "glMultiTexCoordP4ui");
+ sf_glad_glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) load(userptr, "glMultiTexCoordP4uiv");
+ sf_glad_glNormalP3ui = (PFNGLNORMALP3UIPROC) load(userptr, "glNormalP3ui");
+ sf_glad_glNormalP3uiv = (PFNGLNORMALP3UIVPROC) load(userptr, "glNormalP3uiv");
+ sf_glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) load(userptr, "glSecondaryColorP3ui");
+ sf_glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) load(userptr, "glSecondaryColorP3uiv");
+ sf_glad_glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) load(userptr, "glTexCoordP1ui");
+ sf_glad_glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) load(userptr, "glTexCoordP1uiv");
+ sf_glad_glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) load(userptr, "glTexCoordP2ui");
+ sf_glad_glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) load(userptr, "glTexCoordP2uiv");
+ sf_glad_glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) load(userptr, "glTexCoordP3ui");
+ sf_glad_glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) load(userptr, "glTexCoordP3uiv");
+ sf_glad_glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) load(userptr, "glTexCoordP4ui");
+ sf_glad_glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) load(userptr, "glTexCoordP4uiv");
+ sf_glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(userptr, "glVertexAttribP1ui");
+ sf_glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(userptr, "glVertexAttribP1uiv");
+ sf_glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(userptr, "glVertexAttribP2ui");
+ sf_glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(userptr, "glVertexAttribP2uiv");
+ sf_glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(userptr, "glVertexAttribP3ui");
+ sf_glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(userptr, "glVertexAttribP3uiv");
+ sf_glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui");
+ sf_glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv");
+ sf_glad_glVertexP2ui = (PFNGLVERTEXP2UIPROC) load(userptr, "glVertexP2ui");
+ sf_glad_glVertexP2uiv = (PFNGLVERTEXP2UIVPROC) load(userptr, "glVertexP2uiv");
+ sf_glad_glVertexP3ui = (PFNGLVERTEXP3UIPROC) load(userptr, "glVertexP3ui");
+ sf_glad_glVertexP3uiv = (PFNGLVERTEXP3UIVPROC) load(userptr, "glVertexP3uiv");
+ sf_glad_glVertexP4ui = (PFNGLVERTEXP4UIPROC) load(userptr, "glVertexP4ui");
+ sf_glad_glVertexP4uiv = (PFNGLVERTEXP4UIVPROC) load(userptr, "glVertexP4uiv");
+}
+static void sf_glad_gl_load_GL_ARB_viewport_array( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_ARB_viewport_array) return;
+ sf_glad_glDepthRangeArraydvNV = (PFNGLDEPTHRANGEARRAYDVNVPROC) load(userptr, "glDepthRangeArraydvNV");
+ sf_glad_glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) load(userptr, "glDepthRangeArrayv");
+ sf_glad_glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) load(userptr, "glDepthRangeIndexed");
+ sf_glad_glDepthRangeIndexeddNV = (PFNGLDEPTHRANGEINDEXEDDNVPROC) load(userptr, "glDepthRangeIndexeddNV");
+ sf_glad_glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC) load(userptr, "glGetDoublei_v");
+ sf_glad_glGetFloati_v = (PFNGLGETFLOATI_VPROC) load(userptr, "glGetFloati_v");
+ sf_glad_glScissorArrayv = (PFNGLSCISSORARRAYVPROC) load(userptr, "glScissorArrayv");
+ sf_glad_glScissorIndexed = (PFNGLSCISSORINDEXEDPROC) load(userptr, "glScissorIndexed");
+ sf_glad_glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) load(userptr, "glScissorIndexedv");
+ sf_glad_glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) load(userptr, "glViewportArrayv");
+ sf_glad_glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) load(userptr, "glViewportIndexedf");
+ sf_glad_glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) load(userptr, "glViewportIndexedfv");
+}
+static void sf_glad_gl_load_GL_EXT_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_blend_equation_separate) return;
+ sf_glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC) load(userptr, "glBlendEquationSeparateEXT");
+}
+static void sf_glad_gl_load_GL_EXT_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_blend_func_separate) return;
+ sf_glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) load(userptr, "glBlendFuncSeparateEXT");
+}
+static void sf_glad_gl_load_GL_EXT_blend_minmax( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_blend_minmax) return;
+ sf_glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC) load(userptr, "glBlendEquationEXT");
+}
+static void sf_glad_gl_load_GL_EXT_copy_texture( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_copy_texture) return;
+ sf_glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC) load(userptr, "glCopyTexImage1DEXT");
+ sf_glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC) load(userptr, "glCopyTexImage2DEXT");
+ sf_glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC) load(userptr, "glCopyTexSubImage1DEXT");
+ sf_glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC) load(userptr, "glCopyTexSubImage2DEXT");
+ sf_glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC) load(userptr, "glCopyTexSubImage3DEXT");
+}
+static void sf_glad_gl_load_GL_EXT_framebuffer_blit( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_framebuffer_blit) return;
+ sf_glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) load(userptr, "glBlitFramebufferEXT");
+}
+static void sf_glad_gl_load_GL_EXT_framebuffer_multisample( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_framebuffer_multisample) return;
+ sf_glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) load(userptr, "glRenderbufferStorageMultisampleEXT");
+}
+static void sf_glad_gl_load_GL_EXT_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_framebuffer_object) return;
+ sf_glad_glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) load(userptr, "glBindFramebufferEXT");
+ sf_glad_glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) load(userptr, "glBindRenderbufferEXT");
+ sf_glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) load(userptr, "glCheckFramebufferStatusEXT");
+ sf_glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) load(userptr, "glDeleteFramebuffersEXT");
+ sf_glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) load(userptr, "glDeleteRenderbuffersEXT");
+ sf_glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) load(userptr, "glFramebufferRenderbufferEXT");
+ sf_glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) load(userptr, "glFramebufferTexture1DEXT");
+ sf_glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) load(userptr, "glFramebufferTexture2DEXT");
+ sf_glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) load(userptr, "glFramebufferTexture3DEXT");
+ sf_glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) load(userptr, "glGenFramebuffersEXT");
+ sf_glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) load(userptr, "glGenRenderbuffersEXT");
+ sf_glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) load(userptr, "glGenerateMipmapEXT");
+ sf_glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) load(userptr, "glGetFramebufferAttachmentParameterivEXT");
+ sf_glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetRenderbufferParameterivEXT");
+ sf_glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) load(userptr, "glIsFramebufferEXT");
+ sf_glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) load(userptr, "glIsRenderbufferEXT");
+ sf_glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) load(userptr, "glRenderbufferStorageEXT");
+}
+static void sf_glad_gl_load_GL_EXT_geometry_shader4( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_geometry_shader4) return;
+ sf_glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC) load(userptr, "glProgramParameteriEXT");
+}
+static void sf_glad_gl_load_GL_EXT_subtexture( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_subtexture) return;
+ sf_glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC) load(userptr, "glTexSubImage1DEXT");
+ sf_glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC) load(userptr, "glTexSubImage2DEXT");
+}
+static void sf_glad_gl_load_GL_EXT_texture_array( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_texture_array) return;
+ sf_glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT");
+}
+static void sf_glad_gl_load_GL_EXT_texture_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_texture_object) return;
+ sf_glad_glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC) load(userptr, "glAreTexturesResidentEXT");
+ sf_glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC) load(userptr, "glBindTextureEXT");
+ sf_glad_glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC) load(userptr, "glDeleteTexturesEXT");
+ sf_glad_glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC) load(userptr, "glGenTexturesEXT");
+ sf_glad_glIsTextureEXT = (PFNGLISTEXTUREEXTPROC) load(userptr, "glIsTextureEXT");
+ sf_glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC) load(userptr, "glPrioritizeTexturesEXT");
+}
+static void sf_glad_gl_load_GL_EXT_vertex_array( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_EXT_vertex_array) return;
+ sf_glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC) load(userptr, "glArrayElementEXT");
+ sf_glad_glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC) load(userptr, "glColorPointerEXT");
+ sf_glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC) load(userptr, "glDrawArraysEXT");
+ sf_glad_glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC) load(userptr, "glEdgeFlagPointerEXT");
+ sf_glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC) load(userptr, "glGetPointervEXT");
+ sf_glad_glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC) load(userptr, "glIndexPointerEXT");
+ sf_glad_glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC) load(userptr, "glNormalPointerEXT");
+ sf_glad_glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC) load(userptr, "glTexCoordPointerEXT");
+ sf_glad_glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC) load(userptr, "glVertexPointerEXT");
+}
+static void sf_glad_gl_load_GL_INGR_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_INGR_blend_func_separate) return;
+ sf_glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC) load(userptr, "glBlendFuncSeparateINGR");
+}
+static void sf_glad_gl_load_GL_KHR_debug( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_KHR_debug) return;
+ sf_glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback");
+ sf_glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl");
+ sf_glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert");
+ sf_glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog");
+ sf_glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel");
+ sf_glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel");
+ sf_glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv");
+ sf_glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel");
+ sf_glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel");
+ sf_glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup");
+ sf_glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup");
+}
+static void sf_glad_gl_load_GL_KHR_robustness( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_KHR_robustness) return;
+ sf_glad_glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC) load(userptr, "glGetGraphicsResetStatus");
+ sf_glad_glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC) load(userptr, "glGetnUniformfv");
+ sf_glad_glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC) load(userptr, "glGetnUniformiv");
+ sf_glad_glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC) load(userptr, "glGetnUniformuiv");
+ sf_glad_glReadnPixels = (PFNGLREADNPIXELSPROC) load(userptr, "glReadnPixels");
+}
+static void sf_glad_gl_load_GL_NV_geometry_program4( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_NV_geometry_program4) return;
+ sf_glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC) load(userptr, "glFramebufferTextureEXT");
+ sf_glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) load(userptr, "glFramebufferTextureFaceEXT");
+ sf_glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT");
+ sf_glad_glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC) load(userptr, "glProgramVertexLimitNV");
+}
+static void sf_glad_gl_load_GL_NV_vertex_program( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_NV_vertex_program) return;
+ sf_glad_glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC) load(userptr, "glAreProgramsResidentNV");
+ sf_glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC) load(userptr, "glBindProgramNV");
+ sf_glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC) load(userptr, "glDeleteProgramsNV");
+ sf_glad_glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC) load(userptr, "glExecuteProgramNV");
+ sf_glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC) load(userptr, "glGenProgramsNV");
+ sf_glad_glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC) load(userptr, "glGetProgramParameterdvNV");
+ sf_glad_glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC) load(userptr, "glGetProgramParameterfvNV");
+ sf_glad_glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC) load(userptr, "glGetProgramStringNV");
+ sf_glad_glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC) load(userptr, "glGetProgramivNV");
+ sf_glad_glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC) load(userptr, "glGetTrackMatrixivNV");
+ sf_glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC) load(userptr, "glGetVertexAttribPointervNV");
+ sf_glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) load(userptr, "glGetVertexAttribdvNV");
+ sf_glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) load(userptr, "glGetVertexAttribfvNV");
+ sf_glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) load(userptr, "glGetVertexAttribivNV");
+ sf_glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC) load(userptr, "glIsProgramNV");
+ sf_glad_glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC) load(userptr, "glLoadProgramNV");
+ sf_glad_glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC) load(userptr, "glProgramParameter4dNV");
+ sf_glad_glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC) load(userptr, "glProgramParameter4dvNV");
+ sf_glad_glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC) load(userptr, "glProgramParameter4fNV");
+ sf_glad_glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC) load(userptr, "glProgramParameter4fvNV");
+ sf_glad_glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC) load(userptr, "glProgramParameters4dvNV");
+ sf_glad_glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC) load(userptr, "glProgramParameters4fvNV");
+ sf_glad_glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC) load(userptr, "glRequestResidentProgramsNV");
+ sf_glad_glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC) load(userptr, "glTrackMatrixNV");
+ sf_glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC) load(userptr, "glVertexAttrib1dNV");
+ sf_glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC) load(userptr, "glVertexAttrib1dvNV");
+ sf_glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC) load(userptr, "glVertexAttrib1fNV");
+ sf_glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC) load(userptr, "glVertexAttrib1fvNV");
+ sf_glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC) load(userptr, "glVertexAttrib1sNV");
+ sf_glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC) load(userptr, "glVertexAttrib1svNV");
+ sf_glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC) load(userptr, "glVertexAttrib2dNV");
+ sf_glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC) load(userptr, "glVertexAttrib2dvNV");
+ sf_glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC) load(userptr, "glVertexAttrib2fNV");
+ sf_glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC) load(userptr, "glVertexAttrib2fvNV");
+ sf_glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC) load(userptr, "glVertexAttrib2sNV");
+ sf_glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC) load(userptr, "glVertexAttrib2svNV");
+ sf_glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC) load(userptr, "glVertexAttrib3dNV");
+ sf_glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC) load(userptr, "glVertexAttrib3dvNV");
+ sf_glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC) load(userptr, "glVertexAttrib3fNV");
+ sf_glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC) load(userptr, "glVertexAttrib3fvNV");
+ sf_glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC) load(userptr, "glVertexAttrib3sNV");
+ sf_glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC) load(userptr, "glVertexAttrib3svNV");
+ sf_glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC) load(userptr, "glVertexAttrib4dNV");
+ sf_glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC) load(userptr, "glVertexAttrib4dvNV");
+ sf_glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC) load(userptr, "glVertexAttrib4fNV");
+ sf_glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC) load(userptr, "glVertexAttrib4fvNV");
+ sf_glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC) load(userptr, "glVertexAttrib4sNV");
+ sf_glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC) load(userptr, "glVertexAttrib4svNV");
+ sf_glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC) load(userptr, "glVertexAttrib4ubNV");
+ sf_glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC) load(userptr, "glVertexAttrib4ubvNV");
+ sf_glad_glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC) load(userptr, "glVertexAttribPointerNV");
+ sf_glad_glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC) load(userptr, "glVertexAttribs1dvNV");
+ sf_glad_glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC) load(userptr, "glVertexAttribs1fvNV");
+ sf_glad_glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC) load(userptr, "glVertexAttribs1svNV");
+ sf_glad_glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC) load(userptr, "glVertexAttribs2dvNV");
+ sf_glad_glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC) load(userptr, "glVertexAttribs2fvNV");
+ sf_glad_glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC) load(userptr, "glVertexAttribs2svNV");
+ sf_glad_glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC) load(userptr, "glVertexAttribs3dvNV");
+ sf_glad_glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC) load(userptr, "glVertexAttribs3fvNV");
+ sf_glad_glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC) load(userptr, "glVertexAttribs3svNV");
+ sf_glad_glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC) load(userptr, "glVertexAttribs4dvNV");
+ sf_glad_glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC) load(userptr, "glVertexAttribs4fvNV");
+ sf_glad_glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC) load(userptr, "glVertexAttribs4svNV");
+ sf_glad_glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC) load(userptr, "glVertexAttribs4ubvNV");
+}
+static void sf_glad_gl_load_GL_OES_single_precision( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_OES_single_precision) return;
+ sf_glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC) load(userptr, "glClearDepthfOES");
+ sf_glad_glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC) load(userptr, "glClipPlanefOES");
+ sf_glad_glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC) load(userptr, "glDepthRangefOES");
+ sf_glad_glFrustumfOES = (PFNGLFRUSTUMFOESPROC) load(userptr, "glFrustumfOES");
+ sf_glad_glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC) load(userptr, "glGetClipPlanefOES");
+ sf_glad_glOrthofOES = (PFNGLORTHOFOESPROC) load(userptr, "glOrthofOES");
+}
+static void sf_glad_gl_load_GL_OES_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_OES_blend_equation_separate) return;
+ sf_glad_glBlendEquationSeparateOES = (PFNGLBLENDEQUATIONSEPARATEOESPROC) load(userptr, "glBlendEquationSeparateOES");
+}
+static void sf_glad_gl_load_GL_OES_blend_func_separate( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_OES_blend_func_separate) return;
+ sf_glad_glBlendFuncSeparateOES = (PFNGLBLENDFUNCSEPARATEOESPROC) load(userptr, "glBlendFuncSeparateOES");
+}
+static void sf_glad_gl_load_GL_OES_blend_subtract( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_OES_blend_subtract) return;
+ sf_glad_glBlendEquationOES = (PFNGLBLENDEQUATIONOESPROC) load(userptr, "glBlendEquationOES");
+}
+static void sf_glad_gl_load_GL_OES_framebuffer_object( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GL_OES_framebuffer_object) return;
+ sf_glad_glBindFramebufferOES = (PFNGLBINDFRAMEBUFFEROESPROC) load(userptr, "glBindFramebufferOES");
+ sf_glad_glBindRenderbufferOES = (PFNGLBINDRENDERBUFFEROESPROC) load(userptr, "glBindRenderbufferOES");
+ sf_glad_glCheckFramebufferStatusOES = (PFNGLCHECKFRAMEBUFFERSTATUSOESPROC) load(userptr, "glCheckFramebufferStatusOES");
+ sf_glad_glDeleteFramebuffersOES = (PFNGLDELETEFRAMEBUFFERSOESPROC) load(userptr, "glDeleteFramebuffersOES");
+ sf_glad_glDeleteRenderbuffersOES = (PFNGLDELETERENDERBUFFERSOESPROC) load(userptr, "glDeleteRenderbuffersOES");
+ sf_glad_glFramebufferRenderbufferOES = (PFNGLFRAMEBUFFERRENDERBUFFEROESPROC) load(userptr, "glFramebufferRenderbufferOES");
+ sf_glad_glFramebufferTexture2DOES = (PFNGLFRAMEBUFFERTEXTURE2DOESPROC) load(userptr, "glFramebufferTexture2DOES");
+ sf_glad_glGenFramebuffersOES = (PFNGLGENFRAMEBUFFERSOESPROC) load(userptr, "glGenFramebuffersOES");
+ sf_glad_glGenRenderbuffersOES = (PFNGLGENRENDERBUFFERSOESPROC) load(userptr, "glGenRenderbuffersOES");
+ sf_glad_glGenerateMipmapOES = (PFNGLGENERATEMIPMAPOESPROC) load(userptr, "glGenerateMipmapOES");
+ sf_glad_glGetFramebufferAttachmentParameterivOES = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC) load(userptr, "glGetFramebufferAttachmentParameterivOES");
+ sf_glad_glGetRenderbufferParameterivOES = (PFNGLGETRENDERBUFFERPARAMETERIVOESPROC) load(userptr, "glGetRenderbufferParameterivOES");
+ sf_glad_glIsFramebufferOES = (PFNGLISFRAMEBUFFEROESPROC) load(userptr, "glIsFramebufferOES");
+ sf_glad_glIsRenderbufferOES = (PFNGLISRENDERBUFFEROESPROC) load(userptr, "glIsRenderbufferOES");
+ sf_glad_glRenderbufferStorageOES = (PFNGLRENDERBUFFERSTORAGEOESPROC) load(userptr, "glRenderbufferStorageOES");
+}
+
+
+static void sf_glad_gl_resolve_aliases(void) {
+ if (sf_glad_glActiveTexture == NULL && sf_glad_glActiveTextureARB != NULL) sf_glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC)sf_glad_glActiveTextureARB;
+ if (sf_glad_glActiveTextureARB == NULL && sf_glad_glActiveTexture != NULL) sf_glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)sf_glad_glActiveTexture;
+ if (sf_glad_glArrayElement == NULL && sf_glad_glArrayElementEXT != NULL) sf_glad_glArrayElement = (PFNGLARRAYELEMENTPROC)sf_glad_glArrayElementEXT;
+ if (sf_glad_glArrayElementEXT == NULL && sf_glad_glArrayElement != NULL) sf_glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)sf_glad_glArrayElement;
+ if (sf_glad_glAttachObjectARB == NULL && sf_glad_glAttachShader != NULL) sf_glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)sf_glad_glAttachShader;
+ if (sf_glad_glAttachShader == NULL && sf_glad_glAttachObjectARB != NULL) sf_glad_glAttachShader = (PFNGLATTACHSHADERPROC)sf_glad_glAttachObjectARB;
+ if (sf_glad_glBindAttribLocation == NULL && sf_glad_glBindAttribLocationARB != NULL) sf_glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)sf_glad_glBindAttribLocationARB;
+ if (sf_glad_glBindAttribLocationARB == NULL && sf_glad_glBindAttribLocation != NULL) sf_glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)sf_glad_glBindAttribLocation;
+ if (sf_glad_glBindBuffer == NULL && sf_glad_glBindBufferARB != NULL) sf_glad_glBindBuffer = (PFNGLBINDBUFFERPROC)sf_glad_glBindBufferARB;
+ if (sf_glad_glBindBufferARB == NULL && sf_glad_glBindBuffer != NULL) sf_glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC)sf_glad_glBindBuffer;
+ if (sf_glad_glBindProgramARB == NULL && sf_glad_glBindProgramNV != NULL) sf_glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)sf_glad_glBindProgramNV;
+ if (sf_glad_glBindProgramNV == NULL && sf_glad_glBindProgramARB != NULL) sf_glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)sf_glad_glBindProgramARB;
+ if (sf_glad_glBindTexture == NULL && sf_glad_glBindTextureEXT != NULL) sf_glad_glBindTexture = (PFNGLBINDTEXTUREPROC)sf_glad_glBindTextureEXT;
+ if (sf_glad_glBindTextureEXT == NULL && sf_glad_glBindTexture != NULL) sf_glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)sf_glad_glBindTexture;
+ if (sf_glad_glBlendEquation == NULL && sf_glad_glBlendEquationEXT != NULL) sf_glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC)sf_glad_glBlendEquationEXT;
+ if (sf_glad_glBlendEquationEXT == NULL && sf_glad_glBlendEquation != NULL) sf_glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)sf_glad_glBlendEquation;
+ if (sf_glad_glBlendEquationSeparate == NULL && sf_glad_glBlendEquationSeparateEXT != NULL) sf_glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)sf_glad_glBlendEquationSeparateEXT;
+ if (sf_glad_glBlendEquationSeparateEXT == NULL && sf_glad_glBlendEquationSeparate != NULL) sf_glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)sf_glad_glBlendEquationSeparate;
+ if (sf_glad_glBlendFuncSeparate == NULL && sf_glad_glBlendFuncSeparateEXT != NULL) sf_glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)sf_glad_glBlendFuncSeparateEXT;
+ if (sf_glad_glBlendFuncSeparate == NULL && sf_glad_glBlendFuncSeparateINGR != NULL) sf_glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)sf_glad_glBlendFuncSeparateINGR;
+ if (sf_glad_glBlendFuncSeparateEXT == NULL && sf_glad_glBlendFuncSeparate != NULL) sf_glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)sf_glad_glBlendFuncSeparate;
+ if (sf_glad_glBlendFuncSeparateEXT == NULL && sf_glad_glBlendFuncSeparateINGR != NULL) sf_glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)sf_glad_glBlendFuncSeparateINGR;
+ if (sf_glad_glBlendFuncSeparateINGR == NULL && sf_glad_glBlendFuncSeparate != NULL) sf_glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC)sf_glad_glBlendFuncSeparate;
+ if (sf_glad_glBlendFuncSeparateINGR == NULL && sf_glad_glBlendFuncSeparateEXT != NULL) sf_glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC)sf_glad_glBlendFuncSeparateEXT;
+ if (sf_glad_glBlitFramebuffer == NULL && sf_glad_glBlitFramebufferEXT != NULL) sf_glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)sf_glad_glBlitFramebufferEXT;
+ if (sf_glad_glBlitFramebufferEXT == NULL && sf_glad_glBlitFramebuffer != NULL) sf_glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)sf_glad_glBlitFramebuffer;
+ if (sf_glad_glBufferData == NULL && sf_glad_glBufferDataARB != NULL) sf_glad_glBufferData = (PFNGLBUFFERDATAPROC)sf_glad_glBufferDataARB;
+ if (sf_glad_glBufferDataARB == NULL && sf_glad_glBufferData != NULL) sf_glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC)sf_glad_glBufferData;
+ if (sf_glad_glBufferSubData == NULL && sf_glad_glBufferSubDataARB != NULL) sf_glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC)sf_glad_glBufferSubDataARB;
+ if (sf_glad_glBufferSubDataARB == NULL && sf_glad_glBufferSubData != NULL) sf_glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)sf_glad_glBufferSubData;
+ if (sf_glad_glCheckFramebufferStatus == NULL && sf_glad_glCheckFramebufferStatusEXT != NULL) sf_glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)sf_glad_glCheckFramebufferStatusEXT;
+ if (sf_glad_glCheckFramebufferStatusEXT == NULL && sf_glad_glCheckFramebufferStatus != NULL) sf_glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)sf_glad_glCheckFramebufferStatus;
+ if (sf_glad_glClearDepthf == NULL && sf_glad_glClearDepthfOES != NULL) sf_glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC)sf_glad_glClearDepthfOES;
+ if (sf_glad_glClearDepthfOES == NULL && sf_glad_glClearDepthf != NULL) sf_glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)sf_glad_glClearDepthf;
+ if (sf_glad_glClientActiveTexture == NULL && sf_glad_glClientActiveTextureARB != NULL) sf_glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)sf_glad_glClientActiveTextureARB;
+ if (sf_glad_glClientActiveTextureARB == NULL && sf_glad_glClientActiveTexture != NULL) sf_glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)sf_glad_glClientActiveTexture;
+ if (sf_glad_glCompileShader == NULL && sf_glad_glCompileShaderARB != NULL) sf_glad_glCompileShader = (PFNGLCOMPILESHADERPROC)sf_glad_glCompileShaderARB;
+ if (sf_glad_glCompileShaderARB == NULL && sf_glad_glCompileShader != NULL) sf_glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)sf_glad_glCompileShader;
+ if (sf_glad_glCopyTexImage1D == NULL && sf_glad_glCopyTexImage1DEXT != NULL) sf_glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC)sf_glad_glCopyTexImage1DEXT;
+ if (sf_glad_glCopyTexImage1DEXT == NULL && sf_glad_glCopyTexImage1D != NULL) sf_glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)sf_glad_glCopyTexImage1D;
+ if (sf_glad_glCopyTexImage2D == NULL && sf_glad_glCopyTexImage2DEXT != NULL) sf_glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)sf_glad_glCopyTexImage2DEXT;
+ if (sf_glad_glCopyTexImage2DEXT == NULL && sf_glad_glCopyTexImage2D != NULL) sf_glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)sf_glad_glCopyTexImage2D;
+ if (sf_glad_glCopyTexSubImage1D == NULL && sf_glad_glCopyTexSubImage1DEXT != NULL) sf_glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC)sf_glad_glCopyTexSubImage1DEXT;
+ if (sf_glad_glCopyTexSubImage1DEXT == NULL && sf_glad_glCopyTexSubImage1D != NULL) sf_glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)sf_glad_glCopyTexSubImage1D;
+ if (sf_glad_glCopyTexSubImage2D == NULL && sf_glad_glCopyTexSubImage2DEXT != NULL) sf_glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)sf_glad_glCopyTexSubImage2DEXT;
+ if (sf_glad_glCopyTexSubImage2DEXT == NULL && sf_glad_glCopyTexSubImage2D != NULL) sf_glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)sf_glad_glCopyTexSubImage2D;
+ if (sf_glad_glCopyTexSubImage3D == NULL && sf_glad_glCopyTexSubImage3DEXT != NULL) sf_glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)sf_glad_glCopyTexSubImage3DEXT;
+ if (sf_glad_glCopyTexSubImage3DEXT == NULL && sf_glad_glCopyTexSubImage3D != NULL) sf_glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)sf_glad_glCopyTexSubImage3D;
+ if (sf_glad_glCreateProgram == NULL && sf_glad_glCreateProgramObjectARB != NULL) sf_glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC)sf_glad_glCreateProgramObjectARB;
+ if (sf_glad_glCreateProgramObjectARB == NULL && sf_glad_glCreateProgram != NULL) sf_glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)sf_glad_glCreateProgram;
+ if (sf_glad_glCreateShader == NULL && sf_glad_glCreateShaderObjectARB != NULL) sf_glad_glCreateShader = (PFNGLCREATESHADERPROC)sf_glad_glCreateShaderObjectARB;
+ if (sf_glad_glCreateShaderObjectARB == NULL && sf_glad_glCreateShader != NULL) sf_glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)sf_glad_glCreateShader;
+ if (sf_glad_glDeleteBuffers == NULL && sf_glad_glDeleteBuffersARB != NULL) sf_glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)sf_glad_glDeleteBuffersARB;
+ if (sf_glad_glDeleteBuffersARB == NULL && sf_glad_glDeleteBuffers != NULL) sf_glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)sf_glad_glDeleteBuffers;
+ if (sf_glad_glDeleteFramebuffers == NULL && sf_glad_glDeleteFramebuffersEXT != NULL) sf_glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)sf_glad_glDeleteFramebuffersEXT;
+ if (sf_glad_glDeleteFramebuffersEXT == NULL && sf_glad_glDeleteFramebuffers != NULL) sf_glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)sf_glad_glDeleteFramebuffers;
+ if (sf_glad_glDeleteProgramsARB == NULL && sf_glad_glDeleteProgramsNV != NULL) sf_glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)sf_glad_glDeleteProgramsNV;
+ if (sf_glad_glDeleteProgramsNV == NULL && sf_glad_glDeleteProgramsARB != NULL) sf_glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)sf_glad_glDeleteProgramsARB;
+ if (sf_glad_glDeleteRenderbuffers == NULL && sf_glad_glDeleteRenderbuffersEXT != NULL) sf_glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)sf_glad_glDeleteRenderbuffersEXT;
+ if (sf_glad_glDeleteRenderbuffersEXT == NULL && sf_glad_glDeleteRenderbuffers != NULL) sf_glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)sf_glad_glDeleteRenderbuffers;
+ if (sf_glad_glDepthRangef == NULL && sf_glad_glDepthRangefOES != NULL) sf_glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC)sf_glad_glDepthRangefOES;
+ if (sf_glad_glDepthRangefOES == NULL && sf_glad_glDepthRangef != NULL) sf_glad_glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)sf_glad_glDepthRangef;
+ if (sf_glad_glDetachObjectARB == NULL && sf_glad_glDetachShader != NULL) sf_glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)sf_glad_glDetachShader;
+ if (sf_glad_glDetachShader == NULL && sf_glad_glDetachObjectARB != NULL) sf_glad_glDetachShader = (PFNGLDETACHSHADERPROC)sf_glad_glDetachObjectARB;
+ if (sf_glad_glDisableVertexAttribArray == NULL && sf_glad_glDisableVertexAttribArrayARB != NULL) sf_glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)sf_glad_glDisableVertexAttribArrayARB;
+ if (sf_glad_glDisableVertexAttribArrayARB == NULL && sf_glad_glDisableVertexAttribArray != NULL) sf_glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)sf_glad_glDisableVertexAttribArray;
+ if (sf_glad_glDrawArrays == NULL && sf_glad_glDrawArraysEXT != NULL) sf_glad_glDrawArrays = (PFNGLDRAWARRAYSPROC)sf_glad_glDrawArraysEXT;
+ if (sf_glad_glDrawArraysEXT == NULL && sf_glad_glDrawArrays != NULL) sf_glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)sf_glad_glDrawArrays;
+ if (sf_glad_glEnableVertexAttribArray == NULL && sf_glad_glEnableVertexAttribArrayARB != NULL) sf_glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)sf_glad_glEnableVertexAttribArrayARB;
+ if (sf_glad_glEnableVertexAttribArrayARB == NULL && sf_glad_glEnableVertexAttribArray != NULL) sf_glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)sf_glad_glEnableVertexAttribArray;
+ if (sf_glad_glFramebufferRenderbuffer == NULL && sf_glad_glFramebufferRenderbufferEXT != NULL) sf_glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)sf_glad_glFramebufferRenderbufferEXT;
+ if (sf_glad_glFramebufferRenderbufferEXT == NULL && sf_glad_glFramebufferRenderbuffer != NULL) sf_glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)sf_glad_glFramebufferRenderbuffer;
+ if (sf_glad_glFramebufferTexture == NULL && sf_glad_glFramebufferTextureARB != NULL) sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)sf_glad_glFramebufferTextureARB;
+ if (sf_glad_glFramebufferTexture == NULL && sf_glad_glFramebufferTextureEXT != NULL) sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)sf_glad_glFramebufferTextureEXT;
+ if (sf_glad_glFramebufferTexture1D == NULL && sf_glad_glFramebufferTexture1DEXT != NULL) sf_glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)sf_glad_glFramebufferTexture1DEXT;
+ if (sf_glad_glFramebufferTexture1DEXT == NULL && sf_glad_glFramebufferTexture1D != NULL) sf_glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)sf_glad_glFramebufferTexture1D;
+ if (sf_glad_glFramebufferTexture2D == NULL && sf_glad_glFramebufferTexture2DEXT != NULL) sf_glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)sf_glad_glFramebufferTexture2DEXT;
+ if (sf_glad_glFramebufferTexture2DEXT == NULL && sf_glad_glFramebufferTexture2D != NULL) sf_glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)sf_glad_glFramebufferTexture2D;
+ if (sf_glad_glFramebufferTexture3D == NULL && sf_glad_glFramebufferTexture3DEXT != NULL) sf_glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)sf_glad_glFramebufferTexture3DEXT;
+ if (sf_glad_glFramebufferTexture3DEXT == NULL && sf_glad_glFramebufferTexture3D != NULL) sf_glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)sf_glad_glFramebufferTexture3D;
+ if (sf_glad_glFramebufferTextureARB == NULL && sf_glad_glFramebufferTexture != NULL) sf_glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)sf_glad_glFramebufferTexture;
+ if (sf_glad_glFramebufferTextureARB == NULL && sf_glad_glFramebufferTextureEXT != NULL) sf_glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)sf_glad_glFramebufferTextureEXT;
+ if (sf_glad_glFramebufferTextureEXT == NULL && sf_glad_glFramebufferTexture != NULL) sf_glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)sf_glad_glFramebufferTexture;
+ if (sf_glad_glFramebufferTextureEXT == NULL && sf_glad_glFramebufferTextureARB != NULL) sf_glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)sf_glad_glFramebufferTextureARB;
+ if (sf_glad_glFramebufferTextureFaceARB == NULL && sf_glad_glFramebufferTextureFaceEXT != NULL) sf_glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)sf_glad_glFramebufferTextureFaceEXT;
+ if (sf_glad_glFramebufferTextureFaceEXT == NULL && sf_glad_glFramebufferTextureFaceARB != NULL) sf_glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)sf_glad_glFramebufferTextureFaceARB;
+ if (sf_glad_glFramebufferTextureLayer == NULL && sf_glad_glFramebufferTextureLayerARB != NULL) sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)sf_glad_glFramebufferTextureLayerARB;
+ if (sf_glad_glFramebufferTextureLayer == NULL && sf_glad_glFramebufferTextureLayerEXT != NULL) sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)sf_glad_glFramebufferTextureLayerEXT;
+ if (sf_glad_glFramebufferTextureLayerARB == NULL && sf_glad_glFramebufferTextureLayer != NULL) sf_glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)sf_glad_glFramebufferTextureLayer;
+ if (sf_glad_glFramebufferTextureLayerARB == NULL && sf_glad_glFramebufferTextureLayerEXT != NULL) sf_glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)sf_glad_glFramebufferTextureLayerEXT;
+ if (sf_glad_glFramebufferTextureLayerEXT == NULL && sf_glad_glFramebufferTextureLayer != NULL) sf_glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)sf_glad_glFramebufferTextureLayer;
+ if (sf_glad_glFramebufferTextureLayerEXT == NULL && sf_glad_glFramebufferTextureLayerARB != NULL) sf_glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)sf_glad_glFramebufferTextureLayerARB;
+ if (sf_glad_glGenBuffers == NULL && sf_glad_glGenBuffersARB != NULL) sf_glad_glGenBuffers = (PFNGLGENBUFFERSPROC)sf_glad_glGenBuffersARB;
+ if (sf_glad_glGenBuffersARB == NULL && sf_glad_glGenBuffers != NULL) sf_glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)sf_glad_glGenBuffers;
+ if (sf_glad_glGenerateMipmap == NULL && sf_glad_glGenerateMipmapEXT != NULL) sf_glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)sf_glad_glGenerateMipmapEXT;
+ if (sf_glad_glGenerateMipmapEXT == NULL && sf_glad_glGenerateMipmap != NULL) sf_glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)sf_glad_glGenerateMipmap;
+ if (sf_glad_glGenFramebuffers == NULL && sf_glad_glGenFramebuffersEXT != NULL) sf_glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)sf_glad_glGenFramebuffersEXT;
+ if (sf_glad_glGenFramebuffersEXT == NULL && sf_glad_glGenFramebuffers != NULL) sf_glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)sf_glad_glGenFramebuffers;
+ if (sf_glad_glGenProgramsARB == NULL && sf_glad_glGenProgramsNV != NULL) sf_glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)sf_glad_glGenProgramsNV;
+ if (sf_glad_glGenProgramsNV == NULL && sf_glad_glGenProgramsARB != NULL) sf_glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)sf_glad_glGenProgramsARB;
+ if (sf_glad_glGenRenderbuffers == NULL && sf_glad_glGenRenderbuffersEXT != NULL) sf_glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)sf_glad_glGenRenderbuffersEXT;
+ if (sf_glad_glGenRenderbuffersEXT == NULL && sf_glad_glGenRenderbuffers != NULL) sf_glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)sf_glad_glGenRenderbuffers;
+ if (sf_glad_glGetActiveAttrib == NULL && sf_glad_glGetActiveAttribARB != NULL) sf_glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)sf_glad_glGetActiveAttribARB;
+ if (sf_glad_glGetActiveAttribARB == NULL && sf_glad_glGetActiveAttrib != NULL) sf_glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)sf_glad_glGetActiveAttrib;
+ if (sf_glad_glGetActiveUniform == NULL && sf_glad_glGetActiveUniformARB != NULL) sf_glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)sf_glad_glGetActiveUniformARB;
+ if (sf_glad_glGetActiveUniformARB == NULL && sf_glad_glGetActiveUniform != NULL) sf_glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)sf_glad_glGetActiveUniform;
+ if (sf_glad_glGetAttribLocation == NULL && sf_glad_glGetAttribLocationARB != NULL) sf_glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)sf_glad_glGetAttribLocationARB;
+ if (sf_glad_glGetAttribLocationARB == NULL && sf_glad_glGetAttribLocation != NULL) sf_glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)sf_glad_glGetAttribLocation;
+ if (sf_glad_glGetBufferParameteriv == NULL && sf_glad_glGetBufferParameterivARB != NULL) sf_glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)sf_glad_glGetBufferParameterivARB;
+ if (sf_glad_glGetBufferParameterivARB == NULL && sf_glad_glGetBufferParameteriv != NULL) sf_glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)sf_glad_glGetBufferParameteriv;
+ if (sf_glad_glGetBufferPointerv == NULL && sf_glad_glGetBufferPointervARB != NULL) sf_glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)sf_glad_glGetBufferPointervARB;
+ if (sf_glad_glGetBufferPointervARB == NULL && sf_glad_glGetBufferPointerv != NULL) sf_glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)sf_glad_glGetBufferPointerv;
+ if (sf_glad_glGetBufferSubData == NULL && sf_glad_glGetBufferSubDataARB != NULL) sf_glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)sf_glad_glGetBufferSubDataARB;
+ if (sf_glad_glGetBufferSubDataARB == NULL && sf_glad_glGetBufferSubData != NULL) sf_glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)sf_glad_glGetBufferSubData;
+ if (sf_glad_glGetFramebufferAttachmentParameteriv == NULL && sf_glad_glGetFramebufferAttachmentParameterivEXT != NULL) sf_glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)sf_glad_glGetFramebufferAttachmentParameterivEXT;
+ if (sf_glad_glGetFramebufferAttachmentParameterivEXT == NULL && sf_glad_glGetFramebufferAttachmentParameteriv != NULL) sf_glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)sf_glad_glGetFramebufferAttachmentParameteriv;
+ if (sf_glad_glGetPointerv == NULL && sf_glad_glGetPointervEXT != NULL) sf_glad_glGetPointerv = (PFNGLGETPOINTERVPROC)sf_glad_glGetPointervEXT;
+ if (sf_glad_glGetPointervEXT == NULL && sf_glad_glGetPointerv != NULL) sf_glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC)sf_glad_glGetPointerv;
+ if (sf_glad_glGetRenderbufferParameteriv == NULL && sf_glad_glGetRenderbufferParameterivEXT != NULL) sf_glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)sf_glad_glGetRenderbufferParameterivEXT;
+ if (sf_glad_glGetRenderbufferParameterivEXT == NULL && sf_glad_glGetRenderbufferParameteriv != NULL) sf_glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)sf_glad_glGetRenderbufferParameteriv;
+ if (sf_glad_glGetShaderSource == NULL && sf_glad_glGetShaderSourceARB != NULL) sf_glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)sf_glad_glGetShaderSourceARB;
+ if (sf_glad_glGetShaderSourceARB == NULL && sf_glad_glGetShaderSource != NULL) sf_glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)sf_glad_glGetShaderSource;
+ if (sf_glad_glGetUniformfv == NULL && sf_glad_glGetUniformfvARB != NULL) sf_glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC)sf_glad_glGetUniformfvARB;
+ if (sf_glad_glGetUniformfvARB == NULL && sf_glad_glGetUniformfv != NULL) sf_glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)sf_glad_glGetUniformfv;
+ if (sf_glad_glGetUniformiv == NULL && sf_glad_glGetUniformivARB != NULL) sf_glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC)sf_glad_glGetUniformivARB;
+ if (sf_glad_glGetUniformivARB == NULL && sf_glad_glGetUniformiv != NULL) sf_glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)sf_glad_glGetUniformiv;
+ if (sf_glad_glGetUniformLocation == NULL && sf_glad_glGetUniformLocationARB != NULL) sf_glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)sf_glad_glGetUniformLocationARB;
+ if (sf_glad_glGetUniformLocationARB == NULL && sf_glad_glGetUniformLocation != NULL) sf_glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)sf_glad_glGetUniformLocation;
+ if (sf_glad_glGetVertexAttribdv == NULL && sf_glad_glGetVertexAttribdvARB != NULL) sf_glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)sf_glad_glGetVertexAttribdvARB;
+ if (sf_glad_glGetVertexAttribdv == NULL && sf_glad_glGetVertexAttribdvNV != NULL) sf_glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)sf_glad_glGetVertexAttribdvNV;
+ if (sf_glad_glGetVertexAttribdvARB == NULL && sf_glad_glGetVertexAttribdv != NULL) sf_glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)sf_glad_glGetVertexAttribdv;
+ if (sf_glad_glGetVertexAttribdvARB == NULL && sf_glad_glGetVertexAttribdvNV != NULL) sf_glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)sf_glad_glGetVertexAttribdvNV;
+ if (sf_glad_glGetVertexAttribdvNV == NULL && sf_glad_glGetVertexAttribdv != NULL) sf_glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)sf_glad_glGetVertexAttribdv;
+ if (sf_glad_glGetVertexAttribdvNV == NULL && sf_glad_glGetVertexAttribdvARB != NULL) sf_glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)sf_glad_glGetVertexAttribdvARB;
+ if (sf_glad_glGetVertexAttribfv == NULL && sf_glad_glGetVertexAttribfvARB != NULL) sf_glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)sf_glad_glGetVertexAttribfvARB;
+ if (sf_glad_glGetVertexAttribfv == NULL && sf_glad_glGetVertexAttribfvNV != NULL) sf_glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)sf_glad_glGetVertexAttribfvNV;
+ if (sf_glad_glGetVertexAttribfvARB == NULL && sf_glad_glGetVertexAttribfv != NULL) sf_glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)sf_glad_glGetVertexAttribfv;
+ if (sf_glad_glGetVertexAttribfvARB == NULL && sf_glad_glGetVertexAttribfvNV != NULL) sf_glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)sf_glad_glGetVertexAttribfvNV;
+ if (sf_glad_glGetVertexAttribfvNV == NULL && sf_glad_glGetVertexAttribfv != NULL) sf_glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)sf_glad_glGetVertexAttribfv;
+ if (sf_glad_glGetVertexAttribfvNV == NULL && sf_glad_glGetVertexAttribfvARB != NULL) sf_glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)sf_glad_glGetVertexAttribfvARB;
+ if (sf_glad_glGetVertexAttribiv == NULL && sf_glad_glGetVertexAttribivARB != NULL) sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)sf_glad_glGetVertexAttribivARB;
+ if (sf_glad_glGetVertexAttribiv == NULL && sf_glad_glGetVertexAttribivNV != NULL) sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)sf_glad_glGetVertexAttribivNV;
+ if (sf_glad_glGetVertexAttribivARB == NULL && sf_glad_glGetVertexAttribiv != NULL) sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)sf_glad_glGetVertexAttribiv;
+ if (sf_glad_glGetVertexAttribivARB == NULL && sf_glad_glGetVertexAttribivNV != NULL) sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)sf_glad_glGetVertexAttribivNV;
+ if (sf_glad_glGetVertexAttribivNV == NULL && sf_glad_glGetVertexAttribiv != NULL) sf_glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)sf_glad_glGetVertexAttribiv;
+ if (sf_glad_glGetVertexAttribivNV == NULL && sf_glad_glGetVertexAttribivARB != NULL) sf_glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)sf_glad_glGetVertexAttribivARB;
+ if (sf_glad_glGetVertexAttribPointerv == NULL && sf_glad_glGetVertexAttribPointervARB != NULL) sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)sf_glad_glGetVertexAttribPointervARB;
+ if (sf_glad_glGetVertexAttribPointerv == NULL && sf_glad_glGetVertexAttribPointervNV != NULL) sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)sf_glad_glGetVertexAttribPointervNV;
+ if (sf_glad_glGetVertexAttribPointervARB == NULL && sf_glad_glGetVertexAttribPointerv != NULL) sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)sf_glad_glGetVertexAttribPointerv;
+ if (sf_glad_glGetVertexAttribPointervARB == NULL && sf_glad_glGetVertexAttribPointervNV != NULL) sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)sf_glad_glGetVertexAttribPointervNV;
+ if (sf_glad_glGetVertexAttribPointervNV == NULL && sf_glad_glGetVertexAttribPointerv != NULL) sf_glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)sf_glad_glGetVertexAttribPointerv;
+ if (sf_glad_glGetVertexAttribPointervNV == NULL && sf_glad_glGetVertexAttribPointervARB != NULL) sf_glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)sf_glad_glGetVertexAttribPointervARB;
+ if (sf_glad_glIsBuffer == NULL && sf_glad_glIsBufferARB != NULL) sf_glad_glIsBuffer = (PFNGLISBUFFERPROC)sf_glad_glIsBufferARB;
+ if (sf_glad_glIsBufferARB == NULL && sf_glad_glIsBuffer != NULL) sf_glad_glIsBufferARB = (PFNGLISBUFFERARBPROC)sf_glad_glIsBuffer;
+ if (sf_glad_glIsFramebuffer == NULL && sf_glad_glIsFramebufferEXT != NULL) sf_glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)sf_glad_glIsFramebufferEXT;
+ if (sf_glad_glIsFramebufferEXT == NULL && sf_glad_glIsFramebuffer != NULL) sf_glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)sf_glad_glIsFramebuffer;
+ if (sf_glad_glIsProgramARB == NULL && sf_glad_glIsProgramNV != NULL) sf_glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC)sf_glad_glIsProgramNV;
+ if (sf_glad_glIsProgramNV == NULL && sf_glad_glIsProgramARB != NULL) sf_glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC)sf_glad_glIsProgramARB;
+ if (sf_glad_glIsRenderbuffer == NULL && sf_glad_glIsRenderbufferEXT != NULL) sf_glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)sf_glad_glIsRenderbufferEXT;
+ if (sf_glad_glIsRenderbufferEXT == NULL && sf_glad_glIsRenderbuffer != NULL) sf_glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)sf_glad_glIsRenderbuffer;
+ if (sf_glad_glLinkProgram == NULL && sf_glad_glLinkProgramARB != NULL) sf_glad_glLinkProgram = (PFNGLLINKPROGRAMPROC)sf_glad_glLinkProgramARB;
+ if (sf_glad_glLinkProgramARB == NULL && sf_glad_glLinkProgram != NULL) sf_glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)sf_glad_glLinkProgram;
+ if (sf_glad_glMapBuffer == NULL && sf_glad_glMapBufferARB != NULL) sf_glad_glMapBuffer = (PFNGLMAPBUFFERPROC)sf_glad_glMapBufferARB;
+ if (sf_glad_glMapBufferARB == NULL && sf_glad_glMapBuffer != NULL) sf_glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC)sf_glad_glMapBuffer;
+ if (sf_glad_glMultiTexCoord1d == NULL && sf_glad_glMultiTexCoord1dARB != NULL) sf_glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)sf_glad_glMultiTexCoord1dARB;
+ if (sf_glad_glMultiTexCoord1dARB == NULL && sf_glad_glMultiTexCoord1d != NULL) sf_glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)sf_glad_glMultiTexCoord1d;
+ if (sf_glad_glMultiTexCoord1dv == NULL && sf_glad_glMultiTexCoord1dvARB != NULL) sf_glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)sf_glad_glMultiTexCoord1dvARB;
+ if (sf_glad_glMultiTexCoord1dvARB == NULL && sf_glad_glMultiTexCoord1dv != NULL) sf_glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)sf_glad_glMultiTexCoord1dv;
+ if (sf_glad_glMultiTexCoord1f == NULL && sf_glad_glMultiTexCoord1fARB != NULL) sf_glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)sf_glad_glMultiTexCoord1fARB;
+ if (sf_glad_glMultiTexCoord1fARB == NULL && sf_glad_glMultiTexCoord1f != NULL) sf_glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)sf_glad_glMultiTexCoord1f;
+ if (sf_glad_glMultiTexCoord1fv == NULL && sf_glad_glMultiTexCoord1fvARB != NULL) sf_glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)sf_glad_glMultiTexCoord1fvARB;
+ if (sf_glad_glMultiTexCoord1fvARB == NULL && sf_glad_glMultiTexCoord1fv != NULL) sf_glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)sf_glad_glMultiTexCoord1fv;
+ if (sf_glad_glMultiTexCoord1i == NULL && sf_glad_glMultiTexCoord1iARB != NULL) sf_glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)sf_glad_glMultiTexCoord1iARB;
+ if (sf_glad_glMultiTexCoord1iARB == NULL && sf_glad_glMultiTexCoord1i != NULL) sf_glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)sf_glad_glMultiTexCoord1i;
+ if (sf_glad_glMultiTexCoord1iv == NULL && sf_glad_glMultiTexCoord1ivARB != NULL) sf_glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)sf_glad_glMultiTexCoord1ivARB;
+ if (sf_glad_glMultiTexCoord1ivARB == NULL && sf_glad_glMultiTexCoord1iv != NULL) sf_glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)sf_glad_glMultiTexCoord1iv;
+ if (sf_glad_glMultiTexCoord1s == NULL && sf_glad_glMultiTexCoord1sARB != NULL) sf_glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)sf_glad_glMultiTexCoord1sARB;
+ if (sf_glad_glMultiTexCoord1sARB == NULL && sf_glad_glMultiTexCoord1s != NULL) sf_glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)sf_glad_glMultiTexCoord1s;
+ if (sf_glad_glMultiTexCoord1sv == NULL && sf_glad_glMultiTexCoord1svARB != NULL) sf_glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)sf_glad_glMultiTexCoord1svARB;
+ if (sf_glad_glMultiTexCoord1svARB == NULL && sf_glad_glMultiTexCoord1sv != NULL) sf_glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)sf_glad_glMultiTexCoord1sv;
+ if (sf_glad_glMultiTexCoord2d == NULL && sf_glad_glMultiTexCoord2dARB != NULL) sf_glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)sf_glad_glMultiTexCoord2dARB;
+ if (sf_glad_glMultiTexCoord2dARB == NULL && sf_glad_glMultiTexCoord2d != NULL) sf_glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)sf_glad_glMultiTexCoord2d;
+ if (sf_glad_glMultiTexCoord2dv == NULL && sf_glad_glMultiTexCoord2dvARB != NULL) sf_glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)sf_glad_glMultiTexCoord2dvARB;
+ if (sf_glad_glMultiTexCoord2dvARB == NULL && sf_glad_glMultiTexCoord2dv != NULL) sf_glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)sf_glad_glMultiTexCoord2dv;
+ if (sf_glad_glMultiTexCoord2f == NULL && sf_glad_glMultiTexCoord2fARB != NULL) sf_glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)sf_glad_glMultiTexCoord2fARB;
+ if (sf_glad_glMultiTexCoord2fARB == NULL && sf_glad_glMultiTexCoord2f != NULL) sf_glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)sf_glad_glMultiTexCoord2f;
+ if (sf_glad_glMultiTexCoord2fv == NULL && sf_glad_glMultiTexCoord2fvARB != NULL) sf_glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)sf_glad_glMultiTexCoord2fvARB;
+ if (sf_glad_glMultiTexCoord2fvARB == NULL && sf_glad_glMultiTexCoord2fv != NULL) sf_glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)sf_glad_glMultiTexCoord2fv;
+ if (sf_glad_glMultiTexCoord2i == NULL && sf_glad_glMultiTexCoord2iARB != NULL) sf_glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)sf_glad_glMultiTexCoord2iARB;
+ if (sf_glad_glMultiTexCoord2iARB == NULL && sf_glad_glMultiTexCoord2i != NULL) sf_glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)sf_glad_glMultiTexCoord2i;
+ if (sf_glad_glMultiTexCoord2iv == NULL && sf_glad_glMultiTexCoord2ivARB != NULL) sf_glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)sf_glad_glMultiTexCoord2ivARB;
+ if (sf_glad_glMultiTexCoord2ivARB == NULL && sf_glad_glMultiTexCoord2iv != NULL) sf_glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)sf_glad_glMultiTexCoord2iv;
+ if (sf_glad_glMultiTexCoord2s == NULL && sf_glad_glMultiTexCoord2sARB != NULL) sf_glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)sf_glad_glMultiTexCoord2sARB;
+ if (sf_glad_glMultiTexCoord2sARB == NULL && sf_glad_glMultiTexCoord2s != NULL) sf_glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)sf_glad_glMultiTexCoord2s;
+ if (sf_glad_glMultiTexCoord2sv == NULL && sf_glad_glMultiTexCoord2svARB != NULL) sf_glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)sf_glad_glMultiTexCoord2svARB;
+ if (sf_glad_glMultiTexCoord2svARB == NULL && sf_glad_glMultiTexCoord2sv != NULL) sf_glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)sf_glad_glMultiTexCoord2sv;
+ if (sf_glad_glMultiTexCoord3d == NULL && sf_glad_glMultiTexCoord3dARB != NULL) sf_glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)sf_glad_glMultiTexCoord3dARB;
+ if (sf_glad_glMultiTexCoord3dARB == NULL && sf_glad_glMultiTexCoord3d != NULL) sf_glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)sf_glad_glMultiTexCoord3d;
+ if (sf_glad_glMultiTexCoord3dv == NULL && sf_glad_glMultiTexCoord3dvARB != NULL) sf_glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)sf_glad_glMultiTexCoord3dvARB;
+ if (sf_glad_glMultiTexCoord3dvARB == NULL && sf_glad_glMultiTexCoord3dv != NULL) sf_glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)sf_glad_glMultiTexCoord3dv;
+ if (sf_glad_glMultiTexCoord3f == NULL && sf_glad_glMultiTexCoord3fARB != NULL) sf_glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)sf_glad_glMultiTexCoord3fARB;
+ if (sf_glad_glMultiTexCoord3fARB == NULL && sf_glad_glMultiTexCoord3f != NULL) sf_glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)sf_glad_glMultiTexCoord3f;
+ if (sf_glad_glMultiTexCoord3fv == NULL && sf_glad_glMultiTexCoord3fvARB != NULL) sf_glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)sf_glad_glMultiTexCoord3fvARB;
+ if (sf_glad_glMultiTexCoord3fvARB == NULL && sf_glad_glMultiTexCoord3fv != NULL) sf_glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)sf_glad_glMultiTexCoord3fv;
+ if (sf_glad_glMultiTexCoord3i == NULL && sf_glad_glMultiTexCoord3iARB != NULL) sf_glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)sf_glad_glMultiTexCoord3iARB;
+ if (sf_glad_glMultiTexCoord3iARB == NULL && sf_glad_glMultiTexCoord3i != NULL) sf_glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)sf_glad_glMultiTexCoord3i;
+ if (sf_glad_glMultiTexCoord3iv == NULL && sf_glad_glMultiTexCoord3ivARB != NULL) sf_glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)sf_glad_glMultiTexCoord3ivARB;
+ if (sf_glad_glMultiTexCoord3ivARB == NULL && sf_glad_glMultiTexCoord3iv != NULL) sf_glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)sf_glad_glMultiTexCoord3iv;
+ if (sf_glad_glMultiTexCoord3s == NULL && sf_glad_glMultiTexCoord3sARB != NULL) sf_glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)sf_glad_glMultiTexCoord3sARB;
+ if (sf_glad_glMultiTexCoord3sARB == NULL && sf_glad_glMultiTexCoord3s != NULL) sf_glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)sf_glad_glMultiTexCoord3s;
+ if (sf_glad_glMultiTexCoord3sv == NULL && sf_glad_glMultiTexCoord3svARB != NULL) sf_glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)sf_glad_glMultiTexCoord3svARB;
+ if (sf_glad_glMultiTexCoord3svARB == NULL && sf_glad_glMultiTexCoord3sv != NULL) sf_glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)sf_glad_glMultiTexCoord3sv;
+ if (sf_glad_glMultiTexCoord4d == NULL && sf_glad_glMultiTexCoord4dARB != NULL) sf_glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)sf_glad_glMultiTexCoord4dARB;
+ if (sf_glad_glMultiTexCoord4dARB == NULL && sf_glad_glMultiTexCoord4d != NULL) sf_glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)sf_glad_glMultiTexCoord4d;
+ if (sf_glad_glMultiTexCoord4dv == NULL && sf_glad_glMultiTexCoord4dvARB != NULL) sf_glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)sf_glad_glMultiTexCoord4dvARB;
+ if (sf_glad_glMultiTexCoord4dvARB == NULL && sf_glad_glMultiTexCoord4dv != NULL) sf_glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)sf_glad_glMultiTexCoord4dv;
+ if (sf_glad_glMultiTexCoord4f == NULL && sf_glad_glMultiTexCoord4fARB != NULL) sf_glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)sf_glad_glMultiTexCoord4fARB;
+ if (sf_glad_glMultiTexCoord4fARB == NULL && sf_glad_glMultiTexCoord4f != NULL) sf_glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)sf_glad_glMultiTexCoord4f;
+ if (sf_glad_glMultiTexCoord4fv == NULL && sf_glad_glMultiTexCoord4fvARB != NULL) sf_glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)sf_glad_glMultiTexCoord4fvARB;
+ if (sf_glad_glMultiTexCoord4fvARB == NULL && sf_glad_glMultiTexCoord4fv != NULL) sf_glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)sf_glad_glMultiTexCoord4fv;
+ if (sf_glad_glMultiTexCoord4i == NULL && sf_glad_glMultiTexCoord4iARB != NULL) sf_glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)sf_glad_glMultiTexCoord4iARB;
+ if (sf_glad_glMultiTexCoord4iARB == NULL && sf_glad_glMultiTexCoord4i != NULL) sf_glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)sf_glad_glMultiTexCoord4i;
+ if (sf_glad_glMultiTexCoord4iv == NULL && sf_glad_glMultiTexCoord4ivARB != NULL) sf_glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)sf_glad_glMultiTexCoord4ivARB;
+ if (sf_glad_glMultiTexCoord4ivARB == NULL && sf_glad_glMultiTexCoord4iv != NULL) sf_glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)sf_glad_glMultiTexCoord4iv;
+ if (sf_glad_glMultiTexCoord4s == NULL && sf_glad_glMultiTexCoord4sARB != NULL) sf_glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)sf_glad_glMultiTexCoord4sARB;
+ if (sf_glad_glMultiTexCoord4sARB == NULL && sf_glad_glMultiTexCoord4s != NULL) sf_glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)sf_glad_glMultiTexCoord4s;
+ if (sf_glad_glMultiTexCoord4sv == NULL && sf_glad_glMultiTexCoord4svARB != NULL) sf_glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)sf_glad_glMultiTexCoord4svARB;
+ if (sf_glad_glMultiTexCoord4svARB == NULL && sf_glad_glMultiTexCoord4sv != NULL) sf_glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)sf_glad_glMultiTexCoord4sv;
+ if (sf_glad_glPrioritizeTextures == NULL && sf_glad_glPrioritizeTexturesEXT != NULL) sf_glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC)sf_glad_glPrioritizeTexturesEXT;
+ if (sf_glad_glPrioritizeTexturesEXT == NULL && sf_glad_glPrioritizeTextures != NULL) sf_glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)sf_glad_glPrioritizeTextures;
+ if (sf_glad_glProgramParameteri == NULL && sf_glad_glProgramParameteriARB != NULL) sf_glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)sf_glad_glProgramParameteriARB;
+ if (sf_glad_glProgramParameteri == NULL && sf_glad_glProgramParameteriEXT != NULL) sf_glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)sf_glad_glProgramParameteriEXT;
+ if (sf_glad_glProgramParameteriARB == NULL && sf_glad_glProgramParameteri != NULL) sf_glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)sf_glad_glProgramParameteri;
+ if (sf_glad_glProgramParameteriARB == NULL && sf_glad_glProgramParameteriEXT != NULL) sf_glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)sf_glad_glProgramParameteriEXT;
+ if (sf_glad_glProgramParameteriEXT == NULL && sf_glad_glProgramParameteri != NULL) sf_glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)sf_glad_glProgramParameteri;
+ if (sf_glad_glProgramParameteriEXT == NULL && sf_glad_glProgramParameteriARB != NULL) sf_glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)sf_glad_glProgramParameteriARB;
+ if (sf_glad_glRenderbufferStorage == NULL && sf_glad_glRenderbufferStorageEXT != NULL) sf_glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)sf_glad_glRenderbufferStorageEXT;
+ if (sf_glad_glRenderbufferStorageEXT == NULL && sf_glad_glRenderbufferStorage != NULL) sf_glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)sf_glad_glRenderbufferStorage;
+ if (sf_glad_glRenderbufferStorageMultisample == NULL && sf_glad_glRenderbufferStorageMultisampleEXT != NULL) sf_glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)sf_glad_glRenderbufferStorageMultisampleEXT;
+ if (sf_glad_glRenderbufferStorageMultisampleEXT == NULL && sf_glad_glRenderbufferStorageMultisample != NULL) sf_glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)sf_glad_glRenderbufferStorageMultisample;
+ if (sf_glad_glShaderSource == NULL && sf_glad_glShaderSourceARB != NULL) sf_glad_glShaderSource = (PFNGLSHADERSOURCEPROC)sf_glad_glShaderSourceARB;
+ if (sf_glad_glShaderSourceARB == NULL && sf_glad_glShaderSource != NULL) sf_glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)sf_glad_glShaderSource;
+ if (sf_glad_glTexSubImage1D == NULL && sf_glad_glTexSubImage1DEXT != NULL) sf_glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)sf_glad_glTexSubImage1DEXT;
+ if (sf_glad_glTexSubImage1DEXT == NULL && sf_glad_glTexSubImage1D != NULL) sf_glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)sf_glad_glTexSubImage1D;
+ if (sf_glad_glTexSubImage2D == NULL && sf_glad_glTexSubImage2DEXT != NULL) sf_glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)sf_glad_glTexSubImage2DEXT;
+ if (sf_glad_glTexSubImage2DEXT == NULL && sf_glad_glTexSubImage2D != NULL) sf_glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)sf_glad_glTexSubImage2D;
+ if (sf_glad_glUniform1f == NULL && sf_glad_glUniform1fARB != NULL) sf_glad_glUniform1f = (PFNGLUNIFORM1FPROC)sf_glad_glUniform1fARB;
+ if (sf_glad_glUniform1fARB == NULL && sf_glad_glUniform1f != NULL) sf_glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC)sf_glad_glUniform1f;
+ if (sf_glad_glUniform1fv == NULL && sf_glad_glUniform1fvARB != NULL) sf_glad_glUniform1fv = (PFNGLUNIFORM1FVPROC)sf_glad_glUniform1fvARB;
+ if (sf_glad_glUniform1fvARB == NULL && sf_glad_glUniform1fv != NULL) sf_glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)sf_glad_glUniform1fv;
+ if (sf_glad_glUniform1i == NULL && sf_glad_glUniform1iARB != NULL) sf_glad_glUniform1i = (PFNGLUNIFORM1IPROC)sf_glad_glUniform1iARB;
+ if (sf_glad_glUniform1iARB == NULL && sf_glad_glUniform1i != NULL) sf_glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC)sf_glad_glUniform1i;
+ if (sf_glad_glUniform1iv == NULL && sf_glad_glUniform1ivARB != NULL) sf_glad_glUniform1iv = (PFNGLUNIFORM1IVPROC)sf_glad_glUniform1ivARB;
+ if (sf_glad_glUniform1ivARB == NULL && sf_glad_glUniform1iv != NULL) sf_glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)sf_glad_glUniform1iv;
+ if (sf_glad_glUniform2f == NULL && sf_glad_glUniform2fARB != NULL) sf_glad_glUniform2f = (PFNGLUNIFORM2FPROC)sf_glad_glUniform2fARB;
+ if (sf_glad_glUniform2fARB == NULL && sf_glad_glUniform2f != NULL) sf_glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC)sf_glad_glUniform2f;
+ if (sf_glad_glUniform2fv == NULL && sf_glad_glUniform2fvARB != NULL) sf_glad_glUniform2fv = (PFNGLUNIFORM2FVPROC)sf_glad_glUniform2fvARB;
+ if (sf_glad_glUniform2fvARB == NULL && sf_glad_glUniform2fv != NULL) sf_glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)sf_glad_glUniform2fv;
+ if (sf_glad_glUniform2i == NULL && sf_glad_glUniform2iARB != NULL) sf_glad_glUniform2i = (PFNGLUNIFORM2IPROC)sf_glad_glUniform2iARB;
+ if (sf_glad_glUniform2iARB == NULL && sf_glad_glUniform2i != NULL) sf_glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC)sf_glad_glUniform2i;
+ if (sf_glad_glUniform2iv == NULL && sf_glad_glUniform2ivARB != NULL) sf_glad_glUniform2iv = (PFNGLUNIFORM2IVPROC)sf_glad_glUniform2ivARB;
+ if (sf_glad_glUniform2ivARB == NULL && sf_glad_glUniform2iv != NULL) sf_glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)sf_glad_glUniform2iv;
+ if (sf_glad_glUniform3f == NULL && sf_glad_glUniform3fARB != NULL) sf_glad_glUniform3f = (PFNGLUNIFORM3FPROC)sf_glad_glUniform3fARB;
+ if (sf_glad_glUniform3fARB == NULL && sf_glad_glUniform3f != NULL) sf_glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC)sf_glad_glUniform3f;
+ if (sf_glad_glUniform3fv == NULL && sf_glad_glUniform3fvARB != NULL) sf_glad_glUniform3fv = (PFNGLUNIFORM3FVPROC)sf_glad_glUniform3fvARB;
+ if (sf_glad_glUniform3fvARB == NULL && sf_glad_glUniform3fv != NULL) sf_glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)sf_glad_glUniform3fv;
+ if (sf_glad_glUniform3i == NULL && sf_glad_glUniform3iARB != NULL) sf_glad_glUniform3i = (PFNGLUNIFORM3IPROC)sf_glad_glUniform3iARB;
+ if (sf_glad_glUniform3iARB == NULL && sf_glad_glUniform3i != NULL) sf_glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC)sf_glad_glUniform3i;
+ if (sf_glad_glUniform3iv == NULL && sf_glad_glUniform3ivARB != NULL) sf_glad_glUniform3iv = (PFNGLUNIFORM3IVPROC)sf_glad_glUniform3ivARB;
+ if (sf_glad_glUniform3ivARB == NULL && sf_glad_glUniform3iv != NULL) sf_glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)sf_glad_glUniform3iv;
+ if (sf_glad_glUniform4f == NULL && sf_glad_glUniform4fARB != NULL) sf_glad_glUniform4f = (PFNGLUNIFORM4FPROC)sf_glad_glUniform4fARB;
+ if (sf_glad_glUniform4fARB == NULL && sf_glad_glUniform4f != NULL) sf_glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC)sf_glad_glUniform4f;
+ if (sf_glad_glUniform4fv == NULL && sf_glad_glUniform4fvARB != NULL) sf_glad_glUniform4fv = (PFNGLUNIFORM4FVPROC)sf_glad_glUniform4fvARB;
+ if (sf_glad_glUniform4fvARB == NULL && sf_glad_glUniform4fv != NULL) sf_glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)sf_glad_glUniform4fv;
+ if (sf_glad_glUniform4i == NULL && sf_glad_glUniform4iARB != NULL) sf_glad_glUniform4i = (PFNGLUNIFORM4IPROC)sf_glad_glUniform4iARB;
+ if (sf_glad_glUniform4iARB == NULL && sf_glad_glUniform4i != NULL) sf_glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC)sf_glad_glUniform4i;
+ if (sf_glad_glUniform4iv == NULL && sf_glad_glUniform4ivARB != NULL) sf_glad_glUniform4iv = (PFNGLUNIFORM4IVPROC)sf_glad_glUniform4ivARB;
+ if (sf_glad_glUniform4ivARB == NULL && sf_glad_glUniform4iv != NULL) sf_glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)sf_glad_glUniform4iv;
+ if (sf_glad_glUniformMatrix2fv == NULL && sf_glad_glUniformMatrix2fvARB != NULL) sf_glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)sf_glad_glUniformMatrix2fvARB;
+ if (sf_glad_glUniformMatrix2fvARB == NULL && sf_glad_glUniformMatrix2fv != NULL) sf_glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)sf_glad_glUniformMatrix2fv;
+ if (sf_glad_glUniformMatrix3fv == NULL && sf_glad_glUniformMatrix3fvARB != NULL) sf_glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)sf_glad_glUniformMatrix3fvARB;
+ if (sf_glad_glUniformMatrix3fvARB == NULL && sf_glad_glUniformMatrix3fv != NULL) sf_glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)sf_glad_glUniformMatrix3fv;
+ if (sf_glad_glUniformMatrix4fv == NULL && sf_glad_glUniformMatrix4fvARB != NULL) sf_glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)sf_glad_glUniformMatrix4fvARB;
+ if (sf_glad_glUniformMatrix4fvARB == NULL && sf_glad_glUniformMatrix4fv != NULL) sf_glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)sf_glad_glUniformMatrix4fv;
+ if (sf_glad_glUnmapBuffer == NULL && sf_glad_glUnmapBufferARB != NULL) sf_glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)sf_glad_glUnmapBufferARB;
+ if (sf_glad_glUnmapBufferARB == NULL && sf_glad_glUnmapBuffer != NULL) sf_glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)sf_glad_glUnmapBuffer;
+ if (sf_glad_glUseProgram == NULL && sf_glad_glUseProgramObjectARB != NULL) sf_glad_glUseProgram = (PFNGLUSEPROGRAMPROC)sf_glad_glUseProgramObjectARB;
+ if (sf_glad_glUseProgramObjectARB == NULL && sf_glad_glUseProgram != NULL) sf_glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)sf_glad_glUseProgram;
+ if (sf_glad_glValidateProgram == NULL && sf_glad_glValidateProgramARB != NULL) sf_glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)sf_glad_glValidateProgramARB;
+ if (sf_glad_glValidateProgramARB == NULL && sf_glad_glValidateProgram != NULL) sf_glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)sf_glad_glValidateProgram;
+ if (sf_glad_glVertexAttrib1d == NULL && sf_glad_glVertexAttrib1dARB != NULL) sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)sf_glad_glVertexAttrib1dARB;
+ if (sf_glad_glVertexAttrib1d == NULL && sf_glad_glVertexAttrib1dNV != NULL) sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)sf_glad_glVertexAttrib1dNV;
+ if (sf_glad_glVertexAttrib1dARB == NULL && sf_glad_glVertexAttrib1d != NULL) sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)sf_glad_glVertexAttrib1d;
+ if (sf_glad_glVertexAttrib1dARB == NULL && sf_glad_glVertexAttrib1dNV != NULL) sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)sf_glad_glVertexAttrib1dNV;
+ if (sf_glad_glVertexAttrib1dNV == NULL && sf_glad_glVertexAttrib1d != NULL) sf_glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)sf_glad_glVertexAttrib1d;
+ if (sf_glad_glVertexAttrib1dNV == NULL && sf_glad_glVertexAttrib1dARB != NULL) sf_glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)sf_glad_glVertexAttrib1dARB;
+ if (sf_glad_glVertexAttrib1dv == NULL && sf_glad_glVertexAttrib1dvARB != NULL) sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)sf_glad_glVertexAttrib1dvARB;
+ if (sf_glad_glVertexAttrib1dv == NULL && sf_glad_glVertexAttrib1dvNV != NULL) sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)sf_glad_glVertexAttrib1dvNV;
+ if (sf_glad_glVertexAttrib1dvARB == NULL && sf_glad_glVertexAttrib1dv != NULL) sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)sf_glad_glVertexAttrib1dv;
+ if (sf_glad_glVertexAttrib1dvARB == NULL && sf_glad_glVertexAttrib1dvNV != NULL) sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)sf_glad_glVertexAttrib1dvNV;
+ if (sf_glad_glVertexAttrib1dvNV == NULL && sf_glad_glVertexAttrib1dv != NULL) sf_glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)sf_glad_glVertexAttrib1dv;
+ if (sf_glad_glVertexAttrib1dvNV == NULL && sf_glad_glVertexAttrib1dvARB != NULL) sf_glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)sf_glad_glVertexAttrib1dvARB;
+ if (sf_glad_glVertexAttrib1f == NULL && sf_glad_glVertexAttrib1fARB != NULL) sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)sf_glad_glVertexAttrib1fARB;
+ if (sf_glad_glVertexAttrib1f == NULL && sf_glad_glVertexAttrib1fNV != NULL) sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)sf_glad_glVertexAttrib1fNV;
+ if (sf_glad_glVertexAttrib1fARB == NULL && sf_glad_glVertexAttrib1f != NULL) sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)sf_glad_glVertexAttrib1f;
+ if (sf_glad_glVertexAttrib1fARB == NULL && sf_glad_glVertexAttrib1fNV != NULL) sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)sf_glad_glVertexAttrib1fNV;
+ if (sf_glad_glVertexAttrib1fNV == NULL && sf_glad_glVertexAttrib1f != NULL) sf_glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)sf_glad_glVertexAttrib1f;
+ if (sf_glad_glVertexAttrib1fNV == NULL && sf_glad_glVertexAttrib1fARB != NULL) sf_glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)sf_glad_glVertexAttrib1fARB;
+ if (sf_glad_glVertexAttrib1fv == NULL && sf_glad_glVertexAttrib1fvARB != NULL) sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)sf_glad_glVertexAttrib1fvARB;
+ if (sf_glad_glVertexAttrib1fv == NULL && sf_glad_glVertexAttrib1fvNV != NULL) sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)sf_glad_glVertexAttrib1fvNV;
+ if (sf_glad_glVertexAttrib1fvARB == NULL && sf_glad_glVertexAttrib1fv != NULL) sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)sf_glad_glVertexAttrib1fv;
+ if (sf_glad_glVertexAttrib1fvARB == NULL && sf_glad_glVertexAttrib1fvNV != NULL) sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)sf_glad_glVertexAttrib1fvNV;
+ if (sf_glad_glVertexAttrib1fvNV == NULL && sf_glad_glVertexAttrib1fv != NULL) sf_glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)sf_glad_glVertexAttrib1fv;
+ if (sf_glad_glVertexAttrib1fvNV == NULL && sf_glad_glVertexAttrib1fvARB != NULL) sf_glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)sf_glad_glVertexAttrib1fvARB;
+ if (sf_glad_glVertexAttrib1s == NULL && sf_glad_glVertexAttrib1sARB != NULL) sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)sf_glad_glVertexAttrib1sARB;
+ if (sf_glad_glVertexAttrib1s == NULL && sf_glad_glVertexAttrib1sNV != NULL) sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)sf_glad_glVertexAttrib1sNV;
+ if (sf_glad_glVertexAttrib1sARB == NULL && sf_glad_glVertexAttrib1s != NULL) sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)sf_glad_glVertexAttrib1s;
+ if (sf_glad_glVertexAttrib1sARB == NULL && sf_glad_glVertexAttrib1sNV != NULL) sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)sf_glad_glVertexAttrib1sNV;
+ if (sf_glad_glVertexAttrib1sNV == NULL && sf_glad_glVertexAttrib1s != NULL) sf_glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)sf_glad_glVertexAttrib1s;
+ if (sf_glad_glVertexAttrib1sNV == NULL && sf_glad_glVertexAttrib1sARB != NULL) sf_glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)sf_glad_glVertexAttrib1sARB;
+ if (sf_glad_glVertexAttrib1sv == NULL && sf_glad_glVertexAttrib1svARB != NULL) sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)sf_glad_glVertexAttrib1svARB;
+ if (sf_glad_glVertexAttrib1sv == NULL && sf_glad_glVertexAttrib1svNV != NULL) sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)sf_glad_glVertexAttrib1svNV;
+ if (sf_glad_glVertexAttrib1svARB == NULL && sf_glad_glVertexAttrib1sv != NULL) sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)sf_glad_glVertexAttrib1sv;
+ if (sf_glad_glVertexAttrib1svARB == NULL && sf_glad_glVertexAttrib1svNV != NULL) sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)sf_glad_glVertexAttrib1svNV;
+ if (sf_glad_glVertexAttrib1svNV == NULL && sf_glad_glVertexAttrib1sv != NULL) sf_glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)sf_glad_glVertexAttrib1sv;
+ if (sf_glad_glVertexAttrib1svNV == NULL && sf_glad_glVertexAttrib1svARB != NULL) sf_glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)sf_glad_glVertexAttrib1svARB;
+ if (sf_glad_glVertexAttrib2d == NULL && sf_glad_glVertexAttrib2dARB != NULL) sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)sf_glad_glVertexAttrib2dARB;
+ if (sf_glad_glVertexAttrib2d == NULL && sf_glad_glVertexAttrib2dNV != NULL) sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)sf_glad_glVertexAttrib2dNV;
+ if (sf_glad_glVertexAttrib2dARB == NULL && sf_glad_glVertexAttrib2d != NULL) sf_glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)sf_glad_glVertexAttrib2d;
+ if (sf_glad_glVertexAttrib2dARB == NULL && sf_glad_glVertexAttrib2dNV != NULL) sf_glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)sf_glad_glVertexAttrib2dNV;
+ if (sf_glad_glVertexAttrib2dNV == NULL && sf_glad_glVertexAttrib2d != NULL) sf_glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)sf_glad_glVertexAttrib2d;
+ if (sf_glad_glVertexAttrib2dNV == NULL && sf_glad_glVertexAttrib2dARB != NULL) sf_glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)sf_glad_glVertexAttrib2dARB;
+ if (sf_glad_glVertexAttrib2dv == NULL && sf_glad_glVertexAttrib2dvARB != NULL) sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)sf_glad_glVertexAttrib2dvARB;
+ if (sf_glad_glVertexAttrib2dv == NULL && sf_glad_glVertexAttrib2dvNV != NULL) sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)sf_glad_glVertexAttrib2dvNV;
+ if (sf_glad_glVertexAttrib2dvARB == NULL && sf_glad_glVertexAttrib2dv != NULL) sf_glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)sf_glad_glVertexAttrib2dv;
+ if (sf_glad_glVertexAttrib2dvARB == NULL && sf_glad_glVertexAttrib2dvNV != NULL) sf_glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)sf_glad_glVertexAttrib2dvNV;
+ if (sf_glad_glVertexAttrib2dvNV == NULL && sf_glad_glVertexAttrib2dv != NULL) sf_glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)sf_glad_glVertexAttrib2dv;
+ if (sf_glad_glVertexAttrib2dvNV == NULL && sf_glad_glVertexAttrib2dvARB != NULL) sf_glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)sf_glad_glVertexAttrib2dvARB;
+ if (sf_glad_glVertexAttrib2f == NULL && sf_glad_glVertexAttrib2fARB != NULL) sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)sf_glad_glVertexAttrib2fARB;
+ if (sf_glad_glVertexAttrib2f == NULL && sf_glad_glVertexAttrib2fNV != NULL) sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)sf_glad_glVertexAttrib2fNV;
+ if (sf_glad_glVertexAttrib2fARB == NULL && sf_glad_glVertexAttrib2f != NULL) sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)sf_glad_glVertexAttrib2f;
+ if (sf_glad_glVertexAttrib2fARB == NULL && sf_glad_glVertexAttrib2fNV != NULL) sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)sf_glad_glVertexAttrib2fNV;
+ if (sf_glad_glVertexAttrib2fNV == NULL && sf_glad_glVertexAttrib2f != NULL) sf_glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)sf_glad_glVertexAttrib2f;
+ if (sf_glad_glVertexAttrib2fNV == NULL && sf_glad_glVertexAttrib2fARB != NULL) sf_glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)sf_glad_glVertexAttrib2fARB;
+ if (sf_glad_glVertexAttrib2fv == NULL && sf_glad_glVertexAttrib2fvARB != NULL) sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)sf_glad_glVertexAttrib2fvARB;
+ if (sf_glad_glVertexAttrib2fv == NULL && sf_glad_glVertexAttrib2fvNV != NULL) sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)sf_glad_glVertexAttrib2fvNV;
+ if (sf_glad_glVertexAttrib2fvARB == NULL && sf_glad_glVertexAttrib2fv != NULL) sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)sf_glad_glVertexAttrib2fv;
+ if (sf_glad_glVertexAttrib2fvARB == NULL && sf_glad_glVertexAttrib2fvNV != NULL) sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)sf_glad_glVertexAttrib2fvNV;
+ if (sf_glad_glVertexAttrib2fvNV == NULL && sf_glad_glVertexAttrib2fv != NULL) sf_glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)sf_glad_glVertexAttrib2fv;
+ if (sf_glad_glVertexAttrib2fvNV == NULL && sf_glad_glVertexAttrib2fvARB != NULL) sf_glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)sf_glad_glVertexAttrib2fvARB;
+ if (sf_glad_glVertexAttrib2s == NULL && sf_glad_glVertexAttrib2sARB != NULL) sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)sf_glad_glVertexAttrib2sARB;
+ if (sf_glad_glVertexAttrib2s == NULL && sf_glad_glVertexAttrib2sNV != NULL) sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)sf_glad_glVertexAttrib2sNV;
+ if (sf_glad_glVertexAttrib2sARB == NULL && sf_glad_glVertexAttrib2s != NULL) sf_glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)sf_glad_glVertexAttrib2s;
+ if (sf_glad_glVertexAttrib2sARB == NULL && sf_glad_glVertexAttrib2sNV != NULL) sf_glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)sf_glad_glVertexAttrib2sNV;
+ if (sf_glad_glVertexAttrib2sNV == NULL && sf_glad_glVertexAttrib2s != NULL) sf_glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)sf_glad_glVertexAttrib2s;
+ if (sf_glad_glVertexAttrib2sNV == NULL && sf_glad_glVertexAttrib2sARB != NULL) sf_glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)sf_glad_glVertexAttrib2sARB;
+ if (sf_glad_glVertexAttrib2sv == NULL && sf_glad_glVertexAttrib2svARB != NULL) sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)sf_glad_glVertexAttrib2svARB;
+ if (sf_glad_glVertexAttrib2sv == NULL && sf_glad_glVertexAttrib2svNV != NULL) sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)sf_glad_glVertexAttrib2svNV;
+ if (sf_glad_glVertexAttrib2svARB == NULL && sf_glad_glVertexAttrib2sv != NULL) sf_glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)sf_glad_glVertexAttrib2sv;
+ if (sf_glad_glVertexAttrib2svARB == NULL && sf_glad_glVertexAttrib2svNV != NULL) sf_glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)sf_glad_glVertexAttrib2svNV;
+ if (sf_glad_glVertexAttrib2svNV == NULL && sf_glad_glVertexAttrib2sv != NULL) sf_glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)sf_glad_glVertexAttrib2sv;
+ if (sf_glad_glVertexAttrib2svNV == NULL && sf_glad_glVertexAttrib2svARB != NULL) sf_glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)sf_glad_glVertexAttrib2svARB;
+ if (sf_glad_glVertexAttrib3d == NULL && sf_glad_glVertexAttrib3dARB != NULL) sf_glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)sf_glad_glVertexAttrib3dARB;
+ if (sf_glad_glVertexAttrib3d == NULL && sf_glad_glVertexAttrib3dNV != NULL) sf_glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)sf_glad_glVertexAttrib3dNV;
+ if (sf_glad_glVertexAttrib3dARB == NULL && sf_glad_glVertexAttrib3d != NULL) sf_glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)sf_glad_glVertexAttrib3d;
+ if (sf_glad_glVertexAttrib3dARB == NULL && sf_glad_glVertexAttrib3dNV != NULL) sf_glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)sf_glad_glVertexAttrib3dNV;
+ if (sf_glad_glVertexAttrib3dNV == NULL && sf_glad_glVertexAttrib3d != NULL) sf_glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)sf_glad_glVertexAttrib3d;
+ if (sf_glad_glVertexAttrib3dNV == NULL && sf_glad_glVertexAttrib3dARB != NULL) sf_glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)sf_glad_glVertexAttrib3dARB;
+ if (sf_glad_glVertexAttrib3dv == NULL && sf_glad_glVertexAttrib3dvARB != NULL) sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)sf_glad_glVertexAttrib3dvARB;
+ if (sf_glad_glVertexAttrib3dv == NULL && sf_glad_glVertexAttrib3dvNV != NULL) sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)sf_glad_glVertexAttrib3dvNV;
+ if (sf_glad_glVertexAttrib3dvARB == NULL && sf_glad_glVertexAttrib3dv != NULL) sf_glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)sf_glad_glVertexAttrib3dv;
+ if (sf_glad_glVertexAttrib3dvARB == NULL && sf_glad_glVertexAttrib3dvNV != NULL) sf_glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)sf_glad_glVertexAttrib3dvNV;
+ if (sf_glad_glVertexAttrib3dvNV == NULL && sf_glad_glVertexAttrib3dv != NULL) sf_glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)sf_glad_glVertexAttrib3dv;
+ if (sf_glad_glVertexAttrib3dvNV == NULL && sf_glad_glVertexAttrib3dvARB != NULL) sf_glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)sf_glad_glVertexAttrib3dvARB;
+ if (sf_glad_glVertexAttrib3f == NULL && sf_glad_glVertexAttrib3fARB != NULL) sf_glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)sf_glad_glVertexAttrib3fARB;
+ if (sf_glad_glVertexAttrib3f == NULL && sf_glad_glVertexAttrib3fNV != NULL) sf_glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)sf_glad_glVertexAttrib3fNV;
+ if (sf_glad_glVertexAttrib3fARB == NULL && sf_glad_glVertexAttrib3f != NULL) sf_glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)sf_glad_glVertexAttrib3f;
+ if (sf_glad_glVertexAttrib3fARB == NULL && sf_glad_glVertexAttrib3fNV != NULL) sf_glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)sf_glad_glVertexAttrib3fNV;
+ if (sf_glad_glVertexAttrib3fNV == NULL && sf_glad_glVertexAttrib3f != NULL) sf_glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)sf_glad_glVertexAttrib3f;
+ if (sf_glad_glVertexAttrib3fNV == NULL && sf_glad_glVertexAttrib3fARB != NULL) sf_glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)sf_glad_glVertexAttrib3fARB;
+ if (sf_glad_glVertexAttrib3fv == NULL && sf_glad_glVertexAttrib3fvARB != NULL) sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)sf_glad_glVertexAttrib3fvARB;
+ if (sf_glad_glVertexAttrib3fv == NULL && sf_glad_glVertexAttrib3fvNV != NULL) sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)sf_glad_glVertexAttrib3fvNV;
+ if (sf_glad_glVertexAttrib3fvARB == NULL && sf_glad_glVertexAttrib3fv != NULL) sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)sf_glad_glVertexAttrib3fv;
+ if (sf_glad_glVertexAttrib3fvARB == NULL && sf_glad_glVertexAttrib3fvNV != NULL) sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)sf_glad_glVertexAttrib3fvNV;
+ if (sf_glad_glVertexAttrib3fvNV == NULL && sf_glad_glVertexAttrib3fv != NULL) sf_glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)sf_glad_glVertexAttrib3fv;
+ if (sf_glad_glVertexAttrib3fvNV == NULL && sf_glad_glVertexAttrib3fvARB != NULL) sf_glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)sf_glad_glVertexAttrib3fvARB;
+ if (sf_glad_glVertexAttrib3s == NULL && sf_glad_glVertexAttrib3sARB != NULL) sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)sf_glad_glVertexAttrib3sARB;
+ if (sf_glad_glVertexAttrib3s == NULL && sf_glad_glVertexAttrib3sNV != NULL) sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)sf_glad_glVertexAttrib3sNV;
+ if (sf_glad_glVertexAttrib3sARB == NULL && sf_glad_glVertexAttrib3s != NULL) sf_glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)sf_glad_glVertexAttrib3s;
+ if (sf_glad_glVertexAttrib3sARB == NULL && sf_glad_glVertexAttrib3sNV != NULL) sf_glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)sf_glad_glVertexAttrib3sNV;
+ if (sf_glad_glVertexAttrib3sNV == NULL && sf_glad_glVertexAttrib3s != NULL) sf_glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)sf_glad_glVertexAttrib3s;
+ if (sf_glad_glVertexAttrib3sNV == NULL && sf_glad_glVertexAttrib3sARB != NULL) sf_glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)sf_glad_glVertexAttrib3sARB;
+ if (sf_glad_glVertexAttrib3sv == NULL && sf_glad_glVertexAttrib3svARB != NULL) sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)sf_glad_glVertexAttrib3svARB;
+ if (sf_glad_glVertexAttrib3sv == NULL && sf_glad_glVertexAttrib3svNV != NULL) sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)sf_glad_glVertexAttrib3svNV;
+ if (sf_glad_glVertexAttrib3svARB == NULL && sf_glad_glVertexAttrib3sv != NULL) sf_glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)sf_glad_glVertexAttrib3sv;
+ if (sf_glad_glVertexAttrib3svARB == NULL && sf_glad_glVertexAttrib3svNV != NULL) sf_glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)sf_glad_glVertexAttrib3svNV;
+ if (sf_glad_glVertexAttrib3svNV == NULL && sf_glad_glVertexAttrib3sv != NULL) sf_glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)sf_glad_glVertexAttrib3sv;
+ if (sf_glad_glVertexAttrib3svNV == NULL && sf_glad_glVertexAttrib3svARB != NULL) sf_glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)sf_glad_glVertexAttrib3svARB;
+ if (sf_glad_glVertexAttrib4bv == NULL && sf_glad_glVertexAttrib4bvARB != NULL) sf_glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)sf_glad_glVertexAttrib4bvARB;
+ if (sf_glad_glVertexAttrib4bvARB == NULL && sf_glad_glVertexAttrib4bv != NULL) sf_glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)sf_glad_glVertexAttrib4bv;
+ if (sf_glad_glVertexAttrib4d == NULL && sf_glad_glVertexAttrib4dARB != NULL) sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)sf_glad_glVertexAttrib4dARB;
+ if (sf_glad_glVertexAttrib4d == NULL && sf_glad_glVertexAttrib4dNV != NULL) sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)sf_glad_glVertexAttrib4dNV;
+ if (sf_glad_glVertexAttrib4dARB == NULL && sf_glad_glVertexAttrib4d != NULL) sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)sf_glad_glVertexAttrib4d;
+ if (sf_glad_glVertexAttrib4dARB == NULL && sf_glad_glVertexAttrib4dNV != NULL) sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)sf_glad_glVertexAttrib4dNV;
+ if (sf_glad_glVertexAttrib4dNV == NULL && sf_glad_glVertexAttrib4d != NULL) sf_glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)sf_glad_glVertexAttrib4d;
+ if (sf_glad_glVertexAttrib4dNV == NULL && sf_glad_glVertexAttrib4dARB != NULL) sf_glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)sf_glad_glVertexAttrib4dARB;
+ if (sf_glad_glVertexAttrib4dv == NULL && sf_glad_glVertexAttrib4dvARB != NULL) sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)sf_glad_glVertexAttrib4dvARB;
+ if (sf_glad_glVertexAttrib4dv == NULL && sf_glad_glVertexAttrib4dvNV != NULL) sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)sf_glad_glVertexAttrib4dvNV;
+ if (sf_glad_glVertexAttrib4dvARB == NULL && sf_glad_glVertexAttrib4dv != NULL) sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)sf_glad_glVertexAttrib4dv;
+ if (sf_glad_glVertexAttrib4dvARB == NULL && sf_glad_glVertexAttrib4dvNV != NULL) sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)sf_glad_glVertexAttrib4dvNV;
+ if (sf_glad_glVertexAttrib4dvNV == NULL && sf_glad_glVertexAttrib4dv != NULL) sf_glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)sf_glad_glVertexAttrib4dv;
+ if (sf_glad_glVertexAttrib4dvNV == NULL && sf_glad_glVertexAttrib4dvARB != NULL) sf_glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)sf_glad_glVertexAttrib4dvARB;
+ if (sf_glad_glVertexAttrib4f == NULL && sf_glad_glVertexAttrib4fARB != NULL) sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)sf_glad_glVertexAttrib4fARB;
+ if (sf_glad_glVertexAttrib4f == NULL && sf_glad_glVertexAttrib4fNV != NULL) sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)sf_glad_glVertexAttrib4fNV;
+ if (sf_glad_glVertexAttrib4fARB == NULL && sf_glad_glVertexAttrib4f != NULL) sf_glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)sf_glad_glVertexAttrib4f;
+ if (sf_glad_glVertexAttrib4fARB == NULL && sf_glad_glVertexAttrib4fNV != NULL) sf_glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)sf_glad_glVertexAttrib4fNV;
+ if (sf_glad_glVertexAttrib4fNV == NULL && sf_glad_glVertexAttrib4f != NULL) sf_glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)sf_glad_glVertexAttrib4f;
+ if (sf_glad_glVertexAttrib4fNV == NULL && sf_glad_glVertexAttrib4fARB != NULL) sf_glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)sf_glad_glVertexAttrib4fARB;
+ if (sf_glad_glVertexAttrib4fv == NULL && sf_glad_glVertexAttrib4fvARB != NULL) sf_glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)sf_glad_glVertexAttrib4fvARB;
+ if (sf_glad_glVertexAttrib4fv == NULL && sf_glad_glVertexAttrib4fvNV != NULL) sf_glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)sf_glad_glVertexAttrib4fvNV;
+ if (sf_glad_glVertexAttrib4fvARB == NULL && sf_glad_glVertexAttrib4fv != NULL) sf_glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)sf_glad_glVertexAttrib4fv;
+ if (sf_glad_glVertexAttrib4fvARB == NULL && sf_glad_glVertexAttrib4fvNV != NULL) sf_glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)sf_glad_glVertexAttrib4fvNV;
+ if (sf_glad_glVertexAttrib4fvNV == NULL && sf_glad_glVertexAttrib4fv != NULL) sf_glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)sf_glad_glVertexAttrib4fv;
+ if (sf_glad_glVertexAttrib4fvNV == NULL && sf_glad_glVertexAttrib4fvARB != NULL) sf_glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)sf_glad_glVertexAttrib4fvARB;
+ if (sf_glad_glVertexAttrib4iv == NULL && sf_glad_glVertexAttrib4ivARB != NULL) sf_glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)sf_glad_glVertexAttrib4ivARB;
+ if (sf_glad_glVertexAttrib4ivARB == NULL && sf_glad_glVertexAttrib4iv != NULL) sf_glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)sf_glad_glVertexAttrib4iv;
+ if (sf_glad_glVertexAttrib4Nbv == NULL && sf_glad_glVertexAttrib4NbvARB != NULL) sf_glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)sf_glad_glVertexAttrib4NbvARB;
+ if (sf_glad_glVertexAttrib4NbvARB == NULL && sf_glad_glVertexAttrib4Nbv != NULL) sf_glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)sf_glad_glVertexAttrib4Nbv;
+ if (sf_glad_glVertexAttrib4Niv == NULL && sf_glad_glVertexAttrib4NivARB != NULL) sf_glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)sf_glad_glVertexAttrib4NivARB;
+ if (sf_glad_glVertexAttrib4NivARB == NULL && sf_glad_glVertexAttrib4Niv != NULL) sf_glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)sf_glad_glVertexAttrib4Niv;
+ if (sf_glad_glVertexAttrib4Nsv == NULL && sf_glad_glVertexAttrib4NsvARB != NULL) sf_glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)sf_glad_glVertexAttrib4NsvARB;
+ if (sf_glad_glVertexAttrib4NsvARB == NULL && sf_glad_glVertexAttrib4Nsv != NULL) sf_glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)sf_glad_glVertexAttrib4Nsv;
+ if (sf_glad_glVertexAttrib4Nub == NULL && sf_glad_glVertexAttrib4NubARB != NULL) sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)sf_glad_glVertexAttrib4NubARB;
+ if (sf_glad_glVertexAttrib4Nub == NULL && sf_glad_glVertexAttrib4ubNV != NULL) sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)sf_glad_glVertexAttrib4ubNV;
+ if (sf_glad_glVertexAttrib4NubARB == NULL && sf_glad_glVertexAttrib4Nub != NULL) sf_glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)sf_glad_glVertexAttrib4Nub;
+ if (sf_glad_glVertexAttrib4NubARB == NULL && sf_glad_glVertexAttrib4ubNV != NULL) sf_glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)sf_glad_glVertexAttrib4ubNV;
+ if (sf_glad_glVertexAttrib4Nubv == NULL && sf_glad_glVertexAttrib4NubvARB != NULL) sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)sf_glad_glVertexAttrib4NubvARB;
+ if (sf_glad_glVertexAttrib4Nubv == NULL && sf_glad_glVertexAttrib4ubvNV != NULL) sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)sf_glad_glVertexAttrib4ubvNV;
+ if (sf_glad_glVertexAttrib4NubvARB == NULL && sf_glad_glVertexAttrib4Nubv != NULL) sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)sf_glad_glVertexAttrib4Nubv;
+ if (sf_glad_glVertexAttrib4NubvARB == NULL && sf_glad_glVertexAttrib4ubvNV != NULL) sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)sf_glad_glVertexAttrib4ubvNV;
+ if (sf_glad_glVertexAttrib4Nuiv == NULL && sf_glad_glVertexAttrib4NuivARB != NULL) sf_glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)sf_glad_glVertexAttrib4NuivARB;
+ if (sf_glad_glVertexAttrib4NuivARB == NULL && sf_glad_glVertexAttrib4Nuiv != NULL) sf_glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)sf_glad_glVertexAttrib4Nuiv;
+ if (sf_glad_glVertexAttrib4Nusv == NULL && sf_glad_glVertexAttrib4NusvARB != NULL) sf_glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)sf_glad_glVertexAttrib4NusvARB;
+ if (sf_glad_glVertexAttrib4NusvARB == NULL && sf_glad_glVertexAttrib4Nusv != NULL) sf_glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)sf_glad_glVertexAttrib4Nusv;
+ if (sf_glad_glVertexAttrib4s == NULL && sf_glad_glVertexAttrib4sARB != NULL) sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)sf_glad_glVertexAttrib4sARB;
+ if (sf_glad_glVertexAttrib4s == NULL && sf_glad_glVertexAttrib4sNV != NULL) sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)sf_glad_glVertexAttrib4sNV;
+ if (sf_glad_glVertexAttrib4sARB == NULL && sf_glad_glVertexAttrib4s != NULL) sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)sf_glad_glVertexAttrib4s;
+ if (sf_glad_glVertexAttrib4sARB == NULL && sf_glad_glVertexAttrib4sNV != NULL) sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)sf_glad_glVertexAttrib4sNV;
+ if (sf_glad_glVertexAttrib4sNV == NULL && sf_glad_glVertexAttrib4s != NULL) sf_glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)sf_glad_glVertexAttrib4s;
+ if (sf_glad_glVertexAttrib4sNV == NULL && sf_glad_glVertexAttrib4sARB != NULL) sf_glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)sf_glad_glVertexAttrib4sARB;
+ if (sf_glad_glVertexAttrib4sv == NULL && sf_glad_glVertexAttrib4svARB != NULL) sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)sf_glad_glVertexAttrib4svARB;
+ if (sf_glad_glVertexAttrib4sv == NULL && sf_glad_glVertexAttrib4svNV != NULL) sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)sf_glad_glVertexAttrib4svNV;
+ if (sf_glad_glVertexAttrib4svARB == NULL && sf_glad_glVertexAttrib4sv != NULL) sf_glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)sf_glad_glVertexAttrib4sv;
+ if (sf_glad_glVertexAttrib4svARB == NULL && sf_glad_glVertexAttrib4svNV != NULL) sf_glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)sf_glad_glVertexAttrib4svNV;
+ if (sf_glad_glVertexAttrib4svNV == NULL && sf_glad_glVertexAttrib4sv != NULL) sf_glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)sf_glad_glVertexAttrib4sv;
+ if (sf_glad_glVertexAttrib4svNV == NULL && sf_glad_glVertexAttrib4svARB != NULL) sf_glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)sf_glad_glVertexAttrib4svARB;
+ if (sf_glad_glVertexAttrib4ubNV == NULL && sf_glad_glVertexAttrib4Nub != NULL) sf_glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)sf_glad_glVertexAttrib4Nub;
+ if (sf_glad_glVertexAttrib4ubNV == NULL && sf_glad_glVertexAttrib4NubARB != NULL) sf_glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)sf_glad_glVertexAttrib4NubARB;
+ if (sf_glad_glVertexAttrib4ubv == NULL && sf_glad_glVertexAttrib4ubvARB != NULL) sf_glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)sf_glad_glVertexAttrib4ubvARB;
+ if (sf_glad_glVertexAttrib4ubvARB == NULL && sf_glad_glVertexAttrib4ubv != NULL) sf_glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)sf_glad_glVertexAttrib4ubv;
+ if (sf_glad_glVertexAttrib4ubvNV == NULL && sf_glad_glVertexAttrib4Nubv != NULL) sf_glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)sf_glad_glVertexAttrib4Nubv;
+ if (sf_glad_glVertexAttrib4ubvNV == NULL && sf_glad_glVertexAttrib4NubvARB != NULL) sf_glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)sf_glad_glVertexAttrib4NubvARB;
+ if (sf_glad_glVertexAttrib4uiv == NULL && sf_glad_glVertexAttrib4uivARB != NULL) sf_glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)sf_glad_glVertexAttrib4uivARB;
+ if (sf_glad_glVertexAttrib4uivARB == NULL && sf_glad_glVertexAttrib4uiv != NULL) sf_glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)sf_glad_glVertexAttrib4uiv;
+ if (sf_glad_glVertexAttrib4usv == NULL && sf_glad_glVertexAttrib4usvARB != NULL) sf_glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)sf_glad_glVertexAttrib4usvARB;
+ if (sf_glad_glVertexAttrib4usvARB == NULL && sf_glad_glVertexAttrib4usv != NULL) sf_glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)sf_glad_glVertexAttrib4usv;
+ if (sf_glad_glVertexAttribPointer == NULL && sf_glad_glVertexAttribPointerARB != NULL) sf_glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)sf_glad_glVertexAttribPointerARB;
+ if (sf_glad_glVertexAttribPointerARB == NULL && sf_glad_glVertexAttribPointer != NULL) sf_glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)sf_glad_glVertexAttribPointer;
+}
+
+#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0)
+#define SF_GLAD_GL_IS_SOME_NEW_VERSION 1
+#else
+#define SF_GLAD_GL_IS_SOME_NEW_VERSION 0
+#endif
+
+static int sf_glad_gl_get_extensions( int version, const char **out_exts, unsigned int *out_num_exts_i, char ***out_exts_i) {
+#if SF_GLAD_GL_IS_SOME_NEW_VERSION
+ if(GLAD_VERSION_MAJOR(version) < 3) {
+#else
+ (void) version;
+ (void) out_num_exts_i;
+ (void) out_exts_i;
+#endif
+ if (sf_glad_glGetString == NULL) {
+ return 0;
+ }
+ *out_exts = (const char *)sf_glad_glGetString(GL_EXTENSIONS);
+#if SF_GLAD_GL_IS_SOME_NEW_VERSION
+ } else {
+ unsigned int index = 0;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (sf_glad_glGetStringi == NULL || sf_glad_glGetIntegerv == NULL) {
+ return 0;
+ }
+ sf_glad_glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i);
+ if (num_exts_i > 0) {
+ exts_i = (char **) malloc(num_exts_i * (sizeof *exts_i));
+ }
+ if (exts_i == NULL) {
+ return 0;
+ }
+ for(index = 0; index < num_exts_i; index++) {
+ const char *gl_str_tmp = (const char*) sf_glad_glGetStringi(GL_EXTENSIONS, index);
+ size_t len = strlen(gl_str_tmp) + 1;
+
+ char *local_str = (char*) malloc(len * sizeof(char));
+ if(local_str != NULL) {
+ memcpy(local_str, gl_str_tmp, len * sizeof(char));
+ }
+
+ exts_i[index] = local_str;
+ }
+
+ *out_num_exts_i = num_exts_i;
+ *out_exts_i = exts_i;
+ }
+#endif
+ return 1;
+}
+static void sf_glad_gl_free_extensions(char **exts_i, unsigned int num_exts_i) {
+ if (exts_i != NULL) {
+ unsigned int index;
+ for(index = 0; index < num_exts_i; index++) {
+ free((void *) (exts_i[index]));
+ }
+ free((void *)exts_i);
+ exts_i = NULL;
+ }
+}
+static int sf_glad_gl_has_extension(int version, const char *exts, unsigned int num_exts_i, char **exts_i, const char *ext) {
+ if(GLAD_VERSION_MAJOR(version) < 3 || !SF_GLAD_GL_IS_SOME_NEW_VERSION) {
+ const char *extensions;
+ const char *loc;
+ const char *terminator;
+ extensions = exts;
+ if(extensions == NULL || ext == NULL) {
+ return 0;
+ }
+ while(1) {
+ loc = strstr(extensions, ext);
+ if(loc == NULL) {
+ return 0;
+ }
+ terminator = loc + strlen(ext);
+ if((loc == extensions || *(loc - 1) == ' ') &&
+ (*terminator == ' ' || *terminator == '\0')) {
+ return 1;
+ }
+ extensions = terminator;
+ }
+ } else {
+ unsigned int index;
+ for(index = 0; index < num_exts_i; index++) {
+ const char *e = exts_i[index];
+ if(strcmp(e, ext) == 0) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+static GLADapiproc sf_glad_gl_get_proc_from_userptr(void *userptr, const char* name) {
+ return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);
+}
+
+static int sf_glad_gl_find_extensions_gl( int version) {
+ const char *exts = NULL;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (!sf_glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0;
+
+ SF_GLAD_GL_ARB_ES2_compatibility = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_ES2_compatibility");
+ SF_GLAD_GL_ARB_ES3_1_compatibility = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_ES3_1_compatibility");
+ SF_GLAD_GL_ARB_base_instance = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_base_instance");
+ SF_GLAD_GL_ARB_blend_func_extended = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_blend_func_extended");
+ SF_GLAD_GL_ARB_buffer_storage = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_buffer_storage");
+ SF_GLAD_GL_ARB_clear_buffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_clear_buffer_object");
+ SF_GLAD_GL_ARB_clear_texture = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_clear_texture");
+ SF_GLAD_GL_ARB_clip_control = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_clip_control");
+ SF_GLAD_GL_ARB_compute_shader = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_compute_shader");
+ SF_GLAD_GL_ARB_copy_buffer = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_copy_buffer");
+ SF_GLAD_GL_ARB_copy_image = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_copy_image");
+ SF_GLAD_GL_ARB_direct_state_access = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_direct_state_access");
+ SF_GLAD_GL_ARB_draw_elements_base_vertex = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_draw_elements_base_vertex");
+ SF_GLAD_GL_ARB_draw_indirect = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_draw_indirect");
+ SF_GLAD_GL_ARB_fragment_program = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_fragment_program");
+ SF_GLAD_GL_ARB_fragment_shader = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_fragment_shader");
+ SF_GLAD_GL_ARB_framebuffer_no_attachments = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_framebuffer_no_attachments");
+ SF_GLAD_GL_ARB_framebuffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_framebuffer_object");
+ SF_GLAD_GL_ARB_geometry_shader4 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_geometry_shader4");
+ SF_GLAD_GL_ARB_get_program_binary = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_get_program_binary");
+ SF_GLAD_GL_ARB_get_texture_sub_image = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_get_texture_sub_image");
+ SF_GLAD_GL_ARB_gpu_shader_fp64 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_gpu_shader_fp64");
+ SF_GLAD_GL_ARB_imaging = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_imaging");
+ SF_GLAD_GL_ARB_internalformat_query = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_internalformat_query");
+ SF_GLAD_GL_ARB_internalformat_query2 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_internalformat_query2");
+ SF_GLAD_GL_ARB_invalidate_subdata = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_invalidate_subdata");
+ SF_GLAD_GL_ARB_map_buffer_range = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_map_buffer_range");
+ SF_GLAD_GL_ARB_multi_bind = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_multi_bind");
+ SF_GLAD_GL_ARB_multi_draw_indirect = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_multi_draw_indirect");
+ SF_GLAD_GL_ARB_multitexture = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_multitexture");
+ SF_GLAD_GL_ARB_polygon_offset_clamp = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_polygon_offset_clamp");
+ SF_GLAD_GL_ARB_program_interface_query = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_program_interface_query");
+ SF_GLAD_GL_ARB_provoking_vertex = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_provoking_vertex");
+ SF_GLAD_GL_ARB_sampler_objects = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_sampler_objects");
+ SF_GLAD_GL_ARB_separate_shader_objects = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_separate_shader_objects");
+ SF_GLAD_GL_ARB_shader_atomic_counters = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_atomic_counters");
+ SF_GLAD_GL_ARB_shader_image_load_store = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_image_load_store");
+ SF_GLAD_GL_ARB_shader_objects = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_objects");
+ SF_GLAD_GL_ARB_shader_storage_buffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_storage_buffer_object");
+ SF_GLAD_GL_ARB_shader_subroutine = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_subroutine");
+ SF_GLAD_GL_ARB_shading_language_100 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shading_language_100");
+ SF_GLAD_GL_ARB_sync = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_sync");
+ SF_GLAD_GL_ARB_tessellation_shader = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_tessellation_shader");
+ SF_GLAD_GL_ARB_texture_barrier = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_barrier");
+ SF_GLAD_GL_ARB_texture_buffer_range = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_buffer_range");
+ SF_GLAD_GL_ARB_texture_multisample = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_multisample");
+ SF_GLAD_GL_ARB_texture_non_power_of_two = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_non_power_of_two");
+ SF_GLAD_GL_ARB_texture_storage = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_storage");
+ SF_GLAD_GL_ARB_texture_storage_multisample = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_storage_multisample");
+ SF_GLAD_GL_ARB_texture_view = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_view");
+ SF_GLAD_GL_ARB_timer_query = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_timer_query");
+ SF_GLAD_GL_ARB_transform_feedback2 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_transform_feedback2");
+ SF_GLAD_GL_ARB_transform_feedback3 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_transform_feedback3");
+ SF_GLAD_GL_ARB_transform_feedback_instanced = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_transform_feedback_instanced");
+ SF_GLAD_GL_ARB_uniform_buffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_uniform_buffer_object");
+ SF_GLAD_GL_ARB_vertex_array_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_array_object");
+ SF_GLAD_GL_ARB_vertex_attrib_64bit = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_attrib_64bit");
+ SF_GLAD_GL_ARB_vertex_attrib_binding = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_attrib_binding");
+ SF_GLAD_GL_ARB_vertex_buffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_buffer_object");
+ SF_GLAD_GL_ARB_vertex_program = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_program");
+ SF_GLAD_GL_ARB_vertex_shader = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_shader");
+ SF_GLAD_GL_ARB_vertex_type_2_10_10_10_rev = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_type_2_10_10_10_rev");
+ SF_GLAD_GL_ARB_viewport_array = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_viewport_array");
+ SF_GLAD_GL_EXT_blend_equation_separate = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_equation_separate");
+ SF_GLAD_GL_EXT_blend_func_separate = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_func_separate");
+ SF_GLAD_GL_EXT_blend_minmax = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_minmax");
+ SF_GLAD_GL_EXT_blend_subtract = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_subtract");
+ SF_GLAD_GL_EXT_copy_texture = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_copy_texture");
+ SF_GLAD_GL_EXT_framebuffer_blit = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_blit");
+ SF_GLAD_GL_EXT_framebuffer_multisample = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_multisample");
+ SF_GLAD_GL_EXT_framebuffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_object");
+ SF_GLAD_GL_EXT_geometry_shader4 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_geometry_shader4");
+ SF_GLAD_GL_EXT_packed_depth_stencil = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_packed_depth_stencil");
+ SF_GLAD_GL_EXT_subtexture = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_subtexture");
+ SF_GLAD_GL_EXT_texture_array = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_array");
+ SF_GLAD_GL_EXT_texture_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_object");
+ SF_GLAD_GL_EXT_texture_sRGB = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_sRGB");
+ SF_GLAD_GL_EXT_vertex_array = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_vertex_array");
+ SF_GLAD_GL_INGR_blend_func_separate = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_INGR_blend_func_separate");
+ SF_GLAD_GL_KHR_debug = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_debug");
+ SF_GLAD_GL_KHR_robustness = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_robustness");
+ SF_GLAD_GL_NV_geometry_program4 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_NV_geometry_program4");
+ SF_GLAD_GL_NV_vertex_program = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_NV_vertex_program");
+ SF_GLAD_GL_OES_single_precision = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision");
+ SF_GLAD_GL_SGIS_texture_edge_clamp = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_SGIS_texture_edge_clamp");
+
+ sf_glad_gl_free_extensions(exts_i, num_exts_i);
+
+ return 1;
+}
+
+static int sf_glad_gl_find_core_gl(void) {
+ int i, major, minor;
+ const char* version;
+ const char* prefixes[] = {
+ "OpenGL ES-CM ",
+ "OpenGL ES-CL ",
+ "OpenGL ES ",
+ NULL
+ };
+ version = (const char*) sf_glad_glGetString(GL_VERSION);
+ if (!version) return 0;
+ for (i = 0; prefixes[i]; i++) {
+ const size_t length = strlen(prefixes[i]);
+ if (strncmp(version, prefixes[i], length) == 0) {
+ version += length;
+ break;
+ }
+ }
+
+ GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor);
+
+ SF_GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
+ SF_GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;
+ SF_GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1;
+ SF_GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1;
+ SF_GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1;
+ SF_GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1;
+ SF_GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2;
+ SF_GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2;
+ SF_GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3;
+ SF_GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3;
+ SF_GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3;
+ SF_GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3;
+ SF_GLAD_GL_VERSION_4_0 = (major == 4 && minor >= 0) || major > 4;
+ SF_GLAD_GL_VERSION_4_1 = (major == 4 && minor >= 1) || major > 4;
+ SF_GLAD_GL_VERSION_4_2 = (major == 4 && minor >= 2) || major > 4;
+ SF_GLAD_GL_VERSION_4_3 = (major == 4 && minor >= 3) || major > 4;
+ SF_GLAD_GL_VERSION_4_4 = (major == 4 && minor >= 4) || major > 4;
+ SF_GLAD_GL_VERSION_4_5 = (major == 4 && minor >= 5) || major > 4;
+ SF_GLAD_GL_VERSION_4_6 = (major == 4 && minor >= 6) || major > 4;
+
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+static int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) {
+ int version;
+
+ sf_glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ if(sf_glad_glGetString == NULL) return 0;
+ if(sf_glad_glGetString(GL_VERSION) == NULL) return 0;
+ version = sf_glad_gl_find_core_gl();
+
+ sf_glad_gl_load_GL_VERSION_1_0(load, userptr);
+ sf_glad_gl_load_GL_VERSION_1_1(load, userptr);
+ sf_glad_gl_load_GL_VERSION_1_2(load, userptr);
+ sf_glad_gl_load_GL_VERSION_1_3(load, userptr);
+ sf_glad_gl_load_GL_VERSION_1_4(load, userptr);
+ sf_glad_gl_load_GL_VERSION_1_5(load, userptr);
+ sf_glad_gl_load_GL_VERSION_2_0(load, userptr);
+ sf_glad_gl_load_GL_VERSION_2_1(load, userptr);
+ sf_glad_gl_load_GL_VERSION_3_0(load, userptr);
+ sf_glad_gl_load_GL_VERSION_3_1(load, userptr);
+ sf_glad_gl_load_GL_VERSION_3_2(load, userptr);
+ sf_glad_gl_load_GL_VERSION_3_3(load, userptr);
+ sf_glad_gl_load_GL_VERSION_4_0(load, userptr);
+ sf_glad_gl_load_GL_VERSION_4_1(load, userptr);
+ sf_glad_gl_load_GL_VERSION_4_2(load, userptr);
+ sf_glad_gl_load_GL_VERSION_4_3(load, userptr);
+ sf_glad_gl_load_GL_VERSION_4_4(load, userptr);
+ sf_glad_gl_load_GL_VERSION_4_5(load, userptr);
+ sf_glad_gl_load_GL_VERSION_4_6(load, userptr);
+
+ if (!sf_glad_gl_find_extensions_gl(version)) return 0;
+ sf_glad_gl_load_GL_ARB_ES2_compatibility(load, userptr);
+ sf_glad_gl_load_GL_ARB_ES3_1_compatibility(load, userptr);
+ sf_glad_gl_load_GL_ARB_base_instance(load, userptr);
+ sf_glad_gl_load_GL_ARB_blend_func_extended(load, userptr);
+ sf_glad_gl_load_GL_ARB_buffer_storage(load, userptr);
+ sf_glad_gl_load_GL_ARB_clear_buffer_object(load, userptr);
+ sf_glad_gl_load_GL_ARB_clear_texture(load, userptr);
+ sf_glad_gl_load_GL_ARB_clip_control(load, userptr);
+ sf_glad_gl_load_GL_ARB_compute_shader(load, userptr);
+ sf_glad_gl_load_GL_ARB_copy_buffer(load, userptr);
+ sf_glad_gl_load_GL_ARB_copy_image(load, userptr);
+ sf_glad_gl_load_GL_ARB_direct_state_access(load, userptr);
+ sf_glad_gl_load_GL_ARB_draw_elements_base_vertex(load, userptr);
+ sf_glad_gl_load_GL_ARB_draw_indirect(load, userptr);
+ sf_glad_gl_load_GL_ARB_fragment_program(load, userptr);
+ sf_glad_gl_load_GL_ARB_framebuffer_no_attachments(load, userptr);
+ sf_glad_gl_load_GL_ARB_framebuffer_object(load, userptr);
+ sf_glad_gl_load_GL_ARB_geometry_shader4(load, userptr);
+ sf_glad_gl_load_GL_ARB_get_program_binary(load, userptr);
+ sf_glad_gl_load_GL_ARB_get_texture_sub_image(load, userptr);
+ sf_glad_gl_load_GL_ARB_gpu_shader_fp64(load, userptr);
+ sf_glad_gl_load_GL_ARB_imaging(load, userptr);
+ sf_glad_gl_load_GL_ARB_internalformat_query(load, userptr);
+ sf_glad_gl_load_GL_ARB_internalformat_query2(load, userptr);
+ sf_glad_gl_load_GL_ARB_invalidate_subdata(load, userptr);
+ sf_glad_gl_load_GL_ARB_map_buffer_range(load, userptr);
+ sf_glad_gl_load_GL_ARB_multi_bind(load, userptr);
+ sf_glad_gl_load_GL_ARB_multi_draw_indirect(load, userptr);
+ sf_glad_gl_load_GL_ARB_multitexture(load, userptr);
+ sf_glad_gl_load_GL_ARB_polygon_offset_clamp(load, userptr);
+ sf_glad_gl_load_GL_ARB_program_interface_query(load, userptr);
+ sf_glad_gl_load_GL_ARB_provoking_vertex(load, userptr);
+ sf_glad_gl_load_GL_ARB_sampler_objects(load, userptr);
+ sf_glad_gl_load_GL_ARB_separate_shader_objects(load, userptr);
+ sf_glad_gl_load_GL_ARB_shader_atomic_counters(load, userptr);
+ sf_glad_gl_load_GL_ARB_shader_image_load_store(load, userptr);
+ sf_glad_gl_load_GL_ARB_shader_objects(load, userptr);
+ sf_glad_gl_load_GL_ARB_shader_storage_buffer_object(load, userptr);
+ sf_glad_gl_load_GL_ARB_shader_subroutine(load, userptr);
+ sf_glad_gl_load_GL_ARB_sync(load, userptr);
+ sf_glad_gl_load_GL_ARB_tessellation_shader(load, userptr);
+ sf_glad_gl_load_GL_ARB_texture_barrier(load, userptr);
+ sf_glad_gl_load_GL_ARB_texture_buffer_range(load, userptr);
+ sf_glad_gl_load_GL_ARB_texture_multisample(load, userptr);
+ sf_glad_gl_load_GL_ARB_texture_storage(load, userptr);
+ sf_glad_gl_load_GL_ARB_texture_storage_multisample(load, userptr);
+ sf_glad_gl_load_GL_ARB_texture_view(load, userptr);
+ sf_glad_gl_load_GL_ARB_timer_query(load, userptr);
+ sf_glad_gl_load_GL_ARB_transform_feedback2(load, userptr);
+ sf_glad_gl_load_GL_ARB_transform_feedback3(load, userptr);
+ sf_glad_gl_load_GL_ARB_transform_feedback_instanced(load, userptr);
+ sf_glad_gl_load_GL_ARB_uniform_buffer_object(load, userptr);
+ sf_glad_gl_load_GL_ARB_vertex_array_object(load, userptr);
+ sf_glad_gl_load_GL_ARB_vertex_attrib_64bit(load, userptr);
+ sf_glad_gl_load_GL_ARB_vertex_attrib_binding(load, userptr);
+ sf_glad_gl_load_GL_ARB_vertex_buffer_object(load, userptr);
+ sf_glad_gl_load_GL_ARB_vertex_program(load, userptr);
+ sf_glad_gl_load_GL_ARB_vertex_shader(load, userptr);
+ sf_glad_gl_load_GL_ARB_vertex_type_2_10_10_10_rev(load, userptr);
+ sf_glad_gl_load_GL_ARB_viewport_array(load, userptr);
+ sf_glad_gl_load_GL_EXT_blend_equation_separate(load, userptr);
+ sf_glad_gl_load_GL_EXT_blend_func_separate(load, userptr);
+ sf_glad_gl_load_GL_EXT_blend_minmax(load, userptr);
+ sf_glad_gl_load_GL_EXT_copy_texture(load, userptr);
+ sf_glad_gl_load_GL_EXT_framebuffer_blit(load, userptr);
+ sf_glad_gl_load_GL_EXT_framebuffer_multisample(load, userptr);
+ sf_glad_gl_load_GL_EXT_framebuffer_object(load, userptr);
+ sf_glad_gl_load_GL_EXT_geometry_shader4(load, userptr);
+ sf_glad_gl_load_GL_EXT_subtexture(load, userptr);
+ sf_glad_gl_load_GL_EXT_texture_array(load, userptr);
+ sf_glad_gl_load_GL_EXT_texture_object(load, userptr);
+ sf_glad_gl_load_GL_EXT_vertex_array(load, userptr);
+ sf_glad_gl_load_GL_INGR_blend_func_separate(load, userptr);
+ sf_glad_gl_load_GL_KHR_debug(load, userptr);
+ sf_glad_gl_load_GL_KHR_robustness(load, userptr);
+ sf_glad_gl_load_GL_NV_geometry_program4(load, userptr);
+ sf_glad_gl_load_GL_NV_vertex_program(load, userptr);
+ sf_glad_gl_load_GL_OES_single_precision(load, userptr);
+
+
+ sf_glad_gl_resolve_aliases();
+
+ return version;
+}
+
+
+static int gladLoadGL( GLADloadfunc load) {
+ return gladLoadGLUserPtr( sf_glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+static int sf_glad_gl_find_extensions_gles1( int version) {
+ const char *exts = NULL;
+ unsigned int num_exts_i = 0;
+ char **exts_i = NULL;
+ if (!sf_glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0;
+
+ SF_GLAD_GL_EXT_blend_minmax = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_minmax");
+ SF_GLAD_GL_KHR_debug = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_debug");
+ SF_GLAD_GL_OES_single_precision = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision");
+ SF_GLAD_GL_EXT_sRGB = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_sRGB");
+ SF_GLAD_GL_OES_blend_equation_separate = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_equation_separate");
+ SF_GLAD_GL_OES_blend_func_separate = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_func_separate");
+ SF_GLAD_GL_OES_blend_subtract = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_subtract");
+ SF_GLAD_GL_OES_depth24 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_depth24");
+ SF_GLAD_GL_OES_depth32 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_depth32");
+ SF_GLAD_GL_OES_framebuffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_framebuffer_object");
+ SF_GLAD_GL_OES_packed_depth_stencil = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_packed_depth_stencil");
+ SF_GLAD_GL_OES_texture_npot = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_texture_npot");
+
+ sf_glad_gl_free_extensions(exts_i, num_exts_i);
+
+ return 1;
+}
+
+static int sf_glad_gl_find_core_gles1(void) {
+ int i, major, minor;
+ const char* version;
+ const char* prefixes[] = {
+ "OpenGL ES-CM ",
+ "OpenGL ES-CL ",
+ "OpenGL ES ",
+ NULL
+ };
+ version = (const char*) sf_glad_glGetString(GL_VERSION);
+ if (!version) return 0;
+ for (i = 0; prefixes[i]; i++) {
+ const size_t length = strlen(prefixes[i]);
+ if (strncmp(version, prefixes[i], length) == 0) {
+ version += length;
+ break;
+ }
+ }
+
+ GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor);
+
+ SF_GLAD_GL_VERSION_ES_CM_1_0 = (major == 1 && minor >= 0) || major > 1;
+
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+static int gladLoadGLES1UserPtr( GLADuserptrloadfunc load, void *userptr) {
+ int version;
+
+ sf_glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString");
+ if(sf_glad_glGetString == NULL) return 0;
+ if(sf_glad_glGetString(GL_VERSION) == NULL) return 0;
+ version = sf_glad_gl_find_core_gles1();
+
+ sf_glad_gl_load_GL_VERSION_ES_CM_1_0(load, userptr);
+
+ if (!sf_glad_gl_find_extensions_gles1(version)) return 0;
+ sf_glad_gl_load_GL_EXT_blend_minmax(load, userptr);
+ sf_glad_gl_load_GL_KHR_debug(load, userptr);
+ sf_glad_gl_load_GL_OES_single_precision(load, userptr);
+ sf_glad_gl_load_GL_OES_blend_equation_separate(load, userptr);
+ sf_glad_gl_load_GL_OES_blend_func_separate(load, userptr);
+ sf_glad_gl_load_GL_OES_blend_subtract(load, userptr);
+ sf_glad_gl_load_GL_OES_framebuffer_object(load, userptr);
+
+
+ sf_glad_gl_resolve_aliases();
+
+ return version;
+}
+
+
+static int gladLoadGLES1( GLADloadfunc load) {
+ return gladLoadGLES1UserPtr( sf_glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SF_GLAD_GL_IMPLEMENTATION */
+
diff --git a/extlibs/headers/glad/include/glad/glx.h b/extlibs/headers/glad/include/glad/glx.h
new file mode 100644
index 0000000..e8bbf7e
--- /dev/null
+++ b/extlibs/headers/glad/include/glad/glx.h
@@ -0,0 +1,1043 @@
+/**
+ * Loader generated by glad 2.0.0-beta on Wed Jul 17 02:25:47 2019
+ *
+ * Generator: C/C++
+ * Specification: glx
+ * Extensions: 9
+ *
+ * APIs:
+ * - glx=1.4
+ *
+ * Options:
+ * - MX_GLOBAL = False
+ * - ON_DEMAND = False
+ * - LOADER = True
+ * - ALIAS = True
+ * - HEADER_ONLY = True
+ * - DEBUG = False
+ * - MX = False
+ *
+ * Commandline:
+ * --api='glx=1.4' --extensions='GLX_ARB_create_context,GLX_ARB_create_context_profile,GLX_ARB_framebuffer_sRGB,GLX_ARB_multisample,GLX_EXT_framebuffer_sRGB,GLX_EXT_swap_control,GLX_MESA_swap_control,GLX_SGIX_pbuffer,GLX_SGI_swap_control' c --loader --alias --header-only
+ *
+ * Online:
+ * http://glad.sh/#api=glx%3D1.4&extensions=GLX_ARB_create_context%2CGLX_ARB_create_context_profile%2CGLX_ARB_framebuffer_sRGB%2CGLX_ARB_multisample%2CGLX_EXT_framebuffer_sRGB%2CGLX_EXT_swap_control%2CGLX_MESA_swap_control%2CGLX_SGIX_pbuffer%2CGLX_SGI_swap_control&generator=c&options=LOADER%2CALIAS%2CHEADER_ONLY
+ *
+ */
+
+#ifndef SF_GLAD_GLX_H_
+#define SF_GLAD_GLX_H_
+
+#ifdef GLX_H
+ #error GLX header already included (API: glx), remove previous include!
+#endif
+#define GLX_H 1
+
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include <glad/gl.h>
+
+#define SF_GLAD_GLX
+#define GLAD_OPTION_GLX_LOADER
+#define GLAD_OPTION_GLX_ALIAS
+#define GLAD_OPTION_GLX_HEADER_ONLY
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef GLAD_PLATFORM_H_
+#define GLAD_PLATFORM_H_
+
+#ifndef GLAD_PLATFORM_WIN32
+ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)
+ #define GLAD_PLATFORM_WIN32 1
+ #else
+ #define GLAD_PLATFORM_WIN32 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_APPLE
+ #ifdef __APPLE__
+ #define GLAD_PLATFORM_APPLE 1
+ #else
+ #define GLAD_PLATFORM_APPLE 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_EMSCRIPTEN
+ #ifdef __EMSCRIPTEN__
+ #define GLAD_PLATFORM_EMSCRIPTEN 1
+ #else
+ #define GLAD_PLATFORM_EMSCRIPTEN 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_UWP
+ #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY)
+ #ifdef __has_include
+ #if __has_include(<winapifamily.h>)
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #endif
+
+ #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY
+ #include <winapifamily.h>
+ #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ #define GLAD_PLATFORM_UWP 1
+ #endif
+ #endif
+
+ #ifndef GLAD_PLATFORM_UWP
+ #define GLAD_PLATFORM_UWP 0
+ #endif
+#endif
+
+#ifdef __GNUC__
+ #define GLAD_GNUC_EXTENSION __extension__
+#else
+ #define GLAD_GNUC_EXTENSION
+#endif
+
+#ifndef GLAD_API_CALL
+ #if defined(GLAD_API_CALL_EXPORT)
+ #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__)
+ #if defined(GLAD_API_CALL_EXPORT_BUILD)
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllexport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllexport) extern
+ #endif
+ #else
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllimport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllimport) extern
+ #endif
+ #endif
+ #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD)
+ #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+#endif
+
+#ifdef APIENTRY
+ #define GLAD_API_PTR APIENTRY
+#elif GLAD_PLATFORM_WIN32
+ #define GLAD_API_PTR __stdcall
+#else
+ #define GLAD_API_PTR
+#endif
+
+#ifndef GLAPI
+#define GLAPI GLAD_API_CALL
+#endif
+
+#ifndef GLAPIENTRY
+#define GLAPIENTRY GLAD_API_PTR
+#endif
+
+#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor)
+#define GLAD_VERSION_MAJOR(version) (version / 10000)
+#define GLAD_VERSION_MINOR(version) (version % 10000)
+
+#define GLAD_GENERATOR_VERSION "2.0.0-beta"
+
+typedef void (*GLADapiproc)(void);
+
+typedef GLADapiproc (*GLADloadfunc)(const char *name);
+typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name);
+
+typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...);
+typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...);
+
+#endif /* GLAD_PLATFORM_H_ */
+
+#define GLX_ACCUM_ALPHA_SIZE 17
+#define GLX_ACCUM_BLUE_SIZE 16
+#define GLX_ACCUM_BUFFER_BIT 0x00000080
+#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080
+#define GLX_ACCUM_GREEN_SIZE 15
+#define GLX_ACCUM_RED_SIZE 14
+#define GLX_ALPHA_SIZE 11
+#define GLX_AUX_BUFFERS 7
+#define GLX_AUX_BUFFERS_BIT 0x00000010
+#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010
+#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004
+#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004
+#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008
+#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008
+#define GLX_BAD_ATTRIBUTE 2
+#define GLX_BAD_CONTEXT 5
+#define GLX_BAD_ENUM 7
+#define GLX_BAD_SCREEN 1
+#define GLX_BAD_VALUE 6
+#define GLX_BAD_VISUAL 4
+#define GLX_BLUE_SIZE 10
+#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000
+#define GLX_BUFFER_SIZE 2
+#define GLX_BufferSwapComplete 1
+#define GLX_COLOR_INDEX_BIT 0x00000002
+#define GLX_COLOR_INDEX_TYPE 0x8015
+#define GLX_CONFIG_CAVEAT 0x20
+#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001
+#define GLX_CONTEXT_FLAGS_ARB 0x2094
+#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
+#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
+#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
+#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
+#define GLX_DAMAGED 0x8020
+#define GLX_DAMAGED_SGIX 0x8020
+#define GLX_DEPTH_BUFFER_BIT 0x00000020
+#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020
+#define GLX_DEPTH_SIZE 12
+#define GLX_DIRECT_COLOR 0x8003
+#define GLX_DONT_CARE 0xFFFFFFFF
+#define GLX_DOUBLEBUFFER 5
+#define GLX_DRAWABLE_TYPE 0x8010
+#define GLX_EVENT_MASK 0x801F
+#define GLX_EVENT_MASK_SGIX 0x801F
+#define GLX_EXTENSIONS 0x3
+#define GLX_EXTENSION_NAME "GLX"
+#define GLX_FBCONFIG_ID 0x8013
+#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2
+#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2
+#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001
+#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001
+#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002
+#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002
+#define GLX_GRAY_SCALE 0x8006
+#define GLX_GREEN_SIZE 9
+#define GLX_HEIGHT 0x801E
+#define GLX_HEIGHT_SGIX 0x801E
+#define GLX_LARGEST_PBUFFER 0x801C
+#define GLX_LARGEST_PBUFFER_SGIX 0x801C
+#define GLX_LEVEL 3
+#define GLX_MAX_PBUFFER_HEIGHT 0x8017
+#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017
+#define GLX_MAX_PBUFFER_PIXELS 0x8018
+#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018
+#define GLX_MAX_PBUFFER_WIDTH 0x8016
+#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016
+#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2
+#define GLX_NONE 0x8000
+#define GLX_NON_CONFORMANT_CONFIG 0x800D
+#define GLX_NO_EXTENSION 3
+#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A
+#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019
+#define GLX_PBUFFER 0x8023
+#define GLX_PBUFFER_BIT 0x00000004
+#define GLX_PBUFFER_BIT_SGIX 0x00000004
+#define GLX_PBUFFER_CLOBBER_MASK 0x08000000
+#define GLX_PBUFFER_HEIGHT 0x8040
+#define GLX_PBUFFER_SGIX 0x8023
+#define GLX_PBUFFER_WIDTH 0x8041
+#define GLX_PIXMAP_BIT 0x00000002
+#define GLX_PRESERVED_CONTENTS 0x801B
+#define GLX_PRESERVED_CONTENTS_SGIX 0x801B
+#define GLX_PSEUDO_COLOR 0x8004
+#define GLX_PbufferClobber 0
+#define GLX_RED_SIZE 8
+#define GLX_RENDER_TYPE 0x8011
+#define GLX_RGBA 4
+#define GLX_RGBA_BIT 0x00000001
+#define GLX_RGBA_TYPE 0x8014
+#define GLX_SAMPLES 100001
+#define GLX_SAMPLES_ARB 100001
+#define GLX_SAMPLE_BUFFERS 100000
+#define GLX_SAMPLE_BUFFERS_ARB 100000
+#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100
+#define GLX_SAVED 0x8021
+#define GLX_SAVED_SGIX 0x8021
+#define GLX_SCREEN 0x800C
+#define GLX_SLOW_CONFIG 0x8001
+#define GLX_STATIC_COLOR 0x8005
+#define GLX_STATIC_GRAY 0x8007
+#define GLX_STENCIL_BUFFER_BIT 0x00000040
+#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040
+#define GLX_STENCIL_SIZE 13
+#define GLX_STEREO 6
+#define GLX_SWAP_INTERVAL_EXT 0x20F1
+#define GLX_TRANSPARENT_ALPHA_VALUE 0x28
+#define GLX_TRANSPARENT_BLUE_VALUE 0x27
+#define GLX_TRANSPARENT_GREEN_VALUE 0x26
+#define GLX_TRANSPARENT_INDEX 0x8009
+#define GLX_TRANSPARENT_INDEX_VALUE 0x24
+#define GLX_TRANSPARENT_RED_VALUE 0x25
+#define GLX_TRANSPARENT_RGB 0x8008
+#define GLX_TRANSPARENT_TYPE 0x23
+#define GLX_TRUE_COLOR 0x8002
+#define GLX_USE_GL 1
+#define GLX_VENDOR 0x1
+#define GLX_VERSION 0x2
+#define GLX_VISUAL_ID 0x800B
+#define GLX_WIDTH 0x801D
+#define GLX_WIDTH_SGIX 0x801D
+#define GLX_WINDOW 0x8022
+#define GLX_WINDOW_BIT 0x00000001
+#define GLX_WINDOW_SGIX 0x8022
+#define GLX_X_RENDERABLE 0x8012
+#define GLX_X_VISUAL_TYPE 0x22
+#define __GLX_NUMBER_EVENTS 17
+
+
+#ifndef GLEXT_64_TYPES_DEFINED
+/* This code block is duplicated in glext.h, so must be protected */
+#define GLEXT_64_TYPES_DEFINED
+/* Define int32_t, int64_t, and uint64_t types for UST/MSC */
+/* (as used in the GLX_OML_sync_control extension). */
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+#elif defined(__sun__) || defined(__digital__)
+#include <inttypes.h>
+#if defined(__STDC__)
+#if defined(__arch64__) || defined(_LP64)
+typedef long int int64_t;
+typedef unsigned long int uint64_t;
+#else
+typedef long long int int64_t;
+typedef unsigned long long int uint64_t;
+#endif /* __arch64__ */
+#endif /* __STDC__ */
+#elif defined( __VMS ) || defined(__sgi)
+#include <inttypes.h>
+#elif defined(__SCO__) || defined(__USLC__)
+#include <stdint.h>
+#elif defined(__UNIXOS2__) || defined(__SOL64__)
+typedef long int int32_t;
+typedef long long int int64_t;
+typedef unsigned long long int uint64_t;
+#elif defined(_WIN32) && defined(__GNUC__)
+#include <stdint.h>
+#elif defined(_WIN32)
+typedef __int32 int32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#else
+/* Fallback if nothing above works */
+#include <inttypes.h>
+#endif
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+
+#else
+
+#endif
+
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
+
+#else
+
+#endif
+
+
+
+
+
+
+
+typedef XID GLXFBConfigID;
+typedef struct __GLXFBConfigRec *GLXFBConfig;
+typedef XID GLXContextID;
+typedef struct __GLXcontextRec *GLXContext;
+typedef XID GLXPixmap;
+typedef XID GLXDrawable;
+typedef XID GLXWindow;
+typedef XID GLXPbuffer;
+typedef void ( *__GLXextFuncPtr)(void);
+typedef XID GLXVideoCaptureDeviceNV;
+typedef unsigned int GLXVideoDeviceNV;
+typedef XID GLXVideoSourceSGIX;
+typedef XID GLXFBConfigIDSGIX;
+typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;
+typedef XID GLXPbufferSGIX;
+typedef struct {
+ int event_type; /* GLX_DAMAGED or GLX_SAVED */
+ int draw_type; /* GLX_WINDOW or GLX_PBUFFER */
+ unsigned long serial; /* # of last request processed by server */
+ Bool send_event; /* true if this came for SendEvent request */
+ Display *display; /* display the event was read from */
+ GLXDrawable drawable; /* XID of Drawable */
+ unsigned int buffer_mask; /* mask indicating which buffers are affected */
+ unsigned int aux_buffer; /* which aux buffer was affected */
+ int x, y;
+ int width, height;
+ int count; /* if nonzero, at least this many more */
+} GLXPbufferClobberEvent;
+typedef struct {
+ int type;
+ unsigned long serial; /* # of last request processed by server */
+ Bool send_event; /* true if this came from a SendEvent request */
+ Display *display; /* Display the event was read from */
+ GLXDrawable drawable; /* drawable on which event was requested in event mask */
+ int event_type;
+ int64_t ust;
+ int64_t msc;
+ int64_t sbc;
+} GLXBufferSwapComplete;
+typedef union __GLXEvent {
+ GLXPbufferClobberEvent glxpbufferclobber;
+ GLXBufferSwapComplete glxbufferswapcomplete;
+ long pad[24];
+} GLXEvent;
+typedef struct {
+ int type;
+ unsigned long serial;
+ Bool send_event;
+ Display *display;
+ int extension;
+ int evtype;
+ GLXDrawable window;
+ Bool stereo_tree;
+} GLXStereoNotifyEventEXT;
+typedef struct {
+ int type;
+ unsigned long serial; /* # of last request processed by server */
+ Bool send_event; /* true if this came for SendEvent request */
+ Display *display; /* display the event was read from */
+ GLXDrawable drawable; /* i.d. of Drawable */
+ int event_type; /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */
+ int draw_type; /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */
+ unsigned int mask; /* mask indicating which buffers are affected*/
+ int x, y;
+ int width, height;
+ int count; /* if nonzero, at least this many more */
+} GLXBufferClobberEventSGIX;
+typedef struct {
+ char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */
+ int networkId;
+} GLXHyperpipeNetworkSGIX;
+typedef struct {
+ char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */
+ int channel;
+ unsigned int participationType;
+ int timeSlice;
+} GLXHyperpipeConfigSGIX;
+typedef struct {
+ char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */
+ int srcXOrigin, srcYOrigin, srcWidth, srcHeight;
+ int destXOrigin, destYOrigin, destWidth, destHeight;
+} GLXPipeRect;
+typedef struct {
+ char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */
+ int XOrigin, YOrigin, maxHeight, maxWidth;
+} GLXPipeRectLimits;
+
+
+#define GLX_VERSION_1_0 1
+GLAD_API_CALL int SF_GLAD_GLX_VERSION_1_0;
+#define GLX_VERSION_1_1 1
+GLAD_API_CALL int SF_GLAD_GLX_VERSION_1_1;
+#define GLX_VERSION_1_2 1
+GLAD_API_CALL int SF_GLAD_GLX_VERSION_1_2;
+#define GLX_VERSION_1_3 1
+GLAD_API_CALL int SF_GLAD_GLX_VERSION_1_3;
+#define GLX_VERSION_1_4 1
+GLAD_API_CALL int SF_GLAD_GLX_VERSION_1_4;
+#define GLX_ARB_create_context 1
+GLAD_API_CALL int SF_GLAD_GLX_ARB_create_context;
+#define GLX_ARB_create_context_profile 1
+GLAD_API_CALL int SF_GLAD_GLX_ARB_create_context_profile;
+#define GLX_ARB_framebuffer_sRGB 1
+GLAD_API_CALL int SF_GLAD_GLX_ARB_framebuffer_sRGB;
+#define GLX_ARB_multisample 1
+GLAD_API_CALL int SF_GLAD_GLX_ARB_multisample;
+#define GLX_EXT_framebuffer_sRGB 1
+GLAD_API_CALL int SF_GLAD_GLX_EXT_framebuffer_sRGB;
+#define GLX_EXT_swap_control 1
+GLAD_API_CALL int SF_GLAD_GLX_EXT_swap_control;
+#define GLX_MESA_swap_control 1
+GLAD_API_CALL int SF_GLAD_GLX_MESA_swap_control;
+#define GLX_SGIX_pbuffer 1
+GLAD_API_CALL int SF_GLAD_GLX_SGIX_pbuffer;
+#define GLX_SGI_swap_control 1
+GLAD_API_CALL int SF_GLAD_GLX_SGI_swap_control;
+
+
+typedef GLXFBConfig * (GLAD_API_PTR *PFNGLXCHOOSEFBCONFIGPROC)(Display * dpy, int screen, const int * attrib_list, int * nelements);
+typedef XVisualInfo * (GLAD_API_PTR *PFNGLXCHOOSEVISUALPROC)(Display * dpy, int screen, int * attribList);
+typedef void (GLAD_API_PTR *PFNGLXCOPYCONTEXTPROC)(Display * dpy, GLXContext src, GLXContext dst, unsigned long mask);
+typedef GLXContext (GLAD_API_PTR *PFNGLXCREATECONTEXTPROC)(Display * dpy, XVisualInfo * vis, GLXContext shareList, Bool direct);
+typedef GLXContext (GLAD_API_PTR *PFNGLXCREATECONTEXTATTRIBSARBPROC)(Display * dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int * attrib_list);
+typedef GLXPbufferSGIX (GLAD_API_PTR *PFNGLXCREATEGLXPBUFFERSGIXPROC)(Display * dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int * attrib_list);
+typedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEGLXPIXMAPPROC)(Display * dpy, XVisualInfo * visual, Pixmap pixmap);
+typedef GLXContext (GLAD_API_PTR *PFNGLXCREATENEWCONTEXTPROC)(Display * dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
+typedef GLXPbuffer (GLAD_API_PTR *PFNGLXCREATEPBUFFERPROC)(Display * dpy, GLXFBConfig config, const int * attrib_list);
+typedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEPIXMAPPROC)(Display * dpy, GLXFBConfig config, Pixmap pixmap, const int * attrib_list);
+typedef GLXWindow (GLAD_API_PTR *PFNGLXCREATEWINDOWPROC)(Display * dpy, GLXFBConfig config, Window win, const int * attrib_list);
+typedef void (GLAD_API_PTR *PFNGLXDESTROYCONTEXTPROC)(Display * dpy, GLXContext ctx);
+typedef void (GLAD_API_PTR *PFNGLXDESTROYGLXPBUFFERSGIXPROC)(Display * dpy, GLXPbufferSGIX pbuf);
+typedef void (GLAD_API_PTR *PFNGLXDESTROYGLXPIXMAPPROC)(Display * dpy, GLXPixmap pixmap);
+typedef void (GLAD_API_PTR *PFNGLXDESTROYPBUFFERPROC)(Display * dpy, GLXPbuffer pbuf);
+typedef void (GLAD_API_PTR *PFNGLXDESTROYPIXMAPPROC)(Display * dpy, GLXPixmap pixmap);
+typedef void (GLAD_API_PTR *PFNGLXDESTROYWINDOWPROC)(Display * dpy, GLXWindow win);
+typedef const char * (GLAD_API_PTR *PFNGLXGETCLIENTSTRINGPROC)(Display * dpy, int name);
+typedef int (GLAD_API_PTR *PFNGLXGETCONFIGPROC)(Display * dpy, XVisualInfo * visual, int attrib, int * value);
+typedef GLXContext (GLAD_API_PTR *PFNGLXGETCURRENTCONTEXTPROC)(void);
+typedef Display * (GLAD_API_PTR *PFNGLXGETCURRENTDISPLAYPROC)(void);
+typedef GLXDrawable (GLAD_API_PTR *PFNGLXGETCURRENTDRAWABLEPROC)(void);
+typedef GLXDrawable (GLAD_API_PTR *PFNGLXGETCURRENTREADDRAWABLEPROC)(void);
+typedef int (GLAD_API_PTR *PFNGLXGETFBCONFIGATTRIBPROC)(Display * dpy, GLXFBConfig config, int attribute, int * value);
+typedef GLXFBConfig * (GLAD_API_PTR *PFNGLXGETFBCONFIGSPROC)(Display * dpy, int screen, int * nelements);
+typedef __GLXextFuncPtr (GLAD_API_PTR *PFNGLXGETPROCADDRESSPROC)(const GLubyte * procName);
+typedef void (GLAD_API_PTR *PFNGLXGETSELECTEDEVENTPROC)(Display * dpy, GLXDrawable draw, unsigned long * event_mask);
+typedef void (GLAD_API_PTR *PFNGLXGETSELECTEDEVENTSGIXPROC)(Display * dpy, GLXDrawable drawable, unsigned long * mask);
+typedef int (GLAD_API_PTR *PFNGLXGETSWAPINTERVALMESAPROC)(void);
+typedef XVisualInfo * (GLAD_API_PTR *PFNGLXGETVISUALFROMFBCONFIGPROC)(Display * dpy, GLXFBConfig config);
+typedef Bool (GLAD_API_PTR *PFNGLXISDIRECTPROC)(Display * dpy, GLXContext ctx);
+typedef Bool (GLAD_API_PTR *PFNGLXMAKECONTEXTCURRENTPROC)(Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+typedef Bool (GLAD_API_PTR *PFNGLXMAKECURRENTPROC)(Display * dpy, GLXDrawable drawable, GLXContext ctx);
+typedef int (GLAD_API_PTR *PFNGLXQUERYCONTEXTPROC)(Display * dpy, GLXContext ctx, int attribute, int * value);
+typedef void (GLAD_API_PTR *PFNGLXQUERYDRAWABLEPROC)(Display * dpy, GLXDrawable draw, int attribute, unsigned int * value);
+typedef Bool (GLAD_API_PTR *PFNGLXQUERYEXTENSIONPROC)(Display * dpy, int * errorb, int * event);
+typedef const char * (GLAD_API_PTR *PFNGLXQUERYEXTENSIONSSTRINGPROC)(Display * dpy, int screen);
+typedef void (GLAD_API_PTR *PFNGLXQUERYGLXPBUFFERSGIXPROC)(Display * dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int * value);
+typedef const char * (GLAD_API_PTR *PFNGLXQUERYSERVERSTRINGPROC)(Display * dpy, int screen, int name);
+typedef Bool (GLAD_API_PTR *PFNGLXQUERYVERSIONPROC)(Display * dpy, int * maj, int * min);
+typedef void (GLAD_API_PTR *PFNGLXSELECTEVENTPROC)(Display * dpy, GLXDrawable draw, unsigned long event_mask);
+typedef void (GLAD_API_PTR *PFNGLXSELECTEVENTSGIXPROC)(Display * dpy, GLXDrawable drawable, unsigned long mask);
+typedef void (GLAD_API_PTR *PFNGLXSWAPBUFFERSPROC)(Display * dpy, GLXDrawable drawable);
+typedef void (GLAD_API_PTR *PFNGLXSWAPINTERVALEXTPROC)(Display * dpy, GLXDrawable drawable, int interval);
+typedef int (GLAD_API_PTR *PFNGLXSWAPINTERVALMESAPROC)(unsigned int interval);
+typedef int (GLAD_API_PTR *PFNGLXSWAPINTERVALSGIPROC)(int interval);
+typedef void (GLAD_API_PTR *PFNGLXUSEXFONTPROC)(Font font, int first, int count, int list);
+typedef void (GLAD_API_PTR *PFNGLXWAITGLPROC)(void);
+typedef void (GLAD_API_PTR *PFNGLXWAITXPROC)(void);
+
+GLAD_API_CALL PFNGLXCHOOSEFBCONFIGPROC sf_glad_glXChooseFBConfig;
+#define glXChooseFBConfig sf_glad_glXChooseFBConfig
+GLAD_API_CALL PFNGLXCHOOSEVISUALPROC sf_glad_glXChooseVisual;
+#define glXChooseVisual sf_glad_glXChooseVisual
+GLAD_API_CALL PFNGLXCOPYCONTEXTPROC sf_glad_glXCopyContext;
+#define glXCopyContext sf_glad_glXCopyContext
+GLAD_API_CALL PFNGLXCREATECONTEXTPROC sf_glad_glXCreateContext;
+#define glXCreateContext sf_glad_glXCreateContext
+GLAD_API_CALL PFNGLXCREATECONTEXTATTRIBSARBPROC sf_glad_glXCreateContextAttribsARB;
+#define glXCreateContextAttribsARB sf_glad_glXCreateContextAttribsARB
+GLAD_API_CALL PFNGLXCREATEGLXPBUFFERSGIXPROC sf_glad_glXCreateGLXPbufferSGIX;
+#define glXCreateGLXPbufferSGIX sf_glad_glXCreateGLXPbufferSGIX
+GLAD_API_CALL PFNGLXCREATEGLXPIXMAPPROC sf_glad_glXCreateGLXPixmap;
+#define glXCreateGLXPixmap sf_glad_glXCreateGLXPixmap
+GLAD_API_CALL PFNGLXCREATENEWCONTEXTPROC sf_glad_glXCreateNewContext;
+#define glXCreateNewContext sf_glad_glXCreateNewContext
+GLAD_API_CALL PFNGLXCREATEPBUFFERPROC sf_glad_glXCreatePbuffer;
+#define glXCreatePbuffer sf_glad_glXCreatePbuffer
+GLAD_API_CALL PFNGLXCREATEPIXMAPPROC sf_glad_glXCreatePixmap;
+#define glXCreatePixmap sf_glad_glXCreatePixmap
+GLAD_API_CALL PFNGLXCREATEWINDOWPROC sf_glad_glXCreateWindow;
+#define glXCreateWindow sf_glad_glXCreateWindow
+GLAD_API_CALL PFNGLXDESTROYCONTEXTPROC sf_glad_glXDestroyContext;
+#define glXDestroyContext sf_glad_glXDestroyContext
+GLAD_API_CALL PFNGLXDESTROYGLXPBUFFERSGIXPROC sf_glad_glXDestroyGLXPbufferSGIX;
+#define glXDestroyGLXPbufferSGIX sf_glad_glXDestroyGLXPbufferSGIX
+GLAD_API_CALL PFNGLXDESTROYGLXPIXMAPPROC sf_glad_glXDestroyGLXPixmap;
+#define glXDestroyGLXPixmap sf_glad_glXDestroyGLXPixmap
+GLAD_API_CALL PFNGLXDESTROYPBUFFERPROC sf_glad_glXDestroyPbuffer;
+#define glXDestroyPbuffer sf_glad_glXDestroyPbuffer
+GLAD_API_CALL PFNGLXDESTROYPIXMAPPROC sf_glad_glXDestroyPixmap;
+#define glXDestroyPixmap sf_glad_glXDestroyPixmap
+GLAD_API_CALL PFNGLXDESTROYWINDOWPROC sf_glad_glXDestroyWindow;
+#define glXDestroyWindow sf_glad_glXDestroyWindow
+GLAD_API_CALL PFNGLXGETCLIENTSTRINGPROC sf_glad_glXGetClientString;
+#define glXGetClientString sf_glad_glXGetClientString
+GLAD_API_CALL PFNGLXGETCONFIGPROC sf_glad_glXGetConfig;
+#define glXGetConfig sf_glad_glXGetConfig
+GLAD_API_CALL PFNGLXGETCURRENTCONTEXTPROC sf_glad_glXGetCurrentContext;
+#define glXGetCurrentContext sf_glad_glXGetCurrentContext
+GLAD_API_CALL PFNGLXGETCURRENTDISPLAYPROC sf_glad_glXGetCurrentDisplay;
+#define glXGetCurrentDisplay sf_glad_glXGetCurrentDisplay
+GLAD_API_CALL PFNGLXGETCURRENTDRAWABLEPROC sf_glad_glXGetCurrentDrawable;
+#define glXGetCurrentDrawable sf_glad_glXGetCurrentDrawable
+GLAD_API_CALL PFNGLXGETCURRENTREADDRAWABLEPROC sf_glad_glXGetCurrentReadDrawable;
+#define glXGetCurrentReadDrawable sf_glad_glXGetCurrentReadDrawable
+GLAD_API_CALL PFNGLXGETFBCONFIGATTRIBPROC sf_glad_glXGetFBConfigAttrib;
+#define glXGetFBConfigAttrib sf_glad_glXGetFBConfigAttrib
+GLAD_API_CALL PFNGLXGETFBCONFIGSPROC sf_glad_glXGetFBConfigs;
+#define glXGetFBConfigs sf_glad_glXGetFBConfigs
+GLAD_API_CALL PFNGLXGETPROCADDRESSPROC sf_glad_glXGetProcAddress;
+#define glXGetProcAddress sf_glad_glXGetProcAddress
+GLAD_API_CALL PFNGLXGETSELECTEDEVENTPROC sf_glad_glXGetSelectedEvent;
+#define glXGetSelectedEvent sf_glad_glXGetSelectedEvent
+GLAD_API_CALL PFNGLXGETSELECTEDEVENTSGIXPROC sf_glad_glXGetSelectedEventSGIX;
+#define glXGetSelectedEventSGIX sf_glad_glXGetSelectedEventSGIX
+GLAD_API_CALL PFNGLXGETSWAPINTERVALMESAPROC sf_glad_glXGetSwapIntervalMESA;
+#define glXGetSwapIntervalMESA sf_glad_glXGetSwapIntervalMESA
+GLAD_API_CALL PFNGLXGETVISUALFROMFBCONFIGPROC sf_glad_glXGetVisualFromFBConfig;
+#define glXGetVisualFromFBConfig sf_glad_glXGetVisualFromFBConfig
+GLAD_API_CALL PFNGLXISDIRECTPROC sf_glad_glXIsDirect;
+#define glXIsDirect sf_glad_glXIsDirect
+GLAD_API_CALL PFNGLXMAKECONTEXTCURRENTPROC sf_glad_glXMakeContextCurrent;
+#define glXMakeContextCurrent sf_glad_glXMakeContextCurrent
+GLAD_API_CALL PFNGLXMAKECURRENTPROC sf_glad_glXMakeCurrent;
+#define glXMakeCurrent sf_glad_glXMakeCurrent
+GLAD_API_CALL PFNGLXQUERYCONTEXTPROC sf_glad_glXQueryContext;
+#define glXQueryContext sf_glad_glXQueryContext
+GLAD_API_CALL PFNGLXQUERYDRAWABLEPROC sf_glad_glXQueryDrawable;
+#define glXQueryDrawable sf_glad_glXQueryDrawable
+GLAD_API_CALL PFNGLXQUERYEXTENSIONPROC sf_glad_glXQueryExtension;
+#define glXQueryExtension sf_glad_glXQueryExtension
+GLAD_API_CALL PFNGLXQUERYEXTENSIONSSTRINGPROC sf_glad_glXQueryExtensionsString;
+#define glXQueryExtensionsString sf_glad_glXQueryExtensionsString
+GLAD_API_CALL PFNGLXQUERYGLXPBUFFERSGIXPROC sf_glad_glXQueryGLXPbufferSGIX;
+#define glXQueryGLXPbufferSGIX sf_glad_glXQueryGLXPbufferSGIX
+GLAD_API_CALL PFNGLXQUERYSERVERSTRINGPROC sf_glad_glXQueryServerString;
+#define glXQueryServerString sf_glad_glXQueryServerString
+GLAD_API_CALL PFNGLXQUERYVERSIONPROC sf_glad_glXQueryVersion;
+#define glXQueryVersion sf_glad_glXQueryVersion
+GLAD_API_CALL PFNGLXSELECTEVENTPROC sf_glad_glXSelectEvent;
+#define glXSelectEvent sf_glad_glXSelectEvent
+GLAD_API_CALL PFNGLXSELECTEVENTSGIXPROC sf_glad_glXSelectEventSGIX;
+#define glXSelectEventSGIX sf_glad_glXSelectEventSGIX
+GLAD_API_CALL PFNGLXSWAPBUFFERSPROC sf_glad_glXSwapBuffers;
+#define glXSwapBuffers sf_glad_glXSwapBuffers
+GLAD_API_CALL PFNGLXSWAPINTERVALEXTPROC sf_glad_glXSwapIntervalEXT;
+#define glXSwapIntervalEXT sf_glad_glXSwapIntervalEXT
+GLAD_API_CALL PFNGLXSWAPINTERVALMESAPROC sf_glad_glXSwapIntervalMESA;
+#define glXSwapIntervalMESA sf_glad_glXSwapIntervalMESA
+GLAD_API_CALL PFNGLXSWAPINTERVALSGIPROC sf_glad_glXSwapIntervalSGI;
+#define glXSwapIntervalSGI sf_glad_glXSwapIntervalSGI
+GLAD_API_CALL PFNGLXUSEXFONTPROC sf_glad_glXUseXFont;
+#define glXUseXFont sf_glad_glXUseXFont
+GLAD_API_CALL PFNGLXWAITGLPROC sf_glad_glXWaitGL;
+#define glXWaitGL sf_glad_glXWaitGL
+GLAD_API_CALL PFNGLXWAITXPROC sf_glad_glXWaitX;
+#define glXWaitX sf_glad_glXWaitX
+
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Source */
+#ifdef SF_GLAD_GLX_IMPLEMENTATION
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef GLAD_IMPL_UTIL_C_
+#define GLAD_IMPL_UTIL_C_
+
+#ifdef _MSC_VER
+#define GLAD_IMPL_UTIL_SSCANF sscanf_s
+#else
+#define GLAD_IMPL_UTIL_SSCANF sscanf
+#endif
+
+#endif /* GLAD_IMPL_UTIL_C_ */
+
+
+int SF_GLAD_GLX_VERSION_1_0 = 0;
+int SF_GLAD_GLX_VERSION_1_1 = 0;
+int SF_GLAD_GLX_VERSION_1_2 = 0;
+int SF_GLAD_GLX_VERSION_1_3 = 0;
+int SF_GLAD_GLX_VERSION_1_4 = 0;
+int SF_GLAD_GLX_ARB_create_context = 0;
+int SF_GLAD_GLX_ARB_create_context_profile = 0;
+int SF_GLAD_GLX_ARB_framebuffer_sRGB = 0;
+int SF_GLAD_GLX_ARB_multisample = 0;
+int SF_GLAD_GLX_EXT_framebuffer_sRGB = 0;
+int SF_GLAD_GLX_EXT_swap_control = 0;
+int SF_GLAD_GLX_MESA_swap_control = 0;
+int SF_GLAD_GLX_SGIX_pbuffer = 0;
+int SF_GLAD_GLX_SGI_swap_control = 0;
+
+
+
+PFNGLXCHOOSEFBCONFIGPROC sf_glad_glXChooseFBConfig = NULL;
+PFNGLXCHOOSEVISUALPROC sf_glad_glXChooseVisual = NULL;
+PFNGLXCOPYCONTEXTPROC sf_glad_glXCopyContext = NULL;
+PFNGLXCREATECONTEXTPROC sf_glad_glXCreateContext = NULL;
+PFNGLXCREATECONTEXTATTRIBSARBPROC sf_glad_glXCreateContextAttribsARB = NULL;
+PFNGLXCREATEGLXPBUFFERSGIXPROC sf_glad_glXCreateGLXPbufferSGIX = NULL;
+PFNGLXCREATEGLXPIXMAPPROC sf_glad_glXCreateGLXPixmap = NULL;
+PFNGLXCREATENEWCONTEXTPROC sf_glad_glXCreateNewContext = NULL;
+PFNGLXCREATEPBUFFERPROC sf_glad_glXCreatePbuffer = NULL;
+PFNGLXCREATEPIXMAPPROC sf_glad_glXCreatePixmap = NULL;
+PFNGLXCREATEWINDOWPROC sf_glad_glXCreateWindow = NULL;
+PFNGLXDESTROYCONTEXTPROC sf_glad_glXDestroyContext = NULL;
+PFNGLXDESTROYGLXPBUFFERSGIXPROC sf_glad_glXDestroyGLXPbufferSGIX = NULL;
+PFNGLXDESTROYGLXPIXMAPPROC sf_glad_glXDestroyGLXPixmap = NULL;
+PFNGLXDESTROYPBUFFERPROC sf_glad_glXDestroyPbuffer = NULL;
+PFNGLXDESTROYPIXMAPPROC sf_glad_glXDestroyPixmap = NULL;
+PFNGLXDESTROYWINDOWPROC sf_glad_glXDestroyWindow = NULL;
+PFNGLXGETCLIENTSTRINGPROC sf_glad_glXGetClientString = NULL;
+PFNGLXGETCONFIGPROC sf_glad_glXGetConfig = NULL;
+PFNGLXGETCURRENTCONTEXTPROC sf_glad_glXGetCurrentContext = NULL;
+PFNGLXGETCURRENTDISPLAYPROC sf_glad_glXGetCurrentDisplay = NULL;
+PFNGLXGETCURRENTDRAWABLEPROC sf_glad_glXGetCurrentDrawable = NULL;
+PFNGLXGETCURRENTREADDRAWABLEPROC sf_glad_glXGetCurrentReadDrawable = NULL;
+PFNGLXGETFBCONFIGATTRIBPROC sf_glad_glXGetFBConfigAttrib = NULL;
+PFNGLXGETFBCONFIGSPROC sf_glad_glXGetFBConfigs = NULL;
+PFNGLXGETPROCADDRESSPROC sf_glad_glXGetProcAddress = NULL;
+PFNGLXGETSELECTEDEVENTPROC sf_glad_glXGetSelectedEvent = NULL;
+PFNGLXGETSELECTEDEVENTSGIXPROC sf_glad_glXGetSelectedEventSGIX = NULL;
+PFNGLXGETSWAPINTERVALMESAPROC sf_glad_glXGetSwapIntervalMESA = NULL;
+PFNGLXGETVISUALFROMFBCONFIGPROC sf_glad_glXGetVisualFromFBConfig = NULL;
+PFNGLXISDIRECTPROC sf_glad_glXIsDirect = NULL;
+PFNGLXMAKECONTEXTCURRENTPROC sf_glad_glXMakeContextCurrent = NULL;
+PFNGLXMAKECURRENTPROC sf_glad_glXMakeCurrent = NULL;
+PFNGLXQUERYCONTEXTPROC sf_glad_glXQueryContext = NULL;
+PFNGLXQUERYDRAWABLEPROC sf_glad_glXQueryDrawable = NULL;
+PFNGLXQUERYEXTENSIONPROC sf_glad_glXQueryExtension = NULL;
+PFNGLXQUERYEXTENSIONSSTRINGPROC sf_glad_glXQueryExtensionsString = NULL;
+PFNGLXQUERYGLXPBUFFERSGIXPROC sf_glad_glXQueryGLXPbufferSGIX = NULL;
+PFNGLXQUERYSERVERSTRINGPROC sf_glad_glXQueryServerString = NULL;
+PFNGLXQUERYVERSIONPROC sf_glad_glXQueryVersion = NULL;
+PFNGLXSELECTEVENTPROC sf_glad_glXSelectEvent = NULL;
+PFNGLXSELECTEVENTSGIXPROC sf_glad_glXSelectEventSGIX = NULL;
+PFNGLXSWAPBUFFERSPROC sf_glad_glXSwapBuffers = NULL;
+PFNGLXSWAPINTERVALEXTPROC sf_glad_glXSwapIntervalEXT = NULL;
+PFNGLXSWAPINTERVALMESAPROC sf_glad_glXSwapIntervalMESA = NULL;
+PFNGLXSWAPINTERVALSGIPROC sf_glad_glXSwapIntervalSGI = NULL;
+PFNGLXUSEXFONTPROC sf_glad_glXUseXFont = NULL;
+PFNGLXWAITGLPROC sf_glad_glXWaitGL = NULL;
+PFNGLXWAITXPROC sf_glad_glXWaitX = NULL;
+
+
+static void glad_glx_load_GLX_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GLX_VERSION_1_0) return;
+ sf_glad_glXChooseVisual = (PFNGLXCHOOSEVISUALPROC) load(userptr, "glXChooseVisual");
+ sf_glad_glXCopyContext = (PFNGLXCOPYCONTEXTPROC) load(userptr, "glXCopyContext");
+ sf_glad_glXCreateContext = (PFNGLXCREATECONTEXTPROC) load(userptr, "glXCreateContext");
+ sf_glad_glXCreateGLXPixmap = (PFNGLXCREATEGLXPIXMAPPROC) load(userptr, "glXCreateGLXPixmap");
+ sf_glad_glXDestroyContext = (PFNGLXDESTROYCONTEXTPROC) load(userptr, "glXDestroyContext");
+ sf_glad_glXDestroyGLXPixmap = (PFNGLXDESTROYGLXPIXMAPPROC) load(userptr, "glXDestroyGLXPixmap");
+ sf_glad_glXGetConfig = (PFNGLXGETCONFIGPROC) load(userptr, "glXGetConfig");
+ sf_glad_glXGetCurrentContext = (PFNGLXGETCURRENTCONTEXTPROC) load(userptr, "glXGetCurrentContext");
+ sf_glad_glXGetCurrentDrawable = (PFNGLXGETCURRENTDRAWABLEPROC) load(userptr, "glXGetCurrentDrawable");
+ sf_glad_glXIsDirect = (PFNGLXISDIRECTPROC) load(userptr, "glXIsDirect");
+ sf_glad_glXMakeCurrent = (PFNGLXMAKECURRENTPROC) load(userptr, "glXMakeCurrent");
+ sf_glad_glXQueryExtension = (PFNGLXQUERYEXTENSIONPROC) load(userptr, "glXQueryExtension");
+ sf_glad_glXQueryVersion = (PFNGLXQUERYVERSIONPROC) load(userptr, "glXQueryVersion");
+ sf_glad_glXSwapBuffers = (PFNGLXSWAPBUFFERSPROC) load(userptr, "glXSwapBuffers");
+ sf_glad_glXUseXFont = (PFNGLXUSEXFONTPROC) load(userptr, "glXUseXFont");
+ sf_glad_glXWaitGL = (PFNGLXWAITGLPROC) load(userptr, "glXWaitGL");
+ sf_glad_glXWaitX = (PFNGLXWAITXPROC) load(userptr, "glXWaitX");
+}
+static void glad_glx_load_GLX_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GLX_VERSION_1_1) return;
+ sf_glad_glXGetClientString = (PFNGLXGETCLIENTSTRINGPROC) load(userptr, "glXGetClientString");
+ sf_glad_glXQueryExtensionsString = (PFNGLXQUERYEXTENSIONSSTRINGPROC) load(userptr, "glXQueryExtensionsString");
+ sf_glad_glXQueryServerString = (PFNGLXQUERYSERVERSTRINGPROC) load(userptr, "glXQueryServerString");
+}
+static void glad_glx_load_GLX_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GLX_VERSION_1_2) return;
+ sf_glad_glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC) load(userptr, "glXGetCurrentDisplay");
+}
+static void glad_glx_load_GLX_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GLX_VERSION_1_3) return;
+ sf_glad_glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC) load(userptr, "glXChooseFBConfig");
+ sf_glad_glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC) load(userptr, "glXCreateNewContext");
+ sf_glad_glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC) load(userptr, "glXCreatePbuffer");
+ sf_glad_glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC) load(userptr, "glXCreatePixmap");
+ sf_glad_glXCreateWindow = (PFNGLXCREATEWINDOWPROC) load(userptr, "glXCreateWindow");
+ sf_glad_glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC) load(userptr, "glXDestroyPbuffer");
+ sf_glad_glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC) load(userptr, "glXDestroyPixmap");
+ sf_glad_glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC) load(userptr, "glXDestroyWindow");
+ sf_glad_glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC) load(userptr, "glXGetCurrentReadDrawable");
+ sf_glad_glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC) load(userptr, "glXGetFBConfigAttrib");
+ sf_glad_glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC) load(userptr, "glXGetFBConfigs");
+ sf_glad_glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC) load(userptr, "glXGetSelectedEvent");
+ sf_glad_glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC) load(userptr, "glXGetVisualFromFBConfig");
+ sf_glad_glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC) load(userptr, "glXMakeContextCurrent");
+ sf_glad_glXQueryContext = (PFNGLXQUERYCONTEXTPROC) load(userptr, "glXQueryContext");
+ sf_glad_glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC) load(userptr, "glXQueryDrawable");
+ sf_glad_glXSelectEvent = (PFNGLXSELECTEVENTPROC) load(userptr, "glXSelectEvent");
+}
+static void glad_glx_load_GLX_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GLX_VERSION_1_4) return;
+ sf_glad_glXGetProcAddress = (PFNGLXGETPROCADDRESSPROC) load(userptr, "glXGetProcAddress");
+}
+static void glad_glx_load_GLX_ARB_create_context( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GLX_ARB_create_context) return;
+ sf_glad_glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) load(userptr, "glXCreateContextAttribsARB");
+}
+static void glad_glx_load_GLX_EXT_swap_control( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GLX_EXT_swap_control) return;
+ sf_glad_glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC) load(userptr, "glXSwapIntervalEXT");
+}
+static void glad_glx_load_GLX_MESA_swap_control( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GLX_MESA_swap_control) return;
+ sf_glad_glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC) load(userptr, "glXGetSwapIntervalMESA");
+ sf_glad_glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC) load(userptr, "glXSwapIntervalMESA");
+}
+static void glad_glx_load_GLX_SGIX_pbuffer( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GLX_SGIX_pbuffer) return;
+ sf_glad_glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC) load(userptr, "glXCreateGLXPbufferSGIX");
+ sf_glad_glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC) load(userptr, "glXDestroyGLXPbufferSGIX");
+ sf_glad_glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC) load(userptr, "glXGetSelectedEventSGIX");
+ sf_glad_glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC) load(userptr, "glXQueryGLXPbufferSGIX");
+ sf_glad_glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC) load(userptr, "glXSelectEventSGIX");
+}
+static void glad_glx_load_GLX_SGI_swap_control( GLADuserptrloadfunc load, void* userptr) {
+ if(!SF_GLAD_GLX_SGI_swap_control) return;
+ sf_glad_glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC) load(userptr, "glXSwapIntervalSGI");
+}
+
+
+static void glad_glx_resolve_aliases(void) {
+}
+
+static int glad_glx_has_extension(Display *display, int screen, const char *ext) {
+#ifndef GLX_VERSION_1_1
+ (void) display;
+ (void) screen;
+ (void) ext;
+#else
+ const char *terminator;
+ const char *loc;
+ const char *extensions;
+
+ if (glXQueryExtensionsString == NULL) {
+ return 0;
+ }
+
+ extensions = glXQueryExtensionsString(display, screen);
+
+ if(extensions == NULL || ext == NULL) {
+ return 0;
+ }
+
+ while(1) {
+ loc = strstr(extensions, ext);
+ if(loc == NULL)
+ break;
+
+ terminator = loc + strlen(ext);
+ if((loc == extensions || *(loc - 1) == ' ') &&
+ (*terminator == ' ' || *terminator == '\0')) {
+ return 1;
+ }
+ extensions = terminator;
+ }
+#endif
+
+ return 0;
+}
+
+static GLADapiproc glad_glx_get_proc_from_userptr(void *userptr, const char* name) {
+ return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);
+}
+
+static int glad_glx_find_extensions(Display *display, int screen) {
+ SF_GLAD_GLX_ARB_create_context = glad_glx_has_extension(display, screen, "GLX_ARB_create_context");
+ SF_GLAD_GLX_ARB_create_context_profile = glad_glx_has_extension(display, screen, "GLX_ARB_create_context_profile");
+ SF_GLAD_GLX_ARB_framebuffer_sRGB = glad_glx_has_extension(display, screen, "GLX_ARB_framebuffer_sRGB");
+ SF_GLAD_GLX_ARB_multisample = glad_glx_has_extension(display, screen, "GLX_ARB_multisample");
+ SF_GLAD_GLX_EXT_framebuffer_sRGB = glad_glx_has_extension(display, screen, "GLX_EXT_framebuffer_sRGB");
+ SF_GLAD_GLX_EXT_swap_control = glad_glx_has_extension(display, screen, "GLX_EXT_swap_control");
+ SF_GLAD_GLX_MESA_swap_control = glad_glx_has_extension(display, screen, "GLX_MESA_swap_control");
+ SF_GLAD_GLX_SGIX_pbuffer = glad_glx_has_extension(display, screen, "GLX_SGIX_pbuffer");
+ SF_GLAD_GLX_SGI_swap_control = glad_glx_has_extension(display, screen, "GLX_SGI_swap_control");
+ return 1;
+}
+
+static int glad_glx_find_core_glx(Display **display, int *screen) {
+ int major = 0, minor = 0;
+ if(*display == NULL) {
+#ifdef SF_GLAD_GLX_NO_X11
+ (void) screen;
+ return 0;
+#else
+ *display = XOpenDisplay(0);
+ if (*display == NULL) {
+ return 0;
+ }
+ *screen = XScreenNumberOfScreen(XDefaultScreenOfDisplay(*display));
+#endif
+ }
+ glXQueryVersion(*display, &major, &minor);
+ SF_GLAD_GLX_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
+ SF_GLAD_GLX_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;
+ SF_GLAD_GLX_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1;
+ SF_GLAD_GLX_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1;
+ SF_GLAD_GLX_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1;
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+static int gladLoadGLXUserPtr(Display *display, int screen, GLADuserptrloadfunc load, void *userptr) {
+ int version;
+ glXQueryVersion = (PFNGLXQUERYVERSIONPROC) load(userptr, "glXQueryVersion");
+ if(glXQueryVersion == NULL) return 0;
+ version = glad_glx_find_core_glx(&display, &screen);
+
+ glad_glx_load_GLX_VERSION_1_0(load, userptr);
+ glad_glx_load_GLX_VERSION_1_1(load, userptr);
+ glad_glx_load_GLX_VERSION_1_2(load, userptr);
+ glad_glx_load_GLX_VERSION_1_3(load, userptr);
+ glad_glx_load_GLX_VERSION_1_4(load, userptr);
+
+ if (!glad_glx_find_extensions(display, screen)) return 0;
+ glad_glx_load_GLX_ARB_create_context(load, userptr);
+ glad_glx_load_GLX_EXT_swap_control(load, userptr);
+ glad_glx_load_GLX_MESA_swap_control(load, userptr);
+ glad_glx_load_GLX_SGIX_pbuffer(load, userptr);
+ glad_glx_load_GLX_SGI_swap_control(load, userptr);
+
+ return version;
+}
+
+static int gladLoadGLX(Display *display, int screen, GLADloadfunc load) {
+ return gladLoadGLXUserPtr(display, screen, glad_glx_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+
+
+#ifdef SF_GLAD_GLX
+
+#ifndef GLAD_LOADER_LIBRARY_C_
+#define GLAD_LOADER_LIBRARY_C_
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#if GLAD_PLATFORM_WIN32
+#include <windows.h>
+#else
+#include <dlfcn.h>
+#endif
+
+
+static void* glad_get_dlopen_handle(const char *lib_names[], int length) {
+ void *handle = NULL;
+ int i;
+
+ for (i = 0; i < length; ++i) {
+#if GLAD_PLATFORM_WIN32
+ #if GLAD_PLATFORM_UWP
+ size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR);
+ LPWSTR buffer = (LPWSTR) malloc(buffer_size);
+ if (buffer != NULL) {
+ int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size);
+ if (ret != 0) {
+ handle = (void*) LoadPackagedLibrary(buffer, 0);
+ }
+ free((void*) buffer);
+ }
+ #else
+ handle = (void*) LoadLibraryA(lib_names[i]);
+ #endif
+#else
+ handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL);
+#endif
+ if (handle != NULL) {
+ return handle;
+ }
+ }
+
+ return NULL;
+}
+
+static void glad_close_dlopen_handle(void* handle) {
+ if (handle != NULL) {
+#if GLAD_PLATFORM_WIN32
+ FreeLibrary((HMODULE) handle);
+#else
+ dlclose(handle);
+#endif
+ }
+}
+
+static GLADapiproc glad_dlsym_handle(void* handle, const char *name) {
+ if (handle == NULL) {
+ return NULL;
+ }
+
+#if GLAD_PLATFORM_WIN32
+ return (GLADapiproc) GetProcAddress((HMODULE) handle, name);
+#else
+ return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name);
+#endif
+}
+
+#endif /* GLAD_LOADER_LIBRARY_C_ */
+
+typedef void* (GLAD_API_PTR *GLADglxprocaddrfunc)(const char*);
+
+static GLADapiproc glad_glx_get_proc(void *userptr, const char *name) {
+ return GLAD_GNUC_EXTENSION ((GLADapiproc (*)(const char *name)) userptr)(name);
+}
+
+static void* _glx_handle;
+
+static void* glad_glx_dlopen_handle(void) {
+ static const char *NAMES[] = {
+#if defined __CYGWIN__
+ "libGL-1.so",
+#endif
+ "libGL.so.1",
+ "libGL.so"
+ };
+
+ if (_glx_handle == NULL) {
+ _glx_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0]));
+ }
+
+ return _glx_handle;
+}
+
+static void gladLoaderUnloadGLX() {
+ if (_glx_handle != NULL) {
+ glad_close_dlopen_handle(_glx_handle);
+ _glx_handle = NULL;
+ }
+}
+
+static int gladLoaderLoadGLX(Display *display, int screen) {
+ int version = 0;
+ void *handle = NULL;
+ int did_load = 0;
+ GLADglxprocaddrfunc loader;
+
+ did_load = _glx_handle == NULL;
+ handle = glad_glx_dlopen_handle();
+ if (handle != NULL) {
+ loader = (GLADglxprocaddrfunc) glad_dlsym_handle(handle, "glXGetProcAddressARB");
+ if (loader != NULL) {
+ version = gladLoadGLXUserPtr(display, screen, glad_glx_get_proc, GLAD_GNUC_EXTENSION (void*) loader);
+ }
+
+ if (!version && did_load) {
+ gladLoaderUnloadGLX();
+ }
+ }
+
+ return version;
+}
+
+#endif /* SF_GLAD_GLX */
+
+#endif /* SF_GLAD_GLX_IMPLEMENTATION */
+
diff --git a/extlibs/headers/glad/include/glad/wgl.h b/extlibs/headers/glad/include/glad/wgl.h
new file mode 100644
index 0000000..2c443ac
--- /dev/null
+++ b/extlibs/headers/glad/include/glad/wgl.h
@@ -0,0 +1,572 @@
+/**
+ * Loader generated by glad 2.0.0-beta on Wed Jul 17 02:23:29 2019
+ *
+ * Generator: C/C++
+ * Specification: wgl
+ * Extensions: 10
+ *
+ * APIs:
+ * - wgl=1.0
+ *
+ * Options:
+ * - MX_GLOBAL = False
+ * - ON_DEMAND = False
+ * - LOADER = True
+ * - ALIAS = True
+ * - HEADER_ONLY = True
+ * - DEBUG = False
+ * - MX = False
+ *
+ * Commandline:
+ * --api='wgl=1.0' --extensions='WGL_ARB_create_context,WGL_ARB_create_context_profile,WGL_ARB_extensions_string,WGL_ARB_framebuffer_sRGB,WGL_ARB_multisample,WGL_ARB_pbuffer,WGL_ARB_pixel_format,WGL_EXT_extensions_string,WGL_EXT_framebuffer_sRGB,WGL_EXT_swap_control' c --loader --alias --header-only
+ *
+ * Online:
+ * http://glad.sh/#api=wgl%3D1.0&extensions=WGL_ARB_create_context%2CWGL_ARB_create_context_profile%2CWGL_ARB_extensions_string%2CWGL_ARB_framebuffer_sRGB%2CWGL_ARB_multisample%2CWGL_ARB_pbuffer%2CWGL_ARB_pixel_format%2CWGL_EXT_extensions_string%2CWGL_EXT_framebuffer_sRGB%2CWGL_EXT_swap_control&generator=c&options=LOADER%2CALIAS%2CHEADER_ONLY
+ *
+ */
+
+#ifndef SF_GLAD_WGL_H_
+#define SF_GLAD_WGL_H_
+
+#include <windows.h>
+#include <glad/gl.h>
+
+#define SF_GLAD_WGL
+#define GLAD_OPTION_WGL_LOADER
+#define GLAD_OPTION_WGL_ALIAS
+#define GLAD_OPTION_WGL_HEADER_ONLY
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef GLAD_PLATFORM_H_
+#define GLAD_PLATFORM_H_
+
+#ifndef GLAD_PLATFORM_WIN32
+ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)
+ #define GLAD_PLATFORM_WIN32 1
+ #else
+ #define GLAD_PLATFORM_WIN32 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_APPLE
+ #ifdef __APPLE__
+ #define GLAD_PLATFORM_APPLE 1
+ #else
+ #define GLAD_PLATFORM_APPLE 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_EMSCRIPTEN
+ #ifdef __EMSCRIPTEN__
+ #define GLAD_PLATFORM_EMSCRIPTEN 1
+ #else
+ #define GLAD_PLATFORM_EMSCRIPTEN 0
+ #endif
+#endif
+
+#ifndef GLAD_PLATFORM_UWP
+ #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY)
+ #ifdef __has_include
+ #if __has_include(<winapifamily.h>)
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_
+ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1
+ #endif
+ #endif
+
+ #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY
+ #include <winapifamily.h>
+ #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ #define GLAD_PLATFORM_UWP 1
+ #endif
+ #endif
+
+ #ifndef GLAD_PLATFORM_UWP
+ #define GLAD_PLATFORM_UWP 0
+ #endif
+#endif
+
+#ifdef __GNUC__
+ #define GLAD_GNUC_EXTENSION __extension__
+#else
+ #define GLAD_GNUC_EXTENSION
+#endif
+
+#ifndef GLAD_API_CALL
+ #if defined(GLAD_API_CALL_EXPORT)
+ #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__)
+ #if defined(GLAD_API_CALL_EXPORT_BUILD)
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllexport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllexport) extern
+ #endif
+ #else
+ #if defined(__GNUC__)
+ #define GLAD_API_CALL __attribute__ ((dllimport)) extern
+ #else
+ #define GLAD_API_CALL __declspec(dllimport) extern
+ #endif
+ #endif
+ #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD)
+ #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+ #else
+ #define GLAD_API_CALL extern
+ #endif
+#endif
+
+#ifdef APIENTRY
+ #define GLAD_API_PTR APIENTRY
+#elif GLAD_PLATFORM_WIN32
+ #define GLAD_API_PTR __stdcall
+#else
+ #define GLAD_API_PTR
+#endif
+
+#ifndef GLAPI
+#define GLAPI GLAD_API_CALL
+#endif
+
+#ifndef GLAPIENTRY
+#define GLAPIENTRY GLAD_API_PTR
+#endif
+
+#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor)
+#define GLAD_VERSION_MAJOR(version) (version / 10000)
+#define GLAD_VERSION_MINOR(version) (version % 10000)
+
+#define GLAD_GENERATOR_VERSION "2.0.0-beta"
+
+typedef void (*GLADapiproc)(void);
+
+typedef GLADapiproc (*GLADloadfunc)(const char *name);
+typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name);
+
+typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...);
+typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...);
+
+#endif /* GLAD_PLATFORM_H_ */
+
+#define ERROR_INVALID_PROFILE_ARB 0x2096
+#define ERROR_INVALID_VERSION_ARB 0x2095
+#define WGL_ACCELERATION_ARB 0x2003
+#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
+#define WGL_ACCUM_BITS_ARB 0x201D
+#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
+#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
+#define WGL_ACCUM_RED_BITS_ARB 0x201E
+#define WGL_ALPHA_BITS_ARB 0x201B
+#define WGL_ALPHA_SHIFT_ARB 0x201C
+#define WGL_AUX_BUFFERS_ARB 0x2024
+#define WGL_BLUE_BITS_ARB 0x2019
+#define WGL_BLUE_SHIFT_ARB 0x201A
+#define WGL_COLOR_BITS_ARB 0x2014
+#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001
+#define WGL_CONTEXT_FLAGS_ARB 0x2094
+#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
+#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
+#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
+#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
+#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
+#define WGL_DEPTH_BITS_ARB 0x2022
+#define WGL_DOUBLE_BUFFER_ARB 0x2011
+#define WGL_DRAW_TO_BITMAP_ARB 0x2002
+#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
+#define WGL_DRAW_TO_WINDOW_ARB 0x2001
+#define WGL_FONT_LINES 0
+#define WGL_FONT_POLYGONS 1
+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9
+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9
+#define WGL_FULL_ACCELERATION_ARB 0x2027
+#define WGL_GENERIC_ACCELERATION_ARB 0x2026
+#define WGL_GREEN_BITS_ARB 0x2017
+#define WGL_GREEN_SHIFT_ARB 0x2018
+#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
+#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
+#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
+#define WGL_NEED_PALETTE_ARB 0x2004
+#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
+#define WGL_NO_ACCELERATION_ARB 0x2025
+#define WGL_NUMBER_OVERLAYS_ARB 0x2008
+#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
+#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
+#define WGL_PBUFFER_HEIGHT_ARB 0x2035
+#define WGL_PBUFFER_LARGEST_ARB 0x2033
+#define WGL_PBUFFER_LOST_ARB 0x2036
+#define WGL_PBUFFER_WIDTH_ARB 0x2034
+#define WGL_PIXEL_TYPE_ARB 0x2013
+#define WGL_RED_BITS_ARB 0x2015
+#define WGL_RED_SHIFT_ARB 0x2016
+#define WGL_SAMPLES_ARB 0x2042
+#define WGL_SAMPLE_BUFFERS_ARB 0x2041
+#define WGL_SHARE_ACCUM_ARB 0x200E
+#define WGL_SHARE_DEPTH_ARB 0x200C
+#define WGL_SHARE_STENCIL_ARB 0x200D
+#define WGL_STENCIL_BITS_ARB 0x2023
+#define WGL_STEREO_ARB 0x2012
+#define WGL_SUPPORT_GDI_ARB 0x200F
+#define WGL_SUPPORT_OPENGL_ARB 0x2010
+#define WGL_SWAP_COPY_ARB 0x2029
+#define WGL_SWAP_EXCHANGE_ARB 0x2028
+#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
+#define WGL_SWAP_MAIN_PLANE 0x00000001
+#define WGL_SWAP_METHOD_ARB 0x2007
+#define WGL_SWAP_OVERLAY1 0x00000002
+#define WGL_SWAP_OVERLAY10 0x00000400
+#define WGL_SWAP_OVERLAY11 0x00000800
+#define WGL_SWAP_OVERLAY12 0x00001000
+#define WGL_SWAP_OVERLAY13 0x00002000
+#define WGL_SWAP_OVERLAY14 0x00004000
+#define WGL_SWAP_OVERLAY15 0x00008000
+#define WGL_SWAP_OVERLAY2 0x00000004
+#define WGL_SWAP_OVERLAY3 0x00000008
+#define WGL_SWAP_OVERLAY4 0x00000010
+#define WGL_SWAP_OVERLAY5 0x00000020
+#define WGL_SWAP_OVERLAY6 0x00000040
+#define WGL_SWAP_OVERLAY7 0x00000080
+#define WGL_SWAP_OVERLAY8 0x00000100
+#define WGL_SWAP_OVERLAY9 0x00000200
+#define WGL_SWAP_UNDEFINED_ARB 0x202A
+#define WGL_SWAP_UNDERLAY1 0x00010000
+#define WGL_SWAP_UNDERLAY10 0x02000000
+#define WGL_SWAP_UNDERLAY11 0x04000000
+#define WGL_SWAP_UNDERLAY12 0x08000000
+#define WGL_SWAP_UNDERLAY13 0x10000000
+#define WGL_SWAP_UNDERLAY14 0x20000000
+#define WGL_SWAP_UNDERLAY15 0x40000000
+#define WGL_SWAP_UNDERLAY2 0x00020000
+#define WGL_SWAP_UNDERLAY3 0x00040000
+#define WGL_SWAP_UNDERLAY4 0x00080000
+#define WGL_SWAP_UNDERLAY5 0x00100000
+#define WGL_SWAP_UNDERLAY6 0x00200000
+#define WGL_SWAP_UNDERLAY7 0x00400000
+#define WGL_SWAP_UNDERLAY8 0x00800000
+#define WGL_SWAP_UNDERLAY9 0x01000000
+#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
+#define WGL_TRANSPARENT_ARB 0x200A
+#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
+#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
+#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
+#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
+#define WGL_TYPE_COLORINDEX_ARB 0x202C
+#define WGL_TYPE_RGBA_ARB 0x202B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct _GPU_DEVICE {
+ DWORD cb;
+ CHAR DeviceName[32];
+ CHAR DeviceString[128];
+ DWORD Flags;
+ RECT rcVirtualScreen;
+};
+DECLARE_HANDLE(HPBUFFERARB);
+DECLARE_HANDLE(HPBUFFEREXT);
+DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);
+DECLARE_HANDLE(HPVIDEODEV);
+DECLARE_HANDLE(HPGPUNV);
+DECLARE_HANDLE(HGPUNV);
+DECLARE_HANDLE(HVIDEOINPUTDEVICENV);
+typedef struct _GPU_DEVICE GPU_DEVICE;
+typedef struct _GPU_DEVICE *PGPU_DEVICE;
+
+
+#define WGL_VERSION_1_0 1
+GLAD_API_CALL int SF_GLAD_WGL_VERSION_1_0;
+#define WGL_ARB_create_context 1
+GLAD_API_CALL int SF_GLAD_WGL_ARB_create_context;
+#define WGL_ARB_create_context_profile 1
+GLAD_API_CALL int SF_GLAD_WGL_ARB_create_context_profile;
+#define WGL_ARB_extensions_string 1
+GLAD_API_CALL int SF_GLAD_WGL_ARB_extensions_string;
+#define WGL_ARB_framebuffer_sRGB 1
+GLAD_API_CALL int SF_GLAD_WGL_ARB_framebuffer_sRGB;
+#define WGL_ARB_multisample 1
+GLAD_API_CALL int SF_GLAD_WGL_ARB_multisample;
+#define WGL_ARB_pbuffer 1
+GLAD_API_CALL int SF_GLAD_WGL_ARB_pbuffer;
+#define WGL_ARB_pixel_format 1
+GLAD_API_CALL int SF_GLAD_WGL_ARB_pixel_format;
+#define WGL_EXT_extensions_string 1
+GLAD_API_CALL int SF_GLAD_WGL_EXT_extensions_string;
+#define WGL_EXT_framebuffer_sRGB 1
+GLAD_API_CALL int SF_GLAD_WGL_EXT_framebuffer_sRGB;
+#define WGL_EXT_swap_control 1
+GLAD_API_CALL int SF_GLAD_WGL_EXT_swap_control;
+
+
+typedef int (GLAD_API_PTR *PFNCHOOSEPIXELFORMATPROC)(HDC hDc, const PIXELFORMATDESCRIPTOR * pPfd);
+typedef int (GLAD_API_PTR *PFNDESCRIBEPIXELFORMATPROC)(HDC hdc, int ipfd, UINT cjpfd, const PIXELFORMATDESCRIPTOR * ppfd);
+typedef UINT (GLAD_API_PTR *PFNGETENHMETAFILEPIXELFORMATPROC)(HENHMETAFILE hemf, const PIXELFORMATDESCRIPTOR * ppfd);
+typedef int (GLAD_API_PTR *PFNGETPIXELFORMATPROC)(HDC hdc);
+typedef BOOL (GLAD_API_PTR *PFNSETPIXELFORMATPROC)(HDC hdc, int ipfd, const PIXELFORMATDESCRIPTOR * ppfd);
+typedef BOOL (GLAD_API_PTR *PFNSWAPBUFFERSPROC)(HDC hdc);
+typedef BOOL (GLAD_API_PTR *PFNWGLCHOOSEPIXELFORMATARBPROC)(HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats);
+typedef BOOL (GLAD_API_PTR *PFNWGLCOPYCONTEXTPROC)(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask);
+typedef HGLRC (GLAD_API_PTR *PFNWGLCREATECONTEXTPROC)(HDC hDc);
+typedef HGLRC (GLAD_API_PTR *PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC hDC, HGLRC hShareContext, const int * attribList);
+typedef HGLRC (GLAD_API_PTR *PFNWGLCREATELAYERCONTEXTPROC)(HDC hDc, int level);
+typedef HPBUFFERARB (GLAD_API_PTR *PFNWGLCREATEPBUFFERARBPROC)(HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList);
+typedef BOOL (GLAD_API_PTR *PFNWGLDELETECONTEXTPROC)(HGLRC oldContext);
+typedef BOOL (GLAD_API_PTR *PFNWGLDESCRIBELAYERPLANEPROC)(HDC hDc, int pixelFormat, int layerPlane, UINT nBytes, const LAYERPLANEDESCRIPTOR * plpd);
+typedef BOOL (GLAD_API_PTR *PFNWGLDESTROYPBUFFERARBPROC)(HPBUFFERARB hPbuffer);
+typedef HGLRC (GLAD_API_PTR *PFNWGLGETCURRENTCONTEXTPROC)(void);
+typedef HDC (GLAD_API_PTR *PFNWGLGETCURRENTDCPROC)(void);
+typedef const char * (GLAD_API_PTR *PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc);
+typedef const char * (GLAD_API_PTR *PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void);
+typedef int (GLAD_API_PTR *PFNWGLGETLAYERPALETTEENTRIESPROC)(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF * pcr);
+typedef HDC (GLAD_API_PTR *PFNWGLGETPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer);
+typedef BOOL (GLAD_API_PTR *PFNWGLGETPIXELFORMATATTRIBFVARBPROC)(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, FLOAT * pfValues);
+typedef BOOL (GLAD_API_PTR *PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, int * piValues);
+typedef PROC (GLAD_API_PTR *PFNWGLGETPROCADDRESSPROC)(LPCSTR lpszProc);
+typedef int (GLAD_API_PTR *PFNWGLGETSWAPINTERVALEXTPROC)(void);
+typedef BOOL (GLAD_API_PTR *PFNWGLMAKECURRENTPROC)(HDC hDc, HGLRC newContext);
+typedef BOOL (GLAD_API_PTR *PFNWGLQUERYPBUFFERARBPROC)(HPBUFFERARB hPbuffer, int iAttribute, int * piValue);
+typedef BOOL (GLAD_API_PTR *PFNWGLREALIZELAYERPALETTEPROC)(HDC hdc, int iLayerPlane, BOOL bRealize);
+typedef int (GLAD_API_PTR *PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer, HDC hDC);
+typedef int (GLAD_API_PTR *PFNWGLSETLAYERPALETTEENTRIESPROC)(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF * pcr);
+typedef BOOL (GLAD_API_PTR *PFNWGLSHARELISTSPROC)(HGLRC hrcSrvShare, HGLRC hrcSrvSource);
+typedef BOOL (GLAD_API_PTR *PFNWGLSWAPINTERVALEXTPROC)(int interval);
+typedef BOOL (GLAD_API_PTR *PFNWGLSWAPLAYERBUFFERSPROC)(HDC hdc, UINT fuFlags);
+typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTBITMAPSPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase);
+typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTBITMAPSAPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase);
+typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTBITMAPSWPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase);
+typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTOUTLINESPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf);
+typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTOUTLINESAPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf);
+typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTOUTLINESWPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf);
+
+GLAD_API_CALL PFNWGLCHOOSEPIXELFORMATARBPROC sf_glad_wglChoosePixelFormatARB;
+#define wglChoosePixelFormatARB sf_glad_wglChoosePixelFormatARB
+GLAD_API_CALL PFNWGLCREATECONTEXTATTRIBSARBPROC sf_glad_wglCreateContextAttribsARB;
+#define wglCreateContextAttribsARB sf_glad_wglCreateContextAttribsARB
+GLAD_API_CALL PFNWGLCREATEPBUFFERARBPROC sf_glad_wglCreatePbufferARB;
+#define wglCreatePbufferARB sf_glad_wglCreatePbufferARB
+GLAD_API_CALL PFNWGLDESTROYPBUFFERARBPROC sf_glad_wglDestroyPbufferARB;
+#define wglDestroyPbufferARB sf_glad_wglDestroyPbufferARB
+GLAD_API_CALL PFNWGLGETEXTENSIONSSTRINGARBPROC sf_glad_wglGetExtensionsStringARB;
+#define wglGetExtensionsStringARB sf_glad_wglGetExtensionsStringARB
+GLAD_API_CALL PFNWGLGETEXTENSIONSSTRINGEXTPROC sf_glad_wglGetExtensionsStringEXT;
+#define wglGetExtensionsStringEXT sf_glad_wglGetExtensionsStringEXT
+GLAD_API_CALL PFNWGLGETPBUFFERDCARBPROC sf_glad_wglGetPbufferDCARB;
+#define wglGetPbufferDCARB sf_glad_wglGetPbufferDCARB
+GLAD_API_CALL PFNWGLGETPIXELFORMATATTRIBFVARBPROC sf_glad_wglGetPixelFormatAttribfvARB;
+#define wglGetPixelFormatAttribfvARB sf_glad_wglGetPixelFormatAttribfvARB
+GLAD_API_CALL PFNWGLGETPIXELFORMATATTRIBIVARBPROC sf_glad_wglGetPixelFormatAttribivARB;
+#define wglGetPixelFormatAttribivARB sf_glad_wglGetPixelFormatAttribivARB
+GLAD_API_CALL PFNWGLGETSWAPINTERVALEXTPROC sf_glad_wglGetSwapIntervalEXT;
+#define wglGetSwapIntervalEXT sf_glad_wglGetSwapIntervalEXT
+GLAD_API_CALL PFNWGLQUERYPBUFFERARBPROC sf_glad_wglQueryPbufferARB;
+#define wglQueryPbufferARB sf_glad_wglQueryPbufferARB
+GLAD_API_CALL PFNWGLRELEASEPBUFFERDCARBPROC sf_glad_wglReleasePbufferDCARB;
+#define wglReleasePbufferDCARB sf_glad_wglReleasePbufferDCARB
+GLAD_API_CALL PFNWGLSWAPINTERVALEXTPROC sf_glad_wglSwapIntervalEXT;
+#define wglSwapIntervalEXT sf_glad_wglSwapIntervalEXT
+
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Source */
+#ifdef SF_GLAD_WGL_IMPLEMENTATION
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef GLAD_IMPL_UTIL_C_
+#define GLAD_IMPL_UTIL_C_
+
+#ifdef _MSC_VER
+#define GLAD_IMPL_UTIL_SSCANF sscanf_s
+#else
+#define GLAD_IMPL_UTIL_SSCANF sscanf
+#endif
+
+#endif /* GLAD_IMPL_UTIL_C_ */
+
+
+int SF_GLAD_WGL_VERSION_1_0 = 0;
+int SF_GLAD_WGL_ARB_create_context = 0;
+int SF_GLAD_WGL_ARB_create_context_profile = 0;
+int SF_GLAD_WGL_ARB_extensions_string = 0;
+int SF_GLAD_WGL_ARB_framebuffer_sRGB = 0;
+int SF_GLAD_WGL_ARB_multisample = 0;
+int SF_GLAD_WGL_ARB_pbuffer = 0;
+int SF_GLAD_WGL_ARB_pixel_format = 0;
+int SF_GLAD_WGL_EXT_extensions_string = 0;
+int SF_GLAD_WGL_EXT_framebuffer_sRGB = 0;
+int SF_GLAD_WGL_EXT_swap_control = 0;
+
+
+
+PFNWGLCHOOSEPIXELFORMATARBPROC sf_glad_wglChoosePixelFormatARB = NULL;
+PFNWGLCREATECONTEXTATTRIBSARBPROC sf_glad_wglCreateContextAttribsARB = NULL;
+PFNWGLCREATEPBUFFERARBPROC sf_glad_wglCreatePbufferARB = NULL;
+PFNWGLDESTROYPBUFFERARBPROC sf_glad_wglDestroyPbufferARB = NULL;
+PFNWGLGETEXTENSIONSSTRINGARBPROC sf_glad_wglGetExtensionsStringARB = NULL;
+PFNWGLGETEXTENSIONSSTRINGEXTPROC sf_glad_wglGetExtensionsStringEXT = NULL;
+PFNWGLGETPBUFFERDCARBPROC sf_glad_wglGetPbufferDCARB = NULL;
+PFNWGLGETPIXELFORMATATTRIBFVARBPROC sf_glad_wglGetPixelFormatAttribfvARB = NULL;
+PFNWGLGETPIXELFORMATATTRIBIVARBPROC sf_glad_wglGetPixelFormatAttribivARB = NULL;
+PFNWGLGETSWAPINTERVALEXTPROC sf_glad_wglGetSwapIntervalEXT = NULL;
+PFNWGLQUERYPBUFFERARBPROC sf_glad_wglQueryPbufferARB = NULL;
+PFNWGLRELEASEPBUFFERDCARBPROC sf_glad_wglReleasePbufferDCARB = NULL;
+PFNWGLSWAPINTERVALEXTPROC sf_glad_wglSwapIntervalEXT = NULL;
+
+
+static void sf_glad_wgl_load_WGL_ARB_create_context(GLADuserptrloadfunc load, void *userptr) {
+ if(!SF_GLAD_WGL_ARB_create_context) return;
+ sf_glad_wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) load(userptr, "wglCreateContextAttribsARB");
+}
+static void sf_glad_wgl_load_WGL_ARB_extensions_string(GLADuserptrloadfunc load, void *userptr) {
+ if(!SF_GLAD_WGL_ARB_extensions_string) return;
+ sf_glad_wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) load(userptr, "wglGetExtensionsStringARB");
+}
+static void sf_glad_wgl_load_WGL_ARB_pbuffer(GLADuserptrloadfunc load, void *userptr) {
+ if(!SF_GLAD_WGL_ARB_pbuffer) return;
+ sf_glad_wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC) load(userptr, "wglCreatePbufferARB");
+ sf_glad_wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC) load(userptr, "wglDestroyPbufferARB");
+ sf_glad_wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC) load(userptr, "wglGetPbufferDCARB");
+ sf_glad_wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC) load(userptr, "wglQueryPbufferARB");
+ sf_glad_wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC) load(userptr, "wglReleasePbufferDCARB");
+}
+static void sf_glad_wgl_load_WGL_ARB_pixel_format(GLADuserptrloadfunc load, void *userptr) {
+ if(!SF_GLAD_WGL_ARB_pixel_format) return;
+ sf_glad_wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC) load(userptr, "wglChoosePixelFormatARB");
+ sf_glad_wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC) load(userptr, "wglGetPixelFormatAttribfvARB");
+ sf_glad_wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC) load(userptr, "wglGetPixelFormatAttribivARB");
+}
+static void sf_glad_wgl_load_WGL_EXT_extensions_string(GLADuserptrloadfunc load, void *userptr) {
+ if(!SF_GLAD_WGL_EXT_extensions_string) return;
+ sf_glad_wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) load(userptr, "wglGetExtensionsStringEXT");
+}
+static void sf_glad_wgl_load_WGL_EXT_swap_control(GLADuserptrloadfunc load, void *userptr) {
+ if(!SF_GLAD_WGL_EXT_swap_control) return;
+ sf_glad_wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) load(userptr, "wglGetSwapIntervalEXT");
+ sf_glad_wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) load(userptr, "wglSwapIntervalEXT");
+}
+
+static int sf_glad_wgl_has_extension(HDC hdc, const char *ext) {
+ const char *terminator;
+ const char *loc;
+ const char *extensions;
+
+ if(wglGetExtensionsStringEXT == NULL && wglGetExtensionsStringARB == NULL)
+ return 0;
+
+ if(wglGetExtensionsStringARB == NULL || hdc == INVALID_HANDLE_VALUE)
+ extensions = wglGetExtensionsStringEXT();
+ else
+ extensions = wglGetExtensionsStringARB(hdc);
+
+ if(extensions == NULL || ext == NULL)
+ return 0;
+
+ while(1) {
+ loc = strstr(extensions, ext);
+ if(loc == NULL)
+ break;
+
+ terminator = loc + strlen(ext);
+ if((loc == extensions || *(loc - 1) == ' ') &&
+ (*terminator == ' ' || *terminator == '\0'))
+ {
+ return 1;
+ }
+ extensions = terminator;
+ }
+
+ return 0;
+}
+
+static GLADapiproc sf_glad_wgl_get_proc_from_userptr(void *userptr, const char* name) {
+ return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);
+}
+
+static int sf_glad_wgl_find_extensions_wgl(HDC hdc) {
+ SF_GLAD_WGL_ARB_create_context = sf_glad_wgl_has_extension(hdc, "WGL_ARB_create_context");
+ SF_GLAD_WGL_ARB_create_context_profile = sf_glad_wgl_has_extension(hdc, "WGL_ARB_create_context_profile");
+ SF_GLAD_WGL_ARB_extensions_string = sf_glad_wgl_has_extension(hdc, "WGL_ARB_extensions_string");
+ SF_GLAD_WGL_ARB_framebuffer_sRGB = sf_glad_wgl_has_extension(hdc, "WGL_ARB_framebuffer_sRGB");
+ SF_GLAD_WGL_ARB_multisample = sf_glad_wgl_has_extension(hdc, "WGL_ARB_multisample");
+ SF_GLAD_WGL_ARB_pbuffer = sf_glad_wgl_has_extension(hdc, "WGL_ARB_pbuffer");
+ SF_GLAD_WGL_ARB_pixel_format = sf_glad_wgl_has_extension(hdc, "WGL_ARB_pixel_format");
+ SF_GLAD_WGL_EXT_extensions_string = sf_glad_wgl_has_extension(hdc, "WGL_EXT_extensions_string");
+ SF_GLAD_WGL_EXT_framebuffer_sRGB = sf_glad_wgl_has_extension(hdc, "WGL_EXT_framebuffer_sRGB");
+ SF_GLAD_WGL_EXT_swap_control = sf_glad_wgl_has_extension(hdc, "WGL_EXT_swap_control");
+ return 1;
+}
+
+static int sf_glad_wgl_find_core_wgl(void) {
+ int major = 1, minor = 0;
+ SF_GLAD_WGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
+ return GLAD_MAKE_VERSION(major, minor);
+}
+
+static int gladLoadWGLUserPtr(HDC hdc, GLADuserptrloadfunc load, void *userptr) {
+ int version;
+ wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) load(userptr, "wglGetExtensionsStringARB");
+ wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) load(userptr, "wglGetExtensionsStringEXT");
+ if(wglGetExtensionsStringARB == NULL && wglGetExtensionsStringEXT == NULL) return 0;
+ version = sf_glad_wgl_find_core_wgl();
+
+
+ if (!sf_glad_wgl_find_extensions_wgl(hdc)) return 0;
+ sf_glad_wgl_load_WGL_ARB_create_context(load, userptr);
+ sf_glad_wgl_load_WGL_ARB_extensions_string(load, userptr);
+ sf_glad_wgl_load_WGL_ARB_pbuffer(load, userptr);
+ sf_glad_wgl_load_WGL_ARB_pixel_format(load, userptr);
+ sf_glad_wgl_load_WGL_EXT_extensions_string(load, userptr);
+ sf_glad_wgl_load_WGL_EXT_swap_control(load, userptr);
+
+ return version;
+}
+
+static int gladLoadWGL(HDC hdc, GLADloadfunc load) {
+ return gladLoadWGLUserPtr(hdc, sf_glad_wgl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
+}
+
+#endif /* SF_GLAD_WGL_IMPLEMENTATION */
+
diff --git a/extlibs/headers/minimp3/minimp3.h b/extlibs/headers/minimp3/minimp3.h
new file mode 100644
index 0000000..943f22e
--- /dev/null
+++ b/extlibs/headers/minimp3/minimp3.h
@@ -0,0 +1,1855 @@
+#ifndef MINIMP3_H
+#define MINIMP3_H
+/*
+ https://github.com/lieff/minimp3
+ To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide.
+ This software is distributed without any warranty.
+ See <http://creativecommons.org/publicdomain/zero/1.0/>.
+*/
+#include <stdint.h>
+
+#define MINIMP3_MAX_SAMPLES_PER_FRAME (1152*2)
+
+typedef struct
+{
+ int frame_bytes, frame_offset, channels, hz, layer, bitrate_kbps;
+} mp3dec_frame_info_t;
+
+typedef struct
+{
+ float mdct_overlap[2][9*32], qmf_state[15*2*32];
+ int reserv, free_format_bytes;
+ unsigned char header[4], reserv_buf[511];
+} mp3dec_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+void mp3dec_init(mp3dec_t *dec);
+#ifndef MINIMP3_FLOAT_OUTPUT
+typedef int16_t mp3d_sample_t;
+#else /* MINIMP3_FLOAT_OUTPUT */
+typedef float mp3d_sample_t;
+void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples);
+#endif /* MINIMP3_FLOAT_OUTPUT */
+int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* MINIMP3_H */
+#if defined(MINIMP3_IMPLEMENTATION) && !defined(_MINIMP3_IMPLEMENTATION_GUARD)
+#define _MINIMP3_IMPLEMENTATION_GUARD
+
+#include <stdlib.h>
+#include <string.h>
+
+#define MAX_FREE_FORMAT_FRAME_SIZE 2304 /* more than ISO spec's */
+#ifndef MAX_FRAME_SYNC_MATCHES
+#define MAX_FRAME_SYNC_MATCHES 10
+#endif /* MAX_FRAME_SYNC_MATCHES */
+
+#define MAX_L3_FRAME_PAYLOAD_BYTES MAX_FREE_FORMAT_FRAME_SIZE /* MUST be >= 320000/8/32000*1152 = 1440 */
+
+#define MAX_BITRESERVOIR_BYTES 511
+#define SHORT_BLOCK_TYPE 2
+#define STOP_BLOCK_TYPE 3
+#define MODE_MONO 3
+#define MODE_JOINT_STEREO 1
+#define HDR_SIZE 4
+#define HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0)
+#define HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60)
+#define HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0)
+#define HDR_IS_CRC(h) (!((h[1]) & 1))
+#define HDR_TEST_PADDING(h) ((h[2]) & 0x2)
+#define HDR_TEST_MPEG1(h) ((h[1]) & 0x8)
+#define HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10)
+#define HDR_TEST_I_STEREO(h) ((h[3]) & 0x10)
+#define HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20)
+#define HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3)
+#define HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3)
+#define HDR_GET_LAYER(h) (((h[1]) >> 1) & 3)
+#define HDR_GET_BITRATE(h) ((h[2]) >> 4)
+#define HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3)
+#define HDR_GET_MY_SAMPLE_RATE(h) (HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3)
+#define HDR_IS_FRAME_576(h) ((h[1] & 14) == 2)
+#define HDR_IS_LAYER_1(h) ((h[1] & 6) == 6)
+
+#define BITS_DEQUANTIZER_OUT -1
+#define MAX_SCF (255 + BITS_DEQUANTIZER_OUT*4 - 210)
+#define MAX_SCFI ((MAX_SCF + 3) & ~3)
+
+#define MINIMP3_MIN(a, b) ((a) > (b) ? (b) : (a))
+#define MINIMP3_MAX(a, b) ((a) < (b) ? (b) : (a))
+
+#if !defined(MINIMP3_NO_SIMD)
+
+#if !defined(MINIMP3_ONLY_SIMD) && (defined(_M_X64) || defined(__x86_64__) || defined(__aarch64__) || defined(_M_ARM64))
+/* x64 always have SSE2, arm64 always have neon, no need for generic code */
+#define MINIMP3_ONLY_SIMD
+#endif /* SIMD checks... */
+
+#if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__))
+#if defined(_MSC_VER)
+#include <intrin.h>
+#endif /* defined(_MSC_VER) */
+#include <immintrin.h>
+#define HAVE_SSE 1
+#define HAVE_SIMD 1
+#define VSTORE _mm_storeu_ps
+#define VLD _mm_loadu_ps
+#define VSET _mm_set1_ps
+#define VADD _mm_add_ps
+#define VSUB _mm_sub_ps
+#define VMUL _mm_mul_ps
+#define VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y))
+#define VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y))
+#define VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s))
+#define VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3))
+typedef __m128 f4;
+#if defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD)
+#define minimp3_cpuid __cpuid
+#else /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */
+static __inline__ __attribute__((always_inline)) void minimp3_cpuid(int CPUInfo[], const int InfoType)
+{
+#if defined(__PIC__)
+ __asm__ __volatile__(
+#if defined(__x86_64__)
+ "push %%rbx\n"
+ "cpuid\n"
+ "xchgl %%ebx, %1\n"
+ "pop %%rbx\n"
+#else /* defined(__x86_64__) */
+ "xchgl %%ebx, %1\n"
+ "cpuid\n"
+ "xchgl %%ebx, %1\n"
+#endif /* defined(__x86_64__) */
+ : "=a" (CPUInfo[0]), "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3])
+ : "a" (InfoType));
+#else /* defined(__PIC__) */
+ __asm__ __volatile__(
+ "cpuid"
+ : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3])
+ : "a" (InfoType));
+#endif /* defined(__PIC__)*/
+}
+#endif /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */
+static int have_simd(void)
+{
+#ifdef MINIMP3_ONLY_SIMD
+ return 1;
+#else /* MINIMP3_ONLY_SIMD */
+ static int g_have_simd;
+ int CPUInfo[4];
+#ifdef MINIMP3_TEST
+ static int g_counter;
+ if (g_counter++ > 100)
+ return 0;
+#endif /* MINIMP3_TEST */
+ if (g_have_simd)
+ goto end;
+ minimp3_cpuid(CPUInfo, 0);
+ g_have_simd = 1;
+ if (CPUInfo[0] > 0)
+ {
+ minimp3_cpuid(CPUInfo, 1);
+ g_have_simd = (CPUInfo[3] & (1 << 26)) + 1; /* SSE2 */
+ }
+end:
+ return g_have_simd - 1;
+#endif /* MINIMP3_ONLY_SIMD */
+}
+#elif defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)
+#include <arm_neon.h>
+#define HAVE_SSE 0
+#define HAVE_SIMD 1
+#define VSTORE vst1q_f32
+#define VLD vld1q_f32
+#define VSET vmovq_n_f32
+#define VADD vaddq_f32
+#define VSUB vsubq_f32
+#define VMUL vmulq_f32
+#define VMAC(a, x, y) vmlaq_f32(a, x, y)
+#define VMSB(a, x, y) vmlsq_f32(a, x, y)
+#define VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s))
+#define VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x)))
+typedef float32x4_t f4;
+static int have_simd()
+{ /* TODO: detect neon for !MINIMP3_ONLY_SIMD */
+ return 1;
+}
+#else /* SIMD checks... */
+#define HAVE_SSE 0
+#define HAVE_SIMD 0
+#ifdef MINIMP3_ONLY_SIMD
+#error MINIMP3_ONLY_SIMD used, but SSE/NEON not enabled
+#endif /* MINIMP3_ONLY_SIMD */
+#endif /* SIMD checks... */
+#else /* !defined(MINIMP3_NO_SIMD) */
+#define HAVE_SIMD 0
+#endif /* !defined(MINIMP3_NO_SIMD) */
+
+#if defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__aarch64__) && !defined(_M_ARM64)
+#define HAVE_ARMV6 1
+static __inline__ __attribute__((always_inline)) int32_t minimp3_clip_int16_arm(int32_t a)
+{
+ int32_t x = 0;
+ __asm__ ("ssat %0, #16, %1" : "=r"(x) : "r"(a));
+ return x;
+}
+#else
+#define HAVE_ARMV6 0
+#endif
+
+typedef struct
+{
+ const uint8_t *buf;
+ int pos, limit;
+} bs_t;
+
+typedef struct
+{
+ float scf[3*64];
+ uint8_t total_bands, stereo_bands, bitalloc[64], scfcod[64];
+} L12_scale_info;
+
+typedef struct
+{
+ uint8_t tab_offset, code_tab_width, band_count;
+} L12_subband_alloc_t;
+
+typedef struct
+{
+ const uint8_t *sfbtab;
+ uint16_t part_23_length, big_values, scalefac_compress;
+ uint8_t global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb;
+ uint8_t table_select[3], region_count[3], subblock_gain[3];
+ uint8_t preflag, scalefac_scale, count1_table, scfsi;
+} L3_gr_info_t;
+
+typedef struct
+{
+ bs_t bs;
+ uint8_t maindata[MAX_BITRESERVOIR_BYTES + MAX_L3_FRAME_PAYLOAD_BYTES];
+ L3_gr_info_t gr_info[4];
+ float grbuf[2][576], scf[40], syn[18 + 15][2*32];
+ uint8_t ist_pos[2][39];
+} mp3dec_scratch_t;
+
+static void bs_init(bs_t *bs, const uint8_t *data, int bytes)
+{
+ bs->buf = data;
+ bs->pos = 0;
+ bs->limit = bytes*8;
+}
+
+static uint32_t get_bits(bs_t *bs, int n)
+{
+ uint32_t next, cache = 0, s = bs->pos & 7;
+ int shl = n + s;
+ const uint8_t *p = bs->buf + (bs->pos >> 3);
+ if ((bs->pos += n) > bs->limit)
+ return 0;
+ next = *p++ & (255 >> s);
+ while ((shl -= 8) > 0)
+ {
+ cache |= next << shl;
+ next = *p++;
+ }
+ return cache | (next >> -shl);
+}
+
+static int hdr_valid(const uint8_t *h)
+{
+ return h[0] == 0xff &&
+ ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) &&
+ (HDR_GET_LAYER(h) != 0) &&
+ (HDR_GET_BITRATE(h) != 15) &&
+ (HDR_GET_SAMPLE_RATE(h) != 3);
+}
+
+static int hdr_compare(const uint8_t *h1, const uint8_t *h2)
+{
+ return hdr_valid(h2) &&
+ ((h1[1] ^ h2[1]) & 0xFE) == 0 &&
+ ((h1[2] ^ h2[2]) & 0x0C) == 0 &&
+ !(HDR_IS_FREE_FORMAT(h1) ^ HDR_IS_FREE_FORMAT(h2));
+}
+
+static unsigned hdr_bitrate_kbps(const uint8_t *h)
+{
+ static const uint8_t halfrate[2][3][15] = {
+ { { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 } },
+ { { 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 }, { 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 }, { 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 } },
+ };
+ return 2*halfrate[!!HDR_TEST_MPEG1(h)][HDR_GET_LAYER(h) - 1][HDR_GET_BITRATE(h)];
+}
+
+static unsigned hdr_sample_rate_hz(const uint8_t *h)
+{
+ static const unsigned g_hz[3] = { 44100, 48000, 32000 };
+ return g_hz[HDR_GET_SAMPLE_RATE(h)] >> (int)!HDR_TEST_MPEG1(h) >> (int)!HDR_TEST_NOT_MPEG25(h);
+}
+
+static unsigned hdr_frame_samples(const uint8_t *h)
+{
+ return HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)HDR_IS_FRAME_576(h));
+}
+
+static int hdr_frame_bytes(const uint8_t *h, int free_format_size)
+{
+ int frame_bytes = hdr_frame_samples(h)*hdr_bitrate_kbps(h)*125/hdr_sample_rate_hz(h);
+ if (HDR_IS_LAYER_1(h))
+ {
+ frame_bytes &= ~3; /* slot align */
+ }
+ return frame_bytes ? frame_bytes : free_format_size;
+}
+
+static int hdr_padding(const uint8_t *h)
+{
+ return HDR_TEST_PADDING(h) ? (HDR_IS_LAYER_1(h) ? 4 : 1) : 0;
+}
+
+#ifndef MINIMP3_ONLY_MP3
+static const L12_subband_alloc_t *L12_subband_alloc_table(const uint8_t *hdr, L12_scale_info *sci)
+{
+ const L12_subband_alloc_t *alloc;
+ int mode = HDR_GET_STEREO_MODE(hdr);
+ int nbands, stereo_bands = (mode == MODE_MONO) ? 0 : (mode == MODE_JOINT_STEREO) ? (HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32;
+
+ if (HDR_IS_LAYER_1(hdr))
+ {
+ static const L12_subband_alloc_t g_alloc_L1[] = { { 76, 4, 32 } };
+ alloc = g_alloc_L1;
+ nbands = 32;
+ } else if (!HDR_TEST_MPEG1(hdr))
+ {
+ static const L12_subband_alloc_t g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };
+ alloc = g_alloc_L2M2;
+ nbands = 30;
+ } else
+ {
+ static const L12_subband_alloc_t g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } };
+ int sample_rate_idx = HDR_GET_SAMPLE_RATE(hdr);
+ unsigned kbps = hdr_bitrate_kbps(hdr) >> (int)(mode != MODE_MONO);
+ if (!kbps) /* free-format */
+ {
+ kbps = 192;
+ }
+
+ alloc = g_alloc_L2M1;
+ nbands = 27;
+ if (kbps < 56)
+ {
+ static const L12_subband_alloc_t g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } };
+ alloc = g_alloc_L2M1_lowrate;
+ nbands = sample_rate_idx == 2 ? 12 : 8;
+ } else if (kbps >= 96 && sample_rate_idx != 1)
+ {
+ nbands = 30;
+ }
+ }
+
+ sci->total_bands = (uint8_t)nbands;
+ sci->stereo_bands = (uint8_t)MINIMP3_MIN(stereo_bands, nbands);
+
+ return alloc;
+}
+
+static void L12_read_scalefactors(bs_t *bs, uint8_t *pba, uint8_t *scfcod, int bands, float *scf)
+{
+ static const float g_deq_L12[18*3] = {
+#define DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x
+ DQ(3),DQ(7),DQ(15),DQ(31),DQ(63),DQ(127),DQ(255),DQ(511),DQ(1023),DQ(2047),DQ(4095),DQ(8191),DQ(16383),DQ(32767),DQ(65535),DQ(3),DQ(5),DQ(9)
+ };
+ int i, m;
+ for (i = 0; i < bands; i++)
+ {
+ float s = 0;
+ int ba = *pba++;
+ int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0;
+ for (m = 4; m; m >>= 1)
+ {
+ if (mask & m)
+ {
+ int b = get_bits(bs, 6);
+ s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3);
+ }
+ *scf++ = s;
+ }
+ }
+}
+
+static void L12_read_scale_info(const uint8_t *hdr, bs_t *bs, L12_scale_info *sci)
+{
+ static const uint8_t g_bitalloc_code_tab[] = {
+ 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,
+ 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16,
+ 0,17,18, 3,19,4,5,16,
+ 0,17,18,16,
+ 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15,
+ 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14,
+ 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16
+ };
+ const L12_subband_alloc_t *subband_alloc = L12_subband_alloc_table(hdr, sci);
+
+ int i, k = 0, ba_bits = 0;
+ const uint8_t *ba_code_tab = g_bitalloc_code_tab;
+
+ for (i = 0; i < sci->total_bands; i++)
+ {
+ uint8_t ba;
+ if (i == k)
+ {
+ k += subband_alloc->band_count;
+ ba_bits = subband_alloc->code_tab_width;
+ ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset;
+ subband_alloc++;
+ }
+ ba = ba_code_tab[get_bits(bs, ba_bits)];
+ sci->bitalloc[2*i] = ba;
+ if (i < sci->stereo_bands)
+ {
+ ba = ba_code_tab[get_bits(bs, ba_bits)];
+ }
+ sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0;
+ }
+
+ for (i = 0; i < 2*sci->total_bands; i++)
+ {
+ sci->scfcod[i] = sci->bitalloc[i] ? HDR_IS_LAYER_1(hdr) ? 2 : get_bits(bs, 2) : 6;
+ }
+
+ L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);
+
+ for (i = sci->stereo_bands; i < sci->total_bands; i++)
+ {
+ sci->bitalloc[2*i + 1] = 0;
+ }
+}
+
+static int L12_dequantize_granule(float *grbuf, bs_t *bs, L12_scale_info *sci, int group_size)
+{
+ int i, j, k, choff = 576;
+ for (j = 0; j < 4; j++)
+ {
+ float *dst = grbuf + group_size*j;
+ for (i = 0; i < 2*sci->total_bands; i++)
+ {
+ int ba = sci->bitalloc[i];
+ if (ba != 0)
+ {
+ if (ba < 17)
+ {
+ int half = (1 << (ba - 1)) - 1;
+ for (k = 0; k < group_size; k++)
+ {
+ dst[k] = (float)((int)get_bits(bs, ba) - half);
+ }
+ } else
+ {
+ unsigned mod = (2 << (ba - 17)) + 1; /* 3, 5, 9 */
+ unsigned code = get_bits(bs, mod + 2 - (mod >> 3)); /* 5, 7, 10 */
+ for (k = 0; k < group_size; k++, code /= mod)
+ {
+ dst[k] = (float)((int)(code % mod - mod/2));
+ }
+ }
+ }
+ dst += choff;
+ choff = 18 - choff;
+ }
+ }
+ return group_size*4;
+}
+
+static void L12_apply_scf_384(L12_scale_info *sci, const float *scf, float *dst)
+{
+ int i, k;
+ memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float));
+ for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6)
+ {
+ for (k = 0; k < 12; k++)
+ {
+ dst[k + 0] *= scf[0];
+ dst[k + 576] *= scf[3];
+ }
+ }
+}
+#endif /* MINIMP3_ONLY_MP3 */
+
+static int L3_read_side_info(bs_t *bs, L3_gr_info_t *gr, const uint8_t *hdr)
+{
+ static const uint8_t g_scf_long[8][23] = {
+ { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
+ { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 },
+ { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
+ { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 },
+ { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
+ { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 },
+ { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 },
+ { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 }
+ };
+ static const uint8_t g_scf_short[8][40] = {
+ { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
+ { 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },
+ { 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },
+ { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },
+ { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
+ { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },
+ { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },
+ { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }
+ };
+ static const uint8_t g_scf_mixed[8][40] = {
+ { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
+ { 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },
+ { 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },
+ { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },
+ { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
+ { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },
+ { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },
+ { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }
+ };
+
+ unsigned tables, scfsi = 0;
+ int main_data_begin, part_23_sum = 0;
+ int sr_idx = HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0);
+ int gr_count = HDR_IS_MONO(hdr) ? 1 : 2;
+
+ if (HDR_TEST_MPEG1(hdr))
+ {
+ gr_count *= 2;
+ main_data_begin = get_bits(bs, 9);
+ scfsi = get_bits(bs, 7 + gr_count);
+ } else
+ {
+ main_data_begin = get_bits(bs, 8 + gr_count) >> gr_count;
+ }
+
+ do
+ {
+ if (HDR_IS_MONO(hdr))
+ {
+ scfsi <<= 4;
+ }
+ gr->part_23_length = (uint16_t)get_bits(bs, 12);
+ part_23_sum += gr->part_23_length;
+ gr->big_values = (uint16_t)get_bits(bs, 9);
+ if (gr->big_values > 288)
+ {
+ return -1;
+ }
+ gr->global_gain = (uint8_t)get_bits(bs, 8);
+ gr->scalefac_compress = (uint16_t)get_bits(bs, HDR_TEST_MPEG1(hdr) ? 4 : 9);
+ gr->sfbtab = g_scf_long[sr_idx];
+ gr->n_long_sfb = 22;
+ gr->n_short_sfb = 0;
+ if (get_bits(bs, 1))
+ {
+ gr->block_type = (uint8_t)get_bits(bs, 2);
+ if (!gr->block_type)
+ {
+ return -1;
+ }
+ gr->mixed_block_flag = (uint8_t)get_bits(bs, 1);
+ gr->region_count[0] = 7;
+ gr->region_count[1] = 255;
+ if (gr->block_type == SHORT_BLOCK_TYPE)
+ {
+ scfsi &= 0x0F0F;
+ if (!gr->mixed_block_flag)
+ {
+ gr->region_count[0] = 8;
+ gr->sfbtab = g_scf_short[sr_idx];
+ gr->n_long_sfb = 0;
+ gr->n_short_sfb = 39;
+ } else
+ {
+ gr->sfbtab = g_scf_mixed[sr_idx];
+ gr->n_long_sfb = HDR_TEST_MPEG1(hdr) ? 8 : 6;
+ gr->n_short_sfb = 30;
+ }
+ }
+ tables = get_bits(bs, 10);
+ tables <<= 5;
+ gr->subblock_gain[0] = (uint8_t)get_bits(bs, 3);
+ gr->subblock_gain[1] = (uint8_t)get_bits(bs, 3);
+ gr->subblock_gain[2] = (uint8_t)get_bits(bs, 3);
+ } else
+ {
+ gr->block_type = 0;
+ gr->mixed_block_flag = 0;
+ tables = get_bits(bs, 15);
+ gr->region_count[0] = (uint8_t)get_bits(bs, 4);
+ gr->region_count[1] = (uint8_t)get_bits(bs, 3);
+ gr->region_count[2] = 255;
+ }
+ gr->table_select[0] = (uint8_t)(tables >> 10);
+ gr->table_select[1] = (uint8_t)((tables >> 5) & 31);
+ gr->table_select[2] = (uint8_t)((tables) & 31);
+ gr->preflag = HDR_TEST_MPEG1(hdr) ? get_bits(bs, 1) : (gr->scalefac_compress >= 500);
+ gr->scalefac_scale = (uint8_t)get_bits(bs, 1);
+ gr->count1_table = (uint8_t)get_bits(bs, 1);
+ gr->scfsi = (uint8_t)((scfsi >> 12) & 15);
+ scfsi <<= 4;
+ gr++;
+ } while(--gr_count);
+
+ if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)
+ {
+ return -1;
+ }
+
+ return main_data_begin;
+}
+
+static void L3_read_scalefactors(uint8_t *scf, uint8_t *ist_pos, const uint8_t *scf_size, const uint8_t *scf_count, bs_t *bitbuf, int scfsi)
+{
+ int i, k;
+ for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2)
+ {
+ int cnt = scf_count[i];
+ if (scfsi & 8)
+ {
+ memcpy(scf, ist_pos, cnt);
+ } else
+ {
+ int bits = scf_size[i];
+ if (!bits)
+ {
+ memset(scf, 0, cnt);
+ memset(ist_pos, 0, cnt);
+ } else
+ {
+ int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;
+ for (k = 0; k < cnt; k++)
+ {
+ int s = get_bits(bitbuf, bits);
+ ist_pos[k] = (s == max_scf ? -1 : s);
+ scf[k] = s;
+ }
+ }
+ }
+ ist_pos += cnt;
+ scf += cnt;
+ }
+ scf[0] = scf[1] = scf[2] = 0;
+}
+
+static float L3_ldexp_q2(float y, int exp_q2)
+{
+ static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f };
+ int e;
+ do
+ {
+ e = MINIMP3_MIN(30*4, exp_q2);
+ y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2));
+ } while ((exp_q2 -= e) > 0);
+ return y;
+}
+
+static void L3_decode_scalefactors(const uint8_t *hdr, uint8_t *ist_pos, bs_t *bs, const L3_gr_info_t *gr, float *scf, int ch)
+{
+ static const uint8_t g_scf_partitions[3][28] = {
+ { 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 },
+ { 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 },
+ { 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 }
+ };
+ const uint8_t *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb];
+ uint8_t scf_size[4], iscf[40];
+ int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi;
+ float gain;
+
+ if (HDR_TEST_MPEG1(hdr))
+ {
+ static const uint8_t g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 };
+ int part = g_scfc_decode[gr->scalefac_compress];
+ scf_size[1] = scf_size[0] = (uint8_t)(part >> 2);
+ scf_size[3] = scf_size[2] = (uint8_t)(part & 3);
+ } else
+ {
+ static const uint8_t g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 };
+ int k, modprod, sfc, ist = HDR_TEST_I_STEREO(hdr) && ch;
+ sfc = gr->scalefac_compress >> ist;
+ for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4)
+ {
+ for (modprod = 1, i = 3; i >= 0; i--)
+ {
+ scf_size[i] = (uint8_t)(sfc / modprod % g_mod[k + i]);
+ modprod *= g_mod[k + i];
+ }
+ }
+ scf_partition += k;
+ scfsi = -16;
+ }
+ L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);
+
+ if (gr->n_short_sfb)
+ {
+ int sh = 3 - scf_shift;
+ for (i = 0; i < gr->n_short_sfb; i += 3)
+ {
+ iscf[gr->n_long_sfb + i + 0] += gr->subblock_gain[0] << sh;
+ iscf[gr->n_long_sfb + i + 1] += gr->subblock_gain[1] << sh;
+ iscf[gr->n_long_sfb + i + 2] += gr->subblock_gain[2] << sh;
+ }
+ } else if (gr->preflag)
+ {
+ static const uint8_t g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 };
+ for (i = 0; i < 10; i++)
+ {
+ iscf[11 + i] += g_preamp[i];
+ }
+ }
+
+ gain_exp = gr->global_gain + BITS_DEQUANTIZER_OUT*4 - 210 - (HDR_IS_MS_STEREO(hdr) ? 2 : 0);
+ gain = L3_ldexp_q2(1 << (MAX_SCFI/4), MAX_SCFI - gain_exp);
+ for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++)
+ {
+ scf[i] = L3_ldexp_q2(gain, iscf[i] << scf_shift);
+ }
+}
+
+static const float g_pow43[129 + 16] = {
+ 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f,
+ 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f
+};
+
+static float L3_pow_43(int x)
+{
+ float frac;
+ int sign, mult = 256;
+
+ if (x < 129)
+ {
+ return g_pow43[16 + x];
+ }
+
+ if (x < 1024)
+ {
+ mult = 16;
+ x <<= 3;
+ }
+
+ sign = 2*x & 64;
+ frac = (float)((x & 63) - sign) / ((x & ~63) + sign);
+ return g_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult;
+}
+
+static void L3_huffman(float *dst, bs_t *bs, const L3_gr_info_t *gr_info, const float *scf, int layer3gr_limit)
+{
+ static const int16_t tabs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,
+ -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288,
+ -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288,
+ -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258,
+ -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259,
+ -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258,
+ -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258,
+ -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259,
+ -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258,
+ -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290,
+ -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259,
+ -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258,
+ -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259,
+ -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258,
+ -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 };
+ static const uint8_t tab32[] = { 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205 };
+ static const uint8_t tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 };
+ static const int16_t tabindex[2*16] = { 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 };
+ static const uint8_t g_linbits[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 };
+
+#define PEEK_BITS(n) (bs_cache >> (32 - n))
+#define FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); }
+#define CHECK_BITS while (bs_sh >= 0) { bs_cache |= (uint32_t)*bs_next_ptr++ << bs_sh; bs_sh -= 8; }
+#define BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh)
+
+ float one = 0.0f;
+ int ireg = 0, big_val_cnt = gr_info->big_values;
+ const uint8_t *sfb = gr_info->sfbtab;
+ const uint8_t *bs_next_ptr = bs->buf + bs->pos/8;
+ uint32_t bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs->pos & 7);
+ int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8;
+ bs_next_ptr += 4;
+
+ while (big_val_cnt > 0)
+ {
+ int tab_num = gr_info->table_select[ireg];
+ int sfb_cnt = gr_info->region_count[ireg++];
+ const int16_t *codebook = tabs + tabindex[tab_num];
+ int linbits = g_linbits[tab_num];
+ if (linbits)
+ {
+ do
+ {
+ np = *sfb++ / 2;
+ pairs_to_decode = MINIMP3_MIN(big_val_cnt, np);
+ one = *scf++;
+ do
+ {
+ int j, w = 5;
+ int leaf = codebook[PEEK_BITS(w)];
+ while (leaf < 0)
+ {
+ FLUSH_BITS(w);
+ w = leaf & 7;
+ leaf = codebook[PEEK_BITS(w) - (leaf >> 3)];
+ }
+ FLUSH_BITS(leaf >> 8);
+
+ for (j = 0; j < 2; j++, dst++, leaf >>= 4)
+ {
+ int lsb = leaf & 0x0F;
+ if (lsb == 15)
+ {
+ lsb += PEEK_BITS(linbits);
+ FLUSH_BITS(linbits);
+ CHECK_BITS;
+ *dst = one*L3_pow_43(lsb)*((int32_t)bs_cache < 0 ? -1: 1);
+ } else
+ {
+ *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
+ }
+ FLUSH_BITS(lsb ? 1 : 0);
+ }
+ CHECK_BITS;
+ } while (--pairs_to_decode);
+ } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
+ } else
+ {
+ do
+ {
+ np = *sfb++ / 2;
+ pairs_to_decode = MINIMP3_MIN(big_val_cnt, np);
+ one = *scf++;
+ do
+ {
+ int j, w = 5;
+ int leaf = codebook[PEEK_BITS(w)];
+ while (leaf < 0)
+ {
+ FLUSH_BITS(w);
+ w = leaf & 7;
+ leaf = codebook[PEEK_BITS(w) - (leaf >> 3)];
+ }
+ FLUSH_BITS(leaf >> 8);
+
+ for (j = 0; j < 2; j++, dst++, leaf >>= 4)
+ {
+ int lsb = leaf & 0x0F;
+ *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
+ FLUSH_BITS(lsb ? 1 : 0);
+ }
+ CHECK_BITS;
+ } while (--pairs_to_decode);
+ } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
+ }
+ }
+
+ for (np = 1 - big_val_cnt;; dst += 4)
+ {
+ const uint8_t *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;
+ int leaf = codebook_count1[PEEK_BITS(4)];
+ if (!(leaf & 8))
+ {
+ leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];
+ }
+ FLUSH_BITS(leaf & 7);
+ if (BSPOS > layer3gr_limit)
+ {
+ break;
+ }
+#define RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; }
+#define DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((int32_t)bs_cache < 0) ? -one : one; FLUSH_BITS(1) }
+ RELOAD_SCALEFACTOR;
+ DEQ_COUNT1(0);
+ DEQ_COUNT1(1);
+ RELOAD_SCALEFACTOR;
+ DEQ_COUNT1(2);
+ DEQ_COUNT1(3);
+ CHECK_BITS;
+ }
+
+ bs->pos = layer3gr_limit;
+}
+
+static void L3_midside_stereo(float *left, int n)
+{
+ int i = 0;
+ float *right = left + 576;
+#if HAVE_SIMD
+ if (have_simd()) for (; i < n - 3; i += 4)
+ {
+ f4 vl = VLD(left + i);
+ f4 vr = VLD(right + i);
+ VSTORE(left + i, VADD(vl, vr));
+ VSTORE(right + i, VSUB(vl, vr));
+ }
+#endif /* HAVE_SIMD */
+ for (; i < n; i++)
+ {
+ float a = left[i];
+ float b = right[i];
+ left[i] = a + b;
+ right[i] = a - b;
+ }
+}
+
+static void L3_intensity_stereo_band(float *left, int n, float kl, float kr)
+{
+ int i;
+ for (i = 0; i < n; i++)
+ {
+ left[i + 576] = left[i]*kr;
+ left[i] = left[i]*kl;
+ }
+}
+
+static void L3_stereo_top_band(const float *right, const uint8_t *sfb, int nbands, int max_band[3])
+{
+ int i, k;
+
+ max_band[0] = max_band[1] = max_band[2] = -1;
+
+ for (i = 0; i < nbands; i++)
+ {
+ for (k = 0; k < sfb[i]; k += 2)
+ {
+ if (right[k] != 0 || right[k + 1] != 0)
+ {
+ max_band[i % 3] = i;
+ break;
+ }
+ }
+ right += sfb[i];
+ }
+}
+
+static void L3_stereo_process(float *left, const uint8_t *ist_pos, const uint8_t *sfb, const uint8_t *hdr, int max_band[3], int mpeg2_sh)
+{
+ static const float g_pan[7*2] = { 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 };
+ unsigned i, max_pos = HDR_TEST_MPEG1(hdr) ? 7 : 64;
+
+ for (i = 0; sfb[i]; i++)
+ {
+ unsigned ipos = ist_pos[i];
+ if ((int)i > max_band[i % 3] && ipos < max_pos)
+ {
+ float kl, kr, s = HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;
+ if (HDR_TEST_MPEG1(hdr))
+ {
+ kl = g_pan[2*ipos];
+ kr = g_pan[2*ipos + 1];
+ } else
+ {
+ kl = 1;
+ kr = L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);
+ if (ipos & 1)
+ {
+ kl = kr;
+ kr = 1;
+ }
+ }
+ L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s);
+ } else if (HDR_TEST_MS_STEREO(hdr))
+ {
+ L3_midside_stereo(left, sfb[i]);
+ }
+ left += sfb[i];
+ }
+}
+
+static void L3_intensity_stereo(float *left, uint8_t *ist_pos, const L3_gr_info_t *gr, const uint8_t *hdr)
+{
+ int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb;
+ int i, max_blocks = gr->n_short_sfb ? 3 : 1;
+
+ L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band);
+ if (gr->n_long_sfb)
+ {
+ max_band[0] = max_band[1] = max_band[2] = MINIMP3_MAX(MINIMP3_MAX(max_band[0], max_band[1]), max_band[2]);
+ }
+ for (i = 0; i < max_blocks; i++)
+ {
+ int default_pos = HDR_TEST_MPEG1(hdr) ? 3 : 0;
+ int itop = n_sfb - max_blocks + i;
+ int prev = itop - max_blocks;
+ ist_pos[itop] = max_band[i] >= prev ? default_pos : ist_pos[prev];
+ }
+ L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1);
+}
+
+static void L3_reorder(float *grbuf, float *scratch, const uint8_t *sfb)
+{
+ int i, len;
+ float *src = grbuf, *dst = scratch;
+
+ for (;0 != (len = *sfb); sfb += 3, src += 2*len)
+ {
+ for (i = 0; i < len; i++, src++)
+ {
+ *dst++ = src[0*len];
+ *dst++ = src[1*len];
+ *dst++ = src[2*len];
+ }
+ }
+ memcpy(grbuf, scratch, (dst - scratch)*sizeof(float));
+}
+
+static void L3_antialias(float *grbuf, int nbands)
+{
+ static const float g_aa[2][8] = {
+ {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f},
+ {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f}
+ };
+
+ for (; nbands > 0; nbands--, grbuf += 18)
+ {
+ int i = 0;
+#if HAVE_SIMD
+ if (have_simd()) for (; i < 8; i += 4)
+ {
+ f4 vu = VLD(grbuf + 18 + i);
+ f4 vd = VLD(grbuf + 14 - i);
+ f4 vc0 = VLD(g_aa[0] + i);
+ f4 vc1 = VLD(g_aa[1] + i);
+ vd = VREV(vd);
+ VSTORE(grbuf + 18 + i, VSUB(VMUL(vu, vc0), VMUL(vd, vc1)));
+ vd = VADD(VMUL(vu, vc1), VMUL(vd, vc0));
+ VSTORE(grbuf + 14 - i, VREV(vd));
+ }
+#endif /* HAVE_SIMD */
+#ifndef MINIMP3_ONLY_SIMD
+ for(; i < 8; i++)
+ {
+ float u = grbuf[18 + i];
+ float d = grbuf[17 - i];
+ grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i];
+ grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i];
+ }
+#endif /* MINIMP3_ONLY_SIMD */
+ }
+}
+
+static void L3_dct3_9(float *y)
+{
+ float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4;
+
+ s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8];
+ t0 = s0 + s6*0.5f;
+ s0 -= s6;
+ t4 = (s4 + s2)*0.93969262f;
+ t2 = (s8 + s2)*0.76604444f;
+ s6 = (s4 - s8)*0.17364818f;
+ s4 += s8 - s2;
+
+ s2 = s0 - s4*0.5f;
+ y[4] = s4 + s0;
+ s8 = t0 - t2 + s6;
+ s0 = t0 - t4 + t2;
+ s4 = t0 + t4 - s6;
+
+ s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7];
+
+ s3 *= 0.86602540f;
+ t0 = (s5 + s1)*0.98480775f;
+ t4 = (s5 - s7)*0.34202014f;
+ t2 = (s1 + s7)*0.64278761f;
+ s1 = (s1 - s5 - s7)*0.86602540f;
+
+ s5 = t0 - s3 - t2;
+ s7 = t4 - s3 - t0;
+ s3 = t4 + s3 - t2;
+
+ y[0] = s4 - s7;
+ y[1] = s2 + s1;
+ y[2] = s0 - s3;
+ y[3] = s8 + s5;
+ y[5] = s8 - s5;
+ y[6] = s0 + s3;
+ y[7] = s2 - s1;
+ y[8] = s4 + s7;
+}
+
+static void L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands)
+{
+ int i, j;
+ static const float g_twid9[18] = {
+ 0.73727734f,0.79335334f,0.84339145f,0.88701083f,0.92387953f,0.95371695f,0.97629601f,0.99144486f,0.99904822f,0.67559021f,0.60876143f,0.53729961f,0.46174861f,0.38268343f,0.30070580f,0.21643961f,0.13052619f,0.04361938f
+ };
+
+ for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9)
+ {
+ float co[9], si[9];
+ co[0] = -grbuf[0];
+ si[0] = grbuf[17];
+ for (i = 0; i < 4; i++)
+ {
+ si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2];
+ co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2];
+ si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3];
+ co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]);
+ }
+ L3_dct3_9(co);
+ L3_dct3_9(si);
+
+ si[1] = -si[1];
+ si[3] = -si[3];
+ si[5] = -si[5];
+ si[7] = -si[7];
+
+ i = 0;
+
+#if HAVE_SIMD
+ if (have_simd()) for (; i < 8; i += 4)
+ {
+ f4 vovl = VLD(overlap + i);
+ f4 vc = VLD(co + i);
+ f4 vs = VLD(si + i);
+ f4 vr0 = VLD(g_twid9 + i);
+ f4 vr1 = VLD(g_twid9 + 9 + i);
+ f4 vw0 = VLD(window + i);
+ f4 vw1 = VLD(window + 9 + i);
+ f4 vsum = VADD(VMUL(vc, vr1), VMUL(vs, vr0));
+ VSTORE(overlap + i, VSUB(VMUL(vc, vr0), VMUL(vs, vr1)));
+ VSTORE(grbuf + i, VSUB(VMUL(vovl, vw0), VMUL(vsum, vw1)));
+ vsum = VADD(VMUL(vovl, vw1), VMUL(vsum, vw0));
+ VSTORE(grbuf + 14 - i, VREV(vsum));
+ }
+#endif /* HAVE_SIMD */
+ for (; i < 9; i++)
+ {
+ float ovl = overlap[i];
+ float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i];
+ overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i];
+ grbuf[i] = ovl*window[0 + i] - sum*window[9 + i];
+ grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i];
+ }
+ }
+}
+
+static void L3_idct3(float x0, float x1, float x2, float *dst)
+{
+ float m1 = x1*0.86602540f;
+ float a1 = x0 - x2*0.5f;
+ dst[1] = x0 + x2;
+ dst[0] = a1 + m1;
+ dst[2] = a1 - m1;
+}
+
+static void L3_imdct12(float *x, float *dst, float *overlap)
+{
+ static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };
+ float co[3], si[3];
+ int i;
+
+ L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co);
+ L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si);
+ si[1] = -si[1];
+
+ for (i = 0; i < 3; i++)
+ {
+ float ovl = overlap[i];
+ float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i];
+ overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i];
+ dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i];
+ dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i];
+ }
+}
+
+static void L3_imdct_short(float *grbuf, float *overlap, int nbands)
+{
+ for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
+ {
+ float tmp[18];
+ memcpy(tmp, grbuf, sizeof(tmp));
+ memcpy(grbuf, overlap, 6*sizeof(float));
+ L3_imdct12(tmp, grbuf + 6, overlap + 6);
+ L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);
+ L3_imdct12(tmp + 2, overlap, overlap + 6);
+ }
+}
+
+static void L3_change_sign(float *grbuf)
+{
+ int b, i;
+ for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36)
+ for (i = 1; i < 18; i += 2)
+ grbuf[i] = -grbuf[i];
+}
+
+static void L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands)
+{
+ static const float g_mdct_window[2][18] = {
+ { 0.99904822f,0.99144486f,0.97629601f,0.95371695f,0.92387953f,0.88701083f,0.84339145f,0.79335334f,0.73727734f,0.04361938f,0.13052619f,0.21643961f,0.30070580f,0.38268343f,0.46174861f,0.53729961f,0.60876143f,0.67559021f },
+ { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f }
+ };
+ if (n_long_bands)
+ {
+ L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);
+ grbuf += 18*n_long_bands;
+ overlap += 9*n_long_bands;
+ }
+ if (block_type == SHORT_BLOCK_TYPE)
+ L3_imdct_short(grbuf, overlap, 32 - n_long_bands);
+ else
+ L3_imdct36(grbuf, overlap, g_mdct_window[block_type == STOP_BLOCK_TYPE], 32 - n_long_bands);
+}
+
+static void L3_save_reservoir(mp3dec_t *h, mp3dec_scratch_t *s)
+{
+ int pos = (s->bs.pos + 7)/8u;
+ int remains = s->bs.limit/8u - pos;
+ if (remains > MAX_BITRESERVOIR_BYTES)
+ {
+ pos += remains - MAX_BITRESERVOIR_BYTES;
+ remains = MAX_BITRESERVOIR_BYTES;
+ }
+ if (remains > 0)
+ {
+ memmove(h->reserv_buf, s->maindata + pos, remains);
+ }
+ h->reserv = remains;
+}
+
+static int L3_restore_reservoir(mp3dec_t *h, bs_t *bs, mp3dec_scratch_t *s, int main_data_begin)
+{
+ int frame_bytes = (bs->limit - bs->pos)/8;
+ int bytes_have = MINIMP3_MIN(h->reserv, main_data_begin);
+ memcpy(s->maindata, h->reserv_buf + MINIMP3_MAX(0, h->reserv - main_data_begin), MINIMP3_MIN(h->reserv, main_data_begin));
+ memcpy(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);
+ bs_init(&s->bs, s->maindata, bytes_have + frame_bytes);
+ return h->reserv >= main_data_begin;
+}
+
+static void L3_decode(mp3dec_t *h, mp3dec_scratch_t *s, L3_gr_info_t *gr_info, int nch)
+{
+ int ch;
+
+ for (ch = 0; ch < nch; ch++)
+ {
+ int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length;
+ L3_decode_scalefactors(h->header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch);
+ L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit);
+ }
+
+ if (HDR_TEST_I_STEREO(h->header))
+ {
+ L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header);
+ } else if (HDR_IS_MS_STEREO(h->header))
+ {
+ L3_midside_stereo(s->grbuf[0], 576);
+ }
+
+ for (ch = 0; ch < nch; ch++, gr_info++)
+ {
+ int aa_bands = 31;
+ int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(HDR_GET_MY_SAMPLE_RATE(h->header) == 2);
+
+ if (gr_info->n_short_sfb)
+ {
+ aa_bands = n_long_bands - 1;
+ L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb);
+ }
+
+ L3_antialias(s->grbuf[ch], aa_bands);
+ L3_imdct_gr(s->grbuf[ch], h->mdct_overlap[ch], gr_info->block_type, n_long_bands);
+ L3_change_sign(s->grbuf[ch]);
+ }
+}
+
+static void mp3d_DCT_II(float *grbuf, int n)
+{
+ static const float g_sec[24] = {
+ 10.19000816f,0.50060302f,0.50241929f,3.40760851f,0.50547093f,0.52249861f,2.05778098f,0.51544732f,0.56694406f,1.48416460f,0.53104258f,0.64682180f,1.16943991f,0.55310392f,0.78815460f,0.97256821f,0.58293498f,1.06067765f,0.83934963f,0.62250412f,1.72244716f,0.74453628f,0.67480832f,5.10114861f
+ };
+ int i, k = 0;
+#if HAVE_SIMD
+ if (have_simd()) for (; k < n; k += 4)
+ {
+ f4 t[4][8], *x;
+ float *y = grbuf + k;
+
+ for (x = t[0], i = 0; i < 8; i++, x++)
+ {
+ f4 x0 = VLD(&y[i*18]);
+ f4 x1 = VLD(&y[(15 - i)*18]);
+ f4 x2 = VLD(&y[(16 + i)*18]);
+ f4 x3 = VLD(&y[(31 - i)*18]);
+ f4 t0 = VADD(x0, x3);
+ f4 t1 = VADD(x1, x2);
+ f4 t2 = VMUL_S(VSUB(x1, x2), g_sec[3*i + 0]);
+ f4 t3 = VMUL_S(VSUB(x0, x3), g_sec[3*i + 1]);
+ x[0] = VADD(t0, t1);
+ x[8] = VMUL_S(VSUB(t0, t1), g_sec[3*i + 2]);
+ x[16] = VADD(t3, t2);
+ x[24] = VMUL_S(VSUB(t3, t2), g_sec[3*i + 2]);
+ }
+ for (x = t[0], i = 0; i < 4; i++, x += 8)
+ {
+ f4 x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt;
+ xt = VSUB(x0, x7); x0 = VADD(x0, x7);
+ x7 = VSUB(x1, x6); x1 = VADD(x1, x6);
+ x6 = VSUB(x2, x5); x2 = VADD(x2, x5);
+ x5 = VSUB(x3, x4); x3 = VADD(x3, x4);
+ x4 = VSUB(x0, x3); x0 = VADD(x0, x3);
+ x3 = VSUB(x1, x2); x1 = VADD(x1, x2);
+ x[0] = VADD(x0, x1);
+ x[4] = VMUL_S(VSUB(x0, x1), 0.70710677f);
+ x5 = VADD(x5, x6);
+ x6 = VMUL_S(VADD(x6, x7), 0.70710677f);
+ x7 = VADD(x7, xt);
+ x3 = VMUL_S(VADD(x3, x4), 0.70710677f);
+ x5 = VSUB(x5, VMUL_S(x7, 0.198912367f)); /* rotate by PI/8 */
+ x7 = VADD(x7, VMUL_S(x5, 0.382683432f));
+ x5 = VSUB(x5, VMUL_S(x7, 0.198912367f));
+ x0 = VSUB(xt, x6); xt = VADD(xt, x6);
+ x[1] = VMUL_S(VADD(xt, x7), 0.50979561f);
+ x[2] = VMUL_S(VADD(x4, x3), 0.54119611f);
+ x[3] = VMUL_S(VSUB(x0, x5), 0.60134488f);
+ x[5] = VMUL_S(VADD(x0, x5), 0.89997619f);
+ x[6] = VMUL_S(VSUB(x4, x3), 1.30656302f);
+ x[7] = VMUL_S(VSUB(xt, x7), 2.56291556f);
+ }
+
+ if (k > n - 3)
+ {
+#if HAVE_SSE
+#define VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v)
+#else /* HAVE_SSE */
+#define VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v))
+#endif /* HAVE_SSE */
+ for (i = 0; i < 7; i++, y += 4*18)
+ {
+ f4 s = VADD(t[3][i], t[3][i + 1]);
+ VSAVE2(0, t[0][i]);
+ VSAVE2(1, VADD(t[2][i], s));
+ VSAVE2(2, VADD(t[1][i], t[1][i + 1]));
+ VSAVE2(3, VADD(t[2][1 + i], s));
+ }
+ VSAVE2(0, t[0][7]);
+ VSAVE2(1, VADD(t[2][7], t[3][7]));
+ VSAVE2(2, t[1][7]);
+ VSAVE2(3, t[3][7]);
+ } else
+ {
+#define VSAVE4(i, v) VSTORE(&y[i*18], v)
+ for (i = 0; i < 7; i++, y += 4*18)
+ {
+ f4 s = VADD(t[3][i], t[3][i + 1]);
+ VSAVE4(0, t[0][i]);
+ VSAVE4(1, VADD(t[2][i], s));
+ VSAVE4(2, VADD(t[1][i], t[1][i + 1]));
+ VSAVE4(3, VADD(t[2][1 + i], s));
+ }
+ VSAVE4(0, t[0][7]);
+ VSAVE4(1, VADD(t[2][7], t[3][7]));
+ VSAVE4(2, t[1][7]);
+ VSAVE4(3, t[3][7]);
+ }
+ } else
+#endif /* HAVE_SIMD */
+#ifdef MINIMP3_ONLY_SIMD
+ {} /* for HAVE_SIMD=1, MINIMP3_ONLY_SIMD=1 case we do not need non-intrinsic "else" branch */
+#else /* MINIMP3_ONLY_SIMD */
+ for (; k < n; k++)
+ {
+ float t[4][8], *x, *y = grbuf + k;
+
+ for (x = t[0], i = 0; i < 8; i++, x++)
+ {
+ float x0 = y[i*18];
+ float x1 = y[(15 - i)*18];
+ float x2 = y[(16 + i)*18];
+ float x3 = y[(31 - i)*18];
+ float t0 = x0 + x3;
+ float t1 = x1 + x2;
+ float t2 = (x1 - x2)*g_sec[3*i + 0];
+ float t3 = (x0 - x3)*g_sec[3*i + 1];
+ x[0] = t0 + t1;
+ x[8] = (t0 - t1)*g_sec[3*i + 2];
+ x[16] = t3 + t2;
+ x[24] = (t3 - t2)*g_sec[3*i + 2];
+ }
+ for (x = t[0], i = 0; i < 4; i++, x += 8)
+ {
+ float x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt;
+ xt = x0 - x7; x0 += x7;
+ x7 = x1 - x6; x1 += x6;
+ x6 = x2 - x5; x2 += x5;
+ x5 = x3 - x4; x3 += x4;
+ x4 = x0 - x3; x0 += x3;
+ x3 = x1 - x2; x1 += x2;
+ x[0] = x0 + x1;
+ x[4] = (x0 - x1)*0.70710677f;
+ x5 = x5 + x6;
+ x6 = (x6 + x7)*0.70710677f;
+ x7 = x7 + xt;
+ x3 = (x3 + x4)*0.70710677f;
+ x5 -= x7*0.198912367f; /* rotate by PI/8 */
+ x7 += x5*0.382683432f;
+ x5 -= x7*0.198912367f;
+ x0 = xt - x6; xt += x6;
+ x[1] = (xt + x7)*0.50979561f;
+ x[2] = (x4 + x3)*0.54119611f;
+ x[3] = (x0 - x5)*0.60134488f;
+ x[5] = (x0 + x5)*0.89997619f;
+ x[6] = (x4 - x3)*1.30656302f;
+ x[7] = (xt - x7)*2.56291556f;
+
+ }
+ for (i = 0; i < 7; i++, y += 4*18)
+ {
+ y[0*18] = t[0][i];
+ y[1*18] = t[2][i] + t[3][i] + t[3][i + 1];
+ y[2*18] = t[1][i] + t[1][i + 1];
+ y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1];
+ }
+ y[0*18] = t[0][7];
+ y[1*18] = t[2][7] + t[3][7];
+ y[2*18] = t[1][7];
+ y[3*18] = t[3][7];
+ }
+#endif /* MINIMP3_ONLY_SIMD */
+}
+
+#ifndef MINIMP3_FLOAT_OUTPUT
+static int16_t mp3d_scale_pcm(float sample)
+{
+#if HAVE_ARMV6
+ int32_t s32 = (int32_t)(sample + .5f);
+ s32 -= (s32 < 0);
+ int16_t s = (int16_t)minimp3_clip_int16_arm(s32);
+#else
+ if (sample >= 32766.5) return (int16_t) 32767;
+ if (sample <= -32767.5) return (int16_t)-32768;
+ int16_t s = (int16_t)(sample + .5f);
+ s -= (s < 0); /* away from zero, to be compliant */
+#endif
+ return s;
+}
+#else /* MINIMP3_FLOAT_OUTPUT */
+static float mp3d_scale_pcm(float sample)
+{
+ return sample*(1.f/32768.f);
+}
+#endif /* MINIMP3_FLOAT_OUTPUT */
+
+static void mp3d_synth_pair(mp3d_sample_t *pcm, int nch, const float *z)
+{
+ float a;
+ a = (z[14*64] - z[ 0]) * 29;
+ a += (z[ 1*64] + z[13*64]) * 213;
+ a += (z[12*64] - z[ 2*64]) * 459;
+ a += (z[ 3*64] + z[11*64]) * 2037;
+ a += (z[10*64] - z[ 4*64]) * 5153;
+ a += (z[ 5*64] + z[ 9*64]) * 6574;
+ a += (z[ 8*64] - z[ 6*64]) * 37489;
+ a += z[ 7*64] * 75038;
+ pcm[0] = mp3d_scale_pcm(a);
+
+ z += 2;
+ a = z[14*64] * 104;
+ a += z[12*64] * 1567;
+ a += z[10*64] * 9727;
+ a += z[ 8*64] * 64019;
+ a += z[ 6*64] * -9975;
+ a += z[ 4*64] * -45;
+ a += z[ 2*64] * 146;
+ a += z[ 0*64] * -5;
+ pcm[16*nch] = mp3d_scale_pcm(a);
+}
+
+static void mp3d_synth(float *xl, mp3d_sample_t *dstl, int nch, float *lins)
+{
+ int i;
+ float *xr = xl + 576*(nch - 1);
+ mp3d_sample_t *dstr = dstl + (nch - 1);
+
+ static const float g_win[] = {
+ -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,
+ -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,
+ -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,
+ -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,
+ -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,
+ -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,
+ -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,
+ -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,
+ -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,
+ -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,
+ -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,
+ -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,
+ -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,
+ -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,
+ -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290
+ };
+ float *zlin = lins + 15*64;
+ const float *w = g_win;
+
+ zlin[4*15] = xl[18*16];
+ zlin[4*15 + 1] = xr[18*16];
+ zlin[4*15 + 2] = xl[0];
+ zlin[4*15 + 3] = xr[0];
+
+ zlin[4*31] = xl[1 + 18*16];
+ zlin[4*31 + 1] = xr[1 + 18*16];
+ zlin[4*31 + 2] = xl[1];
+ zlin[4*31 + 3] = xr[1];
+
+ mp3d_synth_pair(dstr, nch, lins + 4*15 + 1);
+ mp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1);
+ mp3d_synth_pair(dstl, nch, lins + 4*15);
+ mp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64);
+
+#if HAVE_SIMD
+ if (have_simd()) for (i = 14; i >= 0; i--)
+ {
+#define VLOAD(k) f4 w0 = VSET(*w++); f4 w1 = VSET(*w++); f4 vz = VLD(&zlin[4*i - 64*k]); f4 vy = VLD(&zlin[4*i - 64*(15 - k)]);
+#define V0(k) { VLOAD(k) b = VADD(VMUL(vz, w1), VMUL(vy, w0)) ; a = VSUB(VMUL(vz, w0), VMUL(vy, w1)); }
+#define V1(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vz, w0), VMUL(vy, w1))); }
+#define V2(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vy, w1), VMUL(vz, w0))); }
+ f4 a, b;
+ zlin[4*i] = xl[18*(31 - i)];
+ zlin[4*i + 1] = xr[18*(31 - i)];
+ zlin[4*i + 2] = xl[1 + 18*(31 - i)];
+ zlin[4*i + 3] = xr[1 + 18*(31 - i)];
+ zlin[4*i + 64] = xl[1 + 18*(1 + i)];
+ zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)];
+ zlin[4*i - 64 + 2] = xl[18*(1 + i)];
+ zlin[4*i - 64 + 3] = xr[18*(1 + i)];
+
+ V0(0) V2(1) V1(2) V2(3) V1(4) V2(5) V1(6) V2(7)
+
+ {
+#ifndef MINIMP3_FLOAT_OUTPUT
+#if HAVE_SSE
+ static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
+ static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
+ __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),
+ _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));
+ dstr[(15 - i)*nch] = _mm_extract_epi16(pcm8, 1);
+ dstr[(17 + i)*nch] = _mm_extract_epi16(pcm8, 5);
+ dstl[(15 - i)*nch] = _mm_extract_epi16(pcm8, 0);
+ dstl[(17 + i)*nch] = _mm_extract_epi16(pcm8, 4);
+ dstr[(47 - i)*nch] = _mm_extract_epi16(pcm8, 3);
+ dstr[(49 + i)*nch] = _mm_extract_epi16(pcm8, 7);
+ dstl[(47 - i)*nch] = _mm_extract_epi16(pcm8, 2);
+ dstl[(49 + i)*nch] = _mm_extract_epi16(pcm8, 6);
+#else /* HAVE_SSE */
+ int16x4_t pcma, pcmb;
+ a = VADD(a, VSET(0.5f));
+ b = VADD(b, VSET(0.5f));
+ pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0)))));
+ pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0)))));
+ vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1);
+ vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1);
+ vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0);
+ vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0);
+ vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3);
+ vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3);
+ vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2);
+ vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2);
+#endif /* HAVE_SSE */
+
+#else /* MINIMP3_FLOAT_OUTPUT */
+
+ static const f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };
+ a = VMUL(a, g_scale);
+ b = VMUL(b, g_scale);
+#if HAVE_SSE
+ _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)));
+ _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1)));
+ _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)));
+ _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0)));
+ _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)));
+ _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3)));
+ _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
+ _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2)));
+#else /* HAVE_SSE */
+ vst1q_lane_f32(dstr + (15 - i)*nch, a, 1);
+ vst1q_lane_f32(dstr + (17 + i)*nch, b, 1);
+ vst1q_lane_f32(dstl + (15 - i)*nch, a, 0);
+ vst1q_lane_f32(dstl + (17 + i)*nch, b, 0);
+ vst1q_lane_f32(dstr + (47 - i)*nch, a, 3);
+ vst1q_lane_f32(dstr + (49 + i)*nch, b, 3);
+ vst1q_lane_f32(dstl + (47 - i)*nch, a, 2);
+ vst1q_lane_f32(dstl + (49 + i)*nch, b, 2);
+#endif /* HAVE_SSE */
+#endif /* MINIMP3_FLOAT_OUTPUT */
+ }
+ } else
+#endif /* HAVE_SIMD */
+#ifdef MINIMP3_ONLY_SIMD
+ {} /* for HAVE_SIMD=1, MINIMP3_ONLY_SIMD=1 case we do not need non-intrinsic "else" branch */
+#else /* MINIMP3_ONLY_SIMD */
+ for (i = 14; i >= 0; i--)
+ {
+#define LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64];
+#define S0(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] = vz[j]*w1 + vy[j]*w0, a[j] = vz[j]*w0 - vy[j]*w1; }
+#define S1(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; }
+#define S2(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; }
+ float a[4], b[4];
+
+ zlin[4*i] = xl[18*(31 - i)];
+ zlin[4*i + 1] = xr[18*(31 - i)];
+ zlin[4*i + 2] = xl[1 + 18*(31 - i)];
+ zlin[4*i + 3] = xr[1 + 18*(31 - i)];
+ zlin[4*(i + 16)] = xl[1 + 18*(1 + i)];
+ zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)];
+ zlin[4*(i - 16) + 2] = xl[18*(1 + i)];
+ zlin[4*(i - 16) + 3] = xr[18*(1 + i)];
+
+ S0(0) S2(1) S1(2) S2(3) S1(4) S2(5) S1(6) S2(7)
+
+ dstr[(15 - i)*nch] = mp3d_scale_pcm(a[1]);
+ dstr[(17 + i)*nch] = mp3d_scale_pcm(b[1]);
+ dstl[(15 - i)*nch] = mp3d_scale_pcm(a[0]);
+ dstl[(17 + i)*nch] = mp3d_scale_pcm(b[0]);
+ dstr[(47 - i)*nch] = mp3d_scale_pcm(a[3]);
+ dstr[(49 + i)*nch] = mp3d_scale_pcm(b[3]);
+ dstl[(47 - i)*nch] = mp3d_scale_pcm(a[2]);
+ dstl[(49 + i)*nch] = mp3d_scale_pcm(b[2]);
+ }
+#endif /* MINIMP3_ONLY_SIMD */
+}
+
+static void mp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, mp3d_sample_t *pcm, float *lins)
+{
+ int i;
+ for (i = 0; i < nch; i++)
+ {
+ mp3d_DCT_II(grbuf + 576*i, nbands);
+ }
+
+ memcpy(lins, qmf_state, sizeof(float)*15*64);
+
+ for (i = 0; i < nbands; i += 2)
+ {
+ mp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);
+ }
+#ifndef MINIMP3_NONSTANDARD_BUT_LOGICAL
+ if (nch == 1)
+ {
+ for (i = 0; i < 15*64; i += 2)
+ {
+ qmf_state[i] = lins[nbands*64 + i];
+ }
+ } else
+#endif /* MINIMP3_NONSTANDARD_BUT_LOGICAL */
+ {
+ memcpy(qmf_state, lins + nbands*64, sizeof(float)*15*64);
+ }
+}
+
+static int mp3d_match_frame(const uint8_t *hdr, int mp3_bytes, int frame_bytes)
+{
+ int i, nmatch;
+ for (i = 0, nmatch = 0; nmatch < MAX_FRAME_SYNC_MATCHES; nmatch++)
+ {
+ i += hdr_frame_bytes(hdr + i, frame_bytes) + hdr_padding(hdr + i);
+ if (i + HDR_SIZE > mp3_bytes)
+ return nmatch > 0;
+ if (!hdr_compare(hdr, hdr + i))
+ return 0;
+ }
+ return 1;
+}
+
+static int mp3d_find_frame(const uint8_t *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes)
+{
+ int i, k;
+ for (i = 0; i < mp3_bytes - HDR_SIZE; i++, mp3++)
+ {
+ if (hdr_valid(mp3))
+ {
+ int frame_bytes = hdr_frame_bytes(mp3, *free_format_bytes);
+ int frame_and_padding = frame_bytes + hdr_padding(mp3);
+
+ for (k = HDR_SIZE; !frame_bytes && k < MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - HDR_SIZE; k++)
+ {
+ if (hdr_compare(mp3, mp3 + k))
+ {
+ int fb = k - hdr_padding(mp3);
+ int nextfb = fb + hdr_padding(mp3 + k);
+ if (i + k + nextfb + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + k + nextfb))
+ continue;
+ frame_and_padding = k;
+ frame_bytes = fb;
+ *free_format_bytes = fb;
+ }
+ }
+ if ((frame_bytes && i + frame_and_padding <= mp3_bytes &&
+ mp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) ||
+ (!i && frame_and_padding == mp3_bytes))
+ {
+ *ptr_frame_bytes = frame_and_padding;
+ return i;
+ }
+ *free_format_bytes = 0;
+ }
+ }
+ *ptr_frame_bytes = 0;
+ return mp3_bytes;
+}
+
+void mp3dec_init(mp3dec_t *dec)
+{
+ dec->header[0] = 0;
+}
+
+int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info)
+{
+ int i = 0, igr, frame_size = 0, success = 1;
+ const uint8_t *hdr;
+ bs_t bs_frame[1];
+ mp3dec_scratch_t scratch;
+
+ if (mp3_bytes > 4 && dec->header[0] == 0xff && hdr_compare(dec->header, mp3))
+ {
+ frame_size = hdr_frame_bytes(mp3, dec->free_format_bytes) + hdr_padding(mp3);
+ if (frame_size != mp3_bytes && (frame_size + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + frame_size)))
+ {
+ frame_size = 0;
+ }
+ }
+ if (!frame_size)
+ {
+ memset(dec, 0, sizeof(mp3dec_t));
+ i = mp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size);
+ if (!frame_size || i + frame_size > mp3_bytes)
+ {
+ info->frame_bytes = i;
+ return 0;
+ }
+ }
+
+ hdr = mp3 + i;
+ memcpy(dec->header, hdr, HDR_SIZE);
+ info->frame_bytes = i + frame_size;
+ info->frame_offset = i;
+ info->channels = HDR_IS_MONO(hdr) ? 1 : 2;
+ info->hz = hdr_sample_rate_hz(hdr);
+ info->layer = 4 - HDR_GET_LAYER(hdr);
+ info->bitrate_kbps = hdr_bitrate_kbps(hdr);
+
+ if (!pcm)
+ {
+ return hdr_frame_samples(hdr);
+ }
+
+ bs_init(bs_frame, hdr + HDR_SIZE, frame_size - HDR_SIZE);
+ if (HDR_IS_CRC(hdr))
+ {
+ get_bits(bs_frame, 16);
+ }
+
+ if (info->layer == 3)
+ {
+ int main_data_begin = L3_read_side_info(bs_frame, scratch.gr_info, hdr);
+ if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit)
+ {
+ mp3dec_init(dec);
+ return 0;
+ }
+ success = L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);
+ if (success)
+ {
+ for (igr = 0; igr < (HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm += 576*info->channels)
+ {
+ memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
+ L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels);
+ mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, pcm, scratch.syn[0]);
+ }
+ }
+ L3_save_reservoir(dec, &scratch);
+ } else
+ {
+#ifdef MINIMP3_ONLY_MP3
+ return 0;
+#else /* MINIMP3_ONLY_MP3 */
+ L12_scale_info sci[1];
+ L12_read_scale_info(hdr, bs_frame, sci);
+
+ memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
+ for (i = 0, igr = 0; igr < 3; igr++)
+ {
+ if (12 == (i += L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1)))
+ {
+ i = 0;
+ L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);
+ mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, pcm, scratch.syn[0]);
+ memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
+ pcm += 384*info->channels;
+ }
+ if (bs_frame->pos > bs_frame->limit)
+ {
+ mp3dec_init(dec);
+ return 0;
+ }
+ }
+#endif /* MINIMP3_ONLY_MP3 */
+ }
+ return success*hdr_frame_samples(dec->header);
+}
+
+#ifdef MINIMP3_FLOAT_OUTPUT
+void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples)
+{
+ int i = 0;
+#if HAVE_SIMD
+ int aligned_count = num_samples & ~7;
+ for(; i < aligned_count; i += 8)
+ {
+ static const f4 g_scale = { 32768.0f, 32768.0f, 32768.0f, 32768.0f };
+ f4 a = VMUL(VLD(&in[i ]), g_scale);
+ f4 b = VMUL(VLD(&in[i+4]), g_scale);
+#if HAVE_SSE
+ static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
+ static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
+ __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),
+ _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));
+ out[i ] = _mm_extract_epi16(pcm8, 0);
+ out[i+1] = _mm_extract_epi16(pcm8, 1);
+ out[i+2] = _mm_extract_epi16(pcm8, 2);
+ out[i+3] = _mm_extract_epi16(pcm8, 3);
+ out[i+4] = _mm_extract_epi16(pcm8, 4);
+ out[i+5] = _mm_extract_epi16(pcm8, 5);
+ out[i+6] = _mm_extract_epi16(pcm8, 6);
+ out[i+7] = _mm_extract_epi16(pcm8, 7);
+#else /* HAVE_SSE */
+ int16x4_t pcma, pcmb;
+ a = VADD(a, VSET(0.5f));
+ b = VADD(b, VSET(0.5f));
+ pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0)))));
+ pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0)))));
+ vst1_lane_s16(out+i , pcma, 0);
+ vst1_lane_s16(out+i+1, pcma, 1);
+ vst1_lane_s16(out+i+2, pcma, 2);
+ vst1_lane_s16(out+i+3, pcma, 3);
+ vst1_lane_s16(out+i+4, pcmb, 0);
+ vst1_lane_s16(out+i+5, pcmb, 1);
+ vst1_lane_s16(out+i+6, pcmb, 2);
+ vst1_lane_s16(out+i+7, pcmb, 3);
+#endif /* HAVE_SSE */
+ }
+#endif /* HAVE_SIMD */
+ for(; i < num_samples; i++)
+ {
+ float sample = in[i] * 32768.0f;
+ if (sample >= 32766.5)
+ out[i] = (int16_t) 32767;
+ else if (sample <= -32767.5)
+ out[i] = (int16_t)-32768;
+ else
+ {
+ int16_t s = (int16_t)(sample + .5f);
+ s -= (s < 0); /* away from zero, to be compliant */
+ out[i] = s;
+ }
+ }
+}
+#endif /* MINIMP3_FLOAT_OUTPUT */
+#endif /* MINIMP3_IMPLEMENTATION && !_MINIMP3_IMPLEMENTATION_GUARD */
diff --git a/extlibs/headers/minimp3/minimp3_ex.h b/extlibs/headers/minimp3/minimp3_ex.h
new file mode 100644
index 0000000..2871705
--- /dev/null
+++ b/extlibs/headers/minimp3/minimp3_ex.h
@@ -0,0 +1,1397 @@
+#ifndef MINIMP3_EXT_H
+#define MINIMP3_EXT_H
+/*
+ https://github.com/lieff/minimp3
+ To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide.
+ This software is distributed without any warranty.
+ See <http://creativecommons.org/publicdomain/zero/1.0/>.
+*/
+#include <stddef.h>
+#include "minimp3.h"
+
+/* flags for mp3dec_ex_open_* functions */
+#define MP3D_SEEK_TO_BYTE 0 /* mp3dec_ex_seek seeks to byte in stream */
+#define MP3D_SEEK_TO_SAMPLE 1 /* mp3dec_ex_seek precisely seeks to sample using index (created during duration calculation scan or when mp3dec_ex_seek called) */
+#define MP3D_DO_NOT_SCAN 2 /* do not scan whole stream for duration if vbrtag not found, mp3dec_ex_t::samples will be filled only if mp3dec_ex_t::vbr_tag_found == 1 */
+#ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION
+#define MP3D_ALLOW_MONO_STEREO_TRANSITION 4
+#define MP3D_FLAGS_MASK 7
+#else
+#define MP3D_FLAGS_MASK 3
+#endif
+
+/* compile-time config */
+#define MINIMP3_PREDECODE_FRAMES 2 /* frames to pre-decode and skip after seek (to fill internal structures) */
+/*#define MINIMP3_SEEK_IDX_LINEAR_SEARCH*/ /* define to use linear index search instead of binary search on seek */
+#define MINIMP3_IO_SIZE (128*1024) /* io buffer size for streaming functions, must be greater than MINIMP3_BUF_SIZE */
+#define MINIMP3_BUF_SIZE (16*1024) /* buffer which can hold minimum 10 consecutive mp3 frames (~16KB) worst case */
+/*#define MINIMP3_SCAN_LIMIT (256*1024)*/ /* how many bytes will be scanned to search first valid mp3 frame, to prevent stall on large non-mp3 files */
+#define MINIMP3_ENABLE_RING 0 /* WIP enable hardware magic ring buffer if available, to make less input buffer memmove(s) in callback IO mode */
+
+/* return error codes */
+#define MP3D_E_PARAM -1
+#define MP3D_E_MEMORY -2
+#define MP3D_E_IOERROR -3
+#define MP3D_E_USER -4 /* can be used to stop processing from callbacks without indicating specific error */
+#define MP3D_E_DECODE -5 /* decode error which can't be safely skipped, such as sample rate, layer and channels change */
+
+typedef struct
+{
+ mp3d_sample_t *buffer;
+ size_t samples; /* channels included, byte size = samples*sizeof(mp3d_sample_t) */
+ int channels, hz, layer, avg_bitrate_kbps;
+} mp3dec_file_info_t;
+
+typedef struct
+{
+ const uint8_t *buffer;
+ size_t size;
+} mp3dec_map_info_t;
+
+typedef struct
+{
+ uint64_t sample;
+ uint64_t offset;
+} mp3dec_frame_t;
+
+typedef struct
+{
+ mp3dec_frame_t *frames;
+ size_t num_frames, capacity;
+} mp3dec_index_t;
+
+typedef size_t (*MP3D_READ_CB)(void *buf, size_t size, void *user_data);
+typedef int (*MP3D_SEEK_CB)(uint64_t position, void *user_data);
+
+typedef struct
+{
+ MP3D_READ_CB read;
+ void *read_data;
+ MP3D_SEEK_CB seek;
+ void *seek_data;
+} mp3dec_io_t;
+
+typedef struct
+{
+ mp3dec_t mp3d;
+ mp3dec_map_info_t file;
+ mp3dec_io_t *io;
+ mp3dec_index_t index;
+ uint64_t offset, samples, detected_samples, cur_sample, start_offset, end_offset;
+ mp3dec_frame_info_t info;
+ mp3d_sample_t buffer[MINIMP3_MAX_SAMPLES_PER_FRAME];
+ size_t input_consumed, input_filled;
+ int is_file, flags, vbr_tag_found, indexes_built;
+ int free_format_bytes;
+ int buffer_samples, buffer_consumed, to_skip, start_delay;
+ int last_error;
+} mp3dec_ex_t;
+
+typedef int (*MP3D_ITERATE_CB)(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t buf_size, uint64_t offset, mp3dec_frame_info_t *info);
+typedef int (*MP3D_PROGRESS_CB)(void *user_data, size_t file_size, uint64_t offset, mp3dec_frame_info_t *info);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* detect mp3/mpa format */
+int mp3dec_detect_buf(const uint8_t *buf, size_t buf_size);
+int mp3dec_detect_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size);
+/* decode whole buffer block */
+int mp3dec_load_buf(mp3dec_t *dec, const uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data);
+int mp3dec_load_cb(mp3dec_t *dec, mp3dec_io_t *io, uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data);
+/* iterate through frames */
+int mp3dec_iterate_buf(const uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data);
+int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data);
+/* streaming decoder with seeking capability */
+int mp3dec_ex_open_buf(mp3dec_ex_t *dec, const uint8_t *buf, size_t buf_size, int flags);
+int mp3dec_ex_open_cb(mp3dec_ex_t *dec, mp3dec_io_t *io, int flags);
+void mp3dec_ex_close(mp3dec_ex_t *dec);
+int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position);
+size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, mp3dec_frame_info_t *frame_info, size_t max_samples);
+size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples);
+#ifndef MINIMP3_NO_STDIO
+/* stdio versions of file detect, load, iterate and stream */
+int mp3dec_detect(const char *file_name);
+int mp3dec_load(mp3dec_t *dec, const char *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data);
+int mp3dec_iterate(const char *file_name, MP3D_ITERATE_CB callback, void *user_data);
+int mp3dec_ex_open(mp3dec_ex_t *dec, const char *file_name, int flags);
+#ifdef _WIN32
+int mp3dec_detect_w(const wchar_t *file_name);
+int mp3dec_load_w(mp3dec_t *dec, const wchar_t *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data);
+int mp3dec_iterate_w(const wchar_t *file_name, MP3D_ITERATE_CB callback, void *user_data);
+int mp3dec_ex_open_w(mp3dec_ex_t *dec, const wchar_t *file_name, int flags);
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*MINIMP3_EXT_H*/
+
+#if defined(MINIMP3_IMPLEMENTATION) && !defined(_MINIMP3_EX_IMPLEMENTATION_GUARD)
+#define _MINIMP3_EX_IMPLEMENTATION_GUARD
+#include <limits.h>
+#include "minimp3.h"
+
+static void mp3dec_skip_id3v1(const uint8_t *buf, size_t *pbuf_size)
+{
+ size_t buf_size = *pbuf_size;
+#ifndef MINIMP3_NOSKIP_ID3V1
+ if (buf_size >= 128 && !memcmp(buf + buf_size - 128, "TAG", 3))
+ {
+ buf_size -= 128;
+ if (buf_size >= 227 && !memcmp(buf + buf_size - 227, "TAG+", 4))
+ buf_size -= 227;
+ }
+#endif
+#ifndef MINIMP3_NOSKIP_APEV2
+ if (buf_size > 32 && !memcmp(buf + buf_size - 32, "APETAGEX", 8))
+ {
+ buf_size -= 32;
+ const uint8_t *tag = buf + buf_size + 8 + 4;
+ uint32_t tag_size = (uint32_t)(tag[3] << 24) | (tag[2] << 16) | (tag[1] << 8) | tag[0];
+ if (buf_size >= tag_size)
+ buf_size -= tag_size;
+ }
+#endif
+ *pbuf_size = buf_size;
+}
+
+static size_t mp3dec_skip_id3v2(const uint8_t *buf, size_t buf_size)
+{
+#define MINIMP3_ID3_DETECT_SIZE 10
+#ifndef MINIMP3_NOSKIP_ID3V2
+ if (buf_size >= MINIMP3_ID3_DETECT_SIZE && !memcmp(buf, "ID3", 3) && !((buf[5] & 15) || (buf[6] & 0x80) || (buf[7] & 0x80) || (buf[8] & 0x80) || (buf[9] & 0x80)))
+ {
+ size_t id3v2size = (((buf[6] & 0x7f) << 21) | ((buf[7] & 0x7f) << 14) | ((buf[8] & 0x7f) << 7) | (buf[9] & 0x7f)) + 10;
+ if ((buf[5] & 16))
+ id3v2size += 10; /* footer */
+ return id3v2size;
+ }
+#endif
+ return 0;
+}
+
+static void mp3dec_skip_id3(const uint8_t **pbuf, size_t *pbuf_size)
+{
+ uint8_t *buf = (uint8_t *)(*pbuf);
+ size_t buf_size = *pbuf_size;
+ size_t id3v2size = mp3dec_skip_id3v2(buf, buf_size);
+ if (id3v2size)
+ {
+ if (id3v2size >= buf_size)
+ id3v2size = buf_size;
+ buf += id3v2size;
+ buf_size -= id3v2size;
+ }
+ mp3dec_skip_id3v1(buf, &buf_size);
+ *pbuf = (const uint8_t *)buf;
+ *pbuf_size = buf_size;
+}
+
+static int mp3dec_check_vbrtag(const uint8_t *frame, int frame_size, uint32_t *frames, int *delay, int *padding)
+{
+ static const char g_xing_tag[4] = { 'X', 'i', 'n', 'g' };
+ static const char g_info_tag[4] = { 'I', 'n', 'f', 'o' };
+#define FRAMES_FLAG 1
+#define BYTES_FLAG 2
+#define TOC_FLAG 4
+#define VBR_SCALE_FLAG 8
+ /* Side info offsets after header:
+ / Mono Stereo
+ / MPEG1 17 32
+ / MPEG2 & 2.5 9 17*/
+ bs_t bs[1];
+ L3_gr_info_t gr_info[4];
+ bs_init(bs, frame + HDR_SIZE, frame_size - HDR_SIZE);
+ if (HDR_IS_CRC(frame))
+ get_bits(bs, 16);
+ if (L3_read_side_info(bs, gr_info, frame) < 0)
+ return 0; /* side info corrupted */
+
+ const uint8_t *tag = frame + HDR_SIZE + bs->pos/8;
+ if (memcmp(g_xing_tag, tag, 4) && memcmp(g_info_tag, tag, 4))
+ return 0;
+ int flags = tag[7];
+ if (!((flags & FRAMES_FLAG)))
+ return -1;
+ tag += 8;
+ *frames = (uint32_t)(tag[0] << 24) | (tag[1] << 16) | (tag[2] << 8) | tag[3];
+ tag += 4;
+ if (flags & BYTES_FLAG)
+ tag += 4;
+ if (flags & TOC_FLAG)
+ tag += 100;
+ if (flags & VBR_SCALE_FLAG)
+ tag += 4;
+ *delay = *padding = 0;
+ if (*tag)
+ { /* extension, LAME, Lavc, etc. Should be the same structure. */
+ tag += 21;
+ if (tag - frame + 14 >= frame_size)
+ return 0;
+ *delay = ((tag[0] << 4) | (tag[1] >> 4)) + (528 + 1);
+ *padding = (((tag[1] & 0xF) << 8) | tag[2]) - (528 + 1);
+ }
+ return 1;
+}
+
+int mp3dec_detect_buf(const uint8_t *buf, size_t buf_size)
+{
+ return mp3dec_detect_cb(0, (uint8_t *)buf, buf_size);
+}
+
+int mp3dec_detect_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size)
+{
+ if (!buf || (size_t)-1 == buf_size || (io && buf_size < MINIMP3_BUF_SIZE))
+ return MP3D_E_PARAM;
+ size_t filled = buf_size;
+ if (io)
+ {
+ if (io->seek(0, io->seek_data))
+ return MP3D_E_IOERROR;
+ filled = io->read(buf, MINIMP3_ID3_DETECT_SIZE, io->read_data);
+ if (filled > MINIMP3_ID3_DETECT_SIZE)
+ return MP3D_E_IOERROR;
+ }
+ if (filled < MINIMP3_ID3_DETECT_SIZE)
+ return MP3D_E_USER; /* too small, can't be mp3/mpa */
+ if (mp3dec_skip_id3v2(buf, filled))
+ return 0; /* id3v2 tag is enough evidence */
+ if (io)
+ {
+ size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data);
+ if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE))
+ return MP3D_E_IOERROR;
+ filled += readed;
+ if (filled < MINIMP3_BUF_SIZE)
+ mp3dec_skip_id3v1(buf, &filled);
+ } else
+ {
+ mp3dec_skip_id3v1(buf, &filled);
+ if (filled > MINIMP3_BUF_SIZE)
+ filled = MINIMP3_BUF_SIZE;
+ }
+ int free_format_bytes, frame_size;
+ mp3d_find_frame(buf, filled, &free_format_bytes, &frame_size);
+ if (frame_size)
+ return 0; /* MAX_FRAME_SYNC_MATCHES consecutive frames found */
+ return MP3D_E_USER;
+}
+
+int mp3dec_load_buf(mp3dec_t *dec, const uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data)
+{
+ return mp3dec_load_cb(dec, 0, (uint8_t *)buf, buf_size, info, progress_cb, user_data);
+}
+
+int mp3dec_load_cb(mp3dec_t *dec, mp3dec_io_t *io, uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data)
+{
+ if (!dec || !buf || !info || (size_t)-1 == buf_size || (io && buf_size < MINIMP3_BUF_SIZE))
+ return MP3D_E_PARAM;
+ uint64_t detected_samples = 0;
+ size_t orig_buf_size = buf_size;
+ int to_skip = 0;
+ mp3dec_frame_info_t frame_info;
+ memset(info, 0, sizeof(*info));
+ memset(&frame_info, 0, sizeof(frame_info));
+
+ /* skip id3 */
+ size_t filled = 0, consumed = 0;
+ int eof = 0, ret = 0;
+ if (io)
+ {
+ if (io->seek(0, io->seek_data))
+ return MP3D_E_IOERROR;
+ filled = io->read(buf, MINIMP3_ID3_DETECT_SIZE, io->read_data);
+ if (filled > MINIMP3_ID3_DETECT_SIZE)
+ return MP3D_E_IOERROR;
+ if (MINIMP3_ID3_DETECT_SIZE != filled)
+ return 0;
+ size_t id3v2size = mp3dec_skip_id3v2(buf, filled);
+ if (id3v2size)
+ {
+ if (io->seek(id3v2size, io->seek_data))
+ return MP3D_E_IOERROR;
+ filled = io->read(buf, buf_size, io->read_data);
+ if (filled > buf_size)
+ return MP3D_E_IOERROR;
+ } else
+ {
+ size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data);
+ if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE))
+ return MP3D_E_IOERROR;
+ filled += readed;
+ }
+ if (filled < MINIMP3_BUF_SIZE)
+ mp3dec_skip_id3v1(buf, &filled);
+ } else
+ {
+ mp3dec_skip_id3((const uint8_t **)&buf, &buf_size);
+ if (!buf_size)
+ return 0;
+ }
+ /* try to make allocation size assumption by first frame or vbr tag */
+ mp3dec_init(dec);
+ int samples;
+ do
+ {
+ uint32_t frames;
+ int i, delay, padding, free_format_bytes = 0, frame_size = 0;
+ const uint8_t *hdr;
+ if (io)
+ {
+ if (!eof && filled - consumed < MINIMP3_BUF_SIZE)
+ { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */
+ memmove(buf, buf + consumed, filled - consumed);
+ filled -= consumed;
+ consumed = 0;
+ size_t readed = io->read(buf + filled, buf_size - filled, io->read_data);
+ if (readed > (buf_size - filled))
+ return MP3D_E_IOERROR;
+ if (readed != (buf_size - filled))
+ eof = 1;
+ filled += readed;
+ if (eof)
+ mp3dec_skip_id3v1(buf, &filled);
+ }
+ i = mp3d_find_frame(buf + consumed, filled - consumed, &free_format_bytes, &frame_size);
+ consumed += i;
+ hdr = buf + consumed;
+ } else
+ {
+ i = mp3d_find_frame(buf, buf_size, &free_format_bytes, &frame_size);
+ buf += i;
+ buf_size -= i;
+ hdr = buf;
+ }
+ if (i && !frame_size)
+ continue;
+ if (!frame_size)
+ return 0;
+ frame_info.channels = HDR_IS_MONO(hdr) ? 1 : 2;
+ frame_info.hz = hdr_sample_rate_hz(hdr);
+ frame_info.layer = 4 - HDR_GET_LAYER(hdr);
+ frame_info.bitrate_kbps = hdr_bitrate_kbps(hdr);
+ frame_info.frame_bytes = frame_size;
+ samples = hdr_frame_samples(hdr)*frame_info.channels;
+ if (3 != frame_info.layer)
+ break;
+ int ret = mp3dec_check_vbrtag(hdr, frame_size, &frames, &delay, &padding);
+ if (ret > 0)
+ {
+ padding *= frame_info.channels;
+ to_skip = delay*frame_info.channels;
+ detected_samples = samples*(uint64_t)frames;
+ if (detected_samples >= (uint64_t)to_skip)
+ detected_samples -= to_skip;
+ if (padding > 0 && detected_samples >= (uint64_t)padding)
+ detected_samples -= padding;
+ if (!detected_samples)
+ return 0;
+ }
+ if (ret)
+ {
+ if (io)
+ {
+ consumed += frame_size;
+ } else
+ {
+ buf += frame_size;
+ buf_size -= frame_size;
+ }
+ }
+ break;
+ } while(1);
+ size_t allocated = MINIMP3_MAX_SAMPLES_PER_FRAME*sizeof(mp3d_sample_t);
+ if (detected_samples)
+ allocated += detected_samples*sizeof(mp3d_sample_t);
+ else
+ allocated += (buf_size/frame_info.frame_bytes)*samples*sizeof(mp3d_sample_t);
+ info->buffer = (mp3d_sample_t*)malloc(allocated);
+ if (!info->buffer)
+ return MP3D_E_MEMORY;
+ /* save info */
+ info->channels = frame_info.channels;
+ info->hz = frame_info.hz;
+ info->layer = frame_info.layer;
+ /* decode all frames */
+ size_t avg_bitrate_kbps = 0, frames = 0;
+ do
+ {
+ if ((allocated - info->samples*sizeof(mp3d_sample_t)) < MINIMP3_MAX_SAMPLES_PER_FRAME*sizeof(mp3d_sample_t))
+ {
+ allocated *= 2;
+ mp3d_sample_t *alloc_buf = (mp3d_sample_t*)realloc(info->buffer, allocated);
+ if (!alloc_buf)
+ return MP3D_E_MEMORY;
+ info->buffer = alloc_buf;
+ }
+ if (io)
+ {
+ if (!eof && filled - consumed < MINIMP3_BUF_SIZE)
+ { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */
+ memmove(buf, buf + consumed, filled - consumed);
+ filled -= consumed;
+ consumed = 0;
+ size_t readed = io->read(buf + filled, buf_size - filled, io->read_data);
+ if (readed != (buf_size - filled))
+ eof = 1;
+ filled += readed;
+ if (eof)
+ mp3dec_skip_id3v1(buf, &filled);
+ }
+ samples = mp3dec_decode_frame(dec, buf + consumed, filled - consumed, info->buffer + info->samples, &frame_info);
+ consumed += frame_info.frame_bytes;
+ } else
+ {
+ samples = mp3dec_decode_frame(dec, buf, MINIMP3_MIN(buf_size, (size_t)INT_MAX), info->buffer + info->samples, &frame_info);
+ buf += frame_info.frame_bytes;
+ buf_size -= frame_info.frame_bytes;
+ }
+ if (samples)
+ {
+ if (info->hz != frame_info.hz || info->layer != frame_info.layer)
+ {
+ ret = MP3D_E_DECODE;
+ break;
+ }
+ if (info->channels && info->channels != frame_info.channels)
+ {
+#ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION
+ info->channels = 0; /* mark file with mono-stereo transition */
+#else
+ ret = MP3D_E_DECODE;
+ break;
+#endif
+ }
+ samples *= frame_info.channels;
+ if (to_skip)
+ {
+ size_t skip = MINIMP3_MIN(samples, to_skip);
+ to_skip -= skip;
+ samples -= skip;
+ memmove(info->buffer, info->buffer + skip, samples*sizeof(mp3d_sample_t));
+ }
+ info->samples += samples;
+ avg_bitrate_kbps += frame_info.bitrate_kbps;
+ frames++;
+ if (progress_cb)
+ {
+ ret = progress_cb(user_data, orig_buf_size, orig_buf_size - buf_size, &frame_info);
+ if (ret)
+ break;
+ }
+ }
+ } while (frame_info.frame_bytes);
+ if (detected_samples && info->samples > detected_samples)
+ info->samples = detected_samples; /* cut padding */
+ /* reallocate to normal buffer size */
+ if (allocated != info->samples*sizeof(mp3d_sample_t))
+ {
+ mp3d_sample_t *alloc_buf = (mp3d_sample_t*)realloc(info->buffer, info->samples*sizeof(mp3d_sample_t));
+ if (!alloc_buf && info->samples)
+ return MP3D_E_MEMORY;
+ info->buffer = alloc_buf;
+ }
+ if (frames)
+ info->avg_bitrate_kbps = avg_bitrate_kbps/frames;
+ return ret;
+}
+
+int mp3dec_iterate_buf(const uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data)
+{
+ const uint8_t *orig_buf = buf;
+ if (!buf || (size_t)-1 == buf_size || !callback)
+ return MP3D_E_PARAM;
+ /* skip id3 */
+ mp3dec_skip_id3(&buf, &buf_size);
+ if (!buf_size)
+ return 0;
+ mp3dec_frame_info_t frame_info;
+ memset(&frame_info, 0, sizeof(frame_info));
+ do
+ {
+ int free_format_bytes = 0, frame_size = 0, ret;
+ int i = mp3d_find_frame(buf, buf_size, &free_format_bytes, &frame_size);
+ buf += i;
+ buf_size -= i;
+ if (i && !frame_size)
+ continue;
+ if (!frame_size)
+ break;
+ const uint8_t *hdr = buf;
+ frame_info.channels = HDR_IS_MONO(hdr) ? 1 : 2;
+ frame_info.hz = hdr_sample_rate_hz(hdr);
+ frame_info.layer = 4 - HDR_GET_LAYER(hdr);
+ frame_info.bitrate_kbps = hdr_bitrate_kbps(hdr);
+ frame_info.frame_bytes = frame_size;
+
+ if (callback)
+ {
+ if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, buf_size, hdr - orig_buf, &frame_info)))
+ return ret;
+ }
+ buf += frame_size;
+ buf_size -= frame_size;
+ } while (1);
+ return 0;
+}
+
+int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data)
+{
+ if (!io || !buf || (size_t)-1 == buf_size || buf_size < MINIMP3_BUF_SIZE || !callback)
+ return MP3D_E_PARAM;
+ size_t filled = io->read(buf, MINIMP3_ID3_DETECT_SIZE, io->read_data), consumed = 0;
+ uint64_t readed = 0;
+ mp3dec_frame_info_t frame_info;
+ int eof = 0;
+ memset(&frame_info, 0, sizeof(frame_info));
+ if (filled > MINIMP3_ID3_DETECT_SIZE)
+ return MP3D_E_IOERROR;
+ if (MINIMP3_ID3_DETECT_SIZE != filled)
+ return 0;
+ size_t id3v2size = mp3dec_skip_id3v2(buf, filled);
+ if (id3v2size)
+ {
+ if (io->seek(id3v2size, io->seek_data))
+ return MP3D_E_IOERROR;
+ filled = io->read(buf, buf_size, io->read_data);
+ if (filled > buf_size)
+ return MP3D_E_IOERROR;
+ readed += id3v2size;
+ } else
+ {
+ size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data);
+ if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE))
+ return MP3D_E_IOERROR;
+ filled += readed;
+ }
+ if (filled < MINIMP3_BUF_SIZE)
+ mp3dec_skip_id3v1(buf, &filled);
+ do
+ {
+ int free_format_bytes = 0, frame_size = 0, ret;
+ int i = mp3d_find_frame(buf + consumed, filled - consumed, &free_format_bytes, &frame_size);
+ if (i && !frame_size)
+ {
+ consumed += i;
+ continue;
+ }
+ if (!frame_size)
+ break;
+ const uint8_t *hdr = buf + consumed + i;
+ frame_info.channels = HDR_IS_MONO(hdr) ? 1 : 2;
+ frame_info.hz = hdr_sample_rate_hz(hdr);
+ frame_info.layer = 4 - HDR_GET_LAYER(hdr);
+ frame_info.bitrate_kbps = hdr_bitrate_kbps(hdr);
+ frame_info.frame_bytes = frame_size;
+
+ readed += i;
+ if (callback)
+ {
+ if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, filled - consumed, readed, &frame_info)))
+ return ret;
+ }
+ readed += frame_size;
+ consumed += i + frame_size;
+ if (!eof && filled - consumed < MINIMP3_BUF_SIZE)
+ { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */
+ memmove(buf, buf + consumed, filled - consumed);
+ filled -= consumed;
+ consumed = 0;
+ size_t readed = io->read(buf + filled, buf_size - filled, io->read_data);
+ if (readed > (buf_size - filled))
+ return MP3D_E_IOERROR;
+ if (readed != (buf_size - filled))
+ eof = 1;
+ filled += readed;
+ if (eof)
+ mp3dec_skip_id3v1(buf, &filled);
+ }
+ } while (1);
+ return 0;
+}
+
+static int mp3dec_load_index(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t buf_size, uint64_t offset, mp3dec_frame_info_t *info)
+{
+ mp3dec_frame_t *idx_frame;
+ mp3dec_ex_t *dec = (mp3dec_ex_t *)user_data;
+ if (!dec->index.frames && !dec->start_offset)
+ { /* detect VBR tag and try to avoid full scan */
+ uint32_t frames;
+ int delay, padding;
+ dec->info = *info;
+ dec->start_offset = dec->offset = offset;
+ dec->end_offset = offset + buf_size;
+ dec->free_format_bytes = free_format_bytes; /* should not change */
+ if (3 == dec->info.layer)
+ {
+ int ret = mp3dec_check_vbrtag(frame, frame_size, &frames, &delay, &padding);
+ if (ret)
+ dec->start_offset = dec->offset = offset + frame_size;
+ if (ret > 0)
+ {
+ padding *= info->channels;
+ dec->start_delay = dec->to_skip = delay*info->channels;
+ dec->samples = hdr_frame_samples(frame)*info->channels*(uint64_t)frames;
+ if (dec->samples >= (uint64_t)dec->start_delay)
+ dec->samples -= dec->start_delay;
+ if (padding > 0 && dec->samples >= (uint64_t)padding)
+ dec->samples -= padding;
+ dec->detected_samples = dec->samples;
+ dec->vbr_tag_found = 1;
+ return MP3D_E_USER;
+ } else if (ret < 0)
+ return 0;
+ }
+ }
+ if (dec->flags & MP3D_DO_NOT_SCAN)
+ return MP3D_E_USER;
+ if (dec->index.num_frames + 1 > dec->index.capacity)
+ {
+ if (!dec->index.capacity)
+ dec->index.capacity = 4096;
+ else
+ dec->index.capacity *= 2;
+ mp3dec_frame_t *alloc_buf = (mp3dec_frame_t *)realloc((void*)dec->index.frames, sizeof(mp3dec_frame_t)*dec->index.capacity);
+ if (!alloc_buf)
+ return MP3D_E_MEMORY;
+ dec->index.frames = alloc_buf;
+ }
+ idx_frame = &dec->index.frames[dec->index.num_frames++];
+ idx_frame->offset = offset;
+ idx_frame->sample = dec->samples;
+ if (!dec->buffer_samples && dec->index.num_frames < 256)
+ { /* for some cutted mp3 frames, bit-reservoir not filled and decoding can't be started from first frames */
+ /* try to decode up to 255 first frames till samples starts to decode */
+ dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, frame, MINIMP3_MIN(buf_size, (size_t)INT_MAX), dec->buffer, info);
+ dec->samples += dec->buffer_samples*info->channels;
+ } else
+ dec->samples += hdr_frame_samples(frame)*info->channels;
+ return 0;
+}
+
+int mp3dec_ex_open_buf(mp3dec_ex_t *dec, const uint8_t *buf, size_t buf_size, int flags)
+{
+ if (!dec || !buf || (size_t)-1 == buf_size || (flags & (~MP3D_FLAGS_MASK)))
+ return MP3D_E_PARAM;
+ memset(dec, 0, sizeof(*dec));
+ dec->file.buffer = buf;
+ dec->file.size = buf_size;
+ dec->flags = flags;
+ mp3dec_init(&dec->mp3d);
+ int ret = mp3dec_iterate_buf(dec->file.buffer, dec->file.size, mp3dec_load_index, dec);
+ if (ret && MP3D_E_USER != ret)
+ return ret;
+ mp3dec_init(&dec->mp3d);
+ dec->buffer_samples = 0;
+ dec->indexes_built = !(dec->vbr_tag_found || (flags & MP3D_DO_NOT_SCAN));
+ dec->flags &= (~MP3D_DO_NOT_SCAN);
+ return 0;
+}
+
+#ifndef MINIMP3_SEEK_IDX_LINEAR_SEARCH
+static size_t mp3dec_idx_binary_search(mp3dec_index_t *idx, uint64_t position)
+{
+ size_t end = idx->num_frames, start = 0, index = 0;
+ while (start <= end)
+ {
+ size_t mid = (start + end) / 2;
+ if (idx->frames[mid].sample >= position)
+ { /* move left side. */
+ if (idx->frames[mid].sample == position)
+ return mid;
+ end = mid - 1;
+ } else
+ { /* move to right side */
+ index = mid;
+ start = mid + 1;
+ if (start == idx->num_frames)
+ break;
+ }
+ }
+ return index;
+}
+#endif
+
+int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position)
+{
+ size_t i;
+ if (!dec)
+ return MP3D_E_PARAM;
+ if (!(dec->flags & MP3D_SEEK_TO_SAMPLE))
+ {
+ if (dec->io)
+ {
+ dec->offset = position;
+ } else
+ {
+ dec->offset = MINIMP3_MIN(position, dec->file.size);
+ }
+ dec->cur_sample = 0;
+ goto do_exit;
+ }
+ dec->cur_sample = position;
+ position += dec->start_delay;
+ if (0 == position)
+ { /* optimize seek to zero, no index needed */
+seek_zero:
+ dec->offset = dec->start_offset;
+ dec->to_skip = 0;
+ goto do_exit;
+ }
+ if (!dec->indexes_built)
+ { /* no index created yet (vbr tag used to calculate track length or MP3D_DO_NOT_SCAN open flag used) */
+ dec->indexes_built = 1;
+ dec->samples = 0;
+ dec->buffer_samples = 0;
+ if (dec->io)
+ {
+ if (dec->io->seek(dec->start_offset, dec->io->seek_data))
+ return MP3D_E_IOERROR;
+ int ret = mp3dec_iterate_cb(dec->io, (uint8_t *)dec->file.buffer, dec->file.size, mp3dec_load_index, dec);
+ if (ret && MP3D_E_USER != ret)
+ return ret;
+ } else
+ {
+ int ret = mp3dec_iterate_buf(dec->file.buffer + dec->start_offset, dec->file.size - dec->start_offset, mp3dec_load_index, dec);
+ if (ret && MP3D_E_USER != ret)
+ return ret;
+ }
+ for (i = 0; i < dec->index.num_frames; i++)
+ dec->index.frames[i].offset += dec->start_offset;
+ dec->samples = dec->detected_samples;
+ }
+ if (!dec->index.frames)
+ goto seek_zero; /* no frames in file - seek to zero */
+#ifdef MINIMP3_SEEK_IDX_LINEAR_SEARCH
+ for (i = 0; i < dec->index.num_frames; i++)
+ {
+ if (dec->index.frames[i].sample >= position)
+ break;
+ }
+#else
+ i = mp3dec_idx_binary_search(&dec->index, position);
+#endif
+ if (i)
+ {
+ int to_fill_bytes = 511;
+ int skip_frames = MINIMP3_PREDECODE_FRAMES
+#ifdef MINIMP3_SEEK_IDX_LINEAR_SEARCH
+ + ((dec->index.frames[i].sample == position) ? 0 : 1)
+#endif
+ ;
+ i -= MINIMP3_MIN(i, (size_t)skip_frames);
+ if (3 == dec->info.layer)
+ {
+ while (i && to_fill_bytes)
+ { /* make sure bit-reservoir is filled when we start decoding */
+ bs_t bs[1];
+ L3_gr_info_t gr_info[4];
+ int frame_bytes, frame_size;
+ const uint8_t *hdr;
+ if (dec->io)
+ {
+ hdr = dec->file.buffer;
+ if (dec->io->seek(dec->index.frames[i - 1].offset, dec->io->seek_data))
+ return MP3D_E_IOERROR;
+ size_t readed = dec->io->read((uint8_t *)hdr, HDR_SIZE, dec->io->read_data);
+ if (readed != HDR_SIZE)
+ return MP3D_E_IOERROR;
+ frame_size = hdr_frame_bytes(hdr, dec->free_format_bytes) + hdr_padding(hdr);
+ readed = dec->io->read((uint8_t *)hdr + HDR_SIZE, frame_size - HDR_SIZE, dec->io->read_data);
+ if (readed != (size_t)(frame_size - HDR_SIZE))
+ return MP3D_E_IOERROR;
+ bs_init(bs, hdr + HDR_SIZE, frame_size - HDR_SIZE);
+ } else
+ {
+ hdr = dec->file.buffer + dec->index.frames[i - 1].offset;
+ frame_size = hdr_frame_bytes(hdr, dec->free_format_bytes) + hdr_padding(hdr);
+ bs_init(bs, hdr + HDR_SIZE, frame_size - HDR_SIZE);
+ }
+ if (HDR_IS_CRC(hdr))
+ get_bits(bs, 16);
+ i--;
+ if (L3_read_side_info(bs, gr_info, hdr) < 0)
+ break; /* frame not decodable, we can start from here */
+ frame_bytes = (bs->limit - bs->pos)/8;
+ to_fill_bytes -= MINIMP3_MIN(to_fill_bytes, frame_bytes);
+ }
+ }
+ }
+ dec->offset = dec->index.frames[i].offset;
+ dec->to_skip = position - dec->index.frames[i].sample;
+ while ((i + 1) < dec->index.num_frames && !dec->index.frames[i].sample && !dec->index.frames[i + 1].sample)
+ { /* skip not decodable first frames */
+ const uint8_t *hdr;
+ if (dec->io)
+ {
+ hdr = dec->file.buffer;
+ if (dec->io->seek(dec->index.frames[i].offset, dec->io->seek_data))
+ return MP3D_E_IOERROR;
+ size_t readed = dec->io->read((uint8_t *)hdr, HDR_SIZE, dec->io->read_data);
+ if (readed != HDR_SIZE)
+ return MP3D_E_IOERROR;
+ } else
+ hdr = dec->file.buffer + dec->index.frames[i].offset;
+ dec->to_skip += hdr_frame_samples(hdr)*dec->info.channels;
+ i++;
+ }
+do_exit:
+ if (dec->io)
+ {
+ if (dec->io->seek(dec->offset, dec->io->seek_data))
+ return MP3D_E_IOERROR;
+ }
+ dec->buffer_samples = 0;
+ dec->buffer_consumed = 0;
+ dec->input_consumed = 0;
+ dec->input_filled = 0;
+ dec->last_error = 0;
+ mp3dec_init(&dec->mp3d);
+ return 0;
+}
+
+size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, mp3dec_frame_info_t *frame_info, size_t max_samples)
+{
+ if (!dec || !buf || !frame_info)
+ {
+ if (dec)
+ dec->last_error = MP3D_E_PARAM;
+ return 0;
+ }
+ if (dec->detected_samples && dec->cur_sample >= dec->detected_samples)
+ return 0; /* at end of stream */
+ if (dec->last_error)
+ return 0; /* error eof state, seek can reset it */
+ *buf = NULL;
+ uint64_t end_offset = dec->end_offset ? dec->end_offset : dec->file.size;
+ int eof = 0;
+ while (dec->buffer_consumed == dec->buffer_samples)
+ {
+ const uint8_t *dec_buf;
+ if (dec->io)
+ {
+ if (!eof && (dec->input_filled - dec->input_consumed) < MINIMP3_BUF_SIZE)
+ { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */
+ memmove((uint8_t*)dec->file.buffer, (uint8_t*)dec->file.buffer + dec->input_consumed, dec->input_filled - dec->input_consumed);
+ dec->input_filled -= dec->input_consumed;
+ dec->input_consumed = 0;
+ size_t readed = dec->io->read((uint8_t*)dec->file.buffer + dec->input_filled, dec->file.size - dec->input_filled, dec->io->read_data);
+ if (readed > (dec->file.size - dec->input_filled))
+ {
+ dec->last_error = MP3D_E_IOERROR;
+ readed = 0;
+ }
+ if (readed != (dec->file.size - dec->input_filled))
+ eof = 1;
+ dec->input_filled += readed;
+ if (eof)
+ mp3dec_skip_id3v1((uint8_t*)dec->file.buffer, &dec->input_filled);
+ }
+ dec_buf = dec->file.buffer + dec->input_consumed;
+ if (!(dec->input_filled - dec->input_consumed))
+ return 0;
+ dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, dec_buf, dec->input_filled - dec->input_consumed, dec->buffer, frame_info);
+ dec->input_consumed += frame_info->frame_bytes;
+ } else
+ {
+ dec_buf = dec->file.buffer + dec->offset;
+ uint64_t buf_size = end_offset - dec->offset;
+ if (!buf_size)
+ return 0;
+ dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, dec_buf, MINIMP3_MIN(buf_size, (uint64_t)INT_MAX), dec->buffer, frame_info);
+ }
+ dec->buffer_consumed = 0;
+ if (dec->info.hz != frame_info->hz || dec->info.layer != frame_info->layer)
+ {
+return_e_decode:
+ dec->last_error = MP3D_E_DECODE;
+ return 0;
+ }
+ if (dec->buffer_samples)
+ {
+ dec->buffer_samples *= frame_info->channels;
+ if (dec->to_skip)
+ {
+ size_t skip = MINIMP3_MIN(dec->buffer_samples, dec->to_skip);
+ dec->buffer_consumed += skip;
+ dec->to_skip -= skip;
+ }
+ if (
+#ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION
+ !(dec->flags & MP3D_ALLOW_MONO_STEREO_TRANSITION) &&
+#endif
+ dec->buffer_consumed != dec->buffer_samples && dec->info.channels != frame_info->channels)
+ {
+ goto return_e_decode;
+ }
+ } else if (dec->to_skip)
+ { /* In mp3 decoding not always can start decode from any frame because of bit reservoir,
+ count skip samples for such frames */
+ int frame_samples = hdr_frame_samples(dec_buf)*frame_info->channels;
+ dec->to_skip -= MINIMP3_MIN(frame_samples, dec->to_skip);
+ }
+ dec->offset += frame_info->frame_bytes;
+ }
+ size_t out_samples = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), max_samples);
+ if (dec->detected_samples)
+ { /* count decoded samples to properly cut padding */
+ if (dec->cur_sample + out_samples >= dec->detected_samples)
+ out_samples = dec->detected_samples - dec->cur_sample;
+ }
+ dec->cur_sample += out_samples;
+ *buf = dec->buffer + dec->buffer_consumed;
+ dec->buffer_consumed += out_samples;
+ return out_samples;
+}
+
+size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples)
+{
+ if (!dec || !buf)
+ {
+ if (dec)
+ dec->last_error = MP3D_E_PARAM;
+ return 0;
+ }
+ mp3dec_frame_info_t frame_info;
+ memset(&frame_info, 0, sizeof(frame_info));
+ size_t samples_requested = samples;
+ while (samples)
+ {
+ mp3d_sample_t *buf_frame = NULL;
+ size_t read_samples = mp3dec_ex_read_frame(dec, &buf_frame, &frame_info, samples);
+ if (!read_samples)
+ {
+ break;
+ }
+ memcpy(buf, buf_frame, read_samples * sizeof(mp3d_sample_t));
+ buf += read_samples;
+ samples -= read_samples;
+ }
+ return samples_requested - samples;
+}
+
+int mp3dec_ex_open_cb(mp3dec_ex_t *dec, mp3dec_io_t *io, int flags)
+{
+ if (!dec || !io || (flags & (~MP3D_FLAGS_MASK)))
+ return MP3D_E_PARAM;
+ memset(dec, 0, sizeof(*dec));
+#ifdef MINIMP3_HAVE_RING
+ int ret;
+ if (ret = mp3dec_open_ring(&dec->file, MINIMP3_IO_SIZE))
+ return ret;
+#else
+ dec->file.size = MINIMP3_IO_SIZE;
+ dec->file.buffer = (const uint8_t*)malloc(dec->file.size);
+ if (!dec->file.buffer)
+ return MP3D_E_MEMORY;
+#endif
+ dec->flags = flags;
+ dec->io = io;
+ mp3dec_init(&dec->mp3d);
+ if (io->seek(0, io->seek_data))
+ return MP3D_E_IOERROR;
+ int ret = mp3dec_iterate_cb(io, (uint8_t *)dec->file.buffer, dec->file.size, mp3dec_load_index, dec);
+ if (ret && MP3D_E_USER != ret)
+ return ret;
+ if (dec->io->seek(dec->start_offset, dec->io->seek_data))
+ return MP3D_E_IOERROR;
+ mp3dec_init(&dec->mp3d);
+ dec->buffer_samples = 0;
+ dec->indexes_built = !(dec->vbr_tag_found || (flags & MP3D_DO_NOT_SCAN));
+ dec->flags &= (~MP3D_DO_NOT_SCAN);
+ return 0;
+}
+
+
+#ifndef MINIMP3_NO_STDIO
+
+#if defined(__linux__) || defined(__FreeBSD__)
+#include <errno.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#if !defined(_GNU_SOURCE)
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#endif
+#if !defined(MAP_POPULATE) && defined(__linux__)
+#define MAP_POPULATE 0x08000
+#elif !defined(MAP_POPULATE)
+#define MAP_POPULATE 0
+#endif
+
+static void mp3dec_close_file(mp3dec_map_info_t *map_info)
+{
+ if (map_info->buffer && MAP_FAILED != map_info->buffer)
+ munmap((void *)map_info->buffer, map_info->size);
+ map_info->buffer = 0;
+ map_info->size = 0;
+}
+
+static int mp3dec_open_file(const char *file_name, mp3dec_map_info_t *map_info)
+{
+ if (!file_name)
+ return MP3D_E_PARAM;
+ int file;
+ struct stat st;
+ memset(map_info, 0, sizeof(*map_info));
+retry_open:
+ file = open(file_name, O_RDONLY);
+ if (file < 0 && (errno == EAGAIN || errno == EINTR))
+ goto retry_open;
+ if (file < 0 || fstat(file, &st) < 0)
+ {
+ close(file);
+ return MP3D_E_IOERROR;
+ }
+
+ map_info->size = st.st_size;
+retry_mmap:
+ map_info->buffer = (const uint8_t *)mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE | MAP_POPULATE, file, 0);
+ if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR))
+ goto retry_mmap;
+ close(file);
+ if (MAP_FAILED == map_info->buffer)
+ return MP3D_E_IOERROR;
+ return 0;
+}
+
+#if MINIMP3_ENABLE_RING && defined(__linux__) && defined(_GNU_SOURCE)
+#define MINIMP3_HAVE_RING
+static void mp3dec_close_ring(mp3dec_map_info_t *map_info)
+{
+#if defined(__linux__) && defined(_GNU_SOURCE)
+ if (map_info->buffer && MAP_FAILED != map_info->buffer)
+ munmap((void *)map_info->buffer, map_info->size*2);
+#else
+ if (map_info->buffer)
+ {
+ shmdt(map_info->buffer);
+ shmdt(map_info->buffer + map_info->size);
+ }
+#endif
+ map_info->buffer = 0;
+ map_info->size = 0;
+}
+
+static int mp3dec_open_ring(mp3dec_map_info_t *map_info, size_t size)
+{
+ int memfd, page_size;
+#if defined(__linux__) && defined(_GNU_SOURCE)
+ void *buffer;
+ int res;
+#endif
+ memset(map_info, 0, sizeof(*map_info));
+
+#ifdef _SC_PAGESIZE
+ page_size = sysconf(_SC_PAGESIZE);
+#else
+ page_size = getpagesize();
+#endif
+ map_info->size = (size + page_size - 1)/page_size*page_size;
+
+#if defined(__linux__) && defined(_GNU_SOURCE)
+ memfd = memfd_create("mp3_ring", 0);
+ if (memfd < 0)
+ return MP3D_E_MEMORY;
+
+retry_ftruncate:
+ res = ftruncate(memfd, map_info->size);
+ if (res && (errno == EAGAIN || errno == EINTR))
+ goto retry_ftruncate;
+ if (res)
+ goto error;
+
+retry_mmap:
+ map_info->buffer = (const uint8_t *)mmap(NULL, map_info->size*2, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR))
+ goto retry_mmap;
+ if (MAP_FAILED == map_info->buffer || !map_info->buffer)
+ goto error;
+retry_mmap2:
+ buffer = mmap((void *)map_info->buffer, map_info->size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, memfd, 0);
+ if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR))
+ goto retry_mmap2;
+ if (MAP_FAILED == map_info->buffer || buffer != (void *)map_info->buffer)
+ goto error;
+retry_mmap3:
+ buffer = mmap((void *)map_info->buffer + map_info->size, map_info->size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, memfd, 0);
+ if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR))
+ goto retry_mmap3;
+ if (MAP_FAILED == map_info->buffer || buffer != (void *)(map_info->buffer + map_info->size))
+ goto error;
+
+ close(memfd);
+ return 0;
+error:
+ close(memfd);
+ mp3dec_close_ring(map_info);
+ return MP3D_E_MEMORY;
+#else
+ memfd = shmget(IPC_PRIVATE, map_info->size, IPC_CREAT | 0700);
+ if (memfd < 0)
+ return MP3D_E_MEMORY;
+retry_mmap:
+ map_info->buffer = (const uint8_t *)mmap(NULL, map_info->size*2, PROT_NONE, MAP_PRIVATE, -1, 0);
+ if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR))
+ goto retry_mmap;
+ if (MAP_FAILED == map_info->buffer)
+ goto error;
+ if (map_info->buffer != shmat(memfd, map_info->buffer, 0))
+ goto error;
+ if ((map_info->buffer + map_info->size) != shmat(memfd, map_info->buffer + map_info->size, 0))
+ goto error;
+ if (shmctl(memfd, IPC_RMID, NULL) < 0)
+ return MP3D_E_MEMORY;
+ return 0;
+error:
+ shmctl(memfd, IPC_RMID, NULL);
+ mp3dec_close_ring(map_info);
+ return MP3D_E_MEMORY;
+#endif
+}
+#endif /*MINIMP3_ENABLE_RING*/
+#elif defined(_WIN32)
+#include <windows.h>
+
+static void mp3dec_close_file(mp3dec_map_info_t *map_info)
+{
+ if (map_info->buffer)
+ UnmapViewOfFile(map_info->buffer);
+ map_info->buffer = 0;
+ map_info->size = 0;
+}
+
+static int mp3dec_open_file_h(HANDLE file, mp3dec_map_info_t *map_info)
+{
+ memset(map_info, 0, sizeof(*map_info));
+
+ HANDLE mapping = NULL;
+ LARGE_INTEGER s;
+ s.LowPart = GetFileSize(file, (DWORD*)&s.HighPart);
+ if (s.LowPart == INVALID_FILE_SIZE && GetLastError() != NO_ERROR)
+ goto error;
+ map_info->size = s.QuadPart;
+
+ mapping = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
+ if (!mapping)
+ goto error;
+ map_info->buffer = (const uint8_t*)MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, s.QuadPart);
+ CloseHandle(mapping);
+ if (!map_info->buffer)
+ goto error;
+
+ CloseHandle(file);
+ return 0;
+error:
+ mp3dec_close_file(map_info);
+ CloseHandle(file);
+ return MP3D_E_IOERROR;
+}
+
+static int mp3dec_open_file(const char *file_name, mp3dec_map_info_t *map_info)
+{
+ if (!file_name)
+ return MP3D_E_PARAM;
+ HANDLE file = CreateFileA(file_name, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
+ if (INVALID_HANDLE_VALUE == file)
+ return MP3D_E_IOERROR;
+ return mp3dec_open_file_h(file, map_info);
+}
+
+static int mp3dec_open_file_w(const wchar_t *file_name, mp3dec_map_info_t *map_info)
+{
+ if (!file_name)
+ return MP3D_E_PARAM;
+ HANDLE file = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
+ if (INVALID_HANDLE_VALUE == file)
+ return MP3D_E_IOERROR;
+ return mp3dec_open_file_h(file, map_info);
+}
+#else
+#include <stdio.h>
+
+static void mp3dec_close_file(mp3dec_map_info_t *map_info)
+{
+ if (map_info->buffer)
+ free((void *)map_info->buffer);
+ map_info->buffer = 0;
+ map_info->size = 0;
+}
+
+static int mp3dec_open_file(const char *file_name, mp3dec_map_info_t *map_info)
+{
+ if (!file_name)
+ return MP3D_E_PARAM;
+ memset(map_info, 0, sizeof(*map_info));
+ FILE *file = fopen(file_name, "rb");
+ if (!file)
+ return MP3D_E_IOERROR;
+ int res = MP3D_E_IOERROR;
+ long size = -1;
+ if (fseek(file, 0, SEEK_END))
+ goto error;
+ size = ftell(file);
+ if (size < 0)
+ goto error;
+ map_info->size = (size_t)size;
+ if (fseek(file, 0, SEEK_SET))
+ goto error;
+ map_info->buffer = (uint8_t *)malloc(map_info->size);
+ if (!map_info->buffer)
+ {
+ res = MP3D_E_MEMORY;
+ goto error;
+ }
+ if (fread((void *)map_info->buffer, 1, map_info->size, file) != map_info->size)
+ goto error;
+ fclose(file);
+ return 0;
+error:
+ mp3dec_close_file(map_info);
+ fclose(file);
+ return res;
+}
+#endif
+
+static int mp3dec_detect_mapinfo(mp3dec_map_info_t *map_info)
+{
+ int ret = mp3dec_detect_buf(map_info->buffer, map_info->size);
+ mp3dec_close_file(map_info);
+ return ret;
+}
+
+static int mp3dec_load_mapinfo(mp3dec_t *dec, mp3dec_map_info_t *map_info, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data)
+{
+ int ret = mp3dec_load_buf(dec, map_info->buffer, map_info->size, info, progress_cb, user_data);
+ mp3dec_close_file(map_info);
+ return ret;
+}
+
+static int mp3dec_iterate_mapinfo(mp3dec_map_info_t *map_info, MP3D_ITERATE_CB callback, void *user_data)
+{
+ int ret = mp3dec_iterate_buf(map_info->buffer, map_info->size, callback, user_data);
+ mp3dec_close_file(map_info);
+ return ret;
+}
+
+static int mp3dec_ex_open_mapinfo(mp3dec_ex_t *dec, int flags)
+{
+ int ret = mp3dec_ex_open_buf(dec, dec->file.buffer, dec->file.size, flags);
+ dec->is_file = 1;
+ if (ret)
+ mp3dec_ex_close(dec);
+ return ret;
+}
+
+int mp3dec_detect(const char *file_name)
+{
+ int ret;
+ mp3dec_map_info_t map_info;
+ if ((ret = mp3dec_open_file(file_name, &map_info)))
+ return ret;
+ return mp3dec_detect_mapinfo(&map_info);
+}
+
+int mp3dec_load(mp3dec_t *dec, const char *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data)
+{
+ int ret;
+ mp3dec_map_info_t map_info;
+ if ((ret = mp3dec_open_file(file_name, &map_info)))
+ return ret;
+ return mp3dec_load_mapinfo(dec, &map_info, info, progress_cb, user_data);
+}
+
+int mp3dec_iterate(const char *file_name, MP3D_ITERATE_CB callback, void *user_data)
+{
+ int ret;
+ mp3dec_map_info_t map_info;
+ if ((ret = mp3dec_open_file(file_name, &map_info)))
+ return ret;
+ return mp3dec_iterate_mapinfo(&map_info, callback, user_data);
+}
+
+int mp3dec_ex_open(mp3dec_ex_t *dec, const char *file_name, int flags)
+{
+ int ret;
+ if (!dec)
+ return MP3D_E_PARAM;
+ if ((ret = mp3dec_open_file(file_name, &dec->file)))
+ return ret;
+ return mp3dec_ex_open_mapinfo(dec, flags);
+}
+
+void mp3dec_ex_close(mp3dec_ex_t *dec)
+{
+#ifdef MINIMP3_HAVE_RING
+ if (dec->io)
+ mp3dec_close_ring(&dec->file);
+#else
+ if (dec->io && dec->file.buffer)
+ free((void*)dec->file.buffer);
+#endif
+ if (dec->is_file)
+ mp3dec_close_file(&dec->file);
+ if (dec->index.frames)
+ free(dec->index.frames);
+ memset(dec, 0, sizeof(*dec));
+}
+
+#ifdef _WIN32
+int mp3dec_detect_w(const wchar_t *file_name)
+{
+ int ret;
+ mp3dec_map_info_t map_info;
+ if ((ret = mp3dec_open_file_w(file_name, &map_info)))
+ return ret;
+ return mp3dec_detect_mapinfo(&map_info);
+}
+
+int mp3dec_load_w(mp3dec_t *dec, const wchar_t *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data)
+{
+ int ret;
+ mp3dec_map_info_t map_info;
+ if ((ret = mp3dec_open_file_w(file_name, &map_info)))
+ return ret;
+ return mp3dec_load_mapinfo(dec, &map_info, info, progress_cb, user_data);
+}
+
+int mp3dec_iterate_w(const wchar_t *file_name, MP3D_ITERATE_CB callback, void *user_data)
+{
+ int ret;
+ mp3dec_map_info_t map_info;
+ if ((ret = mp3dec_open_file_w(file_name, &map_info)))
+ return ret;
+ return mp3dec_iterate_mapinfo(&map_info, callback, user_data);
+}
+
+int mp3dec_ex_open_w(mp3dec_ex_t *dec, const wchar_t *file_name, int flags)
+{
+ int ret;
+ if ((ret = mp3dec_open_file_w(file_name, &dec->file)))
+ return ret;
+ return mp3dec_ex_open_mapinfo(dec, flags);
+}
+#endif
+#else /* MINIMP3_NO_STDIO */
+void mp3dec_ex_close(mp3dec_ex_t *dec)
+{
+#ifdef MINIMP3_HAVE_RING
+ if (dec->io)
+ mp3dec_close_ring(&dec->file);
+#else
+ if (dec->io && dec->file.buffer)
+ free((void*)dec->file.buffer);
+#endif
+ if (dec->index.frames)
+ free(dec->index.frames);
+ memset(dec, 0, sizeof(*dec));
+}
+#endif
+
+#endif /* MINIMP3_IMPLEMENTATION && !_MINIMP3_EX_IMPLEMENTATION_GUARD */
diff --git a/extlibs/headers/stb_image/stb_image.h b/extlibs/headers/stb_image/stb_image.h
deleted file mode 100644
index a056138..0000000
--- a/extlibs/headers/stb_image/stb_image.h
+++ /dev/null
@@ -1,7187 +0,0 @@
-/* stb_image - v2.16 - public domain image loader - http://nothings.org/stb_image.h
- no warranty implied; use at your own risk
-
- Do this:
- #define STB_IMAGE_IMPLEMENTATION
- before you include this file in *one* C or C++ file to create the implementation.
-
- // i.e. it should look like this:
- #include ...
- #include ...
- #include ...
- #define STB_IMAGE_IMPLEMENTATION
- #include "stb_image.h"
-
- You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.
- And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free
-
-
- QUICK NOTES:
- Primarily of interest to game developers and other people who can
- avoid problematic images and only need the trivial interface
-
- JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)
- PNG 1/2/4/8/16-bit-per-channel
-
- TGA (not sure what subset, if a subset)
- BMP non-1bpp, non-RLE
- PSD (composited view only, no extra channels, 8/16 bit-per-channel)
-
- GIF (*comp always reports as 4-channel)
- HDR (radiance rgbE format)
- PIC (Softimage PIC)
- PNM (PPM and PGM binary only)
-
- Animated GIF still needs a proper API, but here's one way to do it:
- http://gist.github.com/urraka/685d9a6340b26b830d49
-
- - decode from memory or through FILE (define STBI_NO_STDIO to remove code)
- - decode from arbitrary I/O callbacks
- - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)
-
- Full documentation under "DOCUMENTATION" below.
-
-
-LICENSE
-
- See end of file for license information.
-
-RECENT REVISION HISTORY:
-
- 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes
- 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC
- 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
- 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes
- 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
- 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64
- RGB-format JPEG; remove white matting in PSD;
- allocate large structures on the stack;
- correct channel count for PNG & BMP
- 2.10 (2016-01-22) avoid warning introduced in 2.09
- 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED
-
- See end of file for full revision history.
-
-
- ============================ Contributors =========================
-
- Image formats Extensions, features
- Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info)
- Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info)
- Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG)
- Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks)
- Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG)
- Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip)
- Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD)
- github:urraka (animated gif) Junggon Kim (PNM comments)
- Daniel Gibson (16-bit TGA)
- socks-the-fox (16-bit PNG)
- Jeremy Sawicki (handle all ImageNet JPGs)
- Optimizations & bugfixes
- Fabian "ryg" Giesen
- Arseny Kapoulkine
- John-Mark Allen
-
- Bug & warning fixes
- Marc LeBlanc David Woo Guillaume George Martins Mozeiko
- Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan
- Dave Moore Roy Eltham Hayaki Saito Nathan Reed
- Won Chun Luke Graham Johan Duparc Nick Verigakis
- the Horde3D community Thomas Ruf Ronny Chevalier Baldur Karlsson
- Janez Zemva John Bartholomew Michal Cichon github:rlyeh
- Jonathan Blow Ken Hamada Tero Hanninen github:romigrou
- Laurent Gomila Cort Stratton Sergio Gonzalez github:svdijk
- Aruelien Pocheville Thibault Reuille Cass Everitt github:snagar
- Ryamond Barbiero Paul Du Bois Engin Manap github:Zelex
- Michaelangel007@github Philipp Wiesemann Dale Weiler github:grim210
- Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:sammyhw
- Blazej Dariusz Roszkowski Gregory Mullen github:phprus
- Christian Floisand Kevin Schmidt github:poppolopoppo
-*/
-
-#ifndef STBI_INCLUDE_STB_IMAGE_H
-#define STBI_INCLUDE_STB_IMAGE_H
-
-// DOCUMENTATION
-//
-// Limitations:
-// - no 16-bit-per-channel PNG
-// - no 12-bit-per-channel JPEG
-// - no JPEGs with arithmetic coding
-// - no 1-bit BMP
-// - GIF always returns *comp=4
-//
-// Basic usage (see HDR discussion below for HDR usage):
-// int x,y,n;
-// unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
-// // ... process data if not NULL ...
-// // ... x = width, y = height, n = # 8-bit components per pixel ...
-// // ... replace '0' with '1'..'4' to force that many components per pixel
-// // ... but 'n' will always be the number that it would have been if you said 0
-// stbi_image_free(data)
-//
-// Standard parameters:
-// int *x -- outputs image width in pixels
-// int *y -- outputs image height in pixels
-// int *channels_in_file -- outputs # of image components in image file
-// int desired_channels -- if non-zero, # of image components requested in result
-//
-// The return value from an image loader is an 'unsigned char *' which points
-// to the pixel data, or NULL on an allocation failure or if the image is
-// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,
-// with each pixel consisting of N interleaved 8-bit components; the first
-// pixel pointed to is top-left-most in the image. There is no padding between
-// image scanlines or between pixels, regardless of format. The number of
-// components N is 'desired_channels' if desired_channels is non-zero, or
-// *channels_in_file otherwise. If desired_channels is non-zero,
-// *channels_in_file has the number of components that _would_ have been
-// output otherwise. E.g. if you set desired_channels to 4, you will always
-// get RGBA output, but you can check *channels_in_file to see if it's trivially
-// opaque because e.g. there were only 3 channels in the source image.
-//
-// An output image with N components has the following components interleaved
-// in this order in each pixel:
-//
-// N=#comp components
-// 1 grey
-// 2 grey, alpha
-// 3 red, green, blue
-// 4 red, green, blue, alpha
-//
-// If image loading fails for any reason, the return value will be NULL,
-// and *x, *y, *channels_in_file will be unchanged. The function
-// stbi_failure_reason() can be queried for an extremely brief, end-user
-// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS
-// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
-// more user-friendly ones.
-//
-// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
-//
-// ===========================================================================
-//
-// Philosophy
-//
-// stb libraries are designed with the following priorities:
-//
-// 1. easy to use
-// 2. easy to maintain
-// 3. good performance
-//
-// Sometimes I let "good performance" creep up in priority over "easy to maintain",
-// and for best performance I may provide less-easy-to-use APIs that give higher
-// performance, in addition to the easy to use ones. Nevertheless, it's important
-// to keep in mind that from the standpoint of you, a client of this library,
-// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.
-//
-// Some secondary priorities arise directly from the first two, some of which
-// make more explicit reasons why performance can't be emphasized.
-//
-// - Portable ("ease of use")
-// - Small source code footprint ("easy to maintain")
-// - No dependencies ("ease of use")
-//
-// ===========================================================================
-//
-// I/O callbacks
-//
-// I/O callbacks allow you to read from arbitrary sources, like packaged
-// files or some other source. Data read from callbacks are processed
-// through a small internal buffer (currently 128 bytes) to try to reduce
-// overhead.
-//
-// The three functions you must define are "read" (reads some bytes of data),
-// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).
-//
-// ===========================================================================
-//
-// SIMD support
-//
-// The JPEG decoder will try to automatically use SIMD kernels on x86 when
-// supported by the compiler. For ARM Neon support, you must explicitly
-// request it.
-//
-// (The old do-it-yourself SIMD API is no longer supported in the current
-// code.)
-//
-// On x86, SSE2 will automatically be used when available based on a run-time
-// test; if not, the generic C versions are used as a fall-back. On ARM targets,
-// the typical path is to have separate builds for NEON and non-NEON devices
-// (at least this is true for iOS and Android). Therefore, the NEON support is
-// toggled by a build flag: define STBI_NEON to get NEON loops.
-//
-// If for some reason you do not want to use any of SIMD code, or if
-// you have issues compiling it, you can disable it entirely by
-// defining STBI_NO_SIMD.
-//
-// ===========================================================================
-//
-// HDR image support (disable by defining STBI_NO_HDR)
-//
-// stb_image now supports loading HDR images in general, and currently
-// the Radiance .HDR file format, although the support is provided
-// generically. You can still load any file through the existing interface;
-// if you attempt to load an HDR file, it will be automatically remapped to
-// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
-// both of these constants can be reconfigured through this interface:
-//
-// stbi_hdr_to_ldr_gamma(2.2f);
-// stbi_hdr_to_ldr_scale(1.0f);
-//
-// (note, do not use _inverse_ constants; stbi_image will invert them
-// appropriately).
-//
-// Additionally, there is a new, parallel interface for loading files as
-// (linear) floats to preserve the full dynamic range:
-//
-// float *data = stbi_loadf(filename, &x, &y, &n, 0);
-//
-// If you load LDR images through this interface, those images will
-// be promoted to floating point values, run through the inverse of
-// constants corresponding to the above:
-//
-// stbi_ldr_to_hdr_scale(1.0f);
-// stbi_ldr_to_hdr_gamma(2.2f);
-//
-// Finally, given a filename (or an open file or memory block--see header
-// file for details) containing image data, you can query for the "most
-// appropriate" interface to use (that is, whether the image is HDR or
-// not), using:
-//
-// stbi_is_hdr(char *filename);
-//
-// ===========================================================================
-//
-// iPhone PNG support:
-//
-// By default we convert iphone-formatted PNGs back to RGB, even though
-// they are internally encoded differently. You can disable this conversion
-// by by calling stbi_convert_iphone_png_to_rgb(0), in which case
-// you will always just get the native iphone "format" through (which
-// is BGR stored in RGB).
-//
-// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
-// pixel to remove any premultiplied alpha *only* if the image file explicitly
-// says there's premultiplied data (currently only happens in iPhone images,
-// and only if iPhone convert-to-rgb processing is on).
-//
-// ===========================================================================
-//
-// ADDITIONAL CONFIGURATION
-//
-// - You can suppress implementation of any of the decoders to reduce
-// your code footprint by #defining one or more of the following
-// symbols before creating the implementation.
-//
-// STBI_NO_JPEG
-// STBI_NO_PNG
-// STBI_NO_BMP
-// STBI_NO_PSD
-// STBI_NO_TGA
-// STBI_NO_GIF
-// STBI_NO_HDR
-// STBI_NO_PIC
-// STBI_NO_PNM (.ppm and .pgm)
-//
-// - You can request *only* certain decoders and suppress all other ones
-// (this will be more forward-compatible, as addition of new decoders
-// doesn't require you to disable them explicitly):
-//
-// STBI_ONLY_JPEG
-// STBI_ONLY_PNG
-// STBI_ONLY_BMP
-// STBI_ONLY_PSD
-// STBI_ONLY_TGA
-// STBI_ONLY_GIF
-// STBI_ONLY_HDR
-// STBI_ONLY_PIC
-// STBI_ONLY_PNM (.ppm and .pgm)
-//
-// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
-// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
-//
-
-
-#ifndef STBI_NO_STDIO
-#include <stdio.h>
-#endif // STBI_NO_STDIO
-
-#define STBI_VERSION 1
-
-enum
-{
- STBI_default = 0, // only used for desired_channels
-
- STBI_grey = 1,
- STBI_grey_alpha = 2,
- STBI_rgb = 3,
- STBI_rgb_alpha = 4
-};
-
-typedef unsigned char stbi_uc;
-typedef unsigned short stbi_us;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef STB_IMAGE_STATIC
-#define STBIDEF static
-#else
-#define STBIDEF extern
-#endif
-
-//////////////////////////////////////////////////////////////////////////////
-//
-// PRIMARY API - works on images of any type
-//
-
-//
-// load image by filename, open file, or memory buffer
-//
-
-typedef struct
-{
- int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read
- void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative
- int (*eof) (void *user); // returns nonzero if we are at end of file/data
-} stbi_io_callbacks;
-
-////////////////////////////////////
-//
-// 8-bits-per-channel interface
-//
-
-STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels);
-STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels);
-
-#ifndef STBI_NO_STDIO
-STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
-STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
-// for stbi_load_from_file, file pointer is left pointing immediately after image
-#endif
-
-////////////////////////////////////
-//
-// 16-bits-per-channel interface
-//
-
-STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
-STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);
-
-#ifndef STBI_NO_STDIO
-STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
-STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
-#endif
-
-////////////////////////////////////
-//
-// float-per-channel interface
-//
-#ifndef STBI_NO_LINEAR
- STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
- STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);
-
- #ifndef STBI_NO_STDIO
- STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
- STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
- #endif
-#endif
-
-#ifndef STBI_NO_HDR
- STBIDEF void stbi_hdr_to_ldr_gamma(float gamma);
- STBIDEF void stbi_hdr_to_ldr_scale(float scale);
-#endif // STBI_NO_HDR
-
-#ifndef STBI_NO_LINEAR
- STBIDEF void stbi_ldr_to_hdr_gamma(float gamma);
- STBIDEF void stbi_ldr_to_hdr_scale(float scale);
-#endif // STBI_NO_LINEAR
-
-// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR
-STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
-STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
-#ifndef STBI_NO_STDIO
-STBIDEF int stbi_is_hdr (char const *filename);
-STBIDEF int stbi_is_hdr_from_file(FILE *f);
-#endif // STBI_NO_STDIO
-
-
-// get a VERY brief reason for failure
-// NOT THREADSAFE
-STBIDEF const char *stbi_failure_reason (void);
-
-// free the loaded image -- this is just free()
-STBIDEF void stbi_image_free (void *retval_from_stbi_load);
-
-// get image dimensions & components without fully decoding
-STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
-STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);
-
-#ifndef STBI_NO_STDIO
-STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp);
-STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);
-
-#endif
-
-
-
-// for image formats that explicitly notate that they have premultiplied alpha,
-// we just return the colors as stored in the file. set this flag to force
-// unpremultiplication. results are undefined if the unpremultiply overflow.
-STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
-
-// indicate whether we should process iphone images back to canonical format,
-// or just pass them through "as-is"
-STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
-
-// flip the image vertically, so the first pixel in the output array is the bottom left
-STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);
-
-// ZLIB client - used by PNG, available for other purposes
-
-STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
-STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);
-STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
-STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
-
-STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
-STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-//
-//
-//// end header file /////////////////////////////////////////////////////
-#endif // STBI_INCLUDE_STB_IMAGE_H
-
-#ifdef STB_IMAGE_IMPLEMENTATION
-
-#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
- || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
- || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
- || defined(STBI_ONLY_ZLIB)
- #ifndef STBI_ONLY_JPEG
- #define STBI_NO_JPEG
- #endif
- #ifndef STBI_ONLY_PNG
- #define STBI_NO_PNG
- #endif
- #ifndef STBI_ONLY_BMP
- #define STBI_NO_BMP
- #endif
- #ifndef STBI_ONLY_PSD
- #define STBI_NO_PSD
- #endif
- #ifndef STBI_ONLY_TGA
- #define STBI_NO_TGA
- #endif
- #ifndef STBI_ONLY_GIF
- #define STBI_NO_GIF
- #endif
- #ifndef STBI_ONLY_HDR
- #define STBI_NO_HDR
- #endif
- #ifndef STBI_ONLY_PIC
- #define STBI_NO_PIC
- #endif
- #ifndef STBI_ONLY_PNM
- #define STBI_NO_PNM
- #endif
-#endif
-
-#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
-#define STBI_NO_ZLIB
-#endif
-
-
-#include <stdarg.h>
-#include <stddef.h> // ptrdiff_t on osx
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
-#include <math.h> // ldexp
-#endif
-
-#ifndef STBI_NO_STDIO
-#include <stdio.h>
-#endif
-
-#ifndef STBI_ASSERT
-#include <assert.h>
-#define STBI_ASSERT(x) assert(x)
-#endif
-
-
-#ifndef _MSC_VER
- #ifdef __cplusplus
- #define stbi_inline inline
- #else
- #define stbi_inline
- #endif
-#else
- #define stbi_inline __forceinline
-#endif
-
-
-#ifdef _MSC_VER
-typedef unsigned short stbi__uint16;
-typedef signed short stbi__int16;
-typedef unsigned int stbi__uint32;
-typedef signed int stbi__int32;
-#else
-#include <stdint.h>
-typedef uint16_t stbi__uint16;
-typedef int16_t stbi__int16;
-typedef uint32_t stbi__uint32;
-typedef int32_t stbi__int32;
-#endif
-
-// should produce compiler error if size is wrong
-typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
-
-#ifdef _MSC_VER
-#define STBI_NOTUSED(v) (void)(v)
-#else
-#define STBI_NOTUSED(v) (void)sizeof(v)
-#endif
-
-#ifdef _MSC_VER
-#define STBI_HAS_LROTL
-#endif
-
-#ifdef STBI_HAS_LROTL
- #define stbi_lrot(x,y) _lrotl(x,y)
-#else
- #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
-#endif
-
-#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
-// ok
-#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
-// ok
-#else
-#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
-#endif
-
-#ifndef STBI_MALLOC
-#define STBI_MALLOC(sz) malloc(sz)
-#define STBI_REALLOC(p,newsz) realloc(p,newsz)
-#define STBI_FREE(p) free(p)
-#endif
-
-#ifndef STBI_REALLOC_SIZED
-#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
-#endif
-
-// x86/x64 detection
-#if defined(__x86_64__) || defined(_M_X64)
-#define STBI__X64_TARGET
-#elif defined(__i386) || defined(_M_IX86)
-#define STBI__X86_TARGET
-#endif
-
-#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
-// gcc doesn't support sse2 intrinsics unless you compile with -msse2,
-// which in turn means it gets to use SSE2 everywhere. This is unfortunate,
-// but previous attempts to provide the SSE2 functions with runtime
-// detection caused numerous issues. The way architecture extensions are
-// exposed in GCC/Clang is, sadly, not really suited for one-file libs.
-// New behavior: if compiled with -msse2, we use SSE2 without any
-// detection; if not, we don't use it at all.
-#define STBI_NO_SIMD
-#endif
-
-#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
-// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET
-//
-// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the
-// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant.
-// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not
-// simultaneously enabling "-mstackrealign".
-//
-// See https://github.com/nothings/stb/issues/81 for more information.
-//
-// So default to no SSE2 on 32-bit MinGW. If you've read this far and added
-// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2.
-#define STBI_NO_SIMD
-#endif
-
-#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
-#define STBI_SSE2
-#include <emmintrin.h>
-
-#ifdef _MSC_VER
-
-#if _MSC_VER >= 1400 // not VC6
-#include <intrin.h> // __cpuid
-static int stbi__cpuid3(void)
-{
- int info[4];
- __cpuid(info,1);
- return info[3];
-}
-#else
-static int stbi__cpuid3(void)
-{
- int res;
- __asm {
- mov eax,1
- cpuid
- mov res,edx
- }
- return res;
-}
-#endif
-
-#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
-
-static int stbi__sse2_available(void)
-{
- int info3 = stbi__cpuid3();
- return ((info3 >> 26) & 1) != 0;
-}
-#else // assume GCC-style if not VC++
-#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
-
-static int stbi__sse2_available(void)
-{
- // If we're even attempting to compile this on GCC/Clang, that means
- // -msse2 is on, which means the compiler is allowed to use SSE2
- // instructions at will, and so are we.
- return 1;
-}
-#endif
-#endif
-
-// ARM NEON
-#if defined(STBI_NO_SIMD) && defined(STBI_NEON)
-#undef STBI_NEON
-#endif
-
-#ifdef STBI_NEON
-#include <arm_neon.h>
-// assume GCC or Clang on ARM targets
-#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
-#endif
-
-#ifndef STBI_SIMD_ALIGN
-#define STBI_SIMD_ALIGN(type, name) type name
-#endif
-
-///////////////////////////////////////////////
-//
-// stbi__context struct and start_xxx functions
-
-// stbi__context structure is our basic context used by all images, so it
-// contains all the IO context, plus some basic image information
-typedef struct
-{
- stbi__uint32 img_x, img_y;
- int img_n, img_out_n;
-
- stbi_io_callbacks io;
- void *io_user_data;
-
- int read_from_callbacks;
- int buflen;
- stbi_uc buffer_start[128];
-
- stbi_uc *img_buffer, *img_buffer_end;
- stbi_uc *img_buffer_original, *img_buffer_original_end;
-} stbi__context;
-
-
-static void stbi__refill_buffer(stbi__context *s);
-
-// initialize a memory-decode context
-static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)
-{
- s->io.read = NULL;
- s->read_from_callbacks = 0;
- s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
- s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
-}
-
-// initialize a callback-based context
-static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)
-{
- s->io = *c;
- s->io_user_data = user;
- s->buflen = sizeof(s->buffer_start);
- s->read_from_callbacks = 1;
- s->img_buffer_original = s->buffer_start;
- stbi__refill_buffer(s);
- s->img_buffer_original_end = s->img_buffer_end;
-}
-
-#ifndef STBI_NO_STDIO
-
-static int stbi__stdio_read(void *user, char *data, int size)
-{
- return (int) fread(data,1,size,(FILE*) user);
-}
-
-static void stbi__stdio_skip(void *user, int n)
-{
- fseek((FILE*) user, n, SEEK_CUR);
-}
-
-static int stbi__stdio_eof(void *user)
-{
- return feof((FILE*) user);
-}
-
-static stbi_io_callbacks stbi__stdio_callbacks =
-{
- stbi__stdio_read,
- stbi__stdio_skip,
- stbi__stdio_eof,
-};
-
-static void stbi__start_file(stbi__context *s, FILE *f)
-{
- stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);
-}
-
-//static void stop_file(stbi__context *s) { }
-
-#endif // !STBI_NO_STDIO
-
-static void stbi__rewind(stbi__context *s)
-{
- // conceptually rewind SHOULD rewind to the beginning of the stream,
- // but we just rewind to the beginning of the initial buffer, because
- // we only use it after doing 'test', which only ever looks at at most 92 bytes
- s->img_buffer = s->img_buffer_original;
- s->img_buffer_end = s->img_buffer_original_end;
-}
-
-enum
-{
- STBI_ORDER_RGB,
- STBI_ORDER_BGR
-};
-
-typedef struct
-{
- int bits_per_channel;
- int num_channels;
- int channel_order;
-} stbi__result_info;
-
-#ifndef STBI_NO_JPEG
-static int stbi__jpeg_test(stbi__context *s);
-static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_PNG
-static int stbi__png_test(stbi__context *s);
-static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_BMP
-static int stbi__bmp_test(stbi__context *s);
-static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_TGA
-static int stbi__tga_test(stbi__context *s);
-static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_PSD
-static int stbi__psd_test(stbi__context *s);
-static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc);
-static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_HDR
-static int stbi__hdr_test(stbi__context *s);
-static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_PIC
-static int stbi__pic_test(stbi__context *s);
-static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_GIF
-static int stbi__gif_test(stbi__context *s);
-static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_PNM
-static int stbi__pnm_test(stbi__context *s);
-static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-// this is not threadsafe
-static const char *stbi__g_failure_reason;
-
-STBIDEF const char *stbi_failure_reason(void)
-{
- return stbi__g_failure_reason;
-}
-
-static int stbi__err(const char *str)
-{
- stbi__g_failure_reason = str;
- return 0;
-}
-
-static void *stbi__malloc(size_t size)
-{
- return STBI_MALLOC(size);
-}
-
-// stb_image uses ints pervasively, including for offset calculations.
-// therefore the largest decoded image size we can support with the
-// current code, even on 64-bit targets, is INT_MAX. this is not a
-// significant limitation for the intended use case.
-//
-// we do, however, need to make sure our size calculations don't
-// overflow. hence a few helper functions for size calculations that
-// multiply integers together, making sure that they're non-negative
-// and no overflow occurs.
-
-// return 1 if the sum is valid, 0 on overflow.
-// negative terms are considered invalid.
-static int stbi__addsizes_valid(int a, int b)
-{
- if (b < 0) return 0;
- // now 0 <= b <= INT_MAX, hence also
- // 0 <= INT_MAX - b <= INTMAX.
- // And "a + b <= INT_MAX" (which might overflow) is the
- // same as a <= INT_MAX - b (no overflow)
- return a <= INT_MAX - b;
-}
-
-// returns 1 if the product is valid, 0 on overflow.
-// negative factors are considered invalid.
-static int stbi__mul2sizes_valid(int a, int b)
-{
- if (a < 0 || b < 0) return 0;
- if (b == 0) return 1; // mul-by-0 is always safe
- // portable way to check for no overflows in a*b
- return a <= INT_MAX/b;
-}
-
-// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow
-static int stbi__mad2sizes_valid(int a, int b, int add)
-{
- return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
-}
-
-// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow
-static int stbi__mad3sizes_valid(int a, int b, int c, int add)
-{
- return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
- stbi__addsizes_valid(a*b*c, add);
-}
-
-// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow
-static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)
-{
- return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
- stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
-}
-
-// mallocs with size overflow checking
-static void *stbi__malloc_mad2(int a, int b, int add)
-{
- if (!stbi__mad2sizes_valid(a, b, add)) return NULL;
- return stbi__malloc(a*b + add);
-}
-
-static void *stbi__malloc_mad3(int a, int b, int c, int add)
-{
- if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;
- return stbi__malloc(a*b*c + add);
-}
-
-static void *stbi__malloc_mad4(int a, int b, int c, int d, int add)
-{
- if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;
- return stbi__malloc(a*b*c*d + add);
-}
-
-// stbi__err - error
-// stbi__errpf - error returning pointer to float
-// stbi__errpuc - error returning pointer to unsigned char
-
-#ifdef STBI_NO_FAILURE_STRINGS
- #define stbi__err(x,y) 0
-#elif defined(STBI_FAILURE_USERMSG)
- #define stbi__err(x,y) stbi__err(y)
-#else
- #define stbi__err(x,y) stbi__err(x)
-#endif
-
-#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
-#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
-
-STBIDEF void stbi_image_free(void *retval_from_stbi_load)
-{
- STBI_FREE(retval_from_stbi_load);
-}
-
-#ifndef STBI_NO_LINEAR
-static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
-#endif
-
-#ifndef STBI_NO_HDR
-static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp);
-#endif
-
-static int stbi__vertically_flip_on_load = 0;
-
-STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
-{
- stbi__vertically_flip_on_load = flag_true_if_should_flip;
-}
-
-static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
-{
- memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields
- ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed
- ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order
- ri->num_channels = 0;
-
- #ifndef STBI_NO_JPEG
- if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
- #endif
- #ifndef STBI_NO_PNG
- if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri);
- #endif
- #ifndef STBI_NO_BMP
- if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri);
- #endif
- #ifndef STBI_NO_GIF
- if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri);
- #endif
- #ifndef STBI_NO_PSD
- if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
- #endif
- #ifndef STBI_NO_PIC
- if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri);
- #endif
- #ifndef STBI_NO_PNM
- if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri);
- #endif
-
- #ifndef STBI_NO_HDR
- if (stbi__hdr_test(s)) {
- float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);
- return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
- }
- #endif
-
- #ifndef STBI_NO_TGA
- // test tga last because it's a crappy test!
- if (stbi__tga_test(s))
- return stbi__tga_load(s,x,y,comp,req_comp, ri);
- #endif
-
- return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");
-}
-
-static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels)
-{
- int i;
- int img_len = w * h * channels;
- stbi_uc *reduced;
-
- reduced = (stbi_uc *) stbi__malloc(img_len);
- if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory");
-
- for (i = 0; i < img_len; ++i)
- reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling
-
- STBI_FREE(orig);
- return reduced;
-}
-
-static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels)
-{
- int i;
- int img_len = w * h * channels;
- stbi__uint16 *enlarged;
-
- enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
- if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
-
- for (i = 0; i < img_len; ++i)
- enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff
-
- STBI_FREE(orig);
- return enlarged;
-}
-
-static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)
-{
- int row;
- size_t bytes_per_row = (size_t)w * bytes_per_pixel;
- stbi_uc temp[2048];
- stbi_uc *bytes = (stbi_uc *)image;
-
- for (row = 0; row < (h>>1); row++) {
- stbi_uc *row0 = bytes + row*bytes_per_row;
- stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;
- // swap row0 with row1
- size_t bytes_left = bytes_per_row;
- while (bytes_left) {
- size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp);
- memcpy(temp, row0, bytes_copy);
- memcpy(row0, row1, bytes_copy);
- memcpy(row1, temp, bytes_copy);
- row0 += bytes_copy;
- row1 += bytes_copy;
- bytes_left -= bytes_copy;
- }
- }
-}
-
-static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
-{
- stbi__result_info ri;
- void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
-
- if (result == NULL)
- return NULL;
-
- if (ri.bits_per_channel != 8) {
- STBI_ASSERT(ri.bits_per_channel == 16);
- result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
- ri.bits_per_channel = 8;
- }
-
- // @TODO: move stbi__convert_format to here
-
- if (stbi__vertically_flip_on_load) {
- int channels = req_comp ? req_comp : *comp;
- stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc));
- }
-
- return (unsigned char *) result;
-}
-
-static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
-{
- stbi__result_info ri;
- void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
-
- if (result == NULL)
- return NULL;
-
- if (ri.bits_per_channel != 16) {
- STBI_ASSERT(ri.bits_per_channel == 8);
- result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
- ri.bits_per_channel = 16;
- }
-
- // @TODO: move stbi__convert_format16 to here
- // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision
-
- if (stbi__vertically_flip_on_load) {
- int channels = req_comp ? req_comp : *comp;
- stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16));
- }
-
- return (stbi__uint16 *) result;
-}
-
-#ifndef STBI_NO_HDR
-static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)
-{
- if (stbi__vertically_flip_on_load && result != NULL) {
- int channels = req_comp ? req_comp : *comp;
- stbi__vertical_flip(result, *x, *y, channels * sizeof(float));
- }
-}
-#endif
-
-#ifndef STBI_NO_STDIO
-
-static FILE *stbi__fopen(char const *filename, char const *mode)
-{
- FILE *f;
-#if defined(_MSC_VER) && _MSC_VER >= 1400
- if (0 != fopen_s(&f, filename, mode))
- f=0;
-#else
- f = fopen(filename, mode);
-#endif
- return f;
-}
-
-
-STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
-{
- FILE *f = stbi__fopen(filename, "rb");
- unsigned char *result;
- if (!f) return stbi__errpuc("can't fopen", "Unable to open file");
- result = stbi_load_from_file(f,x,y,comp,req_comp);
- fclose(f);
- return result;
-}
-
-STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
-{
- unsigned char *result;
- stbi__context s;
- stbi__start_file(&s,f);
- result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
- if (result) {
- // need to 'unget' all the characters in the IO buffer
- fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
- }
- return result;
-}
-
-STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp)
-{
- stbi__uint16 *result;
- stbi__context s;
- stbi__start_file(&s,f);
- result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);
- if (result) {
- // need to 'unget' all the characters in the IO buffer
- fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
- }
- return result;
-}
-
-STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp)
-{
- FILE *f = stbi__fopen(filename, "rb");
- stbi__uint16 *result;
- if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file");
- result = stbi_load_from_file_16(f,x,y,comp,req_comp);
- fclose(f);
- return result;
-}
-
-
-#endif //!STBI_NO_STDIO
-
-STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)
-{
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
- return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
-}
-
-STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)
-{
- stbi__context s;
- stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);
- return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
-}
-
-STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
-{
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
- return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
-}
-
-STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
-{
- stbi__context s;
- stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
- return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
-}
-
-#ifndef STBI_NO_LINEAR
-static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
-{
- unsigned char *data;
- #ifndef STBI_NO_HDR
- if (stbi__hdr_test(s)) {
- stbi__result_info ri;
- float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);
- if (hdr_data)
- stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
- return hdr_data;
- }
- #endif
- data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
- if (data)
- return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
- return stbi__errpf("unknown image type", "Image not of any known type, or corrupt");
-}
-
-STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
-{
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
- return stbi__loadf_main(&s,x,y,comp,req_comp);
-}
-
-STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
-{
- stbi__context s;
- stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
- return stbi__loadf_main(&s,x,y,comp,req_comp);
-}
-
-#ifndef STBI_NO_STDIO
-STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
-{
- float *result;
- FILE *f = stbi__fopen(filename, "rb");
- if (!f) return stbi__errpf("can't fopen", "Unable to open file");
- result = stbi_loadf_from_file(f,x,y,comp,req_comp);
- fclose(f);
- return result;
-}
-
-STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
-{
- stbi__context s;
- stbi__start_file(&s,f);
- return stbi__loadf_main(&s,x,y,comp,req_comp);
-}
-#endif // !STBI_NO_STDIO
-
-#endif // !STBI_NO_LINEAR
-
-// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is
-// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always
-// reports false!
-
-STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
-{
- #ifndef STBI_NO_HDR
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
- return stbi__hdr_test(&s);
- #else
- STBI_NOTUSED(buffer);
- STBI_NOTUSED(len);
- return 0;
- #endif
-}
-
-#ifndef STBI_NO_STDIO
-STBIDEF int stbi_is_hdr (char const *filename)
-{
- FILE *f = stbi__fopen(filename, "rb");
- int result=0;
- if (f) {
- result = stbi_is_hdr_from_file(f);
- fclose(f);
- }
- return result;
-}
-
-STBIDEF int stbi_is_hdr_from_file(FILE *f)
-{
- #ifndef STBI_NO_HDR
- stbi__context s;
- stbi__start_file(&s,f);
- return stbi__hdr_test(&s);
- #else
- STBI_NOTUSED(f);
- return 0;
- #endif
-}
-#endif // !STBI_NO_STDIO
-
-STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
-{
- #ifndef STBI_NO_HDR
- stbi__context s;
- stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
- return stbi__hdr_test(&s);
- #else
- STBI_NOTUSED(clbk);
- STBI_NOTUSED(user);
- return 0;
- #endif
-}
-
-#ifndef STBI_NO_LINEAR
-static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
-
-STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
-STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
-#endif
-
-static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
-
-STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
-STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-// Common code used by all image loaders
-//
-
-enum
-{
- STBI__SCAN_load=0,
- STBI__SCAN_type,
- STBI__SCAN_header
-};
-
-static void stbi__refill_buffer(stbi__context *s)
-{
- int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);
- if (n == 0) {
- // at end of file, treat same as if from memory, but need to handle case
- // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file
- s->read_from_callbacks = 0;
- s->img_buffer = s->buffer_start;
- s->img_buffer_end = s->buffer_start+1;
- *s->img_buffer = 0;
- } else {
- s->img_buffer = s->buffer_start;
- s->img_buffer_end = s->buffer_start + n;
- }
-}
-
-stbi_inline static stbi_uc stbi__get8(stbi__context *s)
-{
- if (s->img_buffer < s->img_buffer_end)
- return *s->img_buffer++;
- if (s->read_from_callbacks) {
- stbi__refill_buffer(s);
- return *s->img_buffer++;
- }
- return 0;
-}
-
-stbi_inline static int stbi__at_eof(stbi__context *s)
-{
- if (s->io.read) {
- if (!(s->io.eof)(s->io_user_data)) return 0;
- // if feof() is true, check if buffer = end
- // special case: we've only got the special 0 character at the end
- if (s->read_from_callbacks == 0) return 1;
- }
-
- return s->img_buffer >= s->img_buffer_end;
-}
-
-static void stbi__skip(stbi__context *s, int n)
-{
- if (n < 0) {
- s->img_buffer = s->img_buffer_end;
- return;
- }
- if (s->io.read) {
- int blen = (int) (s->img_buffer_end - s->img_buffer);
- if (blen < n) {
- s->img_buffer = s->img_buffer_end;
- (s->io.skip)(s->io_user_data, n - blen);
- return;
- }
- }
- s->img_buffer += n;
-}
-
-static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)
-{
- if (s->io.read) {
- int blen = (int) (s->img_buffer_end - s->img_buffer);
- if (blen < n) {
- int res, count;
-
- memcpy(buffer, s->img_buffer, blen);
-
- count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);
- res = (count == (n-blen));
- s->img_buffer = s->img_buffer_end;
- return res;
- }
- }
-
- if (s->img_buffer+n <= s->img_buffer_end) {
- memcpy(buffer, s->img_buffer, n);
- s->img_buffer += n;
- return 1;
- } else
- return 0;
-}
-
-static int stbi__get16be(stbi__context *s)
-{
- int z = stbi__get8(s);
- return (z << 8) + stbi__get8(s);
-}
-
-static stbi__uint32 stbi__get32be(stbi__context *s)
-{
- stbi__uint32 z = stbi__get16be(s);
- return (z << 16) + stbi__get16be(s);
-}
-
-#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
-// nothing
-#else
-static int stbi__get16le(stbi__context *s)
-{
- int z = stbi__get8(s);
- return z + (stbi__get8(s) << 8);
-}
-#endif
-
-#ifndef STBI_NO_BMP
-static stbi__uint32 stbi__get32le(stbi__context *s)
-{
- stbi__uint32 z = stbi__get16le(s);
- return z + (stbi__get16le(s) << 16);
-}
-#endif
-
-#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-// generic converter from built-in img_n to req_comp
-// individual types do this automatically as much as possible (e.g. jpeg
-// does all cases internally since it needs to colorspace convert anyway,
-// and it never has alpha, so very few cases ). png can automatically
-// interleave an alpha=255 channel, but falls back to this for other cases
-//
-// assume data buffer is malloced, so malloc a new one and free that one
-// only failure mode is malloc failing
-
-static stbi_uc stbi__compute_y(int r, int g, int b)
-{
- return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
-}
-
-static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)
-{
- int i,j;
- unsigned char *good;
-
- if (req_comp == img_n) return data;
- STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
-
- good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
- if (good == NULL) {
- STBI_FREE(data);
- return stbi__errpuc("outofmem", "Out of memory");
- }
-
- for (j=0; j < (int) y; ++j) {
- unsigned char *src = data + j * x * img_n ;
- unsigned char *dest = good + j * x * req_comp;
-
- #define STBI__COMBO(a,b) ((a)*8+(b))
- #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
- // convert source image with img_n components to one with req_comp components;
- // avoid switch per pixel, so use switch per scanline and massive macros
- switch (STBI__COMBO(img_n, req_comp)) {
- STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break;
- STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
- STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break;
- STBI__CASE(2,1) { dest[0]=src[0]; } break;
- STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
- STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break;
- STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break;
- STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
- STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break;
- STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
- STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break;
- STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break;
- default: STBI_ASSERT(0);
- }
- #undef STBI__CASE
- }
-
- STBI_FREE(data);
- return good;
-}
-
-static stbi__uint16 stbi__compute_y_16(int r, int g, int b)
-{
- return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8);
-}
-
-static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y)
-{
- int i,j;
- stbi__uint16 *good;
-
- if (req_comp == img_n) return data;
- STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
-
- good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
- if (good == NULL) {
- STBI_FREE(data);
- return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
- }
-
- for (j=0; j < (int) y; ++j) {
- stbi__uint16 *src = data + j * x * img_n ;
- stbi__uint16 *dest = good + j * x * req_comp;
-
- #define STBI__COMBO(a,b) ((a)*8+(b))
- #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
- // convert source image with img_n components to one with req_comp components;
- // avoid switch per pixel, so use switch per scanline and massive macros
- switch (STBI__COMBO(img_n, req_comp)) {
- STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break;
- STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
- STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break;
- STBI__CASE(2,1) { dest[0]=src[0]; } break;
- STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
- STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break;
- STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break;
- STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;
- STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break;
- STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;
- STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break;
- STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break;
- default: STBI_ASSERT(0);
- }
- #undef STBI__CASE
- }
-
- STBI_FREE(data);
- return good;
-}
-
-#ifndef STBI_NO_LINEAR
-static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
-{
- int i,k,n;
- float *output;
- if (!data) return NULL;
- output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0);
- if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); }
- // compute number of non-alpha components
- if (comp & 1) n = comp; else n = comp-1;
- for (i=0; i < x*y; ++i) {
- for (k=0; k < n; ++k) {
- output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
- }
- if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
- }
- STBI_FREE(data);
- return output;
-}
-#endif
-
-#ifndef STBI_NO_HDR
-#define stbi__float2int(x) ((int) (x))
-static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp)
-{
- int i,k,n;
- stbi_uc *output;
- if (!data) return NULL;
- output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
- if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); }
- // compute number of non-alpha components
- if (comp & 1) n = comp; else n = comp-1;
- for (i=0; i < x*y; ++i) {
- for (k=0; k < n; ++k) {
- float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
- if (z < 0) z = 0;
- if (z > 255) z = 255;
- output[i*comp + k] = (stbi_uc) stbi__float2int(z);
- }
- if (k < comp) {
- float z = data[i*comp+k] * 255 + 0.5f;
- if (z < 0) z = 0;
- if (z > 255) z = 255;
- output[i*comp + k] = (stbi_uc) stbi__float2int(z);
- }
- }
- STBI_FREE(data);
- return output;
-}
-#endif
-
-//////////////////////////////////////////////////////////////////////////////
-//
-// "baseline" JPEG/JFIF decoder
-//
-// simple implementation
-// - doesn't support delayed output of y-dimension
-// - simple interface (only one output format: 8-bit interleaved RGB)
-// - doesn't try to recover corrupt jpegs
-// - doesn't allow partial loading, loading multiple at once
-// - still fast on x86 (copying globals into locals doesn't help x86)
-// - allocates lots of intermediate memory (full size of all components)
-// - non-interleaved case requires this anyway
-// - allows good upsampling (see next)
-// high-quality
-// - upsampled channels are bilinearly interpolated, even across blocks
-// - quality integer IDCT derived from IJG's 'slow'
-// performance
-// - fast huffman; reasonable integer IDCT
-// - some SIMD kernels for common paths on targets with SSE2/NEON
-// - uses a lot of intermediate memory, could cache poorly
-
-#ifndef STBI_NO_JPEG
-
-// huffman decoding acceleration
-#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
-
-typedef struct
-{
- stbi_uc fast[1 << FAST_BITS];
- // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
- stbi__uint16 code[256];
- stbi_uc values[256];
- stbi_uc size[257];
- unsigned int maxcode[18];
- int delta[17]; // old 'firstsymbol' - old 'firstcode'
-} stbi__huffman;
-
-typedef struct
-{
- stbi__context *s;
- stbi__huffman huff_dc[4];
- stbi__huffman huff_ac[4];
- stbi__uint16 dequant[4][64];
- stbi__int16 fast_ac[4][1 << FAST_BITS];
-
-// sizes for components, interleaved MCUs
- int img_h_max, img_v_max;
- int img_mcu_x, img_mcu_y;
- int img_mcu_w, img_mcu_h;
-
-// definition of jpeg image component
- struct
- {
- int id;
- int h,v;
- int tq;
- int hd,ha;
- int dc_pred;
-
- int x,y,w2,h2;
- stbi_uc *data;
- void *raw_data, *raw_coeff;
- stbi_uc *linebuf;
- short *coeff; // progressive only
- int coeff_w, coeff_h; // number of 8x8 coefficient blocks
- } img_comp[4];
-
- stbi__uint32 code_buffer; // jpeg entropy-coded buffer
- int code_bits; // number of valid bits
- unsigned char marker; // marker seen while filling entropy buffer
- int nomore; // flag if we saw a marker so must stop
-
- int progressive;
- int spec_start;
- int spec_end;
- int succ_high;
- int succ_low;
- int eob_run;
- int jfif;
- int app14_color_transform; // Adobe APP14 tag
- int rgb;
-
- int scan_n, order[4];
- int restart_interval, todo;
-
-// kernels
- void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);
- void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);
- stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);
-} stbi__jpeg;
-
-static int stbi__build_huffman(stbi__huffman *h, int *count)
-{
- int i,j,k=0,code;
- // build size list for each symbol (from JPEG spec)
- for (i=0; i < 16; ++i)
- for (j=0; j < count[i]; ++j)
- h->size[k++] = (stbi_uc) (i+1);
- h->size[k] = 0;
-
- // compute actual symbols (from jpeg spec)
- code = 0;
- k = 0;
- for(j=1; j <= 16; ++j) {
- // compute delta to add to code to compute symbol id
- h->delta[j] = k - code;
- if (h->size[k] == j) {
- while (h->size[k] == j)
- h->code[k++] = (stbi__uint16) (code++);
- if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG");
- }
- // compute largest code + 1 for this size, preshifted as needed later
- h->maxcode[j] = code << (16-j);
- code <<= 1;
- }
- h->maxcode[j] = 0xffffffff;
-
- // build non-spec acceleration table; 255 is flag for not-accelerated
- memset(h->fast, 255, 1 << FAST_BITS);
- for (i=0; i < k; ++i) {
- int s = h->size[i];
- if (s <= FAST_BITS) {
- int c = h->code[i] << (FAST_BITS-s);
- int m = 1 << (FAST_BITS-s);
- for (j=0; j < m; ++j) {
- h->fast[c+j] = (stbi_uc) i;
- }
- }
- }
- return 1;
-}
-
-// build a table that decodes both magnitude and value of small ACs in
-// one go.
-static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
-{
- int i;
- for (i=0; i < (1 << FAST_BITS); ++i) {
- stbi_uc fast = h->fast[i];
- fast_ac[i] = 0;
- if (fast < 255) {
- int rs = h->values[fast];
- int run = (rs >> 4) & 15;
- int magbits = rs & 15;
- int len = h->size[fast];
-
- if (magbits && len + magbits <= FAST_BITS) {
- // magnitude code followed by receive_extend code
- int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
- int m = 1 << (magbits - 1);
- if (k < m) k += (~0U << magbits) + 1;
- // if the result is small enough, we can fit it in fast_ac table
- if (k >= -128 && k <= 127)
- fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));
- }
- }
- }
-}
-
-static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
-{
- do {
- int b = j->nomore ? 0 : stbi__get8(j->s);
- if (b == 0xff) {
- int c = stbi__get8(j->s);
- while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes
- if (c != 0) {
- j->marker = (unsigned char) c;
- j->nomore = 1;
- return;
- }
- }
- j->code_buffer |= b << (24 - j->code_bits);
- j->code_bits += 8;
- } while (j->code_bits <= 24);
-}
-
-// (1 << n) - 1
-static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
-
-// decode a jpeg huffman value from the bitstream
-stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
-{
- unsigned int temp;
- int c,k;
-
- if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
-
- // look at the top FAST_BITS and determine what symbol ID it is,
- // if the code is <= FAST_BITS
- c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
- k = h->fast[c];
- if (k < 255) {
- int s = h->size[k];
- if (s > j->code_bits)
- return -1;
- j->code_buffer <<= s;
- j->code_bits -= s;
- return h->values[k];
- }
-
- // naive test is to shift the code_buffer down so k bits are
- // valid, then test against maxcode. To speed this up, we've
- // preshifted maxcode left so that it has (16-k) 0s at the
- // end; in other words, regardless of the number of bits, it
- // wants to be compared against something shifted to have 16;
- // that way we don't need to shift inside the loop.
- temp = j->code_buffer >> 16;
- for (k=FAST_BITS+1 ; ; ++k)
- if (temp < h->maxcode[k])
- break;
- if (k == 17) {
- // error! code not found
- j->code_bits -= 16;
- return -1;
- }
-
- if (k > j->code_bits)
- return -1;
-
- // convert the huffman code to the symbol id
- c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
- STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
-
- // convert the id to a symbol
- j->code_bits -= k;
- j->code_buffer <<= k;
- return h->values[c];
-}
-
-// bias[n] = (-1<<n) + 1
-static int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
-
-// combined JPEG 'receive' and JPEG 'extend', since baseline
-// always extends everything it receives.
-stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)
-{
- unsigned int k;
- int sgn;
- if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
-
- sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB
- k = stbi_lrot(j->code_buffer, n);
- STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask)));
- j->code_buffer = k & ~stbi__bmask[n];
- k &= stbi__bmask[n];
- j->code_bits -= n;
- return k + (stbi__jbias[n] & ~sgn);
-}
-
-// get some unsigned bits
-stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)
-{
- unsigned int k;
- if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
- k = stbi_lrot(j->code_buffer, n);
- j->code_buffer = k & ~stbi__bmask[n];
- k &= stbi__bmask[n];
- j->code_bits -= n;
- return k;
-}
-
-stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)
-{
- unsigned int k;
- if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
- k = j->code_buffer;
- j->code_buffer <<= 1;
- --j->code_bits;
- return k & 0x80000000;
-}
-
-// given a value that's at position X in the zigzag stream,
-// where does it appear in the 8x8 matrix coded as row-major?
-static stbi_uc stbi__jpeg_dezigzag[64+15] =
-{
- 0, 1, 8, 16, 9, 2, 3, 10,
- 17, 24, 32, 25, 18, 11, 4, 5,
- 12, 19, 26, 33, 40, 48, 41, 34,
- 27, 20, 13, 6, 7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36,
- 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46,
- 53, 60, 61, 54, 47, 55, 62, 63,
- // let corrupt input sample past end
- 63, 63, 63, 63, 63, 63, 63, 63,
- 63, 63, 63, 63, 63, 63, 63
-};
-
-// decode one 64-entry block--
-static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant)
-{
- int diff,dc,k;
- int t;
-
- if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
- t = stbi__jpeg_huff_decode(j, hdc);
- if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG");
-
- // 0 all the ac values now so we can do it 32-bits at a time
- memset(data,0,64*sizeof(data[0]));
-
- diff = t ? stbi__extend_receive(j, t) : 0;
- dc = j->img_comp[b].dc_pred + diff;
- j->img_comp[b].dc_pred = dc;
- data[0] = (short) (dc * dequant[0]);
-
- // decode AC components, see JPEG spec
- k = 1;
- do {
- unsigned int zig;
- int c,r,s;
- if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
- c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
- r = fac[c];
- if (r) { // fast-AC path
- k += (r >> 4) & 15; // run
- s = r & 15; // combined length
- j->code_buffer <<= s;
- j->code_bits -= s;
- // decode into unzigzag'd location
- zig = stbi__jpeg_dezigzag[k++];
- data[zig] = (short) ((r >> 8) * dequant[zig]);
- } else {
- int rs = stbi__jpeg_huff_decode(j, hac);
- if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
- s = rs & 15;
- r = rs >> 4;
- if (s == 0) {
- if (rs != 0xf0) break; // end block
- k += 16;
- } else {
- k += r;
- // decode into unzigzag'd location
- zig = stbi__jpeg_dezigzag[k++];
- data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
- }
- }
- } while (k < 64);
- return 1;
-}
-
-static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)
-{
- int diff,dc;
- int t;
- if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
-
- if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
-
- if (j->succ_high == 0) {
- // first scan for DC coefficient, must be first
- memset(data,0,64*sizeof(data[0])); // 0 all the ac values now
- t = stbi__jpeg_huff_decode(j, hdc);
- diff = t ? stbi__extend_receive(j, t) : 0;
-
- dc = j->img_comp[b].dc_pred + diff;
- j->img_comp[b].dc_pred = dc;
- data[0] = (short) (dc << j->succ_low);
- } else {
- // refinement scan for DC coefficient
- if (stbi__jpeg_get_bit(j))
- data[0] += (short) (1 << j->succ_low);
- }
- return 1;
-}
-
-// @OPTIMIZE: store non-zigzagged during the decode passes,
-// and only de-zigzag when dequantizing
-static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)
-{
- int k;
- if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
-
- if (j->succ_high == 0) {
- int shift = j->succ_low;
-
- if (j->eob_run) {
- --j->eob_run;
- return 1;
- }
-
- k = j->spec_start;
- do {
- unsigned int zig;
- int c,r,s;
- if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
- c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
- r = fac[c];
- if (r) { // fast-AC path
- k += (r >> 4) & 15; // run
- s = r & 15; // combined length
- j->code_buffer <<= s;
- j->code_bits -= s;
- zig = stbi__jpeg_dezigzag[k++];
- data[zig] = (short) ((r >> 8) << shift);
- } else {
- int rs = stbi__jpeg_huff_decode(j, hac);
- if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
- s = rs & 15;
- r = rs >> 4;
- if (s == 0) {
- if (r < 15) {
- j->eob_run = (1 << r);
- if (r)
- j->eob_run += stbi__jpeg_get_bits(j, r);
- --j->eob_run;
- break;
- }
- k += 16;
- } else {
- k += r;
- zig = stbi__jpeg_dezigzag[k++];
- data[zig] = (short) (stbi__extend_receive(j,s) << shift);
- }
- }
- } while (k <= j->spec_end);
- } else {
- // refinement scan for these AC coefficients
-
- short bit = (short) (1 << j->succ_low);
-
- if (j->eob_run) {
- --j->eob_run;
- for (k = j->spec_start; k <= j->spec_end; ++k) {
- short *p = &data[stbi__jpeg_dezigzag[k]];
- if (*p != 0)
- if (stbi__jpeg_get_bit(j))
- if ((*p & bit)==0) {
- if (*p > 0)
- *p += bit;
- else
- *p -= bit;
- }
- }
- } else {
- k = j->spec_start;
- do {
- int r,s;
- int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh
- if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
- s = rs & 15;
- r = rs >> 4;
- if (s == 0) {
- if (r < 15) {
- j->eob_run = (1 << r) - 1;
- if (r)
- j->eob_run += stbi__jpeg_get_bits(j, r);
- r = 64; // force end of block
- } else {
- // r=15 s=0 should write 16 0s, so we just do
- // a run of 15 0s and then write s (which is 0),
- // so we don't have to do anything special here
- }
- } else {
- if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG");
- // sign bit
- if (stbi__jpeg_get_bit(j))
- s = bit;
- else
- s = -bit;
- }
-
- // advance by r
- while (k <= j->spec_end) {
- short *p = &data[stbi__jpeg_dezigzag[k++]];
- if (*p != 0) {
- if (stbi__jpeg_get_bit(j))
- if ((*p & bit)==0) {
- if (*p > 0)
- *p += bit;
- else
- *p -= bit;
- }
- } else {
- if (r == 0) {
- *p = (short) s;
- break;
- }
- --r;
- }
- }
- } while (k <= j->spec_end);
- }
- }
- return 1;
-}
-
-// take a -128..127 value and stbi__clamp it and convert to 0..255
-stbi_inline static stbi_uc stbi__clamp(int x)
-{
- // trick to use a single test to catch both cases
- if ((unsigned int) x > 255) {
- if (x < 0) return 0;
- if (x > 255) return 255;
- }
- return (stbi_uc) x;
-}
-
-#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
-#define stbi__fsh(x) ((x) << 12)
-
-// derived from jidctint -- DCT_ISLOW
-#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
- int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
- p2 = s2; \
- p3 = s6; \
- p1 = (p2+p3) * stbi__f2f(0.5411961f); \
- t2 = p1 + p3*stbi__f2f(-1.847759065f); \
- t3 = p1 + p2*stbi__f2f( 0.765366865f); \
- p2 = s0; \
- p3 = s4; \
- t0 = stbi__fsh(p2+p3); \
- t1 = stbi__fsh(p2-p3); \
- x0 = t0+t3; \
- x3 = t0-t3; \
- x1 = t1+t2; \
- x2 = t1-t2; \
- t0 = s7; \
- t1 = s5; \
- t2 = s3; \
- t3 = s1; \
- p3 = t0+t2; \
- p4 = t1+t3; \
- p1 = t0+t3; \
- p2 = t1+t2; \
- p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
- t0 = t0*stbi__f2f( 0.298631336f); \
- t1 = t1*stbi__f2f( 2.053119869f); \
- t2 = t2*stbi__f2f( 3.072711026f); \
- t3 = t3*stbi__f2f( 1.501321110f); \
- p1 = p5 + p1*stbi__f2f(-0.899976223f); \
- p2 = p5 + p2*stbi__f2f(-2.562915447f); \
- p3 = p3*stbi__f2f(-1.961570560f); \
- p4 = p4*stbi__f2f(-0.390180644f); \
- t3 += p1+p4; \
- t2 += p2+p3; \
- t1 += p2+p4; \
- t0 += p1+p3;
-
-static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])
-{
- int i,val[64],*v=val;
- stbi_uc *o;
- short *d = data;
-
- // columns
- for (i=0; i < 8; ++i,++d, ++v) {
- // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
- if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
- && d[40]==0 && d[48]==0 && d[56]==0) {
- // no shortcut 0 seconds
- // (1|2|3|4|5|6|7)==0 0 seconds
- // all separate -0.047 seconds
- // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds
- int dcterm = d[0] << 2;
- v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
- } else {
- STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
- // constants scaled things up by 1<<12; let's bring them back
- // down, but keep 2 extra bits of precision
- x0 += 512; x1 += 512; x2 += 512; x3 += 512;
- v[ 0] = (x0+t3) >> 10;
- v[56] = (x0-t3) >> 10;
- v[ 8] = (x1+t2) >> 10;
- v[48] = (x1-t2) >> 10;
- v[16] = (x2+t1) >> 10;
- v[40] = (x2-t1) >> 10;
- v[24] = (x3+t0) >> 10;
- v[32] = (x3-t0) >> 10;
- }
- }
-
- for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
- // no fast case since the first 1D IDCT spread components out
- STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
- // constants scaled things up by 1<<12, plus we had 1<<2 from first
- // loop, plus horizontal and vertical each scale by sqrt(8) so together
- // we've got an extra 1<<3, so 1<<17 total we need to remove.
- // so we want to round that, which means adding 0.5 * 1<<17,
- // aka 65536. Also, we'll end up with -128 to 127 that we want
- // to encode as 0..255 by adding 128, so we'll add that before the shift
- x0 += 65536 + (128<<17);
- x1 += 65536 + (128<<17);
- x2 += 65536 + (128<<17);
- x3 += 65536 + (128<<17);
- // tried computing the shifts into temps, or'ing the temps to see
- // if any were out of range, but that was slower
- o[0] = stbi__clamp((x0+t3) >> 17);
- o[7] = stbi__clamp((x0-t3) >> 17);
- o[1] = stbi__clamp((x1+t2) >> 17);
- o[6] = stbi__clamp((x1-t2) >> 17);
- o[2] = stbi__clamp((x2+t1) >> 17);
- o[5] = stbi__clamp((x2-t1) >> 17);
- o[3] = stbi__clamp((x3+t0) >> 17);
- o[4] = stbi__clamp((x3-t0) >> 17);
- }
-}
-
-#ifdef STBI_SSE2
-// sse2 integer IDCT. not the fastest possible implementation but it
-// produces bit-identical results to the generic C version so it's
-// fully "transparent".
-static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
-{
- // This is constructed to match our regular (generic) integer IDCT exactly.
- __m128i row0, row1, row2, row3, row4, row5, row6, row7;
- __m128i tmp;
-
- // dot product constant: even elems=x, odd elems=y
- #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
-
- // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit)
- // out(1) = c1[even]*x + c1[odd]*y
- #define dct_rot(out0,out1, x,y,c0,c1) \
- __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
- __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
- __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
- __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
- __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
- __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
-
- // out = in << 12 (in 16-bit, out 32-bit)
- #define dct_widen(out, in) \
- __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
- __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
-
- // wide add
- #define dct_wadd(out, a, b) \
- __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
- __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
-
- // wide sub
- #define dct_wsub(out, a, b) \
- __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
- __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
-
- // butterfly a/b, add bias, then shift by "s" and pack
- #define dct_bfly32o(out0, out1, a,b,bias,s) \
- { \
- __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
- __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
- dct_wadd(sum, abiased, b); \
- dct_wsub(dif, abiased, b); \
- out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
- out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
- }
-
- // 8-bit interleave step (for transposes)
- #define dct_interleave8(a, b) \
- tmp = a; \
- a = _mm_unpacklo_epi8(a, b); \
- b = _mm_unpackhi_epi8(tmp, b)
-
- // 16-bit interleave step (for transposes)
- #define dct_interleave16(a, b) \
- tmp = a; \
- a = _mm_unpacklo_epi16(a, b); \
- b = _mm_unpackhi_epi16(tmp, b)
-
- #define dct_pass(bias,shift) \
- { \
- /* even part */ \
- dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
- __m128i sum04 = _mm_add_epi16(row0, row4); \
- __m128i dif04 = _mm_sub_epi16(row0, row4); \
- dct_widen(t0e, sum04); \
- dct_widen(t1e, dif04); \
- dct_wadd(x0, t0e, t3e); \
- dct_wsub(x3, t0e, t3e); \
- dct_wadd(x1, t1e, t2e); \
- dct_wsub(x2, t1e, t2e); \
- /* odd part */ \
- dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
- dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
- __m128i sum17 = _mm_add_epi16(row1, row7); \
- __m128i sum35 = _mm_add_epi16(row3, row5); \
- dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
- dct_wadd(x4, y0o, y4o); \
- dct_wadd(x5, y1o, y5o); \
- dct_wadd(x6, y2o, y5o); \
- dct_wadd(x7, y3o, y4o); \
- dct_bfly32o(row0,row7, x0,x7,bias,shift); \
- dct_bfly32o(row1,row6, x1,x6,bias,shift); \
- dct_bfly32o(row2,row5, x2,x5,bias,shift); \
- dct_bfly32o(row3,row4, x3,x4,bias,shift); \
- }
-
- __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
- __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
- __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
- __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
- __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
- __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
- __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
- __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
-
- // rounding biases in column/row passes, see stbi__idct_block for explanation.
- __m128i bias_0 = _mm_set1_epi32(512);
- __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
-
- // load
- row0 = _mm_load_si128((const __m128i *) (data + 0*8));
- row1 = _mm_load_si128((const __m128i *) (data + 1*8));
- row2 = _mm_load_si128((const __m128i *) (data + 2*8));
- row3 = _mm_load_si128((const __m128i *) (data + 3*8));
- row4 = _mm_load_si128((const __m128i *) (data + 4*8));
- row5 = _mm_load_si128((const __m128i *) (data + 5*8));
- row6 = _mm_load_si128((const __m128i *) (data + 6*8));
- row7 = _mm_load_si128((const __m128i *) (data + 7*8));
-
- // column pass
- dct_pass(bias_0, 10);
-
- {
- // 16bit 8x8 transpose pass 1
- dct_interleave16(row0, row4);
- dct_interleave16(row1, row5);
- dct_interleave16(row2, row6);
- dct_interleave16(row3, row7);
-
- // transpose pass 2
- dct_interleave16(row0, row2);
- dct_interleave16(row1, row3);
- dct_interleave16(row4, row6);
- dct_interleave16(row5, row7);
-
- // transpose pass 3
- dct_interleave16(row0, row1);
- dct_interleave16(row2, row3);
- dct_interleave16(row4, row5);
- dct_interleave16(row6, row7);
- }
-
- // row pass
- dct_pass(bias_1, 17);
-
- {
- // pack
- __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7
- __m128i p1 = _mm_packus_epi16(row2, row3);
- __m128i p2 = _mm_packus_epi16(row4, row5);
- __m128i p3 = _mm_packus_epi16(row6, row7);
-
- // 8bit 8x8 transpose pass 1
- dct_interleave8(p0, p2); // a0e0a1e1...
- dct_interleave8(p1, p3); // c0g0c1g1...
-
- // transpose pass 2
- dct_interleave8(p0, p1); // a0c0e0g0...
- dct_interleave8(p2, p3); // b0d0f0h0...
-
- // transpose pass 3
- dct_interleave8(p0, p2); // a0b0c0d0...
- dct_interleave8(p1, p3); // a4b4c4d4...
-
- // store
- _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
- _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
- _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
- _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
- _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
- _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
- _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
- _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
- }
-
-#undef dct_const
-#undef dct_rot
-#undef dct_widen
-#undef dct_wadd
-#undef dct_wsub
-#undef dct_bfly32o
-#undef dct_interleave8
-#undef dct_interleave16
-#undef dct_pass
-}
-
-#endif // STBI_SSE2
-
-#ifdef STBI_NEON
-
-// NEON integer IDCT. should produce bit-identical
-// results to the generic C version.
-static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
-{
- int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
-
- int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
- int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
- int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
- int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
- int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
- int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
- int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
- int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
- int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
- int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
- int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
- int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
-
-#define dct_long_mul(out, inq, coeff) \
- int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
- int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
-
-#define dct_long_mac(out, acc, inq, coeff) \
- int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
- int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
-
-#define dct_widen(out, inq) \
- int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
- int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
-
-// wide add
-#define dct_wadd(out, a, b) \
- int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
- int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
-
-// wide sub
-#define dct_wsub(out, a, b) \
- int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
- int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
-
-// butterfly a/b, then shift using "shiftop" by "s" and pack
-#define dct_bfly32o(out0,out1, a,b,shiftop,s) \
- { \
- dct_wadd(sum, a, b); \
- dct_wsub(dif, a, b); \
- out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
- out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
- }
-
-#define dct_pass(shiftop, shift) \
- { \
- /* even part */ \
- int16x8_t sum26 = vaddq_s16(row2, row6); \
- dct_long_mul(p1e, sum26, rot0_0); \
- dct_long_mac(t2e, p1e, row6, rot0_1); \
- dct_long_mac(t3e, p1e, row2, rot0_2); \
- int16x8_t sum04 = vaddq_s16(row0, row4); \
- int16x8_t dif04 = vsubq_s16(row0, row4); \
- dct_widen(t0e, sum04); \
- dct_widen(t1e, dif04); \
- dct_wadd(x0, t0e, t3e); \
- dct_wsub(x3, t0e, t3e); \
- dct_wadd(x1, t1e, t2e); \
- dct_wsub(x2, t1e, t2e); \
- /* odd part */ \
- int16x8_t sum15 = vaddq_s16(row1, row5); \
- int16x8_t sum17 = vaddq_s16(row1, row7); \
- int16x8_t sum35 = vaddq_s16(row3, row5); \
- int16x8_t sum37 = vaddq_s16(row3, row7); \
- int16x8_t sumodd = vaddq_s16(sum17, sum35); \
- dct_long_mul(p5o, sumodd, rot1_0); \
- dct_long_mac(p1o, p5o, sum17, rot1_1); \
- dct_long_mac(p2o, p5o, sum35, rot1_2); \
- dct_long_mul(p3o, sum37, rot2_0); \
- dct_long_mul(p4o, sum15, rot2_1); \
- dct_wadd(sump13o, p1o, p3o); \
- dct_wadd(sump24o, p2o, p4o); \
- dct_wadd(sump23o, p2o, p3o); \
- dct_wadd(sump14o, p1o, p4o); \
- dct_long_mac(x4, sump13o, row7, rot3_0); \
- dct_long_mac(x5, sump24o, row5, rot3_1); \
- dct_long_mac(x6, sump23o, row3, rot3_2); \
- dct_long_mac(x7, sump14o, row1, rot3_3); \
- dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
- dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
- dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
- dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
- }
-
- // load
- row0 = vld1q_s16(data + 0*8);
- row1 = vld1q_s16(data + 1*8);
- row2 = vld1q_s16(data + 2*8);
- row3 = vld1q_s16(data + 3*8);
- row4 = vld1q_s16(data + 4*8);
- row5 = vld1q_s16(data + 5*8);
- row6 = vld1q_s16(data + 6*8);
- row7 = vld1q_s16(data + 7*8);
-
- // add DC bias
- row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
-
- // column pass
- dct_pass(vrshrn_n_s32, 10);
-
- // 16bit 8x8 transpose
- {
-// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.
-// whether compilers actually get this is another story, sadly.
-#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
-#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }
-#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }
-
- // pass 1
- dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6
- dct_trn16(row2, row3);
- dct_trn16(row4, row5);
- dct_trn16(row6, row7);
-
- // pass 2
- dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4
- dct_trn32(row1, row3);
- dct_trn32(row4, row6);
- dct_trn32(row5, row7);
-
- // pass 3
- dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0
- dct_trn64(row1, row5);
- dct_trn64(row2, row6);
- dct_trn64(row3, row7);
-
-#undef dct_trn16
-#undef dct_trn32
-#undef dct_trn64
- }
-
- // row pass
- // vrshrn_n_s32 only supports shifts up to 16, we need
- // 17. so do a non-rounding shift of 16 first then follow
- // up with a rounding shift by 1.
- dct_pass(vshrn_n_s32, 16);
-
- {
- // pack and round
- uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
- uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
- uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
- uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
- uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
- uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
- uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
- uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
-
- // again, these can translate into one instruction, but often don't.
-#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
-#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }
-#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }
-
- // sadly can't use interleaved stores here since we only write
- // 8 bytes to each scan line!
-
- // 8x8 8-bit transpose pass 1
- dct_trn8_8(p0, p1);
- dct_trn8_8(p2, p3);
- dct_trn8_8(p4, p5);
- dct_trn8_8(p6, p7);
-
- // pass 2
- dct_trn8_16(p0, p2);
- dct_trn8_16(p1, p3);
- dct_trn8_16(p4, p6);
- dct_trn8_16(p5, p7);
-
- // pass 3
- dct_trn8_32(p0, p4);
- dct_trn8_32(p1, p5);
- dct_trn8_32(p2, p6);
- dct_trn8_32(p3, p7);
-
- // store
- vst1_u8(out, p0); out += out_stride;
- vst1_u8(out, p1); out += out_stride;
- vst1_u8(out, p2); out += out_stride;
- vst1_u8(out, p3); out += out_stride;
- vst1_u8(out, p4); out += out_stride;
- vst1_u8(out, p5); out += out_stride;
- vst1_u8(out, p6); out += out_stride;
- vst1_u8(out, p7);
-
-#undef dct_trn8_8
-#undef dct_trn8_16
-#undef dct_trn8_32
- }
-
-#undef dct_long_mul
-#undef dct_long_mac
-#undef dct_widen
-#undef dct_wadd
-#undef dct_wsub
-#undef dct_bfly32o
-#undef dct_pass
-}
-
-#endif // STBI_NEON
-
-#define STBI__MARKER_none 0xff
-// if there's a pending marker from the entropy stream, return that
-// otherwise, fetch from the stream and get a marker. if there's no
-// marker, return 0xff, which is never a valid marker value
-static stbi_uc stbi__get_marker(stbi__jpeg *j)
-{
- stbi_uc x;
- if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }
- x = stbi__get8(j->s);
- if (x != 0xff) return STBI__MARKER_none;
- while (x == 0xff)
- x = stbi__get8(j->s); // consume repeated 0xff fill bytes
- return x;
-}
-
-// in each scan, we'll have scan_n components, and the order
-// of the components is specified by order[]
-#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
-
-// after a restart interval, stbi__jpeg_reset the entropy decoder and
-// the dc prediction
-static void stbi__jpeg_reset(stbi__jpeg *j)
-{
- j->code_bits = 0;
- j->code_buffer = 0;
- j->nomore = 0;
- j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;
- j->marker = STBI__MARKER_none;
- j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
- j->eob_run = 0;
- // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,
- // since we don't even allow 1<<30 pixels
-}
-
-static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
-{
- stbi__jpeg_reset(z);
- if (!z->progressive) {
- if (z->scan_n == 1) {
- int i,j;
- STBI_SIMD_ALIGN(short, data[64]);
- int n = z->order[0];
- // non-interleaved data, we just need to process one block at a time,
- // in trivial scanline order
- // number of blocks to do just depends on how many actual "pixels" this
- // component has, independent of interleaved MCU blocking and such
- int w = (z->img_comp[n].x+7) >> 3;
- int h = (z->img_comp[n].y+7) >> 3;
- for (j=0; j < h; ++j) {
- for (i=0; i < w; ++i) {
- int ha = z->img_comp[n].ha;
- if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;
- z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
- // every data block is an MCU, so countdown the restart interval
- if (--z->todo <= 0) {
- if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
- // if it's NOT a restart, then just bail, so we get corrupt data
- // rather than no data
- if (!STBI__RESTART(z->marker)) return 1;
- stbi__jpeg_reset(z);
- }
- }
- }
- return 1;
- } else { // interleaved
- int i,j,k,x,y;
- STBI_SIMD_ALIGN(short, data[64]);
- for (j=0; j < z->img_mcu_y; ++j) {
- for (i=0; i < z->img_mcu_x; ++i) {
- // scan an interleaved mcu... process scan_n components in order
- for (k=0; k < z->scan_n; ++k) {
- int n = z->order[k];
- // scan out an mcu's worth of this component; that's just determined
- // by the basic H and V specified for the component
- for (y=0; y < z->img_comp[n].v; ++y) {
- for (x=0; x < z->img_comp[n].h; ++x) {
- int x2 = (i*z->img_comp[n].h + x)*8;
- int y2 = (j*z->img_comp[n].v + y)*8;
- int ha = z->img_comp[n].ha;
- if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;
- z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
- }
- }
- }
- // after all interleaved components, that's an interleaved MCU,
- // so now count down the restart interval
- if (--z->todo <= 0) {
- if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
- if (!STBI__RESTART(z->marker)) return 1;
- stbi__jpeg_reset(z);
- }
- }
- }
- return 1;
- }
- } else {
- if (z->scan_n == 1) {
- int i,j;
- int n = z->order[0];
- // non-interleaved data, we just need to process one block at a time,
- // in trivial scanline order
- // number of blocks to do just depends on how many actual "pixels" this
- // component has, independent of interleaved MCU blocking and such
- int w = (z->img_comp[n].x+7) >> 3;
- int h = (z->img_comp[n].y+7) >> 3;
- for (j=0; j < h; ++j) {
- for (i=0; i < w; ++i) {
- short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
- if (z->spec_start == 0) {
- if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
- return 0;
- } else {
- int ha = z->img_comp[n].ha;
- if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
- return 0;
- }
- // every data block is an MCU, so countdown the restart interval
- if (--z->todo <= 0) {
- if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
- if (!STBI__RESTART(z->marker)) return 1;
- stbi__jpeg_reset(z);
- }
- }
- }
- return 1;
- } else { // interleaved
- int i,j,k,x,y;
- for (j=0; j < z->img_mcu_y; ++j) {
- for (i=0; i < z->img_mcu_x; ++i) {
- // scan an interleaved mcu... process scan_n components in order
- for (k=0; k < z->scan_n; ++k) {
- int n = z->order[k];
- // scan out an mcu's worth of this component; that's just determined
- // by the basic H and V specified for the component
- for (y=0; y < z->img_comp[n].v; ++y) {
- for (x=0; x < z->img_comp[n].h; ++x) {
- int x2 = (i*z->img_comp[n].h + x);
- int y2 = (j*z->img_comp[n].v + y);
- short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
- if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
- return 0;
- }
- }
- }
- // after all interleaved components, that's an interleaved MCU,
- // so now count down the restart interval
- if (--z->todo <= 0) {
- if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
- if (!STBI__RESTART(z->marker)) return 1;
- stbi__jpeg_reset(z);
- }
- }
- }
- return 1;
- }
- }
-}
-
-static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant)
-{
- int i;
- for (i=0; i < 64; ++i)
- data[i] *= dequant[i];
-}
-
-static void stbi__jpeg_finish(stbi__jpeg *z)
-{
- if (z->progressive) {
- // dequantize and idct the data
- int i,j,n;
- for (n=0; n < z->s->img_n; ++n) {
- int w = (z->img_comp[n].x+7) >> 3;
- int h = (z->img_comp[n].y+7) >> 3;
- for (j=0; j < h; ++j) {
- for (i=0; i < w; ++i) {
- short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
- stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
- z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
- }
- }
- }
- }
-}
-
-static int stbi__process_marker(stbi__jpeg *z, int m)
-{
- int L;
- switch (m) {
- case STBI__MARKER_none: // no marker found
- return stbi__err("expected marker","Corrupt JPEG");
-
- case 0xDD: // DRI - specify restart interval
- if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG");
- z->restart_interval = stbi__get16be(z->s);
- return 1;
-
- case 0xDB: // DQT - define quantization table
- L = stbi__get16be(z->s)-2;
- while (L > 0) {
- int q = stbi__get8(z->s);
- int p = q >> 4, sixteen = (p != 0);
- int t = q & 15,i;
- if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG");
- if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");
-
- for (i=0; i < 64; ++i)
- z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
- L -= (sixteen ? 129 : 65);
- }
- return L==0;
-
- case 0xC4: // DHT - define huffman table
- L = stbi__get16be(z->s)-2;
- while (L > 0) {
- stbi_uc *v;
- int sizes[16],i,n=0;
- int q = stbi__get8(z->s);
- int tc = q >> 4;
- int th = q & 15;
- if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG");
- for (i=0; i < 16; ++i) {
- sizes[i] = stbi__get8(z->s);
- n += sizes[i];
- }
- L -= 17;
- if (tc == 0) {
- if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;
- v = z->huff_dc[th].values;
- } else {
- if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;
- v = z->huff_ac[th].values;
- }
- for (i=0; i < n; ++i)
- v[i] = stbi__get8(z->s);
- if (tc != 0)
- stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
- L -= n;
- }
- return L==0;
- }
-
- // check for comment block or APP blocks
- if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
- L = stbi__get16be(z->s);
- if (L < 2) {
- if (m == 0xFE)
- return stbi__err("bad COM len","Corrupt JPEG");
- else
- return stbi__err("bad APP len","Corrupt JPEG");
- }
- L -= 2;
-
- if (m == 0xE0 && L >= 5) { // JFIF APP0 segment
- static const unsigned char tag[5] = {'J','F','I','F','\0'};
- int ok = 1;
- int i;
- for (i=0; i < 5; ++i)
- if (stbi__get8(z->s) != tag[i])
- ok = 0;
- L -= 5;
- if (ok)
- z->jfif = 1;
- } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment
- static const unsigned char tag[6] = {'A','d','o','b','e','\0'};
- int ok = 1;
- int i;
- for (i=0; i < 6; ++i)
- if (stbi__get8(z->s) != tag[i])
- ok = 0;
- L -= 6;
- if (ok) {
- stbi__get8(z->s); // version
- stbi__get16be(z->s); // flags0
- stbi__get16be(z->s); // flags1
- z->app14_color_transform = stbi__get8(z->s); // color transform
- L -= 6;
- }
- }
-
- stbi__skip(z->s, L);
- return 1;
- }
-
- return stbi__err("unknown marker","Corrupt JPEG");
-}
-
-// after we see SOS
-static int stbi__process_scan_header(stbi__jpeg *z)
-{
- int i;
- int Ls = stbi__get16be(z->s);
- z->scan_n = stbi__get8(z->s);
- if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG");
- if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG");
- for (i=0; i < z->scan_n; ++i) {
- int id = stbi__get8(z->s), which;
- int q = stbi__get8(z->s);
- for (which = 0; which < z->s->img_n; ++which)
- if (z->img_comp[which].id == id)
- break;
- if (which == z->s->img_n) return 0; // no match
- z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG");
- z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG");
- z->order[i] = which;
- }
-
- {
- int aa;
- z->spec_start = stbi__get8(z->s);
- z->spec_end = stbi__get8(z->s); // should be 63, but might be 0
- aa = stbi__get8(z->s);
- z->succ_high = (aa >> 4);
- z->succ_low = (aa & 15);
- if (z->progressive) {
- if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
- return stbi__err("bad SOS", "Corrupt JPEG");
- } else {
- if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG");
- if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG");
- z->spec_end = 63;
- }
- }
-
- return 1;
-}
-
-static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why)
-{
- int i;
- for (i=0; i < ncomp; ++i) {
- if (z->img_comp[i].raw_data) {
- STBI_FREE(z->img_comp[i].raw_data);
- z->img_comp[i].raw_data = NULL;
- z->img_comp[i].data = NULL;
- }
- if (z->img_comp[i].raw_coeff) {
- STBI_FREE(z->img_comp[i].raw_coeff);
- z->img_comp[i].raw_coeff = 0;
- z->img_comp[i].coeff = 0;
- }
- if (z->img_comp[i].linebuf) {
- STBI_FREE(z->img_comp[i].linebuf);
- z->img_comp[i].linebuf = NULL;
- }
- }
- return why;
-}
-
-static int stbi__process_frame_header(stbi__jpeg *z, int scan)
-{
- stbi__context *s = z->s;
- int Lf,p,i,q, h_max=1,v_max=1,c;
- Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG
- p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
- s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG
- s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires
- c = stbi__get8(s);
- if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG");
- s->img_n = c;
- for (i=0; i < c; ++i) {
- z->img_comp[i].data = NULL;
- z->img_comp[i].linebuf = NULL;
- }
-
- if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG");
-
- z->rgb = 0;
- for (i=0; i < s->img_n; ++i) {
- static unsigned char rgb[3] = { 'R', 'G', 'B' };
- z->img_comp[i].id = stbi__get8(s);
- if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
- ++z->rgb;
- q = stbi__get8(s);
- z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG");
- z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG");
- z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG");
- }
-
- if (scan != STBI__SCAN_load) return 1;
-
- if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode");
-
- for (i=0; i < s->img_n; ++i) {
- if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
- if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
- }
-
- // compute interleaved mcu info
- z->img_h_max = h_max;
- z->img_v_max = v_max;
- z->img_mcu_w = h_max * 8;
- z->img_mcu_h = v_max * 8;
- // these sizes can't be more than 17 bits
- z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
- z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
-
- for (i=0; i < s->img_n; ++i) {
- // number of effective pixels (e.g. for non-interleaved MCU)
- z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
- z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
- // to simplify generation, we'll allocate enough memory to decode
- // the bogus oversized data from using interleaved MCUs and their
- // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
- // discard the extra data until colorspace conversion
- //
- // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier)
- // so these muls can't overflow with 32-bit ints (which we require)
- z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
- z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
- z->img_comp[i].coeff = 0;
- z->img_comp[i].raw_coeff = 0;
- z->img_comp[i].linebuf = NULL;
- z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
- if (z->img_comp[i].raw_data == NULL)
- return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
- // align blocks for idct using mmx/sse
- z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
- if (z->progressive) {
- // w2, h2 are multiples of 8 (see above)
- z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
- z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
- z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);
- if (z->img_comp[i].raw_coeff == NULL)
- return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
- z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);
- }
- }
-
- return 1;
-}
-
-// use comparisons since in some cases we handle more than one case (e.g. SOF)
-#define stbi__DNL(x) ((x) == 0xdc)
-#define stbi__SOI(x) ((x) == 0xd8)
-#define stbi__EOI(x) ((x) == 0xd9)
-#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
-#define stbi__SOS(x) ((x) == 0xda)
-
-#define stbi__SOF_progressive(x) ((x) == 0xc2)
-
-static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)
-{
- int m;
- z->jfif = 0;
- z->app14_color_transform = -1; // valid values are 0,1,2
- z->marker = STBI__MARKER_none; // initialize cached marker to empty
- m = stbi__get_marker(z);
- if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG");
- if (scan == STBI__SCAN_type) return 1;
- m = stbi__get_marker(z);
- while (!stbi__SOF(m)) {
- if (!stbi__process_marker(z,m)) return 0;
- m = stbi__get_marker(z);
- while (m == STBI__MARKER_none) {
- // some files have extra padding after their blocks, so ok, we'll scan
- if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG");
- m = stbi__get_marker(z);
- }
- }
- z->progressive = stbi__SOF_progressive(m);
- if (!stbi__process_frame_header(z, scan)) return 0;
- return 1;
-}
-
-// decode image to YCbCr format
-static int stbi__decode_jpeg_image(stbi__jpeg *j)
-{
- int m;
- for (m = 0; m < 4; m++) {
- j->img_comp[m].raw_data = NULL;
- j->img_comp[m].raw_coeff = NULL;
- }
- j->restart_interval = 0;
- if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;
- m = stbi__get_marker(j);
- while (!stbi__EOI(m)) {
- if (stbi__SOS(m)) {
- if (!stbi__process_scan_header(j)) return 0;
- if (!stbi__parse_entropy_coded_data(j)) return 0;
- if (j->marker == STBI__MARKER_none ) {
- // handle 0s at the end of image data from IP Kamera 9060
- while (!stbi__at_eof(j->s)) {
- int x = stbi__get8(j->s);
- if (x == 255) {
- j->marker = stbi__get8(j->s);
- break;
- }
- }
- // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0
- }
- } else if (stbi__DNL(m)) {
- int Ld = stbi__get16be(j->s);
- stbi__uint32 NL = stbi__get16be(j->s);
- if (Ld != 4) stbi__err("bad DNL len", "Corrupt JPEG");
- if (NL != j->s->img_y) stbi__err("bad DNL height", "Corrupt JPEG");
- } else {
- if (!stbi__process_marker(j, m)) return 0;
- }
- m = stbi__get_marker(j);
- }
- if (j->progressive)
- stbi__jpeg_finish(j);
- return 1;
-}
-
-// static jfif-centered resampling (across block boundaries)
-
-typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
- int w, int hs);
-
-#define stbi__div4(x) ((stbi_uc) ((x) >> 2))
-
-static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- STBI_NOTUSED(out);
- STBI_NOTUSED(in_far);
- STBI_NOTUSED(w);
- STBI_NOTUSED(hs);
- return in_near;
-}
-
-static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- // need to generate two samples vertically for every one in input
- int i;
- STBI_NOTUSED(hs);
- for (i=0; i < w; ++i)
- out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
- return out;
-}
-
-static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- // need to generate two samples horizontally for every one in input
- int i;
- stbi_uc *input = in_near;
-
- if (w == 1) {
- // if only one sample, can't do any interpolation
- out[0] = out[1] = input[0];
- return out;
- }
-
- out[0] = input[0];
- out[1] = stbi__div4(input[0]*3 + input[1] + 2);
- for (i=1; i < w-1; ++i) {
- int n = 3*input[i]+2;
- out[i*2+0] = stbi__div4(n+input[i-1]);
- out[i*2+1] = stbi__div4(n+input[i+1]);
- }
- out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
- out[i*2+1] = input[w-1];
-
- STBI_NOTUSED(in_far);
- STBI_NOTUSED(hs);
-
- return out;
-}
-
-#define stbi__div16(x) ((stbi_uc) ((x) >> 4))
-
-static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- // need to generate 2x2 samples for every one in input
- int i,t0,t1;
- if (w == 1) {
- out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
- return out;
- }
-
- t1 = 3*in_near[0] + in_far[0];
- out[0] = stbi__div4(t1+2);
- for (i=1; i < w; ++i) {
- t0 = t1;
- t1 = 3*in_near[i]+in_far[i];
- out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
- out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
- }
- out[w*2-1] = stbi__div4(t1+2);
-
- STBI_NOTUSED(hs);
-
- return out;
-}
-
-#if defined(STBI_SSE2) || defined(STBI_NEON)
-static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- // need to generate 2x2 samples for every one in input
- int i=0,t0,t1;
-
- if (w == 1) {
- out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
- return out;
- }
-
- t1 = 3*in_near[0] + in_far[0];
- // process groups of 8 pixels for as long as we can.
- // note we can't handle the last pixel in a row in this loop
- // because we need to handle the filter boundary conditions.
- for (; i < ((w-1) & ~7); i += 8) {
-#if defined(STBI_SSE2)
- // load and perform the vertical filtering pass
- // this uses 3*x + y = 4*x + (y - x)
- __m128i zero = _mm_setzero_si128();
- __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
- __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
- __m128i farw = _mm_unpacklo_epi8(farb, zero);
- __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
- __m128i diff = _mm_sub_epi16(farw, nearw);
- __m128i nears = _mm_slli_epi16(nearw, 2);
- __m128i curr = _mm_add_epi16(nears, diff); // current row
-
- // horizontal filter works the same based on shifted vers of current
- // row. "prev" is current row shifted right by 1 pixel; we need to
- // insert the previous pixel value (from t1).
- // "next" is current row shifted left by 1 pixel, with first pixel
- // of next block of 8 pixels added in.
- __m128i prv0 = _mm_slli_si128(curr, 2);
- __m128i nxt0 = _mm_srli_si128(curr, 2);
- __m128i prev = _mm_insert_epi16(prv0, t1, 0);
- __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
-
- // horizontal filter, polyphase implementation since it's convenient:
- // even pixels = 3*cur + prev = cur*4 + (prev - cur)
- // odd pixels = 3*cur + next = cur*4 + (next - cur)
- // note the shared term.
- __m128i bias = _mm_set1_epi16(8);
- __m128i curs = _mm_slli_epi16(curr, 2);
- __m128i prvd = _mm_sub_epi16(prev, curr);
- __m128i nxtd = _mm_sub_epi16(next, curr);
- __m128i curb = _mm_add_epi16(curs, bias);
- __m128i even = _mm_add_epi16(prvd, curb);
- __m128i odd = _mm_add_epi16(nxtd, curb);
-
- // interleave even and odd pixels, then undo scaling.
- __m128i int0 = _mm_unpacklo_epi16(even, odd);
- __m128i int1 = _mm_unpackhi_epi16(even, odd);
- __m128i de0 = _mm_srli_epi16(int0, 4);
- __m128i de1 = _mm_srli_epi16(int1, 4);
-
- // pack and write output
- __m128i outv = _mm_packus_epi16(de0, de1);
- _mm_storeu_si128((__m128i *) (out + i*2), outv);
-#elif defined(STBI_NEON)
- // load and perform the vertical filtering pass
- // this uses 3*x + y = 4*x + (y - x)
- uint8x8_t farb = vld1_u8(in_far + i);
- uint8x8_t nearb = vld1_u8(in_near + i);
- int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
- int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
- int16x8_t curr = vaddq_s16(nears, diff); // current row
-
- // horizontal filter works the same based on shifted vers of current
- // row. "prev" is current row shifted right by 1 pixel; we need to
- // insert the previous pixel value (from t1).
- // "next" is current row shifted left by 1 pixel, with first pixel
- // of next block of 8 pixels added in.
- int16x8_t prv0 = vextq_s16(curr, curr, 7);
- int16x8_t nxt0 = vextq_s16(curr, curr, 1);
- int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
- int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
-
- // horizontal filter, polyphase implementation since it's convenient:
- // even pixels = 3*cur + prev = cur*4 + (prev - cur)
- // odd pixels = 3*cur + next = cur*4 + (next - cur)
- // note the shared term.
- int16x8_t curs = vshlq_n_s16(curr, 2);
- int16x8_t prvd = vsubq_s16(prev, curr);
- int16x8_t nxtd = vsubq_s16(next, curr);
- int16x8_t even = vaddq_s16(curs, prvd);
- int16x8_t odd = vaddq_s16(curs, nxtd);
-
- // undo scaling and round, then store with even/odd phases interleaved
- uint8x8x2_t o;
- o.val[0] = vqrshrun_n_s16(even, 4);
- o.val[1] = vqrshrun_n_s16(odd, 4);
- vst2_u8(out + i*2, o);
-#endif
-
- // "previous" value for next iter
- t1 = 3*in_near[i+7] + in_far[i+7];
- }
-
- t0 = t1;
- t1 = 3*in_near[i] + in_far[i];
- out[i*2] = stbi__div16(3*t1 + t0 + 8);
-
- for (++i; i < w; ++i) {
- t0 = t1;
- t1 = 3*in_near[i]+in_far[i];
- out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
- out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
- }
- out[w*2-1] = stbi__div4(t1+2);
-
- STBI_NOTUSED(hs);
-
- return out;
-}
-#endif
-
-static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- // resample with nearest-neighbor
- int i,j;
- STBI_NOTUSED(in_far);
- for (i=0; i < w; ++i)
- for (j=0; j < hs; ++j)
- out[i*hs+j] = in_near[i];
- return out;
-}
-
-// this is a reduced-precision calculation of YCbCr-to-RGB introduced
-// to make sure the code produces the same results in both SIMD and scalar
-#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
-static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)
-{
- int i;
- for (i=0; i < count; ++i) {
- int y_fixed = (y[i] << 20) + (1<<19); // rounding
- int r,g,b;
- int cr = pcr[i] - 128;
- int cb = pcb[i] - 128;
- r = y_fixed + cr* stbi__float2fixed(1.40200f);
- g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
- b = y_fixed + cb* stbi__float2fixed(1.77200f);
- r >>= 20;
- g >>= 20;
- b >>= 20;
- if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
- if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
- if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
- out[0] = (stbi_uc)r;
- out[1] = (stbi_uc)g;
- out[2] = (stbi_uc)b;
- out[3] = 255;
- out += step;
- }
-}
-
-#if defined(STBI_SSE2) || defined(STBI_NEON)
-static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step)
-{
- int i = 0;
-
-#ifdef STBI_SSE2
- // step == 3 is pretty ugly on the final interleave, and i'm not convinced
- // it's useful in practice (you wouldn't use it for textures, for example).
- // so just accelerate step == 4 case.
- if (step == 4) {
- // this is a fairly straightforward implementation and not super-optimized.
- __m128i signflip = _mm_set1_epi8(-0x80);
- __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f));
- __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));
- __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));
- __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f));
- __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);
- __m128i xw = _mm_set1_epi16(255); // alpha channel
-
- for (; i+7 < count; i += 8) {
- // load
- __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
- __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
- __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
- __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128
- __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128
-
- // unpack to short (and left-shift cr, cb by 8)
- __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
- __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
- __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
-
- // color transform
- __m128i yws = _mm_srli_epi16(yw, 4);
- __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
- __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
- __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
- __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
- __m128i rws = _mm_add_epi16(cr0, yws);
- __m128i gwt = _mm_add_epi16(cb0, yws);
- __m128i bws = _mm_add_epi16(yws, cb1);
- __m128i gws = _mm_add_epi16(gwt, cr1);
-
- // descale
- __m128i rw = _mm_srai_epi16(rws, 4);
- __m128i bw = _mm_srai_epi16(bws, 4);
- __m128i gw = _mm_srai_epi16(gws, 4);
-
- // back to byte, set up for transpose
- __m128i brb = _mm_packus_epi16(rw, bw);
- __m128i gxb = _mm_packus_epi16(gw, xw);
-
- // transpose to interleave channels
- __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
- __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
- __m128i o0 = _mm_unpacklo_epi16(t0, t1);
- __m128i o1 = _mm_unpackhi_epi16(t0, t1);
-
- // store
- _mm_storeu_si128((__m128i *) (out + 0), o0);
- _mm_storeu_si128((__m128i *) (out + 16), o1);
- out += 32;
- }
- }
-#endif
-
-#ifdef STBI_NEON
- // in this version, step=3 support would be easy to add. but is there demand?
- if (step == 4) {
- // this is a fairly straightforward implementation and not super-optimized.
- uint8x8_t signflip = vdup_n_u8(0x80);
- int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f));
- int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));
- int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));
- int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f));
-
- for (; i+7 < count; i += 8) {
- // load
- uint8x8_t y_bytes = vld1_u8(y + i);
- uint8x8_t cr_bytes = vld1_u8(pcr + i);
- uint8x8_t cb_bytes = vld1_u8(pcb + i);
- int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
- int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
-
- // expand to s16
- int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
- int16x8_t crw = vshll_n_s8(cr_biased, 7);
- int16x8_t cbw = vshll_n_s8(cb_biased, 7);
-
- // color transform
- int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
- int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
- int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
- int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
- int16x8_t rws = vaddq_s16(yws, cr0);
- int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
- int16x8_t bws = vaddq_s16(yws, cb1);
-
- // undo scaling, round, convert to byte
- uint8x8x4_t o;
- o.val[0] = vqrshrun_n_s16(rws, 4);
- o.val[1] = vqrshrun_n_s16(gws, 4);
- o.val[2] = vqrshrun_n_s16(bws, 4);
- o.val[3] = vdup_n_u8(255);
-
- // store, interleaving r/g/b/a
- vst4_u8(out, o);
- out += 8*4;
- }
- }
-#endif
-
- for (; i < count; ++i) {
- int y_fixed = (y[i] << 20) + (1<<19); // rounding
- int r,g,b;
- int cr = pcr[i] - 128;
- int cb = pcb[i] - 128;
- r = y_fixed + cr* stbi__float2fixed(1.40200f);
- g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
- b = y_fixed + cb* stbi__float2fixed(1.77200f);
- r >>= 20;
- g >>= 20;
- b >>= 20;
- if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
- if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
- if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
- out[0] = (stbi_uc)r;
- out[1] = (stbi_uc)g;
- out[2] = (stbi_uc)b;
- out[3] = 255;
- out += step;
- }
-}
-#endif
-
-// set up the kernels
-static void stbi__setup_jpeg(stbi__jpeg *j)
-{
- j->idct_block_kernel = stbi__idct_block;
- j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
- j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
-
-#ifdef STBI_SSE2
- if (stbi__sse2_available()) {
- j->idct_block_kernel = stbi__idct_simd;
- j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
- j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
- }
-#endif
-
-#ifdef STBI_NEON
- j->idct_block_kernel = stbi__idct_simd;
- j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
- j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
-#endif
-}
-
-// clean up the temporary component buffers
-static void stbi__cleanup_jpeg(stbi__jpeg *j)
-{
- stbi__free_jpeg_components(j, j->s->img_n, 0);
-}
-
-typedef struct
-{
- resample_row_func resample;
- stbi_uc *line0,*line1;
- int hs,vs; // expansion factor in each axis
- int w_lores; // horizontal pixels pre-expansion
- int ystep; // how far through vertical expansion we are
- int ypos; // which pre-expansion row we're on
-} stbi__resample;
-
-// fast 0..255 * 0..255 => 0..255 rounded multiplication
-static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
-{
- unsigned int t = x*y + 128;
- return (stbi_uc) ((t + (t >>8)) >> 8);
-}
-
-static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
-{
- int n, decode_n, is_rgb;
- z->s->img_n = 0; // make stbi__cleanup_jpeg safe
-
- // validate req_comp
- if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
-
- // load a jpeg image from whichever source, but leave in YCbCr format
- if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }
-
- // determine actual number of components to generate
- n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
-
- is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
-
- if (z->s->img_n == 3 && n < 3 && !is_rgb)
- decode_n = 1;
- else
- decode_n = z->s->img_n;
-
- // resample and color-convert
- {
- int k;
- unsigned int i,j;
- stbi_uc *output;
- stbi_uc *coutput[4];
-
- stbi__resample res_comp[4];
-
- for (k=0; k < decode_n; ++k) {
- stbi__resample *r = &res_comp[k];
-
- // allocate line buffer big enough for upsampling off the edges
- // with upsample factor of 4
- z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
- if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
-
- r->hs = z->img_h_max / z->img_comp[k].h;
- r->vs = z->img_v_max / z->img_comp[k].v;
- r->ystep = r->vs >> 1;
- r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
- r->ypos = 0;
- r->line0 = r->line1 = z->img_comp[k].data;
-
- if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
- else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
- else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
- else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
- else r->resample = stbi__resample_row_generic;
- }
-
- // can't error after this so, this is safe
- output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
- if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
-
- // now go ahead and resample
- for (j=0; j < z->s->img_y; ++j) {
- stbi_uc *out = output + n * z->s->img_x * j;
- for (k=0; k < decode_n; ++k) {
- stbi__resample *r = &res_comp[k];
- int y_bot = r->ystep >= (r->vs >> 1);
- coutput[k] = r->resample(z->img_comp[k].linebuf,
- y_bot ? r->line1 : r->line0,
- y_bot ? r->line0 : r->line1,
- r->w_lores, r->hs);
- if (++r->ystep >= r->vs) {
- r->ystep = 0;
- r->line0 = r->line1;
- if (++r->ypos < z->img_comp[k].y)
- r->line1 += z->img_comp[k].w2;
- }
- }
- if (n >= 3) {
- stbi_uc *y = coutput[0];
- if (z->s->img_n == 3) {
- if (is_rgb) {
- for (i=0; i < z->s->img_x; ++i) {
- out[0] = y[i];
- out[1] = coutput[1][i];
- out[2] = coutput[2][i];
- out[3] = 255;
- out += n;
- }
- } else {
- z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
- }
- } else if (z->s->img_n == 4) {
- if (z->app14_color_transform == 0) { // CMYK
- for (i=0; i < z->s->img_x; ++i) {
- stbi_uc m = coutput[3][i];
- out[0] = stbi__blinn_8x8(coutput[0][i], m);
- out[1] = stbi__blinn_8x8(coutput[1][i], m);
- out[2] = stbi__blinn_8x8(coutput[2][i], m);
- out[3] = 255;
- out += n;
- }
- } else if (z->app14_color_transform == 2) { // YCCK
- z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
- for (i=0; i < z->s->img_x; ++i) {
- stbi_uc m = coutput[3][i];
- out[0] = stbi__blinn_8x8(255 - out[0], m);
- out[1] = stbi__blinn_8x8(255 - out[1], m);
- out[2] = stbi__blinn_8x8(255 - out[2], m);
- out += n;
- }
- } else { // YCbCr + alpha? Ignore the fourth channel for now
- z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
- }
- } else
- for (i=0; i < z->s->img_x; ++i) {
- out[0] = out[1] = out[2] = y[i];
- out[3] = 255; // not used if n==3
- out += n;
- }
- } else {
- if (is_rgb) {
- if (n == 1)
- for (i=0; i < z->s->img_x; ++i)
- *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
- else {
- for (i=0; i < z->s->img_x; ++i, out += 2) {
- out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
- out[1] = 255;
- }
- }
- } else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
- for (i=0; i < z->s->img_x; ++i) {
- stbi_uc m = coutput[3][i];
- stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
- stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
- stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
- out[0] = stbi__compute_y(r, g, b);
- out[1] = 255;
- out += n;
- }
- } else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
- for (i=0; i < z->s->img_x; ++i) {
- out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
- out[1] = 255;
- out += n;
- }
- } else {
- stbi_uc *y = coutput[0];
- if (n == 1)
- for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
- else
- for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
- }
- }
- }
- stbi__cleanup_jpeg(z);
- *out_x = z->s->img_x;
- *out_y = z->s->img_y;
- if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output
- return output;
- }
-}
-
-static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- unsigned char* result;
- stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg));
- STBI_NOTUSED(ri);
- j->s = s;
- stbi__setup_jpeg(j);
- result = load_jpeg_image(j, x,y,comp,req_comp);
- STBI_FREE(j);
- return result;
-}
-
-static int stbi__jpeg_test(stbi__context *s)
-{
- int r;
- stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));
- j->s = s;
- stbi__setup_jpeg(j);
- r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
- stbi__rewind(s);
- STBI_FREE(j);
- return r;
-}
-
-static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
-{
- if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
- stbi__rewind( j->s );
- return 0;
- }
- if (x) *x = j->s->img_x;
- if (y) *y = j->s->img_y;
- if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
- return 1;
-}
-
-static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
-{
- int result;
- stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg)));
- j->s = s;
- result = stbi__jpeg_info_raw(j, x, y, comp);
- STBI_FREE(j);
- return result;
-}
-#endif
-
-// public domain zlib decode v0.2 Sean Barrett 2006-11-18
-// simple implementation
-// - all input must be provided in an upfront buffer
-// - all output is written to a single output buffer (can malloc/realloc)
-// performance
-// - fast huffman
-
-#ifndef STBI_NO_ZLIB
-
-// fast-way is faster to check than jpeg huffman, but slow way is slower
-#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables
-#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
-
-// zlib-style huffman encoding
-// (jpegs packs from left, zlib from right, so can't share code)
-typedef struct
-{
- stbi__uint16 fast[1 << STBI__ZFAST_BITS];
- stbi__uint16 firstcode[16];
- int maxcode[17];
- stbi__uint16 firstsymbol[16];
- stbi_uc size[288];
- stbi__uint16 value[288];
-} stbi__zhuffman;
-
-stbi_inline static int stbi__bitreverse16(int n)
-{
- n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
- n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
- n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
- n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
- return n;
-}
-
-stbi_inline static int stbi__bit_reverse(int v, int bits)
-{
- STBI_ASSERT(bits <= 16);
- // to bit reverse n bits, reverse 16 and shift
- // e.g. 11 bits, bit reverse and shift away 5
- return stbi__bitreverse16(v) >> (16-bits);
-}
-
-static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num)
-{
- int i,k=0;
- int code, next_code[16], sizes[17];
-
- // DEFLATE spec for generating codes
- memset(sizes, 0, sizeof(sizes));
- memset(z->fast, 0, sizeof(z->fast));
- for (i=0; i < num; ++i)
- ++sizes[sizelist[i]];
- sizes[0] = 0;
- for (i=1; i < 16; ++i)
- if (sizes[i] > (1 << i))
- return stbi__err("bad sizes", "Corrupt PNG");
- code = 0;
- for (i=1; i < 16; ++i) {
- next_code[i] = code;
- z->firstcode[i] = (stbi__uint16) code;
- z->firstsymbol[i] = (stbi__uint16) k;
- code = (code + sizes[i]);
- if (sizes[i])
- if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG");
- z->maxcode[i] = code << (16-i); // preshift for inner loop
- code <<= 1;
- k += sizes[i];
- }
- z->maxcode[16] = 0x10000; // sentinel
- for (i=0; i < num; ++i) {
- int s = sizelist[i];
- if (s) {
- int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
- stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
- z->size [c] = (stbi_uc ) s;
- z->value[c] = (stbi__uint16) i;
- if (s <= STBI__ZFAST_BITS) {
- int j = stbi__bit_reverse(next_code[s],s);
- while (j < (1 << STBI__ZFAST_BITS)) {
- z->fast[j] = fastv;
- j += (1 << s);
- }
- }
- ++next_code[s];
- }
- }
- return 1;
-}
-
-// zlib-from-memory implementation for PNG reading
-// because PNG allows splitting the zlib stream arbitrarily,
-// and it's annoying structurally to have PNG call ZLIB call PNG,
-// we require PNG read all the IDATs and combine them into a single
-// memory buffer
-
-typedef struct
-{
- stbi_uc *zbuffer, *zbuffer_end;
- int num_bits;
- stbi__uint32 code_buffer;
-
- char *zout;
- char *zout_start;
- char *zout_end;
- int z_expandable;
-
- stbi__zhuffman z_length, z_distance;
-} stbi__zbuf;
-
-stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)
-{
- if (z->zbuffer >= z->zbuffer_end) return 0;
- return *z->zbuffer++;
-}
-
-static void stbi__fill_bits(stbi__zbuf *z)
-{
- do {
- STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
- z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits;
- z->num_bits += 8;
- } while (z->num_bits <= 24);
-}
-
-stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)
-{
- unsigned int k;
- if (z->num_bits < n) stbi__fill_bits(z);
- k = z->code_buffer & ((1 << n) - 1);
- z->code_buffer >>= n;
- z->num_bits -= n;
- return k;
-}
-
-static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
-{
- int b,s,k;
- // not resolved by fast table, so compute it the slow way
- // use jpeg approach, which requires MSbits at top
- k = stbi__bit_reverse(a->code_buffer, 16);
- for (s=STBI__ZFAST_BITS+1; ; ++s)
- if (k < z->maxcode[s])
- break;
- if (s == 16) return -1; // invalid code!
- // code size is s, so:
- b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
- STBI_ASSERT(z->size[b] == s);
- a->code_buffer >>= s;
- a->num_bits -= s;
- return z->value[b];
-}
-
-stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
-{
- int b,s;
- if (a->num_bits < 16) stbi__fill_bits(a);
- b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
- if (b) {
- s = b >> 9;
- a->code_buffer >>= s;
- a->num_bits -= s;
- return b & 511;
- }
- return stbi__zhuffman_decode_slowpath(a, z);
-}
-
-static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes
-{
- char *q;
- int cur, limit, old_limit;
- z->zout = zout;
- if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG");
- cur = (int) (z->zout - z->zout_start);
- limit = old_limit = (int) (z->zout_end - z->zout_start);
- while (cur + n > limit)
- limit *= 2;
- q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
- STBI_NOTUSED(old_limit);
- if (q == NULL) return stbi__err("outofmem", "Out of memory");
- z->zout_start = q;
- z->zout = q + cur;
- z->zout_end = q + limit;
- return 1;
-}
-
-static int stbi__zlength_base[31] = {
- 3,4,5,6,7,8,9,10,11,13,
- 15,17,19,23,27,31,35,43,51,59,
- 67,83,99,115,131,163,195,227,258,0,0 };
-
-static int stbi__zlength_extra[31]=
-{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
-
-static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
-257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
-
-static int stbi__zdist_extra[32] =
-{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
-
-static int stbi__parse_huffman_block(stbi__zbuf *a)
-{
- char *zout = a->zout;
- for(;;) {
- int z = stbi__zhuffman_decode(a, &a->z_length);
- if (z < 256) {
- if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes
- if (zout >= a->zout_end) {
- if (!stbi__zexpand(a, zout, 1)) return 0;
- zout = a->zout;
- }
- *zout++ = (char) z;
- } else {
- stbi_uc *p;
- int len,dist;
- if (z == 256) {
- a->zout = zout;
- return 1;
- }
- z -= 257;
- len = stbi__zlength_base[z];
- if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
- z = stbi__zhuffman_decode(a, &a->z_distance);
- if (z < 0) return stbi__err("bad huffman code","Corrupt PNG");
- dist = stbi__zdist_base[z];
- if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
- if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG");
- if (zout + len > a->zout_end) {
- if (!stbi__zexpand(a, zout, len)) return 0;
- zout = a->zout;
- }
- p = (stbi_uc *) (zout - dist);
- if (dist == 1) { // run of one byte; common in images.
- stbi_uc v = *p;
- if (len) { do *zout++ = v; while (--len); }
- } else {
- if (len) { do *zout++ = *p++; while (--len); }
- }
- }
- }
-}
-
-static int stbi__compute_huffman_codes(stbi__zbuf *a)
-{
- static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
- stbi__zhuffman z_codelength;
- stbi_uc lencodes[286+32+137];//padding for maximum single op
- stbi_uc codelength_sizes[19];
- int i,n;
-
- int hlit = stbi__zreceive(a,5) + 257;
- int hdist = stbi__zreceive(a,5) + 1;
- int hclen = stbi__zreceive(a,4) + 4;
- int ntot = hlit + hdist;
-
- memset(codelength_sizes, 0, sizeof(codelength_sizes));
- for (i=0; i < hclen; ++i) {
- int s = stbi__zreceive(a,3);
- codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
- }
- if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
-
- n = 0;
- while (n < ntot) {
- int c = stbi__zhuffman_decode(a, &z_codelength);
- if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG");
- if (c < 16)
- lencodes[n++] = (stbi_uc) c;
- else {
- stbi_uc fill = 0;
- if (c == 16) {
- c = stbi__zreceive(a,2)+3;
- if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG");
- fill = lencodes[n-1];
- } else if (c == 17)
- c = stbi__zreceive(a,3)+3;
- else {
- STBI_ASSERT(c == 18);
- c = stbi__zreceive(a,7)+11;
- }
- if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG");
- memset(lencodes+n, fill, c);
- n += c;
- }
- }
- if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG");
- if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
- if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
- return 1;
-}
-
-static int stbi__parse_uncompressed_block(stbi__zbuf *a)
-{
- stbi_uc header[4];
- int len,nlen,k;
- if (a->num_bits & 7)
- stbi__zreceive(a, a->num_bits & 7); // discard
- // drain the bit-packed data into header
- k = 0;
- while (a->num_bits > 0) {
- header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check
- a->code_buffer >>= 8;
- a->num_bits -= 8;
- }
- STBI_ASSERT(a->num_bits == 0);
- // now fill header the normal way
- while (k < 4)
- header[k++] = stbi__zget8(a);
- len = header[1] * 256 + header[0];
- nlen = header[3] * 256 + header[2];
- if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG");
- if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG");
- if (a->zout + len > a->zout_end)
- if (!stbi__zexpand(a, a->zout, len)) return 0;
- memcpy(a->zout, a->zbuffer, len);
- a->zbuffer += len;
- a->zout += len;
- return 1;
-}
-
-static int stbi__parse_zlib_header(stbi__zbuf *a)
-{
- int cmf = stbi__zget8(a);
- int cm = cmf & 15;
- /* int cinfo = cmf >> 4; */
- int flg = stbi__zget8(a);
- if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
- if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
- if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png
- // window = 1 << (8 + cinfo)... but who cares, we fully buffer output
- return 1;
-}
-
-static const stbi_uc stbi__zdefault_length[288] =
-{
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
- 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
- 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
- 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8
-};
-static const stbi_uc stbi__zdefault_distance[32] =
-{
- 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
-};
-/*
-Init algorithm:
-{
- int i; // use <= to match clearly with spec
- for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
- for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;
- for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;
- for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;
-
- for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
-}
-*/
-
-static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)
-{
- int final, type;
- if (parse_header)
- if (!stbi__parse_zlib_header(a)) return 0;
- a->num_bits = 0;
- a->code_buffer = 0;
- do {
- final = stbi__zreceive(a,1);
- type = stbi__zreceive(a,2);
- if (type == 0) {
- if (!stbi__parse_uncompressed_block(a)) return 0;
- } else if (type == 3) {
- return 0;
- } else {
- if (type == 1) {
- // use fixed code lengths
- if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0;
- if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0;
- } else {
- if (!stbi__compute_huffman_codes(a)) return 0;
- }
- if (!stbi__parse_huffman_block(a)) return 0;
- }
- } while (!final);
- return 1;
-}
-
-static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)
-{
- a->zout_start = obuf;
- a->zout = obuf;
- a->zout_end = obuf + olen;
- a->z_expandable = exp;
-
- return stbi__parse_zlib(a, parse_header);
-}
-
-STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
-{
- stbi__zbuf a;
- char *p = (char *) stbi__malloc(initial_size);
- if (p == NULL) return NULL;
- a.zbuffer = (stbi_uc *) buffer;
- a.zbuffer_end = (stbi_uc *) buffer + len;
- if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
- if (outlen) *outlen = (int) (a.zout - a.zout_start);
- return a.zout_start;
- } else {
- STBI_FREE(a.zout_start);
- return NULL;
- }
-}
-
-STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
-{
- return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
-}
-
-STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
-{
- stbi__zbuf a;
- char *p = (char *) stbi__malloc(initial_size);
- if (p == NULL) return NULL;
- a.zbuffer = (stbi_uc *) buffer;
- a.zbuffer_end = (stbi_uc *) buffer + len;
- if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
- if (outlen) *outlen = (int) (a.zout - a.zout_start);
- return a.zout_start;
- } else {
- STBI_FREE(a.zout_start);
- return NULL;
- }
-}
-
-STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
-{
- stbi__zbuf a;
- a.zbuffer = (stbi_uc *) ibuffer;
- a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
- if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
- return (int) (a.zout - a.zout_start);
- else
- return -1;
-}
-
-STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
-{
- stbi__zbuf a;
- char *p = (char *) stbi__malloc(16384);
- if (p == NULL) return NULL;
- a.zbuffer = (stbi_uc *) buffer;
- a.zbuffer_end = (stbi_uc *) buffer+len;
- if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
- if (outlen) *outlen = (int) (a.zout - a.zout_start);
- return a.zout_start;
- } else {
- STBI_FREE(a.zout_start);
- return NULL;
- }
-}
-
-STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
-{
- stbi__zbuf a;
- a.zbuffer = (stbi_uc *) ibuffer;
- a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
- if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
- return (int) (a.zout - a.zout_start);
- else
- return -1;
-}
-#endif
-
-// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18
-// simple implementation
-// - only 8-bit samples
-// - no CRC checking
-// - allocates lots of intermediate memory
-// - avoids problem of streaming data between subsystems
-// - avoids explicit window management
-// performance
-// - uses stb_zlib, a PD zlib implementation with fast huffman decoding
-
-#ifndef STBI_NO_PNG
-typedef struct
-{
- stbi__uint32 length;
- stbi__uint32 type;
-} stbi__pngchunk;
-
-static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
-{
- stbi__pngchunk c;
- c.length = stbi__get32be(s);
- c.type = stbi__get32be(s);
- return c;
-}
-
-static int stbi__check_png_header(stbi__context *s)
-{
- static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
- int i;
- for (i=0; i < 8; ++i)
- if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
- return 1;
-}
-
-typedef struct
-{
- stbi__context *s;
- stbi_uc *idata, *expanded, *out;
- int depth;
-} stbi__png;
-
-
-enum {
- STBI__F_none=0,
- STBI__F_sub=1,
- STBI__F_up=2,
- STBI__F_avg=3,
- STBI__F_paeth=4,
- // synthetic filters used for first scanline to avoid needing a dummy row of 0s
- STBI__F_avg_first,
- STBI__F_paeth_first
-};
-
-static stbi_uc first_row_filter[5] =
-{
- STBI__F_none,
- STBI__F_sub,
- STBI__F_none,
- STBI__F_avg_first,
- STBI__F_paeth_first
-};
-
-static int stbi__paeth(int a, int b, int c)
-{
- int p = a + b - c;
- int pa = abs(p-a);
- int pb = abs(p-b);
- int pc = abs(p-c);
- if (pa <= pb && pa <= pc) return a;
- if (pb <= pc) return b;
- return c;
-}
-
-static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
-
-// create the png data from post-deflated data
-static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)
-{
- int bytes = (depth == 16? 2 : 1);
- stbi__context *s = a->s;
- stbi__uint32 i,j,stride = x*out_n*bytes;
- stbi__uint32 img_len, img_width_bytes;
- int k;
- int img_n = s->img_n; // copy it into a local for later
-
- int output_bytes = out_n*bytes;
- int filter_bytes = img_n*bytes;
- int width = x;
-
- STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
- a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into
- if (!a->out) return stbi__err("outofmem", "Out of memory");
-
- img_width_bytes = (((img_n * x * depth) + 7) >> 3);
- img_len = (img_width_bytes + 1) * y;
- // we used to check for exact match between raw_len and img_len on non-interlaced PNGs,
- // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros),
- // so just check for raw_len < img_len always.
- if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG");
-
- for (j=0; j < y; ++j) {
- stbi_uc *cur = a->out + stride*j;
- stbi_uc *prior;
- int filter = *raw++;
-
- if (filter > 4)
- return stbi__err("invalid filter","Corrupt PNG");
-
- if (depth < 8) {
- STBI_ASSERT(img_width_bytes <= x);
- cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place
- filter_bytes = 1;
- width = img_width_bytes;
- }
- prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above
-
- // if first row, use special filter that doesn't sample previous row
- if (j == 0) filter = first_row_filter[filter];
-
- // handle first byte explicitly
- for (k=0; k < filter_bytes; ++k) {
- switch (filter) {
- case STBI__F_none : cur[k] = raw[k]; break;
- case STBI__F_sub : cur[k] = raw[k]; break;
- case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
- case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break;
- case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break;
- case STBI__F_avg_first : cur[k] = raw[k]; break;
- case STBI__F_paeth_first: cur[k] = raw[k]; break;
- }
- }
-
- if (depth == 8) {
- if (img_n != out_n)
- cur[img_n] = 255; // first pixel
- raw += img_n;
- cur += out_n;
- prior += out_n;
- } else if (depth == 16) {
- if (img_n != out_n) {
- cur[filter_bytes] = 255; // first pixel top byte
- cur[filter_bytes+1] = 255; // first pixel bottom byte
- }
- raw += filter_bytes;
- cur += output_bytes;
- prior += output_bytes;
- } else {
- raw += 1;
- cur += 1;
- prior += 1;
- }
-
- // this is a little gross, so that we don't switch per-pixel or per-component
- if (depth < 8 || img_n == out_n) {
- int nk = (width - 1)*filter_bytes;
- #define STBI__CASE(f) \
- case f: \
- for (k=0; k < nk; ++k)
- switch (filter) {
- // "none" filter turns into a memcpy here; make that explicit.
- case STBI__F_none: memcpy(cur, raw, nk); break;
- STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break;
- STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;
- STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break;
- STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break;
- STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break;
- STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break;
- }
- #undef STBI__CASE
- raw += nk;
- } else {
- STBI_ASSERT(img_n+1 == out_n);
- #define STBI__CASE(f) \
- case f: \
- for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \
- for (k=0; k < filter_bytes; ++k)
- switch (filter) {
- STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break;
- STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break;
- STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;
- STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break;
- STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break;
- STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break;
- STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break;
- }
- #undef STBI__CASE
-
- // the loop above sets the high byte of the pixels' alpha, but for
- // 16 bit png files we also need the low byte set. we'll do that here.
- if (depth == 16) {
- cur = a->out + stride*j; // start at the beginning of the row again
- for (i=0; i < x; ++i,cur+=output_bytes) {
- cur[filter_bytes+1] = 255;
- }
- }
- }
- }
-
- // we make a separate pass to expand bits to pixels; for performance,
- // this could run two scanlines behind the above code, so it won't
- // intefere with filtering but will still be in the cache.
- if (depth < 8) {
- for (j=0; j < y; ++j) {
- stbi_uc *cur = a->out + stride*j;
- stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
- // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit
- // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop
- stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range
-
- // note that the final byte might overshoot and write more data than desired.
- // we can allocate enough data that this never writes out of memory, but it
- // could also overwrite the next scanline. can it overwrite non-empty data
- // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel.
- // so we need to explicitly clamp the final ones
-
- if (depth == 4) {
- for (k=x*img_n; k >= 2; k-=2, ++in) {
- *cur++ = scale * ((*in >> 4) );
- *cur++ = scale * ((*in ) & 0x0f);
- }
- if (k > 0) *cur++ = scale * ((*in >> 4) );
- } else if (depth == 2) {
- for (k=x*img_n; k >= 4; k-=4, ++in) {
- *cur++ = scale * ((*in >> 6) );
- *cur++ = scale * ((*in >> 4) & 0x03);
- *cur++ = scale * ((*in >> 2) & 0x03);
- *cur++ = scale * ((*in ) & 0x03);
- }
- if (k > 0) *cur++ = scale * ((*in >> 6) );
- if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
- if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
- } else if (depth == 1) {
- for (k=x*img_n; k >= 8; k-=8, ++in) {
- *cur++ = scale * ((*in >> 7) );
- *cur++ = scale * ((*in >> 6) & 0x01);
- *cur++ = scale * ((*in >> 5) & 0x01);
- *cur++ = scale * ((*in >> 4) & 0x01);
- *cur++ = scale * ((*in >> 3) & 0x01);
- *cur++ = scale * ((*in >> 2) & 0x01);
- *cur++ = scale * ((*in >> 1) & 0x01);
- *cur++ = scale * ((*in ) & 0x01);
- }
- if (k > 0) *cur++ = scale * ((*in >> 7) );
- if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
- if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
- if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
- if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
- if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
- if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
- }
- if (img_n != out_n) {
- int q;
- // insert alpha = 255
- cur = a->out + stride*j;
- if (img_n == 1) {
- for (q=x-1; q >= 0; --q) {
- cur[q*2+1] = 255;
- cur[q*2+0] = cur[q];
- }
- } else {
- STBI_ASSERT(img_n == 3);
- for (q=x-1; q >= 0; --q) {
- cur[q*4+3] = 255;
- cur[q*4+2] = cur[q*3+2];
- cur[q*4+1] = cur[q*3+1];
- cur[q*4+0] = cur[q*3+0];
- }
- }
- }
- }
- } else if (depth == 16) {
- // force the image data from big-endian to platform-native.
- // this is done in a separate pass due to the decoding relying
- // on the data being untouched, but could probably be done
- // per-line during decode if care is taken.
- stbi_uc *cur = a->out;
- stbi__uint16 *cur16 = (stbi__uint16*)cur;
-
- for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) {
- *cur16 = (cur[0] << 8) | cur[1];
- }
- }
-
- return 1;
-}
-
-static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced)
-{
- int bytes = (depth == 16 ? 2 : 1);
- int out_bytes = out_n * bytes;
- stbi_uc *final;
- int p;
- if (!interlaced)
- return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
-
- // de-interlacing
- final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
- for (p=0; p < 7; ++p) {
- int xorig[] = { 0,4,0,2,0,1,0 };
- int yorig[] = { 0,0,4,0,2,0,1 };
- int xspc[] = { 8,8,4,4,2,2,1 };
- int yspc[] = { 8,8,8,4,4,2,2 };
- int i,j,x,y;
- // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
- x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
- y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
- if (x && y) {
- stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
- if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
- STBI_FREE(final);
- return 0;
- }
- for (j=0; j < y; ++j) {
- for (i=0; i < x; ++i) {
- int out_y = j*yspc[p]+yorig[p];
- int out_x = i*xspc[p]+xorig[p];
- memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
- a->out + (j*x+i)*out_bytes, out_bytes);
- }
- }
- STBI_FREE(a->out);
- image_data += img_len;
- image_data_len -= img_len;
- }
- }
- a->out = final;
-
- return 1;
-}
-
-static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)
-{
- stbi__context *s = z->s;
- stbi__uint32 i, pixel_count = s->img_x * s->img_y;
- stbi_uc *p = z->out;
-
- // compute color-based transparency, assuming we've
- // already got 255 as the alpha value in the output
- STBI_ASSERT(out_n == 2 || out_n == 4);
-
- if (out_n == 2) {
- for (i=0; i < pixel_count; ++i) {
- p[1] = (p[0] == tc[0] ? 0 : 255);
- p += 2;
- }
- } else {
- for (i=0; i < pixel_count; ++i) {
- if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
- p[3] = 0;
- p += 4;
- }
- }
- return 1;
-}
-
-static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n)
-{
- stbi__context *s = z->s;
- stbi__uint32 i, pixel_count = s->img_x * s->img_y;
- stbi__uint16 *p = (stbi__uint16*) z->out;
-
- // compute color-based transparency, assuming we've
- // already got 65535 as the alpha value in the output
- STBI_ASSERT(out_n == 2 || out_n == 4);
-
- if (out_n == 2) {
- for (i = 0; i < pixel_count; ++i) {
- p[1] = (p[0] == tc[0] ? 0 : 65535);
- p += 2;
- }
- } else {
- for (i = 0; i < pixel_count; ++i) {
- if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
- p[3] = 0;
- p += 4;
- }
- }
- return 1;
-}
-
-static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)
-{
- stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
- stbi_uc *p, *temp_out, *orig = a->out;
-
- p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
- if (p == NULL) return stbi__err("outofmem", "Out of memory");
-
- // between here and free(out) below, exitting would leak
- temp_out = p;
-
- if (pal_img_n == 3) {
- for (i=0; i < pixel_count; ++i) {
- int n = orig[i]*4;
- p[0] = palette[n ];
- p[1] = palette[n+1];
- p[2] = palette[n+2];
- p += 3;
- }
- } else {
- for (i=0; i < pixel_count; ++i) {
- int n = orig[i]*4;
- p[0] = palette[n ];
- p[1] = palette[n+1];
- p[2] = palette[n+2];
- p[3] = palette[n+3];
- p += 4;
- }
- }
- STBI_FREE(a->out);
- a->out = temp_out;
-
- STBI_NOTUSED(len);
-
- return 1;
-}
-
-static int stbi__unpremultiply_on_load = 0;
-static int stbi__de_iphone_flag = 0;
-
-STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
-{
- stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
-}
-
-STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
-{
- stbi__de_iphone_flag = flag_true_if_should_convert;
-}
-
-static void stbi__de_iphone(stbi__png *z)
-{
- stbi__context *s = z->s;
- stbi__uint32 i, pixel_count = s->img_x * s->img_y;
- stbi_uc *p = z->out;
-
- if (s->img_out_n == 3) { // convert bgr to rgb
- for (i=0; i < pixel_count; ++i) {
- stbi_uc t = p[0];
- p[0] = p[2];
- p[2] = t;
- p += 3;
- }
- } else {
- STBI_ASSERT(s->img_out_n == 4);
- if (stbi__unpremultiply_on_load) {
- // convert bgr to rgb and unpremultiply
- for (i=0; i < pixel_count; ++i) {
- stbi_uc a = p[3];
- stbi_uc t = p[0];
- if (a) {
- stbi_uc half = a / 2;
- p[0] = (p[2] * 255 + half) / a;
- p[1] = (p[1] * 255 + half) / a;
- p[2] = ( t * 255 + half) / a;
- } else {
- p[0] = p[2];
- p[2] = t;
- }
- p += 4;
- }
- } else {
- // convert bgr to rgb
- for (i=0; i < pixel_count; ++i) {
- stbi_uc t = p[0];
- p[0] = p[2];
- p[2] = t;
- p += 4;
- }
- }
- }
-}
-
-#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
-
-static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
-{
- stbi_uc palette[1024], pal_img_n=0;
- stbi_uc has_trans=0, tc[3];
- stbi__uint16 tc16[3];
- stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
- int first=1,k,interlace=0, color=0, is_iphone=0;
- stbi__context *s = z->s;
-
- z->expanded = NULL;
- z->idata = NULL;
- z->out = NULL;
-
- if (!stbi__check_png_header(s)) return 0;
-
- if (scan == STBI__SCAN_type) return 1;
-
- for (;;) {
- stbi__pngchunk c = stbi__get_chunk_header(s);
- switch (c.type) {
- case STBI__PNG_TYPE('C','g','B','I'):
- is_iphone = 1;
- stbi__skip(s, c.length);
- break;
- case STBI__PNG_TYPE('I','H','D','R'): {
- int comp,filter;
- if (!first) return stbi__err("multiple IHDR","Corrupt PNG");
- first = 0;
- if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG");
- s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");
- s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");
- z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only");
- color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG");
- if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG");
- if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG");
- comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG");
- filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG");
- interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG");
- if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG");
- if (!pal_img_n) {
- s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
- if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
- if (scan == STBI__SCAN_header) return 1;
- } else {
- // if paletted, then pal_n is our final components, and
- // img_n is # components to decompress/filter.
- s->img_n = 1;
- if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG");
- // if SCAN_header, have to scan to see if we have a tRNS
- }
- break;
- }
-
- case STBI__PNG_TYPE('P','L','T','E'): {
- if (first) return stbi__err("first not IHDR", "Corrupt PNG");
- if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG");
- pal_len = c.length / 3;
- if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG");
- for (i=0; i < pal_len; ++i) {
- palette[i*4+0] = stbi__get8(s);
- palette[i*4+1] = stbi__get8(s);
- palette[i*4+2] = stbi__get8(s);
- palette[i*4+3] = 255;
- }
- break;
- }
-
- case STBI__PNG_TYPE('t','R','N','S'): {
- if (first) return stbi__err("first not IHDR", "Corrupt PNG");
- if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG");
- if (pal_img_n) {
- if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }
- if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG");
- if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG");
- pal_img_n = 4;
- for (i=0; i < c.length; ++i)
- palette[i*4+3] = stbi__get8(s);
- } else {
- if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG");
- if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG");
- has_trans = 1;
- if (z->depth == 16) {
- for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is
- } else {
- for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger
- }
- }
- break;
- }
-
- case STBI__PNG_TYPE('I','D','A','T'): {
- if (first) return stbi__err("first not IHDR", "Corrupt PNG");
- if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG");
- if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; }
- if ((int)(ioff + c.length) < (int)ioff) return 0;
- if (ioff + c.length > idata_limit) {
- stbi__uint32 idata_limit_old = idata_limit;
- stbi_uc *p;
- if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
- while (ioff + c.length > idata_limit)
- idata_limit *= 2;
- STBI_NOTUSED(idata_limit_old);
- p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");
- z->idata = p;
- }
- if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG");
- ioff += c.length;
- break;
- }
-
- case STBI__PNG_TYPE('I','E','N','D'): {
- stbi__uint32 raw_len, bpl;
- if (first) return stbi__err("first not IHDR", "Corrupt PNG");
- if (scan != STBI__SCAN_load) return 1;
- if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG");
- // initial guess for decoded data size to avoid unnecessary reallocs
- bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component
- raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;
- z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);
- if (z->expanded == NULL) return 0; // zlib should set error
- STBI_FREE(z->idata); z->idata = NULL;
- if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
- s->img_out_n = s->img_n+1;
- else
- s->img_out_n = s->img_n;
- if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0;
- if (has_trans) {
- if (z->depth == 16) {
- if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0;
- } else {
- if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;
- }
- }
- if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
- stbi__de_iphone(z);
- if (pal_img_n) {
- // pal_img_n == 3 or 4
- s->img_n = pal_img_n; // record the actual colors we had
- s->img_out_n = pal_img_n;
- if (req_comp >= 3) s->img_out_n = req_comp;
- if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
- return 0;
- } else if (has_trans) {
- // non-paletted image with tRNS -> source image has (constant) alpha
- ++s->img_n;
- }
- STBI_FREE(z->expanded); z->expanded = NULL;
- return 1;
- }
-
- default:
- // if critical, fail
- if (first) return stbi__err("first not IHDR", "Corrupt PNG");
- if ((c.type & (1 << 29)) == 0) {
- #ifndef STBI_NO_FAILURE_STRINGS
- // not threadsafe
- static char invalid_chunk[] = "XXXX PNG chunk not known";
- invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
- invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
- invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
- invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
- #endif
- return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type");
- }
- stbi__skip(s, c.length);
- break;
- }
- // end of PNG chunk, read and skip CRC
- stbi__get32be(s);
- }
-}
-
-static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri)
-{
- void *result=NULL;
- if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
- if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
- if (p->depth < 8)
- ri->bits_per_channel = 8;
- else
- ri->bits_per_channel = p->depth;
- result = p->out;
- p->out = NULL;
- if (req_comp && req_comp != p->s->img_out_n) {
- if (ri->bits_per_channel == 8)
- result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
- else
- result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
- p->s->img_out_n = req_comp;
- if (result == NULL) return result;
- }
- *x = p->s->img_x;
- *y = p->s->img_y;
- if (n) *n = p->s->img_n;
- }
- STBI_FREE(p->out); p->out = NULL;
- STBI_FREE(p->expanded); p->expanded = NULL;
- STBI_FREE(p->idata); p->idata = NULL;
-
- return result;
-}
-
-static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- stbi__png p;
- p.s = s;
- return stbi__do_png(&p, x,y,comp,req_comp, ri);
-}
-
-static int stbi__png_test(stbi__context *s)
-{
- int r;
- r = stbi__check_png_header(s);
- stbi__rewind(s);
- return r;
-}
-
-static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)
-{
- if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
- stbi__rewind( p->s );
- return 0;
- }
- if (x) *x = p->s->img_x;
- if (y) *y = p->s->img_y;
- if (comp) *comp = p->s->img_n;
- return 1;
-}
-
-static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
-{
- stbi__png p;
- p.s = s;
- return stbi__png_info_raw(&p, x, y, comp);
-}
-#endif
-
-// Microsoft/Windows BMP image
-
-#ifndef STBI_NO_BMP
-static int stbi__bmp_test_raw(stbi__context *s)
-{
- int r;
- int sz;
- if (stbi__get8(s) != 'B') return 0;
- if (stbi__get8(s) != 'M') return 0;
- stbi__get32le(s); // discard filesize
- stbi__get16le(s); // discard reserved
- stbi__get16le(s); // discard reserved
- stbi__get32le(s); // discard data offset
- sz = stbi__get32le(s);
- r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
- return r;
-}
-
-static int stbi__bmp_test(stbi__context *s)
-{
- int r = stbi__bmp_test_raw(s);
- stbi__rewind(s);
- return r;
-}
-
-
-// returns 0..31 for the highest set bit
-static int stbi__high_bit(unsigned int z)
-{
- int n=0;
- if (z == 0) return -1;
- if (z >= 0x10000) n += 16, z >>= 16;
- if (z >= 0x00100) n += 8, z >>= 8;
- if (z >= 0x00010) n += 4, z >>= 4;
- if (z >= 0x00004) n += 2, z >>= 2;
- if (z >= 0x00002) n += 1, z >>= 1;
- return n;
-}
-
-static int stbi__bitcount(unsigned int a)
-{
- a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2
- a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4
- a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
- a = (a + (a >> 8)); // max 16 per 8 bits
- a = (a + (a >> 16)); // max 32 per 8 bits
- return a & 0xff;
-}
-
-static int stbi__shiftsigned(int v, int shift, int bits)
-{
- int result;
- int z=0;
-
- if (shift < 0) v <<= -shift;
- else v >>= shift;
- result = v;
-
- z = bits;
- while (z < 8) {
- result += v >> z;
- z += bits;
- }
- return result;
-}
-
-typedef struct
-{
- int bpp, offset, hsz;
- unsigned int mr,mg,mb,ma, all_a;
-} stbi__bmp_data;
-
-static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
-{
- int hsz;
- if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");
- stbi__get32le(s); // discard filesize
- stbi__get16le(s); // discard reserved
- stbi__get16le(s); // discard reserved
- info->offset = stbi__get32le(s);
- info->hsz = hsz = stbi__get32le(s);
- info->mr = info->mg = info->mb = info->ma = 0;
-
- if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
- if (hsz == 12) {
- s->img_x = stbi__get16le(s);
- s->img_y = stbi__get16le(s);
- } else {
- s->img_x = stbi__get32le(s);
- s->img_y = stbi__get32le(s);
- }
- if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
- info->bpp = stbi__get16le(s);
- if (info->bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit");
- if (hsz != 12) {
- int compress = stbi__get32le(s);
- if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
- stbi__get32le(s); // discard sizeof
- stbi__get32le(s); // discard hres
- stbi__get32le(s); // discard vres
- stbi__get32le(s); // discard colorsused
- stbi__get32le(s); // discard max important
- if (hsz == 40 || hsz == 56) {
- if (hsz == 56) {
- stbi__get32le(s);
- stbi__get32le(s);
- stbi__get32le(s);
- stbi__get32le(s);
- }
- if (info->bpp == 16 || info->bpp == 32) {
- if (compress == 0) {
- if (info->bpp == 32) {
- info->mr = 0xffu << 16;
- info->mg = 0xffu << 8;
- info->mb = 0xffu << 0;
- info->ma = 0xffu << 24;
- info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0
- } else {
- info->mr = 31u << 10;
- info->mg = 31u << 5;
- info->mb = 31u << 0;
- }
- } else if (compress == 3) {
- info->mr = stbi__get32le(s);
- info->mg = stbi__get32le(s);
- info->mb = stbi__get32le(s);
- // not documented, but generated by photoshop and handled by mspaint
- if (info->mr == info->mg && info->mg == info->mb) {
- // ?!?!?
- return stbi__errpuc("bad BMP", "bad BMP");
- }
- } else
- return stbi__errpuc("bad BMP", "bad BMP");
- }
- } else {
- int i;
- if (hsz != 108 && hsz != 124)
- return stbi__errpuc("bad BMP", "bad BMP");
- info->mr = stbi__get32le(s);
- info->mg = stbi__get32le(s);
- info->mb = stbi__get32le(s);
- info->ma = stbi__get32le(s);
- stbi__get32le(s); // discard color space
- for (i=0; i < 12; ++i)
- stbi__get32le(s); // discard color space parameters
- if (hsz == 124) {
- stbi__get32le(s); // discard rendering intent
- stbi__get32le(s); // discard offset of profile data
- stbi__get32le(s); // discard size of profile data
- stbi__get32le(s); // discard reserved
- }
- }
- }
- return (void *) 1;
-}
-
-
-static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- stbi_uc *out;
- unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
- stbi_uc pal[256][4];
- int psize=0,i,j,width;
- int flip_vertically, pad, target;
- stbi__bmp_data info;
- STBI_NOTUSED(ri);
-
- info.all_a = 255;
- if (stbi__bmp_parse_header(s, &info) == NULL)
- return NULL; // error code already set
-
- flip_vertically = ((int) s->img_y) > 0;
- s->img_y = abs((int) s->img_y);
-
- mr = info.mr;
- mg = info.mg;
- mb = info.mb;
- ma = info.ma;
- all_a = info.all_a;
-
- if (info.hsz == 12) {
- if (info.bpp < 24)
- psize = (info.offset - 14 - 24) / 3;
- } else {
- if (info.bpp < 16)
- psize = (info.offset - 14 - info.hsz) >> 2;
- }
-
- s->img_n = ma ? 4 : 3;
- if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
- target = req_comp;
- else
- target = s->img_n; // if they want monochrome, we'll post-convert
-
- // sanity-check size
- if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
- return stbi__errpuc("too large", "Corrupt BMP");
-
- out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
- if (!out) return stbi__errpuc("outofmem", "Out of memory");
- if (info.bpp < 16) {
- int z=0;
- if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
- for (i=0; i < psize; ++i) {
- pal[i][2] = stbi__get8(s);
- pal[i][1] = stbi__get8(s);
- pal[i][0] = stbi__get8(s);
- if (info.hsz != 12) stbi__get8(s);
- pal[i][3] = 255;
- }
- stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
- if (info.bpp == 4) width = (s->img_x + 1) >> 1;
- else if (info.bpp == 8) width = s->img_x;
- else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
- pad = (-width)&3;
- for (j=0; j < (int) s->img_y; ++j) {
- for (i=0; i < (int) s->img_x; i += 2) {
- int v=stbi__get8(s),v2=0;
- if (info.bpp == 4) {
- v2 = v & 15;
- v >>= 4;
- }
- out[z++] = pal[v][0];
- out[z++] = pal[v][1];
- out[z++] = pal[v][2];
- if (target == 4) out[z++] = 255;
- if (i+1 == (int) s->img_x) break;
- v = (info.bpp == 8) ? stbi__get8(s) : v2;
- out[z++] = pal[v][0];
- out[z++] = pal[v][1];
- out[z++] = pal[v][2];
- if (target == 4) out[z++] = 255;
- }
- stbi__skip(s, pad);
- }
- } else {
- int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
- int z = 0;
- int easy=0;
- stbi__skip(s, info.offset - 14 - info.hsz);
- if (info.bpp == 24) width = 3 * s->img_x;
- else if (info.bpp == 16) width = 2*s->img_x;
- else /* bpp = 32 and pad = 0 */ width=0;
- pad = (-width) & 3;
- if (info.bpp == 24) {
- easy = 1;
- } else if (info.bpp == 32) {
- if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
- easy = 2;
- }
- if (!easy) {
- if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
- // right shift amt to put high bit in position #7
- rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
- gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
- bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
- ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
- }
- for (j=0; j < (int) s->img_y; ++j) {
- if (easy) {
- for (i=0; i < (int) s->img_x; ++i) {
- unsigned char a;
- out[z+2] = stbi__get8(s);
- out[z+1] = stbi__get8(s);
- out[z+0] = stbi__get8(s);
- z += 3;
- a = (easy == 2 ? stbi__get8(s) : 255);
- all_a |= a;
- if (target == 4) out[z++] = a;
- }
- } else {
- int bpp = info.bpp;
- for (i=0; i < (int) s->img_x; ++i) {
- stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
- int a;
- out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
- out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
- out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
- a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
- all_a |= a;
- if (target == 4) out[z++] = STBI__BYTECAST(a);
- }
- }
- stbi__skip(s, pad);
- }
- }
-
- // if alpha channel is all 0s, replace with all 255s
- if (target == 4 && all_a == 0)
- for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
- out[i] = 255;
-
- if (flip_vertically) {
- stbi_uc t;
- for (j=0; j < (int) s->img_y>>1; ++j) {
- stbi_uc *p1 = out + j *s->img_x*target;
- stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
- for (i=0; i < (int) s->img_x*target; ++i) {
- t = p1[i], p1[i] = p2[i], p2[i] = t;
- }
- }
- }
-
- if (req_comp && req_comp != target) {
- out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
- if (out == NULL) return out; // stbi__convert_format frees input on failure
- }
-
- *x = s->img_x;
- *y = s->img_y;
- if (comp) *comp = s->img_n;
- return out;
-}
-#endif
-
-// Targa Truevision - TGA
-// by Jonathan Dummer
-#ifndef STBI_NO_TGA
-// returns STBI_rgb or whatever, 0 on error
-static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16)
-{
- // only RGB or RGBA (incl. 16bit) or grey allowed
- if(is_rgb16) *is_rgb16 = 0;
- switch(bits_per_pixel) {
- case 8: return STBI_grey;
- case 16: if(is_grey) return STBI_grey_alpha;
- // else: fall-through
- case 15: if(is_rgb16) *is_rgb16 = 1;
- return STBI_rgb;
- case 24: // fall-through
- case 32: return bits_per_pixel/8;
- default: return 0;
- }
-}
-
-static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
-{
- int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
- int sz, tga_colormap_type;
- stbi__get8(s); // discard Offset
- tga_colormap_type = stbi__get8(s); // colormap type
- if( tga_colormap_type > 1 ) {
- stbi__rewind(s);
- return 0; // only RGB or indexed allowed
- }
- tga_image_type = stbi__get8(s); // image type
- if ( tga_colormap_type == 1 ) { // colormapped (paletted) image
- if (tga_image_type != 1 && tga_image_type != 9) {
- stbi__rewind(s);
- return 0;
- }
- stbi__skip(s,4); // skip index of first colormap entry and number of entries
- sz = stbi__get8(s); // check bits per palette color entry
- if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
- stbi__rewind(s);
- return 0;
- }
- stbi__skip(s,4); // skip image x and y origin
- tga_colormap_bpp = sz;
- } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE
- if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
- stbi__rewind(s);
- return 0; // only RGB or grey allowed, +/- RLE
- }
- stbi__skip(s,9); // skip colormap specification and image x/y origin
- tga_colormap_bpp = 0;
- }
- tga_w = stbi__get16le(s);
- if( tga_w < 1 ) {
- stbi__rewind(s);
- return 0; // test width
- }
- tga_h = stbi__get16le(s);
- if( tga_h < 1 ) {
- stbi__rewind(s);
- return 0; // test height
- }
- tga_bits_per_pixel = stbi__get8(s); // bits per pixel
- stbi__get8(s); // ignore alpha bits
- if (tga_colormap_bpp != 0) {
- if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
- // when using a colormap, tga_bits_per_pixel is the size of the indexes
- // I don't think anything but 8 or 16bit indexes makes sense
- stbi__rewind(s);
- return 0;
- }
- tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
- } else {
- tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
- }
- if(!tga_comp) {
- stbi__rewind(s);
- return 0;
- }
- if (x) *x = tga_w;
- if (y) *y = tga_h;
- if (comp) *comp = tga_comp;
- return 1; // seems to have passed everything
-}
-
-static int stbi__tga_test(stbi__context *s)
-{
- int res = 0;
- int sz, tga_color_type;
- stbi__get8(s); // discard Offset
- tga_color_type = stbi__get8(s); // color type
- if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed
- sz = stbi__get8(s); // image type
- if ( tga_color_type == 1 ) { // colormapped (paletted) image
- if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9
- stbi__skip(s,4); // skip index of first colormap entry and number of entries
- sz = stbi__get8(s); // check bits per palette color entry
- if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
- stbi__skip(s,4); // skip image x and y origin
- } else { // "normal" image w/o colormap
- if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE
- stbi__skip(s,9); // skip colormap specification and image x/y origin
- }
- if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width
- if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height
- sz = stbi__get8(s); // bits per pixel
- if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index
- if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
-
- res = 1; // if we got this far, everything's good and we can return 1 instead of 0
-
-errorEnd:
- stbi__rewind(s);
- return res;
-}
-
-// read 16bit value and convert to 24bit RGB
-static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
-{
- stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
- stbi__uint16 fiveBitMask = 31;
- // we have 3 channels with 5bits each
- int r = (px >> 10) & fiveBitMask;
- int g = (px >> 5) & fiveBitMask;
- int b = px & fiveBitMask;
- // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later
- out[0] = (stbi_uc)((r * 255)/31);
- out[1] = (stbi_uc)((g * 255)/31);
- out[2] = (stbi_uc)((b * 255)/31);
-
- // some people claim that the most significant bit might be used for alpha
- // (possibly if an alpha-bit is set in the "image descriptor byte")
- // but that only made 16bit test images completely translucent..
- // so let's treat all 15 and 16bit TGAs as RGB with no alpha.
-}
-
-static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- // read in the TGA header stuff
- int tga_offset = stbi__get8(s);
- int tga_indexed = stbi__get8(s);
- int tga_image_type = stbi__get8(s);
- int tga_is_RLE = 0;
- int tga_palette_start = stbi__get16le(s);
- int tga_palette_len = stbi__get16le(s);
- int tga_palette_bits = stbi__get8(s);
- int tga_x_origin = stbi__get16le(s);
- int tga_y_origin = stbi__get16le(s);
- int tga_width = stbi__get16le(s);
- int tga_height = stbi__get16le(s);
- int tga_bits_per_pixel = stbi__get8(s);
- int tga_comp, tga_rgb16=0;
- int tga_inverted = stbi__get8(s);
- // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)
- // image data
- unsigned char *tga_data;
- unsigned char *tga_palette = NULL;
- int i, j;
- unsigned char raw_data[4] = {0};
- int RLE_count = 0;
- int RLE_repeating = 0;
- int read_next_pixel = 1;
- STBI_NOTUSED(ri);
-
- // do a tiny bit of precessing
- if ( tga_image_type >= 8 )
- {
- tga_image_type -= 8;
- tga_is_RLE = 1;
- }
- tga_inverted = 1 - ((tga_inverted >> 5) & 1);
-
- // If I'm paletted, then I'll use the number of bits from the palette
- if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
- else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
-
- if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency
- return stbi__errpuc("bad format", "Can't find out TGA pixelformat");
-
- // tga info
- *x = tga_width;
- *y = tga_height;
- if (comp) *comp = tga_comp;
-
- if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
- return stbi__errpuc("too large", "Corrupt TGA");
-
- tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
- if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");
-
- // skip to the data's starting position (offset usually = 0)
- stbi__skip(s, tga_offset );
-
- if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
- for (i=0; i < tga_height; ++i) {
- int row = tga_inverted ? tga_height -i - 1 : i;
- stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
- stbi__getn(s, tga_row, tga_width * tga_comp);
- }
- } else {
- // do I need to load a palette?
- if ( tga_indexed)
- {
- // any data to skip? (offset usually = 0)
- stbi__skip(s, tga_palette_start );
- // load the palette
- tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
- if (!tga_palette) {
- STBI_FREE(tga_data);
- return stbi__errpuc("outofmem", "Out of memory");
- }
- if (tga_rgb16) {
- stbi_uc *pal_entry = tga_palette;
- STBI_ASSERT(tga_comp == STBI_rgb);
- for (i=0; i < tga_palette_len; ++i) {
- stbi__tga_read_rgb16(s, pal_entry);
- pal_entry += tga_comp;
- }
- } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
- STBI_FREE(tga_data);
- STBI_FREE(tga_palette);
- return stbi__errpuc("bad palette", "Corrupt TGA");
- }
- }
- // load the data
- for (i=0; i < tga_width * tga_height; ++i)
- {
- // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?
- if ( tga_is_RLE )
- {
- if ( RLE_count == 0 )
- {
- // yep, get the next byte as a RLE command
- int RLE_cmd = stbi__get8(s);
- RLE_count = 1 + (RLE_cmd & 127);
- RLE_repeating = RLE_cmd >> 7;
- read_next_pixel = 1;
- } else if ( !RLE_repeating )
- {
- read_next_pixel = 1;
- }
- } else
- {
- read_next_pixel = 1;
- }
- // OK, if I need to read a pixel, do it now
- if ( read_next_pixel )
- {
- // load however much data we did have
- if ( tga_indexed )
- {
- // read in index, then perform the lookup
- int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
- if ( pal_idx >= tga_palette_len ) {
- // invalid index
- pal_idx = 0;
- }
- pal_idx *= tga_comp;
- for (j = 0; j < tga_comp; ++j) {
- raw_data[j] = tga_palette[pal_idx+j];
- }
- } else if(tga_rgb16) {
- STBI_ASSERT(tga_comp == STBI_rgb);
- stbi__tga_read_rgb16(s, raw_data);
- } else {
- // read in the data raw
- for (j = 0; j < tga_comp; ++j) {
- raw_data[j] = stbi__get8(s);
- }
- }
- // clear the reading flag for the next pixel
- read_next_pixel = 0;
- } // end of reading a pixel
-
- // copy data
- for (j = 0; j < tga_comp; ++j)
- tga_data[i*tga_comp+j] = raw_data[j];
-
- // in case we're in RLE mode, keep counting down
- --RLE_count;
- }
- // do I need to invert the image?
- if ( tga_inverted )
- {
- for (j = 0; j*2 < tga_height; ++j)
- {
- int index1 = j * tga_width * tga_comp;
- int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
- for (i = tga_width * tga_comp; i > 0; --i)
- {
- unsigned char temp = tga_data[index1];
- tga_data[index1] = tga_data[index2];
- tga_data[index2] = temp;
- ++index1;
- ++index2;
- }
- }
- }
- // clear my palette, if I had one
- if ( tga_palette != NULL )
- {
- STBI_FREE( tga_palette );
- }
- }
-
- // swap RGB - if the source data was RGB16, it already is in the right order
- if (tga_comp >= 3 && !tga_rgb16)
- {
- unsigned char* tga_pixel = tga_data;
- for (i=0; i < tga_width * tga_height; ++i)
- {
- unsigned char temp = tga_pixel[0];
- tga_pixel[0] = tga_pixel[2];
- tga_pixel[2] = temp;
- tga_pixel += tga_comp;
- }
- }
-
- // convert to target component count
- if (req_comp && req_comp != tga_comp)
- tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
-
- // the things I do to get rid of an error message, and yet keep
- // Microsoft's C compilers happy... [8^(
- tga_palette_start = tga_palette_len = tga_palette_bits =
- tga_x_origin = tga_y_origin = 0;
- // OK, done
- return tga_data;
-}
-#endif
-
-// *************************************************************************************************
-// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
-
-#ifndef STBI_NO_PSD
-static int stbi__psd_test(stbi__context *s)
-{
- int r = (stbi__get32be(s) == 0x38425053);
- stbi__rewind(s);
- return r;
-}
-
-static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount)
-{
- int count, nleft, len;
-
- count = 0;
- while ((nleft = pixelCount - count) > 0) {
- len = stbi__get8(s);
- if (len == 128) {
- // No-op.
- } else if (len < 128) {
- // Copy next len+1 bytes literally.
- len++;
- if (len > nleft) return 0; // corrupt data
- count += len;
- while (len) {
- *p = stbi__get8(s);
- p += 4;
- len--;
- }
- } else if (len > 128) {
- stbi_uc val;
- // Next -len+1 bytes in the dest are replicated from next source byte.
- // (Interpret len as a negative 8-bit int.)
- len = 257 - len;
- if (len > nleft) return 0; // corrupt data
- val = stbi__get8(s);
- count += len;
- while (len) {
- *p = val;
- p += 4;
- len--;
- }
- }
- }
-
- return 1;
-}
-
-static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
-{
- int pixelCount;
- int channelCount, compression;
- int channel, i;
- int bitdepth;
- int w,h;
- stbi_uc *out;
- STBI_NOTUSED(ri);
-
- // Check identifier
- if (stbi__get32be(s) != 0x38425053) // "8BPS"
- return stbi__errpuc("not PSD", "Corrupt PSD image");
-
- // Check file type version.
- if (stbi__get16be(s) != 1)
- return stbi__errpuc("wrong version", "Unsupported version of PSD image");
-
- // Skip 6 reserved bytes.
- stbi__skip(s, 6 );
-
- // Read the number of channels (R, G, B, A, etc).
- channelCount = stbi__get16be(s);
- if (channelCount < 0 || channelCount > 16)
- return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image");
-
- // Read the rows and columns of the image.
- h = stbi__get32be(s);
- w = stbi__get32be(s);
-
- // Make sure the depth is 8 bits.
- bitdepth = stbi__get16be(s);
- if (bitdepth != 8 && bitdepth != 16)
- return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit");
-
- // Make sure the color mode is RGB.
- // Valid options are:
- // 0: Bitmap
- // 1: Grayscale
- // 2: Indexed color
- // 3: RGB color
- // 4: CMYK color
- // 7: Multichannel
- // 8: Duotone
- // 9: Lab color
- if (stbi__get16be(s) != 3)
- return stbi__errpuc("wrong color format", "PSD is not in RGB color format");
-
- // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.)
- stbi__skip(s,stbi__get32be(s) );
-
- // Skip the image resources. (resolution, pen tool paths, etc)
- stbi__skip(s, stbi__get32be(s) );
-
- // Skip the reserved data.
- stbi__skip(s, stbi__get32be(s) );
-
- // Find out if the data is compressed.
- // Known values:
- // 0: no compression
- // 1: RLE compressed
- compression = stbi__get16be(s);
- if (compression > 1)
- return stbi__errpuc("bad compression", "PSD has an unknown compression format");
-
- // Check size
- if (!stbi__mad3sizes_valid(4, w, h, 0))
- return stbi__errpuc("too large", "Corrupt PSD");
-
- // Create the destination image.
-
- if (!compression && bitdepth == 16 && bpc == 16) {
- out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
- ri->bits_per_channel = 16;
- } else
- out = (stbi_uc *) stbi__malloc(4 * w*h);
-
- if (!out) return stbi__errpuc("outofmem", "Out of memory");
- pixelCount = w*h;
-
- // Initialize the data to zero.
- //memset( out, 0, pixelCount * 4 );
-
- // Finally, the image data.
- if (compression) {
- // RLE as used by .PSD and .TIFF
- // Loop until you get the number of unpacked bytes you are expecting:
- // Read the next source byte into n.
- // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
- // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
- // Else if n is 128, noop.
- // Endloop
-
- // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data,
- // which we're going to just skip.
- stbi__skip(s, h * channelCount * 2 );
-
- // Read the RLE data by channel.
- for (channel = 0; channel < 4; channel++) {
- stbi_uc *p;
-
- p = out+channel;
- if (channel >= channelCount) {
- // Fill this channel with default data.
- for (i = 0; i < pixelCount; i++, p += 4)
- *p = (channel == 3 ? 255 : 0);
- } else {
- // Read the RLE data.
- if (!stbi__psd_decode_rle(s, p, pixelCount)) {
- STBI_FREE(out);
- return stbi__errpuc("corrupt", "bad RLE data");
- }
- }
- }
-
- } else {
- // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...)
- // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image.
-
- // Read the data by channel.
- for (channel = 0; channel < 4; channel++) {
- if (channel >= channelCount) {
- // Fill this channel with default data.
- if (bitdepth == 16 && bpc == 16) {
- stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
- stbi__uint16 val = channel == 3 ? 65535 : 0;
- for (i = 0; i < pixelCount; i++, q += 4)
- *q = val;
- } else {
- stbi_uc *p = out+channel;
- stbi_uc val = channel == 3 ? 255 : 0;
- for (i = 0; i < pixelCount; i++, p += 4)
- *p = val;
- }
- } else {
- if (ri->bits_per_channel == 16) { // output bpc
- stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
- for (i = 0; i < pixelCount; i++, q += 4)
- *q = (stbi__uint16) stbi__get16be(s);
- } else {
- stbi_uc *p = out+channel;
- if (bitdepth == 16) { // input bpc
- for (i = 0; i < pixelCount; i++, p += 4)
- *p = (stbi_uc) (stbi__get16be(s) >> 8);
- } else {
- for (i = 0; i < pixelCount; i++, p += 4)
- *p = stbi__get8(s);
- }
- }
- }
- }
- }
-
- // remove weird white matte from PSD
- if (channelCount >= 4) {
- if (ri->bits_per_channel == 16) {
- for (i=0; i < w*h; ++i) {
- stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;
- if (pixel[3] != 0 && pixel[3] != 65535) {
- float a = pixel[3] / 65535.0f;
- float ra = 1.0f / a;
- float inv_a = 65535.0f * (1 - ra);
- pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);
- pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);
- pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);
- }
- }
- } else {
- for (i=0; i < w*h; ++i) {
- unsigned char *pixel = out + 4*i;
- if (pixel[3] != 0 && pixel[3] != 255) {
- float a = pixel[3] / 255.0f;
- float ra = 1.0f / a;
- float inv_a = 255.0f * (1 - ra);
- pixel[0] = (unsigned char) (pixel[0]*ra + inv_a);
- pixel[1] = (unsigned char) (pixel[1]*ra + inv_a);
- pixel[2] = (unsigned char) (pixel[2]*ra + inv_a);
- }
- }
- }
- }
-
- // convert to desired output format
- if (req_comp && req_comp != 4) {
- if (ri->bits_per_channel == 16)
- out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
- else
- out = stbi__convert_format(out, 4, req_comp, w, h);
- if (out == NULL) return out; // stbi__convert_format frees input on failure
- }
-
- if (comp) *comp = 4;
- *y = h;
- *x = w;
-
- return out;
-}
-#endif
-
-// *************************************************************************************************
-// Softimage PIC loader
-// by Tom Seddon
-//
-// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
-// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
-
-#ifndef STBI_NO_PIC
-static int stbi__pic_is4(stbi__context *s,const char *str)
-{
- int i;
- for (i=0; i<4; ++i)
- if (stbi__get8(s) != (stbi_uc)str[i])
- return 0;
-
- return 1;
-}
-
-static int stbi__pic_test_core(stbi__context *s)
-{
- int i;
-
- if (!stbi__pic_is4(s,"\x53\x80\xF6\x34"))
- return 0;
-
- for(i=0;i<84;++i)
- stbi__get8(s);
-
- if (!stbi__pic_is4(s,"PICT"))
- return 0;
-
- return 1;
-}
-
-typedef struct
-{
- stbi_uc size,type,channel;
-} stbi__pic_packet;
-
-static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)
-{
- int mask=0x80, i;
-
- for (i=0; i<4; ++i, mask>>=1) {
- if (channel & mask) {
- if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short");
- dest[i]=stbi__get8(s);
- }
- }
-
- return dest;
-}
-
-static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)
-{
- int mask=0x80,i;
-
- for (i=0;i<4; ++i, mask>>=1)
- if (channel&mask)
- dest[i]=src[i];
-}
-
-static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)
-{
- int act_comp=0,num_packets=0,y,chained;
- stbi__pic_packet packets[10];
-
- // this will (should...) cater for even some bizarre stuff like having data
- // for the same channel in multiple packets.
- do {
- stbi__pic_packet *packet;
-
- if (num_packets==sizeof(packets)/sizeof(packets[0]))
- return stbi__errpuc("bad format","too many packets");
-
- packet = &packets[num_packets++];
-
- chained = stbi__get8(s);
- packet->size = stbi__get8(s);
- packet->type = stbi__get8(s);
- packet->channel = stbi__get8(s);
-
- act_comp |= packet->channel;
-
- if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)");
- if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp");
- } while (chained);
-
- *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?
-
- for(y=0; y<height; ++y) {
- int packet_idx;
-
- for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
- stbi__pic_packet *packet = &packets[packet_idx];
- stbi_uc *dest = result+y*width*4;
-
- switch (packet->type) {
- default:
- return stbi__errpuc("bad format","packet has bad compression type");
-
- case 0: {//uncompressed
- int x;
-
- for(x=0;x<width;++x, dest+=4)
- if (!stbi__readval(s,packet->channel,dest))
- return 0;
- break;
- }
-
- case 1://Pure RLE
- {
- int left=width, i;
-
- while (left>0) {
- stbi_uc count,value[4];
-
- count=stbi__get8(s);
- if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)");
-
- if (count > left)
- count = (stbi_uc) left;
-
- if (!stbi__readval(s,packet->channel,value)) return 0;
-
- for(i=0; i<count; ++i,dest+=4)
- stbi__copyval(packet->channel,dest,value);
- left -= count;
- }
- }
- break;
-
- case 2: {//Mixed RLE
- int left=width;
- while (left>0) {
- int count = stbi__get8(s), i;
- if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)");
-
- if (count >= 128) { // Repeated
- stbi_uc value[4];
-
- if (count==128)
- count = stbi__get16be(s);
- else
- count -= 127;
- if (count > left)
- return stbi__errpuc("bad file","scanline overrun");
-
- if (!stbi__readval(s,packet->channel,value))
- return 0;
-
- for(i=0;i<count;++i, dest += 4)
- stbi__copyval(packet->channel,dest,value);
- } else { // Raw
- ++count;
- if (count>left) return stbi__errpuc("bad file","scanline overrun");
-
- for(i=0;i<count;++i, dest+=4)
- if (!stbi__readval(s,packet->channel,dest))
- return 0;
- }
- left-=count;
- }
- break;
- }
- }
- }
- }
-
- return result;
-}
-
-static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri)
-{
- stbi_uc *result;
- int i, x,y, internal_comp;
- STBI_NOTUSED(ri);
-
- if (!comp) comp = &internal_comp;
-
- for (i=0; i<92; ++i)
- stbi__get8(s);
-
- x = stbi__get16be(s);
- y = stbi__get16be(s);
- if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)");
- if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode");
-
- stbi__get32be(s); //skip `ratio'
- stbi__get16be(s); //skip `fields'
- stbi__get16be(s); //skip `pad'
-
- // intermediate buffer is RGBA
- result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
- memset(result, 0xff, x*y*4);
-
- if (!stbi__pic_load_core(s,x,y,comp, result)) {
- STBI_FREE(result);
- result=0;
- }
- *px = x;
- *py = y;
- if (req_comp == 0) req_comp = *comp;
- result=stbi__convert_format(result,4,req_comp,x,y);
-
- return result;
-}
-
-static int stbi__pic_test(stbi__context *s)
-{
- int r = stbi__pic_test_core(s);
- stbi__rewind(s);
- return r;
-}
-#endif
-
-// *************************************************************************************************
-// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
-
-#ifndef STBI_NO_GIF
-typedef struct
-{
- stbi__int16 prefix;
- stbi_uc first;
- stbi_uc suffix;
-} stbi__gif_lzw;
-
-typedef struct
-{
- int w,h;
- stbi_uc *out, *old_out; // output buffer (always 4 components)
- int flags, bgindex, ratio, transparent, eflags, delay;
- stbi_uc pal[256][4];
- stbi_uc lpal[256][4];
- stbi__gif_lzw codes[4096];
- stbi_uc *color_table;
- int parse, step;
- int lflags;
- int start_x, start_y;
- int max_x, max_y;
- int cur_x, cur_y;
- int line_size;
-} stbi__gif;
-
-static int stbi__gif_test_raw(stbi__context *s)
-{
- int sz;
- if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;
- sz = stbi__get8(s);
- if (sz != '9' && sz != '7') return 0;
- if (stbi__get8(s) != 'a') return 0;
- return 1;
-}
-
-static int stbi__gif_test(stbi__context *s)
-{
- int r = stbi__gif_test_raw(s);
- stbi__rewind(s);
- return r;
-}
-
-static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)
-{
- int i;
- for (i=0; i < num_entries; ++i) {
- pal[i][2] = stbi__get8(s);
- pal[i][1] = stbi__get8(s);
- pal[i][0] = stbi__get8(s);
- pal[i][3] = transp == i ? 0 : 255;
- }
-}
-
-static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)
-{
- stbi_uc version;
- if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')
- return stbi__err("not GIF", "Corrupt GIF");
-
- version = stbi__get8(s);
- if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF");
- if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF");
-
- stbi__g_failure_reason = "";
- g->w = stbi__get16le(s);
- g->h = stbi__get16le(s);
- g->flags = stbi__get8(s);
- g->bgindex = stbi__get8(s);
- g->ratio = stbi__get8(s);
- g->transparent = -1;
-
- if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments
-
- if (is_info) return 1;
-
- if (g->flags & 0x80)
- stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
-
- return 1;
-}
-
-static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
-{
- stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));
- if (!stbi__gif_header(s, g, comp, 1)) {
- STBI_FREE(g);
- stbi__rewind( s );
- return 0;
- }
- if (x) *x = g->w;
- if (y) *y = g->h;
- STBI_FREE(g);
- return 1;
-}
-
-static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
-{
- stbi_uc *p, *c;
-
- // recurse to decode the prefixes, since the linked-list is backwards,
- // and working backwards through an interleaved image would be nasty
- if (g->codes[code].prefix >= 0)
- stbi__out_gif_code(g, g->codes[code].prefix);
-
- if (g->cur_y >= g->max_y) return;
-
- p = &g->out[g->cur_x + g->cur_y];
- c = &g->color_table[g->codes[code].suffix * 4];
-
- if (c[3] >= 128) {
- p[0] = c[2];
- p[1] = c[1];
- p[2] = c[0];
- p[3] = c[3];
- }
- g->cur_x += 4;
-
- if (g->cur_x >= g->max_x) {
- g->cur_x = g->start_x;
- g->cur_y += g->step;
-
- while (g->cur_y >= g->max_y && g->parse > 0) {
- g->step = (1 << g->parse) * g->line_size;
- g->cur_y = g->start_y + (g->step >> 1);
- --g->parse;
- }
- }
-}
-
-static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
-{
- stbi_uc lzw_cs;
- stbi__int32 len, init_code;
- stbi__uint32 first;
- stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
- stbi__gif_lzw *p;
-
- lzw_cs = stbi__get8(s);
- if (lzw_cs > 12) return NULL;
- clear = 1 << lzw_cs;
- first = 1;
- codesize = lzw_cs + 1;
- codemask = (1 << codesize) - 1;
- bits = 0;
- valid_bits = 0;
- for (init_code = 0; init_code < clear; init_code++) {
- g->codes[init_code].prefix = -1;
- g->codes[init_code].first = (stbi_uc) init_code;
- g->codes[init_code].suffix = (stbi_uc) init_code;
- }
-
- // support no starting clear code
- avail = clear+2;
- oldcode = -1;
-
- len = 0;
- for(;;) {
- if (valid_bits < codesize) {
- if (len == 0) {
- len = stbi__get8(s); // start new block
- if (len == 0)
- return g->out;
- }
- --len;
- bits |= (stbi__int32) stbi__get8(s) << valid_bits;
- valid_bits += 8;
- } else {
- stbi__int32 code = bits & codemask;
- bits >>= codesize;
- valid_bits -= codesize;
- // @OPTIMIZE: is there some way we can accelerate the non-clear path?
- if (code == clear) { // clear code
- codesize = lzw_cs + 1;
- codemask = (1 << codesize) - 1;
- avail = clear + 2;
- oldcode = -1;
- first = 0;
- } else if (code == clear + 1) { // end of stream code
- stbi__skip(s, len);
- while ((len = stbi__get8(s)) > 0)
- stbi__skip(s,len);
- return g->out;
- } else if (code <= avail) {
- if (first) return stbi__errpuc("no clear code", "Corrupt GIF");
-
- if (oldcode >= 0) {
- p = &g->codes[avail++];
- if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF");
- p->prefix = (stbi__int16) oldcode;
- p->first = g->codes[oldcode].first;
- p->suffix = (code == avail) ? p->first : g->codes[code].first;
- } else if (code == avail)
- return stbi__errpuc("illegal code in raster", "Corrupt GIF");
-
- stbi__out_gif_code(g, (stbi__uint16) code);
-
- if ((avail & codemask) == 0 && avail <= 0x0FFF) {
- codesize++;
- codemask = (1 << codesize) - 1;
- }
-
- oldcode = code;
- } else {
- return stbi__errpuc("illegal code in raster", "Corrupt GIF");
- }
- }
- }
-}
-
-static void stbi__fill_gif_background(stbi__gif *g, int x0, int y0, int x1, int y1)
-{
- int x, y;
- stbi_uc *c = g->pal[g->bgindex];
- for (y = y0; y < y1; y += 4 * g->w) {
- for (x = x0; x < x1; x += 4) {
- stbi_uc *p = &g->out[y + x];
- p[0] = c[2];
- p[1] = c[1];
- p[2] = c[0];
- p[3] = 0;
- }
- }
-}
-
-// this function is designed to support animated gifs, although stb_image doesn't support it
-static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp)
-{
- int i;
- stbi_uc *prev_out = 0;
-
- if (g->out == 0 && !stbi__gif_header(s, g, comp,0))
- return 0; // stbi__g_failure_reason set by stbi__gif_header
-
- if (!stbi__mad3sizes_valid(g->w, g->h, 4, 0))
- return stbi__errpuc("too large", "GIF too large");
-
- prev_out = g->out;
- g->out = (stbi_uc *) stbi__malloc_mad3(4, g->w, g->h, 0);
- if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory");
-
- switch ((g->eflags & 0x1C) >> 2) {
- case 0: // unspecified (also always used on 1st frame)
- stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h);
- break;
- case 1: // do not dispose
- if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
- g->old_out = prev_out;
- break;
- case 2: // dispose to background
- if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
- stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);
- break;
- case 3: // dispose to previous
- if (g->old_out) {
- for (i = g->start_y; i < g->max_y; i += 4 * g->w)
- memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);
- }
- break;
- }
-
- for (;;) {
- switch (stbi__get8(s)) {
- case 0x2C: /* Image Descriptor */
- {
- int prev_trans = -1;
- stbi__int32 x, y, w, h;
- stbi_uc *o;
-
- x = stbi__get16le(s);
- y = stbi__get16le(s);
- w = stbi__get16le(s);
- h = stbi__get16le(s);
- if (((x + w) > (g->w)) || ((y + h) > (g->h)))
- return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
-
- g->line_size = g->w * 4;
- g->start_x = x * 4;
- g->start_y = y * g->line_size;
- g->max_x = g->start_x + w * 4;
- g->max_y = g->start_y + h * g->line_size;
- g->cur_x = g->start_x;
- g->cur_y = g->start_y;
-
- g->lflags = stbi__get8(s);
-
- if (g->lflags & 0x40) {
- g->step = 8 * g->line_size; // first interlaced spacing
- g->parse = 3;
- } else {
- g->step = g->line_size;
- g->parse = 0;
- }
-
- if (g->lflags & 0x80) {
- stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
- g->color_table = (stbi_uc *) g->lpal;
- } else if (g->flags & 0x80) {
- if (g->transparent >= 0 && (g->eflags & 0x01)) {
- prev_trans = g->pal[g->transparent][3];
- g->pal[g->transparent][3] = 0;
- }
- g->color_table = (stbi_uc *) g->pal;
- } else
- return stbi__errpuc("missing color table", "Corrupt GIF");
-
- o = stbi__process_gif_raster(s, g);
- if (o == NULL) return NULL;
-
- if (prev_trans != -1)
- g->pal[g->transparent][3] = (stbi_uc) prev_trans;
-
- return o;
- }
-
- case 0x21: // Comment Extension.
- {
- int len;
- if (stbi__get8(s) == 0xF9) { // Graphic Control Extension.
- len = stbi__get8(s);
- if (len == 4) {
- g->eflags = stbi__get8(s);
- g->delay = stbi__get16le(s);
- g->transparent = stbi__get8(s);
- } else {
- stbi__skip(s, len);
- break;
- }
- }
- while ((len = stbi__get8(s)) != 0)
- stbi__skip(s, len);
- break;
- }
-
- case 0x3B: // gif stream termination code
- return (stbi_uc *) s; // using '1' causes warning on some compilers
-
- default:
- return stbi__errpuc("unknown code", "Corrupt GIF");
- }
- }
-
- STBI_NOTUSED(req_comp);
-}
-
-static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- stbi_uc *u = 0;
- stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));
- memset(g, 0, sizeof(*g));
- STBI_NOTUSED(ri);
-
- u = stbi__gif_load_next(s, g, comp, req_comp);
- if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
- if (u) {
- *x = g->w;
- *y = g->h;
- if (req_comp && req_comp != 4)
- u = stbi__convert_format(u, 4, req_comp, g->w, g->h);
- }
- else if (g->out)
- STBI_FREE(g->out);
- STBI_FREE(g);
- return u;
-}
-
-static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
-{
- return stbi__gif_info_raw(s,x,y,comp);
-}
-#endif
-
-// *************************************************************************************************
-// Radiance RGBE HDR loader
-// originally by Nicolas Schulz
-#ifndef STBI_NO_HDR
-static int stbi__hdr_test_core(stbi__context *s, const char *signature)
-{
- int i;
- for (i=0; signature[i]; ++i)
- if (stbi__get8(s) != signature[i])
- return 0;
- stbi__rewind(s);
- return 1;
-}
-
-static int stbi__hdr_test(stbi__context* s)
-{
- int r = stbi__hdr_test_core(s, "#?RADIANCE\n");
- stbi__rewind(s);
- if(!r) {
- r = stbi__hdr_test_core(s, "#?RGBE\n");
- stbi__rewind(s);
- }
- return r;
-}
-
-#define STBI__HDR_BUFLEN 1024
-static char *stbi__hdr_gettoken(stbi__context *z, char *buffer)
-{
- int len=0;
- char c = '\0';
-
- c = (char) stbi__get8(z);
-
- while (!stbi__at_eof(z) && c != '\n') {
- buffer[len++] = c;
- if (len == STBI__HDR_BUFLEN-1) {
- // flush to end of line
- while (!stbi__at_eof(z) && stbi__get8(z) != '\n')
- ;
- break;
- }
- c = (char) stbi__get8(z);
- }
-
- buffer[len] = 0;
- return buffer;
-}
-
-static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)
-{
- if ( input[3] != 0 ) {
- float f1;
- // Exponent
- f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
- if (req_comp <= 2)
- output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
- else {
- output[0] = input[0] * f1;
- output[1] = input[1] * f1;
- output[2] = input[2] * f1;
- }
- if (req_comp == 2) output[1] = 1;
- if (req_comp == 4) output[3] = 1;
- } else {
- switch (req_comp) {
- case 4: output[3] = 1; /* fallthrough */
- case 3: output[0] = output[1] = output[2] = 0;
- break;
- case 2: output[1] = 1; /* fallthrough */
- case 1: output[0] = 0;
- break;
- }
- }
-}
-
-static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- char buffer[STBI__HDR_BUFLEN];
- char *token;
- int valid = 0;
- int width, height;
- stbi_uc *scanline;
- float *hdr_data;
- int len;
- unsigned char count, value;
- int i, j, k, c1,c2, z;
- const char *headerToken;
- STBI_NOTUSED(ri);
-
- // Check identifier
- headerToken = stbi__hdr_gettoken(s,buffer);
- if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0)
- return stbi__errpf("not HDR", "Corrupt HDR image");
-
- // Parse header
- for(;;) {
- token = stbi__hdr_gettoken(s,buffer);
- if (token[0] == 0) break;
- if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
- }
-
- if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format");
-
- // Parse width and height
- // can't use sscanf() if we're not using stdio!
- token = stbi__hdr_gettoken(s,buffer);
- if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");
- token += 3;
- height = (int) strtol(token, &token, 10);
- while (*token == ' ') ++token;
- if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");
- token += 3;
- width = (int) strtol(token, NULL, 10);
-
- *x = width;
- *y = height;
-
- if (comp) *comp = 3;
- if (req_comp == 0) req_comp = 3;
-
- if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0))
- return stbi__errpf("too large", "HDR image is too large");
-
- // Read data
- hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0);
- if (!hdr_data)
- return stbi__errpf("outofmem", "Out of memory");
-
- // Load image data
- // image data is stored as some number of sca
- if ( width < 8 || width >= 32768) {
- // Read flat data
- for (j=0; j < height; ++j) {
- for (i=0; i < width; ++i) {
- stbi_uc rgbe[4];
- main_decode_loop:
- stbi__getn(s, rgbe, 4);
- stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
- }
- }
- } else {
- // Read RLE-encoded data
- scanline = NULL;
-
- for (j = 0; j < height; ++j) {
- c1 = stbi__get8(s);
- c2 = stbi__get8(s);
- len = stbi__get8(s);
- if (c1 != 2 || c2 != 2 || (len & 0x80)) {
- // not run-length encoded, so we have to actually use THIS data as a decoded
- // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
- stbi_uc rgbe[4];
- rgbe[0] = (stbi_uc) c1;
- rgbe[1] = (stbi_uc) c2;
- rgbe[2] = (stbi_uc) len;
- rgbe[3] = (stbi_uc) stbi__get8(s);
- stbi__hdr_convert(hdr_data, rgbe, req_comp);
- i = 1;
- j = 0;
- STBI_FREE(scanline);
- goto main_decode_loop; // yes, this makes no sense
- }
- len <<= 8;
- len |= stbi__get8(s);
- if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }
- if (scanline == NULL) {
- scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);
- if (!scanline) {
- STBI_FREE(hdr_data);
- return stbi__errpf("outofmem", "Out of memory");
- }
- }
-
- for (k = 0; k < 4; ++k) {
- int nleft;
- i = 0;
- while ((nleft = width - i) > 0) {
- count = stbi__get8(s);
- if (count > 128) {
- // Run
- value = stbi__get8(s);
- count -= 128;
- if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
- for (z = 0; z < count; ++z)
- scanline[i++ * 4 + k] = value;
- } else {
- // Dump
- if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
- for (z = 0; z < count; ++z)
- scanline[i++ * 4 + k] = stbi__get8(s);
- }
- }
- }
- for (i=0; i < width; ++i)
- stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
- }
- if (scanline)
- STBI_FREE(scanline);
- }
-
- return hdr_data;
-}
-
-static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
-{
- char buffer[STBI__HDR_BUFLEN];
- char *token;
- int valid = 0;
- int dummy;
-
- if (!x) x = &dummy;
- if (!y) y = &dummy;
- if (!comp) comp = &dummy;
-
- if (stbi__hdr_test(s) == 0) {
- stbi__rewind( s );
- return 0;
- }
-
- for(;;) {
- token = stbi__hdr_gettoken(s,buffer);
- if (token[0] == 0) break;
- if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
- }
-
- if (!valid) {
- stbi__rewind( s );
- return 0;
- }
- token = stbi__hdr_gettoken(s,buffer);
- if (strncmp(token, "-Y ", 3)) {
- stbi__rewind( s );
- return 0;
- }
- token += 3;
- *y = (int) strtol(token, &token, 10);
- while (*token == ' ') ++token;
- if (strncmp(token, "+X ", 3)) {
- stbi__rewind( s );
- return 0;
- }
- token += 3;
- *x = (int) strtol(token, NULL, 10);
- *comp = 3;
- return 1;
-}
-#endif // STBI_NO_HDR
-
-#ifndef STBI_NO_BMP
-static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
-{
- void *p;
- stbi__bmp_data info;
-
- info.all_a = 255;
- p = stbi__bmp_parse_header(s, &info);
- stbi__rewind( s );
- if (p == NULL)
- return 0;
- if (x) *x = s->img_x;
- if (y) *y = s->img_y;
- if (comp) *comp = info.ma ? 4 : 3;
- return 1;
-}
-#endif
-
-#ifndef STBI_NO_PSD
-static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
-{
- int channelCount, dummy;
- if (!x) x = &dummy;
- if (!y) y = &dummy;
- if (!comp) comp = &dummy;
- if (stbi__get32be(s) != 0x38425053) {
- stbi__rewind( s );
- return 0;
- }
- if (stbi__get16be(s) != 1) {
- stbi__rewind( s );
- return 0;
- }
- stbi__skip(s, 6);
- channelCount = stbi__get16be(s);
- if (channelCount < 0 || channelCount > 16) {
- stbi__rewind( s );
- return 0;
- }
- *y = stbi__get32be(s);
- *x = stbi__get32be(s);
- if (stbi__get16be(s) != 8) {
- stbi__rewind( s );
- return 0;
- }
- if (stbi__get16be(s) != 3) {
- stbi__rewind( s );
- return 0;
- }
- *comp = 4;
- return 1;
-}
-#endif
-
-#ifndef STBI_NO_PIC
-static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
-{
- int act_comp=0,num_packets=0,chained,dummy;
- stbi__pic_packet packets[10];
-
- if (!x) x = &dummy;
- if (!y) y = &dummy;
- if (!comp) comp = &dummy;
-
- if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) {
- stbi__rewind(s);
- return 0;
- }
-
- stbi__skip(s, 88);
-
- *x = stbi__get16be(s);
- *y = stbi__get16be(s);
- if (stbi__at_eof(s)) {
- stbi__rewind( s);
- return 0;
- }
- if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
- stbi__rewind( s );
- return 0;
- }
-
- stbi__skip(s, 8);
-
- do {
- stbi__pic_packet *packet;
-
- if (num_packets==sizeof(packets)/sizeof(packets[0]))
- return 0;
-
- packet = &packets[num_packets++];
- chained = stbi__get8(s);
- packet->size = stbi__get8(s);
- packet->type = stbi__get8(s);
- packet->channel = stbi__get8(s);
- act_comp |= packet->channel;
-
- if (stbi__at_eof(s)) {
- stbi__rewind( s );
- return 0;
- }
- if (packet->size != 8) {
- stbi__rewind( s );
- return 0;
- }
- } while (chained);
-
- *comp = (act_comp & 0x10 ? 4 : 3);
-
- return 1;
-}
-#endif
-
-// *************************************************************************************************
-// Portable Gray Map and Portable Pixel Map loader
-// by Ken Miller
-//
-// PGM: http://netpbm.sourceforge.net/doc/pgm.html
-// PPM: http://netpbm.sourceforge.net/doc/ppm.html
-//
-// Known limitations:
-// Does not support comments in the header section
-// Does not support ASCII image data (formats P2 and P3)
-// Does not support 16-bit-per-channel
-
-#ifndef STBI_NO_PNM
-
-static int stbi__pnm_test(stbi__context *s)
-{
- char p, t;
- p = (char) stbi__get8(s);
- t = (char) stbi__get8(s);
- if (p != 'P' || (t != '5' && t != '6')) {
- stbi__rewind( s );
- return 0;
- }
- return 1;
-}
-
-static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- stbi_uc *out;
- STBI_NOTUSED(ri);
-
- if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n))
- return 0;
-
- *x = s->img_x;
- *y = s->img_y;
- if (comp) *comp = s->img_n;
-
- if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))
- return stbi__errpuc("too large", "PNM too large");
-
- out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);
- if (!out) return stbi__errpuc("outofmem", "Out of memory");
- stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
-
- if (req_comp && req_comp != s->img_n) {
- out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
- if (out == NULL) return out; // stbi__convert_format frees input on failure
- }
- return out;
-}
-
-static int stbi__pnm_isspace(char c)
-{
- return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
-}
-
-static void stbi__pnm_skip_whitespace(stbi__context *s, char *c)
-{
- for (;;) {
- while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
- *c = (char) stbi__get8(s);
-
- if (stbi__at_eof(s) || *c != '#')
- break;
-
- while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' )
- *c = (char) stbi__get8(s);
- }
-}
-
-static int stbi__pnm_isdigit(char c)
-{
- return c >= '0' && c <= '9';
-}
-
-static int stbi__pnm_getinteger(stbi__context *s, char *c)
-{
- int value = 0;
-
- while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
- value = value*10 + (*c - '0');
- *c = (char) stbi__get8(s);
- }
-
- return value;
-}
-
-static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
-{
- int maxv, dummy;
- char c, p, t;
-
- if (!x) x = &dummy;
- if (!y) y = &dummy;
- if (!comp) comp = &dummy;
-
- stbi__rewind(s);
-
- // Get identifier
- p = (char) stbi__get8(s);
- t = (char) stbi__get8(s);
- if (p != 'P' || (t != '5' && t != '6')) {
- stbi__rewind(s);
- return 0;
- }
-
- *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm
-
- c = (char) stbi__get8(s);
- stbi__pnm_skip_whitespace(s, &c);
-
- *x = stbi__pnm_getinteger(s, &c); // read width
- stbi__pnm_skip_whitespace(s, &c);
-
- *y = stbi__pnm_getinteger(s, &c); // read height
- stbi__pnm_skip_whitespace(s, &c);
-
- maxv = stbi__pnm_getinteger(s, &c); // read max value
-
- if (maxv > 255)
- return stbi__err("max value > 255", "PPM image not 8-bit");
- else
- return 1;
-}
-#endif
-
-static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
-{
- #ifndef STBI_NO_JPEG
- if (stbi__jpeg_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_PNG
- if (stbi__png_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_GIF
- if (stbi__gif_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_BMP
- if (stbi__bmp_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_PSD
- if (stbi__psd_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_PIC
- if (stbi__pic_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_PNM
- if (stbi__pnm_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_HDR
- if (stbi__hdr_info(s, x, y, comp)) return 1;
- #endif
-
- // test tga last because it's a crappy test!
- #ifndef STBI_NO_TGA
- if (stbi__tga_info(s, x, y, comp))
- return 1;
- #endif
- return stbi__err("unknown image type", "Image not of any known type, or corrupt");
-}
-
-#ifndef STBI_NO_STDIO
-STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
-{
- FILE *f = stbi__fopen(filename, "rb");
- int result;
- if (!f) return stbi__err("can't fopen", "Unable to open file");
- result = stbi_info_from_file(f, x, y, comp);
- fclose(f);
- return result;
-}
-
-STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
-{
- int r;
- stbi__context s;
- long pos = ftell(f);
- stbi__start_file(&s, f);
- r = stbi__info_main(&s,x,y,comp);
- fseek(f,pos,SEEK_SET);
- return r;
-}
-#endif // !STBI_NO_STDIO
-
-STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
-{
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
- return stbi__info_main(&s,x,y,comp);
-}
-
-STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)
-{
- stbi__context s;
- stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
- return stbi__info_main(&s,x,y,comp);
-}
-
-#endif // STB_IMAGE_IMPLEMENTATION
-
-/*
- revision history:
- 2.16 (2017-07-23) all functions have 16-bit variants;
- STBI_NO_STDIO works again;
- compilation fixes;
- fix rounding in unpremultiply;
- optimize vertical flip;
- disable raw_len validation;
- documentation fixes
- 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode;
- warning fixes; disable run-time SSE detection on gcc;
- uniform handling of optional "return" values;
- thread-safe initialization of zlib tables
- 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
- 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now
- 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
- 2.11 (2016-04-02) allocate large structures on the stack
- remove white matting for transparent PSD
- fix reported channel count for PNG & BMP
- re-enable SSE2 in non-gcc 64-bit
- support RGB-formatted JPEG
- read 16-bit PNGs (only as 8-bit)
- 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED
- 2.09 (2016-01-16) allow comments in PNM files
- 16-bit-per-pixel TGA (not bit-per-component)
- info() for TGA could break due to .hdr handling
- info() for BMP to shares code instead of sloppy parse
- can use STBI_REALLOC_SIZED if allocator doesn't support realloc
- code cleanup
- 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA
- 2.07 (2015-09-13) fix compiler warnings
- partial animated GIF support
- limited 16-bpc PSD support
- #ifdef unused functions
- bug with < 92 byte PIC,PNM,HDR,TGA
- 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value
- 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning
- 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit
- 2.03 (2015-04-12) extra corruption checking (mmozeiko)
- stbi_set_flip_vertically_on_load (nguillemot)
- fix NEON support; fix mingw support
- 2.02 (2015-01-19) fix incorrect assert, fix warning
- 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2
- 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG
- 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)
- progressive JPEG (stb)
- PGM/PPM support (Ken Miller)
- STBI_MALLOC,STBI_REALLOC,STBI_FREE
- GIF bugfix -- seemingly never worked
- STBI_NO_*, STBI_ONLY_*
- 1.48 (2014-12-14) fix incorrectly-named assert()
- 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)
- optimize PNG (ryg)
- fix bug in interlaced PNG with user-specified channel count (stb)
- 1.46 (2014-08-26)
- fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG
- 1.45 (2014-08-16)
- fix MSVC-ARM internal compiler error by wrapping malloc
- 1.44 (2014-08-07)
- various warning fixes from Ronny Chevalier
- 1.43 (2014-07-15)
- fix MSVC-only compiler problem in code changed in 1.42
- 1.42 (2014-07-09)
- don't define _CRT_SECURE_NO_WARNINGS (affects user code)
- fixes to stbi__cleanup_jpeg path
- added STBI_ASSERT to avoid requiring assert.h
- 1.41 (2014-06-25)
- fix search&replace from 1.36 that messed up comments/error messages
- 1.40 (2014-06-22)
- fix gcc struct-initialization warning
- 1.39 (2014-06-15)
- fix to TGA optimization when req_comp != number of components in TGA;
- fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)
- add support for BMP version 5 (more ignored fields)
- 1.38 (2014-06-06)
- suppress MSVC warnings on integer casts truncating values
- fix accidental rename of 'skip' field of I/O
- 1.37 (2014-06-04)
- remove duplicate typedef
- 1.36 (2014-06-03)
- convert to header file single-file library
- if de-iphone isn't set, load iphone images color-swapped instead of returning NULL
- 1.35 (2014-05-27)
- various warnings
- fix broken STBI_SIMD path
- fix bug where stbi_load_from_file no longer left file pointer in correct place
- fix broken non-easy path for 32-bit BMP (possibly never used)
- TGA optimization by Arseny Kapoulkine
- 1.34 (unknown)
- use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case
- 1.33 (2011-07-14)
- make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements
- 1.32 (2011-07-13)
- support for "info" function for all supported filetypes (SpartanJ)
- 1.31 (2011-06-20)
- a few more leak fixes, bug in PNG handling (SpartanJ)
- 1.30 (2011-06-11)
- added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)
- removed deprecated format-specific test/load functions
- removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway
- error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)
- fix inefficiency in decoding 32-bit BMP (David Woo)
- 1.29 (2010-08-16)
- various warning fixes from Aurelien Pocheville
- 1.28 (2010-08-01)
- fix bug in GIF palette transparency (SpartanJ)
- 1.27 (2010-08-01)
- cast-to-stbi_uc to fix warnings
- 1.26 (2010-07-24)
- fix bug in file buffering for PNG reported by SpartanJ
- 1.25 (2010-07-17)
- refix trans_data warning (Won Chun)
- 1.24 (2010-07-12)
- perf improvements reading from files on platforms with lock-heavy fgetc()
- minor perf improvements for jpeg
- deprecated type-specific functions so we'll get feedback if they're needed
- attempt to fix trans_data warning (Won Chun)
- 1.23 fixed bug in iPhone support
- 1.22 (2010-07-10)
- removed image *writing* support
- stbi_info support from Jetro Lauha
- GIF support from Jean-Marc Lienher
- iPhone PNG-extensions from James Brown
- warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)
- 1.21 fix use of 'stbi_uc' in header (reported by jon blow)
- 1.20 added support for Softimage PIC, by Tom Seddon
- 1.19 bug in interlaced PNG corruption check (found by ryg)
- 1.18 (2008-08-02)
- fix a threading bug (local mutable static)
- 1.17 support interlaced PNG
- 1.16 major bugfix - stbi__convert_format converted one too many pixels
- 1.15 initialize some fields for thread safety
- 1.14 fix threadsafe conversion bug
- header-file-only version (#define STBI_HEADER_FILE_ONLY before including)
- 1.13 threadsafe
- 1.12 const qualifiers in the API
- 1.11 Support installable IDCT, colorspace conversion routines
- 1.10 Fixes for 64-bit (don't use "unsigned long")
- optimized upsampling by Fabian "ryg" Giesen
- 1.09 Fix format-conversion for PSD code (bad global variables!)
- 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz
- 1.07 attempt to fix C++ warning/errors again
- 1.06 attempt to fix C++ warning/errors again
- 1.05 fix TGA loading to return correct *comp and use good luminance calc
- 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free
- 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR
- 1.02 support for (subset of) HDR files, float interface for preferred access to them
- 1.01 fix bug: possible bug in handling right-side up bmps... not sure
- fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all
- 1.00 interface to zlib that skips zlib header
- 0.99 correct handling of alpha in palette
- 0.98 TGA loader by lonesock; dynamically add loaders (untested)
- 0.97 jpeg errors on too large a file; also catch another malloc failure
- 0.96 fix detection of invalid v value - particleman@mollyrocket forum
- 0.95 during header scan, seek to markers in case of padding
- 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same
- 0.93 handle jpegtran output; verbose errors
- 0.92 read 4,8,16,24,32-bit BMP files of several formats
- 0.91 output 24-bit Windows 3.0 BMP files
- 0.90 fix a few more warnings; bump version number to approach 1.0
- 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd
- 0.60 fix compiling as c++
- 0.59 fix warnings: merge Dave Moore's -Wall fixes
- 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian
- 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available
- 0.56 fix bug: zlib uncompressed mode len vs. nlen
- 0.55 fix bug: restart_interval not initialized to 0
- 0.54 allow NULL for 'int *comp'
- 0.53 fix bug in png 3->4; speedup png decoding
- 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments
- 0.51 obey req_comp requests, 1-component jpegs return as 1-component,
- on 'test' only check type, not whether we support this variant
- 0.50 (2006-11-19)
- first released version
-*/
-
-
-/*
-------------------------------------------------------------------------------
-This software is available under 2 licenses -- choose whichever you prefer.
-------------------------------------------------------------------------------
-ALTERNATIVE A - MIT License
-Copyright (c) 2017 Sean Barrett
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-------------------------------------------------------------------------------
-ALTERNATIVE B - Public Domain (www.unlicense.org)
-This is free and unencumbered software released into the public domain.
-Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
-software, either in source code form or as a compiled binary, for any purpose,
-commercial or non-commercial, and by any means.
-In jurisdictions that recognize copyright laws, the author or authors of this
-software dedicate any and all copyright interest in the software to the public
-domain. We make this dedication for the benefit of the public at large and to
-the detriment of our heirs and successors. We intend this dedication to be an
-overt act of relinquishment in perpetuity of all present and future rights to
-this software under copyright law.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-------------------------------------------------------------------------------
-*/
diff --git a/extlibs/headers/stb_image/stb_image_write.h b/extlibs/headers/stb_image/stb_image_write.h
deleted file mode 100644
index 9d553e0..0000000
--- a/extlibs/headers/stb_image/stb_image_write.h
+++ /dev/null
@@ -1,1458 +0,0 @@
-/* stb_image_write - v1.07 - public domain - http://nothings.org/stb/stb_image_write.h
- writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015
- no warranty implied; use at your own risk
-
- Before #including,
-
- #define STB_IMAGE_WRITE_IMPLEMENTATION
-
- in the file that you want to have the implementation.
-
- Will probably not work correctly with strict-aliasing optimizations.
-
-ABOUT:
-
- This header file is a library for writing images to C stdio. It could be
- adapted to write to memory or a general streaming interface; let me know.
-
- The PNG output is not optimal; it is 20-50% larger than the file
- written by a decent optimizing implementation. This library is designed
- for source code compactness and simplicity, not optimal image file size
- or run-time performance.
-
-BUILDING:
-
- You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h.
- You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace
- malloc,realloc,free.
- You can define STBIW_MEMMOVE() to replace memmove()
-
-USAGE:
-
- There are four functions, one for each image file format:
-
- int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes);
- int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data);
- int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);
- int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);
- int stbi_write_jpg(char const *filename, int w, int h, int comp, const float *data);
-
- There are also four equivalent functions that use an arbitrary write function. You are
- expected to open/close your file-equivalent before and after calling these:
-
- int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes);
- int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data);
- int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data);
- int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data);
- int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality);
-
- where the callback is:
- void stbi_write_func(void *context, void *data, int size);
-
- You can define STBI_WRITE_NO_STDIO to disable the file variant of these
- functions, so the library will not use stdio.h at all. However, this will
- also disable HDR writing, because it requires stdio for formatted output.
-
- Each function returns 0 on failure and non-0 on success.
-
- The functions create an image file defined by the parameters. The image
- is a rectangle of pixels stored from left-to-right, top-to-bottom.
- Each pixel contains 'comp' channels of data stored interleaved with 8-bits
- per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is
- monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall.
- The *data pointer points to the first byte of the top-left-most pixel.
- For PNG, "stride_in_bytes" is the distance in bytes from the first byte of
- a row of pixels to the first byte of the next row of pixels.
-
- PNG creates output files with the same number of components as the input.
- The BMP format expands Y to RGB in the file format and does not
- output alpha.
-
- PNG supports writing rectangles of data even when the bytes storing rows of
- data are not consecutive in memory (e.g. sub-rectangles of a larger image),
- by supplying the stride between the beginning of adjacent rows. The other
- formats do not. (Thus you cannot write a native-format BMP through the BMP
- writer, both because it is in BGR order and because it may have padding
- at the end of the line.)
-
- HDR expects linear float data. Since the format is always 32-bit rgb(e)
- data, alpha (if provided) is discarded, and for monochrome data it is
- replicated across all three channels.
-
- TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed
- data, set the global variable 'stbi_write_tga_with_rle' to 0.
-
- JPEG does ignore alpha channels in input data; quality is between 1 and 100.
- Higher quality looks better but results in a bigger image.
- JPEG baseline (no JPEG progressive).
-
-CREDITS:
-
- PNG/BMP/TGA
- Sean Barrett
- HDR
- Baldur Karlsson
- TGA monochrome:
- Jean-Sebastien Guay
- misc enhancements:
- Tim Kelsey
- TGA RLE
- Alan Hickman
- initial file IO callback implementation
- Emmanuel Julien
- JPEG
- Jon Olick (original jo_jpeg.cpp code)
- Daniel Gibson
- bugfixes:
- github:Chribba
- Guillaume Chereau
- github:jry2
- github:romigrou
- Sergio Gonzalez
- Jonas Karlsson
- Filip Wasil
- Thatcher Ulrich
- github:poppolopoppo
- Patrick Boettcher
-
-LICENSE
-
- See end of file for license information.
-
-*/
-
-#ifndef INCLUDE_STB_IMAGE_WRITE_H
-#define INCLUDE_STB_IMAGE_WRITE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef STB_IMAGE_WRITE_STATIC
-#define STBIWDEF static
-#else
-#define STBIWDEF extern
-extern int stbi_write_tga_with_rle;
-#endif
-
-#ifndef STBI_WRITE_NO_STDIO
-STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes);
-STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data);
-STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);
-STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);
-STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality);
-#endif
-
-typedef void stbi_write_func(void *context, void *data, int size);
-
-STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes);
-STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data);
-STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data);
-STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data);
-STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif//INCLUDE_STB_IMAGE_WRITE_H
-
-#ifdef STB_IMAGE_WRITE_IMPLEMENTATION
-
-#ifdef _WIN32
- #ifndef _CRT_SECURE_NO_WARNINGS
- #define _CRT_SECURE_NO_WARNINGS
- #endif
- #ifndef _CRT_NONSTDC_NO_DEPRECATE
- #define _CRT_NONSTDC_NO_DEPRECATE
- #endif
-#endif
-
-#ifndef STBI_WRITE_NO_STDIO
-#include <stdio.h>
-#endif // STBI_WRITE_NO_STDIO
-
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED))
-// ok
-#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED)
-// ok
-#else
-#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)."
-#endif
-
-#ifndef STBIW_MALLOC
-#define STBIW_MALLOC(sz) malloc(sz)
-#define STBIW_REALLOC(p,newsz) realloc(p,newsz)
-#define STBIW_FREE(p) free(p)
-#endif
-
-#ifndef STBIW_REALLOC_SIZED
-#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz)
-#endif
-
-
-#ifndef STBIW_MEMMOVE
-#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz)
-#endif
-
-
-#ifndef STBIW_ASSERT
-#include <assert.h>
-#define STBIW_ASSERT(x) assert(x)
-#endif
-
-#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff)
-
-typedef struct
-{
- stbi_write_func *func;
- void *context;
-} stbi__write_context;
-
-// initialize a callback-based context
-static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context)
-{
- s->func = c;
- s->context = context;
-}
-
-#ifndef STBI_WRITE_NO_STDIO
-
-static void stbi__stdio_write(void *context, void *data, int size)
-{
- fwrite(data,1,size,(FILE*) context);
-}
-
-static int stbi__start_write_file(stbi__write_context *s, const char *filename)
-{
- FILE *f = fopen(filename, "wb");
- stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f);
- return f != NULL;
-}
-
-static void stbi__end_write_file(stbi__write_context *s)
-{
- fclose((FILE *)s->context);
-}
-
-#endif // !STBI_WRITE_NO_STDIO
-
-typedef unsigned int stbiw_uint32;
-typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1];
-
-#ifdef STB_IMAGE_WRITE_STATIC
-static int stbi_write_tga_with_rle = 1;
-#else
-int stbi_write_tga_with_rle = 1;
-#endif
-
-static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v)
-{
- while (*fmt) {
- switch (*fmt++) {
- case ' ': break;
- case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int));
- s->func(s->context,&x,1);
- break; }
- case '2': { int x = va_arg(v,int);
- unsigned char b[2];
- b[0] = STBIW_UCHAR(x);
- b[1] = STBIW_UCHAR(x>>8);
- s->func(s->context,b,2);
- break; }
- case '4': { stbiw_uint32 x = va_arg(v,int);
- unsigned char b[4];
- b[0]=STBIW_UCHAR(x);
- b[1]=STBIW_UCHAR(x>>8);
- b[2]=STBIW_UCHAR(x>>16);
- b[3]=STBIW_UCHAR(x>>24);
- s->func(s->context,b,4);
- break; }
- default:
- STBIW_ASSERT(0);
- return;
- }
- }
-}
-
-static void stbiw__writef(stbi__write_context *s, const char *fmt, ...)
-{
- va_list v;
- va_start(v, fmt);
- stbiw__writefv(s, fmt, v);
- va_end(v);
-}
-
-static void stbiw__putc(stbi__write_context *s, unsigned char c)
-{
- s->func(s->context, &c, 1);
-}
-
-static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c)
-{
- unsigned char arr[3];
- arr[0] = a, arr[1] = b, arr[2] = c;
- s->func(s->context, arr, 3);
-}
-
-static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d)
-{
- unsigned char bg[3] = { 255, 0, 255}, px[3];
- int k;
-
- if (write_alpha < 0)
- s->func(s->context, &d[comp - 1], 1);
-
- switch (comp) {
- case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case
- case 1:
- if (expand_mono)
- stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp
- else
- s->func(s->context, d, 1); // monochrome TGA
- break;
- case 4:
- if (!write_alpha) {
- // composite against pink background
- for (k = 0; k < 3; ++k)
- px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255;
- stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]);
- break;
- }
- /* FALLTHROUGH */
- case 3:
- stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]);
- break;
- }
- if (write_alpha > 0)
- s->func(s->context, &d[comp - 1], 1);
-}
-
-static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono)
-{
- stbiw_uint32 zero = 0;
- int i,j, j_end;
-
- if (y <= 0)
- return;
-
- if (vdir < 0)
- j_end = -1, j = y-1;
- else
- j_end = y, j = 0;
-
- for (; j != j_end; j += vdir) {
- for (i=0; i < x; ++i) {
- unsigned char *d = (unsigned char *) data + (j*x+i)*comp;
- stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d);
- }
- s->func(s->context, &zero, scanline_pad);
- }
-}
-
-static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...)
-{
- if (y < 0 || x < 0) {
- return 0;
- } else {
- va_list v;
- va_start(v, fmt);
- stbiw__writefv(s, fmt, v);
- va_end(v);
- stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono);
- return 1;
- }
-}
-
-static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data)
-{
- int pad = (-x*3) & 3;
- return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad,
- "11 4 22 4" "4 44 22 444444",
- 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header
- 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header
-}
-
-STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)
-{
- stbi__write_context s;
- stbi__start_write_callbacks(&s, func, context);
- return stbi_write_bmp_core(&s, x, y, comp, data);
-}
-
-#ifndef STBI_WRITE_NO_STDIO
-STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data)
-{
- stbi__write_context s;
- if (stbi__start_write_file(&s,filename)) {
- int r = stbi_write_bmp_core(&s, x, y, comp, data);
- stbi__end_write_file(&s);
- return r;
- } else
- return 0;
-}
-#endif //!STBI_WRITE_NO_STDIO
-
-static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data)
-{
- int has_alpha = (comp == 2 || comp == 4);
- int colorbytes = has_alpha ? comp-1 : comp;
- int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3
-
- if (y < 0 || x < 0)
- return 0;
-
- if (!stbi_write_tga_with_rle) {
- return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0,
- "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8);
- } else {
- int i,j,k;
-
- stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8);
-
- for (j = y - 1; j >= 0; --j) {
- unsigned char *row = (unsigned char *) data + j * x * comp;
- int len;
-
- for (i = 0; i < x; i += len) {
- unsigned char *begin = row + i * comp;
- int diff = 1;
- len = 1;
-
- if (i < x - 1) {
- ++len;
- diff = memcmp(begin, row + (i + 1) * comp, comp);
- if (diff) {
- const unsigned char *prev = begin;
- for (k = i + 2; k < x && len < 128; ++k) {
- if (memcmp(prev, row + k * comp, comp)) {
- prev += comp;
- ++len;
- } else {
- --len;
- break;
- }
- }
- } else {
- for (k = i + 2; k < x && len < 128; ++k) {
- if (!memcmp(begin, row + k * comp, comp)) {
- ++len;
- } else {
- break;
- }
- }
- }
- }
-
- if (diff) {
- unsigned char header = STBIW_UCHAR(len - 1);
- s->func(s->context, &header, 1);
- for (k = 0; k < len; ++k) {
- stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp);
- }
- } else {
- unsigned char header = STBIW_UCHAR(len - 129);
- s->func(s->context, &header, 1);
- stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin);
- }
- }
- }
- }
- return 1;
-}
-
-STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)
-{
- stbi__write_context s;
- stbi__start_write_callbacks(&s, func, context);
- return stbi_write_tga_core(&s, x, y, comp, (void *) data);
-}
-
-#ifndef STBI_WRITE_NO_STDIO
-STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data)
-{
- stbi__write_context s;
- if (stbi__start_write_file(&s,filename)) {
- int r = stbi_write_tga_core(&s, x, y, comp, (void *) data);
- stbi__end_write_file(&s);
- return r;
- } else
- return 0;
-}
-#endif
-
-// *************************************************************************************************
-// Radiance RGBE HDR writer
-// by Baldur Karlsson
-
-#define stbiw__max(a, b) ((a) > (b) ? (a) : (b))
-
-void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)
-{
- int exponent;
- float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2]));
-
- if (maxcomp < 1e-32f) {
- rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0;
- } else {
- float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp;
-
- rgbe[0] = (unsigned char)(linear[0] * normalize);
- rgbe[1] = (unsigned char)(linear[1] * normalize);
- rgbe[2] = (unsigned char)(linear[2] * normalize);
- rgbe[3] = (unsigned char)(exponent + 128);
- }
-}
-
-void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte)
-{
- unsigned char lengthbyte = STBIW_UCHAR(length+128);
- STBIW_ASSERT(length+128 <= 255);
- s->func(s->context, &lengthbyte, 1);
- s->func(s->context, &databyte, 1);
-}
-
-void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data)
-{
- unsigned char lengthbyte = STBIW_UCHAR(length);
- STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code
- s->func(s->context, &lengthbyte, 1);
- s->func(s->context, data, length);
-}
-
-void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline)
-{
- unsigned char scanlineheader[4] = { 2, 2, 0, 0 };
- unsigned char rgbe[4];
- float linear[3];
- int x;
-
- scanlineheader[2] = (width&0xff00)>>8;
- scanlineheader[3] = (width&0x00ff);
-
- /* skip RLE for images too small or large */
- if (width < 8 || width >= 32768) {
- for (x=0; x < width; x++) {
- switch (ncomp) {
- case 4: /* fallthrough */
- case 3: linear[2] = scanline[x*ncomp + 2];
- linear[1] = scanline[x*ncomp + 1];
- linear[0] = scanline[x*ncomp + 0];
- break;
- default:
- linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0];
- break;
- }
- stbiw__linear_to_rgbe(rgbe, linear);
- s->func(s->context, rgbe, 4);
- }
- } else {
- int c,r;
- /* encode into scratch buffer */
- for (x=0; x < width; x++) {
- switch(ncomp) {
- case 4: /* fallthrough */
- case 3: linear[2] = scanline[x*ncomp + 2];
- linear[1] = scanline[x*ncomp + 1];
- linear[0] = scanline[x*ncomp + 0];
- break;
- default:
- linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0];
- break;
- }
- stbiw__linear_to_rgbe(rgbe, linear);
- scratch[x + width*0] = rgbe[0];
- scratch[x + width*1] = rgbe[1];
- scratch[x + width*2] = rgbe[2];
- scratch[x + width*3] = rgbe[3];
- }
-
- s->func(s->context, scanlineheader, 4);
-
- /* RLE each component separately */
- for (c=0; c < 4; c++) {
- unsigned char *comp = &scratch[width*c];
-
- x = 0;
- while (x < width) {
- // find first run
- r = x;
- while (r+2 < width) {
- if (comp[r] == comp[r+1] && comp[r] == comp[r+2])
- break;
- ++r;
- }
- if (r+2 >= width)
- r = width;
- // dump up to first run
- while (x < r) {
- int len = r-x;
- if (len > 128) len = 128;
- stbiw__write_dump_data(s, len, &comp[x]);
- x += len;
- }
- // if there's a run, output it
- if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd
- // find next byte after run
- while (r < width && comp[r] == comp[x])
- ++r;
- // output run up to r
- while (x < r) {
- int len = r-x;
- if (len > 127) len = 127;
- stbiw__write_run_data(s, len, comp[x]);
- x += len;
- }
- }
- }
- }
- }
-}
-
-static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data)
-{
- if (y <= 0 || x <= 0 || data == NULL)
- return 0;
- else {
- // Each component is stored separately. Allocate scratch space for full output scanline.
- unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4);
- int i, len;
- char buffer[128];
- char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n";
- s->func(s->context, header, sizeof(header)-1);
-
- len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x);
- s->func(s->context, buffer, len);
-
- for(i=0; i < y; i++)
- stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*i*x);
- STBIW_FREE(scratch);
- return 1;
- }
-}
-
-STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data)
-{
- stbi__write_context s;
- stbi__start_write_callbacks(&s, func, context);
- return stbi_write_hdr_core(&s, x, y, comp, (float *) data);
-}
-
-#ifndef STBI_WRITE_NO_STDIO
-STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data)
-{
- stbi__write_context s;
- if (stbi__start_write_file(&s,filename)) {
- int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data);
- stbi__end_write_file(&s);
- return r;
- } else
- return 0;
-}
-#endif // STBI_WRITE_NO_STDIO
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-// PNG writer
-//
-
-// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size()
-#define stbiw__sbraw(a) ((int *) (a) - 2)
-#define stbiw__sbm(a) stbiw__sbraw(a)[0]
-#define stbiw__sbn(a) stbiw__sbraw(a)[1]
-
-#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a))
-#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0)
-#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a)))
-
-#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v))
-#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0)
-#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0)
-
-static void *stbiw__sbgrowf(void **arr, int increment, int itemsize)
-{
- int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1;
- void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2);
- STBIW_ASSERT(p);
- if (p) {
- if (!*arr) ((int *) p)[1] = 0;
- *arr = (void *) ((int *) p + 2);
- stbiw__sbm(*arr) = m;
- }
- return *arr;
-}
-
-static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount)
-{
- while (*bitcount >= 8) {
- stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer));
- *bitbuffer >>= 8;
- *bitcount -= 8;
- }
- return data;
-}
-
-static int stbiw__zlib_bitrev(int code, int codebits)
-{
- int res=0;
- while (codebits--) {
- res = (res << 1) | (code & 1);
- code >>= 1;
- }
- return res;
-}
-
-static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit)
-{
- int i;
- for (i=0; i < limit && i < 258; ++i)
- if (a[i] != b[i]) break;
- return i;
-}
-
-static unsigned int stbiw__zhash(unsigned char *data)
-{
- stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16);
- hash ^= hash << 3;
- hash += hash >> 5;
- hash ^= hash << 4;
- hash += hash >> 17;
- hash ^= hash << 25;
- hash += hash >> 6;
- return hash;
-}
-
-#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount))
-#define stbiw__zlib_add(code,codebits) \
- (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush())
-#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c)
-// default huffman tables
-#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8)
-#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9)
-#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7)
-#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8)
-#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n))
-#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n))
-
-#define stbiw__ZHASH 16384
-
-unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality)
-{
- static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 };
- static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 };
- static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 };
- static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };
- unsigned int bitbuf=0;
- int i,j, bitcount=0;
- unsigned char *out = NULL;
- unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(char**));
- if (quality < 5) quality = 5;
-
- stbiw__sbpush(out, 0x78); // DEFLATE 32K window
- stbiw__sbpush(out, 0x5e); // FLEVEL = 1
- stbiw__zlib_add(1,1); // BFINAL = 1
- stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman
-
- for (i=0; i < stbiw__ZHASH; ++i)
- hash_table[i] = NULL;
-
- i=0;
- while (i < data_len-3) {
- // hash next 3 bytes of data to be compressed
- int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3;
- unsigned char *bestloc = 0;
- unsigned char **hlist = hash_table[h];
- int n = stbiw__sbcount(hlist);
- for (j=0; j < n; ++j) {
- if (hlist[j]-data > i-32768) { // if entry lies within window
- int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i);
- if (d >= best) best=d,bestloc=hlist[j];
- }
- }
- // when hash table entry is too long, delete half the entries
- if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) {
- STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality);
- stbiw__sbn(hash_table[h]) = quality;
- }
- stbiw__sbpush(hash_table[h],data+i);
-
- if (bestloc) {
- // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal
- h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1);
- hlist = hash_table[h];
- n = stbiw__sbcount(hlist);
- for (j=0; j < n; ++j) {
- if (hlist[j]-data > i-32767) {
- int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1);
- if (e > best) { // if next match is better, bail on current match
- bestloc = NULL;
- break;
- }
- }
- }
- }
-
- if (bestloc) {
- int d = (int) (data+i - bestloc); // distance back
- STBIW_ASSERT(d <= 32767 && best <= 258);
- for (j=0; best > lengthc[j+1]-1; ++j);
- stbiw__zlib_huff(j+257);
- if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]);
- for (j=0; d > distc[j+1]-1; ++j);
- stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5);
- if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]);
- i += best;
- } else {
- stbiw__zlib_huffb(data[i]);
- ++i;
- }
- }
- // write out final bytes
- for (;i < data_len; ++i)
- stbiw__zlib_huffb(data[i]);
- stbiw__zlib_huff(256); // end of block
- // pad with 0 bits to byte boundary
- while (bitcount)
- stbiw__zlib_add(0,1);
-
- for (i=0; i < stbiw__ZHASH; ++i)
- (void) stbiw__sbfree(hash_table[i]);
- STBIW_FREE(hash_table);
-
- {
- // compute adler32 on input
- unsigned int s1=1, s2=0;
- int blocklen = (int) (data_len % 5552);
- j=0;
- while (j < data_len) {
- for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1;
- s1 %= 65521, s2 %= 65521;
- j += blocklen;
- blocklen = 5552;
- }
- stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8));
- stbiw__sbpush(out, STBIW_UCHAR(s2));
- stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8));
- stbiw__sbpush(out, STBIW_UCHAR(s1));
- }
- *out_len = stbiw__sbn(out);
- // make returned pointer freeable
- STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len);
- return (unsigned char *) stbiw__sbraw(out);
-}
-
-static unsigned int stbiw__crc32(unsigned char *buffer, int len)
-{
- static unsigned int crc_table[256] =
- {
- 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
- 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
- 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
- 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
- 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
- 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
- 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
- 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
- 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
- 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
- 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
- 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
- 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
- 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
- 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
- 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
- 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
- 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
- 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
- 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
- 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
- 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
- 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
- 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
- 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
- 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
- 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
- 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
- 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
- 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
- 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
- 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
- };
-
- unsigned int crc = ~0u;
- int i;
- for (i=0; i < len; ++i)
- crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)];
- return ~crc;
-}
-
-#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4)
-#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v));
-#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3])
-
-static void stbiw__wpcrc(unsigned char **data, int len)
-{
- unsigned int crc = stbiw__crc32(*data - len - 4, len+4);
- stbiw__wp32(*data, crc);
-}
-
-static unsigned char stbiw__paeth(int a, int b, int c)
-{
- int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c);
- if (pa <= pb && pa <= pc) return STBIW_UCHAR(a);
- if (pb <= pc) return STBIW_UCHAR(b);
- return STBIW_UCHAR(c);
-}
-
-// @OPTIMIZE: provide an option that always forces left-predict or paeth predict
-unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len)
-{
- int ctype[5] = { -1, 0, 4, 2, 6 };
- unsigned char sig[8] = { 137,80,78,71,13,10,26,10 };
- unsigned char *out,*o, *filt, *zlib;
- signed char *line_buffer;
- int i,j,k,p,zlen;
-
- if (stride_bytes == 0)
- stride_bytes = x * n;
-
- filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0;
- line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; }
- for (j=0; j < y; ++j) {
- static int mapping[] = { 0,1,2,3,4 };
- static int firstmap[] = { 0,1,0,5,6 };
- int *mymap = (j != 0) ? mapping : firstmap;
- int best = 0, bestval = 0x7fffffff;
- for (p=0; p < 2; ++p) {
- for (k= p?best:0; k < 5; ++k) { // @TODO: clarity: rewrite this to go 0..5, and 'continue' the unwanted ones during 2nd pass
- int type = mymap[k],est=0;
- unsigned char *z = pixels + stride_bytes*j;
- for (i=0; i < n; ++i)
- switch (type) {
- case 0: line_buffer[i] = z[i]; break;
- case 1: line_buffer[i] = z[i]; break;
- case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break;
- case 3: line_buffer[i] = z[i] - (z[i-stride_bytes]>>1); break;
- case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-stride_bytes],0)); break;
- case 5: line_buffer[i] = z[i]; break;
- case 6: line_buffer[i] = z[i]; break;
- }
- for (i=n; i < x*n; ++i) {
- switch (type) {
- case 0: line_buffer[i] = z[i]; break;
- case 1: line_buffer[i] = z[i] - z[i-n]; break;
- case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break;
- case 3: line_buffer[i] = z[i] - ((z[i-n] + z[i-stride_bytes])>>1); break;
- case 4: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-stride_bytes], z[i-stride_bytes-n]); break;
- case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break;
- case 6: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break;
- }
- }
- if (p) break;
- for (i=0; i < x*n; ++i)
- est += abs((signed char) line_buffer[i]);
- if (est < bestval) { bestval = est; best = k; }
- }
- }
- // when we get here, best contains the filter type, and line_buffer contains the data
- filt[j*(x*n+1)] = (unsigned char) best;
- STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n);
- }
- STBIW_FREE(line_buffer);
- zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, 8); // increase 8 to get smaller but use more memory
- STBIW_FREE(filt);
- if (!zlib) return 0;
-
- // each tag requires 12 bytes of overhead
- out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12);
- if (!out) return 0;
- *out_len = 8 + 12+13 + 12+zlen + 12;
-
- o=out;
- STBIW_MEMMOVE(o,sig,8); o+= 8;
- stbiw__wp32(o, 13); // header length
- stbiw__wptag(o, "IHDR");
- stbiw__wp32(o, x);
- stbiw__wp32(o, y);
- *o++ = 8;
- *o++ = STBIW_UCHAR(ctype[n]);
- *o++ = 0;
- *o++ = 0;
- *o++ = 0;
- stbiw__wpcrc(&o,13);
-
- stbiw__wp32(o, zlen);
- stbiw__wptag(o, "IDAT");
- STBIW_MEMMOVE(o, zlib, zlen);
- o += zlen;
- STBIW_FREE(zlib);
- stbiw__wpcrc(&o, zlen);
-
- stbiw__wp32(o,0);
- stbiw__wptag(o, "IEND");
- stbiw__wpcrc(&o,0);
-
- STBIW_ASSERT(o == out + *out_len);
-
- return out;
-}
-
-#ifndef STBI_WRITE_NO_STDIO
-STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes)
-{
- FILE *f;
- int len;
- unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);
- if (png == NULL) return 0;
- f = fopen(filename, "wb");
- if (!f) { STBIW_FREE(png); return 0; }
- fwrite(png, 1, len, f);
- fclose(f);
- STBIW_FREE(png);
- return 1;
-}
-#endif
-
-STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes)
-{
- int len;
- unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);
- if (png == NULL) return 0;
- func(context, png, len);
- STBIW_FREE(png);
- return 1;
-}
-
-
-/* ***************************************************************************
- *
- * JPEG writer
- *
- * This is based on Jon Olick's jo_jpeg.cpp:
- * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html
- */
-
-static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,
- 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 };
-
-static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) {
- int bitBuf = *bitBufP, bitCnt = *bitCntP;
- bitCnt += bs[1];
- bitBuf |= bs[0] << (24 - bitCnt);
- while(bitCnt >= 8) {
- unsigned char c = (bitBuf >> 16) & 255;
- stbiw__putc(s, c);
- if(c == 255) {
- stbiw__putc(s, 0);
- }
- bitBuf <<= 8;
- bitCnt -= 8;
- }
- *bitBufP = bitBuf;
- *bitCntP = bitCnt;
-}
-
-static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) {
- float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p;
- float z1, z2, z3, z4, z5, z11, z13;
-
- float tmp0 = d0 + d7;
- float tmp7 = d0 - d7;
- float tmp1 = d1 + d6;
- float tmp6 = d1 - d6;
- float tmp2 = d2 + d5;
- float tmp5 = d2 - d5;
- float tmp3 = d3 + d4;
- float tmp4 = d3 - d4;
-
- // Even part
- float tmp10 = tmp0 + tmp3; // phase 2
- float tmp13 = tmp0 - tmp3;
- float tmp11 = tmp1 + tmp2;
- float tmp12 = tmp1 - tmp2;
-
- d0 = tmp10 + tmp11; // phase 3
- d4 = tmp10 - tmp11;
-
- z1 = (tmp12 + tmp13) * 0.707106781f; // c4
- d2 = tmp13 + z1; // phase 5
- d6 = tmp13 - z1;
-
- // Odd part
- tmp10 = tmp4 + tmp5; // phase 2
- tmp11 = tmp5 + tmp6;
- tmp12 = tmp6 + tmp7;
-
- // The rotator is modified from fig 4-8 to avoid extra negations.
- z5 = (tmp10 - tmp12) * 0.382683433f; // c6
- z2 = tmp10 * 0.541196100f + z5; // c2-c6
- z4 = tmp12 * 1.306562965f + z5; // c2+c6
- z3 = tmp11 * 0.707106781f; // c4
-
- z11 = tmp7 + z3; // phase 5
- z13 = tmp7 - z3;
-
- *d5p = z13 + z2; // phase 6
- *d3p = z13 - z2;
- *d1p = z11 + z4;
- *d7p = z11 - z4;
-
- *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6;
-}
-
-static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) {
- int tmp1 = val < 0 ? -val : val;
- val = val < 0 ? val-1 : val;
- bits[1] = 1;
- while(tmp1 >>= 1) {
- ++bits[1];
- }
- bits[0] = val & ((1<<bits[1])-1);
-}
-
-static int stbiw__jpg_processDU(stbi__write_context *s, int *bitBuf, int *bitCnt, float *CDU, float *fdtbl, int DC, const unsigned short HTDC[256][2], const unsigned short HTAC[256][2]) {
- const unsigned short EOB[2] = { HTAC[0x00][0], HTAC[0x00][1] };
- const unsigned short M16zeroes[2] = { HTAC[0xF0][0], HTAC[0xF0][1] };
- int dataOff, i, diff, end0pos;
- int DU[64];
-
- // DCT rows
- for(dataOff=0; dataOff<64; dataOff+=8) {
- stbiw__jpg_DCT(&CDU[dataOff], &CDU[dataOff+1], &CDU[dataOff+2], &CDU[dataOff+3], &CDU[dataOff+4], &CDU[dataOff+5], &CDU[dataOff+6], &CDU[dataOff+7]);
- }
- // DCT columns
- for(dataOff=0; dataOff<8; ++dataOff) {
- stbiw__jpg_DCT(&CDU[dataOff], &CDU[dataOff+8], &CDU[dataOff+16], &CDU[dataOff+24], &CDU[dataOff+32], &CDU[dataOff+40], &CDU[dataOff+48], &CDU[dataOff+56]);
- }
- // Quantize/descale/zigzag the coefficients
- for(i=0; i<64; ++i) {
- float v = CDU[i]*fdtbl[i];
- // DU[stbiw__jpg_ZigZag[i]] = (int)(v < 0 ? ceilf(v - 0.5f) : floorf(v + 0.5f));
- // ceilf() and floorf() are C99, not C89, but I /think/ they're not needed here anyway?
- DU[stbiw__jpg_ZigZag[i]] = (int)(v < 0 ? v - 0.5f : v + 0.5f);
- }
-
- // Encode DC
- diff = DU[0] - DC;
- if (diff == 0) {
- stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTDC[0]);
- } else {
- unsigned short bits[2];
- stbiw__jpg_calcBits(diff, bits);
- stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTDC[bits[1]]);
- stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits);
- }
- // Encode ACs
- end0pos = 63;
- for(; (end0pos>0)&&(DU[end0pos]==0); --end0pos) {
- }
- // end0pos = first element in reverse order !=0
- if(end0pos == 0) {
- stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB);
- return DU[0];
- }
- for(i = 1; i <= end0pos; ++i) {
- int startpos = i;
- int nrzeroes;
- unsigned short bits[2];
- for (; DU[i]==0 && i<=end0pos; ++i) {
- }
- nrzeroes = i-startpos;
- if ( nrzeroes >= 16 ) {
- int lng = nrzeroes>>4;
- int nrmarker;
- for (nrmarker=1; nrmarker <= lng; ++nrmarker)
- stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes);
- nrzeroes &= 15;
- }
- stbiw__jpg_calcBits(DU[i], bits);
- stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]);
- stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits);
- }
- if(end0pos != 63) {
- stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB);
- }
- return DU[0];
-}
-
-static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) {
- // Constants that don't pollute global namespace
- static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0};
- static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11};
- static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d};
- static const unsigned char std_ac_luminance_values[] = {
- 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
- 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
- 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
- 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
- 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
- 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
- 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa
- };
- static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0};
- static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11};
- static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77};
- static const unsigned char std_ac_chrominance_values[] = {
- 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
- 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
- 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
- 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
- 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
- 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
- 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa
- };
- // Huffman tables
- static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}};
- static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}};
- static const unsigned short YAC_HT[256][2] = {
- {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0},
- {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0}
- };
- static const unsigned short UVAC_HT[256][2] = {
- {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},
- {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0},
- {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0}
- };
- static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,
- 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99};
- static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,
- 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99};
- static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f,
- 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f };
-
- int row, col, i, k;
- float fdtbl_Y[64], fdtbl_UV[64];
- unsigned char YTable[64], UVTable[64];
-
- if(!data || !width || !height || comp > 4 || comp < 1) {
- return 0;
- }
-
- quality = quality ? quality : 90;
- quality = quality < 1 ? 1 : quality > 100 ? 100 : quality;
- quality = quality < 50 ? 5000 / quality : 200 - quality * 2;
-
- for(i = 0; i < 64; ++i) {
- int uvti, yti = (YQT[i]*quality+50)/100;
- YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti);
- uvti = (UVQT[i]*quality+50)/100;
- UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti);
- }
-
- for(row = 0, k = 0; row < 8; ++row) {
- for(col = 0; col < 8; ++col, ++k) {
- fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]);
- fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]);
- }
- }
-
- // Write Headers
- {
- static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 };
- static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 };
- const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width),
- 3,1,0x11,0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 };
- s->func(s->context, (void*)head0, sizeof(head0));
- s->func(s->context, (void*)YTable, sizeof(YTable));
- stbiw__putc(s, 1);
- s->func(s->context, UVTable, sizeof(UVTable));
- s->func(s->context, (void*)head1, sizeof(head1));
- s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1);
- s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values));
- stbiw__putc(s, 0x10); // HTYACinfo
- s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1);
- s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values));
- stbiw__putc(s, 1); // HTUDCinfo
- s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1);
- s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values));
- stbiw__putc(s, 0x11); // HTUACinfo
- s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1);
- s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values));
- s->func(s->context, (void*)head2, sizeof(head2));
- }
-
- // Encode 8x8 macroblocks
- {
- static const unsigned short fillBits[] = {0x7F, 7};
- const unsigned char *imageData = (const unsigned char *)data;
- int DCY=0, DCU=0, DCV=0;
- int bitBuf=0, bitCnt=0;
- // comp == 2 is grey+alpha (alpha is ignored)
- int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0;
- int x, y, pos;
- for(y = 0; y < height; y += 8) {
- for(x = 0; x < width; x += 8) {
- float YDU[64], UDU[64], VDU[64];
- for(row = y, pos = 0; row < y+8; ++row) {
- for(col = x; col < x+8; ++col, ++pos) {
- int p = row*width*comp + col*comp;
- float r, g, b;
- if(row >= height) {
- p -= width*comp*(row+1 - height);
- }
- if(col >= width) {
- p -= comp*(col+1 - width);
- }
-
- r = imageData[p+0];
- g = imageData[p+ofsG];
- b = imageData[p+ofsB];
- YDU[pos]=+0.29900f*r+0.58700f*g+0.11400f*b-128;
- UDU[pos]=-0.16874f*r-0.33126f*g+0.50000f*b;
- VDU[pos]=+0.50000f*r-0.41869f*g-0.08131f*b;
- }
- }
-
- DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
- DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
- DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
- }
- }
-
- // Do the bit alignment of the EOI marker
- stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits);
- }
-
- // EOI
- stbiw__putc(s, 0xFF);
- stbiw__putc(s, 0xD9);
-
- return 1;
-}
-
-STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality)
-{
- stbi__write_context s;
- stbi__start_write_callbacks(&s, func, context);
- return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality);
-}
-
-
-#ifndef STBI_WRITE_NO_STDIO
-STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality)
-{
- stbi__write_context s;
- if (stbi__start_write_file(&s,filename)) {
- int r = stbi_write_jpg_core(&s, x, y, comp, data, quality);
- stbi__end_write_file(&s);
- return r;
- } else
- return 0;
-}
-#endif
-
-#endif // STB_IMAGE_WRITE_IMPLEMENTATION
-
-/* Revision history
- 1.07 (2017-07-24)
- doc fix
- 1.06 (2017-07-23)
- writing JPEG (using Jon Olick's code)
- 1.05 ???
- 1.04 (2017-03-03)
- monochrome BMP expansion
- 1.03 ???
- 1.02 (2016-04-02)
- avoid allocating large structures on the stack
- 1.01 (2016-01-16)
- STBIW_REALLOC_SIZED: support allocators with no realloc support
- avoid race-condition in crc initialization
- minor compile issues
- 1.00 (2015-09-14)
- installable file IO function
- 0.99 (2015-09-13)
- warning fixes; TGA rle support
- 0.98 (2015-04-08)
- added STBIW_MALLOC, STBIW_ASSERT etc
- 0.97 (2015-01-18)
- fixed HDR asserts, rewrote HDR rle logic
- 0.96 (2015-01-17)
- add HDR output
- fix monochrome BMP
- 0.95 (2014-08-17)
- add monochrome TGA output
- 0.94 (2014-05-31)
- rename private functions to avoid conflicts with stb_image.h
- 0.93 (2014-05-27)
- warning fixes
- 0.92 (2010-08-01)
- casts to unsigned char to fix warnings
- 0.91 (2010-07-17)
- first public release
- 0.90 first internal release
-*/
-
-/*
-------------------------------------------------------------------------------
-This software is available under 2 licenses -- choose whichever you prefer.
-------------------------------------------------------------------------------
-ALTERNATIVE A - MIT License
-Copyright (c) 2017 Sean Barrett
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-------------------------------------------------------------------------------
-ALTERNATIVE B - Public Domain (www.unlicense.org)
-This is free and unencumbered software released into the public domain.
-Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
-software, either in source code form or as a compiled binary, for any purpose,
-commercial or non-commercial, and by any means.
-In jurisdictions that recognize copyright laws, the author or authors of this
-software dedicate any and all copyright interest in the software to the public
-domain. We make this dedication for the benefit of the public at large and to
-the detriment of our heirs and successors. We intend this dedication to be an
-overt act of relinquishment in perpetuity of all present and future rights to
-this software under copyright law.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-------------------------------------------------------------------------------
-*/
diff --git a/include/SFML/Audio.hpp b/include/SFML/Audio.hpp
index 3167927..d5f798d 100644
--- a/include/SFML/Audio.hpp
+++ b/include/SFML/Audio.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Audio/AlResource.hpp b/include/SFML/Audio/AlResource.hpp
index dd7d44c..7ac21fe 100644
--- a/include/SFML/Audio/AlResource.hpp
+++ b/include/SFML/Audio/AlResource.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Audio/Export.hpp b/include/SFML/Audio/Export.hpp
index 9e5e09c..e253151 100644
--- a/include/SFML/Audio/Export.hpp
+++ b/include/SFML/Audio/Export.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Audio/InputSoundFile.hpp b/include/SFML/Audio/InputSoundFile.hpp
index 317b952..0a02b14 100644
--- a/include/SFML/Audio/InputSoundFile.hpp
+++ b/include/SFML/Audio/InputSoundFile.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -32,7 +32,7 @@
#include <SFML/System/NonCopyable.hpp>
#include <SFML/System/Time.hpp>
#include <string>
-#include <algorithm>
+#include <cstddef>
namespace sf
@@ -63,9 +63,14 @@ public:
////////////////////////////////////////////////////////////
/// \brief Open a sound file from the disk for reading
///
- /// The supported audio formats are: WAV (PCM only), OGG/Vorbis, FLAC.
+ /// The supported audio formats are: WAV (PCM only), OGG/Vorbis, FLAC, MP3.
/// The supported sample sizes for FLAC and WAV are 8, 16, 24 and 32 bit.
///
+ /// Because of minimp3_ex limitation, for MP3 files with big (>16kb) APEv2 tag,
+ /// it may not be properly removed, tag data will be treated as MP3 data
+ /// and there is a low chance of garbage decoded at the end of file.
+ /// See also: https://github.com/lieff/minimp3
+ ///
/// \param filename Path of the sound file to load
///
/// \return True if the file was successfully opened
@@ -195,24 +200,24 @@ public:
////////////////////////////////////////////////////////////
Uint64 read(Int16* samples, Uint64 maxCount);
-private:
-
////////////////////////////////////////////////////////////
/// \brief Close the current file
///
////////////////////////////////////////////////////////////
void close();
+private:
+
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- SoundFileReader* m_reader; ///< Reader that handles I/O on the file's format
- InputStream* m_stream; ///< Input stream used to access the file's data
- bool m_streamOwned; ///< Is the stream internal or external?
- Uint64 m_sampleOffset; ///< Sample Read Position
- Uint64 m_sampleCount; ///< Total number of samples in the file
- unsigned int m_channelCount; ///< Number of channels of the sound
- unsigned int m_sampleRate; ///< Number of samples per second
+ SoundFileReader* m_reader; //!< Reader that handles I/O on the file's format
+ InputStream* m_stream; //!< Input stream used to access the file's data
+ bool m_streamOwned; //!< Is the stream internal or external?
+ Uint64 m_sampleOffset; //!< Sample Read Position
+ Uint64 m_sampleCount; //!< Total number of samples in the file
+ unsigned int m_channelCount; //!< Number of channels of the sound
+ unsigned int m_sampleRate; //!< Number of samples per second
};
} // namespace sf
diff --git a/include/SFML/Audio/Listener.hpp b/include/SFML/Audio/Listener.hpp
index 9fb7fff..edfe650 100644
--- a/include/SFML/Audio/Listener.hpp
+++ b/include/SFML/Audio/Listener.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Audio/Music.hpp b/include/SFML/Audio/Music.hpp
index 5351905..4c4eefb 100644
--- a/include/SFML/Audio/Music.hpp
+++ b/include/SFML/Audio/Music.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -79,8 +79,8 @@ public:
}
- T offset; ///< The beginning offset of the time range
- T length; ///< The length of the time range
+ T offset; //!< The beginning offset of the time range
+ T length; //!< The length of the time range
};
// Define the relevant Span types
@@ -189,11 +189,11 @@ public:
TimeSpan getLoopPoints() const;
////////////////////////////////////////////////////////////
- /// \brief Sets the beginning and end of the sound's looping sequence using sf::Time
+ /// \brief Sets the beginning and duration of the sound's looping sequence using sf::Time
///
- /// Loop points allow one to specify a pair of positions such that, when the music
+ /// setLoopPoints() allows for specifying the beginning offset and the duration of the loop such that, when the music
/// is enabled for looping, it will seamlessly seek to the beginning whenever it
- /// encounters the end. Valid ranges for timePoints.offset and timePoints.length are
+ /// encounters the end of the duration. Valid ranges for timePoints.offset and timePoints.length are
/// [0, Dur) and (0, Dur-offset] respectively, where Dur is the value returned by getDuration().
/// Note that the EOF "loop point" from the end to the beginning of the stream is still honored,
/// in case the caller seeks to a point after the end of the loop range. This function can be
@@ -276,10 +276,10 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- InputSoundFile m_file; ///< The streamed music file
- std::vector<Int16> m_samples; ///< Temporary buffer of samples
- Mutex m_mutex; ///< Mutex protecting the data
- Span<Uint64> m_loopSpan; ///< Loop Range Specifier
+ InputSoundFile m_file; //!< The streamed music file
+ std::vector<Int16> m_samples; //!< Temporary buffer of samples
+ Mutex m_mutex; //!< Mutex protecting the data
+ Span<Uint64> m_loopSpan; //!< Loop Range Specifier
};
} // namespace sf
diff --git a/include/SFML/Audio/OutputSoundFile.hpp b/include/SFML/Audio/OutputSoundFile.hpp
index 5da374b..a795edf 100644
--- a/include/SFML/Audio/OutputSoundFile.hpp
+++ b/include/SFML/Audio/OutputSoundFile.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -82,18 +82,18 @@ public:
////////////////////////////////////////////////////////////
void write(const Int16* samples, Uint64 count);
-private:
-
////////////////////////////////////////////////////////////
/// \brief Close the current file
///
////////////////////////////////////////////////////////////
void close();
+private:
+
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- SoundFileWriter* m_writer; ///< Writer that handles I/O on the file's format
+ SoundFileWriter* m_writer; //!< Writer that handles I/O on the file's format
};
} // namespace sf
diff --git a/include/SFML/Audio/Sound.hpp b/include/SFML/Audio/Sound.hpp
index f8e2e14..aea556c 100644
--- a/include/SFML/Audio/Sound.hpp
+++ b/include/SFML/Audio/Sound.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -217,7 +217,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- const SoundBuffer* m_buffer; ///< Sound buffer bound to the source
+ const SoundBuffer* m_buffer; //!< Sound buffer bound to the source
};
} // namespace sf
diff --git a/include/SFML/Audio/SoundBuffer.hpp b/include/SFML/Audio/SoundBuffer.hpp
index 5aaa4ca..b2f8b29 100644
--- a/include/SFML/Audio/SoundBuffer.hpp
+++ b/include/SFML/Audio/SoundBuffer.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -267,15 +267,15 @@ private:
////////////////////////////////////////////////////////////
// Types
////////////////////////////////////////////////////////////
- typedef std::set<Sound*> SoundList; ///< Set of unique sound instances
+ typedef std::set<Sound*> SoundList; //!< Set of unique sound instances
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- unsigned int m_buffer; ///< OpenAL buffer identifier
- std::vector<Int16> m_samples; ///< Samples buffer
- Time m_duration; ///< Sound duration
- mutable SoundList m_sounds; ///< List of sounds that are using this buffer
+ unsigned int m_buffer; //!< OpenAL buffer identifier
+ std::vector<Int16> m_samples; //!< Samples buffer
+ Time m_duration; //!< Sound duration
+ mutable SoundList m_sounds; //!< List of sounds that are using this buffer
};
} // namespace sf
diff --git a/include/SFML/Audio/SoundBufferRecorder.hpp b/include/SFML/Audio/SoundBufferRecorder.hpp
index 266603d..a632c83 100644
--- a/include/SFML/Audio/SoundBufferRecorder.hpp
+++ b/include/SFML/Audio/SoundBufferRecorder.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -96,8 +96,8 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- std::vector<Int16> m_samples; ///< Temporary sample buffer to hold the recorded data
- SoundBuffer m_buffer; ///< Sound buffer that will contain the recorded data
+ std::vector<Int16> m_samples; //!< Temporary sample buffer to hold the recorded data
+ SoundBuffer m_buffer; //!< Sound buffer that will contain the recorded data
};
} // namespace sf
diff --git a/include/SFML/Audio/SoundFileFactory.hpp b/include/SFML/Audio/SoundFileFactory.hpp
index e3719c8..07ea4c5 100644
--- a/include/SFML/Audio/SoundFileFactory.hpp
+++ b/include/SFML/Audio/SoundFileFactory.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -160,8 +160,8 @@ private:
////////////////////////////////////////////////////////////
// Static member data
////////////////////////////////////////////////////////////
- static ReaderFactoryArray s_readers; ///< List of all registered readers
- static WriterFactoryArray s_writers; ///< List of all registered writers
+ static ReaderFactoryArray s_readers; //!< List of all registered readers
+ static WriterFactoryArray s_writers; //!< List of all registered writers
};
} // namespace sf
diff --git a/include/SFML/Audio/SoundFileFactory.inl b/include/SFML/Audio/SoundFileFactory.inl
index 6c499f3..9feeee0 100644
--- a/include/SFML/Audio/SoundFileFactory.inl
+++ b/include/SFML/Audio/SoundFileFactory.inl
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Audio/SoundFileReader.hpp b/include/SFML/Audio/SoundFileReader.hpp
index a040db9..7ef522b 100644
--- a/include/SFML/Audio/SoundFileReader.hpp
+++ b/include/SFML/Audio/SoundFileReader.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -50,9 +50,9 @@ public:
////////////////////////////////////////////////////////////
struct Info
{
- Uint64 sampleCount; ///< Total number of samples in the file
- unsigned int channelCount; ///< Number of channels of the sound
- unsigned int sampleRate; ///< Samples rate of the sound, in samples per second
+ Uint64 sampleCount; //!< Total number of samples in the file
+ unsigned int channelCount; //!< Number of channels of the sound
+ unsigned int sampleRate; //!< Samples rate of the sound, in samples per second
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/Audio/SoundFileWriter.hpp b/include/SFML/Audio/SoundFileWriter.hpp
index 8651ddc..f293f8a 100644
--- a/include/SFML/Audio/SoundFileWriter.hpp
+++ b/include/SFML/Audio/SoundFileWriter.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Audio/SoundRecorder.hpp b/include/SFML/Audio/SoundRecorder.hpp
index d4dc74f..86e8a83 100644
--- a/include/SFML/Audio/SoundRecorder.hpp
+++ b/include/SFML/Audio/SoundRecorder.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -285,13 +285,13 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Thread m_thread; ///< Thread running the background recording task
- std::vector<Int16> m_samples; ///< Buffer to store captured samples
- unsigned int m_sampleRate; ///< Sample rate
- Time m_processingInterval; ///< Time period between calls to onProcessSamples
- bool m_isCapturing; ///< Capturing state
- std::string m_deviceName; ///< Name of the audio capture device
- unsigned int m_channelCount; ///< Number of recording channels
+ Thread m_thread; //!< Thread running the background recording task
+ std::vector<Int16> m_samples; //!< Buffer to store captured samples
+ unsigned int m_sampleRate; //!< Sample rate
+ Time m_processingInterval; //!< Time period between calls to onProcessSamples
+ bool m_isCapturing; //!< Capturing state
+ std::string m_deviceName; //!< Name of the audio capture device
+ unsigned int m_channelCount; //!< Number of recording channels
};
} // namespace sf
@@ -359,12 +359,14 @@ private:
/// \code
/// class CustomRecorder : public sf::SoundRecorder
/// {
+/// public:
/// ~CustomRecorder()
/// {
/// // Make sure to stop the recording thread
/// stop();
/// }
///
+/// private:
/// virtual bool onStart() // optional
/// {
/// // Initialize whatever has to be done before the capture starts
@@ -374,7 +376,7 @@ private:
/// return true;
/// }
///
-/// virtual bool onProcessSamples(const Int16* samples, std::size_t sampleCount)
+/// virtual bool onProcessSamples(const sf::Int16* samples, std::size_t sampleCount)
/// {
/// // Do something with the new chunk of samples (store them, send them, ...)
/// ...
@@ -388,7 +390,7 @@ private:
/// // Clean up whatever has to be done after the capture ends
/// ...
/// }
-/// }
+/// };
///
/// // Usage
/// if (CustomRecorder::isAvailable())
diff --git a/include/SFML/Audio/SoundSource.hpp b/include/SFML/Audio/SoundSource.hpp
index fcc9c79..decf038 100644
--- a/include/SFML/Audio/SoundSource.hpp
+++ b/include/SFML/Audio/SoundSource.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -49,9 +49,9 @@ public:
////////////////////////////////////////////////////////////
enum Status
{
- Stopped, ///< Sound is not playing
- Paused, ///< Sound is paused
- Playing ///< Sound is playing
+ Stopped, //!< Sound is not playing
+ Paused, //!< Sound is paused
+ Playing //!< Sound is playing
};
////////////////////////////////////////////////////////////
@@ -306,7 +306,7 @@ protected:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- unsigned int m_source; ///< OpenAL source identifier
+ unsigned int m_source; //!< OpenAL source identifier
};
} // namespace sf
diff --git a/include/SFML/Audio/SoundStream.hpp b/include/SFML/Audio/SoundStream.hpp
index bed8311..086deab 100644
--- a/include/SFML/Audio/SoundStream.hpp
+++ b/include/SFML/Audio/SoundStream.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -52,8 +52,8 @@ public:
////////////////////////////////////////////////////////////
struct Chunk
{
- const Int16* samples; ///< Pointer to the audio samples
- std::size_t sampleCount; ///< Number of samples pointed by Samples
+ const Int16* samples; //!< Pointer to the audio samples
+ std::size_t sampleCount; //!< Number of samples pointed by Samples
};
////////////////////////////////////////////////////////////
@@ -182,7 +182,7 @@ protected:
enum
{
- NoLoop = -1 ///< "Invalid" endSeeks value, telling us to continue uninterrupted
+ NoLoop = -1 //!< "Invalid" endSeeks value, telling us to continue uninterrupted
};
////////////////////////////////////////////////////////////
@@ -251,6 +251,20 @@ protected:
////////////////////////////////////////////////////////////
virtual Int64 onLoop();
+ ////////////////////////////////////////////////////////////
+ /// \brief Set the processing interval
+ ///
+ /// The processing interval controls the period at which the
+ /// audio buffers are filled by calls to onGetData. A smaller
+ /// interval may be useful for low-latency streams. Note that
+ /// the given period is only a hint and the actual period may
+ /// vary. The default processing interval is 10 ms.
+ ///
+ /// \param interval Processing interval
+ ///
+ ////////////////////////////////////////////////////////////
+ void setProcessingInterval(Time interval);
+
private:
////////////////////////////////////////////////////////////
@@ -299,24 +313,25 @@ private:
enum
{
- BufferCount = 3, ///< Number of audio buffers used by the streaming loop
- BufferRetries = 2 ///< Number of retries (excluding initial try) for onGetData()
+ BufferCount = 3, //!< Number of audio buffers used by the streaming loop
+ BufferRetries = 2 //!< Number of retries (excluding initial try) for onGetData()
};
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Thread m_thread; ///< Thread running the background tasks
- mutable Mutex m_threadMutex; ///< Thread mutex
- Status m_threadStartState; ///< State the thread starts in (Playing, Paused, Stopped)
- bool m_isStreaming; ///< Streaming state (true = playing, false = stopped)
- unsigned int m_buffers[BufferCount]; ///< Sound buffers used to store temporary audio data
- unsigned int m_channelCount; ///< Number of channels (1 = mono, 2 = stereo, ...)
- unsigned int m_sampleRate; ///< Frequency (samples / second)
- Uint32 m_format; ///< Format of the internal sound buffers
- bool m_loop; ///< Loop flag (true to loop, false to play once)
- Uint64 m_samplesProcessed; ///< Number of buffers processed since beginning of the stream
- Int64 m_bufferSeeks[BufferCount]; ///< If buffer is an "end buffer", holds next seek position, else NoLoop. For play offset calculation.
+ Thread m_thread; //!< Thread running the background tasks
+ mutable Mutex m_threadMutex; //!< Thread mutex
+ Status m_threadStartState; //!< State the thread starts in (Playing, Paused, Stopped)
+ bool m_isStreaming; //!< Streaming state (true = playing, false = stopped)
+ unsigned int m_buffers[BufferCount]; //!< Sound buffers used to store temporary audio data
+ unsigned int m_channelCount; //!< Number of channels (1 = mono, 2 = stereo, ...)
+ unsigned int m_sampleRate; //!< Frequency (samples / second)
+ Int32 m_format; //!< Format of the internal sound buffers
+ bool m_loop; //!< Loop flag (true to loop, false to play once)
+ Uint64 m_samplesProcessed; //!< Number of samples processed since beginning of the stream
+ Int64 m_bufferSeeks[BufferCount]; //!< If buffer is an "end buffer", holds next seek position, else NoLoop. For play offset calculation.
+ Time m_processingInterval; //!< Interval for checking and filling the internal sound buffers.
};
} // namespace sf
@@ -387,12 +402,12 @@ private:
/// return true;
/// }
///
-/// virtual void onSeek(Uint32 timeOffset)
+/// virtual void onSeek(sf::Time timeOffset)
/// {
/// // Change the current position in the stream source
/// ...
/// }
-/// }
+/// };
///
/// // Usage
/// CustomStream stream;
diff --git a/include/SFML/Config.hpp b/include/SFML/Config.hpp
index 40b677e..3093a7a 100644
--- a/include/SFML/Config.hpp
+++ b/include/SFML/Config.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -30,13 +30,13 @@
// Define the SFML version
////////////////////////////////////////////////////////////
#define SFML_VERSION_MAJOR 2
-#define SFML_VERSION_MINOR 5
+#define SFML_VERSION_MINOR 6
#define SFML_VERSION_PATCH 1
////////////////////////////////////////////////////////////
// Identify the operating system
-// see http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system
+// see https://sourceforge.net/p/predef/wiki/Home/
////////////////////////////////////////////////////////////
#if defined(_WIN32)
@@ -91,6 +91,11 @@
// OpenBSD
#define SFML_SYSTEM_OPENBSD
+ #elif defined(__NetBSD__)
+
+ // NetBSD
+ #define SFML_SYSTEM_NETBSD
+
#else
// Unsupported UNIX system
@@ -226,8 +231,15 @@ namespace sf
typedef signed __int64 Int64;
typedef unsigned __int64 Uint64;
#else
+ #if defined(__clang__)
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wc++11-long-long"
+ #endif
typedef signed long long Int64;
typedef unsigned long long Uint64;
+ #if defined(__clang__)
+ #pragma clang diagnostic pop
+ #endif
#endif
} // namespace sf
diff --git a/include/SFML/GpuPreference.hpp b/include/SFML/GpuPreference.hpp
index cde4f9f..935b606 100644
--- a/include/SFML/GpuPreference.hpp
+++ b/include/SFML/GpuPreference.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Graphics.hpp b/include/SFML/Graphics.hpp
index 252c6e9..d4e1929 100644
--- a/include/SFML/Graphics.hpp
+++ b/include/SFML/Graphics.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Graphics/BlendMode.hpp b/include/SFML/Graphics/BlendMode.hpp
index 15da7d1..415ff42 100644
--- a/include/SFML/Graphics/BlendMode.hpp
+++ b/include/SFML/Graphics/BlendMode.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -48,16 +48,16 @@ struct SFML_GRAPHICS_API BlendMode
////////////////////////////////////////////////////////
enum Factor
{
- Zero, ///< (0, 0, 0, 0)
- One, ///< (1, 1, 1, 1)
- SrcColor, ///< (src.r, src.g, src.b, src.a)
- OneMinusSrcColor, ///< (1, 1, 1, 1) - (src.r, src.g, src.b, src.a)
- DstColor, ///< (dst.r, dst.g, dst.b, dst.a)
- OneMinusDstColor, ///< (1, 1, 1, 1) - (dst.r, dst.g, dst.b, dst.a)
- SrcAlpha, ///< (src.a, src.a, src.a, src.a)
- OneMinusSrcAlpha, ///< (1, 1, 1, 1) - (src.a, src.a, src.a, src.a)
- DstAlpha, ///< (dst.a, dst.a, dst.a, dst.a)
- OneMinusDstAlpha ///< (1, 1, 1, 1) - (dst.a, dst.a, dst.a, dst.a)
+ Zero, //!< (0, 0, 0, 0)
+ One, //!< (1, 1, 1, 1)
+ SrcColor, //!< (src.r, src.g, src.b, src.a)
+ OneMinusSrcColor, //!< (1, 1, 1, 1) - (src.r, src.g, src.b, src.a)
+ DstColor, //!< (dst.r, dst.g, dst.b, dst.a)
+ OneMinusDstColor, //!< (1, 1, 1, 1) - (dst.r, dst.g, dst.b, dst.a)
+ SrcAlpha, //!< (src.a, src.a, src.a, src.a)
+ OneMinusSrcAlpha, //!< (1, 1, 1, 1) - (src.a, src.a, src.a, src.a)
+ DstAlpha, //!< (dst.a, dst.a, dst.a, dst.a)
+ OneMinusDstAlpha //!< (1, 1, 1, 1) - (dst.a, dst.a, dst.a, dst.a)
};
////////////////////////////////////////////////////////
@@ -68,9 +68,11 @@ struct SFML_GRAPHICS_API BlendMode
////////////////////////////////////////////////////////
enum Equation
{
- Add, ///< Pixel = Src * SrcFactor + Dst * DstFactor
- Subtract, ///< Pixel = Src * SrcFactor - Dst * DstFactor
- ReverseSubtract ///< Pixel = Dst * DstFactor - Src * SrcFactor
+ Add, //!< Pixel = Src * SrcFactor + Dst * DstFactor
+ Subtract, //!< Pixel = Src * SrcFactor - Dst * DstFactor
+ ReverseSubtract, //!< Pixel = Dst * DstFactor - Src * SrcFactor
+ Min, //!< Pixel = min(Dst, Src)
+ Max //!< Pixel = max(Dst, Src)
};
////////////////////////////////////////////////////////////
@@ -112,12 +114,12 @@ struct SFML_GRAPHICS_API BlendMode
////////////////////////////////////////////////////////////
// Member Data
////////////////////////////////////////////////////////////
- Factor colorSrcFactor; ///< Source blending factor for the color channels
- Factor colorDstFactor; ///< Destination blending factor for the color channels
- Equation colorEquation; ///< Blending equation for the color channels
- Factor alphaSrcFactor; ///< Source blending factor for the alpha channel
- Factor alphaDstFactor; ///< Destination blending factor for the alpha channel
- Equation alphaEquation; ///< Blending equation for the alpha channel
+ Factor colorSrcFactor; //!< Source blending factor for the color channels
+ Factor colorDstFactor; //!< Destination blending factor for the color channels
+ Equation colorEquation; //!< Blending equation for the color channels
+ Factor alphaSrcFactor; //!< Source blending factor for the alpha channel
+ Factor alphaDstFactor; //!< Destination blending factor for the alpha channel
+ Equation alphaEquation; //!< Blending equation for the alpha channel
};
////////////////////////////////////////////////////////////
@@ -147,10 +149,12 @@ SFML_GRAPHICS_API bool operator !=(const BlendMode& left, const BlendMode& right
////////////////////////////////////////////////////////////
// Commonly used blending modes
////////////////////////////////////////////////////////////
-SFML_GRAPHICS_API extern const BlendMode BlendAlpha; ///< Blend source and dest according to dest alpha
-SFML_GRAPHICS_API extern const BlendMode BlendAdd; ///< Add source to dest
-SFML_GRAPHICS_API extern const BlendMode BlendMultiply; ///< Multiply source and dest
-SFML_GRAPHICS_API extern const BlendMode BlendNone; ///< Overwrite dest with source
+SFML_GRAPHICS_API extern const BlendMode BlendAlpha; //!< Blend source and dest according to dest alpha
+SFML_GRAPHICS_API extern const BlendMode BlendAdd; //!< Add source to dest
+SFML_GRAPHICS_API extern const BlendMode BlendMultiply; //!< Multiply source and dest
+SFML_GRAPHICS_API extern const BlendMode BlendMin; //!< Take minimum between source and dest
+SFML_GRAPHICS_API extern const BlendMode BlendMax; //!< Take maximum between source and dest
+SFML_GRAPHICS_API extern const BlendMode BlendNone; //!< Overwrite dest with source
} // namespace sf
diff --git a/include/SFML/Graphics/CircleShape.hpp b/include/SFML/Graphics/CircleShape.hpp
index 896c893..13dc717 100644
--- a/include/SFML/Graphics/CircleShape.hpp
+++ b/include/SFML/Graphics/CircleShape.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -111,8 +111,8 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- float m_radius; ///< Radius of the circle
- std::size_t m_pointCount; ///< Number of points composing the circle
+ float m_radius; //!< Radius of the circle
+ std::size_t m_pointCount; //!< Number of points composing the circle
};
} // namespace sf
diff --git a/include/SFML/Graphics/Color.hpp b/include/SFML/Graphics/Color.hpp
index 43357aa..6a0cdea 100644
--- a/include/SFML/Graphics/Color.hpp
+++ b/include/SFML/Graphics/Color.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -80,23 +80,23 @@ public:
////////////////////////////////////////////////////////////
// Static member data
////////////////////////////////////////////////////////////
- static const Color Black; ///< Black predefined color
- static const Color White; ///< White predefined color
- static const Color Red; ///< Red predefined color
- static const Color Green; ///< Green predefined color
- static const Color Blue; ///< Blue predefined color
- static const Color Yellow; ///< Yellow predefined color
- static const Color Magenta; ///< Magenta predefined color
- static const Color Cyan; ///< Cyan predefined color
- static const Color Transparent; ///< Transparent (black) predefined color
+ static const Color Black; //!< Black predefined color
+ static const Color White; //!< White predefined color
+ static const Color Red; //!< Red predefined color
+ static const Color Green; //!< Green predefined color
+ static const Color Blue; //!< Blue predefined color
+ static const Color Yellow; //!< Yellow predefined color
+ static const Color Magenta; //!< Magenta predefined color
+ static const Color Cyan; //!< Cyan predefined color
+ static const Color Transparent; //!< Transparent (black) predefined color
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Uint8 r; ///< Red component
- Uint8 g; ///< Green component
- Uint8 b; ///< Blue component
- Uint8 a; ///< Alpha (opacity) component
+ Uint8 r; //!< Red component
+ Uint8 g; //!< Green component
+ Uint8 b; //!< Blue component
+ Uint8 a; //!< Alpha (opacity) component
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/Graphics/ConvexShape.hpp b/include/SFML/Graphics/ConvexShape.hpp
index e770299..1124775 100644
--- a/include/SFML/Graphics/ConvexShape.hpp
+++ b/include/SFML/Graphics/ConvexShape.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -112,7 +112,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- std::vector<Vector2f> m_points; ///< Points composing the convex polygon
+ std::vector<Vector2f> m_points; //!< Points composing the convex polygon
};
} // namespace sf
diff --git a/include/SFML/Graphics/Drawable.hpp b/include/SFML/Graphics/Drawable.hpp
index 852b22d..8bf3b2d 100644
--- a/include/SFML/Graphics/Drawable.hpp
+++ b/include/SFML/Graphics/Drawable.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Graphics/Export.hpp b/include/SFML/Graphics/Export.hpp
index 0b47b39..364c414 100644
--- a/include/SFML/Graphics/Export.hpp
+++ b/include/SFML/Graphics/Export.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Graphics/Font.hpp b/include/SFML/Graphics/Font.hpp
index e753866..6a6b9e0 100644
--- a/include/SFML/Graphics/Font.hpp
+++ b/include/SFML/Graphics/Font.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -32,8 +32,6 @@
#include <SFML/Graphics/Glyph.hpp>
#include <SFML/Graphics/Texture.hpp>
#include <SFML/Graphics/Rect.hpp>
-#include <SFML/System/Vector2.hpp>
-#include <SFML/System/String.hpp>
#include <map>
#include <string>
#include <vector>
@@ -57,7 +55,7 @@ public:
////////////////////////////////////////////////////////////
struct Info
{
- std::string family; ///< The font family
+ std::string family; //!< The font family
};
public:
@@ -166,6 +164,10 @@ public:
/// might be available. If the glyph is not available at the
/// requested size, an empty glyph is returned.
///
+ /// You may want to use \ref hasGlyph to determine if the
+ /// glyph exists before requesting it. If the glyph does not
+ /// exist, a font specific default is returned.
+ ///
/// Be aware that using a negative value for the outline
/// thickness will cause distorted rendering.
///
@@ -180,6 +182,24 @@ public:
const Glyph& getGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, float outlineThickness = 0) const;
////////////////////////////////////////////////////////////
+ /// \brief Determine if this font has a glyph representing the requested code point
+ ///
+ /// Most fonts only include a very limited selection of glyphs from
+ /// specific Unicode subsets, like Latin, Cyrillic, or Asian characters.
+ ///
+ /// While code points without representation will return a font specific
+ /// default character, it might be useful to verify whether specific
+ /// code points are included to determine whether a font is suited
+ /// to display text in a specific language.
+ ///
+ /// \param codePoint Unicode code point to check
+ ///
+ /// \return True if the codepoint has a glyph representation, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ bool hasGlyph(Uint32 codePoint) const;
+
+ ////////////////////////////////////////////////////////////
/// \brief Get the kerning offset of two glyphs
///
/// The kerning is an extra offset (negative) to apply between two
@@ -195,7 +215,7 @@ public:
/// \return Kerning value for \a first and \a second, in pixels
///
////////////////////////////////////////////////////////////
- float getKerning(Uint32 first, Uint32 second, unsigned int characterSize) const;
+ float getKerning(Uint32 first, Uint32 second, unsigned int characterSize, bool bold = false) const;
////////////////////////////////////////////////////////////
/// \brief Get the line spacing
@@ -254,6 +274,32 @@ public:
const Texture& getTexture(unsigned int characterSize) const;
////////////////////////////////////////////////////////////
+ /// \brief Enable or disable the smooth filter
+ ///
+ /// When the filter is activated, the font appears smoother
+ /// so that pixels are less noticeable. However if you want
+ /// the font to look exactly the same as its source file,
+ /// you should disable it.
+ /// The smooth filter is enabled by default.
+ ///
+ /// \param smooth True to enable smoothing, false to disable it
+ ///
+ /// \see isSmooth
+ ///
+ ////////////////////////////////////////////////////////////
+ void setSmooth(bool smooth);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Tell whether the smooth filter is enabled or not
+ ///
+ /// \return True if smoothing is enabled, false if it is disabled
+ ///
+ /// \see setSmooth
+ ///
+ ////////////////////////////////////////////////////////////
+ bool isSmooth() const;
+
+ ////////////////////////////////////////////////////////////
/// \brief Overload of assignment operator
///
/// \param right Instance to assign
@@ -273,15 +319,15 @@ private:
{
Row(unsigned int rowTop, unsigned int rowHeight) : width(0), top(rowTop), height(rowHeight) {}
- unsigned int width; ///< Current width of the row
- unsigned int top; ///< Y position of the row into the texture
- unsigned int height; ///< Height of the row
+ unsigned int width; //!< Current width of the row
+ unsigned int top; //!< Y position of the row into the texture
+ unsigned int height; //!< Height of the row
};
////////////////////////////////////////////////////////////
// Types
////////////////////////////////////////////////////////////
- typedef std::map<Uint64, Glyph> GlyphTable; ///< Table mapping a codepoint to its glyph
+ typedef std::map<Uint64, Glyph> GlyphTable; //!< Table mapping a codepoint to its glyph
////////////////////////////////////////////////////////////
/// \brief Structure defining a page of glyphs
@@ -289,12 +335,12 @@ private:
////////////////////////////////////////////////////////////
struct Page
{
- Page();
+ explicit Page(bool smooth);
- GlyphTable glyphs; ///< Table mapping code points to their corresponding glyph
- Texture texture; ///< Texture containing the pixels of the glyphs
- unsigned int nextRow; ///< Y position of the next new row in the texture
- std::vector<Row> rows; ///< List containing the position of all the existing rows
+ GlyphTable glyphs; //!< Table mapping code points to their corresponding glyph
+ Texture texture; //!< Texture containing the pixels of the glyphs
+ unsigned int nextRow; //!< Y position of the next new row in the texture
+ std::vector<Row> rows; //!< List containing the position of all the existing rows
};
////////////////////////////////////////////////////////////
@@ -304,6 +350,16 @@ private:
void cleanup();
////////////////////////////////////////////////////////////
+ /// \brief Find or create the glyphs page corresponding to the given character size
+ ///
+ /// \param characterSize Reference character size
+ ///
+ /// \return The glyphs page corresponding to \a characterSize
+ ///
+ ////////////////////////////////////////////////////////////
+ Page& loadPage(unsigned int characterSize) const;
+
+ ////////////////////////////////////////////////////////////
/// \brief Load a new glyph and store it in the cache
///
/// \param codePoint Unicode code point of the character to load
@@ -341,21 +397,22 @@ private:
////////////////////////////////////////////////////////////
// Types
////////////////////////////////////////////////////////////
- typedef std::map<unsigned int, Page> PageTable; ///< Table mapping a character size to its page (texture)
+ typedef std::map<unsigned int, Page> PageTable; //!< Table mapping a character size to its page (texture)
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- void* m_library; ///< Pointer to the internal library interface (it is typeless to avoid exposing implementation details)
- void* m_face; ///< Pointer to the internal font face (it is typeless to avoid exposing implementation details)
- void* m_streamRec; ///< Pointer to the stream rec instance (it is typeless to avoid exposing implementation details)
- void* m_stroker; ///< Pointer to the stroker (it is typeless to avoid exposing implementation details)
- int* m_refCount; ///< Reference counter used by implicit sharing
- Info m_info; ///< Information about the font
- mutable PageTable m_pages; ///< Table containing the glyphs pages by character size
- mutable std::vector<Uint8> m_pixelBuffer; ///< Pixel buffer holding a glyph's pixels before being written to the texture
+ void* m_library; //!< Pointer to the internal library interface (it is typeless to avoid exposing implementation details)
+ void* m_face; //!< Pointer to the internal font face (it is typeless to avoid exposing implementation details)
+ void* m_streamRec; //!< Pointer to the stream rec instance (it is typeless to avoid exposing implementation details)
+ void* m_stroker; //!< Pointer to the stroker (it is typeless to avoid exposing implementation details)
+ int* m_refCount; //!< Reference counter used by implicit sharing
+ bool m_isSmooth; //!< Status of the smooth filter
+ Info m_info; //!< Information about the font
+ mutable PageTable m_pages; //!< Table containing the glyphs pages by character size
+ mutable std::vector<Uint8> m_pixelBuffer; //!< Pixel buffer holding a glyph's pixels before being written to the texture
#ifdef SFML_SYSTEM_ANDROID
- void* m_stream; ///< Asset file streamer (if loaded from file)
+ void* m_stream; //!< Asset file streamer (if loaded from file)
#endif
};
diff --git a/include/SFML/Graphics/Glsl.hpp b/include/SFML/Graphics/Glsl.hpp
index e3943e7..499220a 100644
--- a/include/SFML/Graphics/Glsl.hpp
+++ b/include/SFML/Graphics/Glsl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Graphics/Glsl.inl b/include/SFML/Graphics/Glsl.inl
index 9c9f0ae..d026bab 100644
--- a/include/SFML/Graphics/Glsl.inl
+++ b/include/SFML/Graphics/Glsl.inl
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -81,7 +81,7 @@ struct Matrix
copyMatrix(transform, *this);
}
- float array[Columns * Rows]; ///< Array holding matrix data
+ float array[Columns * Rows]; //!< Array holding matrix data
};
////////////////////////////////////////////////////////////
@@ -148,8 +148,8 @@ struct Vector4
copyVector(color, *this);
}
- T x; ///< 1st component (X) of the 4D vector
- T y; ///< 2nd component (Y) of the 4D vector
- T z; ///< 3rd component (Z) of the 4D vector
- T w; ///< 4th component (W) of the 4D vector
+ T x; //!< 1st component (X) of the 4D vector
+ T y; //!< 2nd component (Y) of the 4D vector
+ T z; //!< 3rd component (Z) of the 4D vector
+ T w; //!< 4th component (W) of the 4D vector
};
diff --git a/include/SFML/Graphics/Glyph.hpp b/include/SFML/Graphics/Glyph.hpp
index 59deb9b..05f7876 100644
--- a/include/SFML/Graphics/Glyph.hpp
+++ b/include/SFML/Graphics/Glyph.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -51,9 +51,11 @@ public:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- float advance; ///< Offset to move horizontally to the next character
- FloatRect bounds; ///< Bounding rectangle of the glyph, in coordinates relative to the baseline
- IntRect textureRect; ///< Texture coordinates of the glyph inside the font's texture
+ float advance; //!< Offset to move horizontally to the next character
+ int lsbDelta; //!< Left offset after forced autohint. Internally used by getKerning()
+ int rsbDelta; //!< Right offset after forced autohint. Internally used by getKerning()
+ FloatRect bounds; //!< Bounding rectangle of the glyph, in coordinates relative to the baseline
+ IntRect textureRect; //!< Texture coordinates of the glyph inside the font's texture
};
} // namespace sf
diff --git a/include/SFML/Graphics/Image.hpp b/include/SFML/Graphics/Image.hpp
index c1d672a..916baec 100644
--- a/include/SFML/Graphics/Image.hpp
+++ b/include/SFML/Graphics/Image.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -90,8 +90,8 @@ public:
/// \brief Load the image from a file on disk
///
/// The supported image formats are bmp, png, tga, jpg, gif,
- /// psd, hdr and pic. Some format options are not supported,
- /// like progressive jpeg.
+ /// psd, hdr, pic and pnm. Some format options are not supported,
+ /// like jpeg with arithmetic coding or ASCII pnm.
/// If this function fails, the image is left unchanged.
///
/// \param filename Path of the image file to load
@@ -107,8 +107,8 @@ public:
/// \brief Load the image from a file in memory
///
/// The supported image formats are bmp, png, tga, jpg, gif,
- /// psd, hdr and pic. Some format options are not supported,
- /// like progressive jpeg.
+ /// psd, hdr, pic and pnm. Some format options are not supported,
+ /// like jpeg with arithmetic coding or ASCII pnm.
/// If this function fails, the image is left unchanged.
///
/// \param data Pointer to the file data in memory
@@ -125,8 +125,8 @@ public:
/// \brief Load the image from a custom stream
///
/// The supported image formats are bmp, png, tga, jpg, gif,
- /// psd, hdr and pic. Some format options are not supported,
- /// like progressive jpeg.
+ /// psd, hdr, pic and pnm. Some format options are not supported,
+ /// like jpeg with arithmetic coding or ASCII pnm.
/// If this function fails, the image is left unchanged.
///
/// \param stream Source stream to read from
@@ -156,6 +156,24 @@ public:
bool saveToFile(const std::string& filename) const;
////////////////////////////////////////////////////////////
+ /// \brief Save the image to a buffer in memory
+ ///
+ /// The format of the image must be specified.
+ /// The supported image formats are bmp, png, tga and jpg.
+ /// This function fails if the image is empty, or if
+ /// the format was invalid.
+ ///
+ /// \param output Buffer to fill with encoded data
+ /// \param format Encoding format to use
+ ///
+ /// \return True if saving was successful
+ ///
+ /// \see create, loadFromFile, loadFromMemory, saveToFile
+ ///
+ ////////////////////////////////////////////////////////////
+ bool saveToMemory(std::vector<sf::Uint8>& output, const std::string& format) const;
+
+ ////////////////////////////////////////////////////////////
/// \brief Return the size (width and height) of the image
///
/// \return Size of the image, in pixels
@@ -185,9 +203,13 @@ public:
/// kind of feature in real-time you'd better use sf::RenderTexture.
///
/// If \a sourceRect is empty, the whole image is copied.
- /// If \a applyAlpha is set to true, the transparency of
- /// source pixels is applied. If it is false, the pixels are
- /// copied unchanged with their alpha value.
+ /// If \a applyAlpha is set to true, alpha blending is
+ /// applied from the source pixels to the destination pixels
+ /// using the \b over operator. If it is false, the source
+ /// pixels are copied unchanged with their alpha value.
+ ///
+ /// See https://en.wikipedia.org/wiki/Alpha_compositing for
+ /// details on the \b over operator.
///
/// \param source Source image to copy
/// \param destX X coordinate of the destination position
@@ -263,8 +285,8 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Vector2u m_size; ///< Image size
- std::vector<Uint8> m_pixels; ///< Pixels of the image
+ Vector2u m_size; //!< Image size
+ std::vector<Uint8> m_pixels; //!< Pixels of the image
};
} // namespace sf
diff --git a/include/SFML/Graphics/PrimitiveType.hpp b/include/SFML/Graphics/PrimitiveType.hpp
index 28cf58d..511aab4 100644
--- a/include/SFML/Graphics/PrimitiveType.hpp
+++ b/include/SFML/Graphics/PrimitiveType.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -38,18 +38,18 @@ namespace sf
////////////////////////////////////////////////////////////
enum PrimitiveType
{
- Points, ///< List of individual points
- Lines, ///< List of individual lines
- LineStrip, ///< List of connected lines, a point uses the previous point to form a line
- Triangles, ///< List of individual triangles
- TriangleStrip, ///< List of connected triangles, a point uses the two previous points to form a triangle
- TriangleFan, ///< List of connected triangles, a point uses the common center and the previous point to form a triangle
- Quads, ///< List of individual quads (deprecated, don't work with OpenGL ES)
+ Points, //!< List of individual points
+ Lines, //!< List of individual lines
+ LineStrip, //!< List of connected lines, a point uses the previous point to form a line
+ Triangles, //!< List of individual triangles
+ TriangleStrip, //!< List of connected triangles, a point uses the two previous points to form a triangle
+ TriangleFan, //!< List of connected triangles, a point uses the common center and the previous point to form a triangle
+ Quads, //!< List of individual quads (deprecated, don't work with OpenGL ES)
// Deprecated names
- LinesStrip = LineStrip, ///< \deprecated Use LineStrip instead
- TrianglesStrip = TriangleStrip, ///< \deprecated Use TriangleStrip instead
- TrianglesFan = TriangleFan ///< \deprecated Use TriangleFan instead
+ LinesStrip = LineStrip, //!< \deprecated Use LineStrip instead
+ TrianglesStrip = TriangleStrip, //!< \deprecated Use TriangleStrip instead
+ TrianglesFan = TriangleFan //!< \deprecated Use TriangleFan instead
};
} // namespace sf
diff --git a/include/SFML/Graphics/Rect.hpp b/include/SFML/Graphics/Rect.hpp
index 17f20a5..ac108b8 100644
--- a/include/SFML/Graphics/Rect.hpp
+++ b/include/SFML/Graphics/Rect.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -152,12 +152,32 @@ public:
bool intersects(const Rect<T>& rectangle, Rect<T>& intersection) const;
////////////////////////////////////////////////////////////
+ /// \brief Get the position of the rectangle's top-left corner
+ ///
+ /// \return Position of rectangle
+ ///
+ /// \see getSize
+ ///
+ ////////////////////////////////////////////////////////////
+ sf::Vector2<T> getPosition() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the size of the rectangle
+ ///
+ /// \return Size of rectangle
+ ///
+ /// \see getPosition
+ ///
+ ////////////////////////////////////////////////////////////
+ sf::Vector2<T> getSize() const;
+
+ ////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- T left; ///< Left coordinate of the rectangle
- T top; ///< Top coordinate of the rectangle
- T width; ///< Width of the rectangle
- T height; ///< Height of the rectangle
+ T left; //!< Left coordinate of the rectangle
+ T top; //!< Top coordinate of the rectangle
+ T width; //!< Width of the rectangle
+ T height; //!< Height of the rectangle
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/Graphics/Rect.inl b/include/SFML/Graphics/Rect.inl
index 7a82e46..604ad59 100644
--- a/include/SFML/Graphics/Rect.inl
+++ b/include/SFML/Graphics/Rect.inl
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -141,6 +141,18 @@ bool Rect<T>::intersects(const Rect<T>& rectangle, Rect<T>& intersection) const
}
}
+template <typename T>
+sf::Vector2<T> Rect<T>::getPosition() const
+{
+ return sf::Vector2<T>(left, top);
+}
+
+template <typename T>
+sf::Vector2<T> Rect<T>::getSize() const
+{
+ return sf::Vector2<T>(width, height);
+}
+
////////////////////////////////////////////////////////////
template <typename T>
diff --git a/include/SFML/Graphics/RectangleShape.hpp b/include/SFML/Graphics/RectangleShape.hpp
index 4f2c4d9..c763931 100644
--- a/include/SFML/Graphics/RectangleShape.hpp
+++ b/include/SFML/Graphics/RectangleShape.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -99,7 +99,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Vector2f m_size; ///< Size of the rectangle
+ Vector2f m_size; //!< Size of the rectangle
};
} // namespace sf
diff --git a/include/SFML/Graphics/RenderStates.hpp b/include/SFML/Graphics/RenderStates.hpp
index 9bcde9b..c8ef296 100644
--- a/include/SFML/Graphics/RenderStates.hpp
+++ b/include/SFML/Graphics/RenderStates.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -107,15 +107,15 @@ public:
////////////////////////////////////////////////////////////
// Static member data
////////////////////////////////////////////////////////////
- static const RenderStates Default; ///< Special instance holding the default render states
+ static const RenderStates Default; //!< Special instance holding the default render states
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- BlendMode blendMode; ///< Blending mode
- Transform transform; ///< Transform
- const Texture* texture; ///< Texture
- const Shader* shader; ///< Shader
+ BlendMode blendMode; //!< Blending mode
+ Transform transform; //!< Transform
+ const Texture* texture; //!< Texture
+ const Shader* shader; //!< Shader
};
} // namespace sf
diff --git a/include/SFML/Graphics/RenderTarget.hpp b/include/SFML/Graphics/RenderTarget.hpp
index 0d16746..ea56154 100644
--- a/include/SFML/Graphics/RenderTarget.hpp
+++ b/include/SFML/Graphics/RenderTarget.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -277,6 +277,14 @@ public:
virtual Vector2u getSize() const = 0;
////////////////////////////////////////////////////////////
+ /// \brief Tell if the render target will use sRGB encoding when drawing on it
+ ///
+ /// \return True if the render target use sRGB encoding, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool isSrgb() const;
+
+ ////////////////////////////////////////////////////////////
/// \brief Activate or deactivate the render target for rendering
///
/// This function makes the render target's context current for
@@ -458,23 +466,23 @@ private:
{
enum {VertexCacheSize = 4};
- bool enable; ///< Is the cache enabled?
- bool glStatesSet; ///< Are our internal GL states set yet?
- bool viewChanged; ///< Has the current view changed since last draw?
- BlendMode lastBlendMode; ///< Cached blending mode
- Uint64 lastTextureId; ///< Cached texture
- bool texCoordsArrayEnabled; ///< Is GL_TEXTURE_COORD_ARRAY client state enabled?
- bool useVertexCache; ///< Did we previously use the vertex cache?
- Vertex vertexCache[VertexCacheSize]; ///< Pre-transformed vertices cache
+ bool enable; //!< Is the cache enabled?
+ bool glStatesSet; //!< Are our internal GL states set yet?
+ bool viewChanged; //!< Has the current view changed since last draw?
+ BlendMode lastBlendMode; //!< Cached blending mode
+ Uint64 lastTextureId; //!< Cached texture
+ bool texCoordsArrayEnabled; //!< Is GL_TEXTURE_COORD_ARRAY client state enabled?
+ bool useVertexCache; //!< Did we previously use the vertex cache?
+ Vertex vertexCache[VertexCacheSize]; //!< Pre-transformed vertices cache
};
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- View m_defaultView; ///< Default view
- View m_view; ///< Current view
- StatesCache m_cache; ///< Render states cache
- Uint64 m_id; ///< Unique number that identifies the RenderTarget
+ View m_defaultView; //!< Default view
+ View m_view; //!< Current view
+ StatesCache m_cache; //!< Render states cache
+ Uint64 m_id; //!< Unique number that identifies the RenderTarget
};
} // namespace sf
diff --git a/include/SFML/Graphics/RenderTexture.hpp b/include/SFML/Graphics/RenderTexture.hpp
index a26d94b..8e75397 100644
--- a/include/SFML/Graphics/RenderTexture.hpp
+++ b/include/SFML/Graphics/RenderTexture.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -217,6 +217,18 @@ public:
////////////////////////////////////////////////////////////
virtual Vector2u getSize() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Tell if the render-texture will use sRGB encoding when drawing on it
+ ///
+ /// You can request sRGB encoding for a render-texture
+ /// by having the sRgbCapable flag set for the context parameter of create() method
+ ///
+ /// \return True if the render-texture use sRGB encoding, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool isSrgb() const;
+
////////////////////////////////////////////////////////////
/// \brief Get a read-only reference to the target texture
///
@@ -238,8 +250,8 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- priv::RenderTextureImpl* m_impl; ///< Platform/hardware specific implementation
- Texture m_texture; ///< Target texture to draw on
+ priv::RenderTextureImpl* m_impl; //!< Platform/hardware specific implementation
+ Texture m_texture; //!< Target texture to draw on
};
} // namespace sf
diff --git a/include/SFML/Graphics/RenderWindow.hpp b/include/SFML/Graphics/RenderWindow.hpp
index 2b3b6bc..82d4aa9 100644
--- a/include/SFML/Graphics/RenderWindow.hpp
+++ b/include/SFML/Graphics/RenderWindow.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -112,6 +112,17 @@ public:
////////////////////////////////////////////////////////////
virtual Vector2u getSize() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Tell if the window will use sRGB encoding when drawing on it
+ ///
+ /// You can request sRGB encoding for a window by having the sRgbCapable flag set in the ContextSettings
+ ///
+ /// \return True if the window use sRGB encoding, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool isSrgb() const;
+
////////////////////////////////////////////////////////////
/// \brief Activate or deactivate the window as the current target
/// for OpenGL rendering
@@ -177,6 +188,13 @@ protected:
///
////////////////////////////////////////////////////////////
virtual void onResize();
+
+private:
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ unsigned int m_defaultFrameBuffer; //!< Framebuffer to bind when targeting this window
};
} // namespace sf
diff --git a/include/SFML/Graphics/Shader.hpp b/include/SFML/Graphics/Shader.hpp
index 664dd86..0070685 100644
--- a/include/SFML/Graphics/Shader.hpp
+++ b/include/SFML/Graphics/Shader.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -59,9 +59,9 @@ public:
////////////////////////////////////////////////////////////
enum Type
{
- Vertex, ///< %Vertex shader
- Geometry, ///< Geometry shader
- Fragment ///< Fragment (pixel) shader
+ Vertex, //!< %Vertex shader
+ Geometry, //!< Geometry shader
+ Fragment //!< Fragment (pixel) shader
};
////////////////////////////////////////////////////////////
@@ -745,10 +745,10 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- unsigned int m_shaderProgram; ///< OpenGL identifier for the program
- int m_currentTexture; ///< Location of the current texture in the shader
- TextureTable m_textures; ///< Texture variables in the shader, mapped to their location
- UniformTable m_uniforms; ///< Parameters location cache
+ unsigned int m_shaderProgram; //!< OpenGL identifier for the program
+ int m_currentTexture; //!< Location of the current texture in the shader
+ TextureTable m_textures; //!< Texture variables in the shader, mapped to their location
+ UniformTable m_uniforms; //!< Parameters location cache
};
} // namespace sf
diff --git a/include/SFML/Graphics/Shape.hpp b/include/SFML/Graphics/Shape.hpp
index 79ac528..e861ba9 100644
--- a/include/SFML/Graphics/Shape.hpp
+++ b/include/SFML/Graphics/Shape.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -305,15 +305,15 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- const Texture* m_texture; ///< Texture of the shape
- IntRect m_textureRect; ///< Rectangle defining the area of the source texture to display
- Color m_fillColor; ///< Fill color
- Color m_outlineColor; ///< Outline color
- float m_outlineThickness; ///< Thickness of the shape's outline
- VertexArray m_vertices; ///< Vertex array containing the fill geometry
- VertexArray m_outlineVertices; ///< Vertex array containing the outline geometry
- FloatRect m_insideBounds; ///< Bounding rectangle of the inside (fill)
- FloatRect m_bounds; ///< Bounding rectangle of the whole shape (outline + fill)
+ const Texture* m_texture; //!< Texture of the shape
+ IntRect m_textureRect; //!< Rectangle defining the area of the source texture to display
+ Color m_fillColor; //!< Fill color
+ Color m_outlineColor; //!< Outline color
+ float m_outlineThickness; //!< Thickness of the shape's outline
+ VertexArray m_vertices; //!< Vertex array containing the fill geometry
+ VertexArray m_outlineVertices; //!< Vertex array containing the outline geometry
+ FloatRect m_insideBounds; //!< Bounding rectangle of the inside (fill)
+ FloatRect m_bounds; //!< Bounding rectangle of the whole shape (outline + fill)
};
} // namespace sf
diff --git a/include/SFML/Graphics/Sprite.hpp b/include/SFML/Graphics/Sprite.hpp
index 55cc898..4580b9d 100644
--- a/include/SFML/Graphics/Sprite.hpp
+++ b/include/SFML/Graphics/Sprite.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -215,9 +215,9 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Vertex m_vertices[4]; ///< Vertices defining the sprite's geometry
- const Texture* m_texture; ///< Texture of the sprite
- IntRect m_textureRect; ///< Rectangle defining the area of the source texture to display
+ Vertex m_vertices[4]; //!< Vertices defining the sprite's geometry
+ const Texture* m_texture; //!< Texture of the sprite
+ IntRect m_textureRect; //!< Rectangle defining the area of the source texture to display
};
} // namespace sf
diff --git a/include/SFML/Graphics/Text.hpp b/include/SFML/Graphics/Text.hpp
index dae6ef2..83bdae1 100644
--- a/include/SFML/Graphics/Text.hpp
+++ b/include/SFML/Graphics/Text.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -55,11 +55,11 @@ public:
////////////////////////////////////////////////////////////
enum Style
{
- Regular = 0, ///< Regular characters, no style
- Bold = 1 << 0, ///< Bold characters
- Italic = 1 << 1, ///< Italic characters
- Underlined = 1 << 2, ///< Underlined characters
- StrikeThrough = 1 << 3 ///< Strike through characters
+ Regular = 0, //!< Regular characters, no style
+ Bold = 1 << 0, //!< Bold characters
+ Italic = 1 << 1, //!< Italic characters
+ Underlined = 1 << 2, //!< Underlined characters
+ StrikeThrough = 1 << 3 //!< Strike through characters
};
////////////////////////////////////////////////////////////
@@ -435,20 +435,20 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- String m_string; ///< String to display
- const Font* m_font; ///< Font used to display the string
- unsigned int m_characterSize; ///< Base size of characters, in pixels
- float m_letterSpacingFactor; ///< Spacing factor between letters
- float m_lineSpacingFactor; ///< Spacing factor between lines
- Uint32 m_style; ///< Text style (see Style enum)
- Color m_fillColor; ///< Text fill color
- Color m_outlineColor; ///< Text outline color
- float m_outlineThickness; ///< Thickness of the text's outline
- mutable VertexArray m_vertices; ///< Vertex array containing the fill geometry
- mutable VertexArray m_outlineVertices; ///< Vertex array containing the outline geometry
- mutable FloatRect m_bounds; ///< Bounding rectangle of the text (in local coordinates)
- mutable bool m_geometryNeedUpdate; ///< Does the geometry need to be recomputed?
- mutable Uint64 m_fontTextureId; ///< The font texture id
+ String m_string; //!< String to display
+ const Font* m_font; //!< Font used to display the string
+ unsigned int m_characterSize; //!< Base size of characters, in pixels
+ float m_letterSpacingFactor; //!< Spacing factor between letters
+ float m_lineSpacingFactor; //!< Spacing factor between lines
+ Uint32 m_style; //!< Text style (see Style enum)
+ Color m_fillColor; //!< Text fill color
+ Color m_outlineColor; //!< Text outline color
+ float m_outlineThickness; //!< Thickness of the text's outline
+ mutable VertexArray m_vertices; //!< Vertex array containing the fill geometry
+ mutable VertexArray m_outlineVertices; //!< Vertex array containing the outline geometry
+ mutable FloatRect m_bounds; //!< Bounding rectangle of the text (in local coordinates)
+ mutable bool m_geometryNeedUpdate; //!< Does the geometry need to be recomputed?
+ mutable Uint64 m_fontTextureId; //!< The font texture id
};
} // namespace sf
diff --git a/include/SFML/Graphics/Texture.hpp b/include/SFML/Graphics/Texture.hpp
index c292856..b75fedf 100644
--- a/include/SFML/Graphics/Texture.hpp
+++ b/include/SFML/Graphics/Texture.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -55,8 +55,8 @@ public:
////////////////////////////////////////////////////////////
enum CoordinateType
{
- Normalized, ///< Texture coordinates in range [0 .. 1]
- Pixels ///< Texture coordinates in range [0 .. size]
+ Normalized, //!< Texture coordinates in range [0 .. 1]
+ Pixels //!< Texture coordinates in range [0 .. size]
};
public:
@@ -616,16 +616,16 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Vector2u m_size; ///< Public texture size
- Vector2u m_actualSize; ///< Actual texture size (can be greater than public size because of padding)
- unsigned int m_texture; ///< Internal texture identifier
- bool m_isSmooth; ///< Status of the smooth filter
- bool m_sRgb; ///< Should the texture source be converted from sRGB?
- bool m_isRepeated; ///< Is the texture in repeat mode?
- mutable bool m_pixelsFlipped; ///< To work around the inconsistency in Y orientation
- bool m_fboAttachment; ///< Is this texture owned by a framebuffer object?
- bool m_hasMipmap; ///< Has the mipmap been generated?
- Uint64 m_cacheId; ///< Unique number that identifies the texture to the render target's cache
+ Vector2u m_size; //!< Public texture size
+ Vector2u m_actualSize; //!< Actual texture size (can be greater than public size because of padding)
+ unsigned int m_texture; //!< Internal texture identifier
+ bool m_isSmooth; //!< Status of the smooth filter
+ bool m_sRgb; //!< Should the texture source be converted from sRGB?
+ bool m_isRepeated; //!< Is the texture in repeat mode?
+ mutable bool m_pixelsFlipped; //!< To work around the inconsistency in Y orientation
+ bool m_fboAttachment; //!< Is this texture owned by a framebuffer object?
+ bool m_hasMipmap; //!< Has the mipmap been generated?
+ Uint64 m_cacheId; //!< Unique number that identifies the texture to the render target's cache
};
} // namespace sf
diff --git a/include/SFML/Graphics/Transform.hpp b/include/SFML/Graphics/Transform.hpp
index c77d08a..e4e9ec3 100644
--- a/include/SFML/Graphics/Transform.hpp
+++ b/include/SFML/Graphics/Transform.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -100,6 +100,12 @@ public:
////////////////////////////////////////////////////////////
/// \brief Transform a 2D point
///
+ /// These two statements are equivalent:
+ /// \code
+ /// sf::Vector2f transformedPoint = matrix.transformPoint(x, y);
+ /// sf::Vector2f transformedPoint = matrix * sf::Vector2f(x, y);
+ /// \endcode
+ ///
/// \param x X coordinate of the point to transform
/// \param y Y coordinate of the point to transform
///
@@ -111,6 +117,12 @@ public:
////////////////////////////////////////////////////////////
/// \brief Transform a 2D point
///
+ /// These two statements are equivalent:
+ /// \code
+ /// sf::Vector2f transformedPoint = matrix.transformPoint(point);
+ /// sf::Vector2f transformedPoint = matrix * point;
+ /// \endcode
+ ///
/// \param point Point to transform
///
/// \return Transformed point
@@ -138,8 +150,14 @@ public:
/// \brief Combine the current transform with another one
///
/// The result is a transform that is equivalent to applying
- /// *this followed by \a transform. Mathematically, it is
- /// equivalent to a matrix multiplication.
+ /// \a transform followed by *this. Mathematically, it is
+ /// equivalent to a matrix multiplication (*this) * transform.
+ ///
+ /// These two statements are equivalent:
+ /// \code
+ /// left.combine(right);
+ /// left *= right;
+ /// \endcode
///
/// \param transform Transform to combine with this transform
///
@@ -351,14 +369,14 @@ public:
////////////////////////////////////////////////////////////
// Static member data
////////////////////////////////////////////////////////////
- static const Transform Identity; ///< The identity transform (does nothing)
+ static const Transform Identity; //!< The identity transform (does nothing)
private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- float m_matrix[16]; ///< 4x4 matrix defining the transformation
+ float m_matrix[16]; //!< 4x4 matrix defining the transformation
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/Graphics/Transformable.hpp b/include/SFML/Graphics/Transformable.hpp
index 67a5656..a7a60ef 100644
--- a/include/SFML/Graphics/Transformable.hpp
+++ b/include/SFML/Graphics/Transformable.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -316,14 +316,14 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Vector2f m_origin; ///< Origin of translation/rotation/scaling of the object
- Vector2f m_position; ///< Position of the object in the 2D world
- float m_rotation; ///< Orientation of the object, in degrees
- Vector2f m_scale; ///< Scale of the object
- mutable Transform m_transform; ///< Combined transformation of the object
- mutable bool m_transformNeedUpdate; ///< Does the transform need to be recomputed?
- mutable Transform m_inverseTransform; ///< Combined transformation of the object
- mutable bool m_inverseTransformNeedUpdate; ///< Does the transform need to be recomputed?
+ Vector2f m_origin; //!< Origin of translation/rotation/scaling of the object
+ Vector2f m_position; //!< Position of the object in the 2D world
+ float m_rotation; //!< Orientation of the object, in degrees
+ Vector2f m_scale; //!< Scale of the object
+ mutable Transform m_transform; //!< Combined transformation of the object
+ mutable bool m_transformNeedUpdate; //!< Does the transform need to be recomputed?
+ mutable Transform m_inverseTransform; //!< Combined transformation of the object
+ mutable bool m_inverseTransformNeedUpdate; //!< Does the transform need to be recomputed?
};
} // namespace sf
diff --git a/include/SFML/Graphics/Vertex.hpp b/include/SFML/Graphics/Vertex.hpp
index bb24448..cb219b3 100644
--- a/include/SFML/Graphics/Vertex.hpp
+++ b/include/SFML/Graphics/Vertex.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -94,9 +94,9 @@ public:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Vector2f position; ///< 2D position of the vertex
- Color color; ///< Color of the vertex
- Vector2f texCoords; ///< Coordinates of the texture's pixel to map to the vertex
+ Vector2f position; //!< 2D position of the vertex
+ Color color; //!< Color of the vertex
+ Vector2f texCoords; //!< Coordinates of the texture's pixel to map to the vertex
};
} // namespace sf
diff --git a/include/SFML/Graphics/VertexArray.hpp b/include/SFML/Graphics/VertexArray.hpp
index 5229065..4d6753f 100644
--- a/include/SFML/Graphics/VertexArray.hpp
+++ b/include/SFML/Graphics/VertexArray.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -187,8 +187,8 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- std::vector<Vertex> m_vertices; ///< Vertices contained in the array
- PrimitiveType m_primitiveType; ///< Type of primitives to draw
+ std::vector<Vertex> m_vertices; //!< Vertices contained in the array
+ PrimitiveType m_primitiveType; //!< Type of primitives to draw
};
} // namespace sf
diff --git a/include/SFML/Graphics/VertexBuffer.hpp b/include/SFML/Graphics/VertexBuffer.hpp
index a91a08f..b7a58bf 100644
--- a/include/SFML/Graphics/VertexBuffer.hpp
+++ b/include/SFML/Graphics/VertexBuffer.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -59,9 +59,9 @@ public:
////////////////////////////////////////////////////////////
enum Usage
{
- Stream, ///< Constantly changing data
- Dynamic, ///< Occasionally changing data
- Static ///< Rarely changing data
+ Stream, //!< Constantly changing data
+ Dynamic, //!< Occasionally changing data
+ Static //!< Rarely changing data
};
////////////////////////////////////////////////////////////
@@ -334,10 +334,10 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- unsigned int m_buffer; ///< Internal buffer identifier
- std::size_t m_size; ///< Size in Vertexes of the currently allocated buffer
- PrimitiveType m_primitiveType; ///< Type of primitives to draw
- Usage m_usage; ///< How this vertex buffer is to be used
+ unsigned int m_buffer; //!< Internal buffer identifier
+ std::size_t m_size; //!< Size in Vertexes of the currently allocated buffer
+ PrimitiveType m_primitiveType; //!< Type of primitives to draw
+ Usage m_usage; //!< How this vertex buffer is to be used
};
} // namespace sf
diff --git a/include/SFML/Graphics/View.hpp b/include/SFML/Graphics/View.hpp
index a3faa6e..1ab1209 100644
--- a/include/SFML/Graphics/View.hpp
+++ b/include/SFML/Graphics/View.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -269,14 +269,14 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Vector2f m_center; ///< Center of the view, in scene coordinates
- Vector2f m_size; ///< Size of the view, in scene coordinates
- float m_rotation; ///< Angle of rotation of the view rectangle, in degrees
- FloatRect m_viewport; ///< Viewport rectangle, expressed as a factor of the render-target's size
- mutable Transform m_transform; ///< Precomputed projection transform corresponding to the view
- mutable Transform m_inverseTransform; ///< Precomputed inverse projection transform corresponding to the view
- mutable bool m_transformUpdated; ///< Internal state telling if the transform needs to be updated
- mutable bool m_invTransformUpdated; ///< Internal state telling if the inverse transform needs to be updated
+ Vector2f m_center; //!< Center of the view, in scene coordinates
+ Vector2f m_size; //!< Size of the view, in scene coordinates
+ float m_rotation; //!< Angle of rotation of the view rectangle, in degrees
+ FloatRect m_viewport; //!< Viewport rectangle, expressed as a factor of the render-target's size
+ mutable Transform m_transform; //!< Precomputed projection transform corresponding to the view
+ mutable Transform m_inverseTransform; //!< Precomputed inverse projection transform corresponding to the view
+ mutable bool m_transformUpdated; //!< Internal state telling if the transform needs to be updated
+ mutable bool m_invTransformUpdated; //!< Internal state telling if the inverse transform needs to be updated
};
} // namespace sf
diff --git a/include/SFML/Main.hpp b/include/SFML/Main.hpp
index c28a7e1..7c5dabf 100644
--- a/include/SFML/Main.hpp
+++ b/include/SFML/Main.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Network.hpp b/include/SFML/Network.hpp
index ccc9f7c..b78d19a 100644
--- a/include/SFML/Network.hpp
+++ b/include/SFML/Network.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Network/Export.hpp b/include/SFML/Network/Export.hpp
index e7ebdd4..1d46603 100644
--- a/include/SFML/Network/Export.hpp
+++ b/include/SFML/Network/Export.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Network/Ftp.hpp b/include/SFML/Network/Ftp.hpp
index ee779cc..5226c9c 100644
--- a/include/SFML/Network/Ftp.hpp
+++ b/include/SFML/Network/Ftp.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -54,9 +54,9 @@ public:
////////////////////////////////////////////////////////////
enum TransferMode
{
- Binary, ///< Binary mode (file is transfered as a sequence of bytes)
- Ascii, ///< Text mode using ASCII encoding
- Ebcdic ///< Text mode using EBCDIC encoding
+ Binary, //!< Binary mode (file is transfered as a sequence of bytes)
+ Ascii, //!< Text mode using ASCII encoding
+ Ebcdic //!< Text mode using EBCDIC encoding
};
////////////////////////////////////////////////////////////
@@ -75,62 +75,62 @@ public:
{
// 1xx: the requested action is being initiated,
// expect another reply before proceeding with a new command
- RestartMarkerReply = 110, ///< Restart marker reply
- ServiceReadySoon = 120, ///< Service ready in N minutes
- DataConnectionAlreadyOpened = 125, ///< Data connection already opened, transfer starting
- OpeningDataConnection = 150, ///< File status ok, about to open data connection
+ RestartMarkerReply = 110, //!< Restart marker reply
+ ServiceReadySoon = 120, //!< Service ready in N minutes
+ DataConnectionAlreadyOpened = 125, //!< Data connection already opened, transfer starting
+ OpeningDataConnection = 150, //!< File status ok, about to open data connection
// 2xx: the requested action has been successfully completed
- Ok = 200, ///< Command ok
- PointlessCommand = 202, ///< Command not implemented
- SystemStatus = 211, ///< System status, or system help reply
- DirectoryStatus = 212, ///< Directory status
- FileStatus = 213, ///< File status
- HelpMessage = 214, ///< Help message
- SystemType = 215, ///< NAME system type, where NAME is an official system name from the list in the Assigned Numbers document
- ServiceReady = 220, ///< Service ready for new user
- ClosingConnection = 221, ///< Service closing control connection
- DataConnectionOpened = 225, ///< Data connection open, no transfer in progress
- ClosingDataConnection = 226, ///< Closing data connection, requested file action successful
- EnteringPassiveMode = 227, ///< Entering passive mode
- LoggedIn = 230, ///< User logged in, proceed. Logged out if appropriate
- FileActionOk = 250, ///< Requested file action ok
- DirectoryOk = 257, ///< PATHNAME created
+ Ok = 200, //!< Command ok
+ PointlessCommand = 202, //!< Command not implemented
+ SystemStatus = 211, //!< System status, or system help reply
+ DirectoryStatus = 212, //!< Directory status
+ FileStatus = 213, //!< File status
+ HelpMessage = 214, //!< Help message
+ SystemType = 215, //!< NAME system type, where NAME is an official system name from the list in the Assigned Numbers document
+ ServiceReady = 220, //!< Service ready for new user
+ ClosingConnection = 221, //!< Service closing control connection
+ DataConnectionOpened = 225, //!< Data connection open, no transfer in progress
+ ClosingDataConnection = 226, //!< Closing data connection, requested file action successful
+ EnteringPassiveMode = 227, //!< Entering passive mode
+ LoggedIn = 230, //!< User logged in, proceed. Logged out if appropriate
+ FileActionOk = 250, //!< Requested file action ok
+ DirectoryOk = 257, //!< PATHNAME created
// 3xx: the command has been accepted, but the requested action
// is dormant, pending receipt of further information
- NeedPassword = 331, ///< User name ok, need password
- NeedAccountToLogIn = 332, ///< Need account for login
- NeedInformation = 350, ///< Requested file action pending further information
+ NeedPassword = 331, //!< User name ok, need password
+ NeedAccountToLogIn = 332, //!< Need account for login
+ NeedInformation = 350, //!< Requested file action pending further information
// 4xx: the command was not accepted and the requested action did not take place,
// but the error condition is temporary and the action may be requested again
- ServiceUnavailable = 421, ///< Service not available, closing control connection
- DataConnectionUnavailable = 425, ///< Can't open data connection
- TransferAborted = 426, ///< Connection closed, transfer aborted
- FileActionAborted = 450, ///< Requested file action not taken
- LocalError = 451, ///< Requested action aborted, local error in processing
- InsufficientStorageSpace = 452, ///< Requested action not taken; insufficient storage space in system, file unavailable
+ ServiceUnavailable = 421, //!< Service not available, closing control connection
+ DataConnectionUnavailable = 425, //!< Can't open data connection
+ TransferAborted = 426, //!< Connection closed, transfer aborted
+ FileActionAborted = 450, //!< Requested file action not taken
+ LocalError = 451, //!< Requested action aborted, local error in processing
+ InsufficientStorageSpace = 452, //!< Requested action not taken; insufficient storage space in system, file unavailable
// 5xx: the command was not accepted and
// the requested action did not take place
- CommandUnknown = 500, ///< Syntax error, command unrecognized
- ParametersUnknown = 501, ///< Syntax error in parameters or arguments
- CommandNotImplemented = 502, ///< Command not implemented
- BadCommandSequence = 503, ///< Bad sequence of commands
- ParameterNotImplemented = 504, ///< Command not implemented for that parameter
- NotLoggedIn = 530, ///< Not logged in
- NeedAccountToStore = 532, ///< Need account for storing files
- FileUnavailable = 550, ///< Requested action not taken, file unavailable
- PageTypeUnknown = 551, ///< Requested action aborted, page type unknown
- NotEnoughMemory = 552, ///< Requested file action aborted, exceeded storage allocation
- FilenameNotAllowed = 553, ///< Requested action not taken, file name not allowed
+ CommandUnknown = 500, //!< Syntax error, command unrecognized
+ ParametersUnknown = 501, //!< Syntax error in parameters or arguments
+ CommandNotImplemented = 502, //!< Command not implemented
+ BadCommandSequence = 503, //!< Bad sequence of commands
+ ParameterNotImplemented = 504, //!< Command not implemented for that parameter
+ NotLoggedIn = 530, //!< Not logged in
+ NeedAccountToStore = 532, //!< Need account for storing files
+ FileUnavailable = 550, //!< Requested action not taken, file unavailable
+ PageTypeUnknown = 551, //!< Requested action aborted, page type unknown
+ NotEnoughMemory = 552, //!< Requested file action aborted, exceeded storage allocation
+ FilenameNotAllowed = 553, //!< Requested action not taken, file name not allowed
// 10xx: SFML custom codes
- InvalidResponse = 1000, ///< Not part of the FTP standard, generated by SFML when a received response cannot be parsed
- ConnectionFailed = 1001, ///< Not part of the FTP standard, generated by SFML when the low-level socket connection with the server fails
- ConnectionClosed = 1002, ///< Not part of the FTP standard, generated by SFML when the low-level socket connection is unexpectedly closed
- InvalidFile = 1003 ///< Not part of the FTP standard, generated by SFML when a local file cannot be read or written
+ InvalidResponse = 1000, //!< Not part of the FTP standard, generated by SFML when a received response cannot be parsed
+ ConnectionFailed = 1001, //!< Not part of the FTP standard, generated by SFML when the low-level socket connection with the server fails
+ ConnectionClosed = 1002, //!< Not part of the FTP standard, generated by SFML when the low-level socket connection is unexpectedly closed
+ InvalidFile = 1003 //!< Not part of the FTP standard, generated by SFML when a local file cannot be read or written
};
////////////////////////////////////////////////////////////
@@ -177,8 +177,8 @@ public:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Status m_status; ///< Status code returned from the server
- std::string m_message; ///< Last message received from the server
+ Status m_status; //!< Status code returned from the server
+ std::string m_message; //!< Last message received from the server
};
////////////////////////////////////////////////////////////
@@ -210,7 +210,7 @@ public:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- std::string m_directory; ///< Directory extracted from the response message
+ std::string m_directory; //!< Directory extracted from the response message
};
@@ -244,7 +244,7 @@ public:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- std::vector<std::string> m_listing; ///< Directory/file names extracted from the data
+ std::vector<std::string> m_listing; //!< Directory/file names extracted from the data
};
@@ -533,8 +533,8 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- TcpSocket m_commandSocket; ///< Socket holding the control connection with the server
- std::string m_receiveBuffer; ///< Received command data that is yet to be processed
+ TcpSocket m_commandSocket; //!< Socket holding the control connection with the server
+ std::string m_receiveBuffer; //!< Received command data that is yet to be processed
};
} // namespace sf
diff --git a/include/SFML/Network/Http.hpp b/include/SFML/Network/Http.hpp
index 44fe67d..6cc4340 100644
--- a/include/SFML/Network/Http.hpp
+++ b/include/SFML/Network/Http.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -61,11 +61,11 @@ public:
////////////////////////////////////////////////////////////
enum Method
{
- Get, ///< Request in get mode, standard method to retrieve a page
- Post, ///< Request in post mode, usually to send data to a page
- Head, ///< Request a page's header only
- Put, ///< Request in put mode, useful for a REST API
- Delete ///< Request in delete mode, useful for a REST API
+ Get, //!< Request in get mode, standard method to retrieve a page
+ Post, //!< Request in post mode, usually to send data to a page
+ Head, //!< Request a page's header only
+ Put, //!< Request in put mode, useful for a REST API
+ Delete //!< Request in delete mode, useful for a REST API
};
////////////////////////////////////////////////////////////
@@ -178,12 +178,12 @@ public:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- FieldTable m_fields; ///< Fields of the header associated to their value
- Method m_method; ///< Method to use for the request
- std::string m_uri; ///< Target URI of the request
- unsigned int m_majorVersion; ///< Major HTTP version
- unsigned int m_minorVersion; ///< Minor HTTP version
- std::string m_body; ///< Body of the request
+ FieldTable m_fields; //!< Fields of the header associated to their value
+ Method m_method; //!< Method to use for the request
+ std::string m_uri; //!< Target URI of the request
+ unsigned int m_majorVersion; //!< Major HTTP version
+ unsigned int m_minorVersion; //!< Minor HTTP version
+ std::string m_body; //!< Body of the request
};
////////////////////////////////////////////////////////////
@@ -201,37 +201,37 @@ public:
enum Status
{
// 2xx: success
- Ok = 200, ///< Most common code returned when operation was successful
- Created = 201, ///< The resource has successfully been created
- Accepted = 202, ///< The request has been accepted, but will be processed later by the server
- NoContent = 204, ///< The server didn't send any data in return
- ResetContent = 205, ///< The server informs the client that it should clear the view (form) that caused the request to be sent
- PartialContent = 206, ///< The server has sent a part of the resource, as a response to a partial GET request
+ Ok = 200, //!< Most common code returned when operation was successful
+ Created = 201, //!< The resource has successfully been created
+ Accepted = 202, //!< The request has been accepted, but will be processed later by the server
+ NoContent = 204, //!< The server didn't send any data in return
+ ResetContent = 205, //!< The server informs the client that it should clear the view (form) that caused the request to be sent
+ PartialContent = 206, //!< The server has sent a part of the resource, as a response to a partial GET request
// 3xx: redirection
- MultipleChoices = 300, ///< The requested page can be accessed from several locations
- MovedPermanently = 301, ///< The requested page has permanently moved to a new location
- MovedTemporarily = 302, ///< The requested page has temporarily moved to a new location
- NotModified = 304, ///< For conditional requests, means the requested page hasn't changed and doesn't need to be refreshed
+ MultipleChoices = 300, //!< The requested page can be accessed from several locations
+ MovedPermanently = 301, //!< The requested page has permanently moved to a new location
+ MovedTemporarily = 302, //!< The requested page has temporarily moved to a new location
+ NotModified = 304, //!< For conditional requests, means the requested page hasn't changed and doesn't need to be refreshed
// 4xx: client error
- BadRequest = 400, ///< The server couldn't understand the request (syntax error)
- Unauthorized = 401, ///< The requested page needs an authentication to be accessed
- Forbidden = 403, ///< The requested page cannot be accessed at all, even with authentication
- NotFound = 404, ///< The requested page doesn't exist
- RangeNotSatisfiable = 407, ///< The server can't satisfy the partial GET request (with a "Range" header field)
+ BadRequest = 400, //!< The server couldn't understand the request (syntax error)
+ Unauthorized = 401, //!< The requested page needs an authentication to be accessed
+ Forbidden = 403, //!< The requested page cannot be accessed at all, even with authentication
+ NotFound = 404, //!< The requested page doesn't exist
+ RangeNotSatisfiable = 407, //!< The server can't satisfy the partial GET request (with a "Range" header field)
// 5xx: server error
- InternalServerError = 500, ///< The server encountered an unexpected error
- NotImplemented = 501, ///< The server doesn't implement a requested feature
- BadGateway = 502, ///< The gateway server has received an error from the source server
- ServiceNotAvailable = 503, ///< The server is temporarily unavailable (overloaded, in maintenance, ...)
- GatewayTimeout = 504, ///< The gateway server couldn't receive a response from the source server
- VersionNotSupported = 505, ///< The server doesn't support the requested HTTP version
+ InternalServerError = 500, //!< The server encountered an unexpected error
+ NotImplemented = 501, //!< The server doesn't implement a requested feature
+ BadGateway = 502, //!< The gateway server has received an error from the source server
+ ServiceNotAvailable = 503, //!< The server is temporarily unavailable (overloaded, in maintenance, ...)
+ GatewayTimeout = 504, //!< The gateway server couldn't receive a response from the source server
+ VersionNotSupported = 505, //!< The server doesn't support the requested HTTP version
// 10xx: SFML custom codes
- InvalidResponse = 1000, ///< Response is not a valid HTTP one
- ConnectionFailed = 1001 ///< Connection with server failed
+ InvalidResponse = 1000, //!< Response is not a valid HTTP one
+ ConnectionFailed = 1001 //!< Connection with server failed
};
////////////////////////////////////////////////////////////
@@ -338,11 +338,11 @@ public:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- FieldTable m_fields; ///< Fields of the header
- Status m_status; ///< Status code
- unsigned int m_majorVersion; ///< Major HTTP version
- unsigned int m_minorVersion; ///< Minor HTTP version
- std::string m_body; ///< Body of the response
+ FieldTable m_fields; //!< Fields of the header
+ Status m_status; //!< Status code
+ unsigned int m_majorVersion; //!< Major HTTP version
+ unsigned int m_minorVersion; //!< Minor HTTP version
+ std::string m_body; //!< Body of the response
};
////////////////////////////////////////////////////////////
@@ -409,10 +409,10 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- TcpSocket m_connection; ///< Connection to the host
- IpAddress m_host; ///< Web host address
- std::string m_hostName; ///< Web host name
- unsigned short m_port; ///< Port used for connection with host
+ TcpSocket m_connection; //!< Connection to the host
+ IpAddress m_host; //!< Web host address
+ std::string m_hostName; //!< Web host name
+ unsigned short m_port; //!< Port used for connection with host
};
} // namespace sf
diff --git a/include/SFML/Network/IpAddress.hpp b/include/SFML/Network/IpAddress.hpp
index 9ec13c4..95401f5 100644
--- a/include/SFML/Network/IpAddress.hpp
+++ b/include/SFML/Network/IpAddress.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -181,10 +181,10 @@ public:
////////////////////////////////////////////////////////////
// Static member data
////////////////////////////////////////////////////////////
- static const IpAddress None; ///< Value representing an empty/invalid address
- static const IpAddress Any; ///< Value representing any address (0.0.0.0)
- static const IpAddress LocalHost; ///< The "localhost" address (for connecting a computer to itself locally)
- static const IpAddress Broadcast; ///< The "broadcast" address (for sending UDP messages to everyone on a local network)
+ static const IpAddress None; //!< Value representing an empty/invalid address
+ static const IpAddress Any; //!< Value representing any address (0.0.0.0)
+ static const IpAddress LocalHost; //!< The "localhost" address (for connecting a computer to itself locally)
+ static const IpAddress Broadcast; //!< The "broadcast" address (for sending UDP messages to everyone on a local network)
private:
@@ -201,8 +201,8 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Uint32 m_address; ///< Address stored as an unsigned 32 bits integer
- bool m_valid; ///< Is the address valid?
+ Uint32 m_address; //!< Address stored as an unsigned 32 bits integer
+ bool m_valid; //!< Is the address valid?
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/Network/Packet.hpp b/include/SFML/Network/Packet.hpp
index 9f0edab..a46f228 100644
--- a/include/SFML/Network/Packet.hpp
+++ b/include/SFML/Network/Packet.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -72,11 +72,24 @@ public:
/// \param sizeInBytes Number of bytes to append
///
/// \see clear
+ /// \see getReadPosition
///
////////////////////////////////////////////////////////////
void append(const void* data, std::size_t sizeInBytes);
////////////////////////////////////////////////////////////
+ /// \brief Get the current reading position in the packet
+ ///
+ /// The next read operation will read data from this position
+ ///
+ /// \return The byte offset of the current read position
+ ///
+ /// \see append
+ ///
+ ////////////////////////////////////////////////////////////
+ std::size_t getReadPosition() const;
+
+ ////////////////////////////////////////////////////////////
/// \brief Clear the packet
///
/// After calling Clear, the packet is empty.
@@ -400,10 +413,10 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- std::vector<char> m_data; ///< Data stored in the packet
- std::size_t m_readPos; ///< Current reading position in the packet
- std::size_t m_sendPos; ///< Current send position in the packet (for handling partial sends)
- bool m_isValid; ///< Reading state of the packet
+ std::vector<char> m_data; //!< Data stored in the packet
+ std::size_t m_readPos; //!< Current reading position in the packet
+ std::size_t m_sendPos; //!< Current send position in the packet (for handling partial sends)
+ bool m_isValid; //!< Reading state of the packet
};
} // namespace sf
diff --git a/include/SFML/Network/Socket.hpp b/include/SFML/Network/Socket.hpp
index d260174..f91d722 100644
--- a/include/SFML/Network/Socket.hpp
+++ b/include/SFML/Network/Socket.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -52,11 +52,11 @@ public:
////////////////////////////////////////////////////////////
enum Status
{
- Done, ///< The socket has sent / received the data
- NotReady, ///< The socket is not ready to send / receive data yet
- Partial, ///< The socket sent a part of the data
- Disconnected, ///< The TCP socket has been disconnected
- Error ///< An unexpected error happened
+ Done, //!< The socket has sent / received the data
+ NotReady, //!< The socket is not ready to send / receive data yet
+ Partial, //!< The socket sent a part of the data
+ Disconnected, //!< The TCP socket has been disconnected
+ Error //!< An unexpected error happened
};
////////////////////////////////////////////////////////////
@@ -65,7 +65,7 @@ public:
////////////////////////////////////////////////////////////
enum
{
- AnyPort = 0 ///< Special value that tells the system to pick any available port
+ AnyPort = 0 //!< Special value that tells the system to pick any available port
};
public:
@@ -113,8 +113,8 @@ protected:
////////////////////////////////////////////////////////////
enum Type
{
- Tcp, ///< TCP protocol
- Udp ///< UDP protocol
+ Tcp, //!< TCP protocol
+ Udp //!< UDP protocol
};
////////////////////////////////////////////////////////////
@@ -173,9 +173,9 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Type m_type; ///< Type of the socket (TCP or UDP)
- SocketHandle m_socket; ///< Socket descriptor
- bool m_isBlocking; ///< Current blocking mode of the socket
+ Type m_type; //!< Type of the socket (TCP or UDP)
+ SocketHandle m_socket; //!< Socket descriptor
+ bool m_isBlocking; //!< Current blocking mode of the socket
};
} // namespace sf
diff --git a/include/SFML/Network/SocketHandle.hpp b/include/SFML/Network/SocketHandle.hpp
index 270201b..b0961b2 100644
--- a/include/SFML/Network/SocketHandle.hpp
+++ b/include/SFML/Network/SocketHandle.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Network/SocketSelector.hpp b/include/SFML/Network/SocketSelector.hpp
index 106d708..c671515 100644
--- a/include/SFML/Network/SocketSelector.hpp
+++ b/include/SFML/Network/SocketSelector.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -158,7 +158,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- SocketSelectorImpl* m_impl; ///< Opaque pointer to the implementation (which requires OS-specific types)
+ SocketSelectorImpl* m_impl; //!< Opaque pointer to the implementation (which requires OS-specific types)
};
} // namespace sf
diff --git a/include/SFML/Network/TcpListener.hpp b/include/SFML/Network/TcpListener.hpp
index e0e05d6..baaa385 100644
--- a/include/SFML/Network/TcpListener.hpp
+++ b/include/SFML/Network/TcpListener.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -74,6 +74,10 @@ public:
/// function is called, it will stop listening on the old
/// port before starting to listen on the new port.
///
+ /// When providing sf::Socket::AnyPort as port, the listener
+ /// will request an available port from the system.
+ /// The chosen port can be retrieved by calling getLocalPort().
+ ///
/// \param port Port to listen on for incoming connection attempts
/// \param address Address of the interface to listen on
///
diff --git a/include/SFML/Network/TcpSocket.hpp b/include/SFML/Network/TcpSocket.hpp
index 6c0ab98..4f88e64 100644
--- a/include/SFML/Network/TcpSocket.hpp
+++ b/include/SFML/Network/TcpSocket.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -68,7 +68,7 @@ public:
////////////////////////////////////////////////////////////
/// \brief Get the address of the connected peer
///
- /// It the socket is not connected, this function returns
+ /// If the socket is not connected, this function returns
/// sf::IpAddress::None.
///
/// \return Address of the remote peer
@@ -220,15 +220,15 @@ private:
{
PendingPacket();
- Uint32 Size; ///< Data of packet size
- std::size_t SizeReceived; ///< Number of size bytes received so far
- std::vector<char> Data; ///< Data of the packet
+ Uint32 Size; //!< Data of packet size
+ std::size_t SizeReceived; //!< Number of size bytes received so far
+ std::vector<char> Data; //!< Data of the packet
};
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- PendingPacket m_pendingPacket; ///< Temporary data of the packet currently being received
+ PendingPacket m_pendingPacket; //!< Temporary data of the packet currently being received
};
} // namespace sf
diff --git a/include/SFML/Network/UdpSocket.hpp b/include/SFML/Network/UdpSocket.hpp
index 7ce3fe5..3338712 100644
--- a/include/SFML/Network/UdpSocket.hpp
+++ b/include/SFML/Network/UdpSocket.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -51,7 +51,7 @@ public:
////////////////////////////////////////////////////////////
enum
{
- MaxDatagramSize = 65507 ///< The maximum number of bytes that can be sent in a single UDP datagram
+ MaxDatagramSize = 65507 //!< The maximum number of bytes that can be sent in a single UDP datagram
};
////////////////////////////////////////////////////////////
@@ -78,9 +78,10 @@ public:
///
/// Binding the socket to a port is necessary for being
/// able to receive data on that port.
- /// You can use the special value Socket::AnyPort to tell the
- /// system to automatically pick an available port, and then
- /// call getLocalPort to retrieve the chosen port.
+ ///
+ /// When providing sf::Socket::AnyPort as port, the listener
+ /// will request an available port from the system.
+ /// The chosen port can be retrieved by calling getLocalPort().
///
/// Since the socket can only be bound to a single port at
/// any given moment, if it is already bound when this
@@ -193,7 +194,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- std::vector<char> m_buffer; ///< Temporary buffer holding the received data in Receive(Packet)
+ std::vector<char> m_buffer; //!< Temporary buffer holding the received data in Receive(Packet)
};
} // namespace sf
diff --git a/include/SFML/OpenGL.hpp b/include/SFML/OpenGL.hpp
index 6db5d01..5d6c646 100644
--- a/include/SFML/OpenGL.hpp
+++ b/include/SFML/OpenGL.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -45,7 +45,7 @@
#include <GL/gl.h>
-#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD)
+#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD)
#if defined(SFML_OPENGL_ES)
#include <GLES/gl.h>
diff --git a/include/SFML/System.hpp b/include/SFML/System.hpp
index fa4f9c9..0d95b10 100644
--- a/include/SFML/System.hpp
+++ b/include/SFML/System.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/Clock.hpp b/include/SFML/System/Clock.hpp
index 391e2c4..b054300 100644
--- a/include/SFML/System/Clock.hpp
+++ b/include/SFML/System/Clock.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -78,7 +78,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Time m_startTime; ///< Time of last reset, in microseconds
+ Time m_startTime; //!< Time of last reset, in microseconds
};
} // namespace sf
diff --git a/include/SFML/System/Err.hpp b/include/SFML/System/Err.hpp
index a701fef..9cba79f 100644
--- a/include/SFML/System/Err.hpp
+++ b/include/SFML/System/Err.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/Export.hpp b/include/SFML/System/Export.hpp
index e9c8ef8..523b090 100644
--- a/include/SFML/System/Export.hpp
+++ b/include/SFML/System/Export.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/FileInputStream.hpp b/include/SFML/System/FileInputStream.hpp
index ca26797..d4ffdd9 100644
--- a/include/SFML/System/FileInputStream.hpp
+++ b/include/SFML/System/FileInputStream.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -125,7 +125,7 @@ private:
#ifdef SFML_SYSTEM_ANDROID
priv::ResourceStream* m_file;
#else
- std::FILE* m_file; ///< stdio file stream
+ std::FILE* m_file; //!< stdio file stream
#endif
};
diff --git a/include/SFML/System/InputStream.hpp b/include/SFML/System/InputStream.hpp
index 495a4b9..43289db 100644
--- a/include/SFML/System/InputStream.hpp
+++ b/include/SFML/System/InputStream.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/Lock.hpp b/include/SFML/System/Lock.hpp
index 906016c..c8cce0e 100644
--- a/include/SFML/System/Lock.hpp
+++ b/include/SFML/System/Lock.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -67,7 +67,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Mutex& m_mutex; ///< Mutex to lock / unlock
+ Mutex& m_mutex; //!< Mutex to lock / unlock
};
} // namespace sf
diff --git a/include/SFML/System/MemoryInputStream.hpp b/include/SFML/System/MemoryInputStream.hpp
index 4b7f9ef..0ce96f6 100644
--- a/include/SFML/System/MemoryInputStream.hpp
+++ b/include/SFML/System/MemoryInputStream.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -104,9 +104,9 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- const char* m_data; ///< Pointer to the data in memory
- Int64 m_size; ///< Total size of the data
- Int64 m_offset; ///< Current reading position
+ const char* m_data; //!< Pointer to the data in memory
+ Int64 m_size; //!< Total size of the data
+ Int64 m_offset; //!< Current reading position
};
} // namespace sf
diff --git a/include/SFML/System/Mutex.hpp b/include/SFML/System/Mutex.hpp
index eda6909..85e3f58 100644
--- a/include/SFML/System/Mutex.hpp
+++ b/include/SFML/System/Mutex.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -85,7 +85,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- priv::MutexImpl* m_mutexImpl; ///< OS-specific implementation
+ priv::MutexImpl* m_mutexImpl; //!< OS-specific implementation
};
} // namespace sf
diff --git a/include/SFML/System/NativeActivity.hpp b/include/SFML/System/NativeActivity.hpp
index e8a3b17..90d0daa 100644
--- a/include/SFML/System/NativeActivity.hpp
+++ b/include/SFML/System/NativeActivity.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/NonCopyable.hpp b/include/SFML/System/NonCopyable.hpp
index dbe1eeb..bee08b5 100644
--- a/include/SFML/System/NonCopyable.hpp
+++ b/include/SFML/System/NonCopyable.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/Sleep.hpp b/include/SFML/System/Sleep.hpp
index ac3144b..2e08d5c 100644
--- a/include/SFML/System/Sleep.hpp
+++ b/include/SFML/System/Sleep.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/String.hpp b/include/SFML/System/String.hpp
index 5d047e2..202f451 100644
--- a/include/SFML/System/String.hpp
+++ b/include/SFML/System/String.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -49,13 +49,13 @@ public:
////////////////////////////////////////////////////////////
// Types
////////////////////////////////////////////////////////////
- typedef std::basic_string<Uint32>::iterator Iterator; ///< Iterator type
- typedef std::basic_string<Uint32>::const_iterator ConstIterator; ///< Read-only iterator type
+ typedef std::basic_string<Uint32>::iterator Iterator; //!< Iterator type
+ typedef std::basic_string<Uint32>::const_iterator ConstIterator; //!< Read-only iterator type
////////////////////////////////////////////////////////////
// Static member data
////////////////////////////////////////////////////////////
- static const std::size_t InvalidPos; ///< Represents an invalid position in the string
+ static const std::size_t InvalidPos; //!< Represents an invalid position in the string
////////////////////////////////////////////////////////////
/// \brief Default constructor
@@ -524,7 +524,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- std::basic_string<Uint32> m_string; ///< Internal string of UTF-32 characters
+ std::basic_string<Uint32> m_string; //!< Internal string of UTF-32 characters
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/System/String.inl b/include/SFML/System/String.inl
index b8893e7..64c068a 100644
--- a/include/SFML/System/String.inl
+++ b/include/SFML/System/String.inl
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/Thread.hpp b/include/SFML/System/Thread.hpp
index 15ae4a5..dfe7785 100644
--- a/include/SFML/System/Thread.hpp
+++ b/include/SFML/System/Thread.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -186,8 +186,8 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- priv::ThreadImpl* m_impl; ///< OS-specific implementation of the thread
- priv::ThreadFunc* m_entryPoint; ///< Abstraction of the function to run
+ priv::ThreadImpl* m_impl; //!< OS-specific implementation of the thread
+ priv::ThreadFunc* m_entryPoint; //!< Abstraction of the function to run
};
#include <SFML/System/Thread.inl>
diff --git a/include/SFML/System/Thread.inl b/include/SFML/System/Thread.inl
index 1f2e8de..1d1d5cb 100644
--- a/include/SFML/System/Thread.inl
+++ b/include/SFML/System/Thread.inl
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/ThreadLocal.hpp b/include/SFML/System/ThreadLocal.hpp
index 1ace1ba..7d48041 100644
--- a/include/SFML/System/ThreadLocal.hpp
+++ b/include/SFML/System/ThreadLocal.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -83,7 +83,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- priv::ThreadLocalImpl* m_impl; ///< Pointer to the OS specific implementation
+ priv::ThreadLocalImpl* m_impl; //!< Pointer to the OS specific implementation
};
} // namespace sf
diff --git a/include/SFML/System/ThreadLocalPtr.hpp b/include/SFML/System/ThreadLocalPtr.hpp
index bee944d..59cd4ca 100644
--- a/include/SFML/System/ThreadLocalPtr.hpp
+++ b/include/SFML/System/ThreadLocalPtr.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/ThreadLocalPtr.inl b/include/SFML/System/ThreadLocalPtr.inl
index 12c7690..ebd239e 100644
--- a/include/SFML/System/ThreadLocalPtr.inl
+++ b/include/SFML/System/ThreadLocalPtr.inl
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/Time.hpp b/include/SFML/System/Time.hpp
index 43d7548..ad9e5e9 100644
--- a/include/SFML/System/Time.hpp
+++ b/include/SFML/System/Time.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -82,7 +82,7 @@ public:
////////////////////////////////////////////////////////////
// Static member data
////////////////////////////////////////////////////////////
- static const Time Zero; ///< Predefined "zero" time value
+ static const Time Zero; //!< Predefined "zero" time value
private:
@@ -106,7 +106,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Int64 m_microseconds; ///< Time value stored as microseconds
+ Int64 m_microseconds; //!< Time value stored as microseconds
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/System/Utf.hpp b/include/SFML/System/Utf.hpp
index e1e78f6..fef95ef 100644
--- a/include/SFML/System/Utf.hpp
+++ b/include/SFML/System/Utf.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/Utf.inl b/include/SFML/System/Utf.inl
index 67fad8b..ddea01b 100644
--- a/include/SFML/System/Utf.inl
+++ b/include/SFML/System/Utf.inl
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -62,11 +62,11 @@ In Utf<8>::decode(In begin, In end, Uint32& output, Uint32 replacement)
output = 0;
switch (trailingBytes)
{
- case 5: output += static_cast<Uint8>(*begin++); output <<= 6;
- case 4: output += static_cast<Uint8>(*begin++); output <<= 6;
- case 3: output += static_cast<Uint8>(*begin++); output <<= 6;
- case 2: output += static_cast<Uint8>(*begin++); output <<= 6;
- case 1: output += static_cast<Uint8>(*begin++); output <<= 6;
+ case 5: output += static_cast<Uint8>(*begin++); output <<= 6; // fallthrough
+ case 4: output += static_cast<Uint8>(*begin++); output <<= 6; // fallthrough
+ case 3: output += static_cast<Uint8>(*begin++); output <<= 6; // fallthrough
+ case 2: output += static_cast<Uint8>(*begin++); output <<= 6; // fallthrough
+ case 1: output += static_cast<Uint8>(*begin++); output <<= 6; // fallthrough
case 0: output += static_cast<Uint8>(*begin++);
}
output -= offsets[trailingBytes];
@@ -97,7 +97,7 @@ Out Utf<8>::encode(Uint32 input, Out output, Uint8 replacement)
{
// Invalid character
if (replacement)
- *output++ = replacement;
+ output = std::copy(&replacement, &replacement + 1, output);
}
else
{
@@ -114,9 +114,9 @@ Out Utf<8>::encode(Uint32 input, Out output, Uint8 replacement)
Uint8 bytes[4];
switch (bytestoWrite)
{
- case 4: bytes[3] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6;
- case 3: bytes[2] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6;
- case 2: bytes[1] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6;
+ case 4: bytes[3] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6; // fallthrough
+ case 3: bytes[2] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6; // fallthrough
+ case 2: bytes[1] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6; // fallthrough
case 1: bytes[0] = static_cast<Uint8> (input | firstBytes[bytestoWrite]);
}
@@ -293,7 +293,7 @@ In Utf<16>::decode(In begin, In end, Uint32& output, Uint32 replacement)
if ((second >= 0xDC00) && (second <= 0xDFFF))
{
// The second element is valid: convert the two elements to a UTF-32 character
- output = static_cast<Uint32>(((first - 0xD800) << 10) + (second - 0xDC00) + 0x0010000);
+ output = ((first - 0xD800u) << 10) + (second - 0xDC00) + 0x0010000;
}
else
{
@@ -675,7 +675,7 @@ Uint32 Utf<32>::decodeWide(In input)
// In both cases, a simple copy is enough (UCS-2 is a subset of UCS-4,
// and UCS-4 *is* UTF-32).
- return input;
+ return static_cast<Uint32>(input);
}
diff --git a/include/SFML/System/Vector2.hpp b/include/SFML/System/Vector2.hpp
index 237f214..c99f376 100644
--- a/include/SFML/System/Vector2.hpp
+++ b/include/SFML/System/Vector2.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -72,8 +72,8 @@ public:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- T x; ///< X coordinate of the vector
- T y; ///< Y coordinate of the vector
+ T x; //!< X coordinate of the vector
+ T y; //!< Y coordinate of the vector
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/System/Vector2.inl b/include/SFML/System/Vector2.inl
index 29ad76f..44d0d76 100644
--- a/include/SFML/System/Vector2.inl
+++ b/include/SFML/System/Vector2.inl
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/System/Vector3.hpp b/include/SFML/System/Vector3.hpp
index b12b2f5..47d761c 100644
--- a/include/SFML/System/Vector3.hpp
+++ b/include/SFML/System/Vector3.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -73,9 +73,9 @@ public:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- T x; ///< X coordinate of the vector
- T y; ///< Y coordinate of the vector
- T z; ///< Z coordinate of the vector
+ T x; //!< X coordinate of the vector
+ T y; //!< Y coordinate of the vector
+ T z; //!< Z coordinate of the vector
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/System/Vector3.inl b/include/SFML/System/Vector3.inl
index b532fe0..62a6c44 100644
--- a/include/SFML/System/Vector3.inl
+++ b/include/SFML/System/Vector3.inl
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Window.hpp b/include/SFML/Window.hpp
index 836f13a..9ebceb6 100644
--- a/include/SFML/Window.hpp
+++ b/include/SFML/Window.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Window/Clipboard.hpp b/include/SFML/Window/Clipboard.hpp
index 50ea804..8533cca 100644
--- a/include/SFML/Window/Clipboard.hpp
+++ b/include/SFML/Window/Clipboard.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Window/Context.hpp b/include/SFML/Window/Context.hpp
index 71e2c0a..21499f7 100644
--- a/include/SFML/Window/Context.hpp
+++ b/include/SFML/Window/Context.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -150,7 +150,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- priv::GlContext* m_context; ///< Internal OpenGL context
+ priv::GlContext* m_context; //!< Internal OpenGL context
};
} // namespace sf
diff --git a/include/SFML/Window/ContextSettings.hpp b/include/SFML/Window/ContextSettings.hpp
index 00afbc4..46274b6 100644
--- a/include/SFML/Window/ContextSettings.hpp
+++ b/include/SFML/Window/ContextSettings.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -42,9 +42,9 @@ struct ContextSettings
////////////////////////////////////////////////////////////
enum Attribute
{
- Default = 0, ///< Non-debug, compatibility context (this and the core attribute are mutually exclusive)
- Core = 1 << 0, ///< Core attribute
- Debug = 1 << 2 ///< Debug attribute
+ Default = 0, //!< Non-debug, compatibility context (this and the core attribute are mutually exclusive)
+ Core = 1 << 0, //!< Core attribute
+ Debug = 1 << 2 //!< Debug attribute
};
////////////////////////////////////////////////////////////
@@ -73,13 +73,13 @@ struct ContextSettings
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- unsigned int depthBits; ///< Bits of the depth buffer
- unsigned int stencilBits; ///< Bits of the stencil buffer
- unsigned int antialiasingLevel; ///< Level of antialiasing
- unsigned int majorVersion; ///< Major number of the context version to create
- unsigned int minorVersion; ///< Minor number of the context version to create
- Uint32 attributeFlags; ///< The attribute flags to create the context with
- bool sRgbCapable; ///< Whether the context framebuffer is sRGB capable
+ unsigned int depthBits; //!< Bits of the depth buffer
+ unsigned int stencilBits; //!< Bits of the stencil buffer
+ unsigned int antialiasingLevel; //!< Level of antialiasing
+ unsigned int majorVersion; //!< Major number of the context version to create
+ unsigned int minorVersion; //!< Minor number of the context version to create
+ Uint32 attributeFlags; //!< The attribute flags to create the context with
+ bool sRgbCapable; //!< Whether the context framebuffer is sRGB capable
};
} // namespace sf
diff --git a/include/SFML/Window/Cursor.hpp b/include/SFML/Window/Cursor.hpp
index 9daa13b..55ab320 100644
--- a/include/SFML/Window/Cursor.hpp
+++ b/include/SFML/Window/Cursor.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -64,6 +64,14 @@ public:
/// sf::Cursor::SizeVertical | yes | yes | yes |
/// sf::Cursor::SizeTopLeftBottomRight | no | yes* | yes |
/// sf::Cursor::SizeBottomLeftTopRight | no | yes* | yes |
+ /// sf::Cursor::SizeLeft | yes | yes** | yes** |
+ /// sf::Cursor::SizeRight | yes | yes** | yes** |
+ /// sf::Cursor::SizeTop | yes | yes** | yes** |
+ /// sf::Cursor::SizeBottom | yes | yes** | yes** |
+ /// sf::Cursor::SizeTopLeft | yes | yes** | yes** |
+ /// sf::Cursor::SizeTopRight | yes | yes** | yes** |
+ /// sf::Cursor::SizeBottomLeft | yes | yes** | yes** |
+ /// sf::Cursor::SizeBottomRight | yes | yes** | yes** |
/// sf::Cursor::SizeAll | yes | no | yes |
/// sf::Cursor::Cross | yes | yes | yes |
/// sf::Cursor::Help | yes | yes* | yes |
@@ -72,22 +80,32 @@ public:
/// * These cursor types are undocumented so may not
/// be available on all versions, but have been tested on 10.13
///
+ /// ** On Windows and macOS, double-headed arrows are used
+ ///
////////////////////////////////////////////////////////////
enum Type
{
- Arrow, ///< Arrow cursor (default)
- ArrowWait, ///< Busy arrow cursor
- Wait, ///< Busy cursor
- Text, ///< I-beam, cursor when hovering over a field allowing text entry
- Hand, ///< Pointing hand cursor
- SizeHorizontal, ///< Horizontal double arrow cursor
- SizeVertical, ///< Vertical double arrow cursor
- SizeTopLeftBottomRight, ///< Double arrow cursor going from top-left to bottom-right
- SizeBottomLeftTopRight, ///< Double arrow cursor going from bottom-left to top-right
- SizeAll, ///< Combination of SizeHorizontal and SizeVertical
- Cross, ///< Crosshair cursor
- Help, ///< Help cursor
- NotAllowed ///< Action not allowed cursor
+ Arrow, //!< Arrow cursor (default)
+ ArrowWait, //!< Busy arrow cursor
+ Wait, //!< Busy cursor
+ Text, //!< I-beam, cursor when hovering over a field allowing text entry
+ Hand, //!< Pointing hand cursor
+ SizeHorizontal, //!< Horizontal double arrow cursor
+ SizeVertical, //!< Vertical double arrow cursor
+ SizeTopLeftBottomRight, //!< Double arrow cursor going from top-left to bottom-right
+ SizeBottomLeftTopRight, //!< Double arrow cursor going from bottom-left to top-right
+ SizeLeft, //!< Left arrow cursor on Linux, same as SizeHorizontal on other platforms
+ SizeRight, //!< Right arrow cursor on Linux, same as SizeHorizontal on other platforms
+ SizeTop, //!< Up arrow cursor on Linux, same as SizeVertical on other platforms
+ SizeBottom, //!< Down arrow cursor on Linux, same as SizeVertical on other platforms
+ SizeTopLeft, //!< Top-left arrow cursor on Linux, same as SizeTopLeftBottomRight on other platforms
+ SizeBottomRight, //!< Bottom-right arrow cursor on Linux, same as SizeTopLeftBottomRight on other platforms
+ SizeBottomLeft, //!< Bottom-left arrow cursor on Linux, same as SizeBottomLeftTopRight on other platforms
+ SizeTopRight, //!< Top-right arrow cursor on Linux, same as SizeBottomLeftTopRight on other platforms
+ SizeAll, //!< Combination of SizeHorizontal and SizeVertical
+ Cross, //!< Crosshair cursor
+ Help, //!< Help cursor
+ NotAllowed //!< Action not allowed cursor
};
public:
@@ -129,7 +147,8 @@ public:
/// position is. Any mouse actions that are performed will
/// return the window/screen location of the hotspot.
///
- /// \warning On Unix, the pixels are mapped into a monochrome
+ /// \warning On Unix platforms which do not support colored
+ /// cursors, the pixels are mapped into a monochrome
/// bitmap: pixels with an alpha channel to 0 are
/// transparent, black if the RGB channel are close
/// to zero, and white otherwise.
@@ -161,7 +180,7 @@ public:
private:
- friend class Window;
+ friend class WindowBase;
////////////////////////////////////////////////////////////
/// \brief Get access to the underlying implementation
@@ -179,7 +198,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- priv::CursorImpl* m_impl; ///< Platform-specific implementation of the cursor
+ priv::CursorImpl* m_impl; //!< Platform-specific implementation of the cursor
};
} // namespace sf
diff --git a/include/SFML/Window/Event.hpp b/include/SFML/Window/Event.hpp
index 9261785..ab63d38 100644
--- a/include/SFML/Window/Event.hpp
+++ b/include/SFML/Window/Event.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -51,8 +51,8 @@ public:
////////////////////////////////////////////////////////////
struct SizeEvent
{
- unsigned int width; ///< New width, in pixels
- unsigned int height; ///< New height, in pixels
+ unsigned int width; //!< New width, in pixels
+ unsigned int height; //!< New height, in pixels
};
////////////////////////////////////////////////////////////
@@ -61,11 +61,12 @@ public:
////////////////////////////////////////////////////////////
struct KeyEvent
{
- Keyboard::Key code; ///< Code of the key that has been pressed
- bool alt; ///< Is the Alt key pressed?
- bool control; ///< Is the Control key pressed?
- bool shift; ///< Is the Shift key pressed?
- bool system; ///< Is the System key pressed?
+ Keyboard::Key code; //!< Code of the key that has been pressed
+ Keyboard::Scancode scancode; //!< Physical code of the key that has been pressed
+ bool alt; //!< Is the Alt key pressed?
+ bool control; //!< Is the Control key pressed?
+ bool shift; //!< Is the Shift key pressed?
+ bool system; //!< Is the System key pressed?
};
////////////////////////////////////////////////////////////
@@ -74,7 +75,7 @@ public:
////////////////////////////////////////////////////////////
struct TextEvent
{
- Uint32 unicode; ///< UTF-32 Unicode value of the character
+ Uint32 unicode; //!< UTF-32 Unicode value of the character
};
////////////////////////////////////////////////////////////
@@ -83,8 +84,8 @@ public:
////////////////////////////////////////////////////////////
struct MouseMoveEvent
{
- int x; ///< X position of the mouse pointer, relative to the left of the owner window
- int y; ///< Y position of the mouse pointer, relative to the top of the owner window
+ int x; //!< X position of the mouse pointer, relative to the left of the owner window
+ int y; //!< Y position of the mouse pointer, relative to the top of the owner window
};
////////////////////////////////////////////////////////////
@@ -94,9 +95,9 @@ public:
////////////////////////////////////////////////////////////
struct MouseButtonEvent
{
- Mouse::Button button; ///< Code of the button that has been pressed
- int x; ///< X position of the mouse pointer, relative to the left of the owner window
- int y; ///< Y position of the mouse pointer, relative to the top of the owner window
+ Mouse::Button button; //!< Code of the button that has been pressed
+ int x; //!< X position of the mouse pointer, relative to the left of the owner window
+ int y; //!< Y position of the mouse pointer, relative to the top of the owner window
};
////////////////////////////////////////////////////////////
@@ -108,9 +109,9 @@ public:
////////////////////////////////////////////////////////////
struct MouseWheelEvent
{
- int delta; ///< Number of ticks the wheel has moved (positive is up, negative is down)
- int x; ///< X position of the mouse pointer, relative to the left of the owner window
- int y; ///< Y position of the mouse pointer, relative to the top of the owner window
+ int delta; //!< Number of ticks the wheel has moved (positive is up, negative is down)
+ int x; //!< X position of the mouse pointer, relative to the left of the owner window
+ int y; //!< Y position of the mouse pointer, relative to the top of the owner window
};
////////////////////////////////////////////////////////////
@@ -119,10 +120,10 @@ public:
////////////////////////////////////////////////////////////
struct MouseWheelScrollEvent
{
- Mouse::Wheel wheel; ///< Which wheel (for mice with multiple ones)
- float delta; ///< Wheel offset (positive is up/left, negative is down/right). High-precision mice may use non-integral offsets.
- int x; ///< X position of the mouse pointer, relative to the left of the owner window
- int y; ///< Y position of the mouse pointer, relative to the top of the owner window
+ Mouse::Wheel wheel; //!< Which wheel (for mice with multiple ones)
+ float delta; //!< Wheel offset (positive is up/left, negative is down/right). High-precision mice may use non-integral offsets.
+ int x; //!< X position of the mouse pointer, relative to the left of the owner window
+ int y; //!< Y position of the mouse pointer, relative to the top of the owner window
};
////////////////////////////////////////////////////////////
@@ -132,7 +133,7 @@ public:
////////////////////////////////////////////////////////////
struct JoystickConnectEvent
{
- unsigned int joystickId; ///< Index of the joystick (in range [0 .. Joystick::Count - 1])
+ unsigned int joystickId; //!< Index of the joystick (in range [0 .. Joystick::Count - 1])
};
////////////////////////////////////////////////////////////
@@ -141,9 +142,9 @@ public:
////////////////////////////////////////////////////////////
struct JoystickMoveEvent
{
- unsigned int joystickId; ///< Index of the joystick (in range [0 .. Joystick::Count - 1])
- Joystick::Axis axis; ///< Axis on which the joystick moved
- float position; ///< New position on the axis (in range [-100 .. 100])
+ unsigned int joystickId; //!< Index of the joystick (in range [0 .. Joystick::Count - 1])
+ Joystick::Axis axis; //!< Axis on which the joystick moved
+ float position; //!< New position on the axis (in range [-100 .. 100])
};
////////////////////////////////////////////////////////////
@@ -153,8 +154,8 @@ public:
////////////////////////////////////////////////////////////
struct JoystickButtonEvent
{
- unsigned int joystickId; ///< Index of the joystick (in range [0 .. Joystick::Count - 1])
- unsigned int button; ///< Index of the button that has been pressed (in range [0 .. Joystick::ButtonCount - 1])
+ unsigned int joystickId; //!< Index of the joystick (in range [0 .. Joystick::Count - 1])
+ unsigned int button; //!< Index of the button that has been pressed (in range [0 .. Joystick::ButtonCount - 1])
};
////////////////////////////////////////////////////////////
@@ -163,9 +164,9 @@ public:
////////////////////////////////////////////////////////////
struct TouchEvent
{
- unsigned int finger; ///< Index of the finger in case of multi-touch events
- int x; ///< X position of the touch, relative to the left of the owner window
- int y; ///< Y position of the touch, relative to the top of the owner window
+ unsigned int finger; //!< Index of the finger in case of multi-touch events
+ int x; //!< X position of the touch, relative to the left of the owner window
+ int y; //!< Y position of the touch, relative to the top of the owner window
};
////////////////////////////////////////////////////////////
@@ -174,10 +175,10 @@ public:
////////////////////////////////////////////////////////////
struct SensorEvent
{
- Sensor::Type type; ///< Type of the sensor
- float x; ///< Current value of the sensor on X axis
- float y; ///< Current value of the sensor on Y axis
- float z; ///< Current value of the sensor on Z axis
+ Sensor::Type type; //!< Type of the sensor
+ float x; //!< Current value of the sensor on X axis
+ float y; //!< Current value of the sensor on Y axis
+ float z; //!< Current value of the sensor on Z axis
};
////////////////////////////////////////////////////////////
@@ -186,52 +187,52 @@ public:
////////////////////////////////////////////////////////////
enum EventType
{
- Closed, ///< The window requested to be closed (no data)
- Resized, ///< The window was resized (data in event.size)
- LostFocus, ///< The window lost the focus (no data)
- GainedFocus, ///< The window gained the focus (no data)
- TextEntered, ///< A character was entered (data in event.text)
- KeyPressed, ///< A key was pressed (data in event.key)
- KeyReleased, ///< A key was released (data in event.key)
- MouseWheelMoved, ///< The mouse wheel was scrolled (data in event.mouseWheel) (deprecated)
- MouseWheelScrolled, ///< The mouse wheel was scrolled (data in event.mouseWheelScroll)
- MouseButtonPressed, ///< A mouse button was pressed (data in event.mouseButton)
- MouseButtonReleased, ///< A mouse button was released (data in event.mouseButton)
- MouseMoved, ///< The mouse cursor moved (data in event.mouseMove)
- MouseEntered, ///< The mouse cursor entered the area of the window (no data)
- MouseLeft, ///< The mouse cursor left the area of the window (no data)
- JoystickButtonPressed, ///< A joystick button was pressed (data in event.joystickButton)
- JoystickButtonReleased, ///< A joystick button was released (data in event.joystickButton)
- JoystickMoved, ///< The joystick moved along an axis (data in event.joystickMove)
- JoystickConnected, ///< A joystick was connected (data in event.joystickConnect)
- JoystickDisconnected, ///< A joystick was disconnected (data in event.joystickConnect)
- TouchBegan, ///< A touch event began (data in event.touch)
- TouchMoved, ///< A touch moved (data in event.touch)
- TouchEnded, ///< A touch event ended (data in event.touch)
- SensorChanged, ///< A sensor value changed (data in event.sensor)
+ Closed, //!< The window requested to be closed (no data)
+ Resized, //!< The window was resized (data in event.size)
+ LostFocus, //!< The window lost the focus (no data)
+ GainedFocus, //!< The window gained the focus (no data)
+ TextEntered, //!< A character was entered (data in event.text)
+ KeyPressed, //!< A key was pressed (data in event.key)
+ KeyReleased, //!< A key was released (data in event.key)
+ MouseWheelMoved, //!< The mouse wheel was scrolled (data in event.mouseWheel) (deprecated)
+ MouseWheelScrolled, //!< The mouse wheel was scrolled (data in event.mouseWheelScroll)
+ MouseButtonPressed, //!< A mouse button was pressed (data in event.mouseButton)
+ MouseButtonReleased, //!< A mouse button was released (data in event.mouseButton)
+ MouseMoved, //!< The mouse cursor moved (data in event.mouseMove)
+ MouseEntered, //!< The mouse cursor entered the area of the window (no data)
+ MouseLeft, //!< The mouse cursor left the area of the window (no data)
+ JoystickButtonPressed, //!< A joystick button was pressed (data in event.joystickButton)
+ JoystickButtonReleased, //!< A joystick button was released (data in event.joystickButton)
+ JoystickMoved, //!< The joystick moved along an axis (data in event.joystickMove)
+ JoystickConnected, //!< A joystick was connected (data in event.joystickConnect)
+ JoystickDisconnected, //!< A joystick was disconnected (data in event.joystickConnect)
+ TouchBegan, //!< A touch event began (data in event.touch)
+ TouchMoved, //!< A touch moved (data in event.touch)
+ TouchEnded, //!< A touch event ended (data in event.touch)
+ SensorChanged, //!< A sensor value changed (data in event.sensor)
- Count ///< Keep last -- the total number of event types
+ Count //!< Keep last -- the total number of event types
};
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- EventType type; ///< Type of the event
+ EventType type; //!< Type of the event
union
{
- SizeEvent size; ///< Size event parameters (Event::Resized)
- KeyEvent key; ///< Key event parameters (Event::KeyPressed, Event::KeyReleased)
- TextEvent text; ///< Text event parameters (Event::TextEntered)
- MouseMoveEvent mouseMove; ///< Mouse move event parameters (Event::MouseMoved)
- MouseButtonEvent mouseButton; ///< Mouse button event parameters (Event::MouseButtonPressed, Event::MouseButtonReleased)
- MouseWheelEvent mouseWheel; ///< Mouse wheel event parameters (Event::MouseWheelMoved) (deprecated)
- MouseWheelScrollEvent mouseWheelScroll; ///< Mouse wheel event parameters (Event::MouseWheelScrolled)
- JoystickMoveEvent joystickMove; ///< Joystick move event parameters (Event::JoystickMoved)
- JoystickButtonEvent joystickButton; ///< Joystick button event parameters (Event::JoystickButtonPressed, Event::JoystickButtonReleased)
- JoystickConnectEvent joystickConnect; ///< Joystick (dis)connect event parameters (Event::JoystickConnected, Event::JoystickDisconnected)
- TouchEvent touch; ///< Touch events parameters (Event::TouchBegan, Event::TouchMoved, Event::TouchEnded)
- SensorEvent sensor; ///< Sensor event parameters (Event::SensorChanged)
+ SizeEvent size; //!< Size event parameters (Event::Resized)
+ KeyEvent key; //!< Key event parameters (Event::KeyPressed, Event::KeyReleased)
+ TextEvent text; //!< Text event parameters (Event::TextEntered)
+ MouseMoveEvent mouseMove; //!< Mouse move event parameters (Event::MouseMoved)
+ MouseButtonEvent mouseButton; //!< Mouse button event parameters (Event::MouseButtonPressed, Event::MouseButtonReleased)
+ MouseWheelEvent mouseWheel; //!< Mouse wheel event parameters (Event::MouseWheelMoved) (deprecated)
+ MouseWheelScrollEvent mouseWheelScroll; //!< Mouse wheel event parameters (Event::MouseWheelScrolled)
+ JoystickMoveEvent joystickMove; //!< Joystick move event parameters (Event::JoystickMoved)
+ JoystickButtonEvent joystickButton; //!< Joystick button event parameters (Event::JoystickButtonPressed, Event::JoystickButtonReleased)
+ JoystickConnectEvent joystickConnect; //!< Joystick (dis)connect event parameters (Event::JoystickConnected, Event::JoystickDisconnected)
+ TouchEvent touch; //!< Touch events parameters (Event::TouchBegan, Event::TouchMoved, Event::TouchEnded)
+ SensorEvent sensor; //!< Sensor event parameters (Event::SensorChanged)
};
};
diff --git a/include/SFML/Window/Export.hpp b/include/SFML/Window/Export.hpp
index 37826a2..5df445b 100644
--- a/include/SFML/Window/Export.hpp
+++ b/include/SFML/Window/Export.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Window/GlResource.hpp b/include/SFML/Window/GlResource.hpp
index f701242..f3e7751 100644
--- a/include/SFML/Window/GlResource.hpp
+++ b/include/SFML/Window/GlResource.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/include/SFML/Window/Joystick.hpp b/include/SFML/Window/Joystick.hpp
index ab49c74..58df94e 100644
--- a/include/SFML/Window/Joystick.hpp
+++ b/include/SFML/Window/Joystick.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -48,9 +48,9 @@ public:
////////////////////////////////////////////////////////////
enum
{
- Count = 8, ///< Maximum number of supported joysticks
- ButtonCount = 32, ///< Maximum number of supported buttons
- AxisCount = 8 ///< Maximum number of supported axes
+ Count = 8, //!< Maximum number of supported joysticks
+ ButtonCount = 32, //!< Maximum number of supported buttons
+ AxisCount = 8 //!< Maximum number of supported axes
};
////////////////////////////////////////////////////////////
@@ -59,14 +59,14 @@ public:
////////////////////////////////////////////////////////////
enum Axis
{
- X, ///< The X axis
- Y, ///< The Y axis
- Z, ///< The Z axis
- R, ///< The R axis
- U, ///< The U axis
- V, ///< The V axis
- PovX, ///< The X axis of the point-of-view hat
- PovY ///< The Y axis of the point-of-view hat
+ X, //!< The X axis
+ Y, //!< The Y axis
+ Z, //!< The Z axis
+ R, //!< The R axis
+ U, //!< The U axis
+ V, //!< The V axis
+ PovX, //!< The X axis of the point-of-view hat
+ PovY //!< The Y axis of the point-of-view hat
};
////////////////////////////////////////////////////////////
@@ -77,9 +77,9 @@ public:
{
Identification();
- String name; ///< Name of the joystick
- unsigned int vendorId; ///< Manufacturer identifier
- unsigned int productId; ///< Product identifier
+ String name; //!< Name of the joystick
+ unsigned int vendorId; //!< Manufacturer identifier
+ unsigned int productId; //!< Product identifier
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/Window/Keyboard.hpp b/include/SFML/Window/Keyboard.hpp
index 7c59c57..5bf38c6 100644
--- a/include/SFML/Window/Keyboard.hpp
+++ b/include/SFML/Window/Keyboard.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -33,6 +33,8 @@
namespace sf
{
+class String;
+
////////////////////////////////////////////////////////////
/// \brief Give access to the real-time state of the keyboard
///
@@ -44,124 +46,316 @@ public:
////////////////////////////////////////////////////////////
/// \brief Key codes
///
+ /// The enumerators refer to the "localized" key; i.e. depending
+ /// on the layout set by the operating system, a key can be mapped
+ /// to `Y` or `Z`.
+ ///
////////////////////////////////////////////////////////////
enum Key
{
- Unknown = -1, ///< Unhandled key
- A = 0, ///< The A key
- B, ///< The B key
- C, ///< The C key
- D, ///< The D key
- E, ///< The E key
- F, ///< The F key
- G, ///< The G key
- H, ///< The H key
- I, ///< The I key
- J, ///< The J key
- K, ///< The K key
- L, ///< The L key
- M, ///< The M key
- N, ///< The N key
- O, ///< The O key
- P, ///< The P key
- Q, ///< The Q key
- R, ///< The R key
- S, ///< The S key
- T, ///< The T key
- U, ///< The U key
- V, ///< The V key
- W, ///< The W key
- X, ///< The X key
- Y, ///< The Y key
- Z, ///< The Z key
- Num0, ///< The 0 key
- Num1, ///< The 1 key
- Num2, ///< The 2 key
- Num3, ///< The 3 key
- Num4, ///< The 4 key
- Num5, ///< The 5 key
- Num6, ///< The 6 key
- Num7, ///< The 7 key
- Num8, ///< The 8 key
- Num9, ///< The 9 key
- Escape, ///< The Escape key
- LControl, ///< The left Control key
- LShift, ///< The left Shift key
- LAlt, ///< The left Alt key
- LSystem, ///< The left OS specific key: window (Windows and Linux), apple (MacOS X), ...
- RControl, ///< The right Control key
- RShift, ///< The right Shift key
- RAlt, ///< The right Alt key
- RSystem, ///< The right OS specific key: window (Windows and Linux), apple (MacOS X), ...
- Menu, ///< The Menu key
- LBracket, ///< The [ key
- RBracket, ///< The ] key
- Semicolon, ///< The ; key
- Comma, ///< The , key
- Period, ///< The . key
- Quote, ///< The ' key
- Slash, ///< The / key
- Backslash, ///< The \ key
- Tilde, ///< The ~ key
- Equal, ///< The = key
- Hyphen, ///< The - key (hyphen)
- Space, ///< The Space key
- Enter, ///< The Enter/Return keys
- Backspace, ///< The Backspace key
- Tab, ///< The Tabulation key
- PageUp, ///< The Page up key
- PageDown, ///< The Page down key
- End, ///< The End key
- Home, ///< The Home key
- Insert, ///< The Insert key
- Delete, ///< The Delete key
- Add, ///< The + key
- Subtract, ///< The - key (minus, usually from numpad)
- Multiply, ///< The * key
- Divide, ///< The / key
- Left, ///< Left arrow
- Right, ///< Right arrow
- Up, ///< Up arrow
- Down, ///< Down arrow
- Numpad0, ///< The numpad 0 key
- Numpad1, ///< The numpad 1 key
- Numpad2, ///< The numpad 2 key
- Numpad3, ///< The numpad 3 key
- Numpad4, ///< The numpad 4 key
- Numpad5, ///< The numpad 5 key
- Numpad6, ///< The numpad 6 key
- Numpad7, ///< The numpad 7 key
- Numpad8, ///< The numpad 8 key
- Numpad9, ///< The numpad 9 key
- F1, ///< The F1 key
- F2, ///< The F2 key
- F3, ///< The F3 key
- F4, ///< The F4 key
- F5, ///< The F5 key
- F6, ///< The F6 key
- F7, ///< The F7 key
- F8, ///< The F8 key
- F9, ///< The F9 key
- F10, ///< The F10 key
- F11, ///< The F11 key
- F12, ///< The F12 key
- F13, ///< The F13 key
- F14, ///< The F14 key
- F15, ///< The F15 key
- Pause, ///< The Pause key
-
- KeyCount, ///< Keep last -- the total number of keyboard keys
+ Unknown = -1, //!< Unhandled key
+ A = 0, //!< The A key
+ B, //!< The B key
+ C, //!< The C key
+ D, //!< The D key
+ E, //!< The E key
+ F, //!< The F key
+ G, //!< The G key
+ H, //!< The H key
+ I, //!< The I key
+ J, //!< The J key
+ K, //!< The K key
+ L, //!< The L key
+ M, //!< The M key
+ N, //!< The N key
+ O, //!< The O key
+ P, //!< The P key
+ Q, //!< The Q key
+ R, //!< The R key
+ S, //!< The S key
+ T, //!< The T key
+ U, //!< The U key
+ V, //!< The V key
+ W, //!< The W key
+ X, //!< The X key
+ Y, //!< The Y key
+ Z, //!< The Z key
+ Num0, //!< The 0 key
+ Num1, //!< The 1 key
+ Num2, //!< The 2 key
+ Num3, //!< The 3 key
+ Num4, //!< The 4 key
+ Num5, //!< The 5 key
+ Num6, //!< The 6 key
+ Num7, //!< The 7 key
+ Num8, //!< The 8 key
+ Num9, //!< The 9 key
+ Escape, //!< The Escape key
+ LControl, //!< The left Control key
+ LShift, //!< The left Shift key
+ LAlt, //!< The left Alt key
+ LSystem, //!< The left OS specific key: window (Windows and Linux), apple (macOS), ...
+ RControl, //!< The right Control key
+ RShift, //!< The right Shift key
+ RAlt, //!< The right Alt key
+ RSystem, //!< The right OS specific key: window (Windows and Linux), apple (macOS), ...
+ Menu, //!< The Menu key
+ LBracket, //!< The [ key
+ RBracket, //!< The ] key
+ Semicolon, //!< The ; key
+ Comma, //!< The , key
+ Period, //!< The . key
+ Apostrophe, //!< The ' key
+ Slash, //!< The / key
+ Backslash, //!< The \ key
+ Grave, //!< The ` key
+ Equal, //!< The = key
+ Hyphen, //!< The - key (hyphen)
+ Space, //!< The Space key
+ Enter, //!< The Enter/Return keys
+ Backspace, //!< The Backspace key
+ Tab, //!< The Tabulation key
+ PageUp, //!< The Page up key
+ PageDown, //!< The Page down key
+ End, //!< The End key
+ Home, //!< The Home key
+ Insert, //!< The Insert key
+ Delete, //!< The Delete key
+ Add, //!< The + key
+ Subtract, //!< The - key (minus, usually from numpad)
+ Multiply, //!< The * key
+ Divide, //!< The / key
+ Left, //!< Left arrow
+ Right, //!< Right arrow
+ Up, //!< Up arrow
+ Down, //!< Down arrow
+ Numpad0, //!< The numpad 0 key
+ Numpad1, //!< The numpad 1 key
+ Numpad2, //!< The numpad 2 key
+ Numpad3, //!< The numpad 3 key
+ Numpad4, //!< The numpad 4 key
+ Numpad5, //!< The numpad 5 key
+ Numpad6, //!< The numpad 6 key
+ Numpad7, //!< The numpad 7 key
+ Numpad8, //!< The numpad 8 key
+ Numpad9, //!< The numpad 9 key
+ F1, //!< The F1 key
+ F2, //!< The F2 key
+ F3, //!< The F3 key
+ F4, //!< The F4 key
+ F5, //!< The F5 key
+ F6, //!< The F6 key
+ F7, //!< The F7 key
+ F8, //!< The F8 key
+ F9, //!< The F9 key
+ F10, //!< The F10 key
+ F11, //!< The F11 key
+ F12, //!< The F12 key
+ F13, //!< The F13 key
+ F14, //!< The F14 key
+ F15, //!< The F15 key
+ Pause, //!< The Pause key
+
+ KeyCount, //!< Keep last -- the total number of keyboard keys
// Deprecated values:
- Dash = Hyphen, ///< \deprecated Use Hyphen instead
- BackSpace = Backspace, ///< \deprecated Use Backspace instead
- BackSlash = Backslash, ///< \deprecated Use Backslash instead
- SemiColon = Semicolon, ///< \deprecated Use Semicolon instead
- Return = Enter ///< \deprecated Use Enter instead
+ Tilde = Grave, //!< \deprecated Use Grave instead
+ Dash = Hyphen, //!< \deprecated Use Hyphen instead
+ BackSpace = Backspace, //!< \deprecated Use Backspace instead
+ BackSlash = Backslash, //!< \deprecated Use Backslash instead
+ SemiColon = Semicolon, //!< \deprecated Use Semicolon instead
+ Return = Enter, //!< \deprecated Use Enter instead
+ Quote = Apostrophe //!< \deprecated Use Apostrophe instead
};
////////////////////////////////////////////////////////////
+ /// \brief Scancodes
+ ///
+ /// The enumerators are bound to a physical key and do not depend on
+ /// the keyboard layout used by the operating system. Usually, the AT-101
+ /// keyboard can be used as reference for the physical position of the keys.
+ ///
+ ////////////////////////////////////////////////////////////
+ struct Scan
+ {
+ // TODO: replace with enum class in SFML 3.
+ // Clang warns us rightfully that Scancode names shadow Key names.
+ // A safer solution would be to use a C++11 scoped enumeration (enum class),
+ // but it is not possible in SFML 2 which uses C++03.
+ // For now, we just ignore those warnings.
+ #if defined(__clang__)
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wshadow"
+ #endif
+
+ enum Scancode
+ {
+ Unknown = -1, //!< Represents any scancode not present in this enum
+ A = 0, //!< Keyboard a and A key
+ B, //!< Keyboard b and B key
+ C, //!< Keyboard c and C key
+ D, //!< Keyboard d and D key
+ E, //!< Keyboard e and E key
+ F, //!< Keyboard f and F key
+ G, //!< Keyboard g and G key
+ H, //!< Keyboard h and H key
+ I, //!< Keyboard i and I key
+ J, //!< Keyboard j and J key
+ K, //!< Keyboard k and K key
+ L, //!< Keyboard l and L key
+ M, //!< Keyboard m and M key
+ N, //!< Keyboard n and N key
+ O, //!< Keyboard o and O key
+ P, //!< Keyboard p and P key
+ Q, //!< Keyboard q and Q key
+ R, //!< Keyboard r and R key
+ S, //!< Keyboard s and S key
+ T, //!< Keyboard t and T key
+ U, //!< Keyboard u and U key
+ V, //!< Keyboard v and V key
+ W, //!< Keyboard w and W key
+ X, //!< Keyboard x and X key
+ Y, //!< Keyboard y and Y key
+ Z, //!< Keyboard z and Z key
+ Num1, //!< Keyboard 1 and ! key
+ Num2, //!< Keyboard 2 and @ key
+ Num3, //!< Keyboard 3 and # key
+ Num4, //!< Keyboard 4 and $ key
+ Num5, //!< Keyboard 5 and % key
+ Num6, //!< Keyboard 6 and ^ key
+ Num7, //!< Keyboard 7 and & key
+ Num8, //!< Keyboard 8 and * key
+ Num9, //!< Keyboard 9 and ) key
+ Num0, //!< Keyboard 0 and ) key
+ Enter, //!< Keyboard Enter/Return key
+ Escape, //!< Keyboard Escape key
+ Backspace, //!< Keyboard Backspace key
+ Tab, //!< Keyboard Tab key
+ Space, //!< Keyboard Space key
+ Hyphen, //!< Keyboard - and _ key
+ Equal, //!< Keyboard = and +
+ LBracket, //!< Keyboard [ and { key
+ RBracket, //!< Keyboard ] and } key
+ // For US keyboards mapped to key 29 (Microsoft Keyboard Scan Code Specification)
+ // For Non-US keyboards mapped to key 42 (Microsoft Keyboard Scan Code Specification)
+ // Typical language mappings: Belg:Ā£Āµ` FrCa:<>} Dan:*' Dutch:`Ā“ Fren:Āµ* Ger:'# Ital:Ā§Ć¹ LatAm:[}` Nor:*@ Span:Ƨ} Swed:*' Swiss:$Ā£} UK:~# Brazil:}]
+ Backslash, //!< Keyboard \ and | key OR various keys for Non-US keyboards
+ Semicolon, //!< Keyboard ; and : key
+ Apostrophe, //!< Keyboard ' and " key
+ Grave, //!< Keyboard ` and ~ key
+ Comma, //!< Keyboard , and < key
+ Period, //!< Keyboard . and > key
+ Slash, //!< Keyboard / and ? key
+ F1, //!< Keyboard F1 key
+ F2, //!< Keyboard F2 key
+ F3, //!< Keyboard F3 key
+ F4, //!< Keyboard F4 key
+ F5, //!< Keyboard F5 key
+ F6, //!< Keyboard F6 key
+ F7, //!< Keyboard F7 key
+ F8, //!< Keyboard F8 key
+ F9, //!< Keyboard F9 key
+ F10, //!< Keyboard F10 key
+ F11, //!< Keyboard F11 key
+ F12, //!< Keyboard F12 key
+ F13, //!< Keyboard F13 key
+ F14, //!< Keyboard F14 key
+ F15, //!< Keyboard F15 key
+ F16, //!< Keyboard F16 key
+ F17, //!< Keyboard F17 key
+ F18, //!< Keyboard F18 key
+ F19, //!< Keyboard F19 key
+ F20, //!< Keyboard F20 key
+ F21, //!< Keyboard F21 key
+ F22, //!< Keyboard F22 key
+ F23, //!< Keyboard F23 key
+ F24, //!< Keyboard F24 key
+ CapsLock, //!< Keyboard Caps %Lock key
+ PrintScreen, //!< Keyboard Print Screen key
+ ScrollLock, //!< Keyboard Scroll %Lock key
+ Pause, //!< Keyboard Pause key
+ Insert, //!< Keyboard Insert key
+ Home, //!< Keyboard Home key
+ PageUp, //!< Keyboard Page Up key
+ Delete, //!< Keyboard Delete Forward key
+ End, //!< Keyboard End key
+ PageDown, //!< Keyboard Page Down key
+ Right, //!< Keyboard Right Arrow key
+ Left, //!< Keyboard Left Arrow key
+ Down, //!< Keyboard Down Arrow key
+ Up, //!< Keyboard Up Arrow key
+ NumLock, //!< Keypad Num %Lock and Clear key
+ NumpadDivide, //!< Keypad / key
+ NumpadMultiply, //!< Keypad * key
+ NumpadMinus, //!< Keypad - key
+ NumpadPlus, //!< Keypad + key
+ NumpadEqual, //!< keypad = key
+ NumpadEnter, //!< Keypad Enter/Return key
+ NumpadDecimal, //!< Keypad . and Delete key
+ Numpad1, //!< Keypad 1 and End key
+ Numpad2, //!< Keypad 2 and Down Arrow key
+ Numpad3, //!< Keypad 3 and Page Down key
+ Numpad4, //!< Keypad 4 and Left Arrow key
+ Numpad5, //!< Keypad 5 key
+ Numpad6, //!< Keypad 6 and Right Arrow key
+ Numpad7, //!< Keypad 7 and Home key
+ Numpad8, //!< Keypad 8 and Up Arrow key
+ Numpad9, //!< Keypad 9 and Page Up key
+ Numpad0, //!< Keypad 0 and Insert key
+ // For US keyboards doesn't exist
+ // For Non-US keyboards mapped to key 45 (Microsoft Keyboard Scan Code Specification)
+ // Typical language mappings: Belg:<\> FrCa:Ā«Ā°Ā» Dan:<\> Dutch:]|[ Fren:<> Ger:<|> Ital:<> LatAm:<> Nor:<> Span:<> Swed:<|> Swiss:<\> UK:\| Brazil: \|.
+ NonUsBackslash, //!< Keyboard Non-US \ and | key
+ Application, //!< Keyboard Application key
+ Execute, //!< Keyboard Execute key
+ ModeChange, //!< Keyboard Mode Change key
+ Help, //!< Keyboard Help key
+ Menu, //!< Keyboard Menu key
+ Select, //!< Keyboard Select key
+ Redo, //!< Keyboard Redo key
+ Undo, //!< Keyboard Undo key
+ Cut, //!< Keyboard Cut key
+ Copy, //!< Keyboard Copy key
+ Paste, //!< Keyboard Paste key
+ VolumeMute, //!< Keyboard Volume Mute key
+ VolumeUp, //!< Keyboard Volume Up key
+ VolumeDown, //!< Keyboard Volume Down key
+ MediaPlayPause, //!< Keyboard Media Play Pause key
+ MediaStop, //!< Keyboard Media Stop key
+ MediaNextTrack, //!< Keyboard Media Next Track key
+ MediaPreviousTrack, //!< Keyboard Media Previous Track key
+ LControl, //!< Keyboard Left Control key
+ LShift, //!< Keyboard Left Shift key
+ LAlt, //!< Keyboard Left Alt key
+ LSystem, //!< Keyboard Left System key
+ RControl, //!< Keyboard Right Control key
+ RShift, //!< Keyboard Right Shift key
+ RAlt, //!< Keyboard Right Alt key
+ RSystem, //!< Keyboard Right System key
+ Back, //!< Keyboard Back key
+ Forward, //!< Keyboard Forward key
+ Refresh, //!< Keyboard Refresh key
+ Stop, //!< Keyboard Stop key
+ Search, //!< Keyboard Search key
+ Favorites, //!< Keyboard Favorites key
+ HomePage, //!< Keyboard Home Page key
+ LaunchApplication1, //!< Keyboard Launch Application 1 key
+ LaunchApplication2, //!< Keyboard Launch Application 2 key
+ LaunchMail, //!< Keyboard Launch Mail key
+ LaunchMediaSelect, //!< Keyboard Launch Media Select key
+
+ ScancodeCount //!< Keep last -- the total number of scancodes
+ };
+
+ #if defined(__clang__)
+ #pragma clang diagnostic pop
+ #endif
+ };
+
+ typedef Scan::Scancode Scancode;
+
+ ////////////////////////////////////////////////////////////
/// \brief Check if a key is pressed
///
/// \param key Key to check
@@ -172,11 +366,72 @@ public:
static bool isKeyPressed(Key key);
////////////////////////////////////////////////////////////
+ /// \brief Check if a key is pressed
+ ///
+ /// \param code Scancode to check
+ ///
+ /// \return True if the physical key is pressed, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Localize a physical key to a logical one
+ ///
+ /// \param code Scancode to localize
+ ///
+ /// \return The key corresponding to the scancode under the current
+ /// keyboard layout used by the operating system, or
+ /// sf::Keyboard::Unknown when the scancode cannot be mapped
+ /// to a Key.
+ ///
+ /// \see delocalize
+ ///
+ ////////////////////////////////////////////////////////////
+ static Key localize(Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Identify the physical key corresponding to a logical one
+ ///
+ /// \param key Key to "delocalize"
+ ///
+ /// \return The scancode corresponding to the key under the current
+ /// keyboard layout used by the operating system, or
+ /// sf::Keyboard::Scan::Unknown when the key cannot be mapped
+ /// to a sf::Keyboard::Scancode.
+ ///
+ /// \see localize
+ ///
+ ////////////////////////////////////////////////////////////
+ static Scancode delocalize(Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Provide a string representation for a given scancode
+ ///
+ /// The returned string is a short, non-technical description of
+ /// the key represented with the given scancode. Most effectively
+ /// used in user interfaces, as the description for the key takes
+ /// the users keyboard layout into consideration.
+ ///
+ /// \warning The result is OS-dependent: for example, sf::Keyboard::Scan::LSystem
+ /// is "Left Meta" on Linux, "Left Windows" on Windows and
+ /// "Left Command" on macOS.
+ ///
+ /// The current keyboard layout set by the operating system is used to
+ /// interpret the scancode: for example, sf::Keyboard::Semicolon is
+ /// mapped to ";" for layout and to "Ć©" for others.
+ ///
+ /// \return The localized description of the code
+ ///
+ ////////////////////////////////////////////////////////////
+ static String getDescription(Scancode code);
+
+ ////////////////////////////////////////////////////////////
/// \brief Show or hide the virtual keyboard
///
- /// Warning: the virtual keyboard is not supported on all
- /// systems. It will typically be implemented on mobile OSes
- /// (Android, iOS) but not on desktop OSes (Windows, Linux, ...).
+ /// \warning The virtual keyboard is not supported on all
+ /// systems. It will typically be implemented on mobile OSes
+ /// (Android, iOS) but not on desktop OSes (Windows, Linux, ...).
///
/// If the virtual keyboard is not available, this function does
/// nothing.
@@ -225,6 +480,10 @@ public:
/// {
/// // quit...
/// }
+/// else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Scan::Grave))
+/// {
+/// // open in-game command line (if it's not already open)
+/// }
/// \endcode
///
/// \see sf::Joystick, sf::Mouse, sf::Touch
diff --git a/include/SFML/Window/Mouse.hpp b/include/SFML/Window/Mouse.hpp
index 0d1e470..e2a55c4 100644
--- a/include/SFML/Window/Mouse.hpp
+++ b/include/SFML/Window/Mouse.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -34,7 +34,7 @@
namespace sf
{
-class Window;
+class WindowBase;
////////////////////////////////////////////////////////////
/// \brief Give access to the real-time state of the mouse
@@ -50,13 +50,13 @@ public:
////////////////////////////////////////////////////////////
enum Button
{
- Left, ///< The left mouse button
- Right, ///< The right mouse button
- Middle, ///< The middle (wheel) mouse button
- XButton1, ///< The first extra mouse button
- XButton2, ///< The second extra mouse button
+ Left, //!< The left mouse button
+ Right, //!< The right mouse button
+ Middle, //!< The middle (wheel) mouse button
+ XButton1, //!< The first extra mouse button
+ XButton2, //!< The second extra mouse button
- ButtonCount ///< Keep last -- the total number of mouse buttons
+ ButtonCount //!< Keep last -- the total number of mouse buttons
};
////////////////////////////////////////////////////////////
@@ -65,13 +65,16 @@ public:
////////////////////////////////////////////////////////////
enum Wheel
{
- VerticalWheel, ///< The vertical mouse wheel
- HorizontalWheel ///< The horizontal mouse wheel
+ VerticalWheel, //!< The vertical mouse wheel
+ HorizontalWheel //!< The horizontal mouse wheel
};
////////////////////////////////////////////////////////////
/// \brief Check if a mouse button is pressed
///
+ /// \warning Checking the state of buttons Mouse::XButton1 and
+ /// Mouse::XButton2 is not supported on Linux with X11.
+ ///
/// \param button Button to check
///
/// \return True if the button is pressed, false otherwise
@@ -101,7 +104,7 @@ public:
/// \return Current position of the mouse
///
////////////////////////////////////////////////////////////
- static Vector2i getPosition(const Window& relativeTo);
+ static Vector2i getPosition(const WindowBase& relativeTo);
////////////////////////////////////////////////////////////
/// \brief Set the current position of the mouse in desktop coordinates
@@ -124,7 +127,7 @@ public:
/// \param relativeTo Reference window
///
////////////////////////////////////////////////////////////
- static void setPosition(const Vector2i& position, const Window& relativeTo);
+ static void setPosition(const Vector2i& position, const WindowBase& relativeTo);
};
} // namespace sf
diff --git a/include/SFML/Window/Sensor.hpp b/include/SFML/Window/Sensor.hpp
index 6915fa0..488f8e7 100644
--- a/include/SFML/Window/Sensor.hpp
+++ b/include/SFML/Window/Sensor.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -49,14 +49,14 @@ public:
////////////////////////////////////////////////////////////
enum Type
{
- Accelerometer, ///< Measures the raw acceleration (m/s^2)
- Gyroscope, ///< Measures the raw rotation rates (degrees/s)
- Magnetometer, ///< Measures the ambient magnetic field (micro-teslas)
- Gravity, ///< Measures the direction and intensity of gravity, independent of device acceleration (m/s^2)
- UserAcceleration, ///< Measures the direction and intensity of device acceleration, independent of the gravity (m/s^2)
- Orientation, ///< Measures the absolute 3D orientation (degrees)
+ Accelerometer, //!< Measures the raw acceleration (m/s^2)
+ Gyroscope, //!< Measures the raw rotation rates (degrees/s)
+ Magnetometer, //!< Measures the ambient magnetic field (micro-teslas)
+ Gravity, //!< Measures the direction and intensity of gravity, independent of device acceleration (m/s^2)
+ UserAcceleration, //!< Measures the direction and intensity of device acceleration, independent of the gravity (m/s^2)
+ Orientation, //!< Measures the absolute 3D orientation (degrees)
- Count ///< Keep last -- the total number of sensor types
+ Count //!< Keep last -- the total number of sensor types
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/Window/Touch.hpp b/include/SFML/Window/Touch.hpp
index 1c2b3fe..76f03bf 100644
--- a/include/SFML/Window/Touch.hpp
+++ b/include/SFML/Window/Touch.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -34,7 +34,7 @@
namespace sf
{
-class Window;
+class WindowBase;
////////////////////////////////////////////////////////////
/// \brief Give access to the real-time state of the touches
@@ -79,7 +79,7 @@ public:
/// \return Current position of \a finger, or undefined if it's not down
///
////////////////////////////////////////////////////////////
- static Vector2i getPosition(unsigned int finger, const Window& relativeTo);
+ static Vector2i getPosition(unsigned int finger, const WindowBase& relativeTo);
};
} // namespace sf
diff --git a/include/SFML/Window/VideoMode.hpp b/include/SFML/Window/VideoMode.hpp
index 24797f6..2bcb44d 100644
--- a/include/SFML/Window/VideoMode.hpp
+++ b/include/SFML/Window/VideoMode.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -99,9 +99,9 @@ public:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- unsigned int width; ///< Video mode width, in pixels
- unsigned int height; ///< Video mode height, in pixels
- unsigned int bitsPerPixel; ///< Video mode pixel depth, in bits per pixels
+ unsigned int width; //!< Video mode width, in pixels
+ unsigned int height; //!< Video mode height, in pixels
+ unsigned int bitsPerPixel; //!< Video mode pixel depth, in bits per pixels
};
////////////////////////////////////////////////////////////
diff --git a/include/SFML/Window/Vulkan.hpp b/include/SFML/Window/Vulkan.hpp
new file mode 100644
index 0000000..9ede483
--- /dev/null
+++ b/include/SFML/Window/Vulkan.hpp
@@ -0,0 +1,115 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_VULKAN_HPP
+#define SFML_VULKAN_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Export.hpp>
+#include <SFML/Window/WindowHandle.hpp>
+#include <vector>
+#include <cstddef>
+#include <stdint.h>
+
+
+typedef struct VkInstance_T* VkInstance;
+
+#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
+
+typedef struct VkSurfaceKHR_T* VkSurfaceKHR;
+
+#else
+
+typedef uint64_t VkSurfaceKHR;
+
+#endif
+
+struct VkAllocationCallbacks;
+
+
+namespace sf
+{
+
+typedef void (*VulkanFunctionPointer)();
+
+////////////////////////////////////////////////////////////
+/// \brief Vulkan helper functions
+///
+////////////////////////////////////////////////////////////
+class SFML_WINDOW_API Vulkan
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Tell whether or not the system supports Vulkan
+ ///
+ /// This function should always be called before using
+ /// the Vulkan features. If it returns false, then
+ /// any attempt to use Vulkan will fail.
+ ///
+ /// If only compute is required, set \a requireGraphics
+ /// to false to skip checking for the extensions necessary
+ /// for graphics rendering.
+ ///
+ /// \param requireGraphics
+ ///
+ /// \return True if Vulkan is supported, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isAvailable(bool requireGraphics = true);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the address of a Vulkan function
+ ///
+ /// \param name Name of the function to get the address of
+ ///
+ /// \return Address of the Vulkan function, 0 on failure
+ ///
+ ////////////////////////////////////////////////////////////
+ static VulkanFunctionPointer getFunction(const char* name);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get Vulkan instance extensions required for graphics
+ ///
+ /// \return Vulkan instance extensions required for graphics
+ ///
+ ////////////////////////////////////////////////////////////
+ static const std::vector<const char*>& getGraphicsRequiredInstanceExtensions();
+};
+
+} // namespace sf
+
+
+#endif // SFML_VULKAN_HPP
+
+
+////////////////////////////////////////////////////////////
+/// \class sf::Vulkan
+/// \ingroup window
+///
+///
+///
+////////////////////////////////////////////////////////////
diff --git a/include/SFML/Window/Window.hpp b/include/SFML/Window/Window.hpp
index 7ff81e2..e919b01 100644
--- a/include/SFML/Window/Window.hpp
+++ b/include/SFML/Window/Window.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,16 +29,8 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Window/ContextSettings.hpp>
-#include <SFML/Window/Cursor.hpp>
-#include <SFML/Window/Export.hpp>
#include <SFML/Window/GlResource.hpp>
-#include <SFML/Window/VideoMode.hpp>
-#include <SFML/Window/WindowHandle.hpp>
-#include <SFML/Window/WindowStyle.hpp>
-#include <SFML/System/Clock.hpp>
-#include <SFML/System/NonCopyable.hpp>
-#include <SFML/System/String.hpp>
-#include <SFML/System/Vector2.hpp>
+#include <SFML/Window/WindowBase.hpp>
namespace sf
@@ -46,7 +38,6 @@ namespace sf
namespace priv
{
class GlContext;
- class WindowImpl;
}
class Event;
@@ -55,7 +46,7 @@ class Event;
/// \brief Window that serves as a target for OpenGL rendering
///
////////////////////////////////////////////////////////////
-class SFML_WINDOW_API Window : GlResource, NonCopyable
+class SFML_WINDOW_API Window : public WindowBase, GlResource
{
public:
@@ -120,6 +111,20 @@ public:
/// If \a style contains Style::Fullscreen, then \a mode
/// must be a valid video mode.
///
+ /// \param mode Video mode to use (defines the width, height and depth of the rendering area of the window)
+ /// \param title Title of the window
+ /// \param style %Window style, a bitwise OR combination of sf::Style enumerators
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void create(VideoMode mode, const String& title, Uint32 style = Style::Default);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create (or recreate) the window
+ ///
+ /// If the window was already created, it closes it first.
+ /// If \a style contains Style::Fullscreen, then \a mode
+ /// must be a valid video mode.
+ ///
/// The fourth parameter is an optional structure specifying
/// advanced OpenGL context settings such as antialiasing,
/// depth-buffer bits, etc.
@@ -130,7 +135,19 @@ public:
/// \param settings Additional settings for the underlying OpenGL context
///
////////////////////////////////////////////////////////////
- void create(VideoMode mode, const String& title, Uint32 style = Style::Default, const ContextSettings& settings = ContextSettings());
+ virtual void create(VideoMode mode, const String& title, Uint32 style, const ContextSettings& settings);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create (or recreate) the window from an existing control
+ ///
+ /// Use this function if you want to create an OpenGL
+ /// rendering area into an already existing control.
+ /// If the window was already created, it closes it first.
+ ///
+ /// \param handle Platform-specific handle of the control
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void create(WindowHandle handle);
////////////////////////////////////////////////////////////
/// \brief Create (or recreate) the window from an existing control
@@ -147,7 +164,7 @@ public:
/// \param settings Additional settings for the underlying OpenGL context
///
////////////////////////////////////////////////////////////
- void create(WindowHandle handle, const ContextSettings& settings = ContextSettings());
+ virtual void create(WindowHandle handle, const ContextSettings& settings);
////////////////////////////////////////////////////////////
/// \brief Close the window and destroy all the attached resources
@@ -159,19 +176,7 @@ public:
/// and will have no effect on closed windows.
///
////////////////////////////////////////////////////////////
- void close();
-
- ////////////////////////////////////////////////////////////
- /// \brief Tell whether or not the window is open
- ///
- /// This function returns whether or not the window exists.
- /// Note that a hidden window (setVisible(false)) is open
- /// (therefore this function would return true).
- ///
- /// \return True if the window is open, false if it has been closed
- ///
- ////////////////////////////////////////////////////////////
- bool isOpen() const;
+ virtual void close();
////////////////////////////////////////////////////////////
/// \brief Get the settings of the OpenGL context of the window
@@ -187,144 +192,6 @@ public:
const ContextSettings& getSettings() const;
////////////////////////////////////////////////////////////
- /// \brief Pop the event on top of the event queue, if any, and return it
- ///
- /// This function is not blocking: if there's no pending event then
- /// it will return false and leave \a event unmodified.
- /// Note that more than one event may be present in the event queue,
- /// thus you should always call this function in a loop
- /// to make sure that you process every pending event.
- /// \code
- /// sf::Event event;
- /// while (window.pollEvent(event))
- /// {
- /// // process event...
- /// }
- /// \endcode
- ///
- /// \param event Event to be returned
- ///
- /// \return True if an event was returned, or false if the event queue was empty
- ///
- /// \see waitEvent
- ///
- ////////////////////////////////////////////////////////////
- bool pollEvent(Event& event);
-
- ////////////////////////////////////////////////////////////
- /// \brief Wait for an event and return it
- ///
- /// This function is blocking: if there's no pending event then
- /// it will wait until an event is received.
- /// After this function returns (and no error occurred),
- /// the \a event object is always valid and filled properly.
- /// This function is typically used when you have a thread that
- /// is dedicated to events handling: you want to make this thread
- /// sleep as long as no new event is received.
- /// \code
- /// sf::Event event;
- /// if (window.waitEvent(event))
- /// {
- /// // process event...
- /// }
- /// \endcode
- ///
- /// \param event Event to be returned
- ///
- /// \return False if any error occurred
- ///
- /// \see pollEvent
- ///
- ////////////////////////////////////////////////////////////
- bool waitEvent(Event& event);
-
- ////////////////////////////////////////////////////////////
- /// \brief Get the position of the window
- ///
- /// \return Position of the window, in pixels
- ///
- /// \see setPosition
- ///
- ////////////////////////////////////////////////////////////
- Vector2i getPosition() const;
-
- ////////////////////////////////////////////////////////////
- /// \brief Change the position of the window on screen
- ///
- /// This function only works for top-level windows
- /// (i.e. it will be ignored for windows created from
- /// the handle of a child window/control).
- ///
- /// \param position New position, in pixels
- ///
- /// \see getPosition
- ///
- ////////////////////////////////////////////////////////////
- void setPosition(const Vector2i& position);
-
- ////////////////////////////////////////////////////////////
- /// \brief Get the size of the rendering region of the window
- ///
- /// The size doesn't include the titlebar and borders
- /// of the window.
- ///
- /// \return Size in pixels
- ///
- /// \see setSize
- ///
- ////////////////////////////////////////////////////////////
- Vector2u getSize() const;
-
- ////////////////////////////////////////////////////////////
- /// \brief Change the size of the rendering region of the window
- ///
- /// \param size New size, in pixels
- ///
- /// \see getSize
- ///
- ////////////////////////////////////////////////////////////
- void setSize(const Vector2u& size);
-
- ////////////////////////////////////////////////////////////
- /// \brief Change the title of the window
- ///
- /// \param title New title
- ///
- /// \see setIcon
- ///
- ////////////////////////////////////////////////////////////
- void setTitle(const String& title);
-
- ////////////////////////////////////////////////////////////
- /// \brief Change the window's icon
- ///
- /// \a pixels must be an array of \a width x \a height pixels
- /// in 32-bits RGBA format.
- ///
- /// The OS default icon is used by default.
- ///
- /// \param width Icon's width, in pixels
- /// \param height Icon's height, in pixels
- /// \param pixels Pointer to the array of pixels in memory. The
- /// pixels are copied, so you need not keep the
- /// source alive after calling this function.
- ///
- /// \see setTitle
- ///
- ////////////////////////////////////////////////////////////
- void setIcon(unsigned int width, unsigned int height, const Uint8* pixels);
-
- ////////////////////////////////////////////////////////////
- /// \brief Show or hide the window
- ///
- /// The window is shown by default.
- ///
- /// \param visible True to show the window, false to hide it
- ///
- ////////////////////////////////////////////////////////////
- void setVisible(bool visible);
-
- ////////////////////////////////////////////////////////////
/// \brief Enable or disable vertical synchronization
///
/// Activating vertical synchronization will limit the number
@@ -340,62 +207,6 @@ public:
void setVerticalSyncEnabled(bool enabled);
////////////////////////////////////////////////////////////
- /// \brief Show or hide the mouse cursor
- ///
- /// The mouse cursor is visible by default.
- ///
- /// \param visible True to show the mouse cursor, false to hide it
- ///
- ////////////////////////////////////////////////////////////
- void setMouseCursorVisible(bool visible);
-
- ////////////////////////////////////////////////////////////
- /// \brief Grab or release the mouse cursor
- ///
- /// If set, grabs the mouse cursor inside this window's client
- /// area so it may no longer be moved outside its bounds.
- /// Note that grabbing is only active while the window has
- /// focus.
- ///
- /// \param grabbed True to enable, false to disable
- ///
- ////////////////////////////////////////////////////////////
- void setMouseCursorGrabbed(bool grabbed);
-
- ////////////////////////////////////////////////////////////
- /// \brief Set the displayed cursor to a native system cursor
- ///
- /// Upon window creation, the arrow cursor is used by default.
- ///
- /// \warning The cursor must not be destroyed while in use by
- /// the window.
- ///
- /// \warning Features related to Cursor are not supported on
- /// iOS and Android.
- ///
- /// \param cursor Native system cursor type to display
- ///
- /// \see sf::Cursor::loadFromSystem
- /// \see sf::Cursor::loadFromPixels
- ///
- ////////////////////////////////////////////////////////////
- void setMouseCursor(const Cursor& cursor);
-
- ////////////////////////////////////////////////////////////
- /// \brief Enable or disable automatic key-repeat
- ///
- /// If key repeat is enabled, you will receive repeated
- /// KeyPressed events while keeping a key pressed. If it is disabled,
- /// you will only get a single event when the key is pressed.
- ///
- /// Key repeat is enabled by default.
- ///
- /// \param enabled True to enable, false to disable
- ///
- ////////////////////////////////////////////////////////////
- void setKeyRepeatEnabled(bool enabled);
-
- ////////////////////////////////////////////////////////////
/// \brief Limit the framerate to a maximum fixed frequency
///
/// If a limit is set, the window will use a small delay after
@@ -413,19 +224,6 @@ public:
void setFramerateLimit(unsigned int limit);
////////////////////////////////////////////////////////////
- /// \brief Change the joystick threshold
- ///
- /// The joystick threshold is the value below which
- /// no JoystickMoved event will be generated.
- ///
- /// The threshold value is 0.1 by default.
- ///
- /// \param threshold New threshold, in the range [0, 100]
- ///
- ////////////////////////////////////////////////////////////
- void setJoystickThreshold(float threshold);
-
- ////////////////////////////////////////////////////////////
/// \brief Activate or deactivate the window as the current target
/// for OpenGL rendering
///
@@ -444,35 +242,6 @@ public:
bool setActive(bool active = true) const;
////////////////////////////////////////////////////////////
- /// \brief Request the current window to be made the active
- /// foreground window
- ///
- /// At any given time, only one window may have the input focus
- /// to receive input events such as keystrokes or mouse events.
- /// If a window requests focus, it only hints to the operating
- /// system, that it would like to be focused. The operating system
- /// is free to deny the request.
- /// This is not to be confused with setActive().
- ///
- /// \see hasFocus
- ///
- ////////////////////////////////////////////////////////////
- void requestFocus();
-
- ////////////////////////////////////////////////////////////
- /// \brief Check whether the window has the input focus
- ///
- /// At any given time, only one window may have the input focus
- /// to receive input events such as keystrokes or most mouse
- /// events.
- ///
- /// \return True if window has focus, false otherwise
- /// \see requestFocus
- ///
- ////////////////////////////////////////////////////////////
- bool hasFocus() const;
-
- ////////////////////////////////////////////////////////////
/// \brief Display on screen what has been rendered to the window so far
///
/// This function is typically called after all OpenGL rendering
@@ -482,41 +251,6 @@ public:
////////////////////////////////////////////////////////////
void display();
- ////////////////////////////////////////////////////////////
- /// \brief Get the OS-specific handle of the window
- ///
- /// The type of the returned handle is sf::WindowHandle,
- /// which is a typedef to the handle type defined by the OS.
- /// You shouldn't need to use this function, unless you have
- /// very specific stuff to implement that SFML doesn't support,
- /// or implement a temporary workaround until a bug is fixed.
- ///
- /// \return System handle of the window
- ///
- ////////////////////////////////////////////////////////////
- WindowHandle getSystemHandle() const;
-
-protected:
-
- ////////////////////////////////////////////////////////////
- /// \brief Function called after the window has been created
- ///
- /// This function is called so that derived classes can
- /// perform their own specific initialization as soon as
- /// the window is created.
- ///
- ////////////////////////////////////////////////////////////
- virtual void onCreate();
-
- ////////////////////////////////////////////////////////////
- /// \brief Function called after the window has been resized
- ///
- /// This function is called so that derived classes can
- /// perform custom actions when the size of the window changes.
- ///
- ////////////////////////////////////////////////////////////
- virtual void onResize();
-
private:
////////////////////////////////////////////////////////////
@@ -542,11 +276,9 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- priv::WindowImpl* m_impl; ///< Platform-specific implementation of the window
- priv::GlContext* m_context; ///< Platform-specific implementation of the OpenGL context
- Clock m_clock; ///< Clock for measuring the elapsed time between frames
- Time m_frameTimeLimit; ///< Current framerate limit
- Vector2u m_size; ///< Current size of the window
+ priv::GlContext* m_context; //!< Platform-specific implementation of the OpenGL context
+ Clock m_clock; //!< Clock for measuring the elapsed time between frames
+ Time m_frameTimeLimit; //!< Current framerate limit
};
} // namespace sf
diff --git a/include/SFML/Window/WindowBase.hpp b/include/SFML/Window/WindowBase.hpp
new file mode 100644
index 0000000..5a3af14
--- /dev/null
+++ b/include/SFML/Window/WindowBase.hpp
@@ -0,0 +1,518 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_WINDOWBASE_HPP
+#define SFML_WINDOWBASE_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Cursor.hpp>
+#include <SFML/Window/Export.hpp>
+#include <SFML/Window/VideoMode.hpp>
+#include <SFML/Window/Vulkan.hpp>
+#include <SFML/Window/WindowHandle.hpp>
+#include <SFML/Window/WindowStyle.hpp>
+#include <SFML/System/Clock.hpp>
+#include <SFML/System/NonCopyable.hpp>
+#include <SFML/System/String.hpp>
+#include <SFML/System/Vector2.hpp>
+
+
+namespace sf
+{
+namespace priv
+{
+ class WindowImpl;
+}
+
+class Event;
+
+////////////////////////////////////////////////////////////
+/// \brief Window that serves as a base for other windows
+///
+////////////////////////////////////////////////////////////
+class SFML_WINDOW_API WindowBase : NonCopyable
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Default constructor
+ ///
+ /// This constructor doesn't actually create the window,
+ /// use the other constructors or call create() to do so.
+ ///
+ ////////////////////////////////////////////////////////////
+ WindowBase();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct a new window
+ ///
+ /// This constructor creates the window with the size and pixel
+ /// depth defined in \a mode. An optional style can be passed to
+ /// customize the look and behavior of the window (borders,
+ /// title bar, resizable, closable, ...). If \a style contains
+ /// Style::Fullscreen, then \a mode must be a valid video mode.
+ ///
+ /// \param mode Video mode to use (defines the width, height and depth of the rendering area of the window)
+ /// \param title Title of the window
+ /// \param style %Window style, a bitwise OR combination of sf::Style enumerators
+ ///
+ ////////////////////////////////////////////////////////////
+ WindowBase(VideoMode mode, const String& title, Uint32 style = Style::Default);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct the window from an existing control
+ ///
+ /// \param handle Platform-specific handle of the control
+ ///
+ ////////////////////////////////////////////////////////////
+ explicit WindowBase(WindowHandle handle);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Destructor
+ ///
+ /// Closes the window and frees all the resources attached to it.
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual ~WindowBase();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create (or recreate) the window
+ ///
+ /// If the window was already created, it closes it first.
+ /// If \a style contains Style::Fullscreen, then \a mode
+ /// must be a valid video mode.
+ ///
+ /// \param mode Video mode to use (defines the width, height and depth of the rendering area of the window)
+ /// \param title Title of the window
+ /// \param style %Window style, a bitwise OR combination of sf::Style enumerators
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void create(VideoMode mode, const String& title, Uint32 style = Style::Default);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create (or recreate) the window from an existing control
+ ///
+ /// \param handle Platform-specific handle of the control
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void create(WindowHandle handle);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Close the window and destroy all the attached resources
+ ///
+ /// After calling this function, the sf::Window instance remains
+ /// valid and you can call create() to recreate the window.
+ /// All other functions such as pollEvent() or display() will
+ /// still work (i.e. you don't have to test isOpen() every time),
+ /// and will have no effect on closed windows.
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void close();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Tell whether or not the window is open
+ ///
+ /// This function returns whether or not the window exists.
+ /// Note that a hidden window (setVisible(false)) is open
+ /// (therefore this function would return true).
+ ///
+ /// \return True if the window is open, false if it has been closed
+ ///
+ ////////////////////////////////////////////////////////////
+ bool isOpen() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Pop the event on top of the event queue, if any, and return it
+ ///
+ /// This function is not blocking: if there's no pending event then
+ /// it will return false and leave \a event unmodified.
+ /// Note that more than one event may be present in the event queue,
+ /// thus you should always call this function in a loop
+ /// to make sure that you process every pending event.
+ /// \code
+ /// sf::Event event;
+ /// while (window.pollEvent(event))
+ /// {
+ /// // process event...
+ /// }
+ /// \endcode
+ ///
+ /// \param event Event to be returned
+ ///
+ /// \return True if an event was returned, or false if the event queue was empty
+ ///
+ /// \see waitEvent
+ ///
+ ////////////////////////////////////////////////////////////
+ bool pollEvent(Event& event);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Wait for an event and return it
+ ///
+ /// This function is blocking: if there's no pending event then
+ /// it will wait until an event is received.
+ /// After this function returns (and no error occurred),
+ /// the \a event object is always valid and filled properly.
+ /// This function is typically used when you have a thread that
+ /// is dedicated to events handling: you want to make this thread
+ /// sleep as long as no new event is received.
+ /// \code
+ /// sf::Event event;
+ /// if (window.waitEvent(event))
+ /// {
+ /// // process event...
+ /// }
+ /// \endcode
+ ///
+ /// \param event Event to be returned
+ ///
+ /// \return False if any error occurred
+ ///
+ /// \see pollEvent
+ ///
+ ////////////////////////////////////////////////////////////
+ bool waitEvent(Event& event);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the position of the window
+ ///
+ /// \return Position of the window, in pixels
+ ///
+ /// \see setPosition
+ ///
+ ////////////////////////////////////////////////////////////
+ Vector2i getPosition() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Change the position of the window on screen
+ ///
+ /// This function only works for top-level windows
+ /// (i.e. it will be ignored for windows created from
+ /// the handle of a child window/control).
+ ///
+ /// \param position New position, in pixels
+ ///
+ /// \see getPosition
+ ///
+ ////////////////////////////////////////////////////////////
+ void setPosition(const Vector2i& position);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the size of the rendering region of the window
+ ///
+ /// The size doesn't include the titlebar and borders
+ /// of the window.
+ ///
+ /// \return Size in pixels
+ ///
+ /// \see setSize
+ ///
+ ////////////////////////////////////////////////////////////
+ Vector2u getSize() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Change the size of the rendering region of the window
+ ///
+ /// \param size New size, in pixels
+ ///
+ /// \see getSize
+ ///
+ ////////////////////////////////////////////////////////////
+ void setSize(const Vector2u& size);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Change the title of the window
+ ///
+ /// \param title New title
+ ///
+ /// \see setIcon
+ ///
+ ////////////////////////////////////////////////////////////
+ void setTitle(const String& title);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Change the window's icon
+ ///
+ /// \a pixels must be an array of \a width x \a height pixels
+ /// in 32-bits RGBA format.
+ ///
+ /// The OS default icon is used by default.
+ ///
+ /// \param width Icon's width, in pixels
+ /// \param height Icon's height, in pixels
+ /// \param pixels Pointer to the array of pixels in memory. The
+ /// pixels are copied, so you need not keep the
+ /// source alive after calling this function.
+ ///
+ /// \see setTitle
+ ///
+ ////////////////////////////////////////////////////////////
+ void setIcon(unsigned int width, unsigned int height, const Uint8* pixels);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Show or hide the window
+ ///
+ /// The window is shown by default.
+ ///
+ /// \param visible True to show the window, false to hide it
+ ///
+ ////////////////////////////////////////////////////////////
+ void setVisible(bool visible);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Show or hide the mouse cursor
+ ///
+ /// The mouse cursor is visible by default.
+ ///
+ /// \param visible True to show the mouse cursor, false to hide it
+ ///
+ ////////////////////////////////////////////////////////////
+ void setMouseCursorVisible(bool visible);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Grab or release the mouse cursor
+ ///
+ /// If set, grabs the mouse cursor inside this window's client
+ /// area so it may no longer be moved outside its bounds.
+ /// Note that grabbing is only active while the window has
+ /// focus.
+ ///
+ /// \param grabbed True to enable, false to disable
+ ///
+ ////////////////////////////////////////////////////////////
+ void setMouseCursorGrabbed(bool grabbed);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Set the displayed cursor to a native system cursor
+ ///
+ /// Upon window creation, the arrow cursor is used by default.
+ ///
+ /// \warning The cursor must not be destroyed while in use by
+ /// the window.
+ ///
+ /// \warning Features related to Cursor are not supported on
+ /// iOS and Android.
+ ///
+ /// \param cursor Native system cursor type to display
+ ///
+ /// \see sf::Cursor::loadFromSystem
+ /// \see sf::Cursor::loadFromPixels
+ ///
+ ////////////////////////////////////////////////////////////
+ void setMouseCursor(const Cursor& cursor);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Enable or disable automatic key-repeat
+ ///
+ /// If key repeat is enabled, you will receive repeated
+ /// KeyPressed events while keeping a key pressed. If it is disabled,
+ /// you will only get a single event when the key is pressed.
+ ///
+ /// Key repeat is enabled by default.
+ ///
+ /// \param enabled True to enable, false to disable
+ ///
+ ////////////////////////////////////////////////////////////
+ void setKeyRepeatEnabled(bool enabled);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Change the joystick threshold
+ ///
+ /// The joystick threshold is the value below which
+ /// no JoystickMoved event will be generated.
+ ///
+ /// The threshold value is 0.1 by default.
+ ///
+ /// \param threshold New threshold, in the range [0, 100]
+ ///
+ ////////////////////////////////////////////////////////////
+ void setJoystickThreshold(float threshold);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Request the current window to be made the active
+ /// foreground window
+ ///
+ /// At any given time, only one window may have the input focus
+ /// to receive input events such as keystrokes or mouse events.
+ /// If a window requests focus, it only hints to the operating
+ /// system, that it would like to be focused. The operating system
+ /// is free to deny the request.
+ /// This is not to be confused with setActive().
+ ///
+ /// \see hasFocus
+ ///
+ ////////////////////////////////////////////////////////////
+ void requestFocus();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Check whether the window has the input focus
+ ///
+ /// At any given time, only one window may have the input focus
+ /// to receive input events such as keystrokes or most mouse
+ /// events.
+ ///
+ /// \return True if window has focus, false otherwise
+ /// \see requestFocus
+ ///
+ ////////////////////////////////////////////////////////////
+ bool hasFocus() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the OS-specific handle of the window
+ ///
+ /// The type of the returned handle is sf::WindowHandle,
+ /// which is a typedef to the handle type defined by the OS.
+ /// You shouldn't need to use this function, unless you have
+ /// very specific stuff to implement that SFML doesn't support,
+ /// or implement a temporary workaround until a bug is fixed.
+ ///
+ /// \return System handle of the window
+ ///
+ ////////////////////////////////////////////////////////////
+ WindowHandle getSystemHandle() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a Vulkan rendering surface
+ ///
+ /// \param instance Vulkan instance
+ /// \param surface Created surface
+ /// \param allocator Allocator to use
+ ///
+ /// \return True if surface creation was successful, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ bool createVulkanSurface(const VkInstance& instance, VkSurfaceKHR& surface, const VkAllocationCallbacks* allocator = 0);
+
+protected:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Function called after the window has been created
+ ///
+ /// This function is called so that derived classes can
+ /// perform their own specific initialization as soon as
+ /// the window is created.
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void onCreate();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Function called after the window has been resized
+ ///
+ /// This function is called so that derived classes can
+ /// perform custom actions when the size of the window changes.
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void onResize();
+
+private:
+
+ friend class Window;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Processes an event before it is sent to the user
+ ///
+ /// This function is called every time an event is received
+ /// from the internal window (through pollEvent or waitEvent).
+ /// It filters out unwanted events, and performs whatever internal
+ /// stuff the window needs before the event is returned to the
+ /// user.
+ ///
+ /// \param event Event to filter
+ ///
+ ////////////////////////////////////////////////////////////
+ bool filterEvent(const Event& event);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Perform some common internal initializations
+ ///
+ ////////////////////////////////////////////////////////////
+ void initialize();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the fullscreen window
+ ///
+ /// \return The fullscreen window or NULL if there is none
+ ///
+ ////////////////////////////////////////////////////////////
+ const WindowBase* getFullscreenWindow();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Set a window as the fullscreen window
+ ///
+ /// \param window Window to set as fullscreen window
+ ///
+ ////////////////////////////////////////////////////////////
+ void setFullscreenWindow(const WindowBase* window);
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ priv::WindowImpl* m_impl; //!< Platform-specific implementation of the window
+ Vector2u m_size; //!< Current size of the window
+};
+
+} // namespace sf
+
+
+#endif // SFML_WINDOWBASE_HPP
+
+
+////////////////////////////////////////////////////////////
+/// \class sf::WindowBase
+/// \ingroup window
+///
+/// sf::WindowBase serves as the base class for all Windows.
+///
+/// A sf::WindowBase can create its own new window, or be embedded into
+/// an already existing control using the create(handle) function.
+///
+/// The sf::WindowBase class provides a simple interface for manipulating
+/// the window: move, resize, show/hide, control mouse cursor, etc.
+/// It also provides event handling through its pollEvent() and waitEvent()
+/// functions.
+///
+/// Usage example:
+/// \code
+/// // Declare and create a new window
+/// sf::WindowBase window(sf::VideoMode(800, 600), "SFML window");
+///
+/// // The main loop - ends as soon as the window is closed
+/// while (window.isOpen())
+/// {
+/// // Event processing
+/// sf::Event event;
+/// while (window.pollEvent(event))
+/// {
+/// // Request for closing the window
+/// if (event.type == sf::Event::Closed)
+/// window.close();
+/// }
+///
+/// // Do things with the window here...
+/// }
+/// \endcode
+///
+////////////////////////////////////////////////////////////
diff --git a/include/SFML/Window/WindowHandle.hpp b/include/SFML/Window/WindowHandle.hpp
index daad047..36da3bb 100644
--- a/include/SFML/Window/WindowHandle.hpp
+++ b/include/SFML/Window/WindowHandle.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -42,7 +42,7 @@ namespace sf
// Window handle is HWND (HWND__*) on Windows
typedef HWND__* WindowHandle;
-#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD)
+#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD)
// Window handle is Window (unsigned long) on Unix - X11
typedef unsigned long WindowHandle;
diff --git a/include/SFML/Window/WindowStyle.hpp b/include/SFML/Window/WindowStyle.hpp
index 53e2c9d..a48ab0f 100644
--- a/include/SFML/Window/WindowStyle.hpp
+++ b/include/SFML/Window/WindowStyle.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -37,13 +37,13 @@ namespace Style
////////////////////////////////////////////////////////////
enum
{
- None = 0, ///< No border / title bar (this flag and all others are mutually exclusive)
- Titlebar = 1 << 0, ///< Title bar + fixed border
- Resize = 1 << 1, ///< Title bar + resizable border + maximize button
- Close = 1 << 2, ///< Title bar + close button
- Fullscreen = 1 << 3, ///< Fullscreen mode (this flag and all others are mutually exclusive)
+ None = 0, //!< No border / title bar (this flag and all others are mutually exclusive)
+ Titlebar = 1 << 0, //!< Title bar + fixed border
+ Resize = 1 << 1, //!< Title bar + resizable border + maximize button
+ Close = 1 << 2, //!< Title bar + close button
+ Fullscreen = 1 << 3, //!< Fullscreen mode (this flag and all others are mutually exclusive)
- Default = Titlebar | Resize | Close ///< Default window style
+ Default = Titlebar | Resize | Close //!< Default window style
};
}
diff --git a/license.md b/license.md
index 0e6d7b1..7752b9d 100644
--- a/license.md
+++ b/license.md
@@ -1,6 +1,6 @@
# SFML
-SFML - Copyright (C) 2007-2018 Laurent Gomila - laurent@sfml-dev.org
+SFML - Copyright (C) 2007-2023 Laurent Gomila - laurent@sfml-dev.org
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
@@ -18,3 +18,4 @@ Permission is granted to anyone to use this software for any purpose, including
* _libogg_ is under the BSD license
* _libvorbis_ is under the BSD license
* _libflac_ is under the BSD license
+ * _minimp3_ is under the CC0 license
diff --git a/src/SFML/Audio/ALCheck.cpp b/src/SFML/Audio/ALCheck.cpp
index b6f1e2a..563a50b 100644
--- a/src/SFML/Audio/ALCheck.cpp
+++ b/src/SFML/Audio/ALCheck.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,6 +29,13 @@
#include <SFML/System/Err.hpp>
#include <string>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
namespace sf
{
diff --git a/src/SFML/Audio/ALCheck.hpp b/src/SFML/Audio/ALCheck.hpp
index c67d117..09c3fec 100644
--- a/src/SFML/Audio/ALCheck.hpp
+++ b/src/SFML/Audio/ALCheck.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -30,6 +30,16 @@
////////////////////////////////////////////////////////////
#include <SFML/Config.hpp>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
#include <al.h>
#include <alc.h>
@@ -70,3 +80,11 @@ void alCheckError(const char* file, unsigned int line, const char* expression);
#endif // SFML_ALCHECK_HPP
+
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic pop
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic pop
+ #endif
+#endif
diff --git a/src/SFML/Audio/AlResource.cpp b/src/SFML/Audio/AlResource.cpp
index 9be2e34..9aabaed 100644
--- a/src/SFML/Audio/AlResource.cpp
+++ b/src/SFML/Audio/AlResource.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Audio/AudioDevice.cpp b/src/SFML/Audio/AudioDevice.cpp
index a9472f0..ec5983e 100644
--- a/src/SFML/Audio/AudioDevice.cpp
+++ b/src/SFML/Audio/AudioDevice.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,8 +29,15 @@
#include <SFML/Audio/ALCheck.hpp>
#include <SFML/Audio/Listener.hpp>
#include <SFML/System/Err.hpp>
-#include <memory>
+#include <vector>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
namespace
{
@@ -107,9 +114,13 @@ bool AudioDevice::isExtensionSupported(const std::string& extension)
// This device will not be used in this function and merely
// makes sure there is a valid OpenAL device for extension
// queries if none has been created yet.
- std::auto_ptr<AudioDevice> device;
+ //
+ // Using an std::vector for this since auto_ptr is deprecated
+ // and we have no better STL facility for dynamically allocating
+ // a temporary instance with strong exception guarantee.
+ std::vector<AudioDevice> device;
if (!audioDevice)
- device.reset(new AudioDevice);
+ device.resize(1);
if ((extension.length() > 2) && (extension.substr(0, 3) == "ALC"))
return alcIsExtensionPresent(audioDevice, extension.c_str()) != AL_FALSE;
@@ -125,9 +136,13 @@ int AudioDevice::getFormatFromChannelCount(unsigned int channelCount)
// This device will not be used in this function and merely
// makes sure there is a valid OpenAL device for format
// queries if none has been created yet.
- std::auto_ptr<AudioDevice> device;
+ //
+ // Using an std::vector for this since auto_ptr is deprecated
+ // and we have no better STL facility for dynamically allocating
+ // a temporary instance with strong exception guarantee.
+ std::vector<AudioDevice> device;
if (!audioDevice)
- device.reset(new AudioDevice);
+ device.resize(1);
// Find the good format according to the number of channels
int format = 0;
diff --git a/src/SFML/Audio/AudioDevice.hpp b/src/SFML/Audio/AudioDevice.hpp
index f5007ed..590e839 100644
--- a/src/SFML/Audio/AudioDevice.hpp
+++ b/src/SFML/Audio/AudioDevice.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Audio/CMakeLists.txt b/src/SFML/Audio/CMakeLists.txt
index 420e13b..d27dc6d 100644
--- a/src/SFML/Audio/CMakeLists.txt
+++ b/src/SFML/Audio/CMakeLists.txt
@@ -41,6 +41,8 @@ set(CODECS_SRC
${INCROOT}/SoundFileReader.hpp
${SRCROOT}/SoundFileReaderFlac.hpp
${SRCROOT}/SoundFileReaderFlac.cpp
+ ${SRCROOT}/SoundFileReaderMp3.hpp
+ ${SRCROOT}/SoundFileReaderMp3.cpp
${SRCROOT}/SoundFileReaderOgg.hpp
${SRCROOT}/SoundFileReaderOgg.cpp
${SRCROOT}/SoundFileReaderWav.hpp
@@ -67,11 +69,11 @@ endif()
# find external libraries
sfml_find_package(OpenAL INCLUDE "OPENAL_INCLUDE_DIR" LINK "OPENAL_LIBRARY")
-sfml_find_package(Vorbis INCLUDE "VORBIS_INCLUDE_DIRS" LINK "VORBIS_LIBRARIES")
+sfml_find_package(VORBIS INCLUDE "VORBIS_INCLUDE_DIRS" LINK "VORBIS_LIBRARIES")
sfml_find_package(FLAC INCLUDE "FLAC_INCLUDE_DIR" LINK "FLAC_LIBRARY")
# avoids warnings in vorbisfile.h
-target_compile_definitions(Vorbis INTERFACE "OV_EXCLUDE_STATIC_CALLBACKS")
+target_compile_definitions(VORBIS INTERFACE "OV_EXCLUDE_STATIC_CALLBACKS")
target_compile_definitions(FLAC INTERFACE "FLAC__NO_DLL")
# define the sfml-audio target
@@ -81,10 +83,13 @@ sfml_add_library(sfml-audio
# setup dependencies
target_link_libraries(sfml-audio PRIVATE OpenAL)
+# minimp3 sources
+target_include_directories(sfml-audio SYSTEM PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/minimp3")
+
if(SFML_OS_ANDROID)
target_link_libraries(sfml-audio PRIVATE android OpenSLES)
endif()
target_link_libraries(sfml-audio
PUBLIC sfml-system
- PRIVATE Vorbis FLAC)
+ PRIVATE VORBIS FLAC)
diff --git a/src/SFML/Audio/InputSoundFile.cpp b/src/SFML/Audio/InputSoundFile.cpp
index 9cc781f..5f64314 100644
--- a/src/SFML/Audio/InputSoundFile.cpp
+++ b/src/SFML/Audio/InputSoundFile.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -32,6 +32,8 @@
#include <SFML/System/FileInputStream.hpp>
#include <SFML/System/MemoryInputStream.hpp>
#include <SFML/System/Err.hpp>
+#include <iostream>
+#include <algorithm>
namespace sf
@@ -200,7 +202,7 @@ Time InputSoundFile::getDuration() const
if (m_channelCount == 0 || m_sampleRate == 0)
return Time::Zero;
- return seconds(static_cast<float>(m_sampleCount) / m_channelCount / m_sampleRate);
+ return seconds(static_cast<float>(m_sampleCount) / static_cast<float>(m_channelCount) / static_cast<float>(m_sampleRate));
}
@@ -211,7 +213,7 @@ Time InputSoundFile::getTimeOffset() const
if (m_channelCount == 0 || m_sampleRate == 0)
return Time::Zero;
- return seconds(static_cast<float>(m_sampleOffset) / m_channelCount / m_sampleRate);
+ return seconds(static_cast<float>(m_sampleOffset) / static_cast<float>(m_channelCount) / static_cast<float>(m_sampleRate));
}
@@ -225,11 +227,11 @@ Uint64 InputSoundFile::getSampleOffset() const
////////////////////////////////////////////////////////////
void InputSoundFile::seek(Uint64 sampleOffset)
{
- if (m_reader)
+ if (m_reader && m_channelCount != 0)
{
// The reader handles an overrun gracefully, but we
// pre-check to keep our known position consistent
- m_sampleOffset = std::min(sampleOffset, m_sampleCount);
+ m_sampleOffset = std::min(sampleOffset / m_channelCount * m_channelCount, m_sampleCount);
m_reader->seek(m_sampleOffset);
}
}
@@ -238,7 +240,7 @@ void InputSoundFile::seek(Uint64 sampleOffset)
////////////////////////////////////////////////////////////
void InputSoundFile::seek(Time timeOffset)
{
- seek(static_cast<Uint64>(timeOffset.asSeconds() * m_sampleRate * m_channelCount));
+ seek(static_cast<Uint64>(timeOffset.asSeconds() * static_cast<float>(m_sampleRate)) * m_channelCount);
}
diff --git a/src/SFML/Audio/Listener.cpp b/src/SFML/Audio/Listener.cpp
index dc348f9..962b77d 100644
--- a/src/SFML/Audio/Listener.cpp
+++ b/src/SFML/Audio/Listener.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Audio/Music.cpp b/src/SFML/Audio/Music.cpp
index 141d690..2306afd 100644
--- a/src/SFML/Audio/Music.cpp
+++ b/src/SFML/Audio/Music.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -30,7 +30,15 @@
#include <SFML/System/Lock.hpp>
#include <SFML/System/Err.hpp>
#include <fstream>
+#include <algorithm>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
namespace sf
{
@@ -219,7 +227,7 @@ Int64 Music::onLoop()
// Looping is enabled, and either we're at the loop end, or we're at the EOF
// when it's equivalent to the loop end (loop end takes priority). Send us to loop begin
m_file.seek(m_loopSpan.offset);
- return m_file.getSampleOffset();
+ return static_cast<Int64>(m_file.getSampleOffset());
}
else if (getLoop() && (currentOffset >= m_file.getSampleCount()))
{
@@ -252,7 +260,7 @@ Uint64 Music::timeToSamples(Time position) const
// This avoids most precision errors arising from "samples => Time => samples" conversions
// Original rounding calculation is ((Micros * Freq * Channels) / 1000000) + 0.5
// We refactor it to keep Int64 as the data type throughout the whole operation.
- return ((position.asMicroseconds() * getSampleRate() * getChannelCount()) + 500000) / 1000000;
+ return ((static_cast<Uint64>(position.asMicroseconds()) * getSampleRate() * getChannelCount()) + 500000) / 1000000;
}
@@ -263,7 +271,7 @@ Time Music::samplesToTime(Uint64 samples) const
// Make sure we don't divide by 0
if (getSampleRate() != 0 && getChannelCount() != 0)
- position = microseconds((samples * 1000000) / (getChannelCount() * getSampleRate()));
+ position = microseconds(static_cast<Int64>((samples * 1000000) / (getChannelCount() * getSampleRate())));
return position;
}
diff --git a/src/SFML/Audio/OutputSoundFile.cpp b/src/SFML/Audio/OutputSoundFile.cpp
index 16e41d3..069fb98 100644
--- a/src/SFML/Audio/OutputSoundFile.cpp
+++ b/src/SFML/Audio/OutputSoundFile.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Audio/Sound.cpp b/src/SFML/Audio/Sound.cpp
index b7a0b13..3a99608 100644
--- a/src/SFML/Audio/Sound.cpp
+++ b/src/SFML/Audio/Sound.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,6 +29,13 @@
#include <SFML/Audio/SoundBuffer.hpp>
#include <SFML/Audio/ALCheck.hpp>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
namespace sf
{
@@ -101,7 +108,7 @@ void Sound::setBuffer(const SoundBuffer& buffer)
// Assign and use the new buffer
m_buffer = &buffer;
m_buffer->attachSound(this);
- alCheck(alSourcei(m_source, AL_BUFFER, m_buffer->m_buffer));
+ alCheck(alSourcei(m_source, AL_BUFFER, static_cast<ALint>(m_buffer->m_buffer)));
}
@@ -160,6 +167,10 @@ Sound& Sound::operator =(const Sound& right)
// the list of sound instances contained in the buffers and unnecessarily
// destroy/create OpenAL sound sources
+ // Handle self-assignment here, as no copy-and-swap idiom is being used
+ if (this == &right)
+ return *this;
+
// Delegate to base class, which copies all the sound attributes
SoundSource::operator=(right);
diff --git a/src/SFML/Audio/SoundBuffer.cpp b/src/SFML/Audio/SoundBuffer.cpp
index edcd455..67b68a5 100644
--- a/src/SFML/Audio/SoundBuffer.cpp
+++ b/src/SFML/Audio/SoundBuffer.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -34,6 +34,13 @@
#include <SFML/System/Err.hpp>
#include <memory>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
namespace sf
{
@@ -179,7 +186,7 @@ unsigned int SoundBuffer::getSampleRate() const
ALint sampleRate;
alCheck(alGetBufferi(m_buffer, AL_FREQUENCY, &sampleRate));
- return sampleRate;
+ return static_cast<unsigned int>(sampleRate);
}
@@ -189,7 +196,7 @@ unsigned int SoundBuffer::getChannelCount() const
ALint channelCount;
alCheck(alGetBufferi(m_buffer, AL_CHANNELS, &channelCount));
- return channelCount;
+ return static_cast<unsigned int>(channelCount);
}
@@ -261,11 +268,11 @@ bool SoundBuffer::update(unsigned int channelCount, unsigned int sampleRate)
(*it)->resetBuffer();
// Fill the buffer
- ALsizei size = static_cast<ALsizei>(m_samples.size()) * sizeof(Int16);
- alCheck(alBufferData(m_buffer, format, &m_samples[0], size, sampleRate));
+ ALsizei size = static_cast<ALsizei>(m_samples.size() * sizeof(Int16));
+ alCheck(alBufferData(m_buffer, format, &m_samples[0], size, static_cast<ALsizei>(sampleRate)));
// Compute the duration
- m_duration = seconds(static_cast<float>(m_samples.size()) / sampleRate / channelCount);
+ m_duration = seconds(static_cast<float>(m_samples.size()) / static_cast<float>(sampleRate) / static_cast<float>(channelCount));
// Now reattach the buffer to the sounds that use it
for (SoundList::const_iterator it = sounds.begin(); it != sounds.end(); ++it)
diff --git a/src/SFML/Audio/SoundBufferRecorder.cpp b/src/SFML/Audio/SoundBufferRecorder.cpp
index 3c70a65..6c51bcc 100644
--- a/src/SFML/Audio/SoundBufferRecorder.cpp
+++ b/src/SFML/Audio/SoundBufferRecorder.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Audio/SoundFileFactory.cpp b/src/SFML/Audio/SoundFileFactory.cpp
index 8138319..91fc244 100644
--- a/src/SFML/Audio/SoundFileFactory.cpp
+++ b/src/SFML/Audio/SoundFileFactory.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -28,6 +28,7 @@
#include <SFML/Audio/SoundFileFactory.hpp>
#include <SFML/Audio/SoundFileReaderFlac.hpp>
#include <SFML/Audio/SoundFileWriterFlac.hpp>
+#include <SFML/Audio/SoundFileReaderMp3.hpp>
#include <SFML/Audio/SoundFileReaderOgg.hpp>
#include <SFML/Audio/SoundFileWriterOgg.hpp>
#include <SFML/Audio/SoundFileReaderWav.hpp>
@@ -47,6 +48,7 @@ namespace
{
sf::SoundFileFactory::registerReader<sf::priv::SoundFileReaderFlac>();
sf::SoundFileFactory::registerWriter<sf::priv::SoundFileWriterFlac>();
+ sf::SoundFileFactory::registerReader<sf::priv::SoundFileReaderMp3>();
sf::SoundFileFactory::registerReader<sf::priv::SoundFileReaderOgg>();
sf::SoundFileFactory::registerWriter<sf::priv::SoundFileWriterOgg>();
sf::SoundFileFactory::registerReader<sf::priv::SoundFileReaderWav>();
diff --git a/src/SFML/Audio/SoundFileReaderFlac.cpp b/src/SFML/Audio/SoundFileReaderFlac.cpp
index f42a132..6666403 100644
--- a/src/SFML/Audio/SoundFileReaderFlac.cpp
+++ b/src/SFML/Audio/SoundFileReaderFlac.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -37,7 +37,7 @@ namespace
{
sf::priv::SoundFileReaderFlac::ClientData* data = static_cast<sf::priv::SoundFileReaderFlac::ClientData*>(clientData);
- sf::Int64 count = data->stream->read(buffer, *bytes);
+ sf::Int64 count = data->stream->read(buffer, static_cast<sf::Int64>(*bytes));
if (count > 0)
{
*bytes = static_cast<std::size_t>(count);
@@ -57,7 +57,7 @@ namespace
{
sf::priv::SoundFileReaderFlac::ClientData* data = static_cast<sf::priv::SoundFileReaderFlac::ClientData*>(clientData);
- sf::Int64 position = data->stream->seek(absoluteByteOffset);
+ sf::Int64 position = data->stream->seek(static_cast<sf::Int64>(absoluteByteOffset));
if (position >= 0)
return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
else
@@ -71,7 +71,7 @@ namespace
sf::Int64 position = data->stream->tell();
if (position >= 0)
{
- *absoluteByteOffset = position;
+ *absoluteByteOffset = static_cast<FLAC__uint64>(position);
return FLAC__STREAM_DECODER_TELL_STATUS_OK;
}
else
@@ -87,7 +87,7 @@ namespace
sf::Int64 count = data->stream->getSize();
if (count >= 0)
{
- *streamLength = count;
+ *streamLength = static_cast<FLAC__uint64>(count);
return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
}
else
@@ -122,16 +122,16 @@ namespace
switch (frame->header.bits_per_sample)
{
case 8:
- sample = buffer[j][i] << 8;
+ sample = static_cast<sf::Int16>(buffer[j][i] << 8);
break;
case 16:
- sample = buffer[j][i];
+ sample = static_cast<sf::Int16>(buffer[j][i]);
break;
case 24:
- sample = buffer[j][i] >> 8;
+ sample = static_cast<sf::Int16>(buffer[j][i] >> 8);
break;
case 32:
- sample = buffer[j][i] >> 16;
+ sample = static_cast<sf::Int16>(buffer[j][i] >> 16);
break;
default:
assert(false);
@@ -290,8 +290,8 @@ Uint64 SoundFileReaderFlac::read(Int16* samples, Uint64 maxCount)
if (left > maxCount)
{
// There are more leftovers than needed
- std::copy(m_clientData.leftovers.begin(), m_clientData.leftovers.begin() + static_cast<std::size_t>(maxCount), samples);
- std::vector<Int16> leftovers(m_clientData.leftovers.begin() + static_cast<std::size_t>(maxCount), m_clientData.leftovers.end());
+ std::copy(m_clientData.leftovers.begin(), m_clientData.leftovers.begin() + static_cast<std::vector<Int16>::difference_type>(maxCount), samples);
+ std::vector<Int16> leftovers(m_clientData.leftovers.begin() + static_cast<std::vector<Int16>::difference_type>(maxCount), m_clientData.leftovers.end());
m_clientData.leftovers.swap(leftovers);
return maxCount;
}
diff --git a/src/SFML/Audio/SoundFileReaderFlac.hpp b/src/SFML/Audio/SoundFileReaderFlac.hpp
index 6cb0b86..d0a4010 100644
--- a/src/SFML/Audio/SoundFileReaderFlac.hpp
+++ b/src/SFML/Audio/SoundFileReaderFlac.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -132,8 +132,8 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- FLAC__StreamDecoder* m_decoder; ///< FLAC decoder
- ClientData m_clientData; ///< Structure passed to the decoder callbacks
+ FLAC__StreamDecoder* m_decoder; //!< FLAC decoder
+ ClientData m_clientData; //!< Structure passed to the decoder callbacks
};
} // namespace priv
diff --git a/src/SFML/Audio/SoundFileReaderMp3.cpp b/src/SFML/Audio/SoundFileReaderMp3.cpp
new file mode 100644
index 0000000..817cb4c
--- /dev/null
+++ b/src/SFML/Audio/SoundFileReaderMp3.cpp
@@ -0,0 +1,164 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#define MINIMP3_IMPLEMENTATION // Minimp3 control define, places implementation in this file.
+#ifndef NOMINMAX
+#define NOMINMAX // To avoid windows.h and std::min issue
+#endif
+#define MINIMP3_NO_STDIO // Minimp3 control define, eliminate file manipulation code which is useless here
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4242 4244 4267 4456 4706)
+#else
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstringop-overflow"
+#endif
+
+#include <minimp3_ex.h>
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#else
+#pragma GCC diagnostic pop
+#endif
+
+#undef NOMINMAX
+#undef MINIMP3_NO_STDIO
+
+#include <SFML/Audio/SoundFileReaderMp3.hpp>
+#include <SFML/System/InputStream.hpp>
+#include <SFML/System/Err.hpp>
+#include <algorithm>
+#include <cstring>
+#include <stdint.h>
+
+
+namespace
+{
+std::size_t readCallback(void* ptr, std::size_t size, void* data)
+{
+ sf::InputStream* stream = static_cast<sf::InputStream*>(data);
+ return static_cast<std::size_t>(stream->read(ptr, static_cast<sf::Int64>(size)));
+}
+
+int seekCallback(uint64_t offset, void* data)
+{
+ sf::InputStream* stream = static_cast<sf::InputStream*>(data);
+ sf::Int64 position = stream->seek(static_cast<sf::Int64>(offset));
+ return position < 0 ? -1 : 0;
+}
+
+bool hasValidId3Tag(const sf::Uint8* header)
+{
+ return std::memcmp(header, "ID3", 3) == 0 && !((header[5] & 15) || (header[6] & 0x80) || (header[7] & 0x80) || (header[8] & 0x80) || (header[9] & 0x80));
+}
+}
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+bool SoundFileReaderMp3::check(InputStream& stream)
+{
+ Uint8 header[10];
+
+ if (static_cast<std::size_t>(stream.read(header, static_cast<Int64>(sizeof(header)))) < sizeof(header))
+ return false;
+
+ if (hasValidId3Tag(header))
+ return true;
+
+ if (hdr_valid(header))
+ return true;
+
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////
+SoundFileReaderMp3::SoundFileReaderMp3() :
+m_numSamples(0),
+m_position(0)
+{
+ std::memset(&m_io, 0, sizeof(m_io));
+ std::memset(&m_decoder, 0, sizeof(m_decoder));
+ m_io.read = readCallback;
+ m_io.seek = seekCallback;
+}
+
+
+////////////////////////////////////////////////////////////
+SoundFileReaderMp3::~SoundFileReaderMp3()
+{
+ mp3dec_ex_close(&m_decoder);
+}
+
+
+////////////////////////////////////////////////////////////
+bool SoundFileReaderMp3::open(InputStream& stream, Info& info)
+{
+ // Init IO callbacks
+ m_io.read_data = &stream;
+ m_io.seek_data = &stream;
+
+ // Init mp3 decoder
+ mp3dec_ex_open_cb(&m_decoder, &m_io, MP3D_SEEK_TO_SAMPLE);
+ if (!m_decoder.samples)
+ return false;
+
+ // Retrieve the music attributes
+ info.channelCount = static_cast<unsigned int>(m_decoder.info.channels);
+ info.sampleRate = static_cast<unsigned int>(m_decoder.info.hz);
+ info.sampleCount = m_decoder.samples;
+
+ m_numSamples = info.sampleCount;
+ return true;
+}
+
+
+////////////////////////////////////////////////////////////
+void SoundFileReaderMp3::seek(Uint64 sampleOffset)
+{
+ m_position = std::min(sampleOffset, m_numSamples);
+ mp3dec_ex_seek(&m_decoder, m_position);
+}
+
+
+////////////////////////////////////////////////////////////
+Uint64 SoundFileReaderMp3::read(Int16* samples, Uint64 maxCount)
+{
+ Uint64 toRead = std::min(maxCount, m_numSamples - m_position);
+ toRead = static_cast<Uint64>(mp3dec_ex_read(&m_decoder, samples, static_cast<std::size_t>(toRead)));
+ m_position += toRead;
+ return toRead;
+}
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Audio/SoundFileReaderMp3.hpp b/src/SFML/Audio/SoundFileReaderMp3.hpp
new file mode 100644
index 0000000..9af7b49
--- /dev/null
+++ b/src/SFML/Audio/SoundFileReaderMp3.hpp
@@ -0,0 +1,143 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_SOUNDFILEREADERMP3_HPP
+#define SFML_SOUNDFILEREADERMP3_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#ifndef NOMINMAX
+#define NOMINMAX // To avoid windows.h and std::min issue
+#endif
+#define MINIMP3_NO_STDIO // Minimp3 control define, eliminate file manipulation code which is useless here
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4242 4244 4267 4456 4706)
+#endif
+
+#include <minimp3_ex.h>
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#undef NOMINMAX
+#undef MINIMP3_NO_STDIO
+
+#include <SFML/Audio/SoundFileReader.hpp>
+#include <vector>
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+/// \brief Implementation of sound file reader that handles MP3 files
+///
+////////////////////////////////////////////////////////////
+class SoundFileReaderMp3 : public SoundFileReader
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Check if this reader can handle a file given by an input stream
+ ///
+ /// \param stream Source stream to check
+ ///
+ /// \return True if the file is supported by this reader
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool check(InputStream& stream);
+
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Default constructor
+ ///
+ ////////////////////////////////////////////////////////////
+ SoundFileReaderMp3();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Destructor
+ ///
+ ////////////////////////////////////////////////////////////
+ ~SoundFileReaderMp3();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Open a sound file for reading
+ ///
+ /// \param stream Source stream to read from
+ /// \param info Structure to fill with the properties of the loaded sound
+ ///
+ /// \return True if the file was successfully opened
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool open(InputStream& stream, Info& info);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Change the current read position to the given sample offset
+ ///
+ /// The sample offset takes the channels into account.
+ /// If you have a time offset instead, you can easily find
+ /// the corresponding sample offset with the following formula:
+ /// `timeInSeconds * sampleRate * channelCount`
+ /// If the given offset exceeds to total number of samples,
+ /// this function must jump to the end of the file.
+ ///
+ /// \param sampleOffset Index of the sample to jump to, relative to the beginning
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void seek(Uint64 sampleOffset);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Read audio samples from the open file
+ ///
+ /// \param samples Pointer to the sample array to fill
+ /// \param maxCount Maximum number of samples to read
+ ///
+ /// \return Number of samples actually read (may be less than \a maxCount)
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual Uint64 read(Int16* samples, Uint64 maxCount);
+
+private:
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ mp3dec_io_t m_io;
+ mp3dec_ex_t m_decoder;
+ Uint64 m_numSamples; // Decompressed audio storage size
+ Uint64 m_position; // Position in decompressed audio buffer
+};
+
+} // namespace priv
+
+} // namespace sf
+
+
+#endif // SFML_SOUNDFILEREADERMP3_HPP
diff --git a/src/SFML/Audio/SoundFileReaderOgg.cpp b/src/SFML/Audio/SoundFileReaderOgg.cpp
index 183e3b2..b778520 100644
--- a/src/SFML/Audio/SoundFileReaderOgg.cpp
+++ b/src/SFML/Audio/SoundFileReaderOgg.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -38,7 +38,7 @@ namespace
size_t read(void* ptr, size_t size, size_t nmemb, void* data)
{
sf::InputStream* stream = static_cast<sf::InputStream*>(data);
- return static_cast<std::size_t>(stream->read(ptr, size * nmemb));
+ return static_cast<std::size_t>(stream->read(ptr, static_cast<sf::Int64>(size * nmemb)));
}
int seek(void* data, ogg_int64_t offset, int whence)
@@ -115,8 +115,8 @@ bool SoundFileReaderOgg::open(InputStream& stream, Info& info)
// Retrieve the music attributes
vorbis_info* vorbisInfo = ov_info(&m_vorbis, -1);
- info.channelCount = vorbisInfo->channels;
- info.sampleRate = vorbisInfo->rate;
+ info.channelCount = static_cast<unsigned int>(vorbisInfo->channels);
+ info.sampleRate = static_cast<unsigned int>(vorbisInfo->rate);
info.sampleCount = static_cast<std::size_t>(ov_pcm_total(&m_vorbis, -1) * vorbisInfo->channels);
// We must keep the channel count for the seek function
@@ -131,7 +131,7 @@ void SoundFileReaderOgg::seek(Uint64 sampleOffset)
{
assert(m_vorbis.datasource);
- ov_pcm_seek(&m_vorbis, sampleOffset / m_channelCount);
+ ov_pcm_seek(&m_vorbis, static_cast<ogg_int64_t>(sampleOffset / m_channelCount));
}
@@ -144,12 +144,12 @@ Uint64 SoundFileReaderOgg::read(Int16* samples, Uint64 maxCount)
Uint64 count = 0;
while (count < maxCount)
{
- int bytesToRead = static_cast<int>(maxCount - count) * sizeof(Int16);
+ int bytesToRead = static_cast<int>(maxCount - count) * static_cast<int>(sizeof(Int16));
long bytesRead = ov_read(&m_vorbis, reinterpret_cast<char*>(samples), bytesToRead, 0, 2, 1, NULL);
if (bytesRead > 0)
{
- long samplesRead = bytesRead / sizeof(Int16);
- count += samplesRead;
+ long samplesRead = bytesRead / static_cast<long>(sizeof(Int16));
+ count += static_cast<Uint64>(samplesRead);
samples += samplesRead;
}
else
diff --git a/src/SFML/Audio/SoundFileReaderOgg.hpp b/src/SFML/Audio/SoundFileReaderOgg.hpp
index 0e84e8f..c643534 100644
--- a/src/SFML/Audio/SoundFileReaderOgg.hpp
+++ b/src/SFML/Audio/SoundFileReaderOgg.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Audio/SoundFileReaderWav.cpp b/src/SFML/Audio/SoundFileReaderWav.cpp
index 84d92c1..b5df180 100644
--- a/src/SFML/Audio/SoundFileReaderWav.cpp
+++ b/src/SFML/Audio/SoundFileReaderWav.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -41,16 +41,16 @@ namespace
bool decode(sf::InputStream& stream, sf::Uint8& value)
{
- return stream.read(&value, sizeof(value)) == sizeof(value);
+ return static_cast<std::size_t>(stream.read(&value, sizeof(value))) == sizeof(value);
}
bool decode(sf::InputStream& stream, sf::Int16& value)
{
unsigned char bytes[sizeof(value)];
- if (stream.read(bytes, sizeof(bytes)) != sizeof(bytes))
+ if (static_cast<std::size_t>(stream.read(bytes, static_cast<sf::Int64>(sizeof(bytes)))) != sizeof(bytes))
return false;
- value = bytes[0] | (bytes[1] << 8);
+ value = static_cast<sf::Int16>(bytes[0] | (bytes[1] << 8));
return true;
}
@@ -58,10 +58,10 @@ namespace
bool decode(sf::InputStream& stream, sf::Uint16& value)
{
unsigned char bytes[sizeof(value)];
- if (stream.read(bytes, sizeof(bytes)) != sizeof(bytes))
+ if (static_cast<std::size_t>(stream.read(bytes, static_cast<sf::Int64>(sizeof(bytes)))) != sizeof(bytes))
return false;
- value = bytes[0] | (bytes[1] << 8);
+ value = static_cast<sf::Uint16>(bytes[0] | (bytes[1] << 8));
return true;
}
@@ -69,10 +69,10 @@ namespace
bool decode24bit(sf::InputStream& stream, sf::Uint32& value)
{
unsigned char bytes[3];
- if (stream.read(bytes, sizeof(bytes)) != sizeof(bytes))
+ if (static_cast<std::size_t>(stream.read(bytes, static_cast<sf::Int64>(sizeof(bytes)))) != sizeof(bytes))
return false;
- value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16);
+ value = static_cast<sf::Uint32>(bytes[0] | (bytes[1] << 8) | (bytes[2] << 16));
return true;
}
@@ -80,10 +80,10 @@ namespace
bool decode(sf::InputStream& stream, sf::Uint32& value)
{
unsigned char bytes[sizeof(value)];
- if (stream.read(bytes, sizeof(bytes)) != sizeof(bytes))
+ if (static_cast<std::size_t>(stream.read(bytes, static_cast<sf::Int64>(sizeof(bytes)))) != sizeof(bytes))
return false;
- value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
+ value = static_cast<sf::Uint32>(bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24));
return true;
}
@@ -145,7 +145,7 @@ void SoundFileReaderWav::seek(Uint64 sampleOffset)
{
assert(m_stream);
- m_stream->seek(m_dataStart + sampleOffset * m_bytesPerSample);
+ m_stream->seek(static_cast<Int64>(m_dataStart + sampleOffset * m_bytesPerSample));
}
@@ -155,7 +155,7 @@ Uint64 SoundFileReaderWav::read(Int16* samples, Uint64 maxCount)
assert(m_stream);
Uint64 count = 0;
- Uint64 startPos = m_stream->tell();
+ Uint64 startPos = static_cast<Uint64>(m_stream->tell());
// Tracking of m_dataEnd is important to prevent sf::Music from reading
// data until EOF, as WAV files may have metadata at the end.
@@ -167,7 +167,7 @@ Uint64 SoundFileReaderWav::read(Int16* samples, Uint64 maxCount)
{
Uint8 sample = 0;
if (decode(*m_stream, sample))
- *samples++ = (static_cast<Int16>(sample) - 128) << 8;
+ *samples++ = static_cast<Int16>((static_cast<Int16>(sample) - 128) << 8);
else
return count;
break;
@@ -187,7 +187,7 @@ Uint64 SoundFileReaderWav::read(Int16* samples, Uint64 maxCount)
{
Uint32 sample = 0;
if (decode24bit(*m_stream, sample))
- *samples++ = sample >> 8;
+ *samples++ = static_cast<Int16>(sample >> 8);
else
return count;
break;
@@ -197,7 +197,7 @@ Uint64 SoundFileReaderWav::read(Int16* samples, Uint64 maxCount)
{
Uint32 sample = 0;
if (decode(*m_stream, sample))
- *samples++ = sample >> 16;
+ *samples++ = static_cast<Int16>(sample >> 16);
else
return count;
break;
@@ -225,7 +225,7 @@ bool SoundFileReaderWav::parseHeader(Info& info)
// If we are here, it means that the first part of the header
// (the format) has already been checked
char mainChunk[mainChunkSize];
- if (m_stream->read(mainChunk, sizeof(mainChunk)) != sizeof(mainChunk))
+ if (static_cast<std::size_t>(m_stream->read(mainChunk, static_cast<Int64>(sizeof(mainChunk)))) != sizeof(mainChunk))
return false;
// Parse all the sub-chunks
@@ -234,7 +234,7 @@ bool SoundFileReaderWav::parseHeader(Info& info)
{
// Parse the sub-chunk id and size
char subChunkId[4];
- if (m_stream->read(subChunkId, sizeof(subChunkId)) != sizeof(subChunkId))
+ if (static_cast<std::size_t>(m_stream->read(subChunkId, static_cast<Int64>(sizeof(subChunkId)))) != sizeof(subChunkId))
return false;
Uint32 subChunkSize = 0;
if (!decode(*m_stream, subChunkSize))
@@ -307,7 +307,7 @@ bool SoundFileReaderWav::parseHeader(Info& info)
// Subformat
char subformat[16];
- if (m_stream->read(subformat, sizeof(subformat)) != sizeof(subformat))
+ if (static_cast<std::size_t>(m_stream->read(subformat, static_cast<Int64>(sizeof(subformat)))) != sizeof(subformat))
return false;
if (std::memcmp(subformat, waveSubformatPcm, sizeof(subformat)) != 0)
@@ -336,7 +336,7 @@ bool SoundFileReaderWav::parseHeader(Info& info)
info.sampleCount = subChunkSize / m_bytesPerSample;
// Store the start and end position of samples in the file
- m_dataStart = subChunkStart;
+ m_dataStart = static_cast<Uint64>(subChunkStart);
m_dataEnd = m_dataStart + info.sampleCount * m_bytesPerSample;
dataChunkFound = true;
diff --git a/src/SFML/Audio/SoundFileReaderWav.hpp b/src/SFML/Audio/SoundFileReaderWav.hpp
index 65adb8d..263194f 100644
--- a/src/SFML/Audio/SoundFileReaderWav.hpp
+++ b/src/SFML/Audio/SoundFileReaderWav.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -112,10 +112,10 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- InputStream* m_stream; ///< Source stream to read from
- unsigned int m_bytesPerSample; ///< Size of a sample, in bytes
- Uint64 m_dataStart; ///< Starting position of the audio data in the open file
- Uint64 m_dataEnd; ///< Position one byte past the end of the audio data in the open file
+ InputStream* m_stream; //!< Source stream to read from
+ unsigned int m_bytesPerSample; //!< Size of a sample, in bytes
+ Uint64 m_dataStart; //!< Starting position of the audio data in the open file
+ Uint64 m_dataEnd; //!< Position one byte past the end of the audio data in the open file
};
} // namespace priv
diff --git a/src/SFML/Audio/SoundFileWriterFlac.cpp b/src/SFML/Audio/SoundFileWriterFlac.cpp
index 045d086..016e9cb 100644
--- a/src/SFML/Audio/SoundFileWriterFlac.cpp
+++ b/src/SFML/Audio/SoundFileWriterFlac.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -32,6 +32,14 @@
#include <cassert>
+namespace
+{
+ unsigned char toLower(unsigned char character)
+ {
+ return static_cast<unsigned char>(std::tolower(character));
+ }
+}
+
namespace sf
{
namespace priv
@@ -39,8 +47,8 @@ namespace priv
////////////////////////////////////////////////////////////
bool SoundFileWriterFlac::check(const std::string& filename)
{
- std::string extension = filename.substr(filename.find_last_of(".") + 1);
- std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
+ std::string extension = filename.substr(filename.find_last_of('.') + 1);
+ std::transform(extension.begin(), extension.end(), extension.begin(), toLower);
return extension == "flac";
}
diff --git a/src/SFML/Audio/SoundFileWriterFlac.hpp b/src/SFML/Audio/SoundFileWriterFlac.hpp
index b6382e0..73d4be5 100644
--- a/src/SFML/Audio/SoundFileWriterFlac.hpp
+++ b/src/SFML/Audio/SoundFileWriterFlac.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -101,9 +101,9 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- FLAC__StreamEncoder* m_encoder; ///< FLAC stream encoder
- unsigned int m_channelCount; ///< Number of channels
- std::vector<Int32> m_samples32; ///< Conversion buffer
+ FLAC__StreamEncoder* m_encoder; //!< FLAC stream encoder
+ unsigned int m_channelCount; //!< Number of channels
+ std::vector<Int32> m_samples32; //!< Conversion buffer
};
} // namespace priv
diff --git a/src/SFML/Audio/SoundFileWriterOgg.cpp b/src/SFML/Audio/SoundFileWriterOgg.cpp
index 56e2ac7..82493ff 100644
--- a/src/SFML/Audio/SoundFileWriterOgg.cpp
+++ b/src/SFML/Audio/SoundFileWriterOgg.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -33,6 +33,14 @@
#include <cassert>
+namespace
+{
+ unsigned char toLower(unsigned char character)
+ {
+ return static_cast<unsigned char>(std::tolower(character));
+ }
+}
+
namespace sf
{
namespace priv
@@ -40,8 +48,8 @@ namespace priv
////////////////////////////////////////////////////////////
bool SoundFileWriterOgg::check(const std::string& filename)
{
- std::string extension = filename.substr(filename.find_last_of(".") + 1);
- std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
+ std::string extension = filename.substr(filename.find_last_of('.') + 1);
+ std::transform(extension.begin(), extension.end(), extension.begin(), toLower);
return extension == "ogg";
}
@@ -77,7 +85,7 @@ bool SoundFileWriterOgg::open(const std::string& filename, unsigned int sampleRa
// Setup the encoder: VBR, automatic bitrate management
// Quality is in range [-1 .. 1], 0.4 gives ~128 kbps for a 44 KHz stereo sound
- int status = vorbis_encode_init_vbr(&m_vorbis, channelCount, sampleRate, 0.4f);
+ int status = vorbis_encode_init_vbr(&m_vorbis, static_cast<long>(channelCount), static_cast<long>(sampleRate), 0.4f);
if (status < 0)
{
err() << "Failed to write ogg/vorbis file \"" << filename << "\" (unsupported bitrate)" << std::endl;
@@ -149,7 +157,7 @@ void SoundFileWriterOgg::write(const Int16* samples, Uint64 count)
// Tell the library how many samples we've written
vorbis_analysis_wrote(&m_state, std::min(frameCount, bufferSize));
-
+
frameCount -= bufferSize;
// Flush any produced block
diff --git a/src/SFML/Audio/SoundFileWriterOgg.hpp b/src/SFML/Audio/SoundFileWriterOgg.hpp
index 4b4d19b..1ab721a 100644
--- a/src/SFML/Audio/SoundFileWriterOgg.hpp
+++ b/src/SFML/Audio/SoundFileWriterOgg.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Audio/SoundFileWriterWav.cpp b/src/SFML/Audio/SoundFileWriterWav.cpp
index 153e148..60d5204 100644
--- a/src/SFML/Audio/SoundFileWriterWav.cpp
+++ b/src/SFML/Audio/SoundFileWriterWav.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -68,6 +68,11 @@ namespace
};
stream.write(reinterpret_cast<const char*>(bytes), sizeof(bytes));
}
+
+ unsigned char toLower(unsigned char character)
+ {
+ return static_cast<unsigned char>(std::tolower(character));
+ }
}
namespace sf
@@ -77,8 +82,8 @@ namespace priv
////////////////////////////////////////////////////////////
bool SoundFileWriterWav::check(const std::string& filename)
{
- std::string extension = filename.substr(filename.find_last_of(".") + 1);
- std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
+ std::string extension = filename.substr(filename.find_last_of('.') + 1);
+ std::transform(extension.begin(), extension.end(), extension.begin(), toLower);
return extension == "wav";
}
@@ -157,10 +162,10 @@ bool SoundFileWriterWav::writeHeader(unsigned int sampleRate, unsigned int chann
// Write the sound attributes
encode(m_file, static_cast<Uint16>(channelCount));
- encode(m_file, static_cast<Uint32>(sampleRate));
+ encode(m_file, sampleRate);
Uint32 byteRate = sampleRate * channelCount * 2;
encode(m_file, byteRate);
- Uint16 blockAlign = channelCount * 2;
+ Uint16 blockAlign = static_cast<Uint16>(channelCount * 2);
encode(m_file, blockAlign);
Uint16 bitsPerSample = 16;
encode(m_file, bitsPerSample);
diff --git a/src/SFML/Audio/SoundFileWriterWav.hpp b/src/SFML/Audio/SoundFileWriterWav.hpp
index d8dcc17..8f92d7e 100644
--- a/src/SFML/Audio/SoundFileWriterWav.hpp
+++ b/src/SFML/Audio/SoundFileWriterWav.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -112,7 +112,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- std::ofstream m_file; ///< File stream to write to
+ std::ofstream m_file; //!< File stream to write to
};
} // namespace priv
diff --git a/src/SFML/Audio/SoundRecorder.cpp b/src/SFML/Audio/SoundRecorder.cpp
index 4281b98..54d249a 100644
--- a/src/SFML/Audio/SoundRecorder.cpp
+++ b/src/SFML/Audio/SoundRecorder.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -37,6 +37,13 @@
#pragma warning(disable: 4355) // 'this' used in base member initializer list
#endif
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
namespace
{
@@ -91,7 +98,7 @@ bool SoundRecorder::start(unsigned int sampleRate)
ALCenum format = (m_channelCount == 1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
// Open the capture device for capturing 16 bits samples
- captureDevice = alcCaptureOpenDevice(m_deviceName.c_str(), sampleRate, format, sampleRate);
+ captureDevice = alcCaptureOpenDevice(m_deviceName.c_str(), sampleRate, format, static_cast<ALCsizei>(sampleRate));
if (!captureDevice)
{
err() << "Failed to open the audio capture device with the name: " << m_deviceName << std::endl;
@@ -188,7 +195,7 @@ bool SoundRecorder::setDevice(const std::string& name)
ALCenum format = (m_channelCount == 1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
// Open the requested capture device for capturing 16 bits samples
- captureDevice = alcCaptureOpenDevice(m_deviceName.c_str(), m_sampleRate, format, m_sampleRate);
+ captureDevice = alcCaptureOpenDevice(m_deviceName.c_str(), m_sampleRate, format, static_cast<ALCsizei>(m_sampleRate));
if (!captureDevice)
{
// Notify derived class
@@ -300,7 +307,7 @@ void SoundRecorder::processCapturedSamples()
if (samplesAvailable > 0)
{
// Get the recorded samples
- m_samples.resize(samplesAvailable * getChannelCount());
+ m_samples.resize(static_cast<unsigned int>(samplesAvailable) * getChannelCount());
alcCaptureSamples(captureDevice, &m_samples[0], samplesAvailable);
// Forward them to the derived class
diff --git a/src/SFML/Audio/SoundSource.cpp b/src/SFML/Audio/SoundSource.cpp
index 785f9cc..4d4e7ef 100644
--- a/src/SFML/Audio/SoundSource.cpp
+++ b/src/SFML/Audio/SoundSource.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -28,6 +28,13 @@
#include <SFML/Audio/SoundSource.hpp>
#include <SFML/Audio/ALCheck.hpp>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
namespace sf
{
diff --git a/src/SFML/Audio/SoundStream.cpp b/src/SFML/Audio/SoundStream.cpp
index 0e40548..11ce46c 100644
--- a/src/SFML/Audio/SoundStream.cpp
+++ b/src/SFML/Audio/SoundStream.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -36,6 +36,13 @@
#pragma warning(disable: 4355) // 'this' used in base member initializer list
#endif
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
namespace sf
{
@@ -51,7 +58,8 @@ m_sampleRate (0),
m_format (0),
m_loop (false),
m_samplesProcessed(0),
-m_bufferSeeks ()
+m_bufferSeeks (),
+m_processingInterval(milliseconds(10))
{
}
@@ -128,6 +136,15 @@ void SoundStream::play()
// If the sound is playing, stop it and continue as if it was stopped
stop();
}
+ else if (!isStreaming)
+ {
+ // Either the streaming thread has never been launched or it has been launched and has reached its end.
+ // - If it has reached its end, we have to restart the sound from the beginning.
+ // - If it has never been launched, it is not necessary to move to the beginning, but it is not harmful.
+ // To check if the sound has never been launched would require additional complexity
+ // which we can avoid by moving to the beginning in both cases.
+ onSeek(Time::Zero);
+ }
// Start updating the stream in a separate thread to avoid blocking the application
m_isStreaming = true;
@@ -215,7 +232,7 @@ void SoundStream::setPlayingOffset(Time timeOffset)
onSeek(timeOffset);
// Restart streaming
- m_samplesProcessed = static_cast<Uint64>(timeOffset.asSeconds() * m_sampleRate * m_channelCount);
+ m_samplesProcessed = static_cast<Uint64>(timeOffset.asSeconds() * static_cast<float>(m_sampleRate)) * m_channelCount;
if (oldStatus == Stopped)
return;
@@ -234,7 +251,7 @@ Time SoundStream::getPlayingOffset() const
ALfloat secs = 0.f;
alCheck(alGetSourcef(m_source, AL_SEC_OFFSET, &secs));
- return seconds(secs + static_cast<float>(m_samplesProcessed) / m_sampleRate / m_channelCount);
+ return seconds(secs + static_cast<float>(m_samplesProcessed) / static_cast<float>(m_sampleRate) / static_cast<float>(m_channelCount));
}
else
{
@@ -264,6 +281,11 @@ Int64 SoundStream::onLoop()
return 0;
}
+////////////////////////////////////////////////////////////
+void SoundStream::setProcessingInterval(Time interval)
+{
+ m_processingInterval = interval;
+}
////////////////////////////////////////////////////////////
void SoundStream::streamData()
@@ -336,7 +358,7 @@ void SoundStream::streamData()
// Find its number
unsigned int bufferNum = 0;
- for (int i = 0; i < BufferCount; ++i)
+ for (unsigned int i = 0; i < BufferCount; ++i)
if (m_buffers[i] == buffer)
{
bufferNum = i;
@@ -347,7 +369,7 @@ void SoundStream::streamData()
if (m_bufferSeeks[bufferNum] != NoLoop)
{
// This was the last buffer before EOF or Loop End: reset the sample count
- m_samplesProcessed = m_bufferSeeks[bufferNum];
+ m_samplesProcessed = static_cast<Uint64>(m_bufferSeeks[bufferNum]);
m_bufferSeeks[bufferNum] = NoLoop;
}
else
@@ -370,7 +392,7 @@ void SoundStream::streamData()
}
else
{
- m_samplesProcessed += size / (bits / 8);
+ m_samplesProcessed += static_cast<Uint64>(size / (bits / 8));
}
}
@@ -384,7 +406,7 @@ void SoundStream::streamData()
// Leave some time for the other threads if the stream is still playing
if (SoundSource::getStatus() != Stopped)
- sleep(milliseconds(10));
+ sleep(m_processingInterval);
}
// Stop the playback
@@ -433,7 +455,7 @@ bool SoundStream::fillAndPushBuffer(unsigned int bufferNum, bool immediateLoop)
if (immediateLoop && (m_bufferSeeks[bufferNum] != NoLoop))
{
// We just tried to begin preloading at EOF or Loop End: reset the sample count
- m_samplesProcessed = m_bufferSeeks[bufferNum];
+ m_samplesProcessed = static_cast<Uint64>(m_bufferSeeks[bufferNum]);
m_bufferSeeks[bufferNum] = NoLoop;
}
@@ -446,8 +468,8 @@ bool SoundStream::fillAndPushBuffer(unsigned int bufferNum, bool immediateLoop)
unsigned int buffer = m_buffers[bufferNum];
// Fill the buffer
- ALsizei size = static_cast<ALsizei>(data.sampleCount) * sizeof(Int16);
- alCheck(alBufferData(buffer, m_format, data.samples, size, m_sampleRate));
+ ALsizei size = static_cast<ALsizei>(data.sampleCount * sizeof(Int16));
+ alCheck(alBufferData(buffer, m_format, data.samples, size, static_cast<ALsizei>(m_sampleRate)));
// Push it into the sound queue
alCheck(alSourceQueueBuffers(m_source, 1, &buffer));
@@ -467,7 +489,7 @@ bool SoundStream::fillQueue()
{
// Fill and enqueue all the available buffers
bool requestStop = false;
- for (int i = 0; (i < BufferCount) && !requestStop; ++i)
+ for (unsigned int i = 0; (i < BufferCount) && !requestStop; ++i)
{
// Since no sound has been loaded yet, we can't schedule loop seeks preemptively,
// So if we start on EOF or Loop End, we let fillAndPushBuffer() adjust the sample count
diff --git a/src/SFML/CMakeLists.txt b/src/SFML/CMakeLists.txt
index 25a5bb1..c60bc4f 100644
--- a/src/SFML/CMakeLists.txt
+++ b/src/SFML/CMakeLists.txt
@@ -5,7 +5,7 @@ include(${PROJECT_SOURCE_DIR}/cmake/Macros.cmake)
# let CMake know about our additional libraries paths
if (SFML_OS_WINDOWS)
set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "${PROJECT_SOURCE_DIR}/extlibs/headers")
- if(SFML_COMPILER_GCC)
+ if(SFML_COMPILER_GCC OR (SFML_COMPILER_CLANG AND MINGW))
if(ARCH_32BITS)
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-mingw/x86")
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/bin/x86")
@@ -13,7 +13,7 @@ if (SFML_OS_WINDOWS)
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-mingw/x64")
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/bin/x64")
endif()
- elseif(SFML_COMPILER_MSVC)
+ elseif(SFML_COMPILER_MSVC OR (SFML_COMPILER_CLANG AND NOT MINGW))
if(SFML_MSVC_VERSION LESS 14)
if(ARCH_32BITS)
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-msvc/x86")
@@ -40,7 +40,7 @@ elseif(SFML_OS_ANDROID)
endif()
# define the path of our additional CMake modules
-set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules/")
+list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules/")
# set the output directory for SFML libraries
set(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib")
diff --git a/src/SFML/Graphics/BlendMode.cpp b/src/SFML/Graphics/BlendMode.cpp
index 0d9cf95..687914e 100644
--- a/src/SFML/Graphics/BlendMode.cpp
+++ b/src/SFML/Graphics/BlendMode.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -37,8 +37,10 @@ const BlendMode BlendAlpha(BlendMode::SrcAlpha, BlendMode::OneMinusSrcAlpha, Ble
BlendMode::One, BlendMode::OneMinusSrcAlpha, BlendMode::Add);
const BlendMode BlendAdd(BlendMode::SrcAlpha, BlendMode::One, BlendMode::Add,
BlendMode::One, BlendMode::One, BlendMode::Add);
-const BlendMode BlendMultiply(BlendMode::DstColor, BlendMode::Zero);
-const BlendMode BlendNone(BlendMode::One, BlendMode::Zero);
+const BlendMode BlendMultiply(BlendMode::DstColor, BlendMode::Zero, BlendMode::Add);
+const BlendMode BlendMin(BlendMode::One, BlendMode::One, BlendMode::Min);
+const BlendMode BlendMax(BlendMode::One, BlendMode::One, BlendMode::Max);
+const BlendMode BlendNone(BlendMode::One, BlendMode::Zero, BlendMode::Add);
////////////////////////////////////////////////////////////
diff --git a/src/SFML/Graphics/CMakeLists.txt b/src/SFML/Graphics/CMakeLists.txt
index 883c758..d3e0769 100644
--- a/src/SFML/Graphics/CMakeLists.txt
+++ b/src/SFML/Graphics/CMakeLists.txt
@@ -49,10 +49,6 @@ set(SRC
${SRCROOT}/Vertex.cpp
${INCROOT}/Vertex.hpp
)
-if(NOT SFML_OPENGL_ES)
- list(APPEND SRC ${SRCROOT}/GLLoader.cpp)
- list(APPEND SRC ${SRCROOT}/GLLoader.hpp)
-endif()
source_group("" FILES ${SRC})
# drawables sources
@@ -97,7 +93,12 @@ sfml_add_library(sfml-graphics
target_link_libraries(sfml-graphics PUBLIC sfml-window)
# stb_image sources
-target_include_directories(sfml-graphics PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/stb_image")
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(stb REQUIRED IMPORTED_TARGET stb)
+target_link_libraries(sfml-graphics PRIVATE PkgConfig::stb)
+
+# glad sources
+target_include_directories(sfml-graphics SYSTEM PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/glad/include")
# let CMake know about our additional graphics libraries paths
if(SFML_OS_WINDOWS)
@@ -112,26 +113,16 @@ elseif(SFML_OS_ANDROID)
endif()
# find external libraries
-if(SFML_OPENGL_ES)
- if(SFML_OS_LINUX)
- sfml_find_package(EGL INCLUDE "EGL_INCLUDE_DIR" LINK "EGL_LIBRARY")
- sfml_find_package(GLES INCLUDE "GLES_INCLUDE_DIR" LINK "GLES_LIBRARY")
- target_link_libraries(sfml-graphics PRIVATE EGL GLES)
- elseif(SFML_OS_IOS)
- target_link_libraries(sfml-graphics PRIVATE "-framework OpenGLES")
- endif()
-else()
- # Target OpenGL already defined for Window component so no sfml_find_package() here
- target_link_libraries(sfml-graphics PRIVATE OpenGL)
-
- if(SFML_OS_LINUX)
- # Target X11 already defined for Window component so no sfml_find_package() here
- target_link_libraries(sfml-graphics PRIVATE X11)
- endif()
+if(SFML_OS_ANDROID)
+ target_link_libraries(sfml-graphics PRIVATE z)
+elseif(SFML_OS_IOS)
+ target_link_libraries(sfml-graphics PRIVATE z bz2)
endif()
-if(SFML_OS_ANDROID)
- target_link_libraries(sfml-graphics PRIVATE z EGL GLESv1_CM)
+# starting from Visual Studio 2015, inline versions of some C functions are used; for compatibility link this library
+# see https://docs.microsoft.com/en-us/cpp/porting/overview-of-potential-upgrade-issues-visual-cpp?view=msvc-160#libraries
+if((SFML_COMPILER_MSVC AND SFML_MSVC_VERSION GREATER_EQUAL 14) OR (SFML_COMPILER_CLANG AND SFML_OS_WINDOWS AND NOT MINGW))
+ target_link_libraries(sfml-graphics PRIVATE legacy_stdio_definitions.lib)
endif()
sfml_find_package(Freetype INCLUDE "FREETYPE_INCLUDE_DIRS" LINK "FREETYPE_LIBRARY")
diff --git a/src/SFML/Graphics/CircleShape.cpp b/src/SFML/Graphics/CircleShape.cpp
index 0cfa3c7..ac6c536 100644
--- a/src/SFML/Graphics/CircleShape.cpp
+++ b/src/SFML/Graphics/CircleShape.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -74,7 +74,7 @@ Vector2f CircleShape::getPoint(std::size_t index) const
{
static const float pi = 3.141592654f;
- float angle = index * 2 * pi / m_pointCount - pi / 2;
+ float angle = static_cast<float>(index) * 2.f * pi / static_cast<float>(m_pointCount) - pi / 2.f;
float x = std::cos(angle) * m_radius;
float y = std::sin(angle) * m_radius;
diff --git a/src/SFML/Graphics/Color.cpp b/src/SFML/Graphics/Color.cpp
index 03f99a4..aa78ec6 100644
--- a/src/SFML/Graphics/Color.cpp
+++ b/src/SFML/Graphics/Color.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -69,8 +69,8 @@ a(alpha)
////////////////////////////////////////////////////////////
Color::Color(Uint32 color) :
-r((color & 0xff000000) >> 24),
-g((color & 0x00ff0000) >> 16),
+r(static_cast<Uint8>((color & 0xff000000) >> 24)),
+g(static_cast<Uint8>((color & 0x00ff0000) >> 16)),
b((color & 0x0000ff00) >> 8 ),
a((color & 0x000000ff) >> 0 )
{
@@ -81,7 +81,7 @@ a((color & 0x000000ff) >> 0 )
////////////////////////////////////////////////////////////
Uint32 Color::toInteger() const
{
- return (r << 24) | (g << 16) | (b << 8) | a;
+ return static_cast<Uint32>((r << 24) | (g << 16) | (b << 8) | a);
}
diff --git a/src/SFML/Graphics/ConvexShape.cpp b/src/SFML/Graphics/ConvexShape.cpp
index 56aa787..978862e 100644
--- a/src/SFML/Graphics/ConvexShape.cpp
+++ b/src/SFML/Graphics/ConvexShape.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Graphics/Font.cpp b/src/SFML/Graphics/Font.cpp
index 308070a..010ad4c 100644
--- a/src/SFML/Graphics/Font.cpp
+++ b/src/SFML/Graphics/Font.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -40,6 +40,7 @@
#include FT_STROKER_H
#include <cstdlib>
#include <cstring>
+#include <cmath>
namespace
@@ -47,11 +48,12 @@ namespace
// FreeType callbacks that operate on a sf::InputStream
unsigned long read(FT_Stream rec, unsigned long offset, unsigned char* buffer, unsigned long count)
{
+ sf::Int64 convertedOffset = static_cast<sf::Int64>(offset);
sf::InputStream* stream = static_cast<sf::InputStream*>(rec->descriptor.pointer);
- if (static_cast<unsigned long>(stream->seek(offset)) == offset)
+ if (stream->seek(convertedOffset) == convertedOffset)
{
if (count > 0)
- return static_cast<unsigned long>(stream->read(reinterpret_cast<char*>(buffer), count));
+ return static_cast<unsigned long>(stream->read(reinterpret_cast<char*>(buffer), static_cast<sf::Int64>(count)));
else
return 0;
}
@@ -88,6 +90,7 @@ m_face (NULL),
m_streamRec(NULL),
m_stroker (NULL),
m_refCount (NULL),
+m_isSmooth (true),
m_info ()
{
#ifdef SFML_SYSTEM_ANDROID
@@ -103,6 +106,7 @@ m_face (copy.m_face),
m_streamRec (copy.m_streamRec),
m_stroker (copy.m_stroker),
m_refCount (copy.m_refCount),
+m_isSmooth (copy.m_isSmooth),
m_info (copy.m_info),
m_pages (copy.m_pages),
m_pixelBuffer(copy.m_pixelBuffer)
@@ -127,7 +131,7 @@ Font::~Font()
#ifdef SFML_SYSTEM_ANDROID
if (m_stream)
- delete (priv::ResourceStream*)m_stream;
+ delete static_cast<priv::ResourceStream*>(m_stream);
#endif
}
@@ -191,10 +195,10 @@ bool Font::loadFromFile(const std::string& filename)
#else
if (m_stream)
- delete (priv::ResourceStream*)m_stream;
+ delete static_cast<priv::ResourceStream*>(m_stream);
m_stream = new priv::ResourceStream(filename);
- return loadFromStream(*(priv::ResourceStream*)m_stream);
+ return loadFromStream(*static_cast<priv::ResourceStream*>(m_stream));
#endif
}
@@ -344,7 +348,7 @@ const Font::Info& Font::getInfo() const
const Glyph& Font::getGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, float outlineThickness) const
{
// Get the page corresponding to the character size
- GlyphTable& glyphs = m_pages[characterSize].glyphs;
+ GlyphTable& glyphs = loadPage(characterSize).glyphs;
// Build the key by combining the glyph index (based on code point), bold flag, and outline thickness
Uint64 key = combine(outlineThickness, bold, FT_Get_Char_Index(static_cast<FT_Face>(m_face), codePoint));
@@ -366,7 +370,14 @@ const Glyph& Font::getGlyph(Uint32 codePoint, unsigned int characterSize, bool b
////////////////////////////////////////////////////////////
-float Font::getKerning(Uint32 first, Uint32 second, unsigned int characterSize) const
+bool Font::hasGlyph(Uint32 codePoint) const
+{
+ return FT_Get_Char_Index(static_cast<FT_Face>(m_face), codePoint) != 0;
+}
+
+
+////////////////////////////////////////////////////////////
+float Font::getKerning(Uint32 first, Uint32 second, unsigned int characterSize, bool bold) const
{
// Special case where first or second is 0 (null character)
if (first == 0 || second == 0)
@@ -374,26 +385,33 @@ float Font::getKerning(Uint32 first, Uint32 second, unsigned int characterSize)
FT_Face face = static_cast<FT_Face>(m_face);
- if (face && FT_HAS_KERNING(face) && setCurrentSize(characterSize))
+ if (face && setCurrentSize(characterSize))
{
// Convert the characters to indices
FT_UInt index1 = FT_Get_Char_Index(face, first);
FT_UInt index2 = FT_Get_Char_Index(face, second);
- // Get the kerning vector
+ // Retrieve position compensation deltas generated by FT_LOAD_FORCE_AUTOHINT flag
+ float firstRsbDelta = static_cast<float>(getGlyph(first, characterSize, bold).rsbDelta);
+ float secondLsbDelta = static_cast<float>(getGlyph(second, characterSize, bold).lsbDelta);
+
+ // Get the kerning vector if present
FT_Vector kerning;
- FT_Get_Kerning(face, index1, index2, FT_KERNING_DEFAULT, &kerning);
+ kerning.x = kerning.y = 0;
+ if (FT_HAS_KERNING(face))
+ FT_Get_Kerning(face, index1, index2, FT_KERNING_UNFITTED, &kerning);
// X advance is already in pixels for bitmap fonts
if (!FT_IS_SCALABLE(face))
return static_cast<float>(kerning.x);
- // Return the X advance
- return static_cast<float>(kerning.x) / static_cast<float>(1 << 6);
+ // Combine kerning with compensation deltas and return the X advance
+ // Flooring is required as we use FT_KERNING_UNFITTED flag which is not quantized in 64 based grid
+ return std::floor((secondLsbDelta - firstRsbDelta + static_cast<float>(kerning.x) + 32) / static_cast<float>(1 << 6));
}
else
{
- // Invalid font, or no kerning
+ // Invalid font
return 0.f;
}
}
@@ -424,7 +442,7 @@ float Font::getUnderlinePosition(unsigned int characterSize) const
{
// Return a fixed position if font is a bitmap font
if (!FT_IS_SCALABLE(face))
- return characterSize / 10.f;
+ return static_cast<float>(characterSize) / 10.f;
return -static_cast<float>(FT_MulFix(face->underline_position, face->size->metrics.y_scale)) / static_cast<float>(1 << 6);
}
@@ -444,7 +462,7 @@ float Font::getUnderlineThickness(unsigned int characterSize) const
{
// Return a fixed thickness if font is a bitmap font
if (!FT_IS_SCALABLE(face))
- return characterSize / 14.f;
+ return static_cast<float>(characterSize) / 14.f;
return static_cast<float>(FT_MulFix(face->underline_thickness, face->size->metrics.y_scale)) / static_cast<float>(1 << 6);
}
@@ -458,7 +476,27 @@ float Font::getUnderlineThickness(unsigned int characterSize) const
////////////////////////////////////////////////////////////
const Texture& Font::getTexture(unsigned int characterSize) const
{
- return m_pages[characterSize].texture;
+ return loadPage(characterSize).texture;
+}
+
+////////////////////////////////////////////////////////////
+void Font::setSmooth(bool smooth)
+{
+ if (smooth != m_isSmooth)
+ {
+ m_isSmooth = smooth;
+
+ for (sf::Font::PageTable::iterator page = m_pages.begin(); page != m_pages.end(); ++page)
+ {
+ page->second.texture.setSmooth(m_isSmooth);
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////
+bool Font::isSmooth() const
+{
+ return m_isSmooth;
}
@@ -472,6 +510,7 @@ Font& Font::operator =(const Font& right)
std::swap(m_streamRec, temp.m_streamRec);
std::swap(m_stroker, temp.m_stroker);
std::swap(m_refCount, temp.m_refCount);
+ std::swap(m_isSmooth, temp.m_isSmooth);
std::swap(m_info, temp.m_info);
std::swap(m_pages, temp.m_pages);
std::swap(m_pixelBuffer, temp.m_pixelBuffer);
@@ -529,6 +568,18 @@ void Font::cleanup()
////////////////////////////////////////////////////////////
+Font::Page& Font::loadPage(unsigned int characterSize) const
+{
+ // TODO: Remove this method and use try_emplace instead when updating to C++17
+ PageTable::iterator pageIterator = m_pages.find(characterSize);
+ if (pageIterator == m_pages.end())
+ pageIterator = m_pages.insert(std::make_pair(characterSize, Page(m_isSmooth))).first;
+
+ return pageIterator->second;
+}
+
+
+////////////////////////////////////////////////////////////
Glyph Font::loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, float outlineThickness) const
{
// The glyph to return
@@ -562,7 +613,7 @@ Glyph Font::loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, f
{
if (bold)
{
- FT_OutlineGlyph outlineGlyph = (FT_OutlineGlyph)glyphDesc;
+ FT_OutlineGlyph outlineGlyph = reinterpret_cast<FT_OutlineGlyph>(glyphDesc);
FT_Outline_Embolden(&outlineGlyph->outline, weight);
}
@@ -576,8 +627,11 @@ Glyph Font::loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, f
}
// Convert the glyph to a bitmap (i.e. rasterize it)
+ // Warning! After this line, do not read any data from glyphDesc directly, use
+ // bitmapGlyph.root to access the FT_Glyph data.
FT_Glyph_To_Bitmap(&glyphDesc, FT_RENDER_MODE_NORMAL, 0, 1);
- FT_Bitmap& bitmap = reinterpret_cast<FT_BitmapGlyph>(glyphDesc)->bitmap;
+ FT_BitmapGlyph bitmapGlyph = reinterpret_cast<FT_BitmapGlyph>(glyphDesc);
+ FT_Bitmap& bitmap = bitmapGlyph->bitmap;
// Apply bold if necessary -- fallback technique using bitmap (lower quality)
if (!outline)
@@ -590,40 +644,43 @@ Glyph Font::loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, f
}
// Compute the glyph's advance offset
- glyph.advance = static_cast<float>(face->glyph->metrics.horiAdvance) / static_cast<float>(1 << 6);
+ glyph.advance = static_cast<float>(bitmapGlyph->root.advance.x >> 16);
if (bold)
glyph.advance += static_cast<float>(weight) / static_cast<float>(1 << 6);
- int width = bitmap.width;
- int height = bitmap.rows;
+ glyph.lsbDelta = static_cast<int>(face->glyph->lsb_delta);
+ glyph.rsbDelta = static_cast<int>(face->glyph->rsb_delta);
+
+ unsigned int width = bitmap.width;
+ unsigned int height = bitmap.rows;
if ((width > 0) && (height > 0))
{
// Leave a small padding around characters, so that filtering doesn't
// pollute them with pixels from neighbors
- const unsigned int padding = 1;
+ const unsigned int padding = 2;
width += 2 * padding;
height += 2 * padding;
// Get the glyphs page corresponding to the character size
- Page& page = m_pages[characterSize];
+ Page& page = loadPage(characterSize);
// Find a good position for the new glyph into the texture
glyph.textureRect = findGlyphRect(page, width, height);
// Make sure the texture data is positioned in the center
// of the allocated texture rectangle
- glyph.textureRect.left += padding;
- glyph.textureRect.top += padding;
- glyph.textureRect.width -= 2 * padding;
- glyph.textureRect.height -= 2 * padding;
+ glyph.textureRect.left += static_cast<int>(padding);
+ glyph.textureRect.top += static_cast<int>(padding);
+ glyph.textureRect.width -= static_cast<int>(2 * padding);
+ glyph.textureRect.height -= static_cast<int>(2 * padding);
// Compute the glyph's bounding box
- glyph.bounds.left = static_cast<float>(face->glyph->metrics.horiBearingX) / static_cast<float>(1 << 6);
- glyph.bounds.top = -static_cast<float>(face->glyph->metrics.horiBearingY) / static_cast<float>(1 << 6);
- glyph.bounds.width = static_cast<float>(face->glyph->metrics.width) / static_cast<float>(1 << 6) + outlineThickness * 2;
- glyph.bounds.height = static_cast<float>(face->glyph->metrics.height) / static_cast<float>(1 << 6) + outlineThickness * 2;
+ glyph.bounds.left = static_cast<float>( bitmapGlyph->left);
+ glyph.bounds.top = static_cast<float>(-bitmapGlyph->top);
+ glyph.bounds.width = static_cast<float>( bitmap.width);
+ glyph.bounds.height = static_cast<float>( bitmap.rows);
// Resize the pixel buffer to the new size and fill it with transparent white pixels
m_pixelBuffer.resize(width * height * 4);
@@ -671,10 +728,10 @@ Glyph Font::loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, f
}
// Write the pixels to the texture
- unsigned int x = glyph.textureRect.left - padding;
- unsigned int y = glyph.textureRect.top - padding;
- unsigned int w = glyph.textureRect.width + 2 * padding;
- unsigned int h = glyph.textureRect.height + 2 * padding;
+ unsigned int x = static_cast<unsigned int>(glyph.textureRect.left) - padding;
+ unsigned int y = static_cast<unsigned int>(glyph.textureRect.top) - padding;
+ unsigned int w = static_cast<unsigned int>(glyph.textureRect.width) + 2 * padding;
+ unsigned int h = static_cast<unsigned int>(glyph.textureRect.height) + 2 * padding;
page.texture.update(&m_pixelBuffer[0], w, h, x, y);
}
@@ -694,7 +751,7 @@ IntRect Font::findGlyphRect(Page& page, unsigned int width, unsigned int height)
float bestRatio = 0;
for (std::vector<Row>::iterator it = page.rows.begin(); it != page.rows.end() && !row; ++it)
{
- float ratio = static_cast<float>(height) / it->height;
+ float ratio = static_cast<float>(height) / static_cast<float>(it->height);
// Ignore rows that are either too small or too high
if ((ratio < 0.7f) || (ratio > 1.f))
@@ -716,7 +773,7 @@ IntRect Font::findGlyphRect(Page& page, unsigned int width, unsigned int height)
// If we didn't find a matching row, create a new one (10% taller than the glyph)
if (!row)
{
- int rowHeight = height + height / 10;
+ unsigned int rowHeight = height + height / 10;
while ((page.nextRow + rowHeight >= page.texture.getSize().y) || (width >= page.texture.getSize().x))
{
// Not enough space: resize the texture if possible
@@ -727,7 +784,7 @@ IntRect Font::findGlyphRect(Page& page, unsigned int width, unsigned int height)
// Make the texture 2 times bigger
Texture newTexture;
newTexture.create(textureWidth * 2, textureHeight * 2);
- newTexture.setSmooth(true);
+ newTexture.setSmooth(m_isSmooth);
newTexture.update(page.texture);
page.texture.swap(newTexture);
}
@@ -746,7 +803,7 @@ IntRect Font::findGlyphRect(Page& page, unsigned int width, unsigned int height)
}
// Find the glyph's rectangle on the selected row
- IntRect rect(row->width, row->top, width, height);
+ IntRect rect(Rect<unsigned int>(row->width, row->top, width, height));
// Update the row informations
row->width += width;
@@ -778,7 +835,7 @@ bool Font::setCurrentSize(unsigned int characterSize) const
err() << "Available sizes are: ";
for (int i = 0; i < face->num_fixed_sizes; ++i)
{
- const unsigned int size = (face->available_sizes[i].y_ppem + 32) >> 6;
+ const long size = (face->available_sizes[i].y_ppem + 32) >> 6;
err() << size << " ";
}
err() << std::endl;
@@ -797,7 +854,7 @@ bool Font::setCurrentSize(unsigned int characterSize) const
////////////////////////////////////////////////////////////
-Font::Page::Page() :
+Font::Page::Page(bool smooth) :
nextRow(3)
{
// Make sure that the texture is initialized by default
@@ -805,13 +862,13 @@ nextRow(3)
image.create(128, 128, Color(255, 255, 255, 0));
// Reserve a 2x2 white square for texturing underlines
- for (int x = 0; x < 2; ++x)
- for (int y = 0; y < 2; ++y)
+ for (unsigned int x = 0; x < 2; ++x)
+ for (unsigned int y = 0; y < 2; ++y)
image.setPixel(x, y, Color(255, 255, 255, 255));
// Create the texture
texture.loadFromImage(image);
- texture.setSmooth(true);
+ texture.setSmooth(smooth);
}
} // namespace sf
diff --git a/src/SFML/Graphics/GLCheck.cpp b/src/SFML/Graphics/GLCheck.cpp
index 580e838..c3f3adb 100644
--- a/src/SFML/Graphics/GLCheck.cpp
+++ b/src/SFML/Graphics/GLCheck.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Graphics/GLCheck.hpp b/src/SFML/Graphics/GLCheck.hpp
index 86b96de..61403fc 100644
--- a/src/SFML/Graphics/GLCheck.hpp
+++ b/src/SFML/Graphics/GLCheck.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Graphics/GLExtensions.cpp b/src/SFML/Graphics/GLExtensions.cpp
index fff712d..35e59ec 100644
--- a/src/SFML/Graphics/GLExtensions.cpp
+++ b/src/SFML/Graphics/GLExtensions.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,6 +29,14 @@
#include <SFML/Window/Context.hpp>
#include <SFML/System/Err.hpp>
+// We check for this definition in order to avoid multiple definitions of GLAD
+// entities during unity builds of SFML.
+#ifndef SF_GLAD_GL_IMPLEMENTATION_INCLUDED
+#define SF_GLAD_GL_IMPLEMENTATION_INCLUDED
+#define SF_GLAD_GL_IMPLEMENTATION
+#include <glad/gl.h>
+#endif
+
#if !defined(GL_MAJOR_VERSION)
#define GL_MAJOR_VERSION 0x821B
#endif
@@ -45,13 +53,16 @@ namespace priv
////////////////////////////////////////////////////////////
void ensureExtensionsInit()
{
-#if !defined(SFML_OPENGL_ES)
static bool initialized = false;
if (!initialized)
{
initialized = true;
- sfogl_LoadFunctions();
+#ifdef SFML_OPENGL_ES
+ gladLoadGLES1(reinterpret_cast<GLADloadfunc>(sf::Context::getFunction));
+#else
+ gladLoadGL(reinterpret_cast<GLADloadfunc>(sf::Context::getFunction));
+#endif
// Retrieve the context version number
int majorVersion = 0;
@@ -85,7 +96,6 @@ void ensureExtensionsInit()
err() << "Ensure that hardware acceleration is enabled if available" << std::endl;
}
}
-#endif
}
} // namespace priv
diff --git a/src/SFML/Graphics/GLExtensions.hpp b/src/SFML/Graphics/GLExtensions.hpp
index 687cf37..d97a6f7 100644
--- a/src/SFML/Graphics/GLExtensions.hpp
+++ b/src/SFML/Graphics/GLExtensions.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,11 +29,10 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Config.hpp>
+#include <glad/gl.h>
#ifdef SFML_OPENGL_ES
- #include <SFML/OpenGL.hpp>
-
// SFML requires at a bare minimum OpenGL ES 1.0 capability
// Some extensions only incorporated by 2.0 are also required
// OpenGL ES 1.0 is defined relative to OpenGL 1.3
@@ -46,7 +45,6 @@
#define GLEXT_multitexture true
#define GLEXT_texture_edge_clamp true
#define GLEXT_EXT_texture_edge_clamp true
- #define GLEXT_blend_minmax true
#define GLEXT_glClientActiveTexture glClientActiveTexture
#define GLEXT_glActiveTexture glActiveTexture
#define GLEXT_GL_TEXTURE0 GL_TEXTURE0
@@ -73,7 +71,7 @@
// The following extensions are required.
// Core since 2.0 - OES_blend_subtract
- #define GLEXT_blend_subtract GL_OES_blend_subtract
+ #define GLEXT_blend_subtract SF_GLAD_GL_OES_blend_subtract
#define GLEXT_glBlendEquation glBlendEquationOES
#define GLEXT_GL_FUNC_ADD GL_FUNC_ADD_OES
#define GLEXT_GL_FUNC_SUBTRACT GL_FUNC_SUBTRACT_OES
@@ -82,28 +80,18 @@
// The following extensions are optional.
// Core since 2.0 - OES_blend_func_separate
- #ifdef SFML_SYSTEM_ANDROID
- // Hack to make transparency working on some Android devices
- #define GLEXT_blend_func_separate false
- #else
- #define GLEXT_blend_func_separate GL_OES_blend_func_separate
- #endif
+ #define GLEXT_blend_func_separate SF_GLAD_GL_OES_blend_func_separate
#define GLEXT_glBlendFuncSeparate glBlendFuncSeparateOES
// Core since 2.0 - OES_blend_equation_separate
- #ifdef SFML_SYSTEM_ANDROID
- // Hack to make transparency working on some Android devices
- #define GLEXT_blend_equation_separate false
- #else
- #define GLEXT_blend_equation_separate GL_OES_blend_equation_separate
- #endif
+ #define GLEXT_blend_equation_separate SF_GLAD_GL_OES_blend_equation_separate
#define GLEXT_glBlendEquationSeparate glBlendEquationSeparateOES
// Core since 2.0 - OES_texture_npot
#define GLEXT_texture_non_power_of_two false
// Core since 2.0 - OES_framebuffer_object
- #define GLEXT_framebuffer_object GL_OES_framebuffer_object
+ #define GLEXT_framebuffer_object SF_GLAD_GL_OES_framebuffer_object
#define GLEXT_glBindRenderbuffer glBindRenderbufferOES
#define GLEXT_glDeleteRenderbuffers glDeleteRenderbuffersOES
#define GLEXT_glGenRenderbuffers glGenRenderbuffersOES
@@ -125,29 +113,38 @@
#define GLEXT_GL_INVALID_FRAMEBUFFER_OPERATION GL_INVALID_FRAMEBUFFER_OPERATION_OES
// Core since 3.0
- #define GLEXT_packed_depth_stencil false
+ #define GLEXT_packed_depth_stencil SF_GLAD_GL_OES_packed_depth_stencil
+ #define GLEXT_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_OES
// Core since 3.0
#define GLEXT_framebuffer_blit false
+ #define GLEXT_glBlitFramebuffer glBlitFramebufferEXT // Placeholder to satisfy the compiler, entry point is not loaded in GLES
+ #define GLEXT_GL_READ_FRAMEBUFFER 0
+ #define GLEXT_GL_DRAW_FRAMEBUFFER 0
+ #define GLEXT_GL_DRAW_FRAMEBUFFER_BINDING 0
+ #define GLEXT_GL_READ_FRAMEBUFFER_BINDING 0
// Core since 3.0
#define GLEXT_framebuffer_multisample false
+ #define GLEXT_glRenderbufferStorageMultisample glRenderbufferStorageMultisampleEXT // Placeholder to satisfy the compiler, entry point is not loaded in GLES
+ #define GLEXT_GL_MAX_SAMPLES 0
// Core since 3.0 - NV_copy_buffer
#define GLEXT_copy_buffer false
+ #define GLEXT_GL_COPY_READ_BUFFER 0
+ #define GLEXT_GL_COPY_WRITE_BUFFER 0
+ #define GLEXT_glCopyBufferSubData glCopyBufferSubData // Placeholder to satisfy the compiler, entry point is not loaded in GLES
// Core since 3.0 - EXT_sRGB
- #ifdef GL_EXT_sRGB
- #define GLEXT_texture_sRGB GL_EXT_sRGB
- #define GLEXT_GL_SRGB8_ALPHA8 GL_SRGB8_ALPHA8_EXT
- #else
- #define GLEXT_texture_sRGB false
- #define GLEXT_GL_SRGB8_ALPHA8 0
- #endif
+ #define GLEXT_texture_sRGB false
+ #define GLEXT_GL_SRGB8_ALPHA8 0
-#else
+ // Core since 3.0 - EXT_blend_minmax
+ #define GLEXT_blend_minmax SF_GLAD_GL_EXT_blend_minmax
+ #define GLEXT_GL_MIN GL_MIN_EXT
+ #define GLEXT_GL_MAX GL_MAX_EXT
- #include <SFML/Graphics/GLLoader.hpp>
+#else
// SFML requires at a bare minimum OpenGL 1.1 capability
// All functionality beyond that is optional
@@ -163,35 +160,34 @@
// The following extensions are optional.
- // Core since 1.2 - SGIS_texture_edge_clamp
- #define GLEXT_texture_edge_clamp sfogl_ext_SGIS_texture_edge_clamp
+ // Core since 1.2 - SGIS_texture_edge_clamp / EXT_texture_edge_clamp
+ #define GLEXT_texture_edge_clamp SF_GLAD_GL_SGIS_texture_edge_clamp
#define GLEXT_GL_CLAMP_TO_EDGE GL_CLAMP_TO_EDGE_SGIS
- // Core since 1.2 - EXT_texture_edge_clamp
- #define GLEXT_EXT_texture_edge_clamp sfogl_ext_EXT_texture_edge_clamp
-
// Core since 1.2 - EXT_blend_minmax
- #define GLEXT_blend_minmax sfogl_ext_EXT_blend_minmax
+ #define GLEXT_blend_minmax SF_GLAD_GL_EXT_blend_minmax
#define GLEXT_glBlendEquation glBlendEquationEXT
#define GLEXT_GL_FUNC_ADD GL_FUNC_ADD_EXT
+ #define GLEXT_GL_MIN GL_MIN_EXT
+ #define GLEXT_GL_MAX GL_MAX_EXT
// Core since 1.2 - EXT_blend_subtract
- #define GLEXT_blend_subtract sfogl_ext_EXT_blend_subtract
+ #define GLEXT_blend_subtract SF_GLAD_GL_EXT_blend_subtract
#define GLEXT_GL_FUNC_SUBTRACT GL_FUNC_SUBTRACT_EXT
#define GLEXT_GL_FUNC_REVERSE_SUBTRACT GL_FUNC_REVERSE_SUBTRACT_EXT
// Core since 1.3 - ARB_multitexture
- #define GLEXT_multitexture sfogl_ext_ARB_multitexture
+ #define GLEXT_multitexture SF_GLAD_GL_ARB_multitexture
#define GLEXT_glClientActiveTexture glClientActiveTextureARB
#define GLEXT_glActiveTexture glActiveTextureARB
#define GLEXT_GL_TEXTURE0 GL_TEXTURE0_ARB
// Core since 1.4 - EXT_blend_func_separate
- #define GLEXT_blend_func_separate sfogl_ext_EXT_blend_func_separate
+ #define GLEXT_blend_func_separate SF_GLAD_GL_EXT_blend_func_separate
#define GLEXT_glBlendFuncSeparate glBlendFuncSeparateEXT
// Core since 1.5 - ARB_vertex_buffer_object
- #define GLEXT_vertex_buffer_object sfogl_ext_ARB_vertex_buffer_object
+ #define GLEXT_vertex_buffer_object SF_GLAD_GL_ARB_vertex_buffer_object
#define GLEXT_GL_ARRAY_BUFFER GL_ARRAY_BUFFER_ARB
#define GLEXT_GL_DYNAMIC_DRAW GL_DYNAMIC_DRAW_ARB
#define GLEXT_GL_READ_ONLY GL_READ_ONLY_ARB
@@ -207,10 +203,10 @@
#define GLEXT_glUnmapBuffer glUnmapBufferARB
// Core since 2.0 - ARB_shading_language_100
- #define GLEXT_shading_language_100 sfogl_ext_ARB_shading_language_100
+ #define GLEXT_shading_language_100 SF_GLAD_GL_ARB_shading_language_100
// Core since 2.0 - ARB_shader_objects
- #define GLEXT_shader_objects sfogl_ext_ARB_shader_objects
+ #define GLEXT_shader_objects SF_GLAD_GL_ARB_shader_objects
#define GLEXT_glDeleteObject glDeleteObjectARB
#define GLEXT_glGetHandle glGetHandleARB
#define GLEXT_glCreateShaderObject glCreateShaderObjectARB
@@ -244,27 +240,27 @@
#define GLEXT_GLhandle GLhandleARB
// Core since 2.0 - ARB_vertex_shader
- #define GLEXT_vertex_shader sfogl_ext_ARB_vertex_shader
+ #define GLEXT_vertex_shader SF_GLAD_GL_ARB_vertex_shader
#define GLEXT_GL_VERTEX_SHADER GL_VERTEX_SHADER_ARB
#define GLEXT_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB
// Core since 2.0 - ARB_fragment_shader
- #define GLEXT_fragment_shader sfogl_ext_ARB_fragment_shader
+ #define GLEXT_fragment_shader SF_GLAD_GL_ARB_fragment_shader
#define GLEXT_GL_FRAGMENT_SHADER GL_FRAGMENT_SHADER_ARB
// Core since 2.0 - ARB_texture_non_power_of_two
- #define GLEXT_texture_non_power_of_two sfogl_ext_ARB_texture_non_power_of_two
+ #define GLEXT_texture_non_power_of_two SF_GLAD_GL_ARB_texture_non_power_of_two
// Core since 2.0 - EXT_blend_equation_separate
- #define GLEXT_blend_equation_separate sfogl_ext_EXT_blend_equation_separate
+ #define GLEXT_blend_equation_separate SF_GLAD_GL_EXT_blend_equation_separate
#define GLEXT_glBlendEquationSeparate glBlendEquationSeparateEXT
// Core since 2.1 - EXT_texture_sRGB
- #define GLEXT_texture_sRGB sfogl_ext_EXT_texture_sRGB
+ #define GLEXT_texture_sRGB SF_GLAD_GL_EXT_texture_sRGB
#define GLEXT_GL_SRGB8_ALPHA8 GL_SRGB8_ALPHA8_EXT
// Core since 3.0 - EXT_framebuffer_object
- #define GLEXT_framebuffer_object sfogl_ext_EXT_framebuffer_object
+ #define GLEXT_framebuffer_object SF_GLAD_GL_EXT_framebuffer_object
#define GLEXT_glBindRenderbuffer glBindRenderbufferEXT
#define GLEXT_glDeleteRenderbuffers glDeleteRenderbuffersEXT
#define GLEXT_glGenRenderbuffers glGenRenderbuffersEXT
@@ -286,11 +282,11 @@
#define GLEXT_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_EXT
// Core since 3.0 - EXT_packed_depth_stencil
- #define GLEXT_packed_depth_stencil sfogl_ext_EXT_packed_depth_stencil
+ #define GLEXT_packed_depth_stencil SF_GLAD_GL_EXT_packed_depth_stencil
#define GLEXT_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_EXT
// Core since 3.0 - EXT_framebuffer_blit
- #define GLEXT_framebuffer_blit sfogl_ext_EXT_framebuffer_blit
+ #define GLEXT_framebuffer_blit SF_GLAD_GL_EXT_framebuffer_blit
#define GLEXT_glBlitFramebuffer glBlitFramebufferEXT
#define GLEXT_GL_READ_FRAMEBUFFER GL_READ_FRAMEBUFFER_EXT
#define GLEXT_GL_DRAW_FRAMEBUFFER GL_DRAW_FRAMEBUFFER_EXT
@@ -298,22 +294,43 @@
#define GLEXT_GL_READ_FRAMEBUFFER_BINDING GL_READ_FRAMEBUFFER_BINDING_EXT
// Core since 3.0 - EXT_framebuffer_multisample
- #define GLEXT_framebuffer_multisample sfogl_ext_EXT_framebuffer_multisample
+ #define GLEXT_framebuffer_multisample SF_GLAD_GL_EXT_framebuffer_multisample
#define GLEXT_glRenderbufferStorageMultisample glRenderbufferStorageMultisampleEXT
#define GLEXT_GL_MAX_SAMPLES GL_MAX_SAMPLES_EXT
// Core since 3.1 - ARB_copy_buffer
- #define GLEXT_copy_buffer sfogl_ext_ARB_copy_buffer
+ #define GLEXT_copy_buffer SF_GLAD_GL_ARB_copy_buffer
#define GLEXT_GL_COPY_READ_BUFFER GL_COPY_READ_BUFFER
#define GLEXT_GL_COPY_WRITE_BUFFER GL_COPY_WRITE_BUFFER
#define GLEXT_glCopyBufferSubData glCopyBufferSubData
// Core since 3.2 - ARB_geometry_shader4
- #define GLEXT_geometry_shader4 sfogl_ext_ARB_geometry_shader4
+ #define GLEXT_geometry_shader4 SF_GLAD_GL_ARB_geometry_shader4
#define GLEXT_GL_GEOMETRY_SHADER GL_GEOMETRY_SHADER_ARB
#endif
+ // OpenGL Versions
+ #define GLEXT_GL_VERSION_1_0 SF_GLAD_GL_VERSION_1_0
+ #define GLEXT_GL_VERSION_1_1 SF_GLAD_GL_VERSION_1_1
+ #define GLEXT_GL_VERSION_1_2 SF_GLAD_GL_VERSION_1_2
+ #define GLEXT_GL_VERSION_1_3 SF_GLAD_GL_VERSION_1_3
+ #define GLEXT_GL_VERSION_1_4 SF_GLAD_GL_VERSION_1_4
+ #define GLEXT_GL_VERSION_1_5 SF_GLAD_GL_VERSION_1_5
+ #define GLEXT_GL_VERSION_2_0 SF_GLAD_GL_VERSION_2_0
+ #define GLEXT_GL_VERSION_2_1 SF_GLAD_GL_VERSION_2_1
+ #define GLEXT_GL_VERSION_3_0 SF_GLAD_GL_VERSION_3_0
+ #define GLEXT_GL_VERSION_3_1 SF_GLAD_GL_VERSION_3_1
+ #define GLEXT_GL_VERSION_3_2 SF_GLAD_GL_VERSION_3_2
+ #define GLEXT_GL_VERSION_3_3 SF_GLAD_GL_VERSION_3_3
+ #define GLEXT_GL_VERSION_4_0 SF_GLAD_GL_VERSION_4_0
+ #define GLEXT_GL_VERSION_4_1 SF_GLAD_GL_VERSION_4_1
+ #define GLEXT_GL_VERSION_4_2 SF_GLAD_GL_VERSION_4_2
+ #define GLEXT_GL_VERSION_4_3 SF_GLAD_GL_VERSION_4_3
+ #define GLEXT_GL_VERSION_4_4 SF_GLAD_GL_VERSION_4_4
+ #define GLEXT_GL_VERSION_4_5 SF_GLAD_GL_VERSION_4_5
+ #define GLEXT_GL_VERSION_4_6 SF_GLAD_GL_VERSION_4_6
+
namespace sf
{
namespace priv
diff --git a/src/SFML/Graphics/GLLoader.cpp b/src/SFML/Graphics/GLLoader.cpp
deleted file mode 100644
index 85f6d7e..0000000
--- a/src/SFML/Graphics/GLLoader.cpp
+++ /dev/null
@@ -1,1019 +0,0 @@
-////////////////////////////////////////////////////////////
-//
-// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
-//
-// This software is provided 'as-is', without any express or implied warranty.
-// In no event will the authors be held liable for any damages arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it freely,
-// subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented;
-// you must not claim that you wrote the original software.
-// If you use this software in a product, an acknowledgment
-// in the product documentation would be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such,
-// and must not be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source distribution.
-//
-////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////
-// Headers
-////////////////////////////////////////////////////////////
-#include <SFML/Graphics/GLLoader.hpp>
-#include <SFML/Window/Context.hpp>
-
-static sf::GlFunctionPointer glLoaderGetProcAddress(const char* name)
-{
- return sf::Context::getFunction(name);
-}
-
-int sfogl_ext_SGIS_texture_edge_clamp = sfogl_LOAD_FAILED;
-int sfogl_ext_EXT_texture_edge_clamp = sfogl_LOAD_FAILED;
-int sfogl_ext_EXT_blend_minmax = sfogl_LOAD_FAILED;
-int sfogl_ext_EXT_blend_subtract = sfogl_LOAD_FAILED;
-int sfogl_ext_ARB_multitexture = sfogl_LOAD_FAILED;
-int sfogl_ext_EXT_blend_func_separate = sfogl_LOAD_FAILED;
-int sfogl_ext_ARB_vertex_buffer_object = sfogl_LOAD_FAILED;
-int sfogl_ext_ARB_shading_language_100 = sfogl_LOAD_FAILED;
-int sfogl_ext_ARB_shader_objects = sfogl_LOAD_FAILED;
-int sfogl_ext_ARB_vertex_shader = sfogl_LOAD_FAILED;
-int sfogl_ext_ARB_fragment_shader = sfogl_LOAD_FAILED;
-int sfogl_ext_ARB_texture_non_power_of_two = sfogl_LOAD_FAILED;
-int sfogl_ext_EXT_blend_equation_separate = sfogl_LOAD_FAILED;
-int sfogl_ext_EXT_texture_sRGB = sfogl_LOAD_FAILED;
-int sfogl_ext_EXT_framebuffer_object = sfogl_LOAD_FAILED;
-int sfogl_ext_EXT_packed_depth_stencil = sfogl_LOAD_FAILED;
-int sfogl_ext_EXT_framebuffer_blit = sfogl_LOAD_FAILED;
-int sfogl_ext_EXT_framebuffer_multisample = sfogl_LOAD_FAILED;
-int sfogl_ext_ARB_copy_buffer = sfogl_LOAD_FAILED;
-int sfogl_ext_ARB_geometry_shader4 = sfogl_LOAD_FAILED;
-
-void (GL_FUNCPTR *sf_ptrc_glBlendEquationEXT)(GLenum) = NULL;
-
-static int Load_EXT_blend_minmax()
-{
- int numFailed = 0;
-
- sf_ptrc_glBlendEquationEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum)>(glLoaderGetProcAddress("glBlendEquationEXT"));
- if (!sf_ptrc_glBlendEquationEXT)
- numFailed++;
-
- return numFailed;
-}
-
-void (GL_FUNCPTR *sf_ptrc_glActiveTextureARB)(GLenum) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glClientActiveTextureARB)(GLenum) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1dARB)(GLenum, GLdouble) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1dvARB)(GLenum, const GLdouble*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1fARB)(GLenum, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1fvARB)(GLenum, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1iARB)(GLenum, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1ivARB)(GLenum, const GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1sARB)(GLenum, GLshort) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1svARB)(GLenum, const GLshort*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2dARB)(GLenum, GLdouble, GLdouble) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2dvARB)(GLenum, const GLdouble*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2fARB)(GLenum, GLfloat, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2fvARB)(GLenum, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2iARB)(GLenum, GLint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2ivARB)(GLenum, const GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2sARB)(GLenum, GLshort, GLshort) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2svARB)(GLenum, const GLshort*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3dARB)(GLenum, GLdouble, GLdouble, GLdouble) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3dvARB)(GLenum, const GLdouble*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3fARB)(GLenum, GLfloat, GLfloat, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3fvARB)(GLenum, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3iARB)(GLenum, GLint, GLint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3ivARB)(GLenum, const GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3sARB)(GLenum, GLshort, GLshort, GLshort) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3svARB)(GLenum, const GLshort*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4dARB)(GLenum, GLdouble, GLdouble, GLdouble, GLdouble) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4dvARB)(GLenum, const GLdouble*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4fARB)(GLenum, GLfloat, GLfloat, GLfloat, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4fvARB)(GLenum, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4iARB)(GLenum, GLint, GLint, GLint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4ivARB)(GLenum, const GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4sARB)(GLenum, GLshort, GLshort, GLshort, GLshort) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4svARB)(GLenum, const GLshort*) = NULL;
-
-static int Load_ARB_multitexture()
-{
- int numFailed = 0;
-
- sf_ptrc_glActiveTextureARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum)>(glLoaderGetProcAddress("glActiveTextureARB"));
- if (!sf_ptrc_glActiveTextureARB)
- numFailed++;
-
- sf_ptrc_glClientActiveTextureARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum)>(glLoaderGetProcAddress("glClientActiveTextureARB"));
- if (!sf_ptrc_glClientActiveTextureARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord1dARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLdouble)>(glLoaderGetProcAddress("glMultiTexCoord1dARB"));
- if (!sf_ptrc_glMultiTexCoord1dARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord1dvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLdouble*)>(glLoaderGetProcAddress("glMultiTexCoord1dvARB"));
- if (!sf_ptrc_glMultiTexCoord1dvARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord1fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLfloat)>(glLoaderGetProcAddress("glMultiTexCoord1fARB"));
- if (!sf_ptrc_glMultiTexCoord1fARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord1fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLfloat*)>(glLoaderGetProcAddress("glMultiTexCoord1fvARB"));
- if (!sf_ptrc_glMultiTexCoord1fvARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord1iARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLint)>(glLoaderGetProcAddress("glMultiTexCoord1iARB"));
- if (!sf_ptrc_glMultiTexCoord1iARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord1ivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLint*)>(glLoaderGetProcAddress("glMultiTexCoord1ivARB"));
- if (!sf_ptrc_glMultiTexCoord1ivARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord1sARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLshort)>(glLoaderGetProcAddress("glMultiTexCoord1sARB"));
- if (!sf_ptrc_glMultiTexCoord1sARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord1svARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLshort*)>(glLoaderGetProcAddress("glMultiTexCoord1svARB"));
- if (!sf_ptrc_glMultiTexCoord1svARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord2dARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLdouble, GLdouble)>(glLoaderGetProcAddress("glMultiTexCoord2dARB"));
- if (!sf_ptrc_glMultiTexCoord2dARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord2dvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLdouble*)>(glLoaderGetProcAddress("glMultiTexCoord2dvARB"));
- if (!sf_ptrc_glMultiTexCoord2dvARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord2fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLfloat, GLfloat)>(glLoaderGetProcAddress("glMultiTexCoord2fARB"));
- if (!sf_ptrc_glMultiTexCoord2fARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord2fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLfloat*)>(glLoaderGetProcAddress("glMultiTexCoord2fvARB"));
- if (!sf_ptrc_glMultiTexCoord2fvARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord2iARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLint, GLint)>(glLoaderGetProcAddress("glMultiTexCoord2iARB"));
- if (!sf_ptrc_glMultiTexCoord2iARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord2ivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLint*)>(glLoaderGetProcAddress("glMultiTexCoord2ivARB"));
- if (!sf_ptrc_glMultiTexCoord2ivARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord2sARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLshort, GLshort)>(glLoaderGetProcAddress("glMultiTexCoord2sARB"));
- if (!sf_ptrc_glMultiTexCoord2sARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord2svARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLshort*)>(glLoaderGetProcAddress("glMultiTexCoord2svARB"));
- if (!sf_ptrc_glMultiTexCoord2svARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord3dARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLdouble, GLdouble, GLdouble)>(glLoaderGetProcAddress("glMultiTexCoord3dARB"));
- if (!sf_ptrc_glMultiTexCoord3dARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord3dvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLdouble*)>(glLoaderGetProcAddress("glMultiTexCoord3dvARB"));
- if (!sf_ptrc_glMultiTexCoord3dvARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord3fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLfloat, GLfloat, GLfloat)>(glLoaderGetProcAddress("glMultiTexCoord3fARB"));
- if (!sf_ptrc_glMultiTexCoord3fARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord3fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLfloat*)>(glLoaderGetProcAddress("glMultiTexCoord3fvARB"));
- if (!sf_ptrc_glMultiTexCoord3fvARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord3iARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLint, GLint, GLint)>(glLoaderGetProcAddress("glMultiTexCoord3iARB"));
- if (!sf_ptrc_glMultiTexCoord3iARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord3ivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLint*)>(glLoaderGetProcAddress("glMultiTexCoord3ivARB"));
- if (!sf_ptrc_glMultiTexCoord3ivARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord3sARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLshort, GLshort, GLshort)>(glLoaderGetProcAddress("glMultiTexCoord3sARB"));
- if (!sf_ptrc_glMultiTexCoord3sARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord3svARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLshort*)>(glLoaderGetProcAddress("glMultiTexCoord3svARB"));
- if (!sf_ptrc_glMultiTexCoord3svARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord4dARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLdouble, GLdouble, GLdouble, GLdouble)>(glLoaderGetProcAddress("glMultiTexCoord4dARB"));
- if (!sf_ptrc_glMultiTexCoord4dARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord4dvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLdouble*)>(glLoaderGetProcAddress("glMultiTexCoord4dvARB"));
- if (!sf_ptrc_glMultiTexCoord4dvARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord4fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLfloat, GLfloat, GLfloat, GLfloat)>(glLoaderGetProcAddress("glMultiTexCoord4fARB"));
- if (!sf_ptrc_glMultiTexCoord4fARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord4fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLfloat*)>(glLoaderGetProcAddress("glMultiTexCoord4fvARB"));
- if (!sf_ptrc_glMultiTexCoord4fvARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord4iARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLint, GLint, GLint, GLint)>(glLoaderGetProcAddress("glMultiTexCoord4iARB"));
- if (!sf_ptrc_glMultiTexCoord4iARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord4ivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLint*)>(glLoaderGetProcAddress("glMultiTexCoord4ivARB"));
- if (!sf_ptrc_glMultiTexCoord4ivARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord4sARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLshort, GLshort, GLshort, GLshort)>(glLoaderGetProcAddress("glMultiTexCoord4sARB"));
- if (!sf_ptrc_glMultiTexCoord4sARB)
- numFailed++;
-
- sf_ptrc_glMultiTexCoord4svARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, const GLshort*)>(glLoaderGetProcAddress("glMultiTexCoord4svARB"));
- if (!sf_ptrc_glMultiTexCoord4svARB)
- numFailed++;
-
- return numFailed;
-}
-
-void (GL_FUNCPTR *sf_ptrc_glBlendFuncSeparateEXT)(GLenum, GLenum, GLenum, GLenum) = NULL;
-
-static int Load_EXT_blend_func_separate()
-{
- int numFailed = 0;
-
- sf_ptrc_glBlendFuncSeparateEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLenum, GLenum)>(glLoaderGetProcAddress("glBlendFuncSeparateEXT"));
- if (!sf_ptrc_glBlendFuncSeparateEXT)
- numFailed++;
-
- return numFailed;
-}
-
-void (GL_FUNCPTR *sf_ptrc_glBindBufferARB)(GLenum, GLuint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glBufferDataARB)(GLenum, GLsizeiptrARB, const void*, GLenum) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glBufferSubDataARB)(GLenum, GLintptrARB, GLsizeiptrARB, const void*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glDeleteBuffersARB)(GLsizei, const GLuint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGenBuffersARB)(GLsizei, GLuint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetBufferParameterivARB)(GLenum, GLenum, GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetBufferPointervARB)(GLenum, GLenum, void**) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetBufferSubDataARB)(GLenum, GLintptrARB, GLsizeiptrARB, void*) = NULL;
-GLboolean (GL_FUNCPTR *sf_ptrc_glIsBufferARB)(GLuint) = NULL;
-void* (GL_FUNCPTR *sf_ptrc_glMapBufferARB)(GLenum, GLenum) = NULL;
-GLboolean (GL_FUNCPTR *sf_ptrc_glUnmapBufferARB)(GLenum) = NULL;
-
-static int Load_ARB_vertex_buffer_object()
-{
- int numFailed = 0;
-
- sf_ptrc_glBindBufferARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLuint)>(glLoaderGetProcAddress("glBindBufferARB"));
- if (!sf_ptrc_glBindBufferARB)
- numFailed++;
-
- sf_ptrc_glBufferDataARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLsizeiptrARB, const void*, GLenum)>(glLoaderGetProcAddress("glBufferDataARB"));
- if (!sf_ptrc_glBufferDataARB)
- numFailed++;
-
- sf_ptrc_glBufferSubDataARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLintptrARB, GLsizeiptrARB, const void*)>(glLoaderGetProcAddress("glBufferSubDataARB"));
- if (!sf_ptrc_glBufferSubDataARB)
- numFailed++;
-
- sf_ptrc_glDeleteBuffersARB = reinterpret_cast<void (GL_FUNCPTR *)(GLsizei, const GLuint*)>(glLoaderGetProcAddress("glDeleteBuffersARB"));
- if (!sf_ptrc_glDeleteBuffersARB)
- numFailed++;
-
- sf_ptrc_glGenBuffersARB = reinterpret_cast<void (GL_FUNCPTR *)(GLsizei, GLuint*)>(glLoaderGetProcAddress("glGenBuffersARB"));
- if (!sf_ptrc_glGenBuffersARB)
- numFailed++;
-
- sf_ptrc_glGetBufferParameterivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLint*)>(glLoaderGetProcAddress("glGetBufferParameterivARB"));
- if (!sf_ptrc_glGetBufferParameterivARB)
- numFailed++;
-
- sf_ptrc_glGetBufferPointervARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, void**)>(glLoaderGetProcAddress("glGetBufferPointervARB"));
- if (!sf_ptrc_glGetBufferPointervARB)
- numFailed++;
-
- sf_ptrc_glGetBufferSubDataARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLintptrARB, GLsizeiptrARB, void*)>(glLoaderGetProcAddress("glGetBufferSubDataARB"));
- if (!sf_ptrc_glGetBufferSubDataARB)
- numFailed++;
-
- sf_ptrc_glIsBufferARB = reinterpret_cast<GLboolean (GL_FUNCPTR *)(GLuint)>(glLoaderGetProcAddress("glIsBufferARB"));
- if (!sf_ptrc_glIsBufferARB)
- numFailed++;
-
- sf_ptrc_glMapBufferARB = reinterpret_cast<void* (GL_FUNCPTR *)(GLenum, GLenum)>(glLoaderGetProcAddress("glMapBufferARB"));
- if (!sf_ptrc_glMapBufferARB)
- numFailed++;
-
- sf_ptrc_glUnmapBufferARB = reinterpret_cast<GLboolean (GL_FUNCPTR *)(GLenum)>(glLoaderGetProcAddress("glUnmapBufferARB"));
- if (!sf_ptrc_glUnmapBufferARB)
- numFailed++;
-
- return numFailed;
-}
-
-void (GL_FUNCPTR *sf_ptrc_glAttachObjectARB)(GLhandleARB, GLhandleARB) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glCompileShaderARB)(GLhandleARB) = NULL;
-GLhandleARB (GL_FUNCPTR *sf_ptrc_glCreateProgramObjectARB)() = NULL;
-GLhandleARB (GL_FUNCPTR *sf_ptrc_glCreateShaderObjectARB)(GLenum) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glDeleteObjectARB)(GLhandleARB) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glDetachObjectARB)(GLhandleARB, GLhandleARB) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetActiveUniformARB)(GLhandleARB, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLcharARB*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetAttachedObjectsARB)(GLhandleARB, GLsizei, GLsizei*, GLhandleARB*) = NULL;
-GLhandleARB (GL_FUNCPTR *sf_ptrc_glGetHandleARB)(GLenum) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetInfoLogARB)(GLhandleARB, GLsizei, GLsizei*, GLcharARB*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetObjectParameterfvARB)(GLhandleARB, GLenum, GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetObjectParameterivARB)(GLhandleARB, GLenum, GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetShaderSourceARB)(GLhandleARB, GLsizei, GLsizei*, GLcharARB*) = NULL;
-GLint (GL_FUNCPTR *sf_ptrc_glGetUniformLocationARB)(GLhandleARB, const GLcharARB*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetUniformfvARB)(GLhandleARB, GLint, GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetUniformivARB)(GLhandleARB, GLint, GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glLinkProgramARB)(GLhandleARB) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glShaderSourceARB)(GLhandleARB, GLsizei, const GLcharARB**, const GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform1fARB)(GLint, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform1fvARB)(GLint, GLsizei, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform1iARB)(GLint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform1ivARB)(GLint, GLsizei, const GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform2fARB)(GLint, GLfloat, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform2fvARB)(GLint, GLsizei, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform2iARB)(GLint, GLint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform2ivARB)(GLint, GLsizei, const GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform3fARB)(GLint, GLfloat, GLfloat, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform3fvARB)(GLint, GLsizei, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform3iARB)(GLint, GLint, GLint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform3ivARB)(GLint, GLsizei, const GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform4fARB)(GLint, GLfloat, GLfloat, GLfloat, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform4fvARB)(GLint, GLsizei, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform4iARB)(GLint, GLint, GLint, GLint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniform4ivARB)(GLint, GLsizei, const GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniformMatrix2fvARB)(GLint, GLsizei, GLboolean, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniformMatrix3fvARB)(GLint, GLsizei, GLboolean, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUniformMatrix4fvARB)(GLint, GLsizei, GLboolean, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glUseProgramObjectARB)(GLhandleARB) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glValidateProgramARB)(GLhandleARB) = NULL;
-
-static int Load_ARB_shader_objects()
-{
- int numFailed = 0;
-
- sf_ptrc_glAttachObjectARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLhandleARB)>(glLoaderGetProcAddress("glAttachObjectARB"));
- if (!sf_ptrc_glAttachObjectARB)
- numFailed++;
-
- sf_ptrc_glCompileShaderARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB)>(glLoaderGetProcAddress("glCompileShaderARB"));
- if (!sf_ptrc_glCompileShaderARB)
- numFailed++;
-
- sf_ptrc_glCreateProgramObjectARB = reinterpret_cast<GLhandleARB (GL_FUNCPTR *)()>(glLoaderGetProcAddress("glCreateProgramObjectARB"));
- if (!sf_ptrc_glCreateProgramObjectARB)
- numFailed++;
-
- sf_ptrc_glCreateShaderObjectARB = reinterpret_cast<GLhandleARB (GL_FUNCPTR *)(GLenum)>(glLoaderGetProcAddress("glCreateShaderObjectARB"));
- if (!sf_ptrc_glCreateShaderObjectARB)
- numFailed++;
-
- sf_ptrc_glDeleteObjectARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB)>(glLoaderGetProcAddress("glDeleteObjectARB"));
- if (!sf_ptrc_glDeleteObjectARB)
- numFailed++;
-
- sf_ptrc_glDetachObjectARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLhandleARB)>(glLoaderGetProcAddress("glDetachObjectARB"));
- if (!sf_ptrc_glDetachObjectARB)
- numFailed++;
-
- sf_ptrc_glGetActiveUniformARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLcharARB*)>(glLoaderGetProcAddress("glGetActiveUniformARB"));
- if (!sf_ptrc_glGetActiveUniformARB)
- numFailed++;
-
- sf_ptrc_glGetAttachedObjectsARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLsizei, GLsizei*, GLhandleARB*)>(glLoaderGetProcAddress("glGetAttachedObjectsARB"));
- if (!sf_ptrc_glGetAttachedObjectsARB)
- numFailed++;
-
- sf_ptrc_glGetHandleARB = reinterpret_cast<GLhandleARB (GL_FUNCPTR *)(GLenum)>(glLoaderGetProcAddress("glGetHandleARB"));
- if (!sf_ptrc_glGetHandleARB)
- numFailed++;
-
- sf_ptrc_glGetInfoLogARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLsizei, GLsizei*, GLcharARB*)>(glLoaderGetProcAddress("glGetInfoLogARB"));
- if (!sf_ptrc_glGetInfoLogARB)
- numFailed++;
-
- sf_ptrc_glGetObjectParameterfvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLenum, GLfloat*)>(glLoaderGetProcAddress("glGetObjectParameterfvARB"));
- if (!sf_ptrc_glGetObjectParameterfvARB)
- numFailed++;
-
- sf_ptrc_glGetObjectParameterivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLenum, GLint*)>(glLoaderGetProcAddress("glGetObjectParameterivARB"));
- if (!sf_ptrc_glGetObjectParameterivARB)
- numFailed++;
-
- sf_ptrc_glGetShaderSourceARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLsizei, GLsizei*, GLcharARB*)>(glLoaderGetProcAddress("glGetShaderSourceARB"));
- if (!sf_ptrc_glGetShaderSourceARB)
- numFailed++;
-
- sf_ptrc_glGetUniformLocationARB = reinterpret_cast<GLint (GL_FUNCPTR *)(GLhandleARB, const GLcharARB*)>(glLoaderGetProcAddress("glGetUniformLocationARB"));
- if (!sf_ptrc_glGetUniformLocationARB)
- numFailed++;
-
- sf_ptrc_glGetUniformfvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLint, GLfloat*)>(glLoaderGetProcAddress("glGetUniformfvARB"));
- if (!sf_ptrc_glGetUniformfvARB)
- numFailed++;
-
- sf_ptrc_glGetUniformivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLint, GLint*)>(glLoaderGetProcAddress("glGetUniformivARB"));
- if (!sf_ptrc_glGetUniformivARB)
- numFailed++;
-
- sf_ptrc_glLinkProgramARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB)>(glLoaderGetProcAddress("glLinkProgramARB"));
- if (!sf_ptrc_glLinkProgramARB)
- numFailed++;
-
- sf_ptrc_glShaderSourceARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLsizei, const GLcharARB**, const GLint*)>(glLoaderGetProcAddress("glShaderSourceARB"));
- if (!sf_ptrc_glShaderSourceARB)
- numFailed++;
-
- sf_ptrc_glUniform1fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLfloat)>(glLoaderGetProcAddress("glUniform1fARB"));
- if (!sf_ptrc_glUniform1fARB)
- numFailed++;
-
- sf_ptrc_glUniform1fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLsizei, const GLfloat*)>(glLoaderGetProcAddress("glUniform1fvARB"));
- if (!sf_ptrc_glUniform1fvARB)
- numFailed++;
-
- sf_ptrc_glUniform1iARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLint)>(glLoaderGetProcAddress("glUniform1iARB"));
- if (!sf_ptrc_glUniform1iARB)
- numFailed++;
-
- sf_ptrc_glUniform1ivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLsizei, const GLint*)>(glLoaderGetProcAddress("glUniform1ivARB"));
- if (!sf_ptrc_glUniform1ivARB)
- numFailed++;
-
- sf_ptrc_glUniform2fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLfloat, GLfloat)>(glLoaderGetProcAddress("glUniform2fARB"));
- if (!sf_ptrc_glUniform2fARB)
- numFailed++;
-
- sf_ptrc_glUniform2fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLsizei, const GLfloat*)>(glLoaderGetProcAddress("glUniform2fvARB"));
- if (!sf_ptrc_glUniform2fvARB)
- numFailed++;
-
- sf_ptrc_glUniform2iARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLint, GLint)>(glLoaderGetProcAddress("glUniform2iARB"));
- if (!sf_ptrc_glUniform2iARB)
- numFailed++;
-
- sf_ptrc_glUniform2ivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLsizei, const GLint*)>(glLoaderGetProcAddress("glUniform2ivARB"));
- if (!sf_ptrc_glUniform2ivARB)
- numFailed++;
-
- sf_ptrc_glUniform3fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLfloat, GLfloat, GLfloat)>(glLoaderGetProcAddress("glUniform3fARB"));
- if (!sf_ptrc_glUniform3fARB)
- numFailed++;
-
- sf_ptrc_glUniform3fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLsizei, const GLfloat*)>(glLoaderGetProcAddress("glUniform3fvARB"));
- if (!sf_ptrc_glUniform3fvARB)
- numFailed++;
-
- sf_ptrc_glUniform3iARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLint, GLint, GLint)>(glLoaderGetProcAddress("glUniform3iARB"));
- if (!sf_ptrc_glUniform3iARB)
- numFailed++;
-
- sf_ptrc_glUniform3ivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLsizei, const GLint*)>(glLoaderGetProcAddress("glUniform3ivARB"));
- if (!sf_ptrc_glUniform3ivARB)
- numFailed++;
-
- sf_ptrc_glUniform4fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLfloat, GLfloat, GLfloat, GLfloat)>(glLoaderGetProcAddress("glUniform4fARB"));
- if (!sf_ptrc_glUniform4fARB)
- numFailed++;
-
- sf_ptrc_glUniform4fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLsizei, const GLfloat*)>(glLoaderGetProcAddress("glUniform4fvARB"));
- if (!sf_ptrc_glUniform4fvARB)
- numFailed++;
-
- sf_ptrc_glUniform4iARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLint, GLint, GLint, GLint)>(glLoaderGetProcAddress("glUniform4iARB"));
- if (!sf_ptrc_glUniform4iARB)
- numFailed++;
-
- sf_ptrc_glUniform4ivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLsizei, const GLint*)>(glLoaderGetProcAddress("glUniform4ivARB"));
- if (!sf_ptrc_glUniform4ivARB)
- numFailed++;
-
- sf_ptrc_glUniformMatrix2fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLsizei, GLboolean, const GLfloat*)>(glLoaderGetProcAddress("glUniformMatrix2fvARB"));
- if (!sf_ptrc_glUniformMatrix2fvARB)
- numFailed++;
-
- sf_ptrc_glUniformMatrix3fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLsizei, GLboolean, const GLfloat*)>(glLoaderGetProcAddress("glUniformMatrix3fvARB"));
- if (!sf_ptrc_glUniformMatrix3fvARB)
- numFailed++;
-
- sf_ptrc_glUniformMatrix4fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLsizei, GLboolean, const GLfloat*)>(glLoaderGetProcAddress("glUniformMatrix4fvARB"));
- if (!sf_ptrc_glUniformMatrix4fvARB)
- numFailed++;
-
- sf_ptrc_glUseProgramObjectARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB)>(glLoaderGetProcAddress("glUseProgramObjectARB"));
- if (!sf_ptrc_glUseProgramObjectARB)
- numFailed++;
-
- sf_ptrc_glValidateProgramARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB)>(glLoaderGetProcAddress("glValidateProgramARB"));
- if (!sf_ptrc_glValidateProgramARB)
- numFailed++;
-
- return numFailed;
-}
-
-void (GL_FUNCPTR *sf_ptrc_glBindAttribLocationARB)(GLhandleARB, GLuint, const GLcharARB*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glDisableVertexAttribArrayARB)(GLuint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glEnableVertexAttribArrayARB)(GLuint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetActiveAttribARB)(GLhandleARB, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLcharARB*) = NULL;
-GLint (GL_FUNCPTR *sf_ptrc_glGetAttribLocationARB)(GLhandleARB, const GLcharARB*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetVertexAttribPointervARB)(GLuint, GLenum, void**) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetVertexAttribdvARB)(GLuint, GLenum, GLdouble*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetVertexAttribfvARB)(GLuint, GLenum, GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetVertexAttribivARB)(GLuint, GLenum, GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1dARB)(GLuint, GLdouble) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1dvARB)(GLuint, const GLdouble*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1fARB)(GLuint, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1fvARB)(GLuint, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1sARB)(GLuint, GLshort) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1svARB)(GLuint, const GLshort*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2dARB)(GLuint, GLdouble, GLdouble) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2dvARB)(GLuint, const GLdouble*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2fARB)(GLuint, GLfloat, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2fvARB)(GLuint, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2sARB)(GLuint, GLshort, GLshort) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2svARB)(GLuint, const GLshort*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3dARB)(GLuint, GLdouble, GLdouble, GLdouble) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3dvARB)(GLuint, const GLdouble*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3fARB)(GLuint, GLfloat, GLfloat, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3fvARB)(GLuint, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3sARB)(GLuint, GLshort, GLshort, GLshort) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3svARB)(GLuint, const GLshort*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NbvARB)(GLuint, const GLbyte*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NivARB)(GLuint, const GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NsvARB)(GLuint, const GLshort*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NubARB)(GLuint, GLubyte, GLubyte, GLubyte, GLubyte) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NubvARB)(GLuint, const GLubyte*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NuivARB)(GLuint, const GLuint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NusvARB)(GLuint, const GLushort*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4bvARB)(GLuint, const GLbyte*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4dARB)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4dvARB)(GLuint, const GLdouble*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4fARB)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4fvARB)(GLuint, const GLfloat*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4ivARB)(GLuint, const GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4sARB)(GLuint, GLshort, GLshort, GLshort, GLshort) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4svARB)(GLuint, const GLshort*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4ubvARB)(GLuint, const GLubyte*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4uivARB)(GLuint, const GLuint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4usvARB)(GLuint, const GLushort*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glVertexAttribPointerARB)(GLuint, GLint, GLenum, GLboolean, GLsizei, const void*) = NULL;
-
-static int Load_ARB_vertex_shader()
-{
- int numFailed = 0;
-
- sf_ptrc_glBindAttribLocationARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLuint, const GLcharARB*)>(glLoaderGetProcAddress("glBindAttribLocationARB"));
- if (!sf_ptrc_glBindAttribLocationARB)
- numFailed++;
-
- sf_ptrc_glDisableVertexAttribArrayARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint)>(glLoaderGetProcAddress("glDisableVertexAttribArrayARB"));
- if (!sf_ptrc_glDisableVertexAttribArrayARB)
- numFailed++;
-
- sf_ptrc_glEnableVertexAttribArrayARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint)>(glLoaderGetProcAddress("glEnableVertexAttribArrayARB"));
- if (!sf_ptrc_glEnableVertexAttribArrayARB)
- numFailed++;
-
- sf_ptrc_glGetActiveAttribARB = reinterpret_cast<void (GL_FUNCPTR *)(GLhandleARB, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLcharARB*)>(glLoaderGetProcAddress("glGetActiveAttribARB"));
- if (!sf_ptrc_glGetActiveAttribARB)
- numFailed++;
-
- sf_ptrc_glGetAttribLocationARB = reinterpret_cast<GLint (GL_FUNCPTR *)(GLhandleARB, const GLcharARB*)>(glLoaderGetProcAddress("glGetAttribLocationARB"));
- if (!sf_ptrc_glGetAttribLocationARB)
- numFailed++;
-
- sf_ptrc_glGetVertexAttribPointervARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLenum, void**)>(glLoaderGetProcAddress("glGetVertexAttribPointervARB"));
- if (!sf_ptrc_glGetVertexAttribPointervARB)
- numFailed++;
-
- sf_ptrc_glGetVertexAttribdvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLenum, GLdouble*)>(glLoaderGetProcAddress("glGetVertexAttribdvARB"));
- if (!sf_ptrc_glGetVertexAttribdvARB)
- numFailed++;
-
- sf_ptrc_glGetVertexAttribfvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLenum, GLfloat*)>(glLoaderGetProcAddress("glGetVertexAttribfvARB"));
- if (!sf_ptrc_glGetVertexAttribfvARB)
- numFailed++;
-
- sf_ptrc_glGetVertexAttribivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLenum, GLint*)>(glLoaderGetProcAddress("glGetVertexAttribivARB"));
- if (!sf_ptrc_glGetVertexAttribivARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib1dARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLdouble)>(glLoaderGetProcAddress("glVertexAttrib1dARB"));
- if (!sf_ptrc_glVertexAttrib1dARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib1dvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLdouble*)>(glLoaderGetProcAddress("glVertexAttrib1dvARB"));
- if (!sf_ptrc_glVertexAttrib1dvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib1fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLfloat)>(glLoaderGetProcAddress("glVertexAttrib1fARB"));
- if (!sf_ptrc_glVertexAttrib1fARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib1fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLfloat*)>(glLoaderGetProcAddress("glVertexAttrib1fvARB"));
- if (!sf_ptrc_glVertexAttrib1fvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib1sARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLshort)>(glLoaderGetProcAddress("glVertexAttrib1sARB"));
- if (!sf_ptrc_glVertexAttrib1sARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib1svARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLshort*)>(glLoaderGetProcAddress("glVertexAttrib1svARB"));
- if (!sf_ptrc_glVertexAttrib1svARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib2dARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLdouble, GLdouble)>(glLoaderGetProcAddress("glVertexAttrib2dARB"));
- if (!sf_ptrc_glVertexAttrib2dARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib2dvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLdouble*)>(glLoaderGetProcAddress("glVertexAttrib2dvARB"));
- if (!sf_ptrc_glVertexAttrib2dvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib2fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLfloat, GLfloat)>(glLoaderGetProcAddress("glVertexAttrib2fARB"));
- if (!sf_ptrc_glVertexAttrib2fARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib2fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLfloat*)>(glLoaderGetProcAddress("glVertexAttrib2fvARB"));
- if (!sf_ptrc_glVertexAttrib2fvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib2sARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLshort, GLshort)>(glLoaderGetProcAddress("glVertexAttrib2sARB"));
- if (!sf_ptrc_glVertexAttrib2sARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib2svARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLshort*)>(glLoaderGetProcAddress("glVertexAttrib2svARB"));
- if (!sf_ptrc_glVertexAttrib2svARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib3dARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLdouble, GLdouble, GLdouble)>(glLoaderGetProcAddress("glVertexAttrib3dARB"));
- if (!sf_ptrc_glVertexAttrib3dARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib3dvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLdouble*)>(glLoaderGetProcAddress("glVertexAttrib3dvARB"));
- if (!sf_ptrc_glVertexAttrib3dvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib3fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLfloat, GLfloat, GLfloat)>(glLoaderGetProcAddress("glVertexAttrib3fARB"));
- if (!sf_ptrc_glVertexAttrib3fARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib3fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLfloat*)>(glLoaderGetProcAddress("glVertexAttrib3fvARB"));
- if (!sf_ptrc_glVertexAttrib3fvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib3sARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLshort, GLshort, GLshort)>(glLoaderGetProcAddress("glVertexAttrib3sARB"));
- if (!sf_ptrc_glVertexAttrib3sARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib3svARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLshort*)>(glLoaderGetProcAddress("glVertexAttrib3svARB"));
- if (!sf_ptrc_glVertexAttrib3svARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4NbvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLbyte*)>(glLoaderGetProcAddress("glVertexAttrib4NbvARB"));
- if (!sf_ptrc_glVertexAttrib4NbvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4NivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLint*)>(glLoaderGetProcAddress("glVertexAttrib4NivARB"));
- if (!sf_ptrc_glVertexAttrib4NivARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4NsvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLshort*)>(glLoaderGetProcAddress("glVertexAttrib4NsvARB"));
- if (!sf_ptrc_glVertexAttrib4NsvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4NubARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLubyte, GLubyte, GLubyte, GLubyte)>(glLoaderGetProcAddress("glVertexAttrib4NubARB"));
- if (!sf_ptrc_glVertexAttrib4NubARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4NubvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLubyte*)>(glLoaderGetProcAddress("glVertexAttrib4NubvARB"));
- if (!sf_ptrc_glVertexAttrib4NubvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4NuivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLuint*)>(glLoaderGetProcAddress("glVertexAttrib4NuivARB"));
- if (!sf_ptrc_glVertexAttrib4NuivARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4NusvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLushort*)>(glLoaderGetProcAddress("glVertexAttrib4NusvARB"));
- if (!sf_ptrc_glVertexAttrib4NusvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4bvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLbyte*)>(glLoaderGetProcAddress("glVertexAttrib4bvARB"));
- if (!sf_ptrc_glVertexAttrib4bvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4dARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble)>(glLoaderGetProcAddress("glVertexAttrib4dARB"));
- if (!sf_ptrc_glVertexAttrib4dARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4dvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLdouble*)>(glLoaderGetProcAddress("glVertexAttrib4dvARB"));
- if (!sf_ptrc_glVertexAttrib4dvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4fARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat)>(glLoaderGetProcAddress("glVertexAttrib4fARB"));
- if (!sf_ptrc_glVertexAttrib4fARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4fvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLfloat*)>(glLoaderGetProcAddress("glVertexAttrib4fvARB"));
- if (!sf_ptrc_glVertexAttrib4fvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4ivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLint*)>(glLoaderGetProcAddress("glVertexAttrib4ivARB"));
- if (!sf_ptrc_glVertexAttrib4ivARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4sARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLshort, GLshort, GLshort, GLshort)>(glLoaderGetProcAddress("glVertexAttrib4sARB"));
- if (!sf_ptrc_glVertexAttrib4sARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4svARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLshort*)>(glLoaderGetProcAddress("glVertexAttrib4svARB"));
- if (!sf_ptrc_glVertexAttrib4svARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4ubvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLubyte*)>(glLoaderGetProcAddress("glVertexAttrib4ubvARB"));
- if (!sf_ptrc_glVertexAttrib4ubvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4uivARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLuint*)>(glLoaderGetProcAddress("glVertexAttrib4uivARB"));
- if (!sf_ptrc_glVertexAttrib4uivARB)
- numFailed++;
-
- sf_ptrc_glVertexAttrib4usvARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, const GLushort*)>(glLoaderGetProcAddress("glVertexAttrib4usvARB"));
- if (!sf_ptrc_glVertexAttrib4usvARB)
- numFailed++;
-
- sf_ptrc_glVertexAttribPointerARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLint, GLenum, GLboolean, GLsizei, const void*)>(glLoaderGetProcAddress("glVertexAttribPointerARB"));
- if (!sf_ptrc_glVertexAttribPointerARB)
- numFailed++;
-
- return numFailed;
-}
-
-void (GL_FUNCPTR *sf_ptrc_glBlendEquationSeparateEXT)(GLenum, GLenum) = NULL;
-
-static int Load_EXT_blend_equation_separate()
-{
- int numFailed = 0;
-
- sf_ptrc_glBlendEquationSeparateEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum)>(glLoaderGetProcAddress("glBlendEquationSeparateEXT"));
- if (!sf_ptrc_glBlendEquationSeparateEXT)
- numFailed++;
-
- return numFailed;
-}
-
-void (GL_FUNCPTR *sf_ptrc_glBindFramebufferEXT)(GLenum, GLuint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glBindRenderbufferEXT)(GLenum, GLuint) = NULL;
-GLenum (GL_FUNCPTR *sf_ptrc_glCheckFramebufferStatusEXT)(GLenum) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glDeleteFramebuffersEXT)(GLsizei, const GLuint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glDeleteRenderbuffersEXT)(GLsizei, const GLuint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glFramebufferRenderbufferEXT)(GLenum, GLenum, GLenum, GLuint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glFramebufferTexture1DEXT)(GLenum, GLenum, GLenum, GLuint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glFramebufferTexture2DEXT)(GLenum, GLenum, GLenum, GLuint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glFramebufferTexture3DEXT)(GLenum, GLenum, GLenum, GLuint, GLint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGenFramebuffersEXT)(GLsizei, GLuint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGenRenderbuffersEXT)(GLsizei, GLuint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGenerateMipmapEXT)(GLenum) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetFramebufferAttachmentParameterivEXT)(GLenum, GLenum, GLenum, GLint*) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glGetRenderbufferParameterivEXT)(GLenum, GLenum, GLint*) = NULL;
-GLboolean (GL_FUNCPTR *sf_ptrc_glIsFramebufferEXT)(GLuint) = NULL;
-GLboolean (GL_FUNCPTR *sf_ptrc_glIsRenderbufferEXT)(GLuint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glRenderbufferStorageEXT)(GLenum, GLenum, GLsizei, GLsizei) = NULL;
-
-static int Load_EXT_framebuffer_object()
-{
- int numFailed = 0;
-
- sf_ptrc_glBindFramebufferEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLuint)>(glLoaderGetProcAddress("glBindFramebufferEXT"));
- if (!sf_ptrc_glBindFramebufferEXT)
- numFailed++;
-
- sf_ptrc_glBindRenderbufferEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLuint)>(glLoaderGetProcAddress("glBindRenderbufferEXT"));
- if (!sf_ptrc_glBindRenderbufferEXT)
- numFailed++;
-
- sf_ptrc_glCheckFramebufferStatusEXT = reinterpret_cast<GLenum (GL_FUNCPTR *)(GLenum)>(glLoaderGetProcAddress("glCheckFramebufferStatusEXT"));
- if (!sf_ptrc_glCheckFramebufferStatusEXT)
- numFailed++;
-
- sf_ptrc_glDeleteFramebuffersEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLsizei, const GLuint*)>(glLoaderGetProcAddress("glDeleteFramebuffersEXT"));
- if (!sf_ptrc_glDeleteFramebuffersEXT)
- numFailed++;
-
- sf_ptrc_glDeleteRenderbuffersEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLsizei, const GLuint*)>(glLoaderGetProcAddress("glDeleteRenderbuffersEXT"));
- if (!sf_ptrc_glDeleteRenderbuffersEXT)
- numFailed++;
-
- sf_ptrc_glFramebufferRenderbufferEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLenum, GLuint)>(glLoaderGetProcAddress("glFramebufferRenderbufferEXT"));
- if (!sf_ptrc_glFramebufferRenderbufferEXT)
- numFailed++;
-
- sf_ptrc_glFramebufferTexture1DEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLenum, GLuint, GLint)>(glLoaderGetProcAddress("glFramebufferTexture1DEXT"));
- if (!sf_ptrc_glFramebufferTexture1DEXT)
- numFailed++;
-
- sf_ptrc_glFramebufferTexture2DEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLenum, GLuint, GLint)>(glLoaderGetProcAddress("glFramebufferTexture2DEXT"));
- if (!sf_ptrc_glFramebufferTexture2DEXT)
- numFailed++;
-
- sf_ptrc_glFramebufferTexture3DEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLenum, GLuint, GLint, GLint)>(glLoaderGetProcAddress("glFramebufferTexture3DEXT"));
- if (!sf_ptrc_glFramebufferTexture3DEXT)
- numFailed++;
-
- sf_ptrc_glGenFramebuffersEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLsizei, GLuint*)>(glLoaderGetProcAddress("glGenFramebuffersEXT"));
- if (!sf_ptrc_glGenFramebuffersEXT)
- numFailed++;
-
- sf_ptrc_glGenRenderbuffersEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLsizei, GLuint*)>(glLoaderGetProcAddress("glGenRenderbuffersEXT"));
- if (!sf_ptrc_glGenRenderbuffersEXT)
- numFailed++;
-
- sf_ptrc_glGenerateMipmapEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum)>(glLoaderGetProcAddress("glGenerateMipmapEXT"));
- if (!sf_ptrc_glGenerateMipmapEXT)
- numFailed++;
-
- sf_ptrc_glGetFramebufferAttachmentParameterivEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLenum, GLint*)>(glLoaderGetProcAddress("glGetFramebufferAttachmentParameterivEXT"));
- if (!sf_ptrc_glGetFramebufferAttachmentParameterivEXT)
- numFailed++;
-
- sf_ptrc_glGetRenderbufferParameterivEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLint*)>(glLoaderGetProcAddress("glGetRenderbufferParameterivEXT"));
- if (!sf_ptrc_glGetRenderbufferParameterivEXT)
- numFailed++;
-
- sf_ptrc_glIsFramebufferEXT = reinterpret_cast<GLboolean (GL_FUNCPTR *)(GLuint)>(glLoaderGetProcAddress("glIsFramebufferEXT"));
- if (!sf_ptrc_glIsFramebufferEXT)
- numFailed++;
-
- sf_ptrc_glIsRenderbufferEXT = reinterpret_cast<GLboolean (GL_FUNCPTR *)(GLuint)>(glLoaderGetProcAddress("glIsRenderbufferEXT"));
- if (!sf_ptrc_glIsRenderbufferEXT)
- numFailed++;
-
- sf_ptrc_glRenderbufferStorageEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLsizei, GLsizei)>(glLoaderGetProcAddress("glRenderbufferStorageEXT"));
- if (!sf_ptrc_glRenderbufferStorageEXT)
- numFailed++;
-
- return numFailed;
-}
-
-void (GL_FUNCPTR *sf_ptrc_glBlitFramebufferEXT)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum) = NULL;
-
-static int Load_EXT_framebuffer_blit()
-{
- int numFailed = 0;
-
- sf_ptrc_glBlitFramebufferEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum)>(glLoaderGetProcAddress("glBlitFramebufferEXT"));
- if (!sf_ptrc_glBlitFramebufferEXT)
- numFailed++;
-
- return numFailed;
-}
-
-void (GL_FUNCPTR *sf_ptrc_glRenderbufferStorageMultisampleEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = NULL;
-
-static int Load_EXT_framebuffer_multisample()
-{
- int numFailed = 0;
-
- sf_ptrc_glRenderbufferStorageMultisampleEXT = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLsizei, GLenum, GLsizei, GLsizei)>(glLoaderGetProcAddress("glRenderbufferStorageMultisampleEXT"));
- if (!sf_ptrc_glRenderbufferStorageMultisampleEXT)
- numFailed++;
-
- return numFailed;
-}
-
-void (GL_FUNCPTR *sf_ptrc_glCopyBufferSubData)(GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr) = NULL;
-
-static int Load_ARB_copy_buffer()
-{
- int numFailed = 0;
-
- sf_ptrc_glCopyBufferSubData = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr)>(glLoaderGetProcAddress("glCopyBufferSubData"));
- if (!sf_ptrc_glCopyBufferSubData)
- numFailed++;
-
- return numFailed;
-}
-
-void (GL_FUNCPTR *sf_ptrc_glFramebufferTextureARB)(GLenum, GLenum, GLuint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glFramebufferTextureFaceARB)(GLenum, GLenum, GLuint, GLint, GLenum) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glFramebufferTextureLayerARB)(GLenum, GLenum, GLuint, GLint, GLint) = NULL;
-void (GL_FUNCPTR *sf_ptrc_glProgramParameteriARB)(GLuint, GLenum, GLint) = NULL;
-
-static int Load_ARB_geometry_shader4()
-{
- int numFailed = 0;
-
- sf_ptrc_glFramebufferTextureARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLuint, GLint)>(glLoaderGetProcAddress("glFramebufferTextureARB"));
- if (!sf_ptrc_glFramebufferTextureARB)
- numFailed++;
-
- sf_ptrc_glFramebufferTextureFaceARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLuint, GLint, GLenum)>(glLoaderGetProcAddress("glFramebufferTextureFaceARB"));
- if (!sf_ptrc_glFramebufferTextureFaceARB)
- numFailed++;
-
- sf_ptrc_glFramebufferTextureLayerARB = reinterpret_cast<void (GL_FUNCPTR *)(GLenum, GLenum, GLuint, GLint, GLint)>(glLoaderGetProcAddress("glFramebufferTextureLayerARB"));
- if (!sf_ptrc_glFramebufferTextureLayerARB)
- numFailed++;
-
- sf_ptrc_glProgramParameteriARB = reinterpret_cast<void (GL_FUNCPTR *)(GLuint, GLenum, GLint)>(glLoaderGetProcAddress("glProgramParameteriARB"));
- if (!sf_ptrc_glProgramParameteriARB)
- numFailed++;
-
- return numFailed;
-}
-
-typedef int (*PFN_LOADFUNCPOINTERS)();
-typedef struct sfogl_StrToExtMap_s
-{
- const char* extensionName;
- int* extensionVariable;
- PFN_LOADFUNCPOINTERS LoadExtension;
-} sfogl_StrToExtMap;
-
-static sfogl_StrToExtMap ExtensionMap[20] = {
- {"GL_SGIS_texture_edge_clamp", &sfogl_ext_SGIS_texture_edge_clamp, NULL},
- {"GL_EXT_texture_edge_clamp", &sfogl_ext_EXT_texture_edge_clamp, NULL},
- {"GL_EXT_blend_minmax", &sfogl_ext_EXT_blend_minmax, Load_EXT_blend_minmax},
- {"GL_EXT_blend_subtract", &sfogl_ext_EXT_blend_subtract, NULL},
- {"GL_ARB_multitexture", &sfogl_ext_ARB_multitexture, Load_ARB_multitexture},
- {"GL_EXT_blend_func_separate", &sfogl_ext_EXT_blend_func_separate, Load_EXT_blend_func_separate},
- {"GL_ARB_vertex_buffer_object", &sfogl_ext_ARB_vertex_buffer_object, Load_ARB_vertex_buffer_object},
- {"GL_ARB_shading_language_100", &sfogl_ext_ARB_shading_language_100, NULL},
- {"GL_ARB_shader_objects", &sfogl_ext_ARB_shader_objects, Load_ARB_shader_objects},
- {"GL_ARB_vertex_shader", &sfogl_ext_ARB_vertex_shader, Load_ARB_vertex_shader},
- {"GL_ARB_fragment_shader", &sfogl_ext_ARB_fragment_shader, NULL},
- {"GL_ARB_texture_non_power_of_two", &sfogl_ext_ARB_texture_non_power_of_two, NULL},
- {"GL_EXT_blend_equation_separate", &sfogl_ext_EXT_blend_equation_separate, Load_EXT_blend_equation_separate},
- {"GL_EXT_texture_sRGB", &sfogl_ext_EXT_texture_sRGB, NULL},
- {"GL_EXT_framebuffer_object", &sfogl_ext_EXT_framebuffer_object, Load_EXT_framebuffer_object},
- {"GL_EXT_packed_depth_stencil", &sfogl_ext_EXT_packed_depth_stencil, NULL},
- {"GL_EXT_framebuffer_blit", &sfogl_ext_EXT_framebuffer_blit, Load_EXT_framebuffer_blit},
- {"GL_EXT_framebuffer_multisample", &sfogl_ext_EXT_framebuffer_multisample, Load_EXT_framebuffer_multisample},
- {"GL_ARB_copy_buffer", &sfogl_ext_ARB_copy_buffer, Load_ARB_copy_buffer},
- {"GL_ARB_geometry_shader4", &sfogl_ext_ARB_geometry_shader4, Load_ARB_geometry_shader4}
-};
-
-static int g_extensionMapSize = 20;
-
-
-static void ClearExtensionVars()
-{
- sfogl_ext_SGIS_texture_edge_clamp = sfogl_LOAD_FAILED;
- sfogl_ext_EXT_texture_edge_clamp = sfogl_LOAD_FAILED;
- sfogl_ext_EXT_blend_minmax = sfogl_LOAD_FAILED;
- sfogl_ext_EXT_blend_subtract = sfogl_LOAD_FAILED;
- sfogl_ext_ARB_multitexture = sfogl_LOAD_FAILED;
- sfogl_ext_EXT_blend_func_separate = sfogl_LOAD_FAILED;
- sfogl_ext_ARB_vertex_buffer_object = sfogl_LOAD_FAILED;
- sfogl_ext_ARB_shading_language_100 = sfogl_LOAD_FAILED;
- sfogl_ext_ARB_shader_objects = sfogl_LOAD_FAILED;
- sfogl_ext_ARB_vertex_shader = sfogl_LOAD_FAILED;
- sfogl_ext_ARB_fragment_shader = sfogl_LOAD_FAILED;
- sfogl_ext_ARB_texture_non_power_of_two = sfogl_LOAD_FAILED;
- sfogl_ext_EXT_blend_equation_separate = sfogl_LOAD_FAILED;
- sfogl_ext_EXT_texture_sRGB = sfogl_LOAD_FAILED;
- sfogl_ext_EXT_framebuffer_object = sfogl_LOAD_FAILED;
- sfogl_ext_EXT_packed_depth_stencil = sfogl_LOAD_FAILED;
- sfogl_ext_EXT_framebuffer_blit = sfogl_LOAD_FAILED;
- sfogl_ext_EXT_framebuffer_multisample = sfogl_LOAD_FAILED;
- sfogl_ext_ARB_copy_buffer = sfogl_LOAD_FAILED;
- sfogl_ext_ARB_geometry_shader4 = sfogl_LOAD_FAILED;
-}
-
-
-static void LoadExtension(sfogl_StrToExtMap& extension)
-{
- if (extension.LoadExtension)
- {
- *(extension.extensionVariable) = sfogl_LOAD_SUCCEEDED + extension.LoadExtension();
- }
- else
- {
- *(extension.extensionVariable) = sfogl_LOAD_SUCCEEDED;
- }
-}
-
-
-void sfogl_LoadFunctions()
-{
- ClearExtensionVars();
-
- for (int i = 0; i < g_extensionMapSize; ++i)
- {
- if (sf::Context::isExtensionAvailable(ExtensionMap[i].extensionName))
- LoadExtension(ExtensionMap[i]);
- }
-}
diff --git a/src/SFML/Graphics/GLLoader.hpp b/src/SFML/Graphics/GLLoader.hpp
deleted file mode 100644
index 9fe4adb..0000000
--- a/src/SFML/Graphics/GLLoader.hpp
+++ /dev/null
@@ -1,1706 +0,0 @@
-////////////////////////////////////////////////////////////
-//
-// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
-//
-// This software is provided 'as-is', without any express or implied warranty.
-// In no event will the authors be held liable for any damages arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it freely,
-// subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented;
-// you must not claim that you wrote the original software.
-// If you use this software in a product, an acknowledgment
-// in the product documentation would be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such,
-// and must not be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source distribution.
-//
-////////////////////////////////////////////////////////////
-
-#ifndef SFML_GLLOADER_HPP
-#define SFML_GLLOADER_HPP
-
-#if defined(__glew_h__) || defined(__GLEW_H__)
-#error Attempt to include auto-generated header after including glew.h
-#endif
-#if defined(__gl_h_) || defined(__GL_H__)
-#error Attempt to include auto-generated header after including gl.h
-#endif
-#if defined(__glext_h_) || defined(__GLEXT_H_)
-#error Attempt to include auto-generated header after including glext.h
-#endif
-#if defined(__gltypes_h_)
-#error Attempt to include auto-generated header after gltypes.h
-#endif
-#if defined(__gl_ATI_h_)
-#error Attempt to include auto-generated header after including glATI.h
-#endif
-
-#define __glew_h__
-#define __GLEW_H__
-#define __gl_h_
-#define __GL_H__
-#define __glext_h_
-#define __GLEXT_H_
-#define __gltypes_h_
-#define __gl_ATI_h_
-
-#ifndef APIENTRY
- #if defined(__MINGW32__)
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN 1
- #endif
- #ifndef NOMINMAX
- #define NOMINMAX
- #endif
- #include <windows.h>
- #elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__)
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN 1
- #endif
- #ifndef NOMINMAX
- #define NOMINMAX
- #endif
- #include <windows.h>
- #else
- #define APIENTRY
- #endif
-#endif // APIENTRY
-
-#ifndef GL_FUNCPTR
- #define GL_REMOVE_FUNCPTR
- #if defined(_WIN32)
- #define GL_FUNCPTR APIENTRY
- #else
- #define GL_FUNCPTR
- #endif
-#endif // GL_FUNCPTR
-
-#ifndef GLAPI
- #define GLAPI extern
-#endif
-
-
-#include <stddef.h>
-#ifndef GLEXT_64_TYPES_DEFINED
-// This code block is duplicated in glxext.h, so must be protected
-#define GLEXT_64_TYPES_DEFINED
-// Define int32_t, int64_t, and uint64_t types for UST/MSC
-// (as used in the GL_EXT_timer_query extension).
-#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-#include <inttypes.h>
-#elif defined(__sun__) || defined(__digital__)
-#include <inttypes.h>
-#if defined(__STDC__)
-#if defined(__arch64__) || defined(_LP64)
-typedef long int int64_t;
-typedef unsigned long int uint64_t;
-#else
-typedef long long int int64_t;
-typedef unsigned long long int uint64_t;
-#endif // __arch64__
-#endif // __STDC__
-#elif defined( __VMS ) || defined(__sgi)
-#include <inttypes.h>
-#elif defined(__SCO__) || defined(__USLC__)
-#include <stdint.h>
-#elif defined(__UNIXOS2__) || defined(__SOL64__)
-typedef long int int32_t;
-typedef long long int int64_t;
-typedef unsigned long long int uint64_t;
-#elif defined(_WIN32) && defined(__GNUC__)
-#include <stdint.h>
-#elif defined(_WIN32)
-typedef __int32 int32_t;
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-#else
-// Fallback if nothing above works
-#include <inttypes.h>
-#endif
-#endif
-typedef unsigned int GLenum;
-typedef unsigned char GLboolean;
-typedef unsigned int GLbitfield;
-typedef void GLvoid;
-typedef signed char GLbyte;
-typedef short GLshort;
-typedef int GLint;
-typedef unsigned char GLubyte;
-typedef unsigned short GLushort;
-typedef unsigned int GLuint;
-typedef int GLsizei;
-typedef float GLfloat;
-typedef float GLclampf;
-typedef double GLdouble;
-typedef double GLclampd;
-typedef char GLchar;
-typedef char GLcharARB;
-#ifdef __APPLE__
-typedef void *GLhandleARB;
-#else
-typedef unsigned int GLhandleARB;
-#endif
-typedef unsigned short GLhalfARB;
-typedef unsigned short GLhalf;
-typedef GLint GLfixed;
-typedef ptrdiff_t GLintptr;
-typedef ptrdiff_t GLsizeiptr;
-typedef int64_t GLint64;
-typedef uint64_t GLuint64;
-typedef ptrdiff_t GLintptrARB;
-typedef ptrdiff_t GLsizeiptrARB;
-typedef int64_t GLint64EXT;
-typedef uint64_t GLuint64EXT;
-typedef struct __GLsync *GLsync;
-struct _cl_context;
-struct _cl_event;
-typedef void (APIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam);
-typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam);
-typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* userParam);
-typedef unsigned short GLhalfNV;
-typedef GLintptr GLvdpauSurfaceNV;
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-
-extern int sfogl_ext_SGIS_texture_edge_clamp;
-extern int sfogl_ext_EXT_texture_edge_clamp;
-extern int sfogl_ext_EXT_blend_minmax;
-extern int sfogl_ext_EXT_blend_subtract;
-extern int sfogl_ext_ARB_multitexture;
-extern int sfogl_ext_EXT_blend_func_separate;
-extern int sfogl_ext_ARB_vertex_buffer_object;
-extern int sfogl_ext_ARB_shading_language_100;
-extern int sfogl_ext_ARB_shader_objects;
-extern int sfogl_ext_ARB_vertex_shader;
-extern int sfogl_ext_ARB_fragment_shader;
-extern int sfogl_ext_ARB_texture_non_power_of_two;
-extern int sfogl_ext_EXT_blend_equation_separate;
-extern int sfogl_ext_EXT_texture_sRGB;
-extern int sfogl_ext_EXT_framebuffer_object;
-extern int sfogl_ext_EXT_packed_depth_stencil;
-extern int sfogl_ext_EXT_framebuffer_blit;
-extern int sfogl_ext_EXT_framebuffer_multisample;
-extern int sfogl_ext_ARB_copy_buffer;
-extern int sfogl_ext_ARB_geometry_shader4;
-
-#define GL_CLAMP_TO_EDGE_SGIS 0x812F
-
-#define GL_CLAMP_TO_EDGE_EXT 0x812F
-
-#define GL_BLEND_EQUATION_EXT 0x8009
-#define GL_FUNC_ADD_EXT 0x8006
-#define GL_MAX_EXT 0x8008
-#define GL_MIN_EXT 0x8007
-
-#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B
-#define GL_FUNC_SUBTRACT_EXT 0x800A
-
-#define GL_ACTIVE_TEXTURE_ARB 0x84E0
-#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
-#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
-#define GL_TEXTURE0_ARB 0x84C0
-#define GL_TEXTURE10_ARB 0x84CA
-#define GL_TEXTURE11_ARB 0x84CB
-#define GL_TEXTURE12_ARB 0x84CC
-#define GL_TEXTURE13_ARB 0x84CD
-#define GL_TEXTURE14_ARB 0x84CE
-#define GL_TEXTURE15_ARB 0x84CF
-#define GL_TEXTURE16_ARB 0x84D0
-#define GL_TEXTURE17_ARB 0x84D1
-#define GL_TEXTURE18_ARB 0x84D2
-#define GL_TEXTURE19_ARB 0x84D3
-#define GL_TEXTURE1_ARB 0x84C1
-#define GL_TEXTURE20_ARB 0x84D4
-#define GL_TEXTURE21_ARB 0x84D5
-#define GL_TEXTURE22_ARB 0x84D6
-#define GL_TEXTURE23_ARB 0x84D7
-#define GL_TEXTURE24_ARB 0x84D8
-#define GL_TEXTURE25_ARB 0x84D9
-#define GL_TEXTURE26_ARB 0x84DA
-#define GL_TEXTURE27_ARB 0x84DB
-#define GL_TEXTURE28_ARB 0x84DC
-#define GL_TEXTURE29_ARB 0x84DD
-#define GL_TEXTURE2_ARB 0x84C2
-#define GL_TEXTURE30_ARB 0x84DE
-#define GL_TEXTURE31_ARB 0x84DF
-#define GL_TEXTURE3_ARB 0x84C3
-#define GL_TEXTURE4_ARB 0x84C4
-#define GL_TEXTURE5_ARB 0x84C5
-#define GL_TEXTURE6_ARB 0x84C6
-#define GL_TEXTURE7_ARB 0x84C7
-#define GL_TEXTURE8_ARB 0x84C8
-#define GL_TEXTURE9_ARB 0x84C9
-
-#define GL_BLEND_DST_ALPHA_EXT 0x80CA
-#define GL_BLEND_DST_RGB_EXT 0x80C8
-#define GL_BLEND_SRC_ALPHA_EXT 0x80CB
-#define GL_BLEND_SRC_RGB_EXT 0x80C9
-
-#define GL_ARRAY_BUFFER_ARB 0x8892
-#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894
-#define GL_BUFFER_ACCESS_ARB 0x88BB
-#define GL_BUFFER_MAPPED_ARB 0x88BC
-#define GL_BUFFER_MAP_POINTER_ARB 0x88BD
-#define GL_BUFFER_SIZE_ARB 0x8764
-#define GL_BUFFER_USAGE_ARB 0x8765
-#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
-#define GL_DYNAMIC_COPY_ARB 0x88EA
-#define GL_DYNAMIC_DRAW_ARB 0x88E8
-#define GL_DYNAMIC_READ_ARB 0x88E9
-#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B
-#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
-#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
-#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D
-#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
-#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
-#define GL_READ_ONLY_ARB 0x88B8
-#define GL_READ_WRITE_ARB 0x88BA
-#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
-#define GL_STATIC_COPY_ARB 0x88E6
-#define GL_STATIC_DRAW_ARB 0x88E4
-#define GL_STATIC_READ_ARB 0x88E5
-#define GL_STREAM_COPY_ARB 0x88E2
-#define GL_STREAM_DRAW_ARB 0x88E0
-#define GL_STREAM_READ_ARB 0x88E1
-#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A
-#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
-#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F
-#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E
-#define GL_WRITE_ONLY_ARB 0x88B9
-
-#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
-
-#define GL_BOOL_ARB 0x8B56
-#define GL_BOOL_VEC2_ARB 0x8B57
-#define GL_BOOL_VEC3_ARB 0x8B58
-#define GL_BOOL_VEC4_ARB 0x8B59
-#define GL_FLOAT_MAT2_ARB 0x8B5A
-#define GL_FLOAT_MAT3_ARB 0x8B5B
-#define GL_FLOAT_MAT4_ARB 0x8B5C
-#define GL_FLOAT_VEC2_ARB 0x8B50
-#define GL_FLOAT_VEC3_ARB 0x8B51
-#define GL_FLOAT_VEC4_ARB 0x8B52
-#define GL_INT_VEC2_ARB 0x8B53
-#define GL_INT_VEC3_ARB 0x8B54
-#define GL_INT_VEC4_ARB 0x8B55
-#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86
-#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
-#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85
-#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81
-#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80
-#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84
-#define GL_OBJECT_LINK_STATUS_ARB 0x8B82
-#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88
-#define GL_OBJECT_SUBTYPE_ARB 0x8B4F
-#define GL_OBJECT_TYPE_ARB 0x8B4E
-#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83
-#define GL_PROGRAM_OBJECT_ARB 0x8B40
-#define GL_SAMPLER_1D_ARB 0x8B5D
-#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61
-#define GL_SAMPLER_2D_ARB 0x8B5E
-#define GL_SAMPLER_2D_RECT_ARB 0x8B63
-#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
-#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62
-#define GL_SAMPLER_3D_ARB 0x8B5F
-#define GL_SAMPLER_CUBE_ARB 0x8B60
-#define GL_SHADER_OBJECT_ARB 0x8B48
-
-#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
-#define GL_FLOAT 0x1406
-// Copied GL_FLOAT_MAT2_ARB From: ARB_shader_objects
-// Copied GL_FLOAT_MAT3_ARB From: ARB_shader_objects
-// Copied GL_FLOAT_MAT4_ARB From: ARB_shader_objects
-// Copied GL_FLOAT_VEC2_ARB From: ARB_shader_objects
-// Copied GL_FLOAT_VEC3_ARB From: ARB_shader_objects
-// Copied GL_FLOAT_VEC4_ARB From: ARB_shader_objects
-#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D
-#define GL_MAX_TEXTURE_COORDS_ARB 0x8871
-#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
-#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B
-#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
-#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
-#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A
-#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89
-#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A
-#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
-#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
-#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
-#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
-#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
-#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
-#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
-#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
-#define GL_VERTEX_SHADER_ARB 0x8B31
-
-#define GL_FRAGMENT_SHADER_ARB 0x8B30
-#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B
-#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49
-
-#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D
-#define GL_BLEND_EQUATION_RGB_EXT 0x8009
-
-#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B
-#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A
-#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
-#define GL_COMPRESSED_SRGB_EXT 0x8C48
-#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C
-#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45
-#define GL_SLUMINANCE8_EXT 0x8C47
-#define GL_SLUMINANCE_ALPHA_EXT 0x8C44
-#define GL_SLUMINANCE_EXT 0x8C46
-#define GL_SRGB8_ALPHA8_EXT 0x8C43
-#define GL_SRGB8_EXT 0x8C41
-#define GL_SRGB_ALPHA_EXT 0x8C42
-#define GL_SRGB_EXT 0x8C40
-
-#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
-#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
-#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
-#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
-#define GL_COLOR_ATTACHMENT13_EXT 0x8CED
-#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
-#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
-#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
-#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
-#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
-#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
-#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
-#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
-#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
-#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
-#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
-#define GL_DEPTH_ATTACHMENT_EXT 0x8D00
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
-#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
-#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
-#define GL_FRAMEBUFFER_EXT 0x8D40
-#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
-#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
-#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
-#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
-#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
-#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
-#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
-#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
-#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
-#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
-#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53
-#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
-#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52
-#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54
-#define GL_RENDERBUFFER_EXT 0x8D41
-#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51
-#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
-#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
-#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50
-#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55
-#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
-#define GL_STENCIL_ATTACHMENT_EXT 0x8D20
-#define GL_STENCIL_INDEX16_EXT 0x8D49
-#define GL_STENCIL_INDEX1_EXT 0x8D46
-#define GL_STENCIL_INDEX4_EXT 0x8D47
-#define GL_STENCIL_INDEX8_EXT 0x8D48
-
-#define GL_DEPTH24_STENCIL8_EXT 0x88F0
-#define GL_DEPTH_STENCIL_EXT 0x84F9
-#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1
-#define GL_UNSIGNED_INT_24_8_EXT 0x84FA
-
-#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6
-#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
-#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
-#define GL_READ_FRAMEBUFFER_EXT 0x8CA8
-
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
-#define GL_MAX_SAMPLES_EXT 0x8D57
-#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB
-
-#define GL_COPY_READ_BUFFER 0x8F36
-#define GL_COPY_WRITE_BUFFER 0x8F37
-
-#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
-#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9
-#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8
-#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB
-#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC
-#define GL_GEOMETRY_SHADER_ARB 0x8DD9
-#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA
-#define GL_LINES_ADJACENCY_ARB 0x000A
-#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B
-#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0
-#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29
-#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1
-#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF
-#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD
-#define GL_MAX_VARYING_COMPONENTS 0x8B4B
-#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE
-#define GL_PROGRAM_POINT_SIZE_ARB 0x8642
-#define GL_TRIANGLES_ADJACENCY_ARB 0x000C
-#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D
-
-#define GL_2D 0x0600
-#define GL_2_BYTES 0x1407
-#define GL_3D 0x0601
-#define GL_3D_COLOR 0x0602
-#define GL_3D_COLOR_TEXTURE 0x0603
-#define GL_3_BYTES 0x1408
-#define GL_4D_COLOR_TEXTURE 0x0604
-#define GL_4_BYTES 0x1409
-#define GL_ACCUM 0x0100
-#define GL_ACCUM_ALPHA_BITS 0x0D5B
-#define GL_ACCUM_BLUE_BITS 0x0D5A
-#define GL_ACCUM_BUFFER_BIT 0x00000200
-#define GL_ACCUM_CLEAR_VALUE 0x0B80
-#define GL_ACCUM_GREEN_BITS 0x0D59
-#define GL_ACCUM_RED_BITS 0x0D58
-#define GL_ADD 0x0104
-#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF
-#define GL_ALPHA 0x1906
-#define GL_ALPHA12 0x803D
-#define GL_ALPHA16 0x803E
-#define GL_ALPHA4 0x803B
-#define GL_ALPHA8 0x803C
-#define GL_ALPHA_BIAS 0x0D1D
-#define GL_ALPHA_BITS 0x0D55
-#define GL_ALPHA_SCALE 0x0D1C
-#define GL_ALPHA_TEST 0x0BC0
-#define GL_ALPHA_TEST_FUNC 0x0BC1
-#define GL_ALPHA_TEST_REF 0x0BC2
-#define GL_ALWAYS 0x0207
-#define GL_AMBIENT 0x1200
-#define GL_AMBIENT_AND_DIFFUSE 0x1602
-#define GL_AND 0x1501
-#define GL_AND_INVERTED 0x1504
-#define GL_AND_REVERSE 0x1502
-#define GL_ATTRIB_STACK_DEPTH 0x0BB0
-#define GL_AUTO_NORMAL 0x0D80
-#define GL_AUX0 0x0409
-#define GL_AUX1 0x040A
-#define GL_AUX2 0x040B
-#define GL_AUX3 0x040C
-#define GL_AUX_BUFFERS 0x0C00
-#define GL_BACK 0x0405
-#define GL_BACK_LEFT 0x0402
-#define GL_BACK_RIGHT 0x0403
-#define GL_BITMAP 0x1A00
-#define GL_BITMAP_TOKEN 0x0704
-#define GL_BLEND 0x0BE2
-#define GL_BLEND_DST 0x0BE0
-#define GL_BLEND_SRC 0x0BE1
-#define GL_BLUE 0x1905
-#define GL_BLUE_BIAS 0x0D1B
-#define GL_BLUE_BITS 0x0D54
-#define GL_BLUE_SCALE 0x0D1A
-#define GL_BYTE 0x1400
-#define GL_C3F_V3F 0x2A24
-#define GL_C4F_N3F_V3F 0x2A26
-#define GL_C4UB_V2F 0x2A22
-#define GL_C4UB_V3F 0x2A23
-#define GL_CCW 0x0901
-#define GL_CLAMP 0x2900
-#define GL_CLEAR 0x1500
-#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF
-#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1
-#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
-#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
-#define GL_CLIP_PLANE0 0x3000
-#define GL_CLIP_PLANE1 0x3001
-#define GL_CLIP_PLANE2 0x3002
-#define GL_CLIP_PLANE3 0x3003
-#define GL_CLIP_PLANE4 0x3004
-#define GL_CLIP_PLANE5 0x3005
-#define GL_COEFF 0x0A00
-#define GL_COLOR 0x1800
-#define GL_COLOR_ARRAY 0x8076
-#define GL_COLOR_ARRAY_POINTER 0x8090
-#define GL_COLOR_ARRAY_SIZE 0x8081
-#define GL_COLOR_ARRAY_STRIDE 0x8083
-#define GL_COLOR_ARRAY_TYPE 0x8082
-#define GL_COLOR_BUFFER_BIT 0x00004000
-#define GL_COLOR_CLEAR_VALUE 0x0C22
-#define GL_COLOR_INDEX 0x1900
-#define GL_COLOR_INDEXES 0x1603
-#define GL_COLOR_LOGIC_OP 0x0BF2
-#define GL_COLOR_MATERIAL 0x0B57
-#define GL_COLOR_MATERIAL_FACE 0x0B55
-#define GL_COLOR_MATERIAL_PARAMETER 0x0B56
-#define GL_COLOR_WRITEMASK 0x0C23
-#define GL_COMPILE 0x1300
-#define GL_COMPILE_AND_EXECUTE 0x1301
-#define GL_CONSTANT_ATTENUATION 0x1207
-#define GL_COPY 0x1503
-#define GL_COPY_INVERTED 0x150C
-#define GL_COPY_PIXEL_TOKEN 0x0706
-#define GL_CULL_FACE 0x0B44
-#define GL_CULL_FACE_MODE 0x0B45
-#define GL_CURRENT_BIT 0x00000001
-#define GL_CURRENT_COLOR 0x0B00
-#define GL_CURRENT_INDEX 0x0B01
-#define GL_CURRENT_NORMAL 0x0B02
-#define GL_CURRENT_RASTER_COLOR 0x0B04
-#define GL_CURRENT_RASTER_DISTANCE 0x0B09
-#define GL_CURRENT_RASTER_INDEX 0x0B05
-#define GL_CURRENT_RASTER_POSITION 0x0B07
-#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08
-#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06
-#define GL_CURRENT_TEXTURE_COORDS 0x0B03
-#define GL_CW 0x0900
-#define GL_DECAL 0x2101
-#define GL_DECR 0x1E03
-#define GL_DEPTH 0x1801
-#define GL_DEPTH_BIAS 0x0D1F
-#define GL_DEPTH_BITS 0x0D56
-#define GL_DEPTH_BUFFER_BIT 0x00000100
-#define GL_DEPTH_CLEAR_VALUE 0x0B73
-#define GL_DEPTH_COMPONENT 0x1902
-#define GL_DEPTH_FUNC 0x0B74
-#define GL_DEPTH_RANGE 0x0B70
-#define GL_DEPTH_SCALE 0x0D1E
-#define GL_DEPTH_TEST 0x0B71
-#define GL_DEPTH_WRITEMASK 0x0B72
-#define GL_DIFFUSE 0x1201
-#define GL_DITHER 0x0BD0
-#define GL_DOMAIN 0x0A02
-#define GL_DONT_CARE 0x1100
-#define GL_DOUBLE 0x140A
-#define GL_DOUBLEBUFFER 0x0C32
-#define GL_DRAW_BUFFER 0x0C01
-#define GL_DRAW_PIXEL_TOKEN 0x0705
-#define GL_DST_ALPHA 0x0304
-#define GL_DST_COLOR 0x0306
-#define GL_EDGE_FLAG 0x0B43
-#define GL_EDGE_FLAG_ARRAY 0x8079
-#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
-#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C
-#define GL_EMISSION 0x1600
-#define GL_ENABLE_BIT 0x00002000
-#define GL_EQUAL 0x0202
-#define GL_EQUIV 0x1509
-#define GL_EVAL_BIT 0x00010000
-#define GL_EXP 0x0800
-#define GL_EXP2 0x0801
-#define GL_EXTENSIONS 0x1F03
-#define GL_EYE_LINEAR 0x2400
-#define GL_EYE_PLANE 0x2502
-#define GL_FALSE 0
-#define GL_FASTEST 0x1101
-#define GL_FEEDBACK 0x1C01
-#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0
-#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1
-#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2
-#define GL_FILL 0x1B02
-#define GL_FLAT 0x1D00
-// Copied GL_FLOAT From: ARB_vertex_shader
-#define GL_FOG 0x0B60
-#define GL_FOG_BIT 0x00000080
-#define GL_FOG_COLOR 0x0B66
-#define GL_FOG_DENSITY 0x0B62
-#define GL_FOG_END 0x0B64
-#define GL_FOG_HINT 0x0C54
-#define GL_FOG_INDEX 0x0B61
-#define GL_FOG_MODE 0x0B65
-#define GL_FOG_START 0x0B63
-#define GL_FRONT 0x0404
-#define GL_FRONT_AND_BACK 0x0408
-#define GL_FRONT_FACE 0x0B46
-#define GL_FRONT_LEFT 0x0400
-#define GL_FRONT_RIGHT 0x0401
-#define GL_GEQUAL 0x0206
-#define GL_GREATER 0x0204
-#define GL_GREEN 0x1904
-#define GL_GREEN_BIAS 0x0D19
-#define GL_GREEN_BITS 0x0D53
-#define GL_GREEN_SCALE 0x0D18
-#define GL_HINT_BIT 0x00008000
-#define GL_INCR 0x1E02
-#define GL_INDEX_ARRAY 0x8077
-#define GL_INDEX_ARRAY_POINTER 0x8091
-#define GL_INDEX_ARRAY_STRIDE 0x8086
-#define GL_INDEX_ARRAY_TYPE 0x8085
-#define GL_INDEX_BITS 0x0D51
-#define GL_INDEX_CLEAR_VALUE 0x0C20
-#define GL_INDEX_LOGIC_OP 0x0BF1
-#define GL_INDEX_MODE 0x0C30
-#define GL_INDEX_OFFSET 0x0D13
-#define GL_INDEX_SHIFT 0x0D12
-#define GL_INDEX_WRITEMASK 0x0C21
-#define GL_INT 0x1404
-#define GL_INTENSITY 0x8049
-#define GL_INTENSITY12 0x804C
-#define GL_INTENSITY16 0x804D
-#define GL_INTENSITY4 0x804A
-#define GL_INTENSITY8 0x804B
-#define GL_INVALID_ENUM 0x0500
-#define GL_INVALID_OPERATION 0x0502
-#define GL_INVALID_VALUE 0x0501
-#define GL_INVERT 0x150A
-#define GL_KEEP 0x1E00
-#define GL_LEFT 0x0406
-#define GL_LEQUAL 0x0203
-#define GL_LESS 0x0201
-#define GL_LIGHT0 0x4000
-#define GL_LIGHT1 0x4001
-#define GL_LIGHT2 0x4002
-#define GL_LIGHT3 0x4003
-#define GL_LIGHT4 0x4004
-#define GL_LIGHT5 0x4005
-#define GL_LIGHT6 0x4006
-#define GL_LIGHT7 0x4007
-#define GL_LIGHTING 0x0B50
-#define GL_LIGHTING_BIT 0x00000040
-#define GL_LIGHT_MODEL_AMBIENT 0x0B53
-#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
-#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
-#define GL_LINE 0x1B01
-#define GL_LINEAR 0x2601
-#define GL_LINEAR_ATTENUATION 0x1208
-#define GL_LINEAR_MIPMAP_LINEAR 0x2703
-#define GL_LINEAR_MIPMAP_NEAREST 0x2701
-#define GL_LINES 0x0001
-#define GL_LINE_BIT 0x00000004
-#define GL_LINE_LOOP 0x0002
-#define GL_LINE_RESET_TOKEN 0x0707
-#define GL_LINE_SMOOTH 0x0B20
-#define GL_LINE_SMOOTH_HINT 0x0C52
-#define GL_LINE_STIPPLE 0x0B24
-#define GL_LINE_STIPPLE_PATTERN 0x0B25
-#define GL_LINE_STIPPLE_REPEAT 0x0B26
-#define GL_LINE_STRIP 0x0003
-#define GL_LINE_TOKEN 0x0702
-#define GL_LINE_WIDTH 0x0B21
-#define GL_LINE_WIDTH_GRANULARITY 0x0B23
-#define GL_LINE_WIDTH_RANGE 0x0B22
-#define GL_LIST_BASE 0x0B32
-#define GL_LIST_BIT 0x00020000
-#define GL_LIST_INDEX 0x0B33
-#define GL_LIST_MODE 0x0B30
-#define GL_LOAD 0x0101
-#define GL_LOGIC_OP 0x0BF1
-#define GL_LOGIC_OP_MODE 0x0BF0
-#define GL_LUMINANCE 0x1909
-#define GL_LUMINANCE12 0x8041
-#define GL_LUMINANCE12_ALPHA12 0x8047
-#define GL_LUMINANCE12_ALPHA4 0x8046
-#define GL_LUMINANCE16 0x8042
-#define GL_LUMINANCE16_ALPHA16 0x8048
-#define GL_LUMINANCE4 0x803F
-#define GL_LUMINANCE4_ALPHA4 0x8043
-#define GL_LUMINANCE6_ALPHA2 0x8044
-#define GL_LUMINANCE8 0x8040
-#define GL_LUMINANCE8_ALPHA8 0x8045
-#define GL_LUMINANCE_ALPHA 0x190A
-#define GL_MAP1_COLOR_4 0x0D90
-#define GL_MAP1_GRID_DOMAIN 0x0DD0
-#define GL_MAP1_GRID_SEGMENTS 0x0DD1
-#define GL_MAP1_INDEX 0x0D91
-#define GL_MAP1_NORMAL 0x0D92
-#define GL_MAP1_TEXTURE_COORD_1 0x0D93
-#define GL_MAP1_TEXTURE_COORD_2 0x0D94
-#define GL_MAP1_TEXTURE_COORD_3 0x0D95
-#define GL_MAP1_TEXTURE_COORD_4 0x0D96
-#define GL_MAP1_VERTEX_3 0x0D97
-#define GL_MAP1_VERTEX_4 0x0D98
-#define GL_MAP2_COLOR_4 0x0DB0
-#define GL_MAP2_GRID_DOMAIN 0x0DD2
-#define GL_MAP2_GRID_SEGMENTS 0x0DD3
-#define GL_MAP2_INDEX 0x0DB1
-#define GL_MAP2_NORMAL 0x0DB2
-#define GL_MAP2_TEXTURE_COORD_1 0x0DB3
-#define GL_MAP2_TEXTURE_COORD_2 0x0DB4
-#define GL_MAP2_TEXTURE_COORD_3 0x0DB5
-#define GL_MAP2_TEXTURE_COORD_4 0x0DB6
-#define GL_MAP2_VERTEX_3 0x0DB7
-#define GL_MAP2_VERTEX_4 0x0DB8
-#define GL_MAP_COLOR 0x0D10
-#define GL_MAP_STENCIL 0x0D11
-#define GL_MATRIX_MODE 0x0BA0
-#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35
-#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B
-#define GL_MAX_CLIP_PLANES 0x0D32
-#define GL_MAX_EVAL_ORDER 0x0D30
-#define GL_MAX_LIGHTS 0x0D31
-#define GL_MAX_LIST_NESTING 0x0B31
-#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36
-#define GL_MAX_NAME_STACK_DEPTH 0x0D37
-#define GL_MAX_PIXEL_MAP_TABLE 0x0D34
-#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38
-#define GL_MAX_TEXTURE_SIZE 0x0D33
-#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39
-#define GL_MAX_VIEWPORT_DIMS 0x0D3A
-#define GL_MODELVIEW 0x1700
-#define GL_MODELVIEW_MATRIX 0x0BA6
-#define GL_MODELVIEW_STACK_DEPTH 0x0BA3
-#define GL_MODULATE 0x2100
-#define GL_MULT 0x0103
-#define GL_N3F_V3F 0x2A25
-#define GL_NAME_STACK_DEPTH 0x0D70
-#define GL_NAND 0x150E
-#define GL_NEAREST 0x2600
-#define GL_NEAREST_MIPMAP_LINEAR 0x2702
-#define GL_NEAREST_MIPMAP_NEAREST 0x2700
-#define GL_NEVER 0x0200
-#define GL_NICEST 0x1102
-#define GL_NONE 0
-#define GL_NOOP 0x1505
-#define GL_NOR 0x1508
-#define GL_NORMALIZE 0x0BA1
-#define GL_NORMAL_ARRAY 0x8075
-#define GL_NORMAL_ARRAY_POINTER 0x808F
-#define GL_NORMAL_ARRAY_STRIDE 0x807F
-#define GL_NORMAL_ARRAY_TYPE 0x807E
-#define GL_NOTEQUAL 0x0205
-#define GL_NO_ERROR 0
-#define GL_OBJECT_LINEAR 0x2401
-#define GL_OBJECT_PLANE 0x2501
-#define GL_ONE 1
-#define GL_ONE_MINUS_DST_ALPHA 0x0305
-#define GL_ONE_MINUS_DST_COLOR 0x0307
-#define GL_ONE_MINUS_SRC_ALPHA 0x0303
-#define GL_ONE_MINUS_SRC_COLOR 0x0301
-#define GL_OR 0x1507
-#define GL_ORDER 0x0A01
-#define GL_OR_INVERTED 0x150D
-#define GL_OR_REVERSE 0x150B
-#define GL_OUT_OF_MEMORY 0x0505
-#define GL_PACK_ALIGNMENT 0x0D05
-#define GL_PACK_LSB_FIRST 0x0D01
-#define GL_PACK_ROW_LENGTH 0x0D02
-#define GL_PACK_SKIP_PIXELS 0x0D04
-#define GL_PACK_SKIP_ROWS 0x0D03
-#define GL_PACK_SWAP_BYTES 0x0D00
-#define GL_PASS_THROUGH_TOKEN 0x0700
-#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50
-#define GL_PIXEL_MAP_A_TO_A 0x0C79
-#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9
-#define GL_PIXEL_MAP_B_TO_B 0x0C78
-#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8
-#define GL_PIXEL_MAP_G_TO_G 0x0C77
-#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7
-#define GL_PIXEL_MAP_I_TO_A 0x0C75
-#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5
-#define GL_PIXEL_MAP_I_TO_B 0x0C74
-#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4
-#define GL_PIXEL_MAP_I_TO_G 0x0C73
-#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3
-#define GL_PIXEL_MAP_I_TO_I 0x0C70
-#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0
-#define GL_PIXEL_MAP_I_TO_R 0x0C72
-#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2
-#define GL_PIXEL_MAP_R_TO_R 0x0C76
-#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6
-#define GL_PIXEL_MAP_S_TO_S 0x0C71
-#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1
-#define GL_PIXEL_MODE_BIT 0x00000020
-#define GL_POINT 0x1B00
-#define GL_POINTS 0x0000
-#define GL_POINT_BIT 0x00000002
-#define GL_POINT_SIZE 0x0B11
-#define GL_POINT_SIZE_GRANULARITY 0x0B13
-#define GL_POINT_SIZE_RANGE 0x0B12
-#define GL_POINT_SMOOTH 0x0B10
-#define GL_POINT_SMOOTH_HINT 0x0C51
-#define GL_POINT_TOKEN 0x0701
-#define GL_POLYGON 0x0009
-#define GL_POLYGON_BIT 0x00000008
-#define GL_POLYGON_MODE 0x0B40
-#define GL_POLYGON_OFFSET_FACTOR 0x8038
-#define GL_POLYGON_OFFSET_FILL 0x8037
-#define GL_POLYGON_OFFSET_LINE 0x2A02
-#define GL_POLYGON_OFFSET_POINT 0x2A01
-#define GL_POLYGON_OFFSET_UNITS 0x2A00
-#define GL_POLYGON_SMOOTH 0x0B41
-#define GL_POLYGON_SMOOTH_HINT 0x0C53
-#define GL_POLYGON_STIPPLE 0x0B42
-#define GL_POLYGON_STIPPLE_BIT 0x00000010
-#define GL_POLYGON_TOKEN 0x0703
-#define GL_POSITION 0x1203
-#define GL_PROJECTION 0x1701
-#define GL_PROJECTION_MATRIX 0x0BA7
-#define GL_PROJECTION_STACK_DEPTH 0x0BA4
-#define GL_PROXY_TEXTURE_1D 0x8063
-#define GL_PROXY_TEXTURE_2D 0x8064
-#define GL_Q 0x2003
-#define GL_QUADRATIC_ATTENUATION 0x1209
-#define GL_QUADS 0x0007
-#define GL_QUAD_STRIP 0x0008
-#define GL_R 0x2002
-#define GL_R3_G3_B2 0x2A10
-#define GL_READ_BUFFER 0x0C02
-#define GL_RED 0x1903
-#define GL_RED_BIAS 0x0D15
-#define GL_RED_BITS 0x0D52
-#define GL_RED_SCALE 0x0D14
-#define GL_RENDER 0x1C00
-#define GL_RENDERER 0x1F01
-#define GL_RENDER_MODE 0x0C40
-#define GL_REPEAT 0x2901
-#define GL_REPLACE 0x1E01
-#define GL_RETURN 0x0102
-#define GL_RGB 0x1907
-#define GL_RGB10 0x8052
-#define GL_RGB10_A2 0x8059
-#define GL_RGB12 0x8053
-#define GL_RGB16 0x8054
-#define GL_RGB4 0x804F
-#define GL_RGB5 0x8050
-#define GL_RGB5_A1 0x8057
-#define GL_RGB8 0x8051
-#define GL_RGBA 0x1908
-#define GL_RGBA12 0x805A
-#define GL_RGBA16 0x805B
-#define GL_RGBA2 0x8055
-#define GL_RGBA4 0x8056
-#define GL_RGBA8 0x8058
-#define GL_RGBA_MODE 0x0C31
-#define GL_RIGHT 0x0407
-#define GL_S 0x2000
-#define GL_SCISSOR_BIT 0x00080000
-#define GL_SCISSOR_BOX 0x0C10
-#define GL_SCISSOR_TEST 0x0C11
-#define GL_SELECT 0x1C02
-#define GL_SELECTION_BUFFER_POINTER 0x0DF3
-#define GL_SELECTION_BUFFER_SIZE 0x0DF4
-#define GL_SET 0x150F
-#define GL_SHADE_MODEL 0x0B54
-#define GL_SHININESS 0x1601
-#define GL_SHORT 0x1402
-#define GL_SMOOTH 0x1D01
-#define GL_SPECULAR 0x1202
-#define GL_SPHERE_MAP 0x2402
-#define GL_SPOT_CUTOFF 0x1206
-#define GL_SPOT_DIRECTION 0x1204
-#define GL_SPOT_EXPONENT 0x1205
-#define GL_SRC_ALPHA 0x0302
-#define GL_SRC_ALPHA_SATURATE 0x0308
-#define GL_SRC_COLOR 0x0300
-#define GL_STACK_OVERFLOW 0x0503
-#define GL_STACK_UNDERFLOW 0x0504
-#define GL_STENCIL 0x1802
-#define GL_STENCIL_BITS 0x0D57
-#define GL_STENCIL_BUFFER_BIT 0x00000400
-#define GL_STENCIL_CLEAR_VALUE 0x0B91
-#define GL_STENCIL_FAIL 0x0B94
-#define GL_STENCIL_FUNC 0x0B92
-#define GL_STENCIL_INDEX 0x1901
-#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
-#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
-#define GL_STENCIL_REF 0x0B97
-#define GL_STENCIL_TEST 0x0B90
-#define GL_STENCIL_VALUE_MASK 0x0B93
-#define GL_STENCIL_WRITEMASK 0x0B98
-#define GL_STEREO 0x0C33
-#define GL_SUBPIXEL_BITS 0x0D50
-#define GL_T 0x2001
-#define GL_T2F_C3F_V3F 0x2A2A
-#define GL_T2F_C4F_N3F_V3F 0x2A2C
-#define GL_T2F_C4UB_V3F 0x2A29
-#define GL_T2F_N3F_V3F 0x2A2B
-#define GL_T2F_V3F 0x2A27
-#define GL_T4F_C4F_N3F_V4F 0x2A2D
-#define GL_T4F_V4F 0x2A28
-#define GL_TEXTURE 0x1702
-#define GL_TEXTURE_1D 0x0DE0
-#define GL_TEXTURE_2D 0x0DE1
-#define GL_TEXTURE_ALPHA_SIZE 0x805F
-#define GL_TEXTURE_BINDING_1D 0x8068
-#define GL_TEXTURE_BINDING_2D 0x8069
-#define GL_TEXTURE_BIT 0x00040000
-#define GL_TEXTURE_BLUE_SIZE 0x805E
-#define GL_TEXTURE_BORDER 0x1005
-#define GL_TEXTURE_BORDER_COLOR 0x1004
-#define GL_TEXTURE_COMPONENTS 0x1003
-#define GL_TEXTURE_COORD_ARRAY 0x8078
-#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092
-#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088
-#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A
-#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089
-#define GL_TEXTURE_ENV 0x2300
-#define GL_TEXTURE_ENV_COLOR 0x2201
-#define GL_TEXTURE_ENV_MODE 0x2200
-#define GL_TEXTURE_GEN_MODE 0x2500
-#define GL_TEXTURE_GEN_Q 0x0C63
-#define GL_TEXTURE_GEN_R 0x0C62
-#define GL_TEXTURE_GEN_S 0x0C60
-#define GL_TEXTURE_GEN_T 0x0C61
-#define GL_TEXTURE_GREEN_SIZE 0x805D
-#define GL_TEXTURE_HEIGHT 0x1001
-#define GL_TEXTURE_INTENSITY_SIZE 0x8061
-#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
-#define GL_TEXTURE_LUMINANCE_SIZE 0x8060
-#define GL_TEXTURE_MAG_FILTER 0x2800
-#define GL_TEXTURE_MATRIX 0x0BA8
-#define GL_TEXTURE_MIN_FILTER 0x2801
-#define GL_TEXTURE_PRIORITY 0x8066
-#define GL_TEXTURE_RED_SIZE 0x805C
-#define GL_TEXTURE_RESIDENT 0x8067
-#define GL_TEXTURE_STACK_DEPTH 0x0BA5
-#define GL_TEXTURE_WIDTH 0x1000
-#define GL_TEXTURE_WRAP_S 0x2802
-#define GL_TEXTURE_WRAP_T 0x2803
-#define GL_TRANSFORM_BIT 0x00001000
-#define GL_TRIANGLES 0x0004
-#define GL_TRIANGLE_FAN 0x0006
-#define GL_TRIANGLE_STRIP 0x0005
-#define GL_TRUE 1
-#define GL_UNPACK_ALIGNMENT 0x0CF5
-#define GL_UNPACK_LSB_FIRST 0x0CF1
-#define GL_UNPACK_ROW_LENGTH 0x0CF2
-#define GL_UNPACK_SKIP_PIXELS 0x0CF4
-#define GL_UNPACK_SKIP_ROWS 0x0CF3
-#define GL_UNPACK_SWAP_BYTES 0x0CF0
-#define GL_UNSIGNED_BYTE 0x1401
-#define GL_UNSIGNED_INT 0x1405
-#define GL_UNSIGNED_SHORT 0x1403
-#define GL_V2F 0x2A20
-#define GL_V3F 0x2A21
-#define GL_VENDOR 0x1F00
-#define GL_VERSION 0x1F02
-#define GL_VERTEX_ARRAY 0x8074
-#define GL_VERTEX_ARRAY_POINTER 0x808E
-#define GL_VERTEX_ARRAY_SIZE 0x807A
-#define GL_VERTEX_ARRAY_STRIDE 0x807C
-#define GL_VERTEX_ARRAY_TYPE 0x807B
-#define GL_VIEWPORT 0x0BA2
-#define GL_VIEWPORT_BIT 0x00000800
-#define GL_XOR 0x1506
-#define GL_ZERO 0
-#define GL_ZOOM_X 0x0D16
-#define GL_ZOOM_Y 0x0D17
-
-
-
-#ifndef GL_EXT_blend_minmax
-#define GL_EXT_blend_minmax 1
-extern void (GL_FUNCPTR *sf_ptrc_glBlendEquationEXT)(GLenum);
-#define glBlendEquationEXT sf_ptrc_glBlendEquationEXT
-#endif // GL_EXT_blend_minmax
-
-
-#ifndef GL_ARB_multitexture
-#define GL_ARB_multitexture 1
-extern void (GL_FUNCPTR *sf_ptrc_glActiveTextureARB)(GLenum);
-#define glActiveTextureARB sf_ptrc_glActiveTextureARB
-extern void (GL_FUNCPTR *sf_ptrc_glClientActiveTextureARB)(GLenum);
-#define glClientActiveTextureARB sf_ptrc_glClientActiveTextureARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1dARB)(GLenum, GLdouble);
-#define glMultiTexCoord1dARB sf_ptrc_glMultiTexCoord1dARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1dvARB)(GLenum, const GLdouble*);
-#define glMultiTexCoord1dvARB sf_ptrc_glMultiTexCoord1dvARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1fARB)(GLenum, GLfloat);
-#define glMultiTexCoord1fARB sf_ptrc_glMultiTexCoord1fARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1fvARB)(GLenum, const GLfloat*);
-#define glMultiTexCoord1fvARB sf_ptrc_glMultiTexCoord1fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1iARB)(GLenum, GLint);
-#define glMultiTexCoord1iARB sf_ptrc_glMultiTexCoord1iARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1ivARB)(GLenum, const GLint*);
-#define glMultiTexCoord1ivARB sf_ptrc_glMultiTexCoord1ivARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1sARB)(GLenum, GLshort);
-#define glMultiTexCoord1sARB sf_ptrc_glMultiTexCoord1sARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord1svARB)(GLenum, const GLshort*);
-#define glMultiTexCoord1svARB sf_ptrc_glMultiTexCoord1svARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2dARB)(GLenum, GLdouble, GLdouble);
-#define glMultiTexCoord2dARB sf_ptrc_glMultiTexCoord2dARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2dvARB)(GLenum, const GLdouble*);
-#define glMultiTexCoord2dvARB sf_ptrc_glMultiTexCoord2dvARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2fARB)(GLenum, GLfloat, GLfloat);
-#define glMultiTexCoord2fARB sf_ptrc_glMultiTexCoord2fARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2fvARB)(GLenum, const GLfloat*);
-#define glMultiTexCoord2fvARB sf_ptrc_glMultiTexCoord2fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2iARB)(GLenum, GLint, GLint);
-#define glMultiTexCoord2iARB sf_ptrc_glMultiTexCoord2iARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2ivARB)(GLenum, const GLint*);
-#define glMultiTexCoord2ivARB sf_ptrc_glMultiTexCoord2ivARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2sARB)(GLenum, GLshort, GLshort);
-#define glMultiTexCoord2sARB sf_ptrc_glMultiTexCoord2sARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord2svARB)(GLenum, const GLshort*);
-#define glMultiTexCoord2svARB sf_ptrc_glMultiTexCoord2svARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3dARB)(GLenum, GLdouble, GLdouble, GLdouble);
-#define glMultiTexCoord3dARB sf_ptrc_glMultiTexCoord3dARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3dvARB)(GLenum, const GLdouble*);
-#define glMultiTexCoord3dvARB sf_ptrc_glMultiTexCoord3dvARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3fARB)(GLenum, GLfloat, GLfloat, GLfloat);
-#define glMultiTexCoord3fARB sf_ptrc_glMultiTexCoord3fARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3fvARB)(GLenum, const GLfloat*);
-#define glMultiTexCoord3fvARB sf_ptrc_glMultiTexCoord3fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3iARB)(GLenum, GLint, GLint, GLint);
-#define glMultiTexCoord3iARB sf_ptrc_glMultiTexCoord3iARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3ivARB)(GLenum, const GLint*);
-#define glMultiTexCoord3ivARB sf_ptrc_glMultiTexCoord3ivARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3sARB)(GLenum, GLshort, GLshort, GLshort);
-#define glMultiTexCoord3sARB sf_ptrc_glMultiTexCoord3sARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord3svARB)(GLenum, const GLshort*);
-#define glMultiTexCoord3svARB sf_ptrc_glMultiTexCoord3svARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4dARB)(GLenum, GLdouble, GLdouble, GLdouble, GLdouble);
-#define glMultiTexCoord4dARB sf_ptrc_glMultiTexCoord4dARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4dvARB)(GLenum, const GLdouble*);
-#define glMultiTexCoord4dvARB sf_ptrc_glMultiTexCoord4dvARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4fARB)(GLenum, GLfloat, GLfloat, GLfloat, GLfloat);
-#define glMultiTexCoord4fARB sf_ptrc_glMultiTexCoord4fARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4fvARB)(GLenum, const GLfloat*);
-#define glMultiTexCoord4fvARB sf_ptrc_glMultiTexCoord4fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4iARB)(GLenum, GLint, GLint, GLint, GLint);
-#define glMultiTexCoord4iARB sf_ptrc_glMultiTexCoord4iARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4ivARB)(GLenum, const GLint*);
-#define glMultiTexCoord4ivARB sf_ptrc_glMultiTexCoord4ivARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4sARB)(GLenum, GLshort, GLshort, GLshort, GLshort);
-#define glMultiTexCoord4sARB sf_ptrc_glMultiTexCoord4sARB
-extern void (GL_FUNCPTR *sf_ptrc_glMultiTexCoord4svARB)(GLenum, const GLshort*);
-#define glMultiTexCoord4svARB sf_ptrc_glMultiTexCoord4svARB
-#endif // GL_ARB_multitexture
-
-#ifndef GL_EXT_blend_func_separate
-#define GL_EXT_blend_func_separate 1
-extern void (GL_FUNCPTR *sf_ptrc_glBlendFuncSeparateEXT)(GLenum, GLenum, GLenum, GLenum);
-#define glBlendFuncSeparateEXT sf_ptrc_glBlendFuncSeparateEXT
-#endif // GL_EXT_blend_func_separate
-
-#ifndef GL_ARB_vertex_buffer_object
-#define GL_ARB_vertex_buffer_object 1
-extern void (GL_FUNCPTR *sf_ptrc_glBindBufferARB)(GLenum, GLuint);
-#define glBindBufferARB sf_ptrc_glBindBufferARB
-extern void (GL_FUNCPTR *sf_ptrc_glBufferDataARB)(GLenum, GLsizeiptrARB, const void*, GLenum);
-#define glBufferDataARB sf_ptrc_glBufferDataARB
-extern void (GL_FUNCPTR *sf_ptrc_glBufferSubDataARB)(GLenum, GLintptrARB, GLsizeiptrARB, const void*);
-#define glBufferSubDataARB sf_ptrc_glBufferSubDataARB
-extern void (GL_FUNCPTR *sf_ptrc_glDeleteBuffersARB)(GLsizei, const GLuint*);
-#define glDeleteBuffersARB sf_ptrc_glDeleteBuffersARB
-extern void (GL_FUNCPTR *sf_ptrc_glGenBuffersARB)(GLsizei, GLuint*);
-#define glGenBuffersARB sf_ptrc_glGenBuffersARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetBufferParameterivARB)(GLenum, GLenum, GLint*);
-#define glGetBufferParameterivARB sf_ptrc_glGetBufferParameterivARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetBufferPointervARB)(GLenum, GLenum, void**);
-#define glGetBufferPointervARB sf_ptrc_glGetBufferPointervARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetBufferSubDataARB)(GLenum, GLintptrARB, GLsizeiptrARB, void*);
-#define glGetBufferSubDataARB sf_ptrc_glGetBufferSubDataARB
-extern GLboolean (GL_FUNCPTR *sf_ptrc_glIsBufferARB)(GLuint);
-#define glIsBufferARB sf_ptrc_glIsBufferARB
-extern void* (GL_FUNCPTR *sf_ptrc_glMapBufferARB)(GLenum, GLenum);
-#define glMapBufferARB sf_ptrc_glMapBufferARB
-extern GLboolean (GL_FUNCPTR *sf_ptrc_glUnmapBufferARB)(GLenum);
-#define glUnmapBufferARB sf_ptrc_glUnmapBufferARB
-#endif // GL_ARB_vertex_buffer_object
-
-
-#ifndef GL_ARB_shader_objects
-#define GL_ARB_shader_objects 1
-extern void (GL_FUNCPTR *sf_ptrc_glAttachObjectARB)(GLhandleARB, GLhandleARB);
-#define glAttachObjectARB sf_ptrc_glAttachObjectARB
-extern void (GL_FUNCPTR *sf_ptrc_glCompileShaderARB)(GLhandleARB);
-#define glCompileShaderARB sf_ptrc_glCompileShaderARB
-extern GLhandleARB (GL_FUNCPTR *sf_ptrc_glCreateProgramObjectARB)();
-#define glCreateProgramObjectARB sf_ptrc_glCreateProgramObjectARB
-extern GLhandleARB (GL_FUNCPTR *sf_ptrc_glCreateShaderObjectARB)(GLenum);
-#define glCreateShaderObjectARB sf_ptrc_glCreateShaderObjectARB
-extern void (GL_FUNCPTR *sf_ptrc_glDeleteObjectARB)(GLhandleARB);
-#define glDeleteObjectARB sf_ptrc_glDeleteObjectARB
-extern void (GL_FUNCPTR *sf_ptrc_glDetachObjectARB)(GLhandleARB, GLhandleARB);
-#define glDetachObjectARB sf_ptrc_glDetachObjectARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetActiveUniformARB)(GLhandleARB, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLcharARB*);
-#define glGetActiveUniformARB sf_ptrc_glGetActiveUniformARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetAttachedObjectsARB)(GLhandleARB, GLsizei, GLsizei*, GLhandleARB*);
-#define glGetAttachedObjectsARB sf_ptrc_glGetAttachedObjectsARB
-extern GLhandleARB (GL_FUNCPTR *sf_ptrc_glGetHandleARB)(GLenum);
-#define glGetHandleARB sf_ptrc_glGetHandleARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetInfoLogARB)(GLhandleARB, GLsizei, GLsizei*, GLcharARB*);
-#define glGetInfoLogARB sf_ptrc_glGetInfoLogARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetObjectParameterfvARB)(GLhandleARB, GLenum, GLfloat*);
-#define glGetObjectParameterfvARB sf_ptrc_glGetObjectParameterfvARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetObjectParameterivARB)(GLhandleARB, GLenum, GLint*);
-#define glGetObjectParameterivARB sf_ptrc_glGetObjectParameterivARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetShaderSourceARB)(GLhandleARB, GLsizei, GLsizei*, GLcharARB*);
-#define glGetShaderSourceARB sf_ptrc_glGetShaderSourceARB
-extern GLint (GL_FUNCPTR *sf_ptrc_glGetUniformLocationARB)(GLhandleARB, const GLcharARB*);
-#define glGetUniformLocationARB sf_ptrc_glGetUniformLocationARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetUniformfvARB)(GLhandleARB, GLint, GLfloat*);
-#define glGetUniformfvARB sf_ptrc_glGetUniformfvARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetUniformivARB)(GLhandleARB, GLint, GLint*);
-#define glGetUniformivARB sf_ptrc_glGetUniformivARB
-extern void (GL_FUNCPTR *sf_ptrc_glLinkProgramARB)(GLhandleARB);
-#define glLinkProgramARB sf_ptrc_glLinkProgramARB
-extern void (GL_FUNCPTR *sf_ptrc_glShaderSourceARB)(GLhandleARB, GLsizei, const GLcharARB**, const GLint*);
-#define glShaderSourceARB sf_ptrc_glShaderSourceARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform1fARB)(GLint, GLfloat);
-#define glUniform1fARB sf_ptrc_glUniform1fARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform1fvARB)(GLint, GLsizei, const GLfloat*);
-#define glUniform1fvARB sf_ptrc_glUniform1fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform1iARB)(GLint, GLint);
-#define glUniform1iARB sf_ptrc_glUniform1iARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform1ivARB)(GLint, GLsizei, const GLint*);
-#define glUniform1ivARB sf_ptrc_glUniform1ivARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform2fARB)(GLint, GLfloat, GLfloat);
-#define glUniform2fARB sf_ptrc_glUniform2fARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform2fvARB)(GLint, GLsizei, const GLfloat*);
-#define glUniform2fvARB sf_ptrc_glUniform2fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform2iARB)(GLint, GLint, GLint);
-#define glUniform2iARB sf_ptrc_glUniform2iARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform2ivARB)(GLint, GLsizei, const GLint*);
-#define glUniform2ivARB sf_ptrc_glUniform2ivARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform3fARB)(GLint, GLfloat, GLfloat, GLfloat);
-#define glUniform3fARB sf_ptrc_glUniform3fARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform3fvARB)(GLint, GLsizei, const GLfloat*);
-#define glUniform3fvARB sf_ptrc_glUniform3fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform3iARB)(GLint, GLint, GLint, GLint);
-#define glUniform3iARB sf_ptrc_glUniform3iARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform3ivARB)(GLint, GLsizei, const GLint*);
-#define glUniform3ivARB sf_ptrc_glUniform3ivARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform4fARB)(GLint, GLfloat, GLfloat, GLfloat, GLfloat);
-#define glUniform4fARB sf_ptrc_glUniform4fARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform4fvARB)(GLint, GLsizei, const GLfloat*);
-#define glUniform4fvARB sf_ptrc_glUniform4fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform4iARB)(GLint, GLint, GLint, GLint, GLint);
-#define glUniform4iARB sf_ptrc_glUniform4iARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniform4ivARB)(GLint, GLsizei, const GLint*);
-#define glUniform4ivARB sf_ptrc_glUniform4ivARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniformMatrix2fvARB)(GLint, GLsizei, GLboolean, const GLfloat*);
-#define glUniformMatrix2fvARB sf_ptrc_glUniformMatrix2fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniformMatrix3fvARB)(GLint, GLsizei, GLboolean, const GLfloat*);
-#define glUniformMatrix3fvARB sf_ptrc_glUniformMatrix3fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glUniformMatrix4fvARB)(GLint, GLsizei, GLboolean, const GLfloat*);
-#define glUniformMatrix4fvARB sf_ptrc_glUniformMatrix4fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glUseProgramObjectARB)(GLhandleARB);
-#define glUseProgramObjectARB sf_ptrc_glUseProgramObjectARB
-extern void (GL_FUNCPTR *sf_ptrc_glValidateProgramARB)(GLhandleARB);
-#define glValidateProgramARB sf_ptrc_glValidateProgramARB
-#endif // GL_ARB_shader_objects
-
-#ifndef GL_ARB_vertex_shader
-#define GL_ARB_vertex_shader 1
-extern void (GL_FUNCPTR *sf_ptrc_glBindAttribLocationARB)(GLhandleARB, GLuint, const GLcharARB*);
-#define glBindAttribLocationARB sf_ptrc_glBindAttribLocationARB
-extern void (GL_FUNCPTR *sf_ptrc_glDisableVertexAttribArrayARB)(GLuint);
-#define glDisableVertexAttribArrayARB sf_ptrc_glDisableVertexAttribArrayARB
-extern void (GL_FUNCPTR *sf_ptrc_glEnableVertexAttribArrayARB)(GLuint);
-#define glEnableVertexAttribArrayARB sf_ptrc_glEnableVertexAttribArrayARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetActiveAttribARB)(GLhandleARB, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLcharARB*);
-#define glGetActiveAttribARB sf_ptrc_glGetActiveAttribARB
-extern GLint (GL_FUNCPTR *sf_ptrc_glGetAttribLocationARB)(GLhandleARB, const GLcharARB*);
-#define glGetAttribLocationARB sf_ptrc_glGetAttribLocationARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetVertexAttribPointervARB)(GLuint, GLenum, void**);
-#define glGetVertexAttribPointervARB sf_ptrc_glGetVertexAttribPointervARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetVertexAttribdvARB)(GLuint, GLenum, GLdouble*);
-#define glGetVertexAttribdvARB sf_ptrc_glGetVertexAttribdvARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetVertexAttribfvARB)(GLuint, GLenum, GLfloat*);
-#define glGetVertexAttribfvARB sf_ptrc_glGetVertexAttribfvARB
-extern void (GL_FUNCPTR *sf_ptrc_glGetVertexAttribivARB)(GLuint, GLenum, GLint*);
-#define glGetVertexAttribivARB sf_ptrc_glGetVertexAttribivARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1dARB)(GLuint, GLdouble);
-#define glVertexAttrib1dARB sf_ptrc_glVertexAttrib1dARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1dvARB)(GLuint, const GLdouble*);
-#define glVertexAttrib1dvARB sf_ptrc_glVertexAttrib1dvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1fARB)(GLuint, GLfloat);
-#define glVertexAttrib1fARB sf_ptrc_glVertexAttrib1fARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1fvARB)(GLuint, const GLfloat*);
-#define glVertexAttrib1fvARB sf_ptrc_glVertexAttrib1fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1sARB)(GLuint, GLshort);
-#define glVertexAttrib1sARB sf_ptrc_glVertexAttrib1sARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib1svARB)(GLuint, const GLshort*);
-#define glVertexAttrib1svARB sf_ptrc_glVertexAttrib1svARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2dARB)(GLuint, GLdouble, GLdouble);
-#define glVertexAttrib2dARB sf_ptrc_glVertexAttrib2dARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2dvARB)(GLuint, const GLdouble*);
-#define glVertexAttrib2dvARB sf_ptrc_glVertexAttrib2dvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2fARB)(GLuint, GLfloat, GLfloat);
-#define glVertexAttrib2fARB sf_ptrc_glVertexAttrib2fARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2fvARB)(GLuint, const GLfloat*);
-#define glVertexAttrib2fvARB sf_ptrc_glVertexAttrib2fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2sARB)(GLuint, GLshort, GLshort);
-#define glVertexAttrib2sARB sf_ptrc_glVertexAttrib2sARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib2svARB)(GLuint, const GLshort*);
-#define glVertexAttrib2svARB sf_ptrc_glVertexAttrib2svARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3dARB)(GLuint, GLdouble, GLdouble, GLdouble);
-#define glVertexAttrib3dARB sf_ptrc_glVertexAttrib3dARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3dvARB)(GLuint, const GLdouble*);
-#define glVertexAttrib3dvARB sf_ptrc_glVertexAttrib3dvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3fARB)(GLuint, GLfloat, GLfloat, GLfloat);
-#define glVertexAttrib3fARB sf_ptrc_glVertexAttrib3fARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3fvARB)(GLuint, const GLfloat*);
-#define glVertexAttrib3fvARB sf_ptrc_glVertexAttrib3fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3sARB)(GLuint, GLshort, GLshort, GLshort);
-#define glVertexAttrib3sARB sf_ptrc_glVertexAttrib3sARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib3svARB)(GLuint, const GLshort*);
-#define glVertexAttrib3svARB sf_ptrc_glVertexAttrib3svARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NbvARB)(GLuint, const GLbyte*);
-#define glVertexAttrib4NbvARB sf_ptrc_glVertexAttrib4NbvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NivARB)(GLuint, const GLint*);
-#define glVertexAttrib4NivARB sf_ptrc_glVertexAttrib4NivARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NsvARB)(GLuint, const GLshort*);
-#define glVertexAttrib4NsvARB sf_ptrc_glVertexAttrib4NsvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NubARB)(GLuint, GLubyte, GLubyte, GLubyte, GLubyte);
-#define glVertexAttrib4NubARB sf_ptrc_glVertexAttrib4NubARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NubvARB)(GLuint, const GLubyte*);
-#define glVertexAttrib4NubvARB sf_ptrc_glVertexAttrib4NubvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NuivARB)(GLuint, const GLuint*);
-#define glVertexAttrib4NuivARB sf_ptrc_glVertexAttrib4NuivARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4NusvARB)(GLuint, const GLushort*);
-#define glVertexAttrib4NusvARB sf_ptrc_glVertexAttrib4NusvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4bvARB)(GLuint, const GLbyte*);
-#define glVertexAttrib4bvARB sf_ptrc_glVertexAttrib4bvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4dARB)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble);
-#define glVertexAttrib4dARB sf_ptrc_glVertexAttrib4dARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4dvARB)(GLuint, const GLdouble*);
-#define glVertexAttrib4dvARB sf_ptrc_glVertexAttrib4dvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4fARB)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
-#define glVertexAttrib4fARB sf_ptrc_glVertexAttrib4fARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4fvARB)(GLuint, const GLfloat*);
-#define glVertexAttrib4fvARB sf_ptrc_glVertexAttrib4fvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4ivARB)(GLuint, const GLint*);
-#define glVertexAttrib4ivARB sf_ptrc_glVertexAttrib4ivARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4sARB)(GLuint, GLshort, GLshort, GLshort, GLshort);
-#define glVertexAttrib4sARB sf_ptrc_glVertexAttrib4sARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4svARB)(GLuint, const GLshort*);
-#define glVertexAttrib4svARB sf_ptrc_glVertexAttrib4svARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4ubvARB)(GLuint, const GLubyte*);
-#define glVertexAttrib4ubvARB sf_ptrc_glVertexAttrib4ubvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4uivARB)(GLuint, const GLuint*);
-#define glVertexAttrib4uivARB sf_ptrc_glVertexAttrib4uivARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttrib4usvARB)(GLuint, const GLushort*);
-#define glVertexAttrib4usvARB sf_ptrc_glVertexAttrib4usvARB
-extern void (GL_FUNCPTR *sf_ptrc_glVertexAttribPointerARB)(GLuint, GLint, GLenum, GLboolean, GLsizei, const void*);
-#define glVertexAttribPointerARB sf_ptrc_glVertexAttribPointerARB
-#endif // GL_ARB_vertex_shader
-
-
-
-#ifndef GL_EXT_blend_equation_separate
-#define GL_EXT_blend_equation_separate 1
-extern void (GL_FUNCPTR *sf_ptrc_glBlendEquationSeparateEXT)(GLenum, GLenum);
-#define glBlendEquationSeparateEXT sf_ptrc_glBlendEquationSeparateEXT
-#endif // GL_EXT_blend_equation_separate
-
-
-#ifndef GL_EXT_framebuffer_object
-#define GL_EXT_framebuffer_object 1
-extern void (GL_FUNCPTR *sf_ptrc_glBindFramebufferEXT)(GLenum, GLuint);
-#define glBindFramebufferEXT sf_ptrc_glBindFramebufferEXT
-extern void (GL_FUNCPTR *sf_ptrc_glBindRenderbufferEXT)(GLenum, GLuint);
-#define glBindRenderbufferEXT sf_ptrc_glBindRenderbufferEXT
-extern GLenum (GL_FUNCPTR *sf_ptrc_glCheckFramebufferStatusEXT)(GLenum);
-#define glCheckFramebufferStatusEXT sf_ptrc_glCheckFramebufferStatusEXT
-extern void (GL_FUNCPTR *sf_ptrc_glDeleteFramebuffersEXT)(GLsizei, const GLuint*);
-#define glDeleteFramebuffersEXT sf_ptrc_glDeleteFramebuffersEXT
-extern void (GL_FUNCPTR *sf_ptrc_glDeleteRenderbuffersEXT)(GLsizei, const GLuint*);
-#define glDeleteRenderbuffersEXT sf_ptrc_glDeleteRenderbuffersEXT
-extern void (GL_FUNCPTR *sf_ptrc_glFramebufferRenderbufferEXT)(GLenum, GLenum, GLenum, GLuint);
-#define glFramebufferRenderbufferEXT sf_ptrc_glFramebufferRenderbufferEXT
-extern void (GL_FUNCPTR *sf_ptrc_glFramebufferTexture1DEXT)(GLenum, GLenum, GLenum, GLuint, GLint);
-#define glFramebufferTexture1DEXT sf_ptrc_glFramebufferTexture1DEXT
-extern void (GL_FUNCPTR *sf_ptrc_glFramebufferTexture2DEXT)(GLenum, GLenum, GLenum, GLuint, GLint);
-#define glFramebufferTexture2DEXT sf_ptrc_glFramebufferTexture2DEXT
-extern void (GL_FUNCPTR *sf_ptrc_glFramebufferTexture3DEXT)(GLenum, GLenum, GLenum, GLuint, GLint, GLint);
-#define glFramebufferTexture3DEXT sf_ptrc_glFramebufferTexture3DEXT
-extern void (GL_FUNCPTR *sf_ptrc_glGenFramebuffersEXT)(GLsizei, GLuint*);
-#define glGenFramebuffersEXT sf_ptrc_glGenFramebuffersEXT
-extern void (GL_FUNCPTR *sf_ptrc_glGenRenderbuffersEXT)(GLsizei, GLuint*);
-#define glGenRenderbuffersEXT sf_ptrc_glGenRenderbuffersEXT
-extern void (GL_FUNCPTR *sf_ptrc_glGenerateMipmapEXT)(GLenum);
-#define glGenerateMipmapEXT sf_ptrc_glGenerateMipmapEXT
-extern void (GL_FUNCPTR *sf_ptrc_glGetFramebufferAttachmentParameterivEXT)(GLenum, GLenum, GLenum, GLint*);
-#define glGetFramebufferAttachmentParameterivEXT sf_ptrc_glGetFramebufferAttachmentParameterivEXT
-extern void (GL_FUNCPTR *sf_ptrc_glGetRenderbufferParameterivEXT)(GLenum, GLenum, GLint*);
-#define glGetRenderbufferParameterivEXT sf_ptrc_glGetRenderbufferParameterivEXT
-extern GLboolean (GL_FUNCPTR *sf_ptrc_glIsFramebufferEXT)(GLuint);
-#define glIsFramebufferEXT sf_ptrc_glIsFramebufferEXT
-extern GLboolean (GL_FUNCPTR *sf_ptrc_glIsRenderbufferEXT)(GLuint);
-#define glIsRenderbufferEXT sf_ptrc_glIsRenderbufferEXT
-extern void (GL_FUNCPTR *sf_ptrc_glRenderbufferStorageEXT)(GLenum, GLenum, GLsizei, GLsizei);
-#define glRenderbufferStorageEXT sf_ptrc_glRenderbufferStorageEXT
-#endif // GL_EXT_framebuffer_object
-
-
-#ifndef GL_EXT_framebuffer_blit
-#define GL_EXT_framebuffer_blit 1
-extern void (GL_FUNCPTR *sf_ptrc_glBlitFramebufferEXT)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum);
-#define glBlitFramebufferEXT sf_ptrc_glBlitFramebufferEXT
-#endif // GL_EXT_framebuffer_blit
-
-#ifndef GL_EXT_framebuffer_multisample
-#define GL_EXT_framebuffer_multisample 1
-extern void (GL_FUNCPTR *sf_ptrc_glRenderbufferStorageMultisampleEXT)(GLenum, GLsizei, GLenum, GLsizei, GLsizei);
-#define glRenderbufferStorageMultisampleEXT sf_ptrc_glRenderbufferStorageMultisampleEXT
-#endif // GL_EXT_framebuffer_multisample
-
-#ifndef GL_ARB_copy_buffer
-#define GL_ARB_copy_buffer 1
-extern void (GL_FUNCPTR *sf_ptrc_glCopyBufferSubData)(GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr);
-#define glCopyBufferSubData sf_ptrc_glCopyBufferSubData
-#endif // GL_ARB_copy_buffer
-
-#ifndef GL_ARB_geometry_shader4
-#define GL_ARB_geometry_shader4 1
-extern void (GL_FUNCPTR *sf_ptrc_glFramebufferTextureARB)(GLenum, GLenum, GLuint, GLint);
-#define glFramebufferTextureARB sf_ptrc_glFramebufferTextureARB
-extern void (GL_FUNCPTR *sf_ptrc_glFramebufferTextureFaceARB)(GLenum, GLenum, GLuint, GLint, GLenum);
-#define glFramebufferTextureFaceARB sf_ptrc_glFramebufferTextureFaceARB
-extern void (GL_FUNCPTR *sf_ptrc_glFramebufferTextureLayerARB)(GLenum, GLenum, GLuint, GLint, GLint);
-#define glFramebufferTextureLayerARB sf_ptrc_glFramebufferTextureLayerARB
-extern void (GL_FUNCPTR *sf_ptrc_glProgramParameteriARB)(GLuint, GLenum, GLint);
-#define glProgramParameteriARB sf_ptrc_glProgramParameteriARB
-#endif // GL_ARB_geometry_shader4
-
-GLAPI void APIENTRY glAccum(GLenum, GLfloat);
-GLAPI void APIENTRY glAlphaFunc(GLenum, GLfloat);
-GLAPI void APIENTRY glBegin(GLenum);
-GLAPI void APIENTRY glBitmap(GLsizei, GLsizei, GLfloat, GLfloat, GLfloat, GLfloat, const GLubyte*);
-GLAPI void APIENTRY glBlendFunc(GLenum, GLenum);
-GLAPI void APIENTRY glCallList(GLuint);
-GLAPI void APIENTRY glCallLists(GLsizei, GLenum, const void*);
-GLAPI void APIENTRY glClear(GLbitfield);
-GLAPI void APIENTRY glClearAccum(GLfloat, GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glClearColor(GLfloat, GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glClearDepth(GLdouble);
-GLAPI void APIENTRY glClearIndex(GLfloat);
-GLAPI void APIENTRY glClearStencil(GLint);
-GLAPI void APIENTRY glClipPlane(GLenum, const GLdouble*);
-GLAPI void APIENTRY glColor3b(GLbyte, GLbyte, GLbyte);
-GLAPI void APIENTRY glColor3bv(const GLbyte*);
-GLAPI void APIENTRY glColor3d(GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glColor3dv(const GLdouble*);
-GLAPI void APIENTRY glColor3f(GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glColor3fv(const GLfloat*);
-GLAPI void APIENTRY glColor3i(GLint, GLint, GLint);
-GLAPI void APIENTRY glColor3iv(const GLint*);
-GLAPI void APIENTRY glColor3s(GLshort, GLshort, GLshort);
-GLAPI void APIENTRY glColor3sv(const GLshort*);
-GLAPI void APIENTRY glColor3ub(GLubyte, GLubyte, GLubyte);
-GLAPI void APIENTRY glColor3ubv(const GLubyte*);
-GLAPI void APIENTRY glColor3ui(GLuint, GLuint, GLuint);
-GLAPI void APIENTRY glColor3uiv(const GLuint*);
-GLAPI void APIENTRY glColor3us(GLushort, GLushort, GLushort);
-GLAPI void APIENTRY glColor3usv(const GLushort*);
-GLAPI void APIENTRY glColor4b(GLbyte, GLbyte, GLbyte, GLbyte);
-GLAPI void APIENTRY glColor4bv(const GLbyte*);
-GLAPI void APIENTRY glColor4d(GLdouble, GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glColor4dv(const GLdouble*);
-GLAPI void APIENTRY glColor4f(GLfloat, GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glColor4fv(const GLfloat*);
-GLAPI void APIENTRY glColor4i(GLint, GLint, GLint, GLint);
-GLAPI void APIENTRY glColor4iv(const GLint*);
-GLAPI void APIENTRY glColor4s(GLshort, GLshort, GLshort, GLshort);
-GLAPI void APIENTRY glColor4sv(const GLshort*);
-GLAPI void APIENTRY glColor4ub(GLubyte, GLubyte, GLubyte, GLubyte);
-GLAPI void APIENTRY glColor4ubv(const GLubyte*);
-GLAPI void APIENTRY glColor4ui(GLuint, GLuint, GLuint, GLuint);
-GLAPI void APIENTRY glColor4uiv(const GLuint*);
-GLAPI void APIENTRY glColor4us(GLushort, GLushort, GLushort, GLushort);
-GLAPI void APIENTRY glColor4usv(const GLushort*);
-GLAPI void APIENTRY glColorMask(GLboolean, GLboolean, GLboolean, GLboolean);
-GLAPI void APIENTRY glColorMaterial(GLenum, GLenum);
-GLAPI void APIENTRY glCopyPixels(GLint, GLint, GLsizei, GLsizei, GLenum);
-GLAPI void APIENTRY glCullFace(GLenum);
-GLAPI void APIENTRY glDeleteLists(GLuint, GLsizei);
-GLAPI void APIENTRY glDepthFunc(GLenum);
-GLAPI void APIENTRY glDepthMask(GLboolean);
-GLAPI void APIENTRY glDepthRange(GLdouble, GLdouble);
-GLAPI void APIENTRY glDisable(GLenum);
-GLAPI void APIENTRY glDrawBuffer(GLenum);
-GLAPI void APIENTRY glDrawPixels(GLsizei, GLsizei, GLenum, GLenum, const void*);
-GLAPI void APIENTRY glEdgeFlag(GLboolean);
-GLAPI void APIENTRY glEdgeFlagv(const GLboolean*);
-GLAPI void APIENTRY glEnable(GLenum);
-GLAPI void APIENTRY glEnd();
-GLAPI void APIENTRY glEndList();
-GLAPI void APIENTRY glEvalCoord1d(GLdouble);
-GLAPI void APIENTRY glEvalCoord1dv(const GLdouble*);
-GLAPI void APIENTRY glEvalCoord1f(GLfloat);
-GLAPI void APIENTRY glEvalCoord1fv(const GLfloat*);
-GLAPI void APIENTRY glEvalCoord2d(GLdouble, GLdouble);
-GLAPI void APIENTRY glEvalCoord2dv(const GLdouble*);
-GLAPI void APIENTRY glEvalCoord2f(GLfloat, GLfloat);
-GLAPI void APIENTRY glEvalCoord2fv(const GLfloat*);
-GLAPI void APIENTRY glEvalMesh1(GLenum, GLint, GLint);
-GLAPI void APIENTRY glEvalMesh2(GLenum, GLint, GLint, GLint, GLint);
-GLAPI void APIENTRY glEvalPoint1(GLint);
-GLAPI void APIENTRY glEvalPoint2(GLint, GLint);
-GLAPI void APIENTRY glFeedbackBuffer(GLsizei, GLenum, GLfloat*);
-GLAPI void APIENTRY glFinish();
-GLAPI void APIENTRY glFlush();
-GLAPI void APIENTRY glFogf(GLenum, GLfloat);
-GLAPI void APIENTRY glFogfv(GLenum, const GLfloat*);
-GLAPI void APIENTRY glFogi(GLenum, GLint);
-GLAPI void APIENTRY glFogiv(GLenum, const GLint*);
-GLAPI void APIENTRY glFrontFace(GLenum);
-GLAPI void APIENTRY glFrustum(GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble);
-GLAPI GLuint APIENTRY glGenLists(GLsizei);
-GLAPI void APIENTRY glGetBooleanv(GLenum, GLboolean*);
-GLAPI void APIENTRY glGetClipPlane(GLenum, GLdouble*);
-GLAPI void APIENTRY glGetDoublev(GLenum, GLdouble*);
-GLAPI GLenum APIENTRY glGetError();
-GLAPI void APIENTRY glGetFloatv(GLenum, GLfloat*);
-GLAPI void APIENTRY glGetIntegerv(GLenum, GLint*);
-GLAPI void APIENTRY glGetLightfv(GLenum, GLenum, GLfloat*);
-GLAPI void APIENTRY glGetLightiv(GLenum, GLenum, GLint*);
-GLAPI void APIENTRY glGetMapdv(GLenum, GLenum, GLdouble*);
-GLAPI void APIENTRY glGetMapfv(GLenum, GLenum, GLfloat*);
-GLAPI void APIENTRY glGetMapiv(GLenum, GLenum, GLint*);
-GLAPI void APIENTRY glGetMaterialfv(GLenum, GLenum, GLfloat*);
-GLAPI void APIENTRY glGetMaterialiv(GLenum, GLenum, GLint*);
-GLAPI void APIENTRY glGetPixelMapfv(GLenum, GLfloat*);
-GLAPI void APIENTRY glGetPixelMapuiv(GLenum, GLuint*);
-GLAPI void APIENTRY glGetPixelMapusv(GLenum, GLushort*);
-GLAPI void APIENTRY glGetPolygonStipple(GLubyte*);
-GLAPI const GLubyte* APIENTRY glGetString(GLenum);
-GLAPI void APIENTRY glGetTexEnvfv(GLenum, GLenum, GLfloat*);
-GLAPI void APIENTRY glGetTexEnviv(GLenum, GLenum, GLint*);
-GLAPI void APIENTRY glGetTexGendv(GLenum, GLenum, GLdouble*);
-GLAPI void APIENTRY glGetTexGenfv(GLenum, GLenum, GLfloat*);
-GLAPI void APIENTRY glGetTexGeniv(GLenum, GLenum, GLint*);
-GLAPI void APIENTRY glGetTexImage(GLenum, GLint, GLenum, GLenum, void*);
-GLAPI void APIENTRY glGetTexLevelParameterfv(GLenum, GLint, GLenum, GLfloat*);
-GLAPI void APIENTRY glGetTexLevelParameteriv(GLenum, GLint, GLenum, GLint*);
-GLAPI void APIENTRY glGetTexParameterfv(GLenum, GLenum, GLfloat*);
-GLAPI void APIENTRY glGetTexParameteriv(GLenum, GLenum, GLint*);
-GLAPI void APIENTRY glHint(GLenum, GLenum);
-GLAPI void APIENTRY glIndexMask(GLuint);
-GLAPI void APIENTRY glIndexd(GLdouble);
-GLAPI void APIENTRY glIndexdv(const GLdouble*);
-GLAPI void APIENTRY glIndexf(GLfloat);
-GLAPI void APIENTRY glIndexfv(const GLfloat*);
-GLAPI void APIENTRY glIndexi(GLint);
-GLAPI void APIENTRY glIndexiv(const GLint*);
-GLAPI void APIENTRY glIndexs(GLshort);
-GLAPI void APIENTRY glIndexsv(const GLshort*);
-GLAPI void APIENTRY glInitNames();
-GLAPI GLboolean APIENTRY glIsEnabled(GLenum);
-GLAPI GLboolean APIENTRY glIsList(GLuint);
-GLAPI void APIENTRY glLightModelf(GLenum, GLfloat);
-GLAPI void APIENTRY glLightModelfv(GLenum, const GLfloat*);
-GLAPI void APIENTRY glLightModeli(GLenum, GLint);
-GLAPI void APIENTRY glLightModeliv(GLenum, const GLint*);
-GLAPI void APIENTRY glLightf(GLenum, GLenum, GLfloat);
-GLAPI void APIENTRY glLightfv(GLenum, GLenum, const GLfloat*);
-GLAPI void APIENTRY glLighti(GLenum, GLenum, GLint);
-GLAPI void APIENTRY glLightiv(GLenum, GLenum, const GLint*);
-GLAPI void APIENTRY glLineStipple(GLint, GLushort);
-GLAPI void APIENTRY glLineWidth(GLfloat);
-GLAPI void APIENTRY glListBase(GLuint);
-GLAPI void APIENTRY glLoadIdentity();
-GLAPI void APIENTRY glLoadMatrixd(const GLdouble*);
-GLAPI void APIENTRY glLoadMatrixf(const GLfloat*);
-GLAPI void APIENTRY glLoadName(GLuint);
-GLAPI void APIENTRY glLogicOp(GLenum);
-GLAPI void APIENTRY glMap1d(GLenum, GLdouble, GLdouble, GLint, GLint, const GLdouble*);
-GLAPI void APIENTRY glMap1f(GLenum, GLfloat, GLfloat, GLint, GLint, const GLfloat*);
-GLAPI void APIENTRY glMap2d(GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble*);
-GLAPI void APIENTRY glMap2f(GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat*);
-GLAPI void APIENTRY glMapGrid1d(GLint, GLdouble, GLdouble);
-GLAPI void APIENTRY glMapGrid1f(GLint, GLfloat, GLfloat);
-GLAPI void APIENTRY glMapGrid2d(GLint, GLdouble, GLdouble, GLint, GLdouble, GLdouble);
-GLAPI void APIENTRY glMapGrid2f(GLint, GLfloat, GLfloat, GLint, GLfloat, GLfloat);
-GLAPI void APIENTRY glMaterialf(GLenum, GLenum, GLfloat);
-GLAPI void APIENTRY glMaterialfv(GLenum, GLenum, const GLfloat*);
-GLAPI void APIENTRY glMateriali(GLenum, GLenum, GLint);
-GLAPI void APIENTRY glMaterialiv(GLenum, GLenum, const GLint*);
-GLAPI void APIENTRY glMatrixMode(GLenum);
-GLAPI void APIENTRY glMultMatrixd(const GLdouble*);
-GLAPI void APIENTRY glMultMatrixf(const GLfloat*);
-GLAPI void APIENTRY glNewList(GLuint, GLenum);
-GLAPI void APIENTRY glNormal3b(GLbyte, GLbyte, GLbyte);
-GLAPI void APIENTRY glNormal3bv(const GLbyte*);
-GLAPI void APIENTRY glNormal3d(GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glNormal3dv(const GLdouble*);
-GLAPI void APIENTRY glNormal3f(GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glNormal3fv(const GLfloat*);
-GLAPI void APIENTRY glNormal3i(GLint, GLint, GLint);
-GLAPI void APIENTRY glNormal3iv(const GLint*);
-GLAPI void APIENTRY glNormal3s(GLshort, GLshort, GLshort);
-GLAPI void APIENTRY glNormal3sv(const GLshort*);
-GLAPI void APIENTRY glOrtho(GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glPassThrough(GLfloat);
-GLAPI void APIENTRY glPixelMapfv(GLenum, GLsizei, const GLfloat*);
-GLAPI void APIENTRY glPixelMapuiv(GLenum, GLsizei, const GLuint*);
-GLAPI void APIENTRY glPixelMapusv(GLenum, GLsizei, const GLushort*);
-GLAPI void APIENTRY glPixelStoref(GLenum, GLfloat);
-GLAPI void APIENTRY glPixelStorei(GLenum, GLint);
-GLAPI void APIENTRY glPixelTransferf(GLenum, GLfloat);
-GLAPI void APIENTRY glPixelTransferi(GLenum, GLint);
-GLAPI void APIENTRY glPixelZoom(GLfloat, GLfloat);
-GLAPI void APIENTRY glPointSize(GLfloat);
-GLAPI void APIENTRY glPolygonMode(GLenum, GLenum);
-GLAPI void APIENTRY glPolygonStipple(const GLubyte*);
-GLAPI void APIENTRY glPopAttrib();
-GLAPI void APIENTRY glPopMatrix();
-GLAPI void APIENTRY glPopName();
-GLAPI void APIENTRY glPushAttrib(GLbitfield);
-GLAPI void APIENTRY glPushMatrix();
-GLAPI void APIENTRY glPushName(GLuint);
-GLAPI void APIENTRY glRasterPos2d(GLdouble, GLdouble);
-GLAPI void APIENTRY glRasterPos2dv(const GLdouble*);
-GLAPI void APIENTRY glRasterPos2f(GLfloat, GLfloat);
-GLAPI void APIENTRY glRasterPos2fv(const GLfloat*);
-GLAPI void APIENTRY glRasterPos2i(GLint, GLint);
-GLAPI void APIENTRY glRasterPos2iv(const GLint*);
-GLAPI void APIENTRY glRasterPos2s(GLshort, GLshort);
-GLAPI void APIENTRY glRasterPos2sv(const GLshort*);
-GLAPI void APIENTRY glRasterPos3d(GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glRasterPos3dv(const GLdouble*);
-GLAPI void APIENTRY glRasterPos3f(GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glRasterPos3fv(const GLfloat*);
-GLAPI void APIENTRY glRasterPos3i(GLint, GLint, GLint);
-GLAPI void APIENTRY glRasterPos3iv(const GLint*);
-GLAPI void APIENTRY glRasterPos3s(GLshort, GLshort, GLshort);
-GLAPI void APIENTRY glRasterPos3sv(const GLshort*);
-GLAPI void APIENTRY glRasterPos4d(GLdouble, GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glRasterPos4dv(const GLdouble*);
-GLAPI void APIENTRY glRasterPos4f(GLfloat, GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glRasterPos4fv(const GLfloat*);
-GLAPI void APIENTRY glRasterPos4i(GLint, GLint, GLint, GLint);
-GLAPI void APIENTRY glRasterPos4iv(const GLint*);
-GLAPI void APIENTRY glRasterPos4s(GLshort, GLshort, GLshort, GLshort);
-GLAPI void APIENTRY glRasterPos4sv(const GLshort*);
-GLAPI void APIENTRY glReadBuffer(GLenum);
-GLAPI void APIENTRY glReadPixels(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, void*);
-GLAPI void APIENTRY glRectd(GLdouble, GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glRectdv(const GLdouble*, const GLdouble*);
-GLAPI void APIENTRY glRectf(GLfloat, GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glRectfv(const GLfloat*, const GLfloat*);
-GLAPI void APIENTRY glRecti(GLint, GLint, GLint, GLint);
-GLAPI void APIENTRY glRectiv(const GLint*, const GLint*);
-GLAPI void APIENTRY glRects(GLshort, GLshort, GLshort, GLshort);
-GLAPI void APIENTRY glRectsv(const GLshort*, const GLshort*);
-GLAPI GLint APIENTRY glRenderMode(GLenum);
-GLAPI void APIENTRY glRotated(GLdouble, GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glRotatef(GLfloat, GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glScaled(GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glScalef(GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glScissor(GLint, GLint, GLsizei, GLsizei);
-GLAPI void APIENTRY glSelectBuffer(GLsizei, GLuint*);
-GLAPI void APIENTRY glShadeModel(GLenum);
-GLAPI void APIENTRY glStencilFunc(GLenum, GLint, GLuint);
-GLAPI void APIENTRY glStencilMask(GLuint);
-GLAPI void APIENTRY glStencilOp(GLenum, GLenum, GLenum);
-GLAPI void APIENTRY glTexCoord1d(GLdouble);
-GLAPI void APIENTRY glTexCoord1dv(const GLdouble*);
-GLAPI void APIENTRY glTexCoord1f(GLfloat);
-GLAPI void APIENTRY glTexCoord1fv(const GLfloat*);
-GLAPI void APIENTRY glTexCoord1i(GLint);
-GLAPI void APIENTRY glTexCoord1iv(const GLint*);
-GLAPI void APIENTRY glTexCoord1s(GLshort);
-GLAPI void APIENTRY glTexCoord1sv(const GLshort*);
-GLAPI void APIENTRY glTexCoord2d(GLdouble, GLdouble);
-GLAPI void APIENTRY glTexCoord2dv(const GLdouble*);
-GLAPI void APIENTRY glTexCoord2f(GLfloat, GLfloat);
-GLAPI void APIENTRY glTexCoord2fv(const GLfloat*);
-GLAPI void APIENTRY glTexCoord2i(GLint, GLint);
-GLAPI void APIENTRY glTexCoord2iv(const GLint*);
-GLAPI void APIENTRY glTexCoord2s(GLshort, GLshort);
-GLAPI void APIENTRY glTexCoord2sv(const GLshort*);
-GLAPI void APIENTRY glTexCoord3d(GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glTexCoord3dv(const GLdouble*);
-GLAPI void APIENTRY glTexCoord3f(GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glTexCoord3fv(const GLfloat*);
-GLAPI void APIENTRY glTexCoord3i(GLint, GLint, GLint);
-GLAPI void APIENTRY glTexCoord3iv(const GLint*);
-GLAPI void APIENTRY glTexCoord3s(GLshort, GLshort, GLshort);
-GLAPI void APIENTRY glTexCoord3sv(const GLshort*);
-GLAPI void APIENTRY glTexCoord4d(GLdouble, GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glTexCoord4dv(const GLdouble*);
-GLAPI void APIENTRY glTexCoord4f(GLfloat, GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glTexCoord4fv(const GLfloat*);
-GLAPI void APIENTRY glTexCoord4i(GLint, GLint, GLint, GLint);
-GLAPI void APIENTRY glTexCoord4iv(const GLint*);
-GLAPI void APIENTRY glTexCoord4s(GLshort, GLshort, GLshort, GLshort);
-GLAPI void APIENTRY glTexCoord4sv(const GLshort*);
-GLAPI void APIENTRY glTexEnvf(GLenum, GLenum, GLfloat);
-GLAPI void APIENTRY glTexEnvfv(GLenum, GLenum, const GLfloat*);
-GLAPI void APIENTRY glTexEnvi(GLenum, GLenum, GLint);
-GLAPI void APIENTRY glTexEnviv(GLenum, GLenum, const GLint*);
-GLAPI void APIENTRY glTexGend(GLenum, GLenum, GLdouble);
-GLAPI void APIENTRY glTexGendv(GLenum, GLenum, const GLdouble*);
-GLAPI void APIENTRY glTexGenf(GLenum, GLenum, GLfloat);
-GLAPI void APIENTRY glTexGenfv(GLenum, GLenum, const GLfloat*);
-GLAPI void APIENTRY glTexGeni(GLenum, GLenum, GLint);
-GLAPI void APIENTRY glTexGeniv(GLenum, GLenum, const GLint*);
-GLAPI void APIENTRY glTexImage1D(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void*);
-GLAPI void APIENTRY glTexImage2D(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*);
-GLAPI void APIENTRY glTexParameterf(GLenum, GLenum, GLfloat);
-GLAPI void APIENTRY glTexParameterfv(GLenum, GLenum, const GLfloat*);
-GLAPI void APIENTRY glTexParameteri(GLenum, GLenum, GLint);
-GLAPI void APIENTRY glTexParameteriv(GLenum, GLenum, const GLint*);
-GLAPI void APIENTRY glTranslated(GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glTranslatef(GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glVertex2d(GLdouble, GLdouble);
-GLAPI void APIENTRY glVertex2dv(const GLdouble*);
-GLAPI void APIENTRY glVertex2f(GLfloat, GLfloat);
-GLAPI void APIENTRY glVertex2fv(const GLfloat*);
-GLAPI void APIENTRY glVertex2i(GLint, GLint);
-GLAPI void APIENTRY glVertex2iv(const GLint*);
-GLAPI void APIENTRY glVertex2s(GLshort, GLshort);
-GLAPI void APIENTRY glVertex2sv(const GLshort*);
-GLAPI void APIENTRY glVertex3d(GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glVertex3dv(const GLdouble*);
-GLAPI void APIENTRY glVertex3f(GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glVertex3fv(const GLfloat*);
-GLAPI void APIENTRY glVertex3i(GLint, GLint, GLint);
-GLAPI void APIENTRY glVertex3iv(const GLint*);
-GLAPI void APIENTRY glVertex3s(GLshort, GLshort, GLshort);
-GLAPI void APIENTRY glVertex3sv(const GLshort*);
-GLAPI void APIENTRY glVertex4d(GLdouble, GLdouble, GLdouble, GLdouble);
-GLAPI void APIENTRY glVertex4dv(const GLdouble*);
-GLAPI void APIENTRY glVertex4f(GLfloat, GLfloat, GLfloat, GLfloat);
-GLAPI void APIENTRY glVertex4fv(const GLfloat*);
-GLAPI void APIENTRY glVertex4i(GLint, GLint, GLint, GLint);
-GLAPI void APIENTRY glVertex4iv(const GLint*);
-GLAPI void APIENTRY glVertex4s(GLshort, GLshort, GLshort, GLshort);
-GLAPI void APIENTRY glVertex4sv(const GLshort*);
-GLAPI void APIENTRY glViewport(GLint, GLint, GLsizei, GLsizei);
-
-GLAPI GLboolean APIENTRY glAreTexturesResident(GLsizei, const GLuint*, GLboolean*);
-GLAPI void APIENTRY glArrayElement(GLint);
-GLAPI void APIENTRY glBindTexture(GLenum, GLuint);
-GLAPI void APIENTRY glColorPointer(GLint, GLenum, GLsizei, const void*);
-GLAPI void APIENTRY glCopyTexImage1D(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint);
-GLAPI void APIENTRY glCopyTexImage2D(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint);
-GLAPI void APIENTRY glCopyTexSubImage1D(GLenum, GLint, GLint, GLint, GLint, GLsizei);
-GLAPI void APIENTRY glCopyTexSubImage2D(GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
-GLAPI void APIENTRY glDeleteTextures(GLsizei, const GLuint*);
-GLAPI void APIENTRY glDisableClientState(GLenum);
-GLAPI void APIENTRY glDrawArrays(GLenum, GLint, GLsizei);
-GLAPI void APIENTRY glDrawElements(GLenum, GLsizei, GLenum, const void*);
-GLAPI void APIENTRY glEdgeFlagPointer(GLsizei, const void*);
-GLAPI void APIENTRY glEnableClientState(GLenum);
-GLAPI void APIENTRY glGenTextures(GLsizei, GLuint*);
-GLAPI void APIENTRY glGetPointerv(GLenum, void**);
-GLAPI void APIENTRY glIndexPointer(GLenum, GLsizei, const void*);
-GLAPI void APIENTRY glIndexub(GLubyte);
-GLAPI void APIENTRY glIndexubv(const GLubyte*);
-GLAPI void APIENTRY glInterleavedArrays(GLenum, GLsizei, const void*);
-GLAPI GLboolean APIENTRY glIsTexture(GLuint);
-GLAPI void APIENTRY glNormalPointer(GLenum, GLsizei, const void*);
-GLAPI void APIENTRY glPolygonOffset(GLfloat, GLfloat);
-GLAPI void APIENTRY glPopClientAttrib();
-GLAPI void APIENTRY glPrioritizeTextures(GLsizei, const GLuint*, const GLfloat*);
-GLAPI void APIENTRY glPushClientAttrib(GLbitfield);
-GLAPI void APIENTRY glTexCoordPointer(GLint, GLenum, GLsizei, const void*);
-GLAPI void APIENTRY glTexSubImage1D(GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void*);
-GLAPI void APIENTRY glTexSubImage2D(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void*);
-GLAPI void APIENTRY glVertexPointer(GLint, GLenum, GLsizei, const void*);
-
-enum sfogl_LoadStatus
-{
- sfogl_LOAD_FAILED = 0,
- sfogl_LOAD_SUCCEEDED = 1
-};
-
-void sfogl_LoadFunctions();
-
-#ifdef __cplusplus
-}
-#endif // __cplusplus
-
-#endif // SFML_GLLOADER_HPP
diff --git a/src/SFML/Graphics/Glsl.cpp b/src/SFML/Graphics/Glsl.cpp
index e8f9c1e..504cfd7 100644
--- a/src/SFML/Graphics/Glsl.cpp
+++ b/src/SFML/Graphics/Glsl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Graphics/Image.cpp b/src/SFML/Graphics/Image.cpp
index 67c2840..c50b864 100644
--- a/src/SFML/Graphics/Image.cpp
+++ b/src/SFML/Graphics/Image.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -153,6 +153,12 @@ bool Image::saveToFile(const std::string& filename) const
return priv::ImageLoader::getInstance().saveImageToFile(filename, m_pixels, m_size);
}
+////////////////////////////////////////////////////////////
+bool Image::saveToMemory(std::vector<sf::Uint8>& output, const std::string& format) const
+{
+ return priv::ImageLoader::getInstance().saveImageToMemory(format, output, m_pixels, m_size);
+}
+
////////////////////////////////////////////////////////////
Vector2u Image::getSize() const
@@ -193,20 +199,20 @@ void Image::copy(const Image& source, unsigned int destX, unsigned int destY, co
{
srcRect.left = 0;
srcRect.top = 0;
- srcRect.width = source.m_size.x;
- srcRect.height = source.m_size.y;
+ srcRect.width = static_cast<int>(source.m_size.x);
+ srcRect.height = static_cast<int>(source.m_size.y);
}
else
{
if (srcRect.left < 0) srcRect.left = 0;
if (srcRect.top < 0) srcRect.top = 0;
- if (srcRect.width > static_cast<int>(source.m_size.x)) srcRect.width = source.m_size.x;
- if (srcRect.height > static_cast<int>(source.m_size.y)) srcRect.height = source.m_size.y;
+ if (srcRect.width > static_cast<int>(source.m_size.x)) srcRect.width = static_cast<int>(source.m_size.x);
+ if (srcRect.height > static_cast<int>(source.m_size.y)) srcRect.height = static_cast<int>(source.m_size.y);
}
// Then find the valid bounds of the destination rectangle
- int width = srcRect.width;
- int height = srcRect.height;
+ unsigned int width = static_cast<unsigned int>(srcRect.width);
+ unsigned int height = static_cast<unsigned int>(srcRect.height);
if (destX + width > m_size.x) width = m_size.x - destX;
if (destY + height > m_size.y) height = m_size.y - destY;
@@ -215,31 +221,38 @@ void Image::copy(const Image& source, unsigned int destX, unsigned int destY, co
return;
// Precompute as much as possible
- int pitch = width * 4;
- int rows = height;
- int srcStride = source.m_size.x * 4;
- int dstStride = m_size.x * 4;
- const Uint8* srcPixels = &source.m_pixels[0] + (srcRect.left + srcRect.top * source.m_size.x) * 4;
+ std::size_t pitch = static_cast<std::size_t>(width) * 4;
+ unsigned int rows = height;
+ int srcStride = static_cast<int>(source.m_size.x) * 4;
+ int dstStride = static_cast<int>(m_size.x) * 4;
+ const Uint8* srcPixels = &source.m_pixels[0] + (static_cast<unsigned int>(srcRect.left) + static_cast<unsigned int>(srcRect.top) * source.m_size.x) * 4;
Uint8* dstPixels = &m_pixels[0] + (destX + destY * m_size.x) * 4;
// Copy the pixels
if (applyAlpha)
{
// Interpolation using alpha values, pixel by pixel (slower)
- for (int i = 0; i < rows; ++i)
+ for (unsigned int i = 0; i < rows; ++i)
{
- for (int j = 0; j < width; ++j)
+ for (unsigned int j = 0; j < width; ++j)
{
// Get a direct pointer to the components of the current pixel
const Uint8* src = srcPixels + j * 4;
Uint8* dst = dstPixels + j * 4;
- // Interpolate RGBA components using the alpha value of the source pixel
- Uint8 alpha = src[3];
- dst[0] = (src[0] * alpha + dst[0] * (255 - alpha)) / 255;
- dst[1] = (src[1] * alpha + dst[1] * (255 - alpha)) / 255;
- dst[2] = (src[2] * alpha + dst[2] * (255 - alpha)) / 255;
- dst[3] = alpha + dst[3] * (255 - alpha) / 255;
+ // Interpolate RGBA components using the alpha values of the destination and source pixels
+ Uint8 src_alpha = src[3];
+ Uint8 dst_alpha = dst[3];
+ Uint8 out_alpha = static_cast<Uint8>(src_alpha + dst_alpha - src_alpha * dst_alpha / 255);
+
+ dst[3] = out_alpha;
+
+ if (out_alpha)
+ for (int k = 0; k < 3; k++)
+ dst[k] = static_cast<Uint8>((src[k] * src_alpha + dst[k] * (out_alpha - src_alpha)) / out_alpha);
+ else
+ for (int k = 0; k < 3; k++)
+ dst[k] = src[k];
}
srcPixels += srcStride;
@@ -249,7 +262,7 @@ void Image::copy(const Image& source, unsigned int destX, unsigned int destY, co
else
{
// Optimized copy ignoring alpha values, row by row (faster)
- for (int i = 0; i < rows; ++i)
+ for (unsigned int i = 0; i < rows; ++i)
{
std::memcpy(dstPixels, srcPixels, pitch);
srcPixels += srcStride;
@@ -302,8 +315,8 @@ void Image::flipHorizontally()
for (std::size_t y = 0; y < m_size.y; ++y)
{
- std::vector<Uint8>::iterator left = m_pixels.begin() + y * rowSize;
- std::vector<Uint8>::iterator right = m_pixels.begin() + (y + 1) * rowSize - 4;
+ std::vector<Uint8>::iterator left = m_pixels.begin() + static_cast<std::vector<Uint8>::iterator::difference_type>(y * rowSize);
+ std::vector<Uint8>::iterator right = m_pixels.begin() + static_cast<std::vector<Uint8>::iterator::difference_type>((y + 1) * rowSize - 4);
for (std::size_t x = 0; x < m_size.x / 2; ++x)
{
@@ -322,7 +335,7 @@ void Image::flipVertically()
{
if (!m_pixels.empty())
{
- std::size_t rowSize = m_size.x * 4;
+ std::vector<Uint8>::iterator::difference_type rowSize = static_cast<std::vector<Uint8>::iterator::difference_type>(m_size.x * 4);
std::vector<Uint8>::iterator top = m_pixels.begin();
std::vector<Uint8>::iterator bottom = m_pixels.end() - rowSize;
diff --git a/src/SFML/Graphics/ImageLoader.cpp b/src/SFML/Graphics/ImageLoader.cpp
index 023541d..ddcdd18 100644
--- a/src/SFML/Graphics/ImageLoader.cpp
+++ b/src/SFML/Graphics/ImageLoader.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -28,11 +28,11 @@
#include <SFML/Graphics/ImageLoader.hpp>
#include <SFML/System/InputStream.hpp>
#include <SFML/System/Err.hpp>
-#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>
-#define STB_IMAGE_WRITE_IMPLEMENTATION
#include <stb_image_write.h>
#include <cctype>
+#include <iterator>
+#include <cstring>
namespace
@@ -61,6 +61,14 @@ namespace
sf::InputStream* stream = static_cast<sf::InputStream*>(user);
return stream->tell() >= stream->getSize();
}
+
+ // stb_image callback for constructing a buffer
+ void bufferFromCallback(void* context, void* data, int size)
+ {
+ sf::Uint8* source = static_cast<sf::Uint8*>(data);
+ std::vector<sf::Uint8>* dest = static_cast<std::vector<sf::Uint8>*>(context);
+ std::copy(source, source + size, std::back_inserter(*dest));
+ }
}
@@ -106,13 +114,13 @@ bool ImageLoader::loadImageFromFile(const std::string& filename, std::vector<Uin
if (ptr)
{
// Assign the image properties
- size.x = width;
- size.y = height;
+ size.x = static_cast<unsigned int>(width);
+ size.y = static_cast<unsigned int>(height);
- if (width && height)
+ if (width > 0 && height > 0)
{
// Copy the loaded pixels to the pixel buffer
- pixels.resize(width * height * 4);
+ pixels.resize(static_cast<std::size_t>(width * height * 4));
memcpy(&pixels[0], ptr, pixels.size());
}
@@ -150,13 +158,13 @@ bool ImageLoader::loadImageFromMemory(const void* data, std::size_t dataSize, st
if (ptr)
{
// Assign the image properties
- size.x = width;
- size.y = height;
+ size.x = static_cast<unsigned int>(width);
+ size.y = static_cast<unsigned int>(height);
- if (width && height)
+ if (width > 0 && height > 0)
{
// Copy the loaded pixels to the pixel buffer
- pixels.resize(width * height * 4);
+ pixels.resize(static_cast<std::size_t>(width * height * 4));
memcpy(&pixels[0], ptr, pixels.size());
}
@@ -205,13 +213,13 @@ bool ImageLoader::loadImageFromStream(InputStream& stream, std::vector<Uint8>& p
if (ptr)
{
// Assign the image properties
- size.x = width;
- size.y = height;
+ size.x = static_cast<unsigned int>(width);
+ size.y = static_cast<unsigned int>(height);
if (width && height)
{
// Copy the loaded pixels to the pixel buffer
- pixels.resize(width * height * 4);
+ pixels.resize(static_cast<std::size_t>(width * height * 4));
memcpy(&pixels[0], ptr, pixels.size());
}
@@ -241,29 +249,30 @@ bool ImageLoader::saveImageToFile(const std::string& filename, const std::vector
// Extract the extension
const std::size_t dot = filename.find_last_of('.');
const std::string extension = dot != std::string::npos ? toLower(filename.substr(dot + 1)) : "";
+ const Vector2i convertedSize = Vector2i(size);
if (extension == "bmp")
{
// BMP format
- if (stbi_write_bmp(filename.c_str(), size.x, size.y, 4, &pixels[0]))
+ if (stbi_write_bmp(filename.c_str(), convertedSize.x, convertedSize.y, 4, &pixels[0]))
return true;
}
else if (extension == "tga")
{
// TGA format
- if (stbi_write_tga(filename.c_str(), size.x, size.y, 4, &pixels[0]))
+ if (stbi_write_tga(filename.c_str(), convertedSize.x, convertedSize.y, 4, &pixels[0]))
return true;
}
else if (extension == "png")
{
// PNG format
- if (stbi_write_png(filename.c_str(), size.x, size.y, 4, &pixels[0], 0))
+ if (stbi_write_png(filename.c_str(), convertedSize.x, convertedSize.y, 4, &pixels[0], 0))
return true;
}
else if (extension == "jpg" || extension == "jpeg")
{
// JPG format
- if (stbi_write_jpg(filename.c_str(), size.x, size.y, 4, &pixels[0], 90))
+ if (stbi_write_jpg(filename.c_str(), convertedSize.x, convertedSize.y, 4, &pixels[0], 90))
return true;
}
}
@@ -272,6 +281,47 @@ bool ImageLoader::saveImageToFile(const std::string& filename, const std::vector
return false;
}
+////////////////////////////////////////////////////////////
+bool ImageLoader::saveImageToMemory(const std::string& format, std::vector<sf::Uint8>& output, const std::vector<Uint8>& pixels, const Vector2u& size)
+{
+ // Make sure the image is not empty
+ if (!pixels.empty() && (size.x > 0) && (size.y > 0))
+ {
+ // Choose function based on format
+
+ std::string specified = toLower(format);
+ const Vector2i convertedSize = Vector2i(size);
+
+ if (specified == "bmp")
+ {
+ // BMP format
+ if (stbi_write_bmp_to_func(&bufferFromCallback, &output, convertedSize.x, convertedSize.y, 4, &pixels[0]))
+ return true;
+ }
+ else if (specified == "tga")
+ {
+ // TGA format
+ if (stbi_write_tga_to_func(&bufferFromCallback, &output, convertedSize.x, convertedSize.y, 4, &pixels[0]))
+ return true;
+ }
+ else if (specified == "png")
+ {
+ // PNG format
+ if (stbi_write_png_to_func(&bufferFromCallback, &output, convertedSize.x, convertedSize.y, 4, &pixels[0], 0))
+ return true;
+ }
+ else if (specified == "jpg" || specified == "jpeg")
+ {
+ // JPG format
+ if (stbi_write_jpg_to_func(&bufferFromCallback, &output, convertedSize.x, convertedSize.y, 4, &pixels[0], 90))
+ return true;
+ }
+ }
+
+ err() << "Failed to save image with format \"" << format << "\"" << std::endl;
+ return false;
+}
+
} // namespace priv
} // namespace sf
diff --git a/src/SFML/Graphics/ImageLoader.hpp b/src/SFML/Graphics/ImageLoader.hpp
index 0134bd8..f1f2e9c 100644
--- a/src/SFML/Graphics/ImageLoader.hpp
+++ b/src/SFML/Graphics/ImageLoader.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -105,6 +105,19 @@ public:
////////////////////////////////////////////////////////////
bool saveImageToFile(const std::string& filename, const std::vector<Uint8>& pixels, const Vector2u& size);
+ ////////////////////////////////////////////////////////////
+ /// \brief Save an array of pixels as an encoded image buffer
+ ///
+ /// \param format Must be "bmp", "png", "tga" or "jpg"/"jpeg".
+ /// \param output Buffer to fill with encoded data
+ /// \param pixels Array of pixels to save to image
+ /// \param size Size of image to save, in pixels
+ ///
+ /// \return True if saving was successful
+ ///
+ ////////////////////////////////////////////////////////////
+ bool saveImageToMemory(const std::string& format, std::vector<sf::Uint8>& output, const std::vector<Uint8>& pixels, const Vector2u& size);
+
private:
////////////////////////////////////////////////////////////
diff --git a/src/SFML/Graphics/RectangleShape.cpp b/src/SFML/Graphics/RectangleShape.cpp
index f7778c0..86f8317 100644
--- a/src/SFML/Graphics/RectangleShape.cpp
+++ b/src/SFML/Graphics/RectangleShape.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Graphics/RenderStates.cpp b/src/SFML/Graphics/RenderStates.cpp
index 4c55546..b5eaeca 100644
--- a/src/SFML/Graphics/RenderStates.cpp
+++ b/src/SFML/Graphics/RenderStates.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp
index 9a6e301..f750665 100644
--- a/src/SFML/Graphics/RenderTarget.cpp
+++ b/src/SFML/Graphics/RenderTarget.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -43,81 +43,108 @@
// GL_QUADS is unavailable on OpenGL ES, thus we need to define GL_QUADS ourselves
-#ifdef SFML_OPENGL_ES
+#ifndef GL_QUADS
#define GL_QUADS 0
-#endif // SFML_OPENGL_ES
+#endif // GL_QUADS
namespace
{
- // Mutex to protect ID generation and our context-RenderTarget-map
- sf::Mutex mutex;
-
- // Unique identifier, used for identifying RenderTargets when
- // tracking the currently active RenderTarget within a given context
- sf::Uint64 getUniqueId()
+ // A nested named namespace is used here to allow unity builds of SFML.
+ namespace RenderTargetImpl
{
- sf::Lock lock(mutex);
+ // Mutex to protect ID generation and our context-RenderTarget-map
+ sf::Mutex mutex;
- static sf::Uint64 id = 1; // start at 1, zero is "no RenderTarget"
+ // Unique identifier, used for identifying RenderTargets when
+ // tracking the currently active RenderTarget within a given context
+ sf::Uint64 getUniqueId()
+ {
+ sf::Lock lock(mutex);
- return id++;
- }
+ static sf::Uint64 id = 1; // start at 1, zero is "no RenderTarget"
- // Map to help us detect whether a different RenderTarget
- // has been activated within a single context
- typedef std::map<sf::Uint64, sf::Uint64> ContextRenderTargetMap;
- ContextRenderTargetMap contextRenderTargetMap;
+ return id++;
+ }
- // Check if a RenderTarget with the given ID is active in the current context
- bool isActive(sf::Uint64 id)
- {
- ContextRenderTargetMap::iterator iter = contextRenderTargetMap.find(sf::Context::getActiveContextId());
+ // Map to help us detect whether a different RenderTarget
+ // has been activated within a single context
+ typedef std::map<sf::Uint64, sf::Uint64> ContextRenderTargetMap;
+ ContextRenderTargetMap contextRenderTargetMap;
- if ((iter == contextRenderTargetMap.end()) || (iter->second != id))
- return false;
+ // Check if a RenderTarget with the given ID is active in the current context
+ bool isActive(sf::Uint64 id)
+ {
+ ContextRenderTargetMap::iterator iter = contextRenderTargetMap.find(sf::Context::getActiveContextId());
- return true;
- }
+ if ((iter == contextRenderTargetMap.end()) || (iter->second != id))
+ return false;
- // Convert an sf::BlendMode::Factor constant to the corresponding OpenGL constant.
- sf::Uint32 factorToGlConstant(sf::BlendMode::Factor blendFactor)
- {
- switch (blendFactor)
- {
- case sf::BlendMode::Zero: return GL_ZERO;
- case sf::BlendMode::One: return GL_ONE;
- case sf::BlendMode::SrcColor: return GL_SRC_COLOR;
- case sf::BlendMode::OneMinusSrcColor: return GL_ONE_MINUS_SRC_COLOR;
- case sf::BlendMode::DstColor: return GL_DST_COLOR;
- case sf::BlendMode::OneMinusDstColor: return GL_ONE_MINUS_DST_COLOR;
- case sf::BlendMode::SrcAlpha: return GL_SRC_ALPHA;
- case sf::BlendMode::OneMinusSrcAlpha: return GL_ONE_MINUS_SRC_ALPHA;
- case sf::BlendMode::DstAlpha: return GL_DST_ALPHA;
- case sf::BlendMode::OneMinusDstAlpha: return GL_ONE_MINUS_DST_ALPHA;
+ return true;
}
- sf::err() << "Invalid value for sf::BlendMode::Factor! Fallback to sf::BlendMode::Zero." << std::endl;
- assert(false);
- return GL_ZERO;
- }
+ // Convert an sf::BlendMode::Factor constant to the corresponding OpenGL constant.
+ sf::Uint32 factorToGlConstant(sf::BlendMode::Factor blendFactor)
+ {
+ switch (blendFactor)
+ {
+ case sf::BlendMode::Zero: return GL_ZERO;
+ case sf::BlendMode::One: return GL_ONE;
+ case sf::BlendMode::SrcColor: return GL_SRC_COLOR;
+ case sf::BlendMode::OneMinusSrcColor: return GL_ONE_MINUS_SRC_COLOR;
+ case sf::BlendMode::DstColor: return GL_DST_COLOR;
+ case sf::BlendMode::OneMinusDstColor: return GL_ONE_MINUS_DST_COLOR;
+ case sf::BlendMode::SrcAlpha: return GL_SRC_ALPHA;
+ case sf::BlendMode::OneMinusSrcAlpha: return GL_ONE_MINUS_SRC_ALPHA;
+ case sf::BlendMode::DstAlpha: return GL_DST_ALPHA;
+ case sf::BlendMode::OneMinusDstAlpha: return GL_ONE_MINUS_DST_ALPHA;
+ }
+ sf::err() << "Invalid value for sf::BlendMode::Factor! Fallback to sf::BlendMode::Zero." << std::endl;
+ assert(false);
+ return GL_ZERO;
+ }
- // Convert an sf::BlendMode::BlendEquation constant to the corresponding OpenGL constant.
- sf::Uint32 equationToGlConstant(sf::BlendMode::Equation blendEquation)
- {
- switch (blendEquation)
+
+ // Convert an sf::BlendMode::BlendEquation constant to the corresponding OpenGL constant.
+ sf::Uint32 equationToGlConstant(sf::BlendMode::Equation blendEquation)
{
- case sf::BlendMode::Add: return GLEXT_GL_FUNC_ADD;
- case sf::BlendMode::Subtract: return GLEXT_GL_FUNC_SUBTRACT;
- case sf::BlendMode::ReverseSubtract: return GLEXT_GL_FUNC_REVERSE_SUBTRACT;
- }
+ switch (blendEquation)
+ {
+ case sf::BlendMode::Add:
+ return GLEXT_GL_FUNC_ADD;
+ case sf::BlendMode::Subtract:
+ if (GLEXT_blend_subtract)
+ return GLEXT_GL_FUNC_SUBTRACT;
+ break;
+ case sf::BlendMode::ReverseSubtract:
+ if (GLEXT_blend_subtract)
+ return GLEXT_GL_FUNC_REVERSE_SUBTRACT;
+ break;
+ case sf::BlendMode::Min:
+ if (GLEXT_blend_minmax)
+ return GLEXT_GL_MIN;
+ break;
+ case sf::BlendMode::Max:
+ if (GLEXT_blend_minmax)
+ return GLEXT_GL_MAX;
+ break;
+ }
- sf::err() << "Invalid value for sf::BlendMode::Equation! Fallback to sf::BlendMode::Add." << std::endl;
- assert(false);
- return GLEXT_GL_FUNC_ADD;
+ static bool warned = false;
+ if (!warned)
+ {
+ sf::err() << "OpenGL extension EXT_blend_minmax or EXT_blend_subtract unavailable" << std::endl;
+ sf::err() << "Some blending equations will fallback to sf::BlendMode::Add" << std::endl;
+ sf::err() << "Ensure that hardware acceleration is enabled if available" << std::endl;
+
+ warned = true;
+ }
+
+ return GLEXT_GL_FUNC_ADD;
+ }
}
}
@@ -144,7 +171,7 @@ RenderTarget::~RenderTarget()
////////////////////////////////////////////////////////////
void RenderTarget::clear(const Color& color)
{
- if (isActive(m_id) || setActive(true))
+ if (RenderTargetImpl::isActive(m_id) || setActive(true))
{
// Unbind texture to fix RenderTexture preventing clear
applyTexture(NULL);
@@ -203,9 +230,9 @@ Vector2f RenderTarget::mapPixelToCoords(const Vector2i& point, const View& view)
{
// First, convert from viewport coordinates to homogeneous coordinates
Vector2f normalized;
- IntRect viewport = getViewport(view);
- normalized.x = -1.f + 2.f * (point.x - viewport.left) / viewport.width;
- normalized.y = 1.f - 2.f * (point.y - viewport.top) / viewport.height;
+ FloatRect viewport = FloatRect(getViewport(view));
+ normalized.x = -1.f + 2.f * (static_cast<float>(point.x) - viewport.left) / viewport.width;
+ normalized.y = 1.f - 2.f * (static_cast<float>(point.y) - viewport.top) / viewport.height;
// Then transform by the inverse of the view matrix
return view.getInverseTransform().transformPoint(normalized);
@@ -227,7 +254,7 @@ Vector2i RenderTarget::mapCoordsToPixel(const Vector2f& point, const View& view)
// Then convert to viewport coordinates
Vector2i pixel;
- IntRect viewport = getViewport(view);
+ FloatRect viewport = FloatRect(getViewport(view));
pixel.x = static_cast<int>(( normalized.x + 1.f) / 2.f * viewport.width + viewport.left);
pixel.y = static_cast<int>((-normalized.y + 1.f) / 2.f * viewport.height + viewport.top);
@@ -259,7 +286,7 @@ void RenderTarget::draw(const Vertex* vertices, std::size_t vertexCount,
}
#endif
- if (isActive(m_id) || setActive(true))
+ if (RenderTargetImpl::isActive(m_id) || setActive(true))
{
// Check if the vertex count is low enough so that we can pre-transform them
bool useVertexCache = (vertexCount <= StatesCache::VertexCacheSize);
@@ -359,7 +386,7 @@ void RenderTarget::draw(const VertexBuffer& vertexBuffer, std::size_t firstVerte
}
#endif
- if (isActive(m_id) || setActive(true))
+ if (RenderTargetImpl::isActive(m_id) || setActive(true))
{
setupDraw(false, states);
@@ -389,15 +416,24 @@ void RenderTarget::draw(const VertexBuffer& vertexBuffer, std::size_t firstVerte
////////////////////////////////////////////////////////////
+bool RenderTarget::isSrgb() const
+{
+ // By default sRGB encoding is not enabled for an arbitrary RenderTarget
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////
bool RenderTarget::setActive(bool active)
{
// Mark this RenderTarget as active or no longer active in the tracking map
{
- sf::Lock lock(mutex);
+ sf::Lock lock(RenderTargetImpl::mutex);
Uint64 contextId = Context::getActiveContextId();
- ContextRenderTargetMap::iterator iter = contextRenderTargetMap.find(contextId);
+ using RenderTargetImpl::contextRenderTargetMap;
+ RenderTargetImpl::ContextRenderTargetMap::iterator iter = contextRenderTargetMap.find(contextId);
if (active)
{
@@ -405,6 +441,7 @@ bool RenderTarget::setActive(bool active)
{
contextRenderTargetMap[contextId] = m_id;
+ m_cache.glStatesSet = false;
m_cache.enable = false;
}
else if (iter->second != m_id)
@@ -430,7 +467,7 @@ bool RenderTarget::setActive(bool active)
////////////////////////////////////////////////////////////
void RenderTarget::pushGLStates()
{
- if (isActive(m_id) || setActive(true))
+ if (RenderTargetImpl::isActive(m_id) || setActive(true))
{
#ifdef SFML_DEBUG
// make sure that the user didn't leave an unchecked OpenGL error
@@ -462,7 +499,7 @@ void RenderTarget::pushGLStates()
////////////////////////////////////////////////////////////
void RenderTarget::popGLStates()
{
- if (isActive(m_id) || setActive(true))
+ if (RenderTargetImpl::isActive(m_id) || setActive(true))
{
glCheck(glMatrixMode(GL_PROJECTION));
glCheck(glPopMatrix());
@@ -491,7 +528,7 @@ void RenderTarget::resetGLStates()
setActive(false);
#endif
- if (isActive(m_id) || setActive(true))
+ if (RenderTargetImpl::isActive(m_id) || setActive(true))
{
// Make sure that extensions are initialized
priv::ensureExtensionsInit();
@@ -550,7 +587,7 @@ void RenderTarget::initialize()
// Generate a unique ID for this RenderTarget to track
// whether it is active within a specific context
- m_id = getUniqueId();
+ m_id = RenderTargetImpl::getUniqueId();
}
@@ -559,7 +596,7 @@ void RenderTarget::applyCurrentView()
{
// Set the viewport
IntRect viewport = getViewport(m_view);
- int top = getSize().y - (viewport.top + viewport.height);
+ int top = static_cast<int>(getSize().y) - (viewport.top + viewport.height);
glCheck(glViewport(viewport.left, top, viewport.width, viewport.height));
// Set the projection matrix
@@ -576,6 +613,9 @@ void RenderTarget::applyCurrentView()
////////////////////////////////////////////////////////////
void RenderTarget::applyBlendMode(const BlendMode& mode)
{
+ using RenderTargetImpl::factorToGlConstant;
+ using RenderTargetImpl::equationToGlConstant;
+
// Apply the blend mode, falling back to the non-separate versions if necessary
if (GLEXT_blend_func_separate)
{
@@ -590,7 +630,7 @@ void RenderTarget::applyBlendMode(const BlendMode& mode)
factorToGlConstant(mode.colorDstFactor)));
}
- if (GLEXT_blend_minmax && GLEXT_blend_subtract)
+ if (GLEXT_blend_minmax || GLEXT_blend_subtract)
{
if (GLEXT_blend_equation_separate)
{
@@ -609,7 +649,11 @@ void RenderTarget::applyBlendMode(const BlendMode& mode)
if (!warned)
{
- err() << "OpenGL extension EXT_blend_minmax and/or EXT_blend_subtract unavailable" << std::endl;
+#ifdef SFML_OPENGL_ES
+ err() << "OpenGL ES extension OES_blend_subtract unavailable" << std::endl;
+#else
+ err() << "OpenGL extension EXT_blend_minmax and EXT_blend_subtract unavailable" << std::endl;
+#endif
err() << "Selecting a blend equation not possible" << std::endl;
err() << "Ensure that hardware acceleration is enabled if available" << std::endl;
@@ -652,6 +696,16 @@ void RenderTarget::applyShader(const Shader* shader)
////////////////////////////////////////////////////////////
void RenderTarget::setupDraw(bool useVertexCache, const RenderStates& states)
{
+ // Enable or disable sRGB encoding
+ // This is needed for drivers that do not check the format of the surface drawn to before applying sRGB conversion
+ if (!m_cache.enable)
+ {
+ if (isSrgb())
+ glCheck(glEnable(GL_FRAMEBUFFER_SRGB));
+ else
+ glCheck(glDisable(GL_FRAMEBUFFER_SRGB));
+ }
+
// First set the persistent OpenGL states if it's the very first call
if (!m_cache.glStatesSet)
resetGLStates();
diff --git a/src/SFML/Graphics/RenderTexture.cpp b/src/SFML/Graphics/RenderTexture.cpp
index 51abee9..95cfa55 100644
--- a/src/SFML/Graphics/RenderTexture.cpp
+++ b/src/SFML/Graphics/RenderTexture.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -58,6 +58,9 @@ bool RenderTexture::create(unsigned int width, unsigned int height, bool depthBu
////////////////////////////////////////////////////////////
bool RenderTexture::create(unsigned int width, unsigned int height, const ContextSettings& settings)
{
+ // Set texture to be in sRGB scale if requested
+ m_texture.setSrgb(settings.sRgbCapable);
+
// Create the texture
if (!m_texture.create(width, height))
{
@@ -178,6 +181,13 @@ Vector2u RenderTexture::getSize() const
////////////////////////////////////////////////////////////
+bool RenderTexture::isSrgb() const
+{
+ return m_impl->isSrgb();
+}
+
+
+////////////////////////////////////////////////////////////
const Texture& RenderTexture::getTexture() const
{
return m_texture;
diff --git a/src/SFML/Graphics/RenderTextureImpl.cpp b/src/SFML/Graphics/RenderTextureImpl.cpp
index d1e927c..0fafad7 100644
--- a/src/SFML/Graphics/RenderTextureImpl.cpp
+++ b/src/SFML/Graphics/RenderTextureImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Graphics/RenderTextureImpl.hpp b/src/SFML/Graphics/RenderTextureImpl.hpp
index 5a357c7..28429dc 100644
--- a/src/SFML/Graphics/RenderTextureImpl.hpp
+++ b/src/SFML/Graphics/RenderTextureImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -76,6 +76,17 @@ public:
virtual bool activate(bool active) = 0;
////////////////////////////////////////////////////////////
+ /// \brief Tell if the render-texture will use sRGB encoding when drawing on it
+ ///
+ /// You can request sRGB encoding for a render-texture
+ /// by having the sRgbCapable flag set for the context parameter of create() method
+ ///
+ /// \return True if the render-texture use sRGB encoding, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool isSrgb() const = 0;
+
+ ////////////////////////////////////////////////////////////
/// \brief Update the pixels of the target texture
///
/// \param textureId OpenGL identifier of the target texture
diff --git a/src/SFML/Graphics/RenderTextureImplDefault.cpp b/src/SFML/Graphics/RenderTextureImplDefault.cpp
index 29399d5..ed803d0 100644
--- a/src/SFML/Graphics/RenderTextureImplDefault.cpp
+++ b/src/SFML/Graphics/RenderTextureImplDefault.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,7 +29,6 @@
#include <SFML/Graphics/GLCheck.hpp>
#include <SFML/Graphics/TextureSaver.hpp>
#include <SFML/Window/Context.hpp>
-#include <SFML/System/Err.hpp>
namespace sf
@@ -86,6 +85,13 @@ bool RenderTextureImplDefault::activate(bool active)
////////////////////////////////////////////////////////////
+bool RenderTextureImplDefault::isSrgb() const
+{
+ return m_context->getSettings().sRgbCapable;
+}
+
+
+////////////////////////////////////////////////////////////
void RenderTextureImplDefault::updateTexture(unsigned int textureId)
{
// Make sure that the current texture binding will be preserved
@@ -93,7 +99,7 @@ void RenderTextureImplDefault::updateTexture(unsigned int textureId)
// Copy the rendered pixels to the texture
glCheck(glBindTexture(GL_TEXTURE_2D, textureId));
- glCheck(glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height));
+ glCheck(glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, static_cast<GLsizei>(m_width), static_cast<GLsizei>(m_height)));
}
} // namespace priv
diff --git a/src/SFML/Graphics/RenderTextureImplDefault.hpp b/src/SFML/Graphics/RenderTextureImplDefault.hpp
index c3b59ae..3277ce2 100644
--- a/src/SFML/Graphics/RenderTextureImplDefault.hpp
+++ b/src/SFML/Graphics/RenderTextureImplDefault.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -92,6 +92,17 @@ private:
virtual bool activate(bool active);
////////////////////////////////////////////////////////////
+ /// \brief Tell if the render-texture will use sRGB encoding when drawing on it
+ ///
+ /// You can request sRGB encoding for a render-texture
+ /// by having the sRgbCapable flag set for the context parameter of create() method
+ ///
+ /// \return True if the render-texture use sRGB encoding, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool isSrgb() const;
+
+ ////////////////////////////////////////////////////////////
/// \brief Update the pixels of the target texture
///
/// \param textureId OpenGL identifier of the target texture
@@ -102,9 +113,9 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Context* m_context; ///< P-Buffer based context
- unsigned int m_width; ///< Width of the P-Buffer
- unsigned int m_height; ///< Height of the P-Buffer
+ Context* m_context; //!< P-Buffer based context
+ unsigned int m_width; //!< Width of the P-Buffer
+ unsigned int m_height; //!< Height of the P-Buffer
};
} // namespace priv
diff --git a/src/SFML/Graphics/RenderTextureImplFBO.cpp b/src/SFML/Graphics/RenderTextureImplFBO.cpp
index c0debd7..295577b 100644
--- a/src/SFML/Graphics/RenderTextureImplFBO.cpp
+++ b/src/SFML/Graphics/RenderTextureImplFBO.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -77,7 +77,7 @@ namespace
}
// Callback that is called every time a context is destroyed
- void contextDestroyCallback(void* arg)
+ void contextDestroyCallback(void* /*arg*/)
{
sf::Lock lock(mutex);
@@ -90,7 +90,7 @@ namespace
{
if (iter->first == contextId)
{
- GLuint frameBuffer = static_cast<GLuint>(iter->second);
+ GLuint frameBuffer = iter->second;
glCheck(GLEXT_glDeleteFramebuffers(1, &frameBuffer));
// Erase the entry from the RenderTextureImplFBO's map
@@ -120,7 +120,8 @@ m_height (0),
m_context (NULL),
m_textureId (0),
m_multisample (false),
-m_stencil (false)
+m_stencil (false),
+m_sRgb (false)
{
Lock lock(mutex);
@@ -147,14 +148,14 @@ RenderTextureImplFBO::~RenderTextureImplFBO()
// Destroy the color buffer
if (m_colorBuffer)
{
- GLuint colorBuffer = static_cast<GLuint>(m_colorBuffer);
+ GLuint colorBuffer = m_colorBuffer;
glCheck(GLEXT_glDeleteRenderbuffers(1, &colorBuffer));
}
// Destroy the depth/stencil buffer
if (m_depthStencilBuffer)
{
- GLuint depthStencilBuffer = static_cast<GLuint>(m_depthStencilBuffer);
+ GLuint depthStencilBuffer = m_depthStencilBuffer;
glCheck(GLEXT_glDeleteRenderbuffers(1, &depthStencilBuffer));
}
@@ -228,6 +229,8 @@ bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, unsig
if (settings.stencilBits && !GLEXT_packed_depth_stencil)
return false;
+ m_sRgb = settings.sRgbCapable && GL_EXT_texture_sRGB;
+
#ifndef SFML_OPENGL_ES
// Check if the requested anti-aliasing level is supported
@@ -257,14 +260,14 @@ bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, unsig
GLuint depthStencil = 0;
glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil));
- m_depthStencilBuffer = static_cast<unsigned int>(depthStencil);
+ m_depthStencilBuffer = depthStencil;
if (!m_depthStencilBuffer)
{
err() << "Impossible to create render texture (failed to create the attached depth/stencil buffer)" << std::endl;
return false;
}
glCheck(GLEXT_glBindRenderbuffer(GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer));
- glCheck(GLEXT_glRenderbufferStorage(GLEXT_GL_RENDERBUFFER, GLEXT_GL_DEPTH24_STENCIL8, width, height));
+ glCheck(GLEXT_glRenderbufferStorage(GLEXT_GL_RENDERBUFFER, GLEXT_GL_DEPTH24_STENCIL8, static_cast<GLsizei>(width), static_cast<GLsizei>(height)));
#else
@@ -280,14 +283,14 @@ bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, unsig
{
GLuint depthStencil = 0;
glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil));
- m_depthStencilBuffer = static_cast<unsigned int>(depthStencil);
+ m_depthStencilBuffer = depthStencil;
if (!m_depthStencilBuffer)
{
err() << "Impossible to create render texture (failed to create the attached depth buffer)" << std::endl;
return false;
}
glCheck(GLEXT_glBindRenderbuffer(GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer));
- glCheck(GLEXT_glRenderbufferStorage(GLEXT_GL_RENDERBUFFER, GLEXT_GL_DEPTH_COMPONENT, width, height));
+ glCheck(GLEXT_glRenderbufferStorage(GLEXT_GL_RENDERBUFFER, GLEXT_GL_DEPTH_COMPONENT, static_cast<GLsizei>(width), static_cast<GLsizei>(height)));
}
}
else
@@ -298,28 +301,28 @@ bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, unsig
// Create the multisample color buffer
GLuint color = 0;
glCheck(GLEXT_glGenRenderbuffers(1, &color));
- m_colorBuffer = static_cast<unsigned int>(color);
+ m_colorBuffer = color;
if (!m_colorBuffer)
{
err() << "Impossible to create render texture (failed to create the attached multisample color buffer)" << std::endl;
return false;
}
glCheck(GLEXT_glBindRenderbuffer(GLEXT_GL_RENDERBUFFER, m_colorBuffer));
- glCheck(GLEXT_glRenderbufferStorageMultisample(GLEXT_GL_RENDERBUFFER, settings.antialiasingLevel, GL_RGBA, width, height));
+ glCheck(GLEXT_glRenderbufferStorageMultisample(GLEXT_GL_RENDERBUFFER, static_cast<GLsizei>(settings.antialiasingLevel), m_sRgb ? GL_SRGB8_ALPHA8_EXT : GL_RGBA, static_cast<GLsizei>(width), static_cast<GLsizei>(height)));
// Create the multisample depth/stencil buffer if requested
if (settings.stencilBits)
{
GLuint depthStencil = 0;
glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil));
- m_depthStencilBuffer = static_cast<unsigned int>(depthStencil);
+ m_depthStencilBuffer = depthStencil;
if (!m_depthStencilBuffer)
{
err() << "Impossible to create render texture (failed to create the attached multisample depth/stencil buffer)" << std::endl;
return false;
}
glCheck(GLEXT_glBindRenderbuffer(GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer));
- glCheck(GLEXT_glRenderbufferStorageMultisample(GLEXT_GL_RENDERBUFFER, settings.antialiasingLevel, GLEXT_GL_DEPTH24_STENCIL8, width, height));
+ glCheck(GLEXT_glRenderbufferStorageMultisample(GLEXT_GL_RENDERBUFFER, static_cast<GLsizei>(settings.antialiasingLevel), GLEXT_GL_DEPTH24_STENCIL8, static_cast<GLsizei>(width), static_cast<GLsizei>(height)));
m_stencil = true;
}
@@ -327,14 +330,14 @@ bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, unsig
{
GLuint depthStencil = 0;
glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil));
- m_depthStencilBuffer = static_cast<unsigned int>(depthStencil);
+ m_depthStencilBuffer = depthStencil;
if (!m_depthStencilBuffer)
{
err() << "Impossible to create render texture (failed to create the attached multisample depth buffer)" << std::endl;
return false;
}
glCheck(GLEXT_glBindRenderbuffer(GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer));
- glCheck(GLEXT_glRenderbufferStorageMultisample(GLEXT_GL_RENDERBUFFER, settings.antialiasingLevel, GLEXT_GL_DEPTH_COMPONENT, width, height));
+ glCheck(GLEXT_glRenderbufferStorageMultisample(GLEXT_GL_RENDERBUFFER, static_cast<GLsizei>(settings.antialiasingLevel), GLEXT_GL_DEPTH_COMPONENT, static_cast<GLsizei>(width), static_cast<GLsizei>(height)));
}
#else
@@ -368,8 +371,8 @@ bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, unsig
if (createFrameBuffer())
{
// Restore previously bound framebuffers
- glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_READ_FRAMEBUFFER, readFramebuffer));
- glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, drawFramebuffer));
+ glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_READ_FRAMEBUFFER, static_cast<GLuint>(readFramebuffer)));
+ glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, static_cast<GLuint>(drawFramebuffer)));
return true;
}
@@ -384,7 +387,7 @@ bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, unsig
if (createFrameBuffer())
{
// Restore previously bound framebuffer
- glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, frameBuffer));
+ glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, static_cast<GLuint>(frameBuffer)));
return true;
}
@@ -443,7 +446,7 @@ bool RenderTextureImplFBO::createFrameBuffer()
Lock lock(mutex);
// Insert the FBO into our map
- m_frameBuffers.insert(std::make_pair(Context::getActiveContextId(), static_cast<unsigned int>(frameBuffer)));
+ m_frameBuffers.insert(std::make_pair(Context::getActiveContextId(), frameBuffer));
}
#ifndef SFML_OPENGL_ES
@@ -490,7 +493,7 @@ bool RenderTextureImplFBO::createFrameBuffer()
Lock lock(mutex);
// Insert the FBO into our map
- m_multisampleFrameBuffers.insert(std::make_pair(Context::getActiveContextId(), static_cast<unsigned int>(multisampleFrameBuffer)));
+ m_multisampleFrameBuffers.insert(std::make_pair(Context::getActiveContextId(), multisampleFrameBuffer));
}
}
@@ -568,6 +571,13 @@ bool RenderTextureImplFBO::activate(bool active)
////////////////////////////////////////////////////////////
+bool RenderTextureImplFBO::isSrgb() const
+{
+ return m_sRgb;
+}
+
+
+////////////////////////////////////////////////////////////
void RenderTextureImplFBO::updateTexture(unsigned int)
{
// If multisampling is enabled, we need to resolve by blitting
@@ -591,7 +601,7 @@ void RenderTextureImplFBO::updateTexture(unsigned int)
{
// Set up the blit target (draw framebuffer) and blit (from the read framebuffer, our multisample FBO)
glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, iter->second));
- glCheck(GLEXT_glBlitFramebuffer(0, 0, m_width, m_height, 0, 0, m_width, m_height, GL_COLOR_BUFFER_BIT, GL_NEAREST));
+ glCheck(GLEXT_glBlitFramebuffer(0, 0, static_cast<GLint>(m_width), static_cast<GLint>(m_height), 0, 0, static_cast<GLint>(m_width), static_cast<GLint>(m_height), GL_COLOR_BUFFER_BIT, GL_NEAREST));
glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, multisampleIter->second));
}
}
diff --git a/src/SFML/Graphics/RenderTextureImplFBO.hpp b/src/SFML/Graphics/RenderTextureImplFBO.hpp
index f83074e..b313a66 100644
--- a/src/SFML/Graphics/RenderTextureImplFBO.hpp
+++ b/src/SFML/Graphics/RenderTextureImplFBO.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -115,6 +115,17 @@ private:
virtual bool activate(bool active);
////////////////////////////////////////////////////////////
+ /// \brief Tell if the render-texture will use sRGB encoding when drawing on it
+ ///
+ /// You can request sRGB encoding for a render-texture
+ /// by having the sRgbCapable flag set for the context parameter of create() method
+ ///
+ /// \return True if the render-texture use sRGB encoding, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool isSrgb() const;
+
+ ////////////////////////////////////////////////////////////
/// \brief Update the pixels of the target texture
///
/// \param textureId OpenGL identifier of the target texture
@@ -125,16 +136,17 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- std::map<Uint64, unsigned int> m_frameBuffers; ///< OpenGL frame buffer objects per context
- std::map<Uint64, unsigned int> m_multisampleFrameBuffers; ///< Optional per-context OpenGL frame buffer objects with multisample attachments
- unsigned int m_depthStencilBuffer; ///< Optional depth/stencil buffer attached to the frame buffer
- unsigned int m_colorBuffer; ///< Optional multisample color buffer attached to the frame buffer
- unsigned int m_width; ///< Width of the attachments
- unsigned int m_height; ///< Height of the attachments
- Context* m_context; ///< Backup OpenGL context, used when none already exist
- unsigned int m_textureId; ///< The ID of the texture to attach to the FBO
- bool m_multisample; ///< Whether we have to create a multisample frame buffer as well
- bool m_stencil; ///< Whether we have stencil attachment
+ std::map<Uint64, unsigned int> m_frameBuffers; //!< OpenGL frame buffer objects per context
+ std::map<Uint64, unsigned int> m_multisampleFrameBuffers; //!< Optional per-context OpenGL frame buffer objects with multisample attachments
+ unsigned int m_depthStencilBuffer; //!< Optional depth/stencil buffer attached to the frame buffer
+ unsigned int m_colorBuffer; //!< Optional multisample color buffer attached to the frame buffer
+ unsigned int m_width; //!< Width of the attachments
+ unsigned int m_height; //!< Height of the attachments
+ Context* m_context; //!< Backup OpenGL context, used when none already exist
+ unsigned int m_textureId; //!< The ID of the texture to attach to the FBO
+ bool m_multisample; //!< Whether we have to create a multisample frame buffer as well
+ bool m_stencil; //!< Whether we have stencil attachment
+ bool m_sRgb; //!< Whether we need to encode drawn pixels into sRGB color space
};
} // namespace priv
diff --git a/src/SFML/Graphics/RenderWindow.cpp b/src/SFML/Graphics/RenderWindow.cpp
index 446e906..68d1458 100644
--- a/src/SFML/Graphics/RenderWindow.cpp
+++ b/src/SFML/Graphics/RenderWindow.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -34,25 +34,28 @@
namespace sf
{
////////////////////////////////////////////////////////////
-RenderWindow::RenderWindow()
+RenderWindow::RenderWindow() :
+m_defaultFrameBuffer(0)
{
// Nothing to do
}
////////////////////////////////////////////////////////////
-RenderWindow::RenderWindow(VideoMode mode, const String& title, Uint32 style, const ContextSettings& settings)
+RenderWindow::RenderWindow(VideoMode mode, const String& title, Uint32 style, const ContextSettings& settings) :
+m_defaultFrameBuffer(0)
{
// Don't call the base class constructor because it contains virtual function calls
- create(mode, title, style, settings);
+ Window::create(mode, title, style, settings);
}
////////////////////////////////////////////////////////////
-RenderWindow::RenderWindow(WindowHandle handle, const ContextSettings& settings)
+RenderWindow::RenderWindow(WindowHandle handle, const ContextSettings& settings) :
+m_defaultFrameBuffer(0)
{
// Don't call the base class constructor because it contains virtual function calls
- create(handle, settings);
+ Window::create(handle, settings);
}
@@ -71,6 +74,13 @@ Vector2u RenderWindow::getSize() const
////////////////////////////////////////////////////////////
+bool RenderWindow::isSrgb() const
+{
+ return getSettings().sRgbCapable;
+}
+
+
+////////////////////////////////////////////////////////////
bool RenderWindow::setActive(bool active)
{
bool result = Window::setActive(active);
@@ -83,7 +93,7 @@ bool RenderWindow::setActive(bool active)
// try to draw to the default framebuffer of the RenderWindow
if (active && result && priv::RenderTextureImplFBO::isAvailable())
{
- priv::RenderTextureImplFBO::unbind();
+ glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, m_defaultFrameBuffer));
return true;
}
@@ -108,6 +118,13 @@ Image RenderWindow::capture() const
////////////////////////////////////////////////////////////
void RenderWindow::onCreate()
{
+ if (priv::RenderTextureImplFBO::isAvailable())
+ {
+ // Retrieve the framebuffer ID we have to bind when targeting the window for rendering
+ // We assume that this window's context is still active at this point
+ glCheck(glGetIntegerv(GLEXT_GL_FRAMEBUFFER_BINDING, reinterpret_cast<GLint*>(&m_defaultFrameBuffer)));
+ }
+
// Just initialize the render target part
RenderTarget::initialize();
}
diff --git a/src/SFML/Graphics/Shader.cpp b/src/SFML/Graphics/Shader.cpp
index 353a72d..741dc01 100644
--- a/src/SFML/Graphics/Shader.cpp
+++ b/src/SFML/Graphics/Shader.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -68,14 +68,14 @@ namespace
}
// Retrieve the maximum number of texture units available
- GLint getMaxTextureUnits()
+ std::size_t getMaxTextureUnits()
{
// TODO: Remove this lock when it becomes unnecessary in C++11
sf::Lock lock(maxTextureUnitsMutex);
static GLint maxUnits = checkMaxTextureUnits();
- return maxUnits;
+ return static_cast<std::size_t>(maxUnits);
}
// Read the contents of a file into an array of char
@@ -85,12 +85,12 @@ namespace
if (file)
{
file.seekg(0, std::ios_base::end);
- std::streamsize size = file.tellg();
+ std::ifstream::pos_type size = file.tellg();
if (size > 0)
{
file.seekg(0, std::ios_base::beg);
buffer.resize(static_cast<std::size_t>(size));
- file.read(&buffer[0], size);
+ file.read(&buffer[0], static_cast<std::streamsize>(size));
}
buffer.push_back('\0');
return true;
@@ -211,10 +211,10 @@ struct Shader::UniformBinder : private NonCopyable
glCheck(GLEXT_glUseProgramObject(savedProgram));
}
- TransientContextLock lock; ///< Lock to keep context active while uniform is bound
- GLEXT_GLhandle savedProgram; ///< Handle to the previously active program object
- GLEXT_GLhandle currentProgram; ///< Handle to the program object of the modified sf::Shader instance
- GLint location; ///< Uniform location, used by the surrounding sf::Shader code
+ TransientContextLock lock; //!< Lock to keep context active while uniform is bound
+ GLEXT_GLhandle savedProgram; //!< Handle to the previously active program object
+ GLEXT_GLhandle currentProgram; //!< Handle to the program object of the modified sf::Shader instance
+ GLint location; //!< Uniform location, used by the surrounding sf::Shader code
};
@@ -556,8 +556,7 @@ void Shader::setUniform(const std::string& name, const Texture& texture)
if (it == m_textures.end())
{
// New entry, make sure there are enough texture units
- GLint maxUnits = getMaxTextureUnits();
- if (m_textures.size() + 1 >= static_cast<std::size_t>(maxUnits))
+ if (m_textures.size() + 1 >= getMaxTextureUnits())
{
err() << "Impossible to use texture \"" << name << "\" for shader: all available texture units are used" << std::endl;
return;
@@ -815,7 +814,7 @@ bool Shader::isGeometryAvailable()
// Make sure that extensions are initialized
sf::priv::ensureExtensionsInit();
- available = isAvailable() && GLEXT_geometry_shader4;
+ available = isAvailable() && (GLEXT_geometry_shader4 || GLEXT_GL_VERSION_3_2);
}
return available;
@@ -976,7 +975,7 @@ void Shader::bindTextures() const
{
GLint index = static_cast<GLsizei>(i + 1);
glCheck(GLEXT_glUniform1i(it->first, index));
- glCheck(GLEXT_glActiveTexture(GLEXT_GL_TEXTURE0 + index));
+ glCheck(GLEXT_glActiveTexture(GLEXT_GL_TEXTURE0 + static_cast<GLenum>(index)));
Texture::bind(it->second);
++it;
}
@@ -1036,256 +1035,256 @@ Shader::~Shader()
////////////////////////////////////////////////////////////
-bool Shader::loadFromFile(const std::string& filename, Type type)
+bool Shader::loadFromFile(const std::string& /* filename */, Type /* type */)
{
return false;
}
////////////////////////////////////////////////////////////
-bool Shader::loadFromFile(const std::string& vertexShaderFilename, const std::string& fragmentShaderFilename)
+bool Shader::loadFromFile(const std::string& /* vertexShaderFilename */, const std::string& /* fragmentShaderFilename */)
{
return false;
}
////////////////////////////////////////////////////////////
-bool Shader::loadFromFile(const std::string& vertexShaderFilename, const std::string& geometryShaderFilename, const std::string& fragmentShaderFilename)
+bool Shader::loadFromFile(const std::string& /* vertexShaderFilename */, const std::string& /* geometryShaderFilename */, const std::string& /* fragmentShaderFilename */)
{
return false;
}
////////////////////////////////////////////////////////////
-bool Shader::loadFromMemory(const std::string& shader, Type type)
+bool Shader::loadFromMemory(const std::string& /* shader */, Type /* type */)
{
return false;
}
////////////////////////////////////////////////////////////
-bool Shader::loadFromMemory(const std::string& vertexShader, const std::string& fragmentShader)
+bool Shader::loadFromMemory(const std::string& /* vertexShader */, const std::string& /* fragmentShader */)
{
return false;
}
////////////////////////////////////////////////////////////
-bool Shader::loadFromMemory(const std::string& vertexShader, const std::string& geometryShader, const std::string& fragmentShader)
+bool Shader::loadFromMemory(const std::string& /* vertexShader */, const std::string& /* geometryShader */, const std::string& /* fragmentShader */)
{
return false;
}
////////////////////////////////////////////////////////////
-bool Shader::loadFromStream(InputStream& stream, Type type)
+bool Shader::loadFromStream(InputStream& /* stream */, Type /* type */)
{
return false;
}
////////////////////////////////////////////////////////////
-bool Shader::loadFromStream(InputStream& vertexShaderStream, InputStream& fragmentShaderStream)
+bool Shader::loadFromStream(InputStream& /* vertexShaderStream */, InputStream& /* fragmentShaderStream */)
{
return false;
}
////////////////////////////////////////////////////////////
-bool Shader::loadFromStream(InputStream& vertexShaderStream, InputStream& geometryShaderStream, InputStream& fragmentShaderStream)
+bool Shader::loadFromStream(InputStream& /* vertexShaderStream */, InputStream& /* geometryShaderStream */, InputStream& /* fragmentShaderStream */)
{
return false;
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, float x)
+void Shader::setUniform(const std::string& /* name */, float)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Glsl::Vec2& v)
+void Shader::setUniform(const std::string& /* name */, const Glsl::Vec2&)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Glsl::Vec3& v)
+void Shader::setUniform(const std::string& /* name */, const Glsl::Vec3&)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Glsl::Vec4& v)
+void Shader::setUniform(const std::string& /* name */, const Glsl::Vec4&)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, int x)
+void Shader::setUniform(const std::string& /* name */, int)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Glsl::Ivec2& v)
+void Shader::setUniform(const std::string& /* name */, const Glsl::Ivec2&)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Glsl::Ivec3& v)
+void Shader::setUniform(const std::string& /* name */, const Glsl::Ivec3&)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Glsl::Ivec4& v)
+void Shader::setUniform(const std::string& /* name */, const Glsl::Ivec4&)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, bool x)
+void Shader::setUniform(const std::string& /* name */, bool)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Glsl::Bvec2& v)
+void Shader::setUniform(const std::string& /* name */, const Glsl::Bvec2&)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Glsl::Bvec3& v)
+void Shader::setUniform(const std::string& /* name */, const Glsl::Bvec3&)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Glsl::Bvec4& v)
+void Shader::setUniform(const std::string& /* name */, const Glsl::Bvec4&)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Glsl::Mat3& matrix)
+void Shader::setUniform(const std::string& /* name */, const Glsl::Mat3& /* matrix */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Glsl::Mat4& matrix)
+void Shader::setUniform(const std::string& /* name */, const Glsl::Mat4& /* matrix */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, const Texture& texture)
+void Shader::setUniform(const std::string& /* name */, const Texture& /* texture */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniform(const std::string& name, CurrentTextureType)
+void Shader::setUniform(const std::string& /* name */, CurrentTextureType)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniformArray(const std::string& name, const float* scalarArray, std::size_t length)
+void Shader::setUniformArray(const std::string& /* name */, const float* /* scalarArray */, std::size_t /* length */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniformArray(const std::string& name, const Glsl::Vec2* vectorArray, std::size_t length)
+void Shader::setUniformArray(const std::string& /* name */, const Glsl::Vec2* /* vectorArray */, std::size_t /* length */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniformArray(const std::string& name, const Glsl::Vec3* vectorArray, std::size_t length)
+void Shader::setUniformArray(const std::string& /* name */, const Glsl::Vec3* /* vectorArray */, std::size_t /* length */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniformArray(const std::string& name, const Glsl::Vec4* vectorArray, std::size_t length)
+void Shader::setUniformArray(const std::string& /* name */, const Glsl::Vec4* /* vectorArray */, std::size_t /* length */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniformArray(const std::string& name, const Glsl::Mat3* matrixArray, std::size_t length)
+void Shader::setUniformArray(const std::string& /* name */, const Glsl::Mat3* /* matrixArray */, std::size_t /* length */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setUniformArray(const std::string& name, const Glsl::Mat4* matrixArray, std::size_t length)
+void Shader::setUniformArray(const std::string& /* name */, const Glsl::Mat4* /* matrixArray */, std::size_t /* length */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setParameter(const std::string& name, float x)
+void Shader::setParameter(const std::string& /* name */, float)
{
}
////////////////////////////////////////////////////////////
-void Shader::setParameter(const std::string& name, float x, float y)
+void Shader::setParameter(const std::string& /* name */, float, float)
{
}
////////////////////////////////////////////////////////////
-void Shader::setParameter(const std::string& name, float x, float y, float z)
+void Shader::setParameter(const std::string& /* name */, float, float, float)
{
}
////////////////////////////////////////////////////////////
-void Shader::setParameter(const std::string& name, float x, float y, float z, float w)
+void Shader::setParameter(const std::string& /* name */, float, float, float, float)
{
}
////////////////////////////////////////////////////////////
-void Shader::setParameter(const std::string& name, const Vector2f& v)
+void Shader::setParameter(const std::string& /* name */, const Vector2f&)
{
}
////////////////////////////////////////////////////////////
-void Shader::setParameter(const std::string& name, const Vector3f& v)
+void Shader::setParameter(const std::string& /* name */, const Vector3f&)
{
}
////////////////////////////////////////////////////////////
-void Shader::setParameter(const std::string& name, const Color& color)
+void Shader::setParameter(const std::string& /* name */, const Color& /* color */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setParameter(const std::string& name, const Transform& transform)
+void Shader::setParameter(const std::string& /* name */, const Transform& /* transform */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setParameter(const std::string& name, const Texture& texture)
+void Shader::setParameter(const std::string& /* name */, const Texture& /* texture */)
{
}
////////////////////////////////////////////////////////////
-void Shader::setParameter(const std::string& name, CurrentTextureType)
+void Shader::setParameter(const std::string& /* name */, CurrentTextureType)
{
}
@@ -1298,7 +1297,7 @@ unsigned int Shader::getNativeHandle() const
////////////////////////////////////////////////////////////
-void Shader::bind(const Shader* shader)
+void Shader::bind(const Shader* /* shader */)
{
}
@@ -1318,7 +1317,7 @@ bool Shader::isGeometryAvailable()
////////////////////////////////////////////////////////////
-bool Shader::compile(const char* vertexShaderCode, const char* geometryShaderCode, const char* fragmentShaderCode)
+bool Shader::compile(const char* /* vertexShaderCode */, const char* /* geometryShaderCode */, const char* /* fragmentShaderCode */)
{
return false;
}
diff --git a/src/SFML/Graphics/Shape.cpp b/src/SFML/Graphics/Shape.cpp
index 545b6fa..5a37660 100644
--- a/src/SFML/Graphics/Shape.cpp
+++ b/src/SFML/Graphics/Shape.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -28,7 +28,6 @@
#include <SFML/Graphics/Shape.hpp>
#include <SFML/Graphics/RenderTarget.hpp>
#include <SFML/Graphics/Texture.hpp>
-#include <SFML/System/Err.hpp>
#include <cmath>
@@ -67,7 +66,7 @@ void Shape::setTexture(const Texture* texture, bool resetRect)
{
// Recompute the texture area if requested, or if there was no texture & rect before
if (resetRect || (!m_texture && (m_textureRect == IntRect())))
- setTextureRect(IntRect(0, 0, texture->getSize().x, texture->getSize().y));
+ setTextureRect(IntRect(0, 0, static_cast<int>(texture->getSize().x), static_cast<int>(texture->getSize().y)));
}
// Assign the new texture
@@ -238,12 +237,14 @@ void Shape::updateFillColors()
////////////////////////////////////////////////////////////
void Shape::updateTexCoords()
{
+ FloatRect convertedTextureRect = FloatRect(m_textureRect);
+
for (std::size_t i = 0; i < m_vertices.getVertexCount(); ++i)
{
float xratio = m_insideBounds.width > 0 ? (m_vertices[i].position.x - m_insideBounds.left) / m_insideBounds.width : 0;
float yratio = m_insideBounds.height > 0 ? (m_vertices[i].position.y - m_insideBounds.top) / m_insideBounds.height : 0;
- m_vertices[i].texCoords.x = m_textureRect.left + m_textureRect.width * xratio;
- m_vertices[i].texCoords.y = m_textureRect.top + m_textureRect.height * yratio;
+ m_vertices[i].texCoords.x = convertedTextureRect.left + convertedTextureRect.width * xratio;
+ m_vertices[i].texCoords.y = convertedTextureRect.top + convertedTextureRect.height * yratio;
}
}
diff --git a/src/SFML/Graphics/Sprite.cpp b/src/SFML/Graphics/Sprite.cpp
index feb79a4..dcb9639 100644
--- a/src/SFML/Graphics/Sprite.cpp
+++ b/src/SFML/Graphics/Sprite.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -46,7 +46,7 @@ Sprite::Sprite(const Texture& texture) :
m_texture (NULL),
m_textureRect()
{
- setTexture(texture);
+ setTexture(texture, true);
}
@@ -55,8 +55,10 @@ Sprite::Sprite(const Texture& texture, const IntRect& rectangle) :
m_texture (NULL),
m_textureRect()
{
- setTexture(texture);
+ // Compute the texture area
setTextureRect(rectangle);
+ // Assign texture
+ setTexture(texture, false);
}
@@ -65,7 +67,10 @@ void Sprite::setTexture(const Texture& texture, bool resetRect)
{
// Recompute the texture area if requested, or if there was no valid texture & rect before
if (resetRect || (!m_texture && (m_textureRect == sf::IntRect())))
- setTextureRect(IntRect(0, 0, texture.getSize().x, texture.getSize().y));
+ {
+ Vector2i size = Vector2i(texture.getSize());
+ setTextureRect(IntRect(0, 0, size.x, size.y));
+ }
// Assign the new texture
m_texture = &texture;
@@ -160,10 +165,12 @@ void Sprite::updatePositions()
////////////////////////////////////////////////////////////
void Sprite::updateTexCoords()
{
- float left = static_cast<float>(m_textureRect.left);
- float right = left + m_textureRect.width;
- float top = static_cast<float>(m_textureRect.top);
- float bottom = top + m_textureRect.height;
+ FloatRect convertedTextureRect = FloatRect(m_textureRect);
+
+ float left = convertedTextureRect.left;
+ float right = left + convertedTextureRect.width;
+ float top = convertedTextureRect.top;
+ float bottom = top + convertedTextureRect.height;
m_vertices[0].texCoords = Vector2f(left, top);
m_vertices[1].texCoords = Vector2f(left, bottom);
diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp
index 6687551..b9494fa 100644
--- a/src/SFML/Graphics/Text.cpp
+++ b/src/SFML/Graphics/Text.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -48,7 +48,7 @@ namespace
}
// Add a glyph quad to the vertex array
- void addGlyphQuad(sf::VertexArray& vertices, sf::Vector2f position, const sf::Color& color, const sf::Glyph& glyph, float italicShear, float outlineThickness = 0)
+ void addGlyphQuad(sf::VertexArray& vertices, sf::Vector2f position, const sf::Color& color, const sf::Glyph& glyph, float italicShear)
{
float padding = 1.0;
@@ -62,12 +62,12 @@ namespace
float u2 = static_cast<float>(glyph.textureRect.left + glyph.textureRect.width) + padding;
float v2 = static_cast<float>(glyph.textureRect.top + glyph.textureRect.height) + padding;
- vertices.append(sf::Vertex(sf::Vector2f(position.x + left - italicShear * top - outlineThickness, position.y + top - outlineThickness), color, sf::Vector2f(u1, v1)));
- vertices.append(sf::Vertex(sf::Vector2f(position.x + right - italicShear * top - outlineThickness, position.y + top - outlineThickness), color, sf::Vector2f(u2, v1)));
- vertices.append(sf::Vertex(sf::Vector2f(position.x + left - italicShear * bottom - outlineThickness, position.y + bottom - outlineThickness), color, sf::Vector2f(u1, v2)));
- vertices.append(sf::Vertex(sf::Vector2f(position.x + left - italicShear * bottom - outlineThickness, position.y + bottom - outlineThickness), color, sf::Vector2f(u1, v2)));
- vertices.append(sf::Vertex(sf::Vector2f(position.x + right - italicShear * top - outlineThickness, position.y + top - outlineThickness), color, sf::Vector2f(u2, v1)));
- vertices.append(sf::Vertex(sf::Vector2f(position.x + right - italicShear * bottom - outlineThickness, position.y + bottom - outlineThickness), color, sf::Vector2f(u2, v2)));
+ vertices.append(sf::Vertex(sf::Vector2f(position.x + left - italicShear * top , position.y + top), color, sf::Vector2f(u1, v1)));
+ vertices.append(sf::Vertex(sf::Vector2f(position.x + right - italicShear * top , position.y + top), color, sf::Vector2f(u2, v1)));
+ vertices.append(sf::Vertex(sf::Vector2f(position.x + left - italicShear * bottom, position.y + bottom), color, sf::Vector2f(u1, v2)));
+ vertices.append(sf::Vertex(sf::Vector2f(position.x + left - italicShear * bottom, position.y + bottom), color, sf::Vector2f(u1, v2)));
+ vertices.append(sf::Vertex(sf::Vector2f(position.x + right - italicShear * top , position.y + top), color, sf::Vector2f(u2, v1)));
+ vertices.append(sf::Vertex(sf::Vector2f(position.x + right - italicShear * bottom, position.y + bottom), color, sf::Vector2f(u2, v2)));
}
}
@@ -332,7 +332,7 @@ Vector2f Text::findCharacterPos(std::size_t index) const
Uint32 curChar = m_string[i];
// Apply the kerning offset
- position.x += m_font->getKerning(prevChar, curChar, m_characterSize);
+ position.x += m_font->getKerning(prevChar, curChar, m_characterSize, isBold);
prevChar = curChar;
// Handle special characters
@@ -447,11 +447,11 @@ void Text::ensureGeometryUpdate() const
Uint32 curChar = m_string[i];
// Skip the \r char to avoid weird graphical issues
- if (curChar == '\r')
+ if (curChar == L'\r')
continue;
// Apply the kerning offset
- x += m_font->getKerning(prevChar, curChar, m_characterSize);
+ x += m_font->getKerning(prevChar, curChar, m_characterSize, isBold);
// If we're using the underlined style and there's a new line, draw a line
if (isUnderlined && (curChar == L'\n' && prevChar != L'\n'))
@@ -500,19 +500,8 @@ void Text::ensureGeometryUpdate() const
{
const Glyph& glyph = m_font->getGlyph(curChar, m_characterSize, isBold, m_outlineThickness);
- float left = glyph.bounds.left;
- float top = glyph.bounds.top;
- float right = glyph.bounds.left + glyph.bounds.width;
- float bottom = glyph.bounds.top + glyph.bounds.height;
-
// Add the outline glyph to the vertices
- addGlyphQuad(m_outlineVertices, Vector2f(x, y), m_outlineColor, glyph, italicShear, m_outlineThickness);
-
- // Update the current bounds with the outlined glyph bounds
- minX = std::min(minX, x + left - italicShear * bottom - m_outlineThickness);
- maxX = std::max(maxX, x + right - italicShear * top - m_outlineThickness);
- minY = std::min(minY, y + top - m_outlineThickness);
- maxY = std::max(maxY, y + bottom - m_outlineThickness);
+ addGlyphQuad(m_outlineVertices, Vector2f(x, y), m_outlineColor, glyph, italicShear);
}
// Extract the current glyph's description
@@ -521,24 +510,31 @@ void Text::ensureGeometryUpdate() const
// Add the glyph to the vertices
addGlyphQuad(m_vertices, Vector2f(x, y), m_fillColor, glyph, italicShear);
- // Update the current bounds with the non outlined glyph bounds
- if (m_outlineThickness == 0)
- {
- float left = glyph.bounds.left;
- float top = glyph.bounds.top;
- float right = glyph.bounds.left + glyph.bounds.width;
- float bottom = glyph.bounds.top + glyph.bounds.height;
-
- minX = std::min(minX, x + left - italicShear * bottom);
- maxX = std::max(maxX, x + right - italicShear * top);
- minY = std::min(minY, y + top);
- maxY = std::max(maxY, y + bottom);
- }
+ // Update the current bounds
+ float left = glyph.bounds.left;
+ float top = glyph.bounds.top;
+ float right = glyph.bounds.left + glyph.bounds.width;
+ float bottom = glyph.bounds.top + glyph.bounds.height;
+
+ minX = std::min(minX, x + left - italicShear * bottom);
+ maxX = std::max(maxX, x + right - italicShear * top);
+ minY = std::min(minY, y + top);
+ maxY = std::max(maxY, y + bottom);
// Advance to the next character
x += glyph.advance + letterSpacing;
}
+ // If we're using outline, update the current bounds
+ if (m_outlineThickness != 0)
+ {
+ float outline = std::abs(std::ceil(m_outlineThickness));
+ minX -= outline;
+ maxX += outline;
+ minY -= outline;
+ maxY += outline;
+ }
+
// If we're using the underlined style, add the last line
if (isUnderlined && (x > 0))
{
diff --git a/src/SFML/Graphics/Texture.cpp b/src/SFML/Graphics/Texture.cpp
index fd94acf..1600c3b 100644
--- a/src/SFML/Graphics/Texture.cpp
+++ b/src/SFML/Graphics/Texture.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -36,22 +36,31 @@
#include <SFML/System/Err.hpp>
#include <cassert>
#include <cstring>
+#include <climits>
+
+#if defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wduplicated-branches"
+#endif
namespace
{
- sf::Mutex idMutex;
- sf::Mutex maximumSizeMutex;
-
- // Thread-safe unique identifier generator,
- // is used for states cache (see RenderTarget)
- sf::Uint64 getUniqueId()
+ // A nested named namespace is used here to allow unity builds of SFML.
+ namespace TextureImpl
{
- sf::Lock lock(idMutex);
+ sf::Mutex idMutex;
+ sf::Mutex maximumSizeMutex;
+
+ // Thread-safe unique identifier generator,
+ // is used for states cache (see RenderTarget)
+ sf::Uint64 getUniqueId()
+ {
+ sf::Lock lock(idMutex);
- static sf::Uint64 id = 1; // start at 1, zero is "no texture"
+ static sf::Uint64 id = 1; // start at 1, zero is "no texture"
- return id++;
+ return id++;
+ }
}
}
@@ -69,7 +78,7 @@ m_isRepeated (false),
m_pixelsFlipped(false),
m_fboAttachment(false),
m_hasMipmap (false),
-m_cacheId (getUniqueId())
+m_cacheId (TextureImpl::getUniqueId())
{
}
@@ -85,17 +94,13 @@ m_isRepeated (copy.m_isRepeated),
m_pixelsFlipped(false),
m_fboAttachment(false),
m_hasMipmap (false),
-m_cacheId (getUniqueId())
+m_cacheId (TextureImpl::getUniqueId())
{
if (copy.m_texture)
{
if (create(copy.getSize().x, copy.getSize().y))
{
update(copy);
-
- // Force an OpenGL flush, so that the texture will appear updated
- // in all contexts immediately (solves problems in multi-threaded apps)
- glCheck(glFlush());
}
else
{
@@ -113,7 +118,7 @@ Texture::~Texture()
{
TransientContextLock lock;
- GLuint texture = static_cast<GLuint>(m_texture);
+ GLuint texture = m_texture;
glCheck(glDeleteTextures(1, &texture));
}
}
@@ -160,13 +165,13 @@ bool Texture::create(unsigned int width, unsigned int height)
{
GLuint texture;
glCheck(glGenTextures(1, &texture));
- m_texture = static_cast<unsigned int>(texture);
+ m_texture = texture;
}
// Make sure that the current texture binding will be preserved
priv::TextureSaver save;
- static bool textureEdgeClamp = GLEXT_texture_edge_clamp || GLEXT_EXT_texture_edge_clamp;
+ static bool textureEdgeClamp = GLEXT_texture_edge_clamp || GLEXT_GL_VERSION_1_2 || Context::isExtensionAvailable("GL_EXT_texture_edge_clamp");
if (!m_isRepeated && !textureEdgeClamp)
{
@@ -205,12 +210,12 @@ bool Texture::create(unsigned int width, unsigned int height)
// Initialize the texture
glCheck(glBindTexture(GL_TEXTURE_2D, m_texture));
- glCheck(glTexImage2D(GL_TEXTURE_2D, 0, (m_sRgb ? GLEXT_GL_SRGB8_ALPHA8 : GL_RGBA), m_actualSize.x, m_actualSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL));
+ glCheck(glTexImage2D(GL_TEXTURE_2D, 0, (m_sRgb ? GLEXT_GL_SRGB8_ALPHA8 : GL_RGBA), static_cast<GLsizei>(m_actualSize.x), static_cast<GLsizei>(m_actualSize.y), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL));
glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, m_isRepeated ? GL_REPEAT : (textureEdgeClamp ? GLEXT_GL_CLAMP_TO_EDGE : GLEXT_GL_CLAMP)));
glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, m_isRepeated ? GL_REPEAT : (textureEdgeClamp ? GLEXT_GL_CLAMP_TO_EDGE : GLEXT_GL_CLAMP)));
glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, m_isSmooth ? GL_LINEAR : GL_NEAREST));
glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_isSmooth ? GL_LINEAR : GL_NEAREST));
- m_cacheId = getUniqueId();
+ m_cacheId = TextureImpl::getUniqueId();
m_hasMipmap = false;
@@ -277,7 +282,7 @@ bool Texture::loadFromImage(const Image& image, const IntRect& area)
if (rectangle.top + rectangle.height > height) rectangle.height = height - rectangle.top;
// Create the texture and upload the pixels
- if (create(rectangle.width, rectangle.height))
+ if (create(static_cast<unsigned int>(rectangle.width), static_cast<unsigned int>(rectangle.height)))
{
TransientContextLock lock;
@@ -345,10 +350,32 @@ Image Texture::copyToImage() const
glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, frameBuffer));
glCheck(GLEXT_glFramebufferTexture2D(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_texture, 0));
- glCheck(glReadPixels(0, 0, m_size.x, m_size.y, GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0]));
+ glCheck(glReadPixels(0,
+ 0,
+ static_cast<GLsizei>(m_size.x),
+ static_cast<GLsizei>(m_size.y),
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ &pixels[0]));
glCheck(GLEXT_glDeleteFramebuffers(1, &frameBuffer));
- glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, previousFrameBuffer));
+ glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, static_cast<GLuint>(previousFrameBuffer)));
+
+ if (m_pixelsFlipped)
+ {
+ // Flip the texture vertically
+ const int stride = static_cast<int>(m_size.x * 4);
+ Uint8* currentRowPtr = pixels.data();
+ Uint8* nextRowPtr = pixels.data() + stride;
+ Uint8* reverseRowPtr = pixels.data() + (stride * static_cast<int>(m_size.y - 1));
+ for (unsigned int y = 0; y < m_size.y / 2; ++y)
+ {
+ std::swap_ranges(currentRowPtr, nextRowPtr, reverseRowPtr);
+ currentRowPtr = nextRowPtr;
+ nextRowPtr += stride;
+ reverseRowPtr -= stride;
+ }
+ }
}
#else
@@ -371,13 +398,13 @@ Image Texture::copyToImage() const
// Then we copy the useful pixels from the temporary array to the final one
const Uint8* src = &allPixels[0];
Uint8* dst = &pixels[0];
- int srcPitch = m_actualSize.x * 4;
- int dstPitch = m_size.x * 4;
+ int srcPitch = static_cast<int>(m_actualSize.x * 4);
+ unsigned int dstPitch = m_size.x * 4;
// Handle the case where source pixels are flipped vertically
if (m_pixelsFlipped)
{
- src += srcPitch * (m_size.y - 1);
+ src += static_cast<unsigned int>(srcPitch * static_cast<int>((m_size.y - 1)));
srcPitch = -srcPitch;
}
@@ -422,11 +449,11 @@ void Texture::update(const Uint8* pixels, unsigned int width, unsigned int heigh
// Copy pixels from the given array to the texture
glCheck(glBindTexture(GL_TEXTURE_2D, m_texture));
- glCheck(glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels));
+ glCheck(glTexSubImage2D(GL_TEXTURE_2D, 0, static_cast<GLint>(x), static_cast<GLint>(y), static_cast<GLsizei>(width), static_cast<GLsizei>(height), GL_RGBA, GL_UNSIGNED_BYTE, pixels));
glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_isSmooth ? GL_LINEAR : GL_NEAREST));
m_hasMipmap = false;
m_pixelsFlipped = false;
- m_cacheId = getUniqueId();
+ m_cacheId = TextureImpl::getUniqueId();
// Force an OpenGL flush, so that the texture data will appear updated
// in all contexts immediately (solves problems in multi-threaded apps)
@@ -503,8 +530,8 @@ void Texture::update(const Texture& texture, unsigned int x, unsigned int y)
{
// Blit the texture contents from the source to the destination texture
glCheck(GLEXT_glBlitFramebuffer(
- 0, texture.m_pixelsFlipped ? texture.m_size.y : 0, texture.m_size.x, texture.m_pixelsFlipped ? 0 : texture.m_size.y, // Source rectangle, flip y if source is flipped
- x, y, x + texture.m_size.x, y + texture.m_size.y, // Destination rectangle
+ 0, texture.m_pixelsFlipped ? static_cast<GLint>(texture.m_size.y) : 0, static_cast<GLint>(texture.m_size.x), texture.m_pixelsFlipped ? 0 : static_cast<GLint>(texture.m_size.y), // Source rectangle, flip y if source is flipped
+ static_cast<GLint>(x), static_cast<GLint>(y), static_cast<GLint>(x + texture.m_size.x), static_cast<GLint>(y + texture.m_size.y), // Destination rectangle
GL_COLOR_BUFFER_BIT, GL_NEAREST
));
}
@@ -514,8 +541,8 @@ void Texture::update(const Texture& texture, unsigned int x, unsigned int y)
}
// Restore previously bound framebuffers
- glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_READ_FRAMEBUFFER, readFramebuffer));
- glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, drawFramebuffer));
+ glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_READ_FRAMEBUFFER, static_cast<GLuint>(readFramebuffer)));
+ glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, static_cast<GLuint>(drawFramebuffer)));
// Delete the framebuffers
glCheck(GLEXT_glDeleteFramebuffers(1, &sourceFrameBuffer));
@@ -529,7 +556,7 @@ void Texture::update(const Texture& texture, unsigned int x, unsigned int y)
glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_isSmooth ? GL_LINEAR : GL_NEAREST));
m_hasMipmap = false;
m_pixelsFlipped = false;
- m_cacheId = getUniqueId();
+ m_cacheId = TextureImpl::getUniqueId();
// Force an OpenGL flush, so that the texture data will appear updated
// in all contexts immediately (solves problems in multi-threaded apps)
@@ -581,11 +608,11 @@ void Texture::update(const Window& window, unsigned int x, unsigned int y)
// Copy pixels from the back-buffer to the texture
glCheck(glBindTexture(GL_TEXTURE_2D, m_texture));
- glCheck(glCopyTexSubImage2D(GL_TEXTURE_2D, 0, x, y, 0, 0, window.getSize().x, window.getSize().y));
+ glCheck(glCopyTexSubImage2D(GL_TEXTURE_2D, 0, static_cast<GLint>(x), static_cast<GLint>(y), 0, 0, static_cast<GLsizei>(window.getSize().x), static_cast<GLsizei>(window.getSize().y)));
glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_isSmooth ? GL_LINEAR : GL_NEAREST));
m_hasMipmap = false;
m_pixelsFlipped = true;
- m_cacheId = getUniqueId();
+ m_cacheId = TextureImpl::getUniqueId();
// Force an OpenGL flush, so that the texture will appear updated
// in all contexts immediately (solves problems in multi-threaded apps)
@@ -659,7 +686,7 @@ void Texture::setRepeated(bool repeated)
// Make sure that the current texture binding will be preserved
priv::TextureSaver save;
- static bool textureEdgeClamp = GLEXT_texture_edge_clamp || GLEXT_EXT_texture_edge_clamp;
+ static bool textureEdgeClamp = GLEXT_texture_edge_clamp;
if (!m_isRepeated && !textureEdgeClamp)
{
@@ -757,15 +784,15 @@ void Texture::bind(const Texture* texture, CoordinateType coordinateType)
// setup scale factors that convert the range [0 .. size] to [0 .. 1]
if (coordinateType == Pixels)
{
- matrix[0] = 1.f / texture->m_actualSize.x;
- matrix[5] = 1.f / texture->m_actualSize.y;
+ matrix[0] = 1.f / static_cast<float>(texture->m_actualSize.x);
+ matrix[5] = 1.f / static_cast<float>(texture->m_actualSize.y);
}
// If pixels are flipped we must invert the Y axis
if (texture->m_pixelsFlipped)
{
matrix[5] = -matrix[5];
- matrix[13] = static_cast<float>(texture->m_size.y) / texture->m_actualSize.y;
+ matrix[13] = static_cast<float>(texture->m_size.y) / static_cast<float>(texture->m_actualSize.y);
}
// Load the matrix
@@ -794,7 +821,7 @@ void Texture::bind(const Texture* texture, CoordinateType coordinateType)
////////////////////////////////////////////////////////////
unsigned int Texture::getMaximumSize()
{
- Lock lock(maximumSizeMutex);
+ Lock lock(TextureImpl::maximumSizeMutex);
static bool checked = false;
static GLint size = 0;
@@ -803,7 +830,10 @@ unsigned int Texture::getMaximumSize()
{
checked = true;
- TransientContextLock lock;
+ TransientContextLock transientLock;
+
+ // Make sure that extensions are initialized
+ sf::priv::ensureExtensionsInit();
glCheck(glGetIntegerv(GL_MAX_TEXTURE_SIZE, &size));
}
@@ -836,8 +866,8 @@ void Texture::swap(Texture& right)
std::swap(m_fboAttachment, right.m_fboAttachment);
std::swap(m_hasMipmap, right.m_hasMipmap);
- m_cacheId = getUniqueId();
- right.m_cacheId = getUniqueId();
+ m_cacheId = TextureImpl::getUniqueId();
+ right.m_cacheId = TextureImpl::getUniqueId();
}
diff --git a/src/SFML/Graphics/TextureSaver.cpp b/src/SFML/Graphics/TextureSaver.cpp
index 2b7d8af..3a4e211 100644
--- a/src/SFML/Graphics/TextureSaver.cpp
+++ b/src/SFML/Graphics/TextureSaver.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -42,7 +42,7 @@ TextureSaver::TextureSaver()
////////////////////////////////////////////////////////////
TextureSaver::~TextureSaver()
{
- glCheck(glBindTexture(GL_TEXTURE_2D, m_textureBinding));
+ glCheck(glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(m_textureBinding)));
}
} // namespace priv
diff --git a/src/SFML/Graphics/TextureSaver.hpp b/src/SFML/Graphics/TextureSaver.hpp
index 170fe46..3829a3b 100644
--- a/src/SFML/Graphics/TextureSaver.hpp
+++ b/src/SFML/Graphics/TextureSaver.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -64,7 +64,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- GLint m_textureBinding; ///< Texture binding to restore
+ GLint m_textureBinding; //!< Texture binding to restore
};
} // namespace priv
diff --git a/src/SFML/Graphics/Transform.cpp b/src/SFML/Graphics/Transform.cpp
index 22d3e70..a4b89f2 100644
--- a/src/SFML/Graphics/Transform.cpp
+++ b/src/SFML/Graphics/Transform.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Graphics/Transformable.cpp b/src/SFML/Graphics/Transformable.cpp
index 8101670..c318068 100644
--- a/src/SFML/Graphics/Transformable.cpp
+++ b/src/SFML/Graphics/Transformable.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -71,7 +71,7 @@ void Transformable::setPosition(const Vector2f& position)
////////////////////////////////////////////////////////////
void Transformable::setRotation(float angle)
{
- m_rotation = static_cast<float>(fmod(angle, 360));
+ m_rotation = std::fmod(angle, 360.f);
if (m_rotation < 0)
m_rotation += 360.f;
@@ -184,8 +184,8 @@ const Transform& Transformable::getTransform() const
if (m_transformNeedUpdate)
{
float angle = -m_rotation * 3.141592654f / 180.f;
- float cosine = static_cast<float>(std::cos(angle));
- float sine = static_cast<float>(std::sin(angle));
+ float cosine = std::cos(angle);
+ float sine = std::sin(angle);
float sxc = m_scale.x * cosine;
float syc = m_scale.y * cosine;
float sxs = m_scale.x * sine;
diff --git a/src/SFML/Graphics/Vertex.cpp b/src/SFML/Graphics/Vertex.cpp
index 2655f73..1a25aac 100644
--- a/src/SFML/Graphics/Vertex.cpp
+++ b/src/SFML/Graphics/Vertex.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Graphics/VertexArray.cpp b/src/SFML/Graphics/VertexArray.cpp
index 58c98f7..e22c9bf 100644
--- a/src/SFML/Graphics/VertexArray.cpp
+++ b/src/SFML/Graphics/VertexArray.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Graphics/VertexBuffer.cpp b/src/SFML/Graphics/VertexBuffer.cpp
index 8e07980..2abac6e 100644
--- a/src/SFML/Graphics/VertexBuffer.cpp
+++ b/src/SFML/Graphics/VertexBuffer.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -36,15 +36,19 @@
namespace
{
- sf::Mutex isAvailableMutex;
-
- GLenum usageToGlEnum(sf::VertexBuffer::Usage usage)
+ // A nested named namespace is used here to allow unity builds of SFML.
+ namespace VertexBufferImpl
{
- switch (usage)
+ sf::Mutex isAvailableMutex;
+
+ GLenum usageToGlEnum(sf::VertexBuffer::Usage usage)
{
- case sf::VertexBuffer::Static: return GLEXT_GL_STATIC_DRAW;
- case sf::VertexBuffer::Dynamic: return GLEXT_GL_DYNAMIC_DRAW;
- default: return GLEXT_GL_STREAM_DRAW;
+ switch (usage)
+ {
+ case sf::VertexBuffer::Static: return GLEXT_GL_STATIC_DRAW;
+ case sf::VertexBuffer::Dynamic: return GLEXT_GL_DYNAMIC_DRAW;
+ default: return GLEXT_GL_STREAM_DRAW;
+ }
}
}
}
@@ -143,7 +147,7 @@ bool VertexBuffer::create(std::size_t vertexCount)
}
glCheck(GLEXT_glBindBuffer(GLEXT_GL_ARRAY_BUFFER, m_buffer));
- glCheck(GLEXT_glBufferData(GLEXT_GL_ARRAY_BUFFER, sizeof(Vertex) * vertexCount, 0, usageToGlEnum(m_usage)));
+ glCheck(GLEXT_glBufferData(GLEXT_GL_ARRAY_BUFFER, static_cast<GLsizeiptrARB>(sizeof(Vertex) * vertexCount), 0, VertexBufferImpl::usageToGlEnum(m_usage)));
glCheck(GLEXT_glBindBuffer(GLEXT_GL_ARRAY_BUFFER, 0));
m_size = vertexCount;
@@ -186,12 +190,12 @@ bool VertexBuffer::update(const Vertex* vertices, std::size_t vertexCount, unsig
// Check if we need to resize or orphan the buffer
if (vertexCount >= m_size)
{
- glCheck(GLEXT_glBufferData(GLEXT_GL_ARRAY_BUFFER, sizeof(Vertex) * vertexCount, 0, usageToGlEnum(m_usage)));
+ glCheck(GLEXT_glBufferData(GLEXT_GL_ARRAY_BUFFER, static_cast<GLsizeiptrARB>(sizeof(Vertex) * vertexCount), 0, VertexBufferImpl::usageToGlEnum(m_usage)));
m_size = vertexCount;
}
- glCheck(GLEXT_glBufferSubData(GLEXT_GL_ARRAY_BUFFER, sizeof(Vertex) * offset, sizeof(Vertex) * vertexCount, vertices));
+ glCheck(GLEXT_glBufferSubData(GLEXT_GL_ARRAY_BUFFER, static_cast<GLintptrARB>(sizeof(Vertex) * offset), static_cast<GLsizeiptrARB>(sizeof(Vertex) * vertexCount), vertices));
glCheck(GLEXT_glBindBuffer(GLEXT_GL_ARRAY_BUFFER, 0));
@@ -204,6 +208,7 @@ bool VertexBuffer::update(const VertexBuffer& vertexBuffer)
{
#ifdef SFML_OPENGL_ES
+ (void) vertexBuffer;
return false;
#else
@@ -221,7 +226,7 @@ bool VertexBuffer::update(const VertexBuffer& vertexBuffer)
glCheck(GLEXT_glBindBuffer(GLEXT_GL_COPY_READ_BUFFER, vertexBuffer.m_buffer));
glCheck(GLEXT_glBindBuffer(GLEXT_GL_COPY_WRITE_BUFFER, m_buffer));
- glCheck(GLEXT_glCopyBufferSubData(GLEXT_GL_COPY_READ_BUFFER, GLEXT_GL_COPY_WRITE_BUFFER, 0, 0, sizeof(Vertex) * vertexBuffer.m_size));
+ glCheck(GLEXT_glCopyBufferSubData(GLEXT_GL_COPY_READ_BUFFER, GLEXT_GL_COPY_WRITE_BUFFER, 0, 0, static_cast<GLsizeiptr>(sizeof(Vertex) * vertexBuffer.m_size)));
glCheck(GLEXT_glBindBuffer(GLEXT_GL_COPY_WRITE_BUFFER, 0));
glCheck(GLEXT_glBindBuffer(GLEXT_GL_COPY_READ_BUFFER, 0));
@@ -230,7 +235,7 @@ bool VertexBuffer::update(const VertexBuffer& vertexBuffer)
}
glCheck(GLEXT_glBindBuffer(GLEXT_GL_ARRAY_BUFFER, m_buffer));
- glCheck(GLEXT_glBufferData(GLEXT_GL_ARRAY_BUFFER, sizeof(Vertex) * vertexBuffer.m_size, 0, usageToGlEnum(m_usage)));
+ glCheck(GLEXT_glBufferData(GLEXT_GL_ARRAY_BUFFER, static_cast<GLsizeiptrARB>(sizeof(Vertex) * vertexBuffer.m_size), 0, VertexBufferImpl::usageToGlEnum(m_usage)));
void* destination = 0;
glCheck(destination = GLEXT_glMapBuffer(GLEXT_GL_ARRAY_BUFFER, GLEXT_GL_WRITE_ONLY));
@@ -332,7 +337,7 @@ VertexBuffer::Usage VertexBuffer::getUsage() const
////////////////////////////////////////////////////////////
bool VertexBuffer::isAvailable()
{
- Lock lock(isAvailableMutex);
+ Lock lock(VertexBufferImpl::isAvailableMutex);
static bool checked = false;
static bool available = false;
diff --git a/src/SFML/Graphics/View.cpp b/src/SFML/Graphics/View.cpp
index 0fcf654..85a73f5 100644
--- a/src/SFML/Graphics/View.cpp
+++ b/src/SFML/Graphics/View.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -108,7 +108,7 @@ void View::setSize(const Vector2f& size)
////////////////////////////////////////////////////////////
void View::setRotation(float angle)
{
- m_rotation = static_cast<float>(fmod(angle, 360));
+ m_rotation = std::fmod(angle, 360.f);
if (m_rotation < 0)
m_rotation += 360.f;
@@ -202,8 +202,8 @@ const Transform& View::getTransform() const
{
// Rotation components
float angle = m_rotation * 3.141592654f / 180.f;
- float cosine = static_cast<float>(std::cos(angle));
- float sine = static_cast<float>(std::sin(angle));
+ float cosine = std::cos(angle);
+ float sine = std::sin(angle);
float tx = -m_center.x * cosine - m_center.y * sine + m_center.x;
float ty = m_center.x * sine - m_center.y * cosine + m_center.y;
diff --git a/src/SFML/Main/CMakeLists.txt b/src/SFML/Main/CMakeLists.txt
index 6542e59..9390aa9 100644
--- a/src/SFML/Main/CMakeLists.txt
+++ b/src/SFML/Main/CMakeLists.txt
@@ -16,6 +16,14 @@ endif()
# define the sfml-main target
sfml_add_library(sfml-main STATIC SOURCES ${SRC})
+if(SFML_OS_ANDROID)
+ # ensure that linking into shared libraries doesn't fail
+ set_target_properties(sfml-main PROPERTIES POSITION_INDEPENDENT_CODE ON)
+
+ # glad sources
+ target_include_directories(sfml-main SYSTEM PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/glad/include")
+endif()
+
# overwrite sfml-main suffix for backward compatibility with FindSFML.cmake
set_target_properties(sfml-main PROPERTIES
DEBUG_POSTFIX -d
diff --git a/src/SFML/Main/MainAndroid.cpp b/src/SFML/Main/MainAndroid.cpp
index 5e62133..2f70c30 100644
--- a/src/SFML/Main/MainAndroid.cpp
+++ b/src/SFML/Main/MainAndroid.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -46,6 +46,10 @@
#include <android/window.h>
#include <android/native_activity.h>
#include <cstring>
+#include <cassert>
+
+#define SF_GLAD_EGL_IMPLEMENTATION
+#include <glad/egl.h>
extern int main(int argc, char *argv[]);
@@ -67,10 +71,10 @@ int getAndroidApiLevel(ANativeActivity* activity)
jfieldID sdkIntFieldID = lJNIEnv->GetStaticFieldID(versionClass, "SDK_INT", "I");
if (sdkIntFieldID == NULL)
return 0;
-
+
jint sdkInt = 0;
sdkInt = lJNIEnv->GetStaticIntField(versionClass, sdkIntFieldID);
-
+
return sdkInt;
}
@@ -78,6 +82,8 @@ int getAndroidApiLevel(ANativeActivity* activity)
////////////////////////////////////////////////////////////
ActivityStates* retrieveStates(ANativeActivity* activity)
{
+ assert(activity != NULL);
+
// Hide the ugly cast we find in each callback function
return (ActivityStates*)activity->instance;
}
@@ -94,11 +100,12 @@ static void initializeMain(ActivityStates* states)
states->looper = looper;
/**
- * Acquire increments a reference counter on the looper. This keeps android
- * from collecting it before the activity thread has a chance to detach its
+ * Acquire increments a reference counter on the looper. This keeps android
+ * from collecting it before the activity thread has a chance to detach its
* input queue.
*/
ALooper_acquire(states->looper);
+ ALooper_wake(states->looper);
// Get the default configuration
states->config = AConfiguration_new();
@@ -154,7 +161,6 @@ void goToFullscreenMode(ANativeActivity* activity)
AWINDOW_FLAG_FULLSCREEN);
// Hide the navigation bar
- JavaVM* lJavaVM = activity->vm;
JNIEnv* lJNIEnv = activity->env;
jobject objectActivity = activity->clazz;
@@ -171,11 +177,11 @@ void goToFullscreenMode(ANativeActivity* activity)
// Default flags
jint flags = 0;
-
+
// API Level 14
if (apiLevel >= 14)
{
- jfieldID FieldSYSTEM_UI_FLAG_LOW_PROFILE = lJNIEnv->GetStaticFieldID(classView, "SYSTEM_UI_FLAG_LOW_PROFILE", "I");
+ jfieldID FieldSYSTEM_UI_FLAG_LOW_PROFILE = lJNIEnv->GetStaticFieldID(classView, "SYSTEM_UI_FLAG_HIDE_NAVIGATION", "I");
jint SYSTEM_UI_FLAG_LOW_PROFILE = lJNIEnv->GetStaticIntField(classView, FieldSYSTEM_UI_FLAG_LOW_PROFILE);
flags |= SYSTEM_UI_FLAG_LOW_PROFILE;
}
@@ -209,7 +215,6 @@ void getScreenSizeInPixels(ANativeActivity* activity, int* width, int* height)
// DisplayMetrics dm = new DisplayMetrics();
// getWindowManager().getDefaultDisplay().getMetrics(dm);
- JavaVM* lJavaVM = activity->vm;
JNIEnv* lJNIEnv = activity->env;
jobject objectActivity = activity->clazz;
@@ -241,6 +246,7 @@ void getScreenSizeInPixels(ANativeActivity* activity, int* width, int* height)
////////////////////////////////////////////////////////////
static void onStart(ANativeActivity* activity)
{
+ (void) activity;
}
@@ -280,6 +286,7 @@ static void onPause(ANativeActivity* activity)
////////////////////////////////////////////////////////////
static void onStop(ANativeActivity* activity)
{
+ (void) activity;
}
@@ -323,7 +330,7 @@ static void onDestroy(ANativeActivity* activity)
delete states;
// Reset the activity pointer for all modules
- sf::priv::getActivity(NULL, true);
+ sf::priv::resetActivity(NULL);
// The application should now terminate
}
@@ -332,6 +339,8 @@ static void onDestroy(ANativeActivity* activity)
////////////////////////////////////////////////////////////
static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* window)
{
+ (void) window;
+
sf::priv::ActivityStates* states = sf::priv::retrieveStates(activity);
sf::Lock lock(states->mutex);
@@ -357,6 +366,8 @@ static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* wind
////////////////////////////////////////////////////////////
static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* window)
{
+ (void) window;
+
sf::priv::ActivityStates* states = sf::priv::retrieveStates(activity);
sf::Lock lock(states->mutex);
@@ -382,12 +393,16 @@ static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* wi
////////////////////////////////////////////////////////////
static void onNativeWindowRedrawNeeded(ANativeActivity* activity, ANativeWindow* window)
{
+ (void) activity;
+ (void) window;
}
////////////////////////////////////////////////////////////
static void onNativeWindowResized(ANativeActivity* activity, ANativeWindow* window)
{
+ (void) activity;
+ (void) window;
}
@@ -428,12 +443,16 @@ static void onInputQueueDestroyed(ANativeActivity* activity, AInputQueue* queue)
////////////////////////////////////////////////////////////
static void onWindowFocusChanged(ANativeActivity* activity, int focused)
{
+ (void) activity;
+ (void) focused;
}
////////////////////////////////////////////////////////////
static void onContentRectChanged(ANativeActivity* activity, const ARect* rect)
{
+ (void) rect;
+
// Retrieve our activity states from the activity instance
sf::priv::ActivityStates* states = sf::priv::retrieveStates(activity);
sf::Lock lock(states->mutex);
@@ -443,8 +462,8 @@ static void onContentRectChanged(ANativeActivity* activity, const ARect* rect)
// Send an event to warn people about the window move/resize
sf::Event event;
event.type = sf::Event::Resized;
- event.size.width = ANativeWindow_getWidth(states->window);
- event.size.height = ANativeWindow_getHeight(states->window);
+ event.size.width = static_cast<unsigned int>(ANativeWindow_getWidth(states->window));
+ event.size.height = static_cast<unsigned int>(ANativeWindow_getHeight(states->window));
states->forwardEvent(event);
}
@@ -454,12 +473,14 @@ static void onContentRectChanged(ANativeActivity* activity, const ARect* rect)
////////////////////////////////////////////////////////////
static void onConfigurationChanged(ANativeActivity* activity)
{
+ (void) activity;
}
////////////////////////////////////////////////////////////
static void* onSaveInstanceState(ANativeActivity* activity, size_t* outLen)
{
+ (void) activity;
*outLen = 0;
return NULL;
@@ -469,6 +490,7 @@ static void* onSaveInstanceState(ANativeActivity* activity, size_t* outLen)
////////////////////////////////////////////////////////////
static void onLowMemory(ANativeActivity* activity)
{
+ (void) activity;
}
@@ -489,6 +511,7 @@ JNIEXPORT void ANativeActivity_onCreate(ANativeActivity* activity, void* savedSt
for (unsigned int i = 0; i < sf::Mouse::ButtonCount; i++)
states->isButtonPressed[i] = false;
+ gladLoaderLoadEGL(EGL_DEFAULT_DISPLAY);
states->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (savedState != NULL)
@@ -504,7 +527,7 @@ JNIEXPORT void ANativeActivity_onCreate(ANativeActivity* activity, void* savedSt
states->terminated = false;
// Share it across the SFML modules
- sf::priv::getActivity(states, true);
+ sf::priv::resetActivity(states);
// These functions will update the activity states and therefore, will allow
// SFML to be kept in the know
diff --git a/src/SFML/Main/MainWin32.cpp b/src/SFML/Main/MainWin32.cpp
index fefc1b7..6a90722 100644
--- a/src/SFML/Main/MainWin32.cpp
+++ b/src/SFML/Main/MainWin32.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
// Copyright (C) 2013 Jonathan De Wachter (dewachter.jonathan@gmail.com)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -46,7 +46,10 @@ extern int main(int argc, char* argv[]);
////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)
{
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpedantic"
return main(__argc, __argv);
+ #pragma GCC diagnostic pop
}
#endif // SFML_SYSTEM_WINDOWS
diff --git a/src/SFML/Main/MainiOS.mm b/src/SFML/Main/MainiOS.mm
index fa88e69..fa2f226 100644
--- a/src/SFML/Main/MainiOS.mm
+++ b/src/SFML/Main/MainiOS.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.prg)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.prg)
// Copyright (C) 2013 Jonathan De Wachter (dewachter.jonathan@gmail.com)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Main/SFMLActivity.cpp b/src/SFML/Main/SFMLActivity.cpp
index caf191b..49f26e8 100644
--- a/src/SFML/Main/SFMLActivity.cpp
+++ b/src/SFML/Main/SFMLActivity.cpp
@@ -68,7 +68,7 @@ const char *getLibraryName(JNIEnv* lJNIEnv, jobject& objectActivityInfo)
}
// Convert the application name to a C++ string and return it
- const jsize applicationNameLength = lJNIEnv->GetStringUTFLength(valueString);
+ const size_t applicationNameLength = static_cast<size_t>(lJNIEnv->GetStringUTFLength(valueString));
const char* applicationName = lJNIEnv->GetStringUTFChars(valueString, NULL);
if (applicationNameLength >= 256)
@@ -77,7 +77,7 @@ const char *getLibraryName(JNIEnv* lJNIEnv, jobject& objectActivityInfo)
exit(1);
}
- strncpy(name, applicationName, applicationNameLength);
+ strncpy(name, applicationName, static_cast<size_t>(applicationNameLength));
name[applicationNameLength] = '\0';
lJNIEnv->ReleaseStringUTFChars(valueString, applicationName);
@@ -141,7 +141,6 @@ void ANativeActivity_onCreate(ANativeActivity* activity, void* savedState, size_
// With libname being the library name such as "jpeg".
// Retrieve JNI environment and JVM instance
- JavaVM* lJavaVM = activity->vm;
JNIEnv* lJNIEnv = activity->env;
// Retrieve the NativeActivity
diff --git a/src/SFML/Network/Ftp.cpp b/src/SFML/Network/Ftp.cpp
index 41a630f..9bca3c6 100644
--- a/src/SFML/Network/Ftp.cpp
+++ b/src/SFML/Network/Ftp.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -60,8 +60,8 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Ftp& m_ftp; ///< Reference to the owner Ftp instance
- TcpSocket m_dataSocket; ///< Socket used for data transfers
+ Ftp& m_ftp; //!< Reference to the owner Ftp instance
+ TcpSocket m_dataSocket; //!< Socket used for data transfers
};
@@ -366,7 +366,7 @@ Ftp::Response Ftp::sendCommand(const std::string& command, const std::string& pa
{
// Build the command string
std::string commandStr;
- if (parameter != "")
+ if (!parameter.empty())
commandStr = command + " " + parameter + "\r\n";
else
commandStr = command + "\r\n";
@@ -549,7 +549,7 @@ Ftp::Response Ftp::DataChannel::open(Ftp::TransferMode mode)
// Extract the current number
while (isdigit(str[index]))
{
- data[i] = data[i] * 10 + (str[index] - '0');
+ data[i] = static_cast<Uint8>(static_cast<Uint8>(data[i] * 10) + static_cast<Uint8>(str[index] - '0'));
index++;
}
@@ -558,11 +558,11 @@ Ftp::Response Ftp::DataChannel::open(Ftp::TransferMode mode)
}
// Reconstruct connection port and address
- unsigned short port = data[4] * 256 + data[5];
- IpAddress address(static_cast<Uint8>(data[0]),
- static_cast<Uint8>(data[1]),
- static_cast<Uint8>(data[2]),
- static_cast<Uint8>(data[3]));
+ unsigned short port = static_cast<Uint16>(data[4] * 256 + data[5]);
+ IpAddress address(data[0],
+ data[1],
+ data[2],
+ data[3]);
// Connect the data channel to the server
if (m_dataSocket.connect(address, port) == Socket::Done)
diff --git a/src/SFML/Network/Http.cpp b/src/SFML/Network/Http.cpp
index 7fdc81a..1e77e03 100644
--- a/src/SFML/Network/Http.cpp
+++ b/src/SFML/Network/Http.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -79,7 +79,7 @@ void Http::Request::setUri(const std::string& uri)
// Make sure it starts with a '/'
if (m_uri.empty() || (m_uri[0] != '/'))
- m_uri.insert(0, "/");
+ m_uri.insert(m_uri.begin(), '/');
}
@@ -208,8 +208,8 @@ void Http::Response::parse(const std::string& data)
(toLower(version.substr(0, 5)) == "http/") &&
isdigit(version[5]) && isdigit(version[7]))
{
- m_majorVersion = version[5] - '0';
- m_minorVersion = version[7] - '0';
+ m_majorVersion = static_cast<unsigned int>(version[5] - '0');
+ m_minorVersion = static_cast<unsigned int>(version[7] - '0');
}
else
{
@@ -261,7 +261,10 @@ void Http::Response::parse(const std::string& data)
std::istreambuf_iterator<char> it(in);
std::istreambuf_iterator<char> itEnd;
for (std::size_t i = 0; ((i < length) && (it != itEnd)); i++)
- m_body.push_back(*it++);
+ {
+ m_body.push_back(*it);
+ ++it; // Iterate in separate expression to work around false positive -Wnull-dereference warning in GCC 12.1.0
+ }
}
// Drop the rest of the line (chunk-extension)
@@ -327,7 +330,7 @@ void Http::setHost(const std::string& host, unsigned short port)
{
// HTTPS protocol -- unsupported (requires encryption and certificates and stuff...)
err() << "HTTPS protocol is not supported by sf::Http" << std::endl;
- m_hostName = "";
+ m_hostName.clear();
m_port = 0;
}
else
diff --git a/src/SFML/Network/IpAddress.cpp b/src/SFML/Network/IpAddress.cpp
index 9556138..a36ffe5 100644
--- a/src/SFML/Network/IpAddress.cpp
+++ b/src/SFML/Network/IpAddress.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -69,7 +69,7 @@ m_valid (false)
////////////////////////////////////////////////////////////
IpAddress::IpAddress(Uint8 byte0, Uint8 byte1, Uint8 byte2, Uint8 byte3) :
-m_address(htonl((byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3)),
+m_address(htonl(static_cast<Uint32>((byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3))),
m_valid (true)
{
}
@@ -198,7 +198,9 @@ void IpAddress::resolve(const std::string& address)
{
if (result)
{
- ip = reinterpret_cast<sockaddr_in*>(result->ai_addr)->sin_addr.s_addr;
+ sockaddr_in sin;
+ std::memcpy(&sin, result->ai_addr, sizeof(*result->ai_addr));
+ ip = sin.sin_addr.s_addr;
freeaddrinfo(result);
m_address = ip;
m_valid = true;
diff --git a/src/SFML/Network/Packet.cpp b/src/SFML/Network/Packet.cpp
index 0dc2bbc..9263628 100644
--- a/src/SFML/Network/Packet.cpp
+++ b/src/SFML/Network/Packet.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -64,6 +64,13 @@ void Packet::append(const void* data, std::size_t sizeInBytes)
////////////////////////////////////////////////////////////
+std::size_t Packet::getReadPosition() const
+{
+ return m_readPos;
+}
+
+
+////////////////////////////////////////////////////////////
void Packet::clear()
{
m_data.clear();
@@ -116,7 +123,7 @@ Packet& Packet::operator >>(Int8& data)
{
if (checkSize(sizeof(data)))
{
- data = *reinterpret_cast<const Int8*>(&m_data[m_readPos]);
+ std::memcpy(&data, &m_data[m_readPos], sizeof(data));
m_readPos += sizeof(data);
}
@@ -129,7 +136,7 @@ Packet& Packet::operator >>(Uint8& data)
{
if (checkSize(sizeof(data)))
{
- data = *reinterpret_cast<const Uint8*>(&m_data[m_readPos]);
+ std::memcpy(&data, &m_data[m_readPos], sizeof(data));
m_readPos += sizeof(data);
}
@@ -142,7 +149,8 @@ Packet& Packet::operator >>(Int16& data)
{
if (checkSize(sizeof(data)))
{
- data = ntohs(*reinterpret_cast<const Int16*>(&m_data[m_readPos]));
+ std::memcpy(&data, &m_data[m_readPos], sizeof(data));
+ data = static_cast<Int16>(ntohs(static_cast<Uint16>(data)));
m_readPos += sizeof(data);
}
@@ -155,7 +163,8 @@ Packet& Packet::operator >>(Uint16& data)
{
if (checkSize(sizeof(data)))
{
- data = ntohs(*reinterpret_cast<const Uint16*>(&m_data[m_readPos]));
+ std::memcpy(&data, &m_data[m_readPos], sizeof(data));
+ data = ntohs(data);
m_readPos += sizeof(data);
}
@@ -168,7 +177,8 @@ Packet& Packet::operator >>(Int32& data)
{
if (checkSize(sizeof(data)))
{
- data = ntohl(*reinterpret_cast<const Int32*>(&m_data[m_readPos]));
+ std::memcpy(&data, &m_data[m_readPos], sizeof(data));
+ data = static_cast<Int32>(ntohl(static_cast<Uint32>(data)));
m_readPos += sizeof(data);
}
@@ -181,7 +191,8 @@ Packet& Packet::operator >>(Uint32& data)
{
if (checkSize(sizeof(data)))
{
- data = ntohl(*reinterpret_cast<const Uint32*>(&m_data[m_readPos]));
+ std::memcpy(&data, &m_data[m_readPos], sizeof(data));
+ data = ntohl(data);
m_readPos += sizeof(data);
}
@@ -196,7 +207,8 @@ Packet& Packet::operator >>(Int64& data)
{
// Since ntohll is not available everywhere, we have to convert
// to network byte order (big endian) manually
- const Uint8* bytes = reinterpret_cast<const Uint8*>(&m_data[m_readPos]);
+ Uint8 bytes[sizeof(data)];
+ std::memcpy(bytes, &m_data[m_readPos], sizeof(data));
data = (static_cast<Int64>(bytes[0]) << 56) |
(static_cast<Int64>(bytes[1]) << 48) |
(static_cast<Int64>(bytes[2]) << 40) |
@@ -219,7 +231,8 @@ Packet& Packet::operator >>(Uint64& data)
{
// Since ntohll is not available everywhere, we have to convert
// to network byte order (big endian) manually
- const Uint8* bytes = reinterpret_cast<const Uint8*>(&m_data[m_readPos]);
+ Uint8 bytes[sizeof(data)];
+ std::memcpy(bytes, &m_data[m_readPos], sizeof(data));
data = (static_cast<Uint64>(bytes[0]) << 56) |
(static_cast<Uint64>(bytes[1]) << 48) |
(static_cast<Uint64>(bytes[2]) << 40) |
@@ -240,7 +253,7 @@ Packet& Packet::operator >>(float& data)
{
if (checkSize(sizeof(data)))
{
- data = *reinterpret_cast<const float*>(&m_data[m_readPos]);
+ std::memcpy(&data, &m_data[m_readPos], sizeof(data));
m_readPos += sizeof(data);
}
@@ -253,7 +266,7 @@ Packet& Packet::operator >>(double& data)
{
if (checkSize(sizeof(data)))
{
- data = *reinterpret_cast<const double*>(&m_data[m_readPos]);
+ std::memcpy(&data, &m_data[m_readPos], sizeof(data));
m_readPos += sizeof(data);
}
@@ -399,7 +412,7 @@ Packet& Packet::operator <<(Uint8 data)
////////////////////////////////////////////////////////////
Packet& Packet::operator <<(Int16 data)
{
- Int16 toWrite = htons(data);
+ Int16 toWrite = static_cast<Int16>(htons(static_cast<Uint16>(data)));
append(&toWrite, sizeof(toWrite));
return *this;
}
@@ -417,7 +430,7 @@ Packet& Packet::operator <<(Uint16 data)
////////////////////////////////////////////////////////////
Packet& Packet::operator <<(Int32 data)
{
- Int32 toWrite = htonl(data);
+ Int32 toWrite = static_cast<Int32>(htonl(static_cast<Uint32>(data)));
append(&toWrite, sizeof(toWrite));
return *this;
}
diff --git a/src/SFML/Network/Socket.cpp b/src/SFML/Network/Socket.cpp
index d100421..5bae3f7 100644
--- a/src/SFML/Network/Socket.cpp
+++ b/src/SFML/Network/Socket.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Network/SocketImpl.hpp b/src/SFML/Network/SocketImpl.hpp
index d1ffebe..aade23d 100644
--- a/src/SFML/Network/SocketImpl.hpp
+++ b/src/SFML/Network/SocketImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Network/SocketSelector.cpp b/src/SFML/Network/SocketSelector.cpp
index fa00c63..789d95c 100644
--- a/src/SFML/Network/SocketSelector.cpp
+++ b/src/SFML/Network/SocketSelector.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -42,10 +42,10 @@ namespace sf
////////////////////////////////////////////////////////////
struct SocketSelector::SocketSelectorImpl
{
- fd_set allSockets; ///< Set containing all the sockets handles
- fd_set socketsReady; ///< Set containing handles of the sockets that are ready
- int maxSocket; ///< Maximum socket handle
- int socketCount; ///< Number of socket handles
+ fd_set allSockets; //!< Set containing all the sockets handles
+ fd_set socketsReady; //!< Set containing handles of the sockets that are ready
+ int maxSocket; //!< Maximum socket handle
+ int socketCount; //!< Number of socket handles
};
@@ -158,7 +158,7 @@ bool SocketSelector::wait(Time timeout)
// Setup the timeout
timeval time;
time.tv_sec = static_cast<long>(timeout.asMicroseconds() / 1000000);
- time.tv_usec = static_cast<long>(timeout.asMicroseconds() % 1000000);
+ time.tv_usec = static_cast<int>(timeout.asMicroseconds() % 1000000);
// Initialize the set that will contain the sockets that are ready
m_impl->socketsReady = m_impl->allSockets;
diff --git a/src/SFML/Network/TcpListener.cpp b/src/SFML/Network/TcpListener.cpp
index 399f87d..b8fff1f 100644
--- a/src/SFML/Network/TcpListener.cpp
+++ b/src/SFML/Network/TcpListener.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Network/TcpSocket.cpp b/src/SFML/Network/TcpSocket.cpp
index d8effa1..4f82ceb 100644
--- a/src/SFML/Network/TcpSocket.cpp
+++ b/src/SFML/Network/TcpSocket.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -175,7 +175,7 @@ Socket::Status TcpSocket::connect(const IpAddress& remoteAddress, unsigned short
// Setup the timeout
timeval time;
time.tv_sec = static_cast<long>(timeout.asMicroseconds() / 1000000);
- time.tv_usec = static_cast<long>(timeout.asMicroseconds() % 1000000);
+ time.tv_usec = static_cast<int>(timeout.asMicroseconds() % 1000000);
// Wait for something to write on our socket (which means that the connection request has returned)
if (select(static_cast<int>(getHandle() + 1), NULL, &selector, NULL, &time) > 0)
@@ -243,10 +243,13 @@ Socket::Status TcpSocket::send(const void* data, std::size_t size, std::size_t&
// Loop until every byte has been sent
int result = 0;
- for (sent = 0; sent < size; sent += result)
+ for (sent = 0; sent < size; sent += static_cast<std::size_t>(result))
{
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wuseless-cast"
// Send a chunk of data
- result = ::send(getHandle(), static_cast<const char*>(data) + sent, static_cast<int>(size - sent), flags);
+ result = static_cast<int>(::send(getHandle(), static_cast<const char*>(data) + sent, static_cast<priv::SocketImpl::Size>(size - sent), flags));
+ #pragma GCC diagnostic pop
// Check for errors
if (result < 0)
@@ -277,8 +280,11 @@ Socket::Status TcpSocket::receive(void* data, std::size_t size, std::size_t& rec
return Error;
}
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wuseless-cast"
// Receive a chunk of bytes
- int sizeReceived = recv(getHandle(), static_cast<char*>(data), static_cast<int>(size), flags);
+ int sizeReceived = static_cast<int>(recv(getHandle(), static_cast<char*>(data), static_cast<priv::SocketImpl::Size>(size), flags));
+ #pragma GCC diagnostic pop
// Check the number of bytes received
if (sizeReceived > 0)
@@ -320,13 +326,25 @@ Socket::Status TcpSocket::send(Packet& packet)
std::vector<char> blockToSend(sizeof(packetSize) + size);
// Copy the packet size and data into the block to send
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wnull-dereference" // False positive.
std::memcpy(&blockToSend[0], &packetSize, sizeof(packetSize));
+ #pragma GCC diagnostic pop
if (size > 0)
std::memcpy(&blockToSend[0] + sizeof(packetSize), data, size);
+ // These warnings are ignored here for portability, as even on Windows the
+ // signature of `send` might change depending on whether Win32 or MinGW is
+ // being used.
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wuseless-cast"
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wsign-conversion"
// Send the data block
std::size_t sent;
- Status status = send(&blockToSend[0] + packet.m_sendPos, blockToSend.size() - packet.m_sendPos, sent);
+ Status status = send(&blockToSend[0] + packet.m_sendPos, static_cast<priv::SocketImpl::Size>(blockToSend.size() - packet.m_sendPos), sent);
+ #pragma GCC diagnostic pop
+ #pragma GCC diagnostic pop
// In the case of a partial send, record the location to resume from
if (status == Partial)
@@ -379,7 +397,7 @@ Socket::Status TcpSocket::receive(Packet& packet)
while (m_pendingPacket.Data.size() < packetSize)
{
// Receive a chunk of data
- std::size_t sizeToGet = std::min(static_cast<std::size_t>(packetSize - m_pendingPacket.Data.size()), sizeof(buffer));
+ std::size_t sizeToGet = std::min(packetSize - m_pendingPacket.Data.size(), sizeof(buffer));
Status status = receive(buffer, sizeToGet, received);
if (status != Done)
return status;
diff --git a/src/SFML/Network/UdpSocket.cpp b/src/SFML/Network/UdpSocket.cpp
index 0ff03b0..37b86db 100644
--- a/src/SFML/Network/UdpSocket.cpp
+++ b/src/SFML/Network/UdpSocket.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -113,8 +113,11 @@ Socket::Status UdpSocket::send(const void* data, std::size_t size, const IpAddre
// Build the target address
sockaddr_in address = priv::SocketImpl::createAddress(remoteAddress.toInteger(), remotePort);
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wuseless-cast"
// Send the data (unlike TCP, all the data is always sent in one call)
- int sent = sendto(getHandle(), static_cast<const char*>(data), static_cast<int>(size), 0, reinterpret_cast<sockaddr*>(&address), sizeof(address));
+ int sent = static_cast<int>(sendto(getHandle(), static_cast<const char*>(data), static_cast<priv::SocketImpl::Size>(size), 0, reinterpret_cast<sockaddr*>(&address), sizeof(address)));
+ #pragma GCC diagnostic pop
// Check for errors
if (sent < 0)
@@ -142,9 +145,12 @@ Socket::Status UdpSocket::receive(void* data, std::size_t size, std::size_t& rec
// Data that will be filled with the other computer's address
sockaddr_in address = priv::SocketImpl::createAddress(INADDR_ANY, 0);
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wuseless-cast"
// Receive a chunk of bytes
priv::SocketImpl::AddrLength addressSize = sizeof(address);
- int sizeReceived = recvfrom(getHandle(), static_cast<char*>(data), static_cast<int>(size), 0, reinterpret_cast<sockaddr*>(&address), &addressSize);
+ int sizeReceived = static_cast<int>(recvfrom(getHandle(), static_cast<char*>(data), static_cast<priv::SocketImpl::Size>(size), 0, reinterpret_cast<sockaddr*>(&address), &addressSize));
+ #pragma GCC diagnostic pop
// Check for errors
if (sizeReceived < 0)
diff --git a/src/SFML/Network/Unix/SocketImpl.cpp b/src/SFML/Network/Unix/SocketImpl.cpp
index 4029480..366407e 100644
--- a/src/SFML/Network/Unix/SocketImpl.cpp
+++ b/src/SFML/Network/Unix/SocketImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Network/Unix/SocketImpl.hpp b/src/SFML/Network/Unix/SocketImpl.hpp
index b70c077..929d201 100644
--- a/src/SFML/Network/Unix/SocketImpl.hpp
+++ b/src/SFML/Network/Unix/SocketImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -55,6 +55,7 @@ public:
// Types
////////////////////////////////////////////////////////////
typedef socklen_t AddrLength;
+ typedef size_t Size;
////////////////////////////////////////////////////////////
/// \brief Create an internal sockaddr_in address
diff --git a/src/SFML/Network/Win32/SocketImpl.cpp b/src/SFML/Network/Win32/SocketImpl.cpp
index bd53665..8b24867 100644
--- a/src/SFML/Network/Win32/SocketImpl.cpp
+++ b/src/SFML/Network/Win32/SocketImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -64,7 +64,7 @@ void SocketImpl::close(SocketHandle sock)
void SocketImpl::setBlocking(SocketHandle sock, bool block)
{
u_long blocking = block ? 0 : 1;
- ioctlsocket(sock, FIONBIO, &blocking);
+ ioctlsocket(sock, static_cast<long>(FIONBIO), &blocking);
}
diff --git a/src/SFML/Network/Win32/SocketImpl.hpp b/src/SFML/Network/Win32/SocketImpl.hpp
index 978336f..c31c89e 100644
--- a/src/SFML/Network/Win32/SocketImpl.hpp
+++ b/src/SFML/Network/Win32/SocketImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -58,6 +58,7 @@ public:
// Types
////////////////////////////////////////////////////////////
typedef int AddrLength;
+ typedef int Size;
////////////////////////////////////////////////////////////
/// \brief Create an internal sockaddr_in address
diff --git a/src/SFML/System/Android/Activity.cpp b/src/SFML/System/Android/Activity.cpp
index 5d14026..afca6cb 100644
--- a/src/SFML/System/Android/Activity.cpp
+++ b/src/SFML/System/Android/Activity.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
// Copyright (C) 2013 Jonathan De Wachter (dewachter.jonathan@gmail.com)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -29,6 +29,7 @@
////////////////////////////////////////////////////////////
#include <SFML/System/Android/Activity.hpp>
#include <android/log.h>
+#include <cassert>
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_INFO, "sfml-error", __VA_ARGS__))
@@ -40,14 +41,14 @@ std::streambuf()
std::streambuf::int_type LogcatStream::overflow (std::streambuf::int_type c)
{
- if (c == "\n"[0])
+ if (c == '\n')
{
- m_message.push_back(c);
+ m_message.push_back(static_cast<char>(c));
LOGE("%s", m_message.c_str());
m_message.clear();
}
- m_message.push_back(c);
+ m_message.push_back(static_cast<char>(c));
return traits_type::not_eof(c);
}
@@ -56,14 +57,24 @@ namespace sf
{
namespace priv
{
-ActivityStates* getActivity(ActivityStates* initializedStates, bool reset)
+
+ActivityStates*& getActivityStatesPtr()
{
static ActivityStates* states = NULL;
+ return states;
+}
- if (!states || reset)
- states = initializedStates;
+void resetActivity(ActivityStates* initializedStates)
+{
+ getActivityStatesPtr() = initializedStates;
+}
- return states;
+ActivityStates& getActivity()
+{
+ ActivityStates* const states = getActivityStatesPtr();
+ assert(states != NULL);
+ return *states;
}
+
}
}
diff --git a/src/SFML/System/Android/Activity.hpp b/src/SFML/System/Android/Activity.hpp
index bd6bbc9..0adcf1a 100644
--- a/src/SFML/System/Android/Activity.hpp
+++ b/src/SFML/System/Android/Activity.hpp
@@ -33,7 +33,6 @@
#include <SFML/System/Mutex.hpp>
#include <android/native_activity.h>
#include <android/configuration.h>
-#include <EGL/egl.h>
#include <vector>
#include <map>
#include <string>
@@ -92,7 +91,9 @@ struct ActivityStates
LogcatStream logcat;
};
-SFML_SYSTEM_API ActivityStates* getActivity(ActivityStates* initializedStates=NULL, bool reset=false);
+SFML_SYSTEM_API ActivityStates*& getActivityStatesPtr();
+SFML_SYSTEM_API void resetActivity(ActivityStates* initializedStates);
+SFML_SYSTEM_API ActivityStates& getActivity();
} // namespace priv
} // namespace sf
diff --git a/src/SFML/System/Android/NativeActivity.cpp b/src/SFML/System/Android/NativeActivity.cpp
index ac489ae..4751dee 100644
--- a/src/SFML/System/Android/NativeActivity.cpp
+++ b/src/SFML/System/Android/NativeActivity.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -33,7 +33,7 @@ namespace sf
////////////////////////////////////////////////////////////
ANativeActivity* getNativeActivity()
{
- return priv::getActivity()->activity;
+ return priv::getActivity().activity;
}
} // namespace sf
diff --git a/src/SFML/System/Android/ResourceStream.cpp b/src/SFML/System/Android/ResourceStream.cpp
index 93280aa..fa595d3 100644
--- a/src/SFML/System/Android/ResourceStream.cpp
+++ b/src/SFML/System/Android/ResourceStream.cpp
@@ -40,9 +40,9 @@ namespace priv
ResourceStream::ResourceStream(const std::string& filename) :
m_file (NULL)
{
- ActivityStates* states = getActivity(NULL);
- Lock(states->mutex);
- m_file = AAssetManager_open(states->activity->assetManager, filename.c_str(), AASSET_MODE_UNKNOWN);
+ ActivityStates& states = getActivity();
+ Lock lock(states.mutex);
+ m_file = AAssetManager_open(states.activity->assetManager, filename.c_str(), AASSET_MODE_UNKNOWN);
}
@@ -61,7 +61,7 @@ Int64 ResourceStream::read(void *data, Int64 size)
{
if (m_file)
{
- return AAsset_read(m_file, data, size);
+ return AAsset_read(m_file, data, static_cast<size_t>(size));
}
else
{
@@ -75,7 +75,7 @@ Int64 ResourceStream::seek(Int64 position)
{
if (m_file)
{
- return AAsset_seek(m_file, position, SEEK_SET);
+ return AAsset_seek(m_file, static_cast<off_t>(position), SEEK_SET);
}
else
{
diff --git a/src/SFML/System/CMakeLists.txt b/src/SFML/System/CMakeLists.txt
index d1b712d..1206968 100644
--- a/src/SFML/System/CMakeLists.txt
+++ b/src/SFML/System/CMakeLists.txt
@@ -89,6 +89,11 @@ endif()
sfml_add_library(sfml-system
SOURCES ${SRC} ${PLATFORM_SRC})
+if(SFML_OS_ANDROID)
+ # glad sources
+ target_include_directories(sfml-system PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/glad/include")
+endif()
+
# setup dependencies
if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_MACOSX)
target_link_libraries(sfml-system PRIVATE pthread)
diff --git a/src/SFML/System/Clock.cpp b/src/SFML/System/Clock.cpp
index 9f09533..3983505 100644
--- a/src/SFML/System/Clock.cpp
+++ b/src/SFML/System/Clock.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Err.cpp b/src/SFML/System/Err.cpp
index d186931..89d37a1 100644
--- a/src/SFML/System/Err.cpp
+++ b/src/SFML/System/Err.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -83,7 +83,7 @@ private:
if (pbase() != pptr())
{
// Print the contents of the write buffer into the standard error output
- std::size_t size = static_cast<int>(pptr() - pbase());
+ std::size_t size = static_cast<std::size_t>(pptr() - pbase());
fwrite(pbase(), 1, size, stderr);
// Reset the pointer position to the beginning of the write buffer
diff --git a/src/SFML/System/FileInputStream.cpp b/src/SFML/System/FileInputStream.cpp
index 89e77c4..f8c8af4 100644
--- a/src/SFML/System/FileInputStream.cpp
+++ b/src/SFML/System/FileInputStream.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -80,7 +80,7 @@ Int64 FileInputStream::read(void* data, Int64 size)
return m_file->read(data, size);
#else
if (m_file)
- return std::fread(data, 1, static_cast<std::size_t>(size), m_file);
+ return static_cast<Int64>(std::fread(data, 1, static_cast<std::size_t>(size), m_file));
else
return -1;
#endif
diff --git a/src/SFML/System/Lock.cpp b/src/SFML/System/Lock.cpp
index ada1ca1..0ce87f7 100644
--- a/src/SFML/System/Lock.cpp
+++ b/src/SFML/System/Lock.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/MemoryInputStream.cpp b/src/SFML/System/MemoryInputStream.cpp
index 3bd02b4..c9432c4 100644
--- a/src/SFML/System/MemoryInputStream.cpp
+++ b/src/SFML/System/MemoryInputStream.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -44,7 +44,7 @@ m_offset(0)
void MemoryInputStream::open(const void* data, std::size_t sizeInBytes)
{
m_data = static_cast<const char*>(data);
- m_size = sizeInBytes;
+ m_size = static_cast<Int64>(sizeInBytes);
m_offset = 0;
}
diff --git a/src/SFML/System/Mutex.cpp b/src/SFML/System/Mutex.cpp
index 139bf56..52f0ff9 100644
--- a/src/SFML/System/Mutex.cpp
+++ b/src/SFML/System/Mutex.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Sleep.cpp b/src/SFML/System/Sleep.cpp
index 35db5e8..c43cbe4 100644
--- a/src/SFML/System/Sleep.cpp
+++ b/src/SFML/System/Sleep.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/String.cpp b/src/SFML/System/String.cpp
index d8831f9..374beed 100644
--- a/src/SFML/System/String.cpp
+++ b/src/SFML/System/String.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Thread.cpp b/src/SFML/System/Thread.cpp
index 098018a..dcd7c26 100644
--- a/src/SFML/System/Thread.cpp
+++ b/src/SFML/System/Thread.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/ThreadLocal.cpp b/src/SFML/System/ThreadLocal.cpp
index 62d8117..0aef3d9 100644
--- a/src/SFML/System/ThreadLocal.cpp
+++ b/src/SFML/System/ThreadLocal.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Time.cpp b/src/SFML/System/Time.cpp
index 681c9a9..a96626c 100644
--- a/src/SFML/System/Time.cpp
+++ b/src/SFML/System/Time.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -44,7 +44,7 @@ m_microseconds(0)
////////////////////////////////////////////////////////////
float Time::asSeconds() const
{
- return m_microseconds / 1000000.f;
+ return static_cast<float>(static_cast<double>(m_microseconds) / 1000000.0);
}
diff --git a/src/SFML/System/Unix/ClockImpl.cpp b/src/SFML/System/Unix/ClockImpl.cpp
index 0d4f2bd..6a95386 100644
--- a/src/SFML/System/Unix/ClockImpl.cpp
+++ b/src/SFML/System/Unix/ClockImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -54,7 +54,7 @@ Time ClockImpl::getCurrentTime()
// POSIX implementation
timespec time;
clock_gettime(CLOCK_MONOTONIC, &time);
- return sf::microseconds(static_cast<Uint64>(time.tv_sec) * 1000000 + time.tv_nsec / 1000);
+ return sf::microseconds(time.tv_sec * 1000000 + time.tv_nsec / 1000);
#endif
}
diff --git a/src/SFML/System/Unix/ClockImpl.hpp b/src/SFML/System/Unix/ClockImpl.hpp
index 56f550c..b230c01 100644
--- a/src/SFML/System/Unix/ClockImpl.hpp
+++ b/src/SFML/System/Unix/ClockImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Unix/MutexImpl.cpp b/src/SFML/System/Unix/MutexImpl.cpp
index cc4e38e..7ed6cc7 100644
--- a/src/SFML/System/Unix/MutexImpl.cpp
+++ b/src/SFML/System/Unix/MutexImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Unix/MutexImpl.hpp b/src/SFML/System/Unix/MutexImpl.hpp
index cf0c0dd..9079e07 100644
--- a/src/SFML/System/Unix/MutexImpl.hpp
+++ b/src/SFML/System/Unix/MutexImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Unix/SleepImpl.cpp b/src/SFML/System/Unix/SleepImpl.cpp
index f6fb608..3a9bd9e 100644
--- a/src/SFML/System/Unix/SleepImpl.cpp
+++ b/src/SFML/System/Unix/SleepImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -37,12 +37,12 @@ namespace priv
////////////////////////////////////////////////////////////
void sleepImpl(Time time)
{
- Uint64 usecs = time.asMicroseconds();
+ Int64 usecs = time.asMicroseconds();
// Construct the time to wait
timespec ti;
- ti.tv_nsec = (usecs % 1000000) * 1000;
- ti.tv_sec = usecs / 1000000;
+ ti.tv_nsec = static_cast<long>((usecs % 1000000) * 1000);
+ ti.tv_sec = static_cast<time_t>(usecs / 1000000);
// Wait...
// If nanosleep returns -1, we check errno. If it is EINTR
diff --git a/src/SFML/System/Unix/SleepImpl.hpp b/src/SFML/System/Unix/SleepImpl.hpp
index 8d146d4..15284f3 100644
--- a/src/SFML/System/Unix/SleepImpl.hpp
+++ b/src/SFML/System/Unix/SleepImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Unix/ThreadImpl.cpp b/src/SFML/System/Unix/ThreadImpl.cpp
index e80213f..e3daf7f 100644
--- a/src/SFML/System/Unix/ThreadImpl.cpp
+++ b/src/SFML/System/Unix/ThreadImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Unix/ThreadImpl.hpp b/src/SFML/System/Unix/ThreadImpl.hpp
index 2cd13d0..5aee124 100644
--- a/src/SFML/System/Unix/ThreadImpl.hpp
+++ b/src/SFML/System/Unix/ThreadImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Unix/ThreadLocalImpl.cpp b/src/SFML/System/Unix/ThreadLocalImpl.cpp
index 1fea0c9..9c9bfb3 100644
--- a/src/SFML/System/Unix/ThreadLocalImpl.cpp
+++ b/src/SFML/System/Unix/ThreadLocalImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Unix/ThreadLocalImpl.hpp b/src/SFML/System/Unix/ThreadLocalImpl.hpp
index 919dcd5..92616cf 100644
--- a/src/SFML/System/Unix/ThreadLocalImpl.hpp
+++ b/src/SFML/System/Unix/ThreadLocalImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Win32/ClockImpl.cpp b/src/SFML/System/Win32/ClockImpl.cpp
index f69da4b..3b31487 100644
--- a/src/SFML/System/Win32/ClockImpl.cpp
+++ b/src/SFML/System/Win32/ClockImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -54,9 +54,9 @@ namespace priv
////////////////////////////////////////////////////////////
Time ClockImpl::getCurrentTime()
{
- // Get the frequency of the performance counter
- // (it is constant across the program lifetime)
- static LARGE_INTEGER frequency = getFrequency();
+ // Calculate inverse of frequency multiplied by 1000000 to prevent overflow in final calculation
+ // Frequency is constant across the program lifetime
+ static double inverse = 1000000.0 / static_cast<double>(getFrequency().QuadPart);
// Detect if we are on Windows XP or older
static bool oldWindows = isWindowsXpOrOlder();
@@ -80,7 +80,7 @@ Time ClockImpl::getCurrentTime()
}
// Return the current time as microseconds
- return sf::microseconds(1000000 * time.QuadPart / frequency.QuadPart);
+ return sf::microseconds(static_cast<sf::Int64>(static_cast<double>(time.QuadPart) * inverse));
}
} // namespace priv
diff --git a/src/SFML/System/Win32/ClockImpl.hpp b/src/SFML/System/Win32/ClockImpl.hpp
index d40ec6f..ddc2503 100644
--- a/src/SFML/System/Win32/ClockImpl.hpp
+++ b/src/SFML/System/Win32/ClockImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Win32/MutexImpl.cpp b/src/SFML/System/Win32/MutexImpl.cpp
index 8fdd388..35f2e5c 100644
--- a/src/SFML/System/Win32/MutexImpl.cpp
+++ b/src/SFML/System/Win32/MutexImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Win32/MutexImpl.hpp b/src/SFML/System/Win32/MutexImpl.hpp
index 9572114..5c484c5 100644
--- a/src/SFML/System/Win32/MutexImpl.hpp
+++ b/src/SFML/System/Win32/MutexImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -72,7 +72,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- CRITICAL_SECTION m_mutex; ///< Win32 handle of the mutex
+ CRITICAL_SECTION m_mutex; //!< Win32 handle of the mutex
};
} // namespace priv
diff --git a/src/SFML/System/Win32/SleepImpl.cpp b/src/SFML/System/Win32/SleepImpl.cpp
index 41c1018..6b5cad2 100644
--- a/src/SFML/System/Win32/SleepImpl.cpp
+++ b/src/SFML/System/Win32/SleepImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -44,7 +44,7 @@ void sleepImpl(Time time)
timeBeginPeriod(tc.wPeriodMin);
// Wait...
- ::Sleep(time.asMilliseconds());
+ ::Sleep(static_cast<DWORD>(time.asMilliseconds()));
// Reset the timer resolution back to the system default
timeEndPeriod(tc.wPeriodMin);
diff --git a/src/SFML/System/Win32/SleepImpl.hpp b/src/SFML/System/Win32/SleepImpl.hpp
index ad0138d..5ae3fb4 100644
--- a/src/SFML/System/Win32/SleepImpl.hpp
+++ b/src/SFML/System/Win32/SleepImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Win32/ThreadImpl.cpp b/src/SFML/System/Win32/ThreadImpl.cpp
index f5d2e2e..6a0a405 100644
--- a/src/SFML/System/Win32/ThreadImpl.cpp
+++ b/src/SFML/System/Win32/ThreadImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Win32/ThreadImpl.hpp b/src/SFML/System/Win32/ThreadImpl.hpp
index 913585f..774d91a 100644
--- a/src/SFML/System/Win32/ThreadImpl.hpp
+++ b/src/SFML/System/Win32/ThreadImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -97,8 +97,8 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- HANDLE m_thread; ///< Win32 thread handle
- unsigned int m_threadId; ///< Win32 thread identifier
+ HANDLE m_thread; //!< Win32 thread handle
+ unsigned int m_threadId; //!< Win32 thread identifier
};
} // namespace priv
diff --git a/src/SFML/System/Win32/ThreadLocalImpl.cpp b/src/SFML/System/Win32/ThreadLocalImpl.cpp
index bd28da3..24fbdb8 100644
--- a/src/SFML/System/Win32/ThreadLocalImpl.cpp
+++ b/src/SFML/System/Win32/ThreadLocalImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/System/Win32/ThreadLocalImpl.hpp b/src/SFML/System/Win32/ThreadLocalImpl.hpp
index e617dfe..2a70d4d 100644
--- a/src/SFML/System/Win32/ThreadLocalImpl.hpp
+++ b/src/SFML/System/Win32/ThreadLocalImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -76,7 +76,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- DWORD m_index; ///< Index of our thread-local storage slot
+ DWORD m_index; //!< Index of our thread-local storage slot
};
} // namespace priv
diff --git a/src/SFML/Window/Android/ClipboardImpl.cpp b/src/SFML/Window/Android/ClipboardImpl.cpp
index a5d3a19..fe46873 100644
--- a/src/SFML/Window/Android/ClipboardImpl.cpp
+++ b/src/SFML/Window/Android/ClipboardImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -42,7 +42,7 @@ String ClipboardImpl::getString()
////////////////////////////////////////////////////////////
-void ClipboardImpl::setString(const String& text)
+void ClipboardImpl::setString(const String& /* text */)
{
sf::err() << "Clipboard API not implemented for Android.\n";
}
diff --git a/src/SFML/Window/Android/ClipboardImpl.hpp b/src/SFML/Window/Android/ClipboardImpl.hpp
index 8d33dc6..c8cca27 100644
--- a/src/SFML/Window/Android/ClipboardImpl.hpp
+++ b/src/SFML/Window/Android/ClipboardImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Android/CursorImpl.cpp b/src/SFML/Window/Android/CursorImpl.cpp
index da5fff5..5954849 100644
--- a/src/SFML/Window/Android/CursorImpl.cpp
+++ b/src/SFML/Window/Android/CursorImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -47,7 +47,7 @@ CursorImpl::~CursorImpl()
////////////////////////////////////////////////////////////
-bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot)
+bool CursorImpl::loadFromPixels(const Uint8* /* pixels */, Vector2u /* size */, Vector2u /* hotspot */)
{
// Not supported
return false;
@@ -55,7 +55,7 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot
////////////////////////////////////////////////////////////
-bool CursorImpl::loadFromSystem(Cursor::Type type)
+bool CursorImpl::loadFromSystem(Cursor::Type /* type */)
{
// Not supported
return false;
diff --git a/src/SFML/Window/Android/CursorImpl.hpp b/src/SFML/Window/Android/CursorImpl.hpp
index fe5f948..39c701f 100644
--- a/src/SFML/Window/Android/CursorImpl.hpp
+++ b/src/SFML/Window/Android/CursorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Android/InputImpl.cpp b/src/SFML/Window/Android/InputImpl.cpp
index 9da3a13..12d2430 100644
--- a/src/SFML/Window/Android/InputImpl.cpp
+++ b/src/SFML/Window/Android/InputImpl.cpp
@@ -37,39 +37,62 @@ namespace sf
namespace priv
{
////////////////////////////////////////////////////////////
-bool InputImpl::isKeyPressed(Keyboard::Key key)
+bool InputImpl::isKeyPressed(Keyboard::Key /* key */)
{
// Not applicable
return false;
}
+bool InputImpl::isKeyPressed(Keyboard::Scancode /* codes */)
+{
+ // Not applicable
+ return false;
+}
+
+Keyboard::Key InputImpl::localize(Keyboard::Scancode /* code */)
+{
+ // Not applicable
+ return Keyboard::Unknown;
+}
+
+Keyboard::Scancode InputImpl::delocalize(Keyboard::Key /* key */)
+{
+ // Not applicable
+ return Keyboard::Scan::Unknown;
+}
+
+String InputImpl::getDescription(Keyboard::Scancode /* code */)
+{
+ // Not applicable
+ return "";
+}
+
////////////////////////////////////////////////////////////
void InputImpl::setVirtualKeyboardVisible(bool visible)
{
// todo: Check if the window is active
- ActivityStates* states = getActivity(NULL);
- Lock lock(states->mutex);
+ ActivityStates& states = getActivity();
+ Lock lock(states.mutex);
// Initializes JNI
- jint lResult;
jint lFlags = 0;
- JavaVM* lJavaVM = states->activity->vm;
- JNIEnv* lJNIEnv = states->activity->env;
+ JavaVM* lJavaVM = states.activity->vm;
+ JNIEnv* lJNIEnv = states.activity->env;
JavaVMAttachArgs lJavaVMAttachArgs;
lJavaVMAttachArgs.version = JNI_VERSION_1_6;
lJavaVMAttachArgs.name = "NativeThread";
lJavaVMAttachArgs.group = NULL;
- lResult=lJavaVM->AttachCurrentThread(&lJNIEnv, &lJavaVMAttachArgs);
+ jint lResult = lJavaVM->AttachCurrentThread(&lJNIEnv, &lJavaVMAttachArgs);
if (lResult == JNI_ERR)
err() << "Failed to initialize JNI, couldn't switch the keyboard visibility" << std::endl;
// Retrieves NativeActivity
- jobject lNativeActivity = states->activity->clazz;
+ jobject lNativeActivity = states.activity->clazz;
jclass ClassNativeActivity = lJNIEnv->GetObjectClass(lNativeActivity);
// Retrieves Context.INPUT_METHOD_SERVICE
@@ -105,7 +128,7 @@ void InputImpl::setVirtualKeyboardVisible(bool visible)
// Runs lInputMethodManager.showSoftInput(...)
jmethodID MethodShowSoftInput = lJNIEnv->GetMethodID(ClassInputMethodManager,
"showSoftInput", "(Landroid/view/View;I)Z");
- jboolean lResult = lJNIEnv->CallBooleanMethod(lInputMethodManager,
+ lJNIEnv->CallBooleanMethod(lInputMethodManager,
MethodShowSoftInput, lDecorView, lFlags);
}
else
@@ -121,7 +144,7 @@ void InputImpl::setVirtualKeyboardVisible(bool visible)
// lInputMethodManager.hideSoftInput(...)
jmethodID MethodHideSoftInput = lJNIEnv->GetMethodID(ClassInputMethodManager,
"hideSoftInputFromWindow", "(Landroid/os/IBinder;I)Z");
- jboolean lRes = lJNIEnv->CallBooleanMethod(lInputMethodManager,
+ lJNIEnv->CallBooleanMethod(lInputMethodManager,
MethodHideSoftInput, lBinder, lFlags);
lJNIEnv->DeleteLocalRef(lBinder);
}
@@ -138,10 +161,10 @@ bool InputImpl::isMouseButtonPressed(Mouse::Button button)
{
ALooper_pollAll(0, NULL, NULL, NULL);
- priv::ActivityStates* states = priv::getActivity(NULL);
- Lock lock(states->mutex);
+ priv::ActivityStates& states = priv::getActivity();
+ Lock lock(states.mutex);
- return states->isButtonPressed[button];
+ return states.isButtonPressed[button];
}
@@ -150,29 +173,29 @@ Vector2i InputImpl::getMousePosition()
{
ALooper_pollAll(0, NULL, NULL, NULL);
- priv::ActivityStates* states = priv::getActivity(NULL);
- Lock lock(states->mutex);
+ priv::ActivityStates& states = priv::getActivity();
+ Lock lock(states.mutex);
- return states->mousePosition;
+ return states.mousePosition;
}
////////////////////////////////////////////////////////////
-Vector2i InputImpl::getMousePosition(const Window& relativeTo)
+Vector2i InputImpl::getMousePosition(const WindowBase& /* relativeTo */)
{
return getMousePosition();
}
////////////////////////////////////////////////////////////
-void InputImpl::setMousePosition(const Vector2i& position)
+void InputImpl::setMousePosition(const Vector2i& /* position */)
{
// Injecting events is impossible on Android
}
////////////////////////////////////////////////////////////
-void InputImpl::setMousePosition(const Vector2i& position, const Window& relativeTo)
+void InputImpl::setMousePosition(const Vector2i& position, const WindowBase& /* relativeTo */)
{
setMousePosition(position);
}
@@ -183,10 +206,10 @@ bool InputImpl::isTouchDown(unsigned int finger)
{
ALooper_pollAll(0, NULL, NULL, NULL);
- priv::ActivityStates* states = priv::getActivity(NULL);
- Lock lock(states->mutex);
+ priv::ActivityStates& states = priv::getActivity();
+ Lock lock(states.mutex);
- return states->touchEvents.find(finger) != states->touchEvents.end();
+ return states.touchEvents.find(static_cast<int>(finger)) != states.touchEvents.end();
}
@@ -195,15 +218,15 @@ Vector2i InputImpl::getTouchPosition(unsigned int finger)
{
ALooper_pollAll(0, NULL, NULL, NULL);
- priv::ActivityStates* states = priv::getActivity(NULL);
- Lock lock(states->mutex);
+ priv::ActivityStates& states = priv::getActivity();
+ Lock lock(states.mutex);
- return states->touchEvents.find(finger)->second;
+ return states.touchEvents.find(static_cast<int>(finger))->second;
}
////////////////////////////////////////////////////////////
-Vector2i InputImpl::getTouchPosition(unsigned int finger, const Window& relativeTo)
+Vector2i InputImpl::getTouchPosition(unsigned int finger, const WindowBase& /* relativeTo */)
{
return getTouchPosition(finger);
}
diff --git a/src/SFML/Window/Android/InputImpl.hpp b/src/SFML/Window/Android/InputImpl.hpp
index 37167b5..ae6ee5a 100644
--- a/src/SFML/Window/Android/InputImpl.hpp
+++ b/src/SFML/Window/Android/InputImpl.hpp
@@ -45,19 +45,37 @@ class InputImpl
public:
////////////////////////////////////////////////////////////
- /// \brief Check if a key is pressed
+ /// \copydoc sf::Keyboard::isKeyPressed(Key)
///
- /// \param key Key to check
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::isKeyPressed(Scancode)
///
- /// \return True if the key is pressed, false otherwise
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::localize
///
////////////////////////////////////////////////////////////
- static bool isKeyPressed(Keyboard::Key key);
+ static Keyboard::Key localize(Keyboard::Scancode code);
////////////////////////////////////////////////////////////
- /// \brief Show or hide the virtual keyboard
+ /// \copydoc sf::Keyboard::delocalize
///
- /// \param visible True to show, false to hide
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Scancode delocalize(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::getDescription
+ ///
+ ////////////////////////////////////////////////////////////
+ static String getDescription(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::setVirtualKeyboardVisible
///
////////////////////////////////////////////////////////////
static void setVirtualKeyboardVisible(bool visible);
@@ -95,7 +113,7 @@ public:
/// \return Current position of the mouse
///
////////////////////////////////////////////////////////////
- static Vector2i getMousePosition(const Window& relativeTo);
+ static Vector2i getMousePosition(const WindowBase& relativeTo);
////////////////////////////////////////////////////////////
/// \brief Set the current position of the mouse in desktop coordinates
@@ -120,7 +138,7 @@ public:
/// \param relativeTo Reference window
///
////////////////////////////////////////////////////////////
- static void setMousePosition(const Vector2i& position, const Window& relativeTo);
+ static void setMousePosition(const Vector2i& position, const WindowBase& relativeTo);
////////////////////////////////////////////////////////////
/// \brief Check if a touch event is currently down
@@ -157,7 +175,7 @@ public:
/// \return Current position of \a finger, or undefined if it's not down
///
////////////////////////////////////////////////////////////
- static Vector2i getTouchPosition(unsigned int finger, const Window& relativeTo);
+ static Vector2i getTouchPosition(unsigned int finger, const WindowBase& relativeTo);
};
} // namespace priv
diff --git a/src/SFML/Window/Android/JoystickImpl.cpp b/src/SFML/Window/Android/JoystickImpl.cpp
index 58dfc82..802e6f8 100644
--- a/src/SFML/Window/Android/JoystickImpl.cpp
+++ b/src/SFML/Window/Android/JoystickImpl.cpp
@@ -48,7 +48,7 @@ void JoystickImpl::cleanup()
////////////////////////////////////////////////////////////
-bool JoystickImpl::isConnected(unsigned int index)
+bool JoystickImpl::isConnected(unsigned int /* index */)
{
// To implement
return false;
@@ -56,7 +56,7 @@ bool JoystickImpl::isConnected(unsigned int index)
////////////////////////////////////////////////////////////
-bool JoystickImpl::open(unsigned int index)
+bool JoystickImpl::open(unsigned int /* index */)
{
// To implement
return false;
diff --git a/src/SFML/Window/Android/JoystickImpl.hpp b/src/SFML/Window/Android/JoystickImpl.hpp
index 2fb8cd3..bad9932 100644
--- a/src/SFML/Window/Android/JoystickImpl.hpp
+++ b/src/SFML/Window/Android/JoystickImpl.hpp
@@ -105,7 +105,6 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- int m_index; ///< Index of the joystick
Joystick::Identification m_identification; ///< Joystick identification
};
diff --git a/src/SFML/Window/Android/SensorImpl.cpp b/src/SFML/Window/Android/SensorImpl.cpp
index 3a018b5..8f6c880 100644
--- a/src/SFML/Window/Android/SensorImpl.cpp
+++ b/src/SFML/Window/Android/SensorImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,6 +29,12 @@
#include <SFML/System/Time.hpp>
#include <android/looper.h>
+#if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
// Define missing constants
#define ASENSOR_TYPE_GRAVITY 0x00000009
#define ASENSOR_TYPE_LINEAR_ACCELERATION 0x0000000a
@@ -54,7 +60,11 @@ void SensorImpl::initialize()
looper = ALooper_forThread();
// Get the unique sensor manager
- sensorManager = ASensorManager_getInstance();
+ #if ANDROID_API >= 26 || __ANDROID_API__ >= 26
+ sensorManager = ASensorManager_getInstanceForPackage(nullptr);
+ #else
+ sensorManager = ASensorManager_getInstance();
+ #endif
// Create the sensor events queue and attach it to the looper
sensorEventQueue = ASensorManager_createEventQueue(sensorManager, looper,
@@ -93,7 +103,7 @@ bool SensorImpl::open(Sensor::Type sensor)
Time minimumDelay = microseconds(ASensor_getMinDelay(m_sensor));
// Set the event rate (not to consume too much battery)
- ASensorEventQueue_setEventRate(sensorEventQueue, m_sensor, minimumDelay.asMicroseconds());
+ ASensorEventQueue_setEventRate(sensorEventQueue, m_sensor, static_cast<Int32>(minimumDelay.asMicroseconds()));
// Save the index of the sensor
m_index = static_cast<unsigned int>(sensor);
@@ -145,7 +155,7 @@ ASensor const* SensorImpl::getDefaultSensor(Sensor::Type sensor)
////////////////////////////////////////////////////////////
-int SensorImpl::processSensorEvents(int fd, int events, void* data)
+int SensorImpl::processSensorEvents(int /* fd */, int /* events */, void* /* sensorData */)
{
ASensorEvent event;
diff --git a/src/SFML/Window/Android/SensorImpl.hpp b/src/SFML/Window/Android/SensorImpl.hpp
index 4ce19a4..37bf011 100644
--- a/src/SFML/Window/Android/SensorImpl.hpp
+++ b/src/SFML/Window/Android/SensorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Android/VideoModeImpl.cpp b/src/SFML/Window/Android/VideoModeImpl.cpp
index d9c171c..71535a4 100644
--- a/src/SFML/Window/Android/VideoModeImpl.cpp
+++ b/src/SFML/Window/Android/VideoModeImpl.cpp
@@ -52,10 +52,10 @@ std::vector<VideoMode> VideoModeImpl::getFullscreenModes()
VideoMode VideoModeImpl::getDesktopMode()
{
// Get the activity states
- priv::ActivityStates* states = priv::getActivity(NULL);
- Lock lock(states->mutex);
+ priv::ActivityStates& states = priv::getActivity();
+ Lock lock(states.mutex);
- return VideoMode(states->screenSize.x, states->screenSize.y);
+ return VideoMode(static_cast<unsigned int>(states.screenSize.x), static_cast<unsigned int>(states.screenSize.y));
}
} // namespace priv
diff --git a/src/SFML/Window/Android/WindowImplAndroid.cpp b/src/SFML/Window/Android/WindowImplAndroid.cpp
index 40992a0..6455be1 100644
--- a/src/SFML/Window/Android/WindowImplAndroid.cpp
+++ b/src/SFML/Window/Android/WindowImplAndroid.cpp
@@ -49,7 +49,7 @@ namespace priv
WindowImplAndroid* WindowImplAndroid::singleInstance = NULL;
////////////////////////////////////////////////////////////
-WindowImplAndroid::WindowImplAndroid(WindowHandle handle)
+WindowImplAndroid::WindowImplAndroid(WindowHandle /* handle */)
: m_size(0, 0)
, m_windowBeingCreated(false)
, m_windowBeingDestroyed(false)
@@ -59,41 +59,42 @@ WindowImplAndroid::WindowImplAndroid(WindowHandle handle)
////////////////////////////////////////////////////////////
-WindowImplAndroid::WindowImplAndroid(VideoMode mode, const String& title, unsigned long style, const ContextSettings& settings)
+WindowImplAndroid::WindowImplAndroid(VideoMode mode, const String& /* title */, unsigned long style, const ContextSettings& /* settings */)
: m_size(mode.width, mode.height)
, m_windowBeingCreated(false)
, m_windowBeingDestroyed(false)
, m_hasFocus(false)
{
- ActivityStates* states = getActivity(NULL);
- Lock lock(states->mutex);
+ priv::ActivityStates& states = priv::getActivity();
+ Lock lock(states.mutex);
if (style& Style::Fullscreen)
- states->fullscreen = true;
+ states.fullscreen = true;
WindowImplAndroid::singleInstance = this;
- states->forwardEvent = forwardEvent;
+ states.forwardEvent = forwardEvent;
// Register process event callback
- states->processEvent = processEvent;
+ states.processEvent = processEvent;
- states->initialized = true;
+ states.initialized = true;
}
////////////////////////////////////////////////////////////
WindowImplAndroid::~WindowImplAndroid()
{
+ WindowImplAndroid::singleInstance = NULL;
}
////////////////////////////////////////////////////////////
WindowHandle WindowImplAndroid::getSystemHandle() const
{
- ActivityStates* states = getActivity(NULL);
- Lock lock(states->mutex);
+ ActivityStates& states = getActivity();
+ Lock lock(states.mutex);
- return states->window;
+ return states.window;
}
@@ -103,22 +104,22 @@ void WindowImplAndroid::processEvents()
// Process incoming OS events
ALooper_pollAll(0, NULL, NULL, NULL);
- ActivityStates* states = getActivity(NULL);
- sf::Lock lock(states->mutex);
+ ActivityStates& states = getActivity();
+ Lock lock(states.mutex);
if (m_windowBeingCreated)
{
- states->context->createSurface(states->window);
+ states.context->createSurface(states.window);
m_windowBeingCreated = false;
}
if (m_windowBeingDestroyed)
{
- states->context->destroySurface();
+ states.context->destroySurface();
m_windowBeingDestroyed = false;
}
- states->updated = true;
+ states.updated = true;
}
@@ -131,7 +132,7 @@ Vector2i WindowImplAndroid::getPosition() const
////////////////////////////////////////////////////////////
-void WindowImplAndroid::setPosition(const Vector2i& position)
+void WindowImplAndroid::setPosition(const Vector2i& /* position */)
{
// Not applicable
}
@@ -145,55 +146,55 @@ Vector2u WindowImplAndroid::getSize() const
////////////////////////////////////////////////////////////
-void WindowImplAndroid::setSize(const Vector2u& size)
+void WindowImplAndroid::setSize(const Vector2u& /* size */)
{
}
////////////////////////////////////////////////////////////
-void WindowImplAndroid::setTitle(const String& title)
+void WindowImplAndroid::setTitle(const String& /* title */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplAndroid::setIcon(unsigned int width, unsigned int height, const Uint8* pixels)
+void WindowImplAndroid::setIcon(unsigned int /* width */, unsigned int /* height */, const Uint8* /* pixels */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplAndroid::setVisible(bool visible)
+void WindowImplAndroid::setVisible(bool /* visible */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplAndroid::setMouseCursorVisible(bool visible)
+void WindowImplAndroid::setMouseCursorVisible(bool /* visible */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplAndroid::setMouseCursorGrabbed(bool grabbed)
+void WindowImplAndroid::setMouseCursorGrabbed(bool /* grabbed */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplAndroid::setMouseCursor(const CursorImpl& cursor)
+void WindowImplAndroid::setMouseCursor(const CursorImpl& /* cursor */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplAndroid::setKeyRepeatEnabled(bool enabled)
+void WindowImplAndroid::setKeyRepeatEnabled(bool /* enabled */)
{
// Not applicable
}
@@ -216,36 +217,39 @@ bool WindowImplAndroid::hasFocus() const
////////////////////////////////////////////////////////////
void WindowImplAndroid::forwardEvent(const Event& event)
{
- ActivityStates* states = getActivity(NULL);
-
- if (event.type == Event::GainedFocus)
- {
- WindowImplAndroid::singleInstance->m_size.x = ANativeWindow_getWidth(states->window);
- WindowImplAndroid::singleInstance->m_size.y = ANativeWindow_getHeight(states->window);
- WindowImplAndroid::singleInstance->m_windowBeingCreated = true;
- WindowImplAndroid::singleInstance->m_hasFocus = true;
- }
- else if (event.type == Event::LostFocus)
+ if (WindowImplAndroid::singleInstance != NULL)
{
- WindowImplAndroid::singleInstance->m_windowBeingDestroyed = true;
- WindowImplAndroid::singleInstance->m_hasFocus = false;
- }
+ ActivityStates& states = getActivity();
+
+ if (event.type == Event::GainedFocus)
+ {
+ WindowImplAndroid::singleInstance->m_size.x = static_cast<unsigned int>(ANativeWindow_getWidth(states.window));
+ WindowImplAndroid::singleInstance->m_size.y = static_cast<unsigned int>(ANativeWindow_getHeight(states.window));
+ WindowImplAndroid::singleInstance->m_windowBeingCreated = true;
+ WindowImplAndroid::singleInstance->m_hasFocus = true;
+ }
+ else if (event.type == Event::LostFocus)
+ {
+ WindowImplAndroid::singleInstance->m_windowBeingDestroyed = true;
+ WindowImplAndroid::singleInstance->m_hasFocus = false;
+ }
- WindowImplAndroid::singleInstance->pushEvent(event);
+ WindowImplAndroid::singleInstance->pushEvent(event);
+ }
}
////////////////////////////////////////////////////////////
-int WindowImplAndroid::processEvent(int fd, int events, void* data)
+int WindowImplAndroid::processEvent(int /* fd */, int /* events */, void* /* data */)
{
- ActivityStates* states = getActivity(NULL);
- Lock lock(states->mutex);
+ ActivityStates& states = getActivity();
+ Lock lock(states.mutex);
AInputEvent* _event = NULL;
- if (AInputQueue_getEvent(states->inputQueue, &_event) >= 0)
+ if (AInputQueue_getEvent(states.inputQueue, &_event) >= 0)
{
- if (AInputQueue_preDispatchEvent(states->inputQueue, _event))
+ if (AInputQueue_preDispatchEvent(states.inputQueue, _event))
return 1;
int handled = 0;
@@ -302,7 +306,7 @@ int WindowImplAndroid::processEvent(int fd, int events, void* data)
}
- AInputQueue_finishEvent(states->inputQueue, _event, handled);
+ AInputQueue_finishEvent(states.inputQueue, _event, handled);
}
return 1;
@@ -310,14 +314,13 @@ int WindowImplAndroid::processEvent(int fd, int events, void* data)
////////////////////////////////////////////////////////////
-int WindowImplAndroid::processScrollEvent(AInputEvent* _event, ActivityStates* states)
+int WindowImplAndroid::processScrollEvent(AInputEvent* _event, ActivityStates& states)
{
// Prepare the Java virtual machine
jint lResult;
- jint lFlags = 0;
- JavaVM* lJavaVM = states->activity->vm;
- JNIEnv* lJNIEnv = states->activity->env;
+ JavaVM* lJavaVM = states.activity->vm;
+ JNIEnv* lJNIEnv = states.activity->env;
JavaVMAttachArgs lJavaVMAttachArgs;
lJavaVMAttachArgs.version = JNI_VERSION_1_6;
@@ -332,23 +335,33 @@ int WindowImplAndroid::processScrollEvent(AInputEvent* _event, ActivityStates* s
}
// Retrieve everything we need to create this MotionEvent in Java
- jlong downTime = AMotionEvent_getDownTime(_event);
- jlong eventTime = AMotionEvent_getEventTime(_event);
- jint action = AMotionEvent_getAction(_event);
- jfloat x = AMotionEvent_getX(_event, 0);
- jfloat y = AMotionEvent_getY(_event, 0);
- jfloat pressure = AMotionEvent_getPressure(_event, 0);
- jfloat size = AMotionEvent_getSize(_event, 0);
- jint metaState = AMotionEvent_getMetaState(_event);
- jfloat xPrecision = AMotionEvent_getXPrecision(_event);
- jfloat yPrecision = AMotionEvent_getYPrecision(_event);
- jint deviceId = AInputEvent_getDeviceId(_event);
- jint edgeFlags = AMotionEvent_getEdgeFlags(_event);
+ Int64 downTime = AMotionEvent_getDownTime(_event);
+ Int64 eventTime = AMotionEvent_getEventTime(_event);
+ Int32 action = AMotionEvent_getAction(_event);
+ float x = AMotionEvent_getX(_event, 0);
+ float y = AMotionEvent_getY(_event, 0);
+ float pressure = AMotionEvent_getPressure(_event, 0);
+ float size = AMotionEvent_getSize(_event, 0);
+ Int32 metaState = AMotionEvent_getMetaState(_event);
+ float xPrecision = AMotionEvent_getXPrecision(_event);
+ float yPrecision = AMotionEvent_getYPrecision(_event);
+ Int32 deviceId = AInputEvent_getDeviceId(_event);
+ Int32 edgeFlags = AMotionEvent_getEdgeFlags(_event);
// Create the MotionEvent object in Java trough its static constructor obtain()
jclass ClassMotionEvent = lJNIEnv->FindClass("android/view/MotionEvent");
jmethodID StaticMethodObtain = lJNIEnv->GetStaticMethodID(ClassMotionEvent, "obtain", "(JJIFFFFIFFII)Landroid/view/MotionEvent;");
- jobject ObjectMotionEvent = lJNIEnv->CallStaticObjectMethod(ClassMotionEvent, StaticMethodObtain, downTime, eventTime, action, x, y, pressure, size, metaState, xPrecision, yPrecision, deviceId, edgeFlags);
+ // Note: C standard compatibility, varargs
+ // automatically promote floats to doubles
+ // even though the function signature declares float
+ jobject ObjectMotionEvent = lJNIEnv->CallStaticObjectMethod(
+ ClassMotionEvent, StaticMethodObtain, downTime,
+ eventTime, action, static_cast<double>(x),
+ static_cast<double>(y), static_cast<double>(pressure),
+ static_cast<double>(size), metaState,
+ static_cast<double>(xPrecision), static_cast<double>(yPrecision),
+ deviceId, edgeFlags
+ );
// Call its getAxisValue() method to get the delta value of our wheel move event
jmethodID MethodGetAxisValue = lJNIEnv->GetMethodID(ClassMotionEvent, "getAxisValue", "(I)F");
@@ -360,9 +373,9 @@ int WindowImplAndroid::processScrollEvent(AInputEvent* _event, ActivityStates* s
// Create and send our mouse wheel event
Event event;
event.type = Event::MouseWheelMoved;
- event.mouseWheel.delta = static_cast<double>(delta);
- event.mouseWheel.x = AMotionEvent_getX(_event, 0);
- event.mouseWheel.y = AMotionEvent_getY(_event, 0);
+ event.mouseWheel.delta = static_cast<int>(delta);
+ event.mouseWheel.x = static_cast<int>(AMotionEvent_getX(_event, 0));
+ event.mouseWheel.y = static_cast<int>(AMotionEvent_getY(_event, 0));
forwardEvent(event);
@@ -374,9 +387,8 @@ int WindowImplAndroid::processScrollEvent(AInputEvent* _event, ActivityStates* s
////////////////////////////////////////////////////////////
-int WindowImplAndroid::processKeyEvent(AInputEvent* _event, ActivityStates* states)
+int WindowImplAndroid::processKeyEvent(AInputEvent* _event, ActivityStates& /* states */)
{
- int32_t device = AInputEvent_getSource(_event);
int32_t action = AKeyEvent_getAction(_event);
int32_t key = AKeyEvent_getKeyCode(_event);
@@ -398,10 +410,10 @@ int WindowImplAndroid::processKeyEvent(AInputEvent* _event, ActivityStates* stat
event.type = Event::KeyReleased;
forwardEvent(event);
- if (int unicode = getUnicode(_event))
+ if (Uint32 unicode = static_cast<Uint32>(getUnicode(_event)))
{
event.type = Event::TextEntered;
- event.text.unicode = unicode;
+ event.text.unicode = static_cast<Uint32>(unicode);
forwardEvent(event);
}
return 1;
@@ -421,10 +433,10 @@ int WindowImplAndroid::processKeyEvent(AInputEvent* _event, ActivityStates* stat
// https://code.google.com/p/android/issues/detail?id=33998
return 0;
}
- else if (int unicode = getUnicode(_event)) // This is a repeated sequence
+ else if (Uint32 unicode = static_cast<Uint32>(getUnicode(_event))) // This is a repeated sequence
{
event.type = Event::TextEntered;
- event.text.unicode = unicode;
+ event.text.unicode = static_cast<Uint32>(unicode);
int32_t repeats = AKeyEvent_getRepeatCount(_event);
for (int32_t i = 0; i < repeats; ++i)
@@ -438,44 +450,43 @@ int WindowImplAndroid::processKeyEvent(AInputEvent* _event, ActivityStates* stat
////////////////////////////////////////////////////////////
-int WindowImplAndroid::processMotionEvent(AInputEvent* _event, ActivityStates* states)
+int WindowImplAndroid::processMotionEvent(AInputEvent* _event, ActivityStates& states)
{
int32_t device = AInputEvent_getSource(_event);
- int32_t action = AMotionEvent_getAction(_event);
Event event;
if (device == AINPUT_SOURCE_MOUSE)
event.type = Event::MouseMoved;
- else if (device & AINPUT_SOURCE_TOUCHSCREEN)
+ else if (static_cast<Uint32>(device) & AINPUT_SOURCE_TOUCHSCREEN)
event.type = Event::TouchMoved;
- int pointerCount = AMotionEvent_getPointerCount(_event);
+ size_t pointerCount = AMotionEvent_getPointerCount(_event);
- for (int p = 0; p < pointerCount; p++)
+ for (size_t p = 0; p < pointerCount; p++)
{
- int id = AMotionEvent_getPointerId(_event, p);
+ int32_t id = AMotionEvent_getPointerId(_event, p);
- float x = AMotionEvent_getX(_event, p);
- float y = AMotionEvent_getY(_event, p);
+ int x = static_cast<int>(AMotionEvent_getX(_event, p));
+ int y = static_cast<int>(AMotionEvent_getY(_event, p));
if (device == AINPUT_SOURCE_MOUSE)
{
event.mouseMove.x = x;
event.mouseMove.y = y;
- states->mousePosition = Vector2i(event.mouseMove.x, event.mouseMove.y);
+ states.mousePosition = Vector2i(event.mouseMove.x, event.mouseMove.y);
}
- else if (device & AINPUT_SOURCE_TOUCHSCREEN)
+ else if (static_cast<Uint32>(device) & AINPUT_SOURCE_TOUCHSCREEN)
{
- if (states->touchEvents[id].x == x && states->touchEvents[id].y == y)
+ if (states.touchEvents[id].x == x && states.touchEvents[id].y == y)
continue;
- event.touch.finger = id;
+ event.touch.finger = static_cast<unsigned int>(id);
event.touch.x = x;
event.touch.y = y;
- states->touchEvents[id] = Vector2i(event.touch.x, event.touch.y);
+ states.touchEvents[id] = Vector2i(event.touch.x, event.touch.y);
}
forwardEvent(event);
@@ -485,16 +496,16 @@ int WindowImplAndroid::processMotionEvent(AInputEvent* _event, ActivityStates* s
////////////////////////////////////////////////////////////
-int WindowImplAndroid::processPointerEvent(bool isDown, AInputEvent* _event, ActivityStates* states)
+int WindowImplAndroid::processPointerEvent(bool isDown, AInputEvent* _event, ActivityStates& states)
{
int32_t device = AInputEvent_getSource(_event);
int32_t action = AMotionEvent_getAction(_event);
- int index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
- int id = AMotionEvent_getPointerId(_event, index);
+ size_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+ int32_t id = AMotionEvent_getPointerId(_event, index);
- float x = AMotionEvent_getX(_event, index);
- float y = AMotionEvent_getY(_event, index);
+ int x = static_cast<int>(AMotionEvent_getX(_event, index));
+ int y = static_cast<int>(AMotionEvent_getY(_event, index));
Event event;
@@ -508,16 +519,16 @@ int WindowImplAndroid::processPointerEvent(bool isDown, AInputEvent* _event, Act
event.mouseButton.y = y;
if (id >= 0 && id < Mouse::ButtonCount)
- states->isButtonPressed[id] = true;
+ states.isButtonPressed[id] = true;
}
- else if (device & AINPUT_SOURCE_TOUCHSCREEN)
+ else if (static_cast<unsigned int>(device) & AINPUT_SOURCE_TOUCHSCREEN)
{
event.type = Event::TouchBegan;
- event.touch.finger = id;
+ event.touch.finger = static_cast<unsigned int>(id);
event.touch.x = x;
event.touch.y = y;
- states->touchEvents[id] = Vector2i(event.touch.x, event.touch.y);
+ states.touchEvents[id] = Vector2i(event.touch.x, event.touch.y);
}
}
else
@@ -530,16 +541,16 @@ int WindowImplAndroid::processPointerEvent(bool isDown, AInputEvent* _event, Act
event.mouseButton.y = y;
if (id >= 0 && id < Mouse::ButtonCount)
- states->isButtonPressed[id] = false;
+ states.isButtonPressed[id] = false;
}
- else if (device & AINPUT_SOURCE_TOUCHSCREEN)
+ else if (static_cast<Uint32>(device) & AINPUT_SOURCE_TOUCHSCREEN)
{
event.type = Event::TouchEnded;
- event.touch.finger = id;
+ event.touch.finger = static_cast<unsigned int>(id);
event.touch.x = x;
event.touch.y = y;
- states->touchEvents.erase(id);
+ states.touchEvents.erase(id);
}
}
@@ -622,7 +633,7 @@ Keyboard::Key WindowImplAndroid::androidKeyToSF(int32_t key)
case AKEYCODE_ENTER: return Keyboard::Enter;
case AKEYCODE_DEL: return Keyboard::Backspace;
case AKEYCODE_FORWARD_DEL: return Keyboard::Delete;
- case AKEYCODE_GRAVE: return Keyboard::Tilde;
+ case AKEYCODE_GRAVE: return Keyboard::Grave;
case AKEYCODE_MINUS: return Keyboard::Subtract;
case AKEYCODE_EQUALS: return Keyboard::Equal;
case AKEYCODE_LEFT_BRACKET: return Keyboard::LBracket;
@@ -664,7 +675,8 @@ Keyboard::Key WindowImplAndroid::androidKeyToSF(int32_t key)
case AKEYCODE_BUTTON_THUMBR:
case AKEYCODE_BUTTON_START:
case AKEYCODE_BUTTON_SELECT:
- case AKEYCODE_BUTTON_MODE: return Keyboard::Unknown;
+ case AKEYCODE_BUTTON_MODE:
+ default: return Keyboard::Unknown;
}
}
@@ -673,15 +685,14 @@ Keyboard::Key WindowImplAndroid::androidKeyToSF(int32_t key)
int WindowImplAndroid::getUnicode(AInputEvent* event)
{
// Retrieve activity states
- ActivityStates* states = getActivity(NULL);
- Lock lock(states->mutex);
+ ActivityStates& states = getActivity();
+ Lock lock(states.mutex);
// Initializes JNI
jint lResult;
- jint lFlags = 0;
- JavaVM* lJavaVM = states->activity->vm;
- JNIEnv* lJNIEnv = states->activity->env;
+ JavaVM* lJavaVM = states.activity->vm;
+ JNIEnv* lJNIEnv = states.activity->env;
JavaVMAttachArgs lJavaVMAttachArgs;
lJavaVMAttachArgs.version = JNI_VERSION_1_6;
diff --git a/src/SFML/Window/Android/WindowImplAndroid.hpp b/src/SFML/Window/Android/WindowImplAndroid.hpp
index 7636144..8215505 100644
--- a/src/SFML/Window/Android/WindowImplAndroid.hpp
+++ b/src/SFML/Window/Android/WindowImplAndroid.hpp
@@ -210,10 +210,10 @@ private:
////////////////////////////////////////////////////////////
static int processEvent(int fd, int events, void* data);
- static int processScrollEvent(AInputEvent* _event, ActivityStates* states);
- static int processKeyEvent(AInputEvent* _event, ActivityStates* states);
- static int processMotionEvent(AInputEvent* _event, ActivityStates* states);
- static int processPointerEvent(bool isDown, AInputEvent* event, ActivityStates* states);
+ static int processScrollEvent(AInputEvent* _event, ActivityStates& states);
+ static int processKeyEvent(AInputEvent* _event, ActivityStates& states);
+ static int processMotionEvent(AInputEvent* _event, ActivityStates& states);
+ static int processPointerEvent(bool isDown, AInputEvent* event, ActivityStates& states);
////////////////////////////////////////////////////////////
/// \brief Convert a Android key to SFML key code
diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt
index 98ea439..57e47a2 100644
--- a/src/SFML/Window/CMakeLists.txt
+++ b/src/SFML/Window/CMakeLists.txt
@@ -39,19 +39,17 @@ set(SRC
${SRCROOT}/VideoMode.cpp
${INCROOT}/VideoMode.hpp
${SRCROOT}/VideoModeImpl.hpp
+ ${SRCROOT}/Vulkan.cpp
+ ${INCROOT}/Vulkan.hpp
${SRCROOT}/Window.cpp
${INCROOT}/Window.hpp
+ ${SRCROOT}/WindowBase.cpp
+ ${INCROOT}/WindowBase.hpp
${INCROOT}/WindowHandle.hpp
${SRCROOT}/WindowImpl.cpp
${SRCROOT}/WindowImpl.hpp
${INCROOT}/WindowStyle.hpp
)
-if(SFML_OPENGL_ES AND NOT SFML_OS_IOS)
- list(APPEND SRC ${SRCROOT}/EGLCheck.cpp)
- list(APPEND SRC ${SRCROOT}/EGLCheck.hpp)
- list(APPEND SRC ${SRCROOT}/EglContext.cpp)
- list(APPEND SRC ${SRCROOT}/EglContext.hpp)
-endif()
source_group("" FILES ${SRC})
# add platform specific sources
@@ -61,10 +59,6 @@ if(SFML_OS_WINDOWS)
${SRCROOT}/Win32/CursorImpl.cpp
${SRCROOT}/Win32/ClipboardImpl.hpp
${SRCROOT}/Win32/ClipboardImpl.cpp
- ${SRCROOT}/Win32/WglContext.cpp
- ${SRCROOT}/Win32/WglContext.hpp
- ${SRCROOT}/Win32/WglExtensions.cpp
- ${SRCROOT}/Win32/WglExtensions.hpp
${SRCROOT}/Win32/InputImpl.cpp
${SRCROOT}/Win32/InputImpl.hpp
${SRCROOT}/Win32/JoystickImpl.cpp
@@ -72,37 +66,89 @@ if(SFML_OS_WINDOWS)
${SRCROOT}/Win32/SensorImpl.hpp
${SRCROOT}/Win32/SensorImpl.cpp
${SRCROOT}/Win32/VideoModeImpl.cpp
+ ${SRCROOT}/Win32/VulkanImplWin32.cpp
+ ${SRCROOT}/Win32/VulkanImplWin32.hpp
${SRCROOT}/Win32/WindowImplWin32.cpp
${SRCROOT}/Win32/WindowImplWin32.hpp
)
+ if(SFML_OPENGL_ES)
+ set(PLATFORM_SRC
+ ${PLATFORM_SRC}
+ ${SRCROOT}/EGLCheck.cpp
+ ${SRCROOT}/EGLCheck.hpp
+ ${SRCROOT}/EglContext.cpp
+ ${SRCROOT}/EglContext.hpp
+ )
+ else()
+ set(PLATFORM_SRC
+ ${PLATFORM_SRC}
+ ${SRCROOT}/Win32/WglContext.cpp
+ ${SRCROOT}/Win32/WglContext.hpp
+ )
+ endif()
source_group("windows" FILES ${PLATFORM_SRC})
# make sure that we use the Unicode version of the Win API functions
add_definitions(-DUNICODE -D_UNICODE)
-elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD)
- set(PLATFORM_SRC
- ${SRCROOT}/Unix/CursorImpl.hpp
- ${SRCROOT}/Unix/CursorImpl.cpp
- ${SRCROOT}/Unix/ClipboardImpl.hpp
- ${SRCROOT}/Unix/ClipboardImpl.cpp
- ${SRCROOT}/Unix/Display.cpp
- ${SRCROOT}/Unix/Display.hpp
- ${SRCROOT}/Unix/InputImpl.cpp
- ${SRCROOT}/Unix/InputImpl.hpp
- ${SRCROOT}/Unix/SensorImpl.cpp
- ${SRCROOT}/Unix/SensorImpl.hpp
- ${SRCROOT}/Unix/VideoModeImpl.cpp
- ${SRCROOT}/Unix/WindowImplX11.cpp
- ${SRCROOT}/Unix/WindowImplX11.hpp
- )
- if(NOT SFML_OPENGL_ES)
+elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD OR SFML_OS_NETBSD)
+ if(SFML_USE_DRM)
+ add_definitions(-DSFML_USE_DRM)
set(PLATFORM_SRC
- ${PLATFORM_SRC}
- ${SRCROOT}/Unix/GlxContext.cpp
- ${SRCROOT}/Unix/GlxContext.hpp
- ${SRCROOT}/Unix/GlxExtensions.cpp
- ${SRCROOT}/Unix/GlxExtensions.hpp
+ ${SRCROOT}/EGLCheck.cpp
+ ${SRCROOT}/EGLCheck.hpp
+ ${SRCROOT}/DRM/CursorImpl.hpp
+ ${SRCROOT}/DRM/CursorImpl.cpp
+ ${SRCROOT}/DRM/ClipboardImpl.hpp
+ ${SRCROOT}/DRM/ClipboardImpl.cpp
+ ${SRCROOT}/Unix/SensorImpl.cpp
+ ${SRCROOT}/Unix/SensorImpl.hpp
+ ${SRCROOT}/DRM/InputImplUDev.cpp
+ ${SRCROOT}/DRM/InputImplUDev.hpp
+ ${SRCROOT}/DRM/VideoModeImpl.cpp
+ ${SRCROOT}/DRM/DRMContext.cpp
+ ${SRCROOT}/DRM/DRMContext.hpp
+ ${SRCROOT}/DRM/WindowImplDRM.cpp
+ ${SRCROOT}/DRM/WindowImplDRM.hpp
)
+ else()
+ set(PLATFORM_SRC
+ ${SRCROOT}/Unix/CursorImpl.hpp
+ ${SRCROOT}/Unix/CursorImpl.cpp
+ ${SRCROOT}/Unix/ClipboardImpl.hpp
+ ${SRCROOT}/Unix/ClipboardImpl.cpp
+ ${SRCROOT}/Unix/InputImpl.cpp
+ ${SRCROOT}/Unix/InputImpl.hpp
+ ${SRCROOT}/Unix/KeyboardImpl.hpp
+ ${SRCROOT}/Unix/KeyboardImpl.cpp
+ ${SRCROOT}/Unix/KeySymToKeyMapping.hpp
+ ${SRCROOT}/Unix/KeySymToKeyMapping.cpp
+ ${SRCROOT}/Unix/KeySymToUnicodeMapping.hpp
+ ${SRCROOT}/Unix/KeySymToUnicodeMapping.cpp
+ ${SRCROOT}/Unix/SensorImpl.cpp
+ ${SRCROOT}/Unix/SensorImpl.hpp
+ ${SRCROOT}/Unix/Display.cpp
+ ${SRCROOT}/Unix/Display.hpp
+ ${SRCROOT}/Unix/VideoModeImpl.cpp
+ ${SRCROOT}/Unix/VulkanImplX11.cpp
+ ${SRCROOT}/Unix/VulkanImplX11.hpp
+ ${SRCROOT}/Unix/WindowImplX11.cpp
+ ${SRCROOT}/Unix/WindowImplX11.hpp
+ )
+ if(SFML_OPENGL_ES)
+ set(PLATFORM_SRC
+ ${PLATFORM_SRC}
+ ${SRCROOT}/EGLCheck.cpp
+ ${SRCROOT}/EGLCheck.hpp
+ ${SRCROOT}/EglContext.cpp
+ ${SRCROOT}/EglContext.hpp
+ )
+ else()
+ set(PLATFORM_SRC
+ ${PLATFORM_SRC}
+ ${SRCROOT}/Unix/GlxContext.cpp
+ ${SRCROOT}/Unix/GlxContext.hpp
+ )
+ endif()
endif()
if(SFML_OS_LINUX)
set(PLATFORM_SRC
@@ -122,6 +168,12 @@ elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD)
${SRCROOT}/OpenBSD/JoystickImpl.cpp
${SRCROOT}/OpenBSD/JoystickImpl.hpp
)
+ elseif(SFML_OS_NETBSD)
+ set(PLATFORM_SRC
+ ${PLATFORM_SRC}
+ ${SRCROOT}/NetBSD/JoystickImpl.cpp
+ ${SRCROOT}/NetBSD/JoystickImpl.hpp
+ )
endif()
source_group("unix" FILES ${PLATFORM_SRC})
elseif(SFML_OS_MACOSX)
@@ -173,7 +225,7 @@ elseif(SFML_OS_MACOSX)
${SRCROOT}/OSX/WindowImplCocoa.hpp
${SRCROOT}/OSX/WindowImplCocoa.mm
${SRCROOT}/OSX/WindowImplDelegateProtocol.h
- ${SRCROOT}/OSX/AutoreleasePoolWrapper.h
+ ${SRCROOT}/OSX/AutoreleasePoolWrapper.hpp
${SRCROOT}/OSX/AutoreleasePoolWrapper.mm
)
source_group("mac" FILES ${PLATFORM_SRC})
@@ -207,6 +259,10 @@ elseif(SFML_OS_IOS)
source_group("ios" FILES ${PLATFORM_SRC})
elseif(SFML_OS_ANDROID)
set(PLATFORM_SRC
+ ${SRCROOT}/EGLCheck.cpp
+ ${SRCROOT}/EGLCheck.hpp
+ ${SRCROOT}/EglContext.cpp
+ ${SRCROOT}/EglContext.hpp
${SRCROOT}/Android/CursorImpl.hpp
${SRCROOT}/Android/CursorImpl.cpp
${SRCROOT}/Android/ClipboardImpl.hpp
@@ -227,18 +283,31 @@ endif()
# define the sfml-window target
sfml_add_library(sfml-window
SOURCES ${SRC} ${PLATFORM_SRC})
+# DRM libraries
+if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD OR SFML_OS_NETBSD)
+ if(SFML_USE_DRM)
+ sfml_find_package(DRM INCLUDE "DRM_INCLUDE_DIR" LINK "DRM_LIBRARY")
+ target_include_directories(sfml-window PRIVATE ${DRM_INCLUDE_DIR}/libdrm)
+ sfml_find_package(GBM INCLUDE "GBM_INCLUDE_DIR" LINK "GBM_LIBRARY")
+ target_link_libraries(sfml-window PRIVATE drm gbm EGL)
+ else()
+ sfml_find_package(X11 INCLUDE "X11_INCLUDE_DIR" LINK "X11_X11_LIB" "X11_Xrandr_LIB" "X11_Xcursor_LIB")
+ target_link_libraries(sfml-window PRIVATE X11)
+ endif()
+endif()
target_link_libraries(sfml-window PUBLIC sfml-system)
+# glad sources
+target_include_directories(sfml-window SYSTEM PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/glad/include")
+
# When static linking on macOS, we need to add this flag for objective C to work
if ((NOT BUILD_SHARED_LIBS) AND SFML_OS_MACOSX)
target_link_libraries(sfml-window PRIVATE -ObjC)
endif()
-# find and setup usage for external libraries
-if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OPENBSD)
- sfml_find_package(X11 INCLUDE "X11_INCLUDE_DIR" LINK "X11_X11_LIB" "X11_Xrandr_LIB")
- target_link_libraries(sfml-window PRIVATE X11)
-endif()
+# Vulkan headers
+find_package(Vulkan REQUIRED)
+target_link_libraries(sfml-window PRIVATE Vulkan::Vulkan)
# CMake 3.11 and later prefer to choose GLVND, but we choose legacy OpenGL for backward compability
# (unless the OpenGL_GL_PREFERENCE was explicitly set)
@@ -247,14 +316,17 @@ if ((NOT ${CMAKE_VERSION} VERSION_LESS 3.11) AND (NOT OpenGL_GL_PREFERENCE))
set(OpenGL_GL_PREFERENCE "LEGACY")
endif()
-if(SFML_OPENGL_ES)
- if(SFML_OS_IOS)
- target_link_libraries(sfml-window PRIVATE "-framework OpenGLES")
- elseif(SFML_OS_ANDROID)
- target_link_libraries(sfml-window PRIVATE EGL GLESv1_CM)
- endif()
+if(SFML_OS_IOS)
+ sfml_add_external(GLES LINK "-framework OpenGLES")
+
+ target_link_libraries(sfml-window PRIVATE GLES)
+elseif(SFML_OS_ANDROID)
+ sfml_find_package(GLES INCLUDE "GLES_INCLUDE_DIR" LINK "GLES_LIBRARY")
+ sfml_find_package(EGL INCLUDE "EGL_INCLUDE_DIR" LINK "EGL_LIBRARY")
+ target_link_libraries(sfml-window PRIVATE EGL)
+ target_link_libraries(sfml-window PRIVATE GLES)
else()
- sfml_find_package(OpenGL INCLUDE "OPENGL_INCLUDE_DIR" LINK "OPENGL_LIBRARIES")
+ sfml_find_package(OpenGL INCLUDE "OPENGL_INCLUDE_DIR" LINK "OPENGL_gl_LIBRARY")
target_link_libraries(sfml-window PRIVATE OpenGL)
endif()
@@ -266,15 +338,9 @@ if(SFML_OS_WINDOWS AND NOT SFML_COMPILER_MSVC)
endif()
endif()
-if(SFML_OPENGL_ES AND SFML_OS_LINUX)
- sfml_find_package(EGL INCLUDE "EGL_INCLUDE_DIR" LINK "EGL_LIBRARY")
- sfml_find_package(GLES INCLUDE "GLES_INCLUDE_DIR" LINK "GLES_LIBRARY")
- target_link_libraries(sfml-window PRIVATE EGL GLES)
-endif()
-
if(SFML_OS_LINUX)
sfml_find_package(UDev INCLUDE "UDEV_INCLUDE_DIR" LINK "UDEV_LIBRARIES")
- target_link_libraries(sfml-window PRIVATE UDev)
+ target_link_libraries(sfml-window PRIVATE UDev dl)
elseif(SFML_OS_WINDOWS)
target_link_libraries(sfml-window PRIVATE winmm gdi32)
elseif(SFML_OS_FREEBSD)
diff --git a/src/SFML/Window/Clipboard.cpp b/src/SFML/Window/Clipboard.cpp
index 9148c97..b70be3e 100644
--- a/src/SFML/Window/Clipboard.cpp
+++ b/src/SFML/Window/Clipboard.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/ClipboardImpl.hpp b/src/SFML/Window/ClipboardImpl.hpp
index 8e60d4e..42fc00e 100644
--- a/src/SFML/Window/ClipboardImpl.hpp
+++ b/src/SFML/Window/ClipboardImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -32,8 +32,12 @@
#if defined(SFML_SYSTEM_WINDOWS)
#include <SFML/Window/Win32/ClipboardImpl.hpp>
-#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD)
- #include <SFML/Window/Unix/ClipboardImpl.hpp>
+#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD)
+ #if defined(SFML_USE_DRM)
+ #include <SFML/Window/DRM/ClipboardImpl.hpp>
+ #else
+ #include <SFML/Window/Unix/ClipboardImpl.hpp>
+ #endif
#elif defined(SFML_SYSTEM_MACOS)
#include <SFML/Window/OSX/ClipboardImpl.hpp>
#elif defined(SFML_SYSTEM_IOS)
diff --git a/src/SFML/Window/Context.cpp b/src/SFML/Window/Context.cpp
index 4e0a4b8..3a58f3d 100644
--- a/src/SFML/Window/Context.cpp
+++ b/src/SFML/Window/Context.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -32,8 +32,12 @@
namespace
{
- // This per-thread variable holds the current context for each thread
- sf::ThreadLocalPtr<sf::Context> currentContext(NULL);
+ // A nested named namespace is used here to allow unity builds of SFML.
+ namespace ContextImpl
+ {
+ // This per-thread variable holds the current context for each thread
+ sf::ThreadLocalPtr<sf::Context> currentContext(NULL);
+ }
}
namespace sf
@@ -60,7 +64,7 @@ bool Context::setActive(bool active)
bool result = m_context->setActive(active);
if (result)
- currentContext = (active ? this : NULL);
+ ContextImpl::currentContext = (active ? this : NULL);
return result;
}
@@ -76,7 +80,13 @@ const ContextSettings& Context::getSettings() const
////////////////////////////////////////////////////////////
const Context* Context::getActiveContext()
{
- return currentContext;
+ using ContextImpl::currentContext;
+
+ // We have to check that the last activated sf::Context is still active (a RenderTarget activation may have deactivated it)
+ if (currentContext && currentContext->m_context == priv::GlContext::getActiveContext())
+ return currentContext;
+ else
+ return NULL;
}
diff --git a/src/SFML/Window/Cursor.cpp b/src/SFML/Window/Cursor.cpp
index c71491f..950d360 100644
--- a/src/SFML/Window/Cursor.cpp
+++ b/src/SFML/Window/Cursor.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/CursorImpl.hpp b/src/SFML/Window/CursorImpl.hpp
index d48220c..0c38373 100644
--- a/src/SFML/Window/CursorImpl.hpp
+++ b/src/SFML/Window/CursorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -31,25 +31,19 @@
#include <SFML/Config.hpp>
#if defined(SFML_SYSTEM_WINDOWS)
-
#include <SFML/Window/Win32/CursorImpl.hpp>
-
-#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD)
-
- #include <SFML/Window/Unix/CursorImpl.hpp>
-
+#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD)
+ #if defined(SFML_USE_DRM)
+ #include <SFML/Window/DRM/CursorImpl.hpp>
+ #else
+ #include <SFML/Window/Unix/CursorImpl.hpp>
+ #endif
#elif defined(SFML_SYSTEM_MACOS)
-
#include <SFML/Window/OSX/CursorImpl.hpp>
-
#elif defined(SFML_SYSTEM_IOS)
-
#include <SFML/Window/iOS/CursorImpl.hpp>
-
#elif defined(SFML_SYSTEM_ANDROID)
-
#include <SFML/Window/Android/CursorImpl.hpp>
-
#endif
diff --git a/src/SFML/Window/OSX/AutoreleasePoolWrapper.h b/src/SFML/Window/DRM/ClipboardImpl.cpp
index 020fa22..7981882 100644
--- a/src/SFML/Window/OSX/AutoreleasePoolWrapper.h
+++ b/src/SFML/Window/DRM/ClipboardImpl.cpp
@@ -1,8 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
-// Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -24,14 +23,27 @@
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
-/// \brief Ensure one autorelease pool is available on this thread
-///
+// Headers
////////////////////////////////////////////////////////////
-void ensureThreadHasPool(void);
+#include <SFML/Window/DRM/ClipboardImpl.hpp>
+namespace sf
+{
+namespace priv
+{
////////////////////////////////////////////////////////////
-/// \brief Drain the thread's pool but keep it alive
-///
+String ClipboardImpl::getString()
+{
+ return "";
+}
+
+
////////////////////////////////////////////////////////////
-void drainThreadPool(void);
+void ClipboardImpl::setString(const String& /*text*/)
+{
+}
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Window/DRM/ClipboardImpl.hpp b/src/SFML/Window/DRM/ClipboardImpl.hpp
new file mode 100644
index 0000000..e3e2b86
--- /dev/null
+++ b/src/SFML/Window/DRM/ClipboardImpl.hpp
@@ -0,0 +1,76 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_CLIPBOARDIMPLDRM_HPP
+#define SFML_CLIPBOARDIMPLDRM_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/System/String.hpp>
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+/// \brief Give access to the system clipboard
+///
+////////////////////////////////////////////////////////////
+class ClipboardImpl
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the content of the clipboard as string data
+ ///
+ /// This function returns the content of the clipboard
+ /// as a string. If the clipboard does not contain string
+ /// it returns an empty sf::String object.
+ ///
+ /// \return Current content of the clipboard
+ ///
+ ////////////////////////////////////////////////////////////
+ static String getString();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Set the content of the clipboard as string data
+ ///
+ /// This function sets the content of the clipboard as a
+ /// string.
+ ///
+ /// \param text sf::String object containing the data to be sent
+ /// to the clipboard
+ ///
+ ////////////////////////////////////////////////////////////
+ static void setString(const String& text);
+};
+
+} // namespace priv
+
+} // namespace sf
+
+
+#endif // SFML_CLIPBOARDIMPLDRM_HPP
diff --git a/src/SFML/Window/DRM/CursorImpl.cpp b/src/SFML/Window/DRM/CursorImpl.cpp
new file mode 100644
index 0000000..c57cee4
--- /dev/null
+++ b/src/SFML/Window/DRM/CursorImpl.cpp
@@ -0,0 +1,90 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/DRM/CursorImpl.hpp>
+#include <vector>
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+CursorImpl::CursorImpl()
+{
+}
+
+
+////////////////////////////////////////////////////////////
+CursorImpl::~CursorImpl()
+{
+}
+
+
+////////////////////////////////////////////////////////////
+bool CursorImpl::loadFromPixels(const Uint8* /*pixels*/, Vector2u /*size*/, Vector2u /*hotspot*/)
+{
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////
+bool CursorImpl::loadFromPixelsARGB(const Uint8* /*pixels*/, Vector2u /*size*/, Vector2u /*hotspot*/)
+{
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////
+bool CursorImpl::loadFromPixelsMonochrome(const Uint8* /*pixels*/, Vector2u /*size*/, Vector2u /*hotspot*/)
+{
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////
+bool CursorImpl::loadFromSystem(Cursor::Type /*type*/)
+{
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////
+bool CursorImpl::isColorCursorSupported()
+{
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////
+void CursorImpl::release()
+{
+}
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Window/DRM/CursorImpl.hpp b/src/SFML/Window/DRM/CursorImpl.hpp
new file mode 100644
index 0000000..fa736b9
--- /dev/null
+++ b/src/SFML/Window/DRM/CursorImpl.hpp
@@ -0,0 +1,119 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_CURSORIMPLDRM_HPP
+#define SFML_CURSORIMPLDRM_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Cursor.hpp>
+#include <SFML/System/NonCopyable.hpp>
+#include <SFML/System/Vector2.hpp>
+#include <SFML/Window/WindowStyle.hpp> // Prevent conflict with macro None from Xlib
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+/// \brief Unix implementation of Cursor
+///
+////////////////////////////////////////////////////////////
+class CursorImpl : NonCopyable
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Default constructor
+ ///
+ /// Refer to sf::Cursor::Cursor().
+ ///
+ ////////////////////////////////////////////////////////////
+ CursorImpl();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Destructor
+ ///
+ /// Refer to sf::Cursor::~Cursor().
+ ///
+ ////////////////////////////////////////////////////////////
+ ~CursorImpl();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a cursor with the provided image
+ ///
+ /// Refer to sf::Cursor::loadFromPixels().
+ ///
+ ////////////////////////////////////////////////////////////
+ bool loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a native system cursor
+ ///
+ /// Refer to sf::Cursor::loadFromSystem().
+ ///
+ ////////////////////////////////////////////////////////////
+ bool loadFromSystem(Cursor::Type type);
+
+private:
+
+ friend class WindowImplDRM;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Checks if colored cursors are supported for this display.
+ ///
+ ////////////////////////////////////////////////////////////
+ bool isColorCursorSupported();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a cursor with the provided image (ARGB support)
+ ///
+ /// Refer to sf::Cursor::loadFromPixels().
+ ///
+ ////////////////////////////////////////////////////////////
+ bool loadFromPixelsARGB(const Uint8* pixels, Vector2u size, Vector2u hotspot);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a cursor with the provided image (monochrome)
+ ///
+ /// Refer to sf::Cursor::loadFromPixels().
+ ///
+ ////////////////////////////////////////////////////////////
+ bool loadFromPixelsMonochrome(const Uint8* pixels, Vector2u size, Vector2u hotspot);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Release the cursor, if we have loaded one.
+ ///
+ ////////////////////////////////////////////////////////////
+ void release();
+};
+
+} // namespace priv
+
+} // namespace sf
+
+
+#endif // SFML_CUSROSIMPLDRM_HPP
diff --git a/src/SFML/Window/DRM/DRMContext.cpp b/src/SFML/Window/DRM/DRMContext.cpp
new file mode 100644
index 0000000..fa6d96d
--- /dev/null
+++ b/src/SFML/Window/DRM/DRMContext.cpp
@@ -0,0 +1,872 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2023 Andrew Mickelson
+// 2013 Jonathan De Wachter (dewachter.jonathan@gmail.com)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/DRM/DRMContext.hpp>
+#include <SFML/Window/DRM/WindowImplDRM.hpp>
+#include <SFML/System/Err.hpp>
+#include <SFML/System/Sleep.hpp>
+#include <cerrno>
+#include <cstdlib>
+#include <cstring>
+#include <fcntl.h>
+#include <poll.h>
+#include <unistd.h>
+#include <xf86drm.h>
+
+// We check for this definition in order to avoid multiple definitions of GLAD
+// entities during unity builds of SFML.
+#ifndef SF_GLAD_EGL_IMPLEMENTATION_INCLUDED
+#define SF_GLAD_EGL_IMPLEMENTATION_INCLUDED
+#define SF_GLAD_EGL_IMPLEMENTATION
+#include <glad/egl.h>
+#endif
+
+namespace
+{
+ struct DrmFb
+ {
+ gbm_bo* bo;
+ sf::Uint32 fbId;
+ };
+
+ bool initialized = false;
+ sf::priv::Drm drmNode;
+ drmEventContext drmEventCtx;
+ pollfd pollFD;
+ gbm_device* gbmDevice = NULL;
+ int contextCount = 0;
+ EGLDisplay display = EGL_NO_DISPLAY;
+ int waitingForFlip = 0;
+
+ static void pageFlipHandler(int fd, unsigned int frame,
+ unsigned int sec, unsigned int usec, void* data)
+ {
+ // suppress unused param warning
+ (void)fd, (void)frame, (void)sec, (void)usec;
+
+ int* temp = static_cast<int*>(data);
+ *temp = 0;
+ }
+
+ static bool waitForFlip(int timeout)
+ {
+ while (waitingForFlip)
+ {
+ pollFD.revents = 0;
+
+ if (poll(&pollFD, 1, timeout) < 0)
+ return false;
+
+ if (pollFD.revents & (POLLHUP | POLLERR))
+ return false;
+
+ if (pollFD.revents & POLLIN)
+ {
+ drmHandleEvent(drmNode.fileDescriptor, &drmEventCtx);
+ }
+ else
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ void cleanup()
+ {
+ if (!initialized)
+ return;
+
+ drmModeSetCrtc(drmNode.fileDescriptor,
+ drmNode.originalCrtc->crtc_id,
+ drmNode.originalCrtc->buffer_id,
+ drmNode.originalCrtc->x,
+ drmNode.originalCrtc->y,
+ &drmNode.connectorId,
+ 1,
+ &drmNode.originalCrtc->mode);
+
+ drmModeFreeConnector(drmNode.savedConnector);
+ drmModeFreeEncoder(drmNode.savedEncoder);
+ drmModeFreeCrtc(drmNode.originalCrtc);
+
+ eglTerminate(display);
+ display = EGL_NO_DISPLAY;
+
+ gbm_device_destroy(gbmDevice);
+ gbmDevice = NULL;
+
+ close(drmNode.fileDescriptor);
+
+ drmNode.fileDescriptor = -1;
+ drmNode.mode = 0;
+
+ std::memset(&pollFD, 0, sizeof(pollfd));
+ std::memset(&drmEventCtx, 0, sizeof(drmEventContext));
+
+ waitingForFlip = 0;
+
+ initialized = false;
+ }
+
+ void drmFbDestroyCallback(gbm_bo* bo, void* data)
+ {
+ int drmFd = gbm_device_get_fd(gbm_bo_get_device(bo));
+ DrmFb* fb = static_cast<DrmFb*>(data);
+
+ if (fb->fbId)
+ drmModeRmFB(drmFd, fb->fbId);
+
+ delete fb;
+ }
+
+ DrmFb* drmFbGetFromBo(gbm_bo& bo)
+ {
+ int drmFd = gbm_device_get_fd(gbm_bo_get_device(&bo));
+ DrmFb* fb = static_cast<DrmFb*>(gbm_bo_get_user_data(&bo));
+ if (fb)
+ return fb;
+
+ fb = new DrmFb();
+ fb->bo = &bo;
+
+ const sf::Uint32 width = gbm_bo_get_width(&bo);
+ const sf::Uint32 height = gbm_bo_get_height(&bo);
+ const sf::Uint32 format = gbm_bo_get_format(&bo);
+
+ sf::Uint32 strides[4] = {0};
+ sf::Uint32 handles[4] = {0};
+ sf::Uint32 offsets[4] = {0};
+ uint64_t modifiers[4] = {0};
+ modifiers[0] = gbm_bo_get_modifier(&bo);
+ const int num_planes = gbm_bo_get_plane_count(&bo);
+ for (int i = 0; i < num_planes; ++i)
+ {
+ strides[i] = gbm_bo_get_stride_for_plane(&bo, i);
+ handles[i] = gbm_bo_get_handle(&bo).u32;
+ offsets[i] = gbm_bo_get_offset(&bo, i);
+ modifiers[i] = modifiers[0];
+ }
+
+ sf::Uint32 flags = 0;
+ if (modifiers[0])
+ {
+ flags = DRM_MODE_FB_MODIFIERS;
+ }
+
+ int result = drmModeAddFB2WithModifiers(drmFd, width, height, format, handles, strides, offsets, modifiers, &fb->fbId, flags);
+
+ if (result)
+ {
+ std::memset(handles, 0, 16);
+ handles[0] = gbm_bo_get_handle(&bo).u32;
+ std::memset(strides, 0, 16);
+ strides[0] = gbm_bo_get_stride(&bo);
+ std::memset(offsets, 0, 16);
+ result = drmModeAddFB2(drmFd, width, height, format, handles, strides, offsets, &fb->fbId, 0);
+ }
+
+ if (result)
+ {
+ sf::err() << "Failed to create fb: " << std::strerror(errno) << std::endl;
+ delete fb;
+ return NULL;
+ }
+
+ gbm_bo_set_user_data(&bo, fb, drmFbDestroyCallback);
+
+ return fb;
+ }
+
+ sf::Uint32 findCrtcForEncoder(const drmModeRes& resources, const drmModeEncoder& encoder)
+ {
+ for (int i = 0; i < resources.count_crtcs; ++i)
+ {
+ // Possible_crtcs is a bitmask as described here:
+ // https://dvdhrm.wordpress.com/2012/09/13/linux-drm-mode-setting-api
+ const sf::Uint32 crtcMask = 1U << i;
+ const sf::Uint32 crtcId = resources.crtcs[i];
+ if (encoder.possible_crtcs & crtcMask)
+ {
+ return crtcId;
+ }
+ }
+
+ // No match found
+ return 0;
+ }
+
+ sf::Uint32 findCrtcForConnector(const sf::priv::Drm& drm, const drmModeRes& resources, const drmModeConnector& connector)
+ {
+ for (int i = 0; i < connector.count_encoders; ++i)
+ {
+ const sf::Uint32 encoderId = connector.encoders[i];
+ const drmModeEncoderPtr encoder = drmModeGetEncoder(drm.fileDescriptor, encoderId);
+
+ if (encoder)
+ {
+ const sf::Uint32 crtcId = findCrtcForEncoder(resources, *encoder);
+
+ drmModeFreeEncoder(encoder);
+ if (crtcId != 0)
+ {
+ return crtcId;
+ }
+ }
+ }
+
+ // No match found
+ return 0;
+ }
+
+ int getResources(int fd, drmModeResPtr& resources)
+ {
+ resources = drmModeGetResources(fd);
+ if (resources == NULL)
+ return -1;
+ return 0;
+ }
+
+ int hasMonitorConnected(int fd, drmModeRes& resources)
+ {
+ drmModeConnectorPtr connector;
+ for (int i = 0; i < resources.count_connectors; ++i)
+ {
+ connector = drmModeGetConnector(fd, resources.connectors[i]);
+ if (connector->connection == DRM_MODE_CONNECTED)
+ {
+ // There is a monitor connected
+ drmModeFreeConnector(connector);
+ connector = NULL;
+ return 1;
+ }
+ drmModeFreeConnector(connector);
+ connector = NULL;
+ }
+ return 0;
+ }
+
+ int findDrmDevice(drmModeResPtr& resources)
+ {
+ static const int maxDrmDevices = 64;
+
+ drmDevicePtr devices[maxDrmDevices] = { NULL };
+
+ const int numDevices = drmGetDevices2(0, devices, maxDrmDevices);
+ if (numDevices < 0)
+ {
+ sf::err() << "drmGetDevices2 failed: " << std::strerror(-numDevices) << std::endl;
+ return -1;
+ }
+
+ int fileDescriptor = -1;
+ for (int i = 0; i < numDevices; ++i)
+ {
+ drmDevicePtr device = devices[i];
+ int result = 0;
+
+ if (!(device->available_nodes & (1 << DRM_NODE_PRIMARY)))
+ continue;
+ // OK, it's a primary device. If we can get the drmModeResources, it means it's also a KMS-capable device.
+ fileDescriptor = open(device->nodes[DRM_NODE_PRIMARY], O_RDWR);
+ if (fileDescriptor < 0)
+ continue;
+ result = getResources(fileDescriptor, resources);
+#ifdef SFML_DEBUG
+ sf::err() << "DRM device used: " << i << std::endl;
+#endif
+ if(!result && hasMonitorConnected(fileDescriptor, *resources) != 0)
+ break;
+ close(fileDescriptor);
+ fileDescriptor = -1;
+ }
+ drmFreeDevices(devices, numDevices);
+
+ if (fileDescriptor < 0)
+ sf::err() << "No drm device found!" << std::endl;
+ return fileDescriptor;
+ }
+
+ int initDrm(sf::priv::Drm& drm, const char* device, const char* modeStr, unsigned int vrefresh)
+ {
+ drmModeResPtr resources;
+
+ if (device)
+ {
+ drm.fileDescriptor = open(device, O_RDWR);
+ const int ret = getResources(drm.fileDescriptor, resources);
+ if (ret < 0 && errno == EOPNOTSUPP)
+ sf::err() << device << " does not look like a modeset device" << std::endl;
+ }
+ else
+ {
+ drm.fileDescriptor = findDrmDevice(resources);
+ }
+
+ if (drm.fileDescriptor < 0)
+ {
+ sf::err() << "Could not open drm device" << std::endl;
+ return -1;
+ }
+
+ if (!resources)
+ {
+ sf::err() << "drmModeGetResources failed: " << std::strerror(errno) << std::endl;
+ return -1;
+ }
+
+ // Find a connected connector:
+ drmModeConnectorPtr connector = NULL;
+ for (int i = 0; i < resources->count_connectors; ++i)
+ {
+ connector = drmModeGetConnector(drm.fileDescriptor, resources->connectors[i]);
+ if (connector->connection == DRM_MODE_CONNECTED)
+ {
+ // It's connected, let's use this!
+ break;
+ }
+ drmModeFreeConnector(connector);
+ connector = NULL;
+ }
+
+ if (!connector)
+ {
+ // We could be fancy and listen for hotplug events and wait for a connector..
+ sf::err() << "No connected connector!" << std::endl;
+ return -1;
+ }
+
+ // Find user requested mode:
+ if (modeStr && *modeStr)
+ {
+ for (int i = 0; i < connector->count_modes; ++i)
+ {
+ drmModeModeInfoPtr currentMode = &connector->modes[i];
+
+ if (std::strcmp(currentMode->name, modeStr) == 0)
+ {
+ if (vrefresh == 0 || currentMode->vrefresh == vrefresh)
+ {
+ drm.mode = currentMode;
+ break;
+ }
+ }
+ }
+ if (!drm.mode)
+ sf::err() << "Requested mode not found, using default mode!" << std::endl;
+ }
+
+ // Find encoder:
+ drmModeEncoderPtr encoder = NULL;
+ for (int i = 0; i < resources->count_encoders; ++i)
+ {
+ encoder = drmModeGetEncoder(drm.fileDescriptor, resources->encoders[i]);
+ if (encoder->encoder_id == connector->encoder_id)
+ break;
+ drmModeFreeEncoder(encoder);
+ encoder = NULL;
+ }
+
+ if (encoder)
+ {
+ drm.crtcId = encoder->crtc_id;
+ }
+ else
+ {
+ const sf::Uint32 crtcId = findCrtcForConnector(drm, *resources, *connector);
+ if (crtcId == 0)
+ {
+ sf::err() << "No crtc found!" << std::endl;
+ return -1;
+ }
+
+ drm.crtcId = crtcId;
+ }
+
+ drmModeFreeResources(resources);
+
+ drm.connectorId = connector->connector_id;
+
+ drm.savedConnector = connector;
+ drm.savedEncoder = encoder;
+
+ // Get original display mode so we can restore display mode after program exits
+ drm.originalCrtc = drmModeGetCrtc(drm.fileDescriptor, drm.crtcId);
+
+ // Let's use the current mode rather than the preferred one if the user didn't specify a mode with env vars
+ if (!drm.mode)
+ {
+#ifdef SFML_DEBUG
+ sf::err() << "DRM using the current mode" << std::endl;
+#endif
+ drm.mode = &(drm.originalCrtc->mode);
+ }
+
+#ifdef SFML_DEBUG
+ sf::err() << "DRM Mode used: " << drm.mode->name << "@" << drm.mode->vrefresh << std::endl;
+#endif
+
+ return 0;
+ }
+
+ void checkInit()
+ {
+ if (initialized)
+ return;
+
+ // Use environment variable "SFML_DRM_DEVICE" (or NULL if not set)
+ char* deviceString = std::getenv("SFML_DRM_DEVICE");
+ if (deviceString && !*deviceString)
+ deviceString = NULL;
+
+ // Use environment variable "SFML_DRM_MODE" (or NULL if not set)
+ char* modeString = std::getenv("SFML_DRM_MODE");
+
+ // Use environment variable "SFML_DRM_REFRESH" (or 0 if not set)
+ // Use in combination with mode to request specific refresh rate for the mode
+ // if multiple refresh rates for same mode might be supported
+ unsigned int refreshRate = 0;
+ char* refreshString = std::getenv("SFML_DRM_REFRESH");
+
+ if (refreshString)
+ refreshRate = static_cast<unsigned int>(atoi(refreshString));
+
+ if (initDrm(drmNode,
+ deviceString, // device
+ modeString, // requested mode
+ refreshRate) < 0) // screen refresh rate
+ {
+ sf::err() << "Error initializing DRM" << std::endl;
+ return;
+ }
+
+ gbmDevice = gbm_create_device(drmNode.fileDescriptor);
+
+ std::atexit(cleanup);
+ initialized = true;
+
+ pollFD.fd = drmNode.fileDescriptor;
+ pollFD.events = POLLIN;
+ drmEventCtx.version = 2;
+ drmEventCtx.page_flip_handler = pageFlipHandler;
+ }
+
+ EGLDisplay getInitializedDisplay()
+ {
+ checkInit();
+
+ if (display == EGL_NO_DISPLAY)
+ {
+ gladLoaderLoadEGL(EGL_NO_DISPLAY);
+
+ eglCheck(display = eglGetDisplay(reinterpret_cast<EGLNativeDisplayType>(gbmDevice)));
+
+ EGLint major, minor;
+ eglCheck(eglInitialize(display, &major, &minor));
+
+ gladLoaderLoadEGL(display);
+
+#if defined(SFML_OPENGL_ES)
+ if (!eglBindAPI(EGL_OPENGL_ES_API))
+ {
+ sf::err() << "failed to bind api EGL_OPENGL_ES_API" << std::endl;
+ }
+#else
+ if (!eglBindAPI(EGL_OPENGL_API))
+ {
+ sf::err() << "failed to bind api EGL_OPENGL_API" << std::endl;
+ }
+#endif
+ }
+
+ return display;
+ }
+}
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+DRMContext::DRMContext(DRMContext* shared) :
+m_display (EGL_NO_DISPLAY),
+m_context (EGL_NO_CONTEXT),
+m_surface (EGL_NO_SURFACE),
+m_config (NULL),
+m_currentBO (NULL),
+m_nextBO (NULL),
+m_gbmSurface (NULL),
+m_width (0),
+m_height (0),
+m_shown (false),
+m_scanOut (false)
+{
+ contextCount++;
+
+ // Get the initialized EGL display
+ m_display = getInitializedDisplay();
+
+ // Get the best EGL config matching the default video settings
+ m_config = getBestConfig(m_display, VideoMode::getDesktopMode().bitsPerPixel, ContextSettings());
+ updateSettings();
+
+ // Create EGL context
+ createContext(shared);
+
+ if (shared)
+ createSurface(shared->m_width, shared->m_height, VideoMode::getDesktopMode().bitsPerPixel, false);
+ else // create a surface to force the GL to initialize (seems to be required for glGetString() etc )
+ createSurface(1, 1, VideoMode::getDesktopMode().bitsPerPixel, false);
+}
+
+
+////////////////////////////////////////////////////////////
+DRMContext::DRMContext(DRMContext* shared, const ContextSettings& settings, const WindowImpl* owner, unsigned int bitsPerPixel) :
+m_display (EGL_NO_DISPLAY),
+m_context (EGL_NO_CONTEXT),
+m_surface (EGL_NO_SURFACE),
+m_config (NULL),
+m_currentBO (NULL),
+m_nextBO (NULL),
+m_gbmSurface (NULL),
+m_width (0),
+m_height (0),
+m_shown (false),
+m_scanOut (false)
+{
+ contextCount++;
+
+ // Get the initialized EGL display
+ m_display = getInitializedDisplay();
+
+ // Get the best EGL config matching the requested video settings
+ m_config = getBestConfig(m_display, bitsPerPixel, settings);
+ updateSettings();
+
+ // Create EGL context
+ createContext(shared);
+
+ if (owner)
+ {
+ Vector2u size = owner->getSize();
+ createSurface(size.x, size.y, bitsPerPixel, true);
+ }
+}
+
+
+////////////////////////////////////////////////////////////
+DRMContext::DRMContext(DRMContext* shared, const ContextSettings& settings, unsigned int width, unsigned int height) :
+m_display (EGL_NO_DISPLAY),
+m_context (EGL_NO_CONTEXT),
+m_surface (EGL_NO_SURFACE),
+m_config (NULL),
+m_currentBO (NULL),
+m_nextBO (NULL),
+m_gbmSurface (NULL),
+m_width (0),
+m_height (0),
+m_shown (false),
+m_scanOut (false)
+{
+ contextCount++;
+
+ // Get the initialized EGL display
+ m_display = getInitializedDisplay();
+
+ // Get the best EGL config matching the requested video settings
+ m_config = getBestConfig(m_display, VideoMode::getDesktopMode().bitsPerPixel, settings);
+ updateSettings();
+
+ // Create EGL context
+ createContext(shared);
+ createSurface(width, height, VideoMode::getDesktopMode().bitsPerPixel, false);
+}
+
+
+////////////////////////////////////////////////////////////
+DRMContext::~DRMContext()
+{
+ // Deactivate the current context
+ EGLContext currentContext;
+ eglCheck(currentContext = eglGetCurrentContext());
+
+ if (currentContext == m_context)
+ {
+ eglCheck(eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
+ }
+
+ // Destroy context
+ if (m_context != EGL_NO_CONTEXT)
+ {
+ eglCheck(eglDestroyContext(m_display, m_context));
+ m_context = EGL_NO_CONTEXT;
+ }
+
+ // Destroy surface
+ if (m_surface != EGL_NO_SURFACE)
+ {
+ eglCheck(eglDestroySurface(m_display, m_surface));
+ m_surface = EGL_NO_SURFACE;
+ }
+
+ if (m_currentBO)
+ gbm_surface_release_buffer(m_gbmSurface, m_currentBO);
+
+ if (m_nextBO)
+ gbm_surface_release_buffer(m_gbmSurface, m_nextBO);
+
+ if (m_gbmSurface)
+ gbm_surface_destroy(m_gbmSurface);
+
+ contextCount--;
+ if (contextCount == 0)
+ cleanup();
+}
+
+
+////////////////////////////////////////////////////////////
+bool DRMContext::makeCurrent(bool current)
+{
+ const EGLSurface surface = current ? m_surface : EGL_NO_SURFACE;
+ const EGLContext context = current ? m_context : EGL_NO_CONTEXT;
+ return m_surface != EGL_NO_SURFACE && eglMakeCurrent(m_display, surface, surface, context);
+}
+
+
+////////////////////////////////////////////////////////////
+void DRMContext::display()
+{
+ if (m_surface == EGL_NO_SURFACE)
+ return;
+
+ if (!m_scanOut)
+ {
+ eglCheck(eglSwapBuffers(m_display, m_surface));
+ return;
+ }
+
+ // Handle display of buffer to the screen
+ DrmFb* fb = NULL;
+
+ if (!waitForFlip(-1))
+ return;
+
+ if (m_currentBO)
+ {
+ gbm_surface_release_buffer(m_gbmSurface, m_currentBO);
+ m_currentBO = NULL;
+ }
+
+ eglCheck(eglSwapBuffers(m_display, m_surface));
+
+ m_currentBO = m_nextBO;
+
+ // This call must be preceeded by a single call to eglSwapBuffers()
+ m_nextBO = gbm_surface_lock_front_buffer(m_gbmSurface);
+
+ if (!m_nextBO)
+ return;
+
+ fb = drmFbGetFromBo(*m_nextBO);
+ if (!fb)
+ {
+ err() << "Failed to get FB from buffer object" << std::endl;
+ return;
+ }
+
+ // If first time, need to first call drmModeSetCrtc()
+ if (!m_shown)
+ {
+ if (drmModeSetCrtc(drmNode.fileDescriptor, drmNode.crtcId, fb->fbId, 0, 0, &drmNode.connectorId, 1, drmNode.mode))
+ {
+ err() << "Failed to set mode: " << std::strerror(errno) << std::endl;
+ std::abort();
+ }
+ m_shown = true;
+ }
+
+ // Do page flip
+ if (!drmModePageFlip(drmNode.fileDescriptor, drmNode.crtcId, fb->fbId, DRM_MODE_PAGE_FLIP_EVENT, &waitingForFlip))
+ waitingForFlip = 1;
+}
+
+
+////////////////////////////////////////////////////////////
+void DRMContext::setVerticalSyncEnabled(bool enabled)
+{
+ eglCheck(eglSwapInterval(m_display, enabled ? 1 : 0));
+}
+
+
+////////////////////////////////////////////////////////////
+void DRMContext::createContext(DRMContext* shared)
+{
+ const EGLint contextVersion[] =
+ {
+ EGL_CONTEXT_CLIENT_VERSION, 1,
+ EGL_NONE
+ };
+
+ EGLContext toShared;
+
+ if (shared)
+ toShared = shared->m_context;
+ else
+ toShared = EGL_NO_CONTEXT;
+
+ if (toShared != EGL_NO_CONTEXT)
+ eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+
+ // Create EGL context
+ eglCheck(m_context = eglCreateContext(m_display, m_config, toShared, contextVersion));
+ if (m_context == EGL_NO_CONTEXT)
+ err() << "Failed to create EGL context" << std::endl;
+}
+
+
+////////////////////////////////////////////////////////////
+void DRMContext::createSurface(unsigned int width, unsigned int height, unsigned int /*bpp*/, bool scanout)
+{
+ sf::Uint32 flags = GBM_BO_USE_RENDERING;
+
+ m_scanOut = scanout;
+ if (m_scanOut)
+ flags |= GBM_BO_USE_SCANOUT;
+
+ m_gbmSurface = gbm_surface_create(
+ gbmDevice,
+ width,
+ height,
+ GBM_FORMAT_ARGB8888,
+ flags);
+
+ if (!m_gbmSurface)
+ {
+ err() << "Failed to create gbm surface." << std::endl;
+ return;
+ }
+
+ m_width = width;
+ m_height = height;
+
+ eglCheck(m_surface = eglCreateWindowSurface(m_display, m_config, reinterpret_cast<EGLNativeWindowType>(m_gbmSurface), NULL));
+
+ if (m_surface == EGL_NO_SURFACE)
+ {
+ err() << "Failed to create EGL Surface" << std::endl;
+ }
+}
+
+
+////////////////////////////////////////////////////////////
+void DRMContext::destroySurface()
+{
+ eglCheck(eglDestroySurface(m_display, m_surface));
+ m_surface = EGL_NO_SURFACE;
+
+ gbm_surface_destroy(m_gbmSurface);
+ m_gbmSurface = NULL;
+
+ // Ensure that this context is no longer active since our surface is now destroyed
+ setActive(false);
+}
+
+
+////////////////////////////////////////////////////////////
+EGLConfig DRMContext::getBestConfig(EGLDisplay display, unsigned int bitsPerPixel, const ContextSettings& settings)
+{
+ // Set our video settings constraint
+ const EGLint attributes[] =
+ {
+ EGL_BUFFER_SIZE, static_cast<EGLint>(bitsPerPixel),
+ EGL_DEPTH_SIZE, static_cast<EGLint>(settings.depthBits),
+ EGL_STENCIL_SIZE, static_cast<EGLint>(settings.stencilBits),
+ EGL_SAMPLE_BUFFERS, static_cast<EGLint>(settings.antialiasingLevel),
+ EGL_BLUE_SIZE, 8,
+ EGL_GREEN_SIZE, 8,
+ EGL_RED_SIZE, 8,
+ EGL_ALPHA_SIZE, 8,
+
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+#if defined(SFML_OPENGL_ES)
+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
+#else
+ EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
+#endif
+ EGL_NONE
+ };
+
+ EGLint configCount;
+ EGLConfig configs[1];
+
+ // Ask EGL for the best config matching our video settings
+ eglCheck(eglChooseConfig(display, attributes, configs, 1, &configCount));
+
+ return configs[0];
+}
+
+
+////////////////////////////////////////////////////////////
+void DRMContext::updateSettings()
+{
+ EGLint tmp;
+
+ // Update the internal context settings with the current config
+ eglCheck(eglGetConfigAttrib(m_display, m_config, EGL_DEPTH_SIZE, &tmp));
+ m_settings.depthBits = static_cast<unsigned int>(tmp);
+
+ eglCheck(eglGetConfigAttrib(m_display, m_config, EGL_STENCIL_SIZE, &tmp));
+ m_settings.stencilBits = static_cast<unsigned int>(tmp);
+
+ eglCheck(eglGetConfigAttrib(m_display, m_config, EGL_SAMPLES, &tmp));
+ m_settings.antialiasingLevel = static_cast<unsigned int>(tmp);
+
+ m_settings.majorVersion = 1;
+ m_settings.minorVersion = 1;
+ m_settings.attributeFlags = ContextSettings::Default;
+}
+
+
+////////////////////////////////////////////////////////////
+GlFunctionPointer DRMContext::getFunction(const char* name)
+{
+ return reinterpret_cast<GlFunctionPointer>(eglGetProcAddress(name));
+}
+
+
+////////////////////////////////////////////////////////////
+Drm& DRMContext::getDRM()
+{
+ checkInit();
+ return drmNode;
+}
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Window/DRM/DRMContext.hpp b/src/SFML/Window/DRM/DRMContext.hpp
new file mode 100644
index 0000000..6a944d5
--- /dev/null
+++ b/src/SFML/Window/DRM/DRMContext.hpp
@@ -0,0 +1,224 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2023 Andrew Mickelson
+// 2013 Jonathan De Wachter (dewachter.jonathan@gmail.com)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_DRMCONTEXT_HPP
+#define SFML_DRMCONTEXT_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/ContextSettings.hpp>
+#include <SFML/Window/EGLCheck.hpp>
+#include <SFML/Window/GlContext.hpp>
+#include <SFML/Window/VideoMode.hpp>
+#include <glad/egl.h>
+#include <gbm.h>
+#include <xf86drmMode.h>
+
+
+namespace sf
+{
+namespace priv
+{
+struct Drm
+{
+ int fileDescriptor;
+
+ drmModeModeInfoPtr mode;
+ Uint32 crtcId;
+ Uint32 connectorId;
+
+ drmModeCrtcPtr originalCrtc;
+
+ drmModeConnectorPtr savedConnector;
+ drmModeEncoderPtr savedEncoder;
+};
+
+class WindowImplDRM;
+
+class DRMContext : public GlContext
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a new context, not associated to a window
+ ///
+ /// \param shared Context to share the new one with (can be NULL)
+ ///
+ ////////////////////////////////////////////////////////////
+ DRMContext(DRMContext* shared);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a new context attached to a window
+ ///
+ /// \param shared Context to share the new one with
+ /// \param settings Creation parameters
+ /// \param owner Pointer to the owner window
+ /// \param bitsPerPixel Pixel depth, in bits per pixel
+ ///
+ ////////////////////////////////////////////////////////////
+ DRMContext(DRMContext* shared, const ContextSettings& settings, const WindowImpl* owner, unsigned int bitsPerPixel);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a new context that embeds its own rendering target
+ ///
+ /// \param shared Context to share the new one with
+ /// \param settings Creation parameters
+ /// \param width Back buffer width, in pixels
+ /// \param height Back buffer height, in pixels
+ ///
+ ////////////////////////////////////////////////////////////
+ DRMContext(DRMContext* shared, const ContextSettings& settings, unsigned int width, unsigned int height);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Destructor
+ ///
+ ////////////////////////////////////////////////////////////
+ ~DRMContext();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Activate the context as the current target
+ /// for rendering
+ ///
+ /// \param current Whether to make the context current or no longer current
+ ///
+ /// \return True on success, false if any error happened
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool makeCurrent(bool current);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Display what has been rendered to the context so far
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void display();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Enable or disable vertical synchronization
+ ///
+ /// Activating vertical synchronization will limit the number
+ /// of frames displayed to the refresh rate of the monitor.
+ /// This can avoid some visual artifacts, and limit the framerate
+ /// to a good value (but not constant across different computers).
+ ///
+ /// \param enabled: True to enable v-sync, false to deactivate
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void setVerticalSyncEnabled(bool enabled);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create the EGL context
+ ///
+ /// \param shared Context to share the new one with (can be NULL)
+ /// \param bitsPerPixel Pixel depth, in bits per pixel
+ /// \param settings Creation parameters
+ ///
+ ////////////////////////////////////////////////////////////
+ void createContext(DRMContext* shared);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create the EGL surface
+ ///
+ /// \param width Back buffer width, in pixels
+ /// \param height Back buffer height, in pixels
+ /// \param bpp Pixel depth, in bits per pixel
+ /// \param scanout True to present the surface to the screen
+ ///
+ ////////////////////////////////////////////////////////////
+ void createSurface(unsigned int width, unsigned int height, unsigned int bpp, bool scanout);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Destroy the EGL surface
+ ///
+ /// This function must be called when the activity is stopped, or
+ /// when the orientation change.
+ ///
+ ////////////////////////////////////////////////////////////
+ void destroySurface();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the best EGL visual for a given set of video settings
+ ///
+ /// \param display EGL display
+ /// \param bitsPerPixel Pixel depth, in bits per pixel
+ /// \param settings Requested context settings
+ ///
+ /// \return The best EGL config
+ ///
+ ////////////////////////////////////////////////////////////
+ static EGLConfig getBestConfig(EGLDisplay display, unsigned int bitsPerPixel, const ContextSettings& settings);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the address of an OpenGL function
+ ///
+ /// \param name Name of the function to get the address of
+ ///
+ /// \return Address of the OpenGL function, 0 on failure
+ ///
+ ////////////////////////////////////////////////////////////
+ static GlFunctionPointer getFunction(const char* name);
+
+protected:
+
+ friend class VideoModeImpl;
+ friend class WindowImplDRM;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get Direct Rendering Manager pointer
+ ///
+ ////////////////////////////////////////////////////////////
+ static Drm& getDRM();
+
+private:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Helper to copy the picked EGL configuration
+ ///
+ ////////////////////////////////////////////////////////////
+ void updateSettings();
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ EGLDisplay m_display; ///< The internal EGL display
+ EGLContext m_context; ///< The internal EGL context
+ EGLSurface m_surface; ///< The internal EGL surface
+ EGLConfig m_config; ///< The internal EGL config
+
+ gbm_bo* m_currentBO;
+ gbm_bo* m_nextBO;
+ gbm_surface* m_gbmSurface;
+ unsigned int m_width;
+ unsigned int m_height;
+ bool m_shown;
+ bool m_scanOut;
+};
+
+} // namespace priv
+
+} // namespace sf
+
+
+#endif // SFML_DRMCONTEXT_HPP
diff --git a/src/SFML/Window/DRM/InputImplUDev.cpp b/src/SFML/Window/DRM/InputImplUDev.cpp
new file mode 100644
index 0000000..2c78cf9
--- /dev/null
+++ b/src/SFML/Window/DRM/InputImplUDev.cpp
@@ -0,0 +1,752 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2016 Andrew Mickelson
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/DRM/InputImplUDev.hpp>
+#include <SFML/System/Err.hpp>
+#include <SFML/System/Lock.hpp>
+#include <SFML/System/Mutex.hpp>
+#include <cerrno>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <fcntl.h>
+#include <linux/input.h>
+#include <queue>
+#include <sstream>
+#include <sys/stat.h>
+#include <termios.h>
+#include <unistd.h>
+#include <vector>
+
+
+namespace
+{
+ struct TouchSlot
+ {
+ int oldId;
+ int id;
+ sf::Vector2i pos;
+
+ TouchSlot() :
+ oldId(-1),
+ id(-1),
+ pos(0, 0)
+ {
+ }
+ };
+
+ sf::Mutex inputMutex; // threadsafe? maybe...
+ sf::Vector2i mousePos; // current mouse position
+
+ std::vector<int> fileDescriptors; // list of open file descriptors for /dev/input
+ std::vector<bool> mouseMap(sf::Mouse::ButtonCount, false); // track whether keys are down
+ std::vector<bool> keyMap(sf::Keyboard::KeyCount, false); // track whether mouse buttons are down
+
+ int touchFd = -1; // file descriptor we have seen MT events on; assumes only 1
+ std::vector<TouchSlot> touchSlots; // track the state of each touch "slot"
+ int currentSlot = 0; // which slot are we currently updating?
+
+ std::queue<sf::Event> eventQueue; // events received and waiting to be consumed
+ const int MAX_QUEUE = 64; // The maximum size we let eventQueue grow to
+
+ termios newTerminalConfig, oldTerminalConfig; // Terminal configurations
+
+ bool altDown() { return (keyMap[sf::Keyboard::LAlt] || keyMap[sf::Keyboard::RAlt]); }
+ bool controlDown() { return (keyMap[sf::Keyboard::LControl] || keyMap[sf::Keyboard::RControl]); }
+ bool shiftDown() { return (keyMap[sf::Keyboard::LShift] || keyMap[sf::Keyboard::RShift]); }
+ bool systemDown() { return (keyMap[sf::Keyboard::LSystem] || keyMap[sf::Keyboard::RSystem]); }
+
+ void uninitFileDescriptors(void)
+ {
+ for (std::vector<int>::iterator itr = fileDescriptors.begin(); itr != fileDescriptors.end(); ++itr)
+ close(*itr);
+ }
+
+#define BITS_PER_LONG (sizeof(unsigned long) * 8)
+#define NBITS(x) (((x - 1) / BITS_PER_LONG) + 1)
+#define OFF(x) (x % BITS_PER_LONG)
+#define LONG(x) (x / BITS_PER_LONG)
+#define TEST_BIT(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1)
+
+ // Only keep fileDescriptors that we think are a keyboard, mouse or touchpad/touchscreen
+ // Joysticks are handled in /src/SFML/Window/Unix/JoystickImpl.cpp
+ bool keepFileDescriptor(int fileDesc)
+ {
+ unsigned long bitmask_ev[NBITS(EV_MAX)];
+ unsigned long bitmask_key[NBITS(KEY_MAX)];
+ unsigned long bitmask_abs[NBITS(ABS_MAX)];
+ unsigned long bitmask_rel[NBITS(REL_MAX)];
+
+ ioctl(fileDesc, EVIOCGBIT(0, sizeof(bitmask_ev)), &bitmask_ev);
+ ioctl(fileDesc, EVIOCGBIT(EV_KEY, sizeof(bitmask_key)), &bitmask_key);
+ ioctl(fileDesc, EVIOCGBIT(EV_ABS, sizeof(bitmask_abs)), &bitmask_abs);
+ ioctl(fileDesc, EVIOCGBIT(EV_REL, sizeof(bitmask_rel)), &bitmask_rel);
+
+ // This is the keyboard test used by SDL.
+ // The first 32 bits are ESC, numbers and Q to D; If we have any of those,
+ // consider it a keyboard device; do not test for KEY_RESERVED, though
+ bool is_keyboard = (bitmask_key[0] & 0xFFFFFFFE);
+
+ bool is_abs = TEST_BIT(EV_ABS, bitmask_ev)
+ && TEST_BIT(ABS_X, bitmask_abs) && TEST_BIT(ABS_Y, bitmask_abs);
+
+ bool is_rel = TEST_BIT(EV_REL, bitmask_ev)
+ && TEST_BIT(REL_X, bitmask_rel) && TEST_BIT(REL_Y, bitmask_rel);
+
+ bool is_mouse = (is_abs || is_rel) && TEST_BIT(BTN_MOUSE, bitmask_key);
+
+ bool is_touch = is_abs && (TEST_BIT(BTN_TOOL_FINGER, bitmask_key) || TEST_BIT(BTN_TOUCH, bitmask_key));
+
+ return is_keyboard || is_mouse || is_touch;
+ }
+
+ void initFileDescriptors()
+ {
+ static bool initialized = false;
+ if (initialized)
+ return;
+
+ initialized = true;
+
+ for (int i = 0; i < 32; i++)
+ {
+ std::string name("/dev/input/event");
+ std::ostringstream stream;
+ stream << i;
+ name += stream.str();
+
+ int tempFD = open(name.c_str(), O_RDONLY | O_NONBLOCK);
+
+ if (tempFD < 0)
+ {
+ if (errno != ENOENT)
+ sf::err() << "Error opening " << name << ": " << std::strerror(errno) << std::endl;
+
+ continue;
+ }
+
+ if (keepFileDescriptor(tempFD))
+ fileDescriptors.push_back(tempFD);
+ else
+ close(tempFD);
+ }
+
+ std::atexit(uninitFileDescriptors);
+ }
+
+ sf::Mouse::Button toMouseButton(int code)
+ {
+ switch (code)
+ {
+ case BTN_LEFT: return sf::Mouse::Left;
+ case BTN_RIGHT: return sf::Mouse::Right;
+ case BTN_MIDDLE: return sf::Mouse::Middle;
+ case BTN_SIDE: return sf::Mouse::XButton1;
+ case BTN_EXTRA: return sf::Mouse::XButton2;
+
+ default:
+ return sf::Mouse::ButtonCount;
+ }
+ }
+
+ sf::Keyboard::Key toKey(int code)
+ {
+ switch (code)
+ {
+ case KEY_ESC: return sf::Keyboard::Escape;
+ case KEY_1: return sf::Keyboard::Num1;
+ case KEY_2: return sf::Keyboard::Num2;
+ case KEY_3: return sf::Keyboard::Num3;
+ case KEY_4: return sf::Keyboard::Num4;
+ case KEY_5: return sf::Keyboard::Num5;
+ case KEY_6: return sf::Keyboard::Num6;
+ case KEY_7: return sf::Keyboard::Num7;
+ case KEY_8: return sf::Keyboard::Num8;
+ case KEY_9: return sf::Keyboard::Num9;
+ case KEY_0: return sf::Keyboard::Num0;
+ case KEY_MINUS: return sf::Keyboard::Hyphen;
+ case KEY_EQUAL: return sf::Keyboard::Equal;
+ case KEY_BACKSPACE: return sf::Keyboard::Backspace;
+ case KEY_TAB: return sf::Keyboard::Tab;
+ case KEY_Q: return sf::Keyboard::Q;
+ case KEY_W: return sf::Keyboard::W;
+ case KEY_E: return sf::Keyboard::E;
+ case KEY_R: return sf::Keyboard::R;
+ case KEY_T: return sf::Keyboard::T;
+ case KEY_Y: return sf::Keyboard::Y;
+ case KEY_U: return sf::Keyboard::U;
+ case KEY_I: return sf::Keyboard::I;
+ case KEY_O: return sf::Keyboard::O;
+ case KEY_P: return sf::Keyboard::P;
+ case KEY_LEFTBRACE: return sf::Keyboard::LBracket;
+ case KEY_RIGHTBRACE: return sf::Keyboard::RBracket;
+ case KEY_KPENTER:
+ case KEY_ENTER: return sf::Keyboard::Enter;
+ case KEY_LEFTCTRL: return sf::Keyboard::LControl;
+ case KEY_A: return sf::Keyboard::A;
+ case KEY_S: return sf::Keyboard::S;
+ case KEY_D: return sf::Keyboard::D;
+ case KEY_F: return sf::Keyboard::F;
+ case KEY_G: return sf::Keyboard::G;
+ case KEY_H: return sf::Keyboard::H;
+ case KEY_J: return sf::Keyboard::J;
+ case KEY_K: return sf::Keyboard::K;
+ case KEY_L: return sf::Keyboard::L;
+ case KEY_SEMICOLON: return sf::Keyboard::Semicolon;
+ case KEY_APOSTROPHE: return sf::Keyboard::Quote;
+ case KEY_GRAVE: return sf::Keyboard::Grave;
+ case KEY_LEFTSHIFT: return sf::Keyboard::LShift;
+ case KEY_BACKSLASH: return sf::Keyboard::Backslash;
+ case KEY_Z: return sf::Keyboard::Z;
+ case KEY_X: return sf::Keyboard::X;
+ case KEY_C: return sf::Keyboard::C;
+ case KEY_V: return sf::Keyboard::V;
+ case KEY_B: return sf::Keyboard::B;
+ case KEY_N: return sf::Keyboard::N;
+ case KEY_M: return sf::Keyboard::M;
+ case KEY_COMMA: return sf::Keyboard::Comma;
+ case KEY_DOT: return sf::Keyboard::Period;
+ case KEY_SLASH: return sf::Keyboard::Slash;
+ case KEY_RIGHTSHIFT: return sf::Keyboard::RShift;
+ case KEY_KPASTERISK: return sf::Keyboard::Multiply;
+ case KEY_LEFTALT: return sf::Keyboard::LAlt;
+ case KEY_SPACE: return sf::Keyboard::Space;
+ case KEY_F1: return sf::Keyboard::F1;
+ case KEY_F2: return sf::Keyboard::F2;
+ case KEY_F3: return sf::Keyboard::F3;
+ case KEY_F4: return sf::Keyboard::F4;
+ case KEY_F5: return sf::Keyboard::F5;
+ case KEY_F6: return sf::Keyboard::F6;
+ case KEY_F7: return sf::Keyboard::F7;
+ case KEY_F8: return sf::Keyboard::F8;
+ case KEY_F9: return sf::Keyboard::F9;
+ case KEY_F10: return sf::Keyboard::F10;
+ case KEY_F11: return sf::Keyboard::F11;
+ case KEY_F12: return sf::Keyboard::F12;
+ case KEY_F13: return sf::Keyboard::F13;
+ case KEY_F14: return sf::Keyboard::F14;
+ case KEY_F15: return sf::Keyboard::F15;
+ case KEY_KP7: return sf::Keyboard::Numpad7;
+ case KEY_KP8: return sf::Keyboard::Numpad8;
+ case KEY_KP9: return sf::Keyboard::Numpad9;
+ case KEY_KPMINUS: return sf::Keyboard::Subtract;
+ case KEY_KP4: return sf::Keyboard::Numpad4;
+ case KEY_KP5: return sf::Keyboard::Numpad5;
+ case KEY_KP6: return sf::Keyboard::Numpad6;
+ case KEY_KPPLUS: return sf::Keyboard::Add;
+ case KEY_KP1: return sf::Keyboard::Numpad1;
+ case KEY_KP2: return sf::Keyboard::Numpad2;
+ case KEY_KP3: return sf::Keyboard::Numpad3;
+ case KEY_KP0: return sf::Keyboard::Numpad0;
+ case KEY_KPDOT: return sf::Keyboard::Delete;
+ case KEY_RIGHTCTRL: return sf::Keyboard::RControl;
+ case KEY_KPSLASH: return sf::Keyboard::Divide;
+ case KEY_RIGHTALT: return sf::Keyboard::RAlt;
+ case KEY_HOME: return sf::Keyboard::Home;
+ case KEY_UP: return sf::Keyboard::Up;
+ case KEY_PAGEUP: return sf::Keyboard::PageUp;
+ case KEY_LEFT: return sf::Keyboard::Left;
+ case KEY_RIGHT: return sf::Keyboard::Right;
+ case KEY_END: return sf::Keyboard::End;
+ case KEY_DOWN: return sf::Keyboard::Down;
+ case KEY_PAGEDOWN: return sf::Keyboard::PageDown;
+ case KEY_INSERT: return sf::Keyboard::Insert;
+ case KEY_DELETE: return sf::Keyboard::Delete;
+ case KEY_PAUSE: return sf::Keyboard::Pause;
+ case KEY_LEFTMETA: return sf::Keyboard::LSystem;
+ case KEY_RIGHTMETA: return sf::Keyboard::RSystem;
+
+ case KEY_RESERVED:
+ case KEY_SYSRQ:
+ case KEY_CAPSLOCK:
+ case KEY_NUMLOCK:
+ case KEY_SCROLLLOCK:
+ default:
+ return sf::Keyboard::Unknown;
+ }
+ }
+
+ void pushEvent(sf::Event& event)
+ {
+ if (eventQueue.size() >= MAX_QUEUE)
+ eventQueue.pop();
+
+ eventQueue.push(event);
+ }
+
+ TouchSlot& atSlot(int idx)
+ {
+ if (idx >= static_cast<int>(touchSlots.size()))
+ touchSlots.resize(static_cast<size_t>(idx + 1));
+ return touchSlots.at(static_cast<size_t>(idx));
+ }
+
+ void processSlots()
+ {
+ for (std::vector<TouchSlot>::iterator slot = touchSlots.begin(); slot != touchSlots.end(); ++slot)
+ {
+ sf::Event event;
+
+ event.touch.x = slot->pos.x;
+ event.touch.y = slot->pos.y;
+
+ if (slot->oldId == slot->id)
+ {
+ event.type = sf::Event::TouchMoved;
+ event.touch.finger = static_cast<unsigned int>(slot->id);
+ pushEvent(event);
+ }
+ else
+ {
+ if (slot->oldId != -1)
+ {
+ event.type = sf::Event::TouchEnded;
+ event.touch.finger = static_cast<unsigned int>(slot->oldId);
+ pushEvent(event);
+ }
+ if (slot->id != -1)
+ {
+ event.type = sf::Event::TouchBegan;
+ event.touch.finger = static_cast<unsigned int>(slot->id);
+ pushEvent(event);
+ }
+
+ slot->oldId = slot->id;
+ }
+ }
+ }
+
+ bool eventProcess(sf::Event& event)
+ {
+ sf::Lock lock(inputMutex);
+
+ // Ensure that we are initialized
+ initFileDescriptors();
+
+ // This is for handling the Backspace and DEL text events, which we
+ // generate based on keystrokes (and not stdin)
+ static unsigned int doDeferredText = 0;
+ if (doDeferredText)
+ {
+ event.type = sf::Event::TextEntered;
+ event.text.unicode = doDeferredText;
+ doDeferredText = 0;
+ return true;
+ }
+
+ ssize_t bytesRead;
+
+ // Check all the open file descriptors for the next event
+ for (std::vector<int>::iterator itr = fileDescriptors.begin(); itr != fileDescriptors.end(); ++itr)
+ {
+ input_event inputEvent;
+ bytesRead = read(*itr, &inputEvent, sizeof(inputEvent));
+
+ while (bytesRead > 0)
+ {
+ if (inputEvent.type == EV_KEY)
+ {
+ sf::Mouse::Button mb = toMouseButton(inputEvent.code);
+ if (mb != sf::Mouse::ButtonCount)
+ {
+ event.type = inputEvent.value ? sf::Event::MouseButtonPressed : sf::Event::MouseButtonReleased;
+ event.mouseButton.button = mb;
+ event.mouseButton.x = mousePos.x;
+ event.mouseButton.y = mousePos.y;
+
+ mouseMap[mb] = inputEvent.value;
+ return true;
+ }
+ else
+ {
+ sf::Keyboard::Key kb = toKey(inputEvent.code);
+
+ unsigned int special = 0;
+ if ((kb == sf::Keyboard::Delete)
+ || (kb == sf::Keyboard::Backspace))
+ special = (kb == sf::Keyboard::Delete) ? 127 : 8;
+
+ if (inputEvent.value == 2)
+ {
+ // key repeat events
+ //
+ if (special)
+ {
+ event.type = sf::Event::TextEntered;
+ event.text.unicode = special;
+ return true;
+ }
+ }
+ else if (kb != sf::Keyboard::Unknown)
+ {
+ // key down and key up events
+ //
+ event.type = inputEvent.value ? sf::Event::KeyPressed : sf::Event::KeyReleased;
+ event.key.code = kb;
+ event.key.scancode = sf::Keyboard::Scan::Unknown; // TODO: not implemented
+ event.key.alt = altDown();
+ event.key.control = controlDown();
+ event.key.shift = shiftDown();
+ event.key.system = systemDown();
+
+ keyMap[static_cast<std::size_t>(kb)] = inputEvent.value;
+
+ if (special && inputEvent.value)
+ doDeferredText = special;
+
+ return true;
+ }
+ }
+ }
+ else if (inputEvent.type == EV_REL)
+ {
+ bool posChange = false;
+ switch (inputEvent.code)
+ {
+ case REL_X:
+ mousePos.x += inputEvent.value;
+ posChange = true;
+ break;
+
+ case REL_Y:
+ mousePos.y += inputEvent.value;
+ posChange = true;
+ break;
+
+ case REL_WHEEL:
+ event.type = sf::Event::MouseWheelScrolled;
+ event.mouseWheelScroll.delta = static_cast<float>(inputEvent.value);
+ event.mouseWheelScroll.x = mousePos.x;
+ event.mouseWheelScroll.y = mousePos.y;
+ return true;
+ }
+
+ if (posChange)
+ {
+ event.type = sf::Event::MouseMoved;
+ event.mouseMove.x = mousePos.x;
+ event.mouseMove.y = mousePos.y;
+ return true;
+ }
+ }
+ else if (inputEvent.type == EV_ABS)
+ {
+ switch (inputEvent.code)
+ {
+ case ABS_MT_SLOT:
+ currentSlot = inputEvent.value;
+ touchFd = *itr;
+ break;
+ case ABS_MT_TRACKING_ID:
+ atSlot(currentSlot).id = inputEvent.value;
+ touchFd = *itr;
+ break;
+ case ABS_MT_POSITION_X:
+ atSlot(currentSlot).pos.x = inputEvent.value;
+ touchFd = *itr;
+ break;
+ case ABS_MT_POSITION_Y:
+ atSlot(currentSlot).pos.y = inputEvent.value;
+ touchFd = *itr;
+ break;
+ }
+ }
+ else if (inputEvent.type == EV_SYN && inputEvent.code == SYN_REPORT &&
+ *itr == touchFd)
+ {
+ // This pushes events directly to the queue, because it
+ // can generate more than one event.
+ processSlots();
+ }
+
+ bytesRead = read(*itr, &inputEvent, sizeof(inputEvent));
+ }
+
+ if ((bytesRead < 0) && (errno != EAGAIN))
+ sf::err() << " Error: " << std::strerror(errno) << std::endl;
+ }
+
+ // Finally check if there is a Text event on stdin
+ //
+ // We only clear the ICANON flag for the time of reading
+
+ newTerminalConfig.c_lflag &= ~static_cast<tcflag_t>(ICANON);
+ tcsetattr(STDIN_FILENO, TCSANOW, &newTerminalConfig);
+
+ timeval timeout;
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 0;
+
+ unsigned char code = 0;
+
+ fd_set readFDSet;
+ FD_ZERO(&readFDSet);
+ FD_SET(STDIN_FILENO, &readFDSet);
+ int ready = select(STDIN_FILENO + 1, &readFDSet, NULL, NULL, &timeout);
+
+ if (ready > 0 && FD_ISSET(STDIN_FILENO, &readFDSet))
+ bytesRead = read(STDIN_FILENO, &code, 1);
+
+ if ((code == 127) || (code == 8)) // Suppress 127 (DEL) to 8 (BACKSPACE)
+ code = 0;
+ else if (code == 27) // ESC
+ {
+ // Suppress ANSI escape sequences
+ FD_ZERO(&readFDSet);
+ FD_SET(STDIN_FILENO, &readFDSet);
+ ready = select(STDIN_FILENO + 1, &readFDSet, NULL, NULL, &timeout);
+ if (ready > 0 && FD_ISSET(STDIN_FILENO, &readFDSet))
+ {
+ unsigned char tempBuffer[16];
+ bytesRead = read(STDIN_FILENO, tempBuffer, 16);
+ code = 0;
+ }
+ }
+
+ newTerminalConfig.c_lflag |= ICANON;
+ tcsetattr(STDIN_FILENO, TCSANOW, &newTerminalConfig);
+
+ if (code > 0)
+ {
+ // TODO: Proper unicode handling
+ event.type = sf::Event::TextEntered;
+ event.text.unicode = code;
+ return true;
+ }
+
+ // No events available
+ return false;
+ }
+
+ // assumes inputMutex is locked
+ void update()
+ {
+ sf::Event event;
+ while (eventProcess(event))
+ {
+ pushEvent(event);
+ }
+ }
+}
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+bool InputImpl::isKeyPressed(Keyboard::Key key)
+{
+ Lock lock(inputMutex);
+ if ((key < 0) || (key >= static_cast<int>(keyMap.size())))
+ return false;
+
+ update();
+ return keyMap[static_cast<std::size_t>(key)];
+}
+
+////////////////////////////////////////////////////////////
+bool InputImpl::isKeyPressed(Keyboard::Scancode /* code */)
+{
+ // TODO: not implemented
+ err() << "sf::Keyboard::isKeyPressed(Keyboard::Scancode) is not implemented for DRM." << std::endl;
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////
+Keyboard::Key InputImpl::localize(Keyboard::Scancode /* code */)
+{
+ // TODO: not implemented
+ err() << "sf::Keyboard::localize is not implemented for DRM." << std::endl;
+ return Keyboard::Unknown;
+}
+
+
+////////////////////////////////////////////////////////////
+Keyboard::Scancode InputImpl::delocalize(Keyboard::Key /* key */)
+{
+ // TODO: not implemented
+ err() << "sf::Keyboard::delocalize is not implemented for DRM." << std::endl;
+ return Keyboard::Scan::Unknown;
+}
+
+
+////////////////////////////////////////////////////////////
+String InputImpl::getDescription(Keyboard::Scancode /* code */)
+{
+ // TODO: not implemented
+ err() << "sf::Keyboard::getDescription is not implemented for DRM." << std::endl;
+ return "";
+}
+
+
+////////////////////////////////////////////////////////////
+void InputImpl::setVirtualKeyboardVisible(bool /*visible*/)
+{
+ // Not applicable
+}
+
+
+////////////////////////////////////////////////////////////
+bool InputImpl::isMouseButtonPressed(Mouse::Button button)
+{
+ Lock lock(inputMutex);
+ if ((button < 0) || (button >= static_cast<int>(mouseMap.size())))
+ return false;
+
+ update();
+ return mouseMap[button];
+}
+
+
+////////////////////////////////////////////////////////////
+Vector2i InputImpl::getMousePosition()
+{
+ Lock lock(inputMutex);
+ return mousePos;
+}
+
+
+////////////////////////////////////////////////////////////
+Vector2i InputImpl::getMousePosition(const WindowBase& /*relativeTo*/)
+{
+ return getMousePosition();
+}
+
+
+////////////////////////////////////////////////////////////
+void InputImpl::setMousePosition(const Vector2i& position)
+{
+ Lock lock(inputMutex);
+ mousePos = position;
+}
+
+
+////////////////////////////////////////////////////////////
+void InputImpl::setMousePosition(const Vector2i& position, const WindowBase& /*relativeTo*/)
+{
+ setMousePosition(position);
+}
+
+
+////////////////////////////////////////////////////////////
+bool InputImpl::isTouchDown(unsigned int finger)
+{
+ for (std::vector<TouchSlot>::iterator slot = touchSlots.begin(); slot != touchSlots.end(); ++slot)
+ {
+ if (slot->id == static_cast<int>(finger))
+ return true;
+ }
+
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////
+Vector2i InputImpl::getTouchPosition(unsigned int finger)
+{
+ for (std::vector<TouchSlot>::iterator slot = touchSlots.begin(); slot != touchSlots.end(); ++slot)
+ {
+ if (slot->id == static_cast<int>(finger))
+ return slot->pos;
+ }
+
+ return Vector2i();
+}
+
+
+////////////////////////////////////////////////////////////
+Vector2i InputImpl::getTouchPosition(unsigned int finger, const WindowBase& /*relativeTo*/)
+{
+ return getTouchPosition(finger);
+}
+
+
+////////////////////////////////////////////////////////////
+bool InputImpl::checkEvent(sf::Event& event)
+{
+ Lock lock(inputMutex);
+ if (!eventQueue.empty())
+ {
+ event = eventQueue.front();
+ eventQueue.pop();
+
+ return true;
+ }
+
+ if (eventProcess(event))
+ {
+ return true;
+ }
+ else
+ {
+ // In the case of multitouch, eventProcess() could have returned false
+ // but added events directly to the queue. (This is ugly, but I'm not
+ // sure of a good way to handle generating multiple events at once.)
+ if (!eventQueue.empty())
+ {
+ event = eventQueue.front();
+ eventQueue.pop();
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////
+void InputImpl::setTerminalConfig()
+{
+ sf::Lock lock(inputMutex);
+ initFileDescriptors();
+
+ tcgetattr(STDIN_FILENO, &newTerminalConfig); // get current terminal config
+ oldTerminalConfig = newTerminalConfig; // create a backup
+ newTerminalConfig.c_lflag &= ~static_cast<tcflag_t>(ECHO); // disable console feedback
+ newTerminalConfig.c_lflag &= ~static_cast<tcflag_t>(ISIG); // disable signals
+ newTerminalConfig.c_lflag |= ICANON; // disable noncanonical mode
+ newTerminalConfig.c_iflag |= IGNCR; // ignore carriage return
+ tcsetattr(STDIN_FILENO, TCSANOW, &newTerminalConfig); // set our new config
+ tcflush(STDIN_FILENO, TCIFLUSH); // flush the buffer
+}
+
+
+////////////////////////////////////////////////////////////
+void InputImpl::restoreTerminalConfig()
+{
+ sf::Lock lock(inputMutex);
+ initFileDescriptors();
+
+ tcsetattr(STDIN_FILENO, TCSANOW, &oldTerminalConfig); // restore terminal config
+ tcflush(STDIN_FILENO, TCIFLUSH); // flush the buffer
+}
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Window/DRM/InputImplUDev.hpp b/src/SFML/Window/DRM/InputImplUDev.hpp
new file mode 100644
index 0000000..6a249ea
--- /dev/null
+++ b/src/SFML/Window/DRM/InputImplUDev.hpp
@@ -0,0 +1,211 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2016 Andrew Mickelson
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_INPUTIMPLUDEV_HPP
+#define SFML_INPUTIMPLUDEV_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Keyboard.hpp>
+#include <SFML/Window/Mouse.hpp>
+#include <SFML/Window/Event.hpp>
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+/// \brief Linux (DRM) implementation of inputs (keyboard + mouse)
+///
+////////////////////////////////////////////////////////////
+class InputImpl
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::isKeyPressed(Key)
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::isKeyPressed(Scancode)
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::localize
+ ///
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Key localize(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::delocalize
+ ///
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Scancode delocalize(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::getDescription
+ ///
+ ////////////////////////////////////////////////////////////
+ static String getDescription(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::setVirtualKeyboardVisible
+ ///
+ ////////////////////////////////////////////////////////////
+ static void setVirtualKeyboardVisible(bool visible);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Check if a mouse button is pressed
+ ///
+ /// \param button Button to check
+ ///
+ /// \return True if the button is pressed, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isMouseButtonPressed(Mouse::Button button);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the current position of the mouse in desktop coordinates
+ ///
+ /// This function returns the current position of the mouse
+ /// cursor, in global (desktop) coordinates.
+ ///
+ /// \return Current position of the mouse
+ ///
+ ////////////////////////////////////////////////////////////
+ static Vector2i getMousePosition();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the current position of the mouse in window coordinates
+ ///
+ /// This function returns the current position of the mouse
+ /// cursor, relative to the given window.
+ /// If no window is used, it returns desktop coordinates.
+ ///
+ /// \param relativeTo Reference window
+ ///
+ /// \return Current position of the mouse
+ ///
+ ////////////////////////////////////////////////////////////
+ static Vector2i getMousePosition(const WindowBase& relativeTo);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Set the current position of the mouse in desktop coordinates
+ ///
+ /// This function sets the current position of the mouse
+ /// cursor in global (desktop) coordinates.
+ /// If no window is used, it sets the position in desktop coordinates.
+ ///
+ /// \param position New position of the mouse
+ ///
+ ////////////////////////////////////////////////////////////
+ static void setMousePosition(const Vector2i& position);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Set the current position of the mouse in window coordinates
+ ///
+ /// This function sets the current position of the mouse
+ /// cursor, relative to the given window.
+ /// If no window is used, it sets the position in desktop coordinates.
+ ///
+ /// \param position New position of the mouse
+ /// \param relativeTo Reference window
+ ///
+ ////////////////////////////////////////////////////////////
+ static void setMousePosition(const Vector2i& position, const WindowBase& relativeTo);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Check if a touch event is currently down
+ ///
+ /// \param finger Finger index
+ ///
+ /// \return True if \a finger is currently touching the screen, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isTouchDown(unsigned int finger);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the current position of a touch in desktop coordinates
+ ///
+ /// This function returns the current touch position
+ /// in global (desktop) coordinates.
+ ///
+ /// \param finger Finger index
+ ///
+ /// \return Current position of \a finger, or undefined if it's not down
+ ///
+ ////////////////////////////////////////////////////////////
+ static Vector2i getTouchPosition(unsigned int finger);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the current position of a touch in window coordinates
+ ///
+ /// This function returns the current touch position
+ /// in global (desktop) coordinates.
+ ///
+ /// \param finger Finger index
+ /// \param relativeTo Reference window
+ ///
+ /// \return Current position of \a finger, or undefined if it's not down
+ ///
+ ////////////////////////////////////////////////////////////
+ static Vector2i getTouchPosition(unsigned int finger, const WindowBase& relativeTo);
+
+private:
+
+ friend class WindowImplDRM;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Fetch input event from event queue
+ ///
+ /// \return False if event queue is empty
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool checkEvent(sf::Event& event);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Backup terminal configuration and disable console feedback
+ ///
+ ////////////////////////////////////////////////////////////
+ static void setTerminalConfig();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Restore terminal configuration from backup
+ ///
+ ////////////////////////////////////////////////////////////
+ static void restoreTerminalConfig();
+};
+
+} // namespace priv
+
+} // namespace sf
+
+
+#endif // SFML_INPUTIMPLUDEV_HPP
diff --git a/src/SFML/Window/DRM/VideoModeImpl.cpp b/src/SFML/Window/DRM/VideoModeImpl.cpp
new file mode 100644
index 0000000..cdd6d92
--- /dev/null
+++ b/src/SFML/Window/DRM/VideoModeImpl.cpp
@@ -0,0 +1,72 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2023 Andrew Mickelson
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/VideoModeImpl.hpp>
+#include <SFML/Window/DRM/DRMContext.hpp>
+#include <SFML/System/Err.hpp>
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+std::vector<VideoMode> VideoModeImpl::getFullscreenModes()
+{
+ std::vector<VideoMode> modes;
+
+ Drm& drm = sf::priv::DRMContext::getDRM();
+ drmModeConnectorPtr conn = drm.savedConnector;
+
+ if (conn)
+ {
+ for (int i = 0; i < conn->count_modes; i++)
+ modes.push_back(
+ VideoMode(conn->modes[i].hdisplay,
+ conn->modes[i].vdisplay));
+ }
+ else
+ modes.push_back(getDesktopMode());
+
+ return modes;
+}
+
+
+////////////////////////////////////////////////////////////
+VideoMode VideoModeImpl::getDesktopMode()
+{
+ Drm& drm = sf::priv::DRMContext::getDRM();
+ drmModeModeInfoPtr ptr = drm.mode;
+ if (ptr)
+ return VideoMode(ptr->hdisplay, ptr->vdisplay);
+ else
+ return VideoMode(0, 0);
+}
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Window/DRM/WindowImplDRM.cpp b/src/SFML/Window/DRM/WindowImplDRM.cpp
new file mode 100644
index 0000000..cc2ae69
--- /dev/null
+++ b/src/SFML/Window/DRM/WindowImplDRM.cpp
@@ -0,0 +1,160 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2023 Andrew Mickelson
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/DRM/WindowImplDRM.hpp>
+#include <SFML/Window/DRM/DRMContext.hpp>
+#include <SFML/Window/DRM/InputImplUDev.hpp>
+#include <SFML/Window/Event.hpp>
+#include <SFML/Window/WindowStyle.hpp>
+#include <SFML/System/Err.hpp>
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+WindowImplDRM::WindowImplDRM(WindowHandle /*handle*/) :
+m_size(0, 0)
+{
+ sf::priv::InputImpl::setTerminalConfig();
+}
+
+
+////////////////////////////////////////////////////////////
+WindowImplDRM::WindowImplDRM(VideoMode mode, const String& /*title*/, unsigned long /*style*/, const ContextSettings& /*settings*/) :
+m_size(mode.width, mode.height)
+{
+ sf::priv::InputImpl::setTerminalConfig();
+}
+
+
+////////////////////////////////////////////////////////////
+WindowImplDRM::~WindowImplDRM()
+{
+ sf::priv::InputImpl::restoreTerminalConfig();
+}
+
+
+////////////////////////////////////////////////////////////
+WindowHandle WindowImplDRM::getSystemHandle() const
+{
+ Drm& drm = sf::priv::DRMContext::getDRM();
+ return static_cast<WindowHandle>(drm.fileDescriptor);
+}
+
+////////////////////////////////////////////////////////////
+Vector2i WindowImplDRM::getPosition() const
+{
+ return Vector2i(0, 0);
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowImplDRM::setPosition(const Vector2i& /*position*/)
+{
+}
+
+
+////////////////////////////////////////////////////////////
+Vector2u WindowImplDRM::getSize() const
+{
+ return m_size;
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowImplDRM::setSize(const Vector2u& /*size*/)
+{
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowImplDRM::setTitle(const String& /*title*/)
+{
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowImplDRM::setIcon(unsigned int /*width*/, unsigned int /*height*/, const Uint8* /*pixels*/)
+{
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowImplDRM::setVisible(bool /*visible*/)
+{
+}
+
+////////////////////////////////////////////////////////////
+void WindowImplDRM::setMouseCursorVisible(bool /*visible*/)
+{
+ // TODO: not implemented
+}
+
+////////////////////////////////////////////////////////////
+void WindowImplDRM::setMouseCursorGrabbed(bool /*grabbed*/)
+{
+ //TODO: not implemented
+}
+
+////////////////////////////////////////////////////////////
+void WindowImplDRM::setMouseCursor(const CursorImpl& /*cursor*/)
+{
+ // TODO: not implemented
+}
+
+////////////////////////////////////////////////////////////
+void WindowImplDRM::setKeyRepeatEnabled(bool /*enabled*/)
+{
+ // TODO: not implemented
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowImplDRM::requestFocus()
+{
+ // Not applicable
+}
+
+
+////////////////////////////////////////////////////////////
+bool WindowImplDRM::hasFocus() const
+{
+ return true;
+}
+
+void WindowImplDRM::processEvents()
+{
+ sf::Event ev;
+ while (sf::priv::InputImpl::checkEvent(ev))
+ pushEvent(ev);
+}
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Window/DRM/WindowImplDRM.hpp b/src/SFML/Window/DRM/WindowImplDRM.hpp
new file mode 100644
index 0000000..3dfc695
--- /dev/null
+++ b/src/SFML/Window/DRM/WindowImplDRM.hpp
@@ -0,0 +1,205 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2023 Andrew Mickelson
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_WINDOWIMPLDRM_HPP
+#define SFML_WINDOWIMPLDRM_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Event.hpp>
+#include <SFML/Window/WindowImpl.hpp>
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+/// \brief DRM implementation of WindowImpl
+///
+////////////////////////////////////////////////////////////
+class WindowImplDRM : public WindowImpl
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct the window implementation from an existing control
+ ///
+ /// \param handle Platform-specific handle of the control
+ ///
+ ////////////////////////////////////////////////////////////
+ WindowImplDRM(WindowHandle handle);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create the window implementation
+ ///
+ /// \param mode Video mode to use
+ /// \param title Title of the window
+ /// \param style Window style (resizable, fixed, or fullscren)
+ /// \param settings Additional settings for the underlying OpenGL context
+ ///
+ ////////////////////////////////////////////////////////////
+ WindowImplDRM(VideoMode mode, const String& title, unsigned long style, const ContextSettings& settings);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Destructor
+ ///
+ ////////////////////////////////////////////////////////////
+ ~WindowImplDRM();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the OS-specific handle of the window
+ ///
+ /// \return Handle of the window
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual WindowHandle getSystemHandle() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the position of the window
+ ///
+ /// \return Position of the window, in pixels
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual Vector2i getPosition() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Change the position of the window on screen
+ ///
+ /// \param position New position of the window, in pixels
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void setPosition(const Vector2i& position);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the client size of the window
+ ///
+ /// \return Size of the window, in pixels
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual Vector2u getSize() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Change the size of the rendering region of the window
+ ///
+ /// \param size New size, in pixels
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void setSize(const Vector2u& size);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Change the title of the window
+ ///
+ /// \param title New title
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void setTitle(const String& title);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Change the window's icon
+ ///
+ /// \param width Icon's width, in pixels
+ /// \param height Icon's height, in pixels
+ /// \param pixels Pointer to the pixels in memory, format must be RGBA 32 bits
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void setIcon(unsigned int width, unsigned int height, const Uint8* pixels);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Show or hide the window
+ ///
+ /// \param visible True to show, false to hide
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void setVisible(bool visible);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Show or hide the mouse cursor
+ ///
+ /// \param visible True to show, false to hide
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void setMouseCursorVisible(bool visible);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Grab or release the mouse cursor
+ ///
+ /// \param grabbed True to enable, false to disable
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void setMouseCursorGrabbed(bool grabbed);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Set the displayed cursor to a native system cursor
+ ///
+ /// \param cursor Native system cursor type to display
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void setMouseCursor(const CursorImpl& cursor);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Enable or disable automatic key-repeat
+ ///
+ /// \param enabled True to enable, false to disable
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void setKeyRepeatEnabled(bool enabled);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Request the current window to be made the active
+ /// foreground window
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void requestFocus();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Check whether the window has the input focus
+ ///
+ /// \return True if window has focus, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool hasFocus() const;
+
+protected:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Process incoming events from the operating system
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void processEvents();
+
+private:
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ Vector2u m_size; ///< Window size
+};
+
+} // namespace priv
+
+} // namespace sf
+
+
+#endif // SFML_WINDOWIMPLDRM_HPP
diff --git a/src/SFML/Window/EGLCheck.cpp b/src/SFML/Window/EGLCheck.cpp
index dabf54e..a5a4735 100644
--- a/src/SFML/Window/EGLCheck.cpp
+++ b/src/SFML/Window/EGLCheck.cpp
@@ -28,6 +28,7 @@
////////////////////////////////////////////////////////////
#include <SFML/Window/EGLCheck.hpp>
#include <SFML/System/Err.hpp>
+#include <glad/egl.h>
namespace sf
@@ -35,7 +36,7 @@ namespace sf
namespace priv
{
////////////////////////////////////////////////////////////
-void eglCheckError(const char* file, unsigned int line)
+void eglCheckError(const char* file, unsigned int line, const char* expression)
{
// Obtain information about the success or failure of the most recent EGL
// function called in the current thread
@@ -152,7 +153,8 @@ void eglCheckError(const char* file, unsigned int line)
// Log the error
err() << "An internal EGL call failed in "
<< fileString.substr(fileString.find_last_of("\\/") + 1) << " (" << line << ") : "
- << error << ", " << description
+ << "\nExpression:\n " << expression
+ << "\nError description:\n " << error << "\n " << description << "\n"
<< std::endl;
}
}
diff --git a/src/SFML/Window/EGLCheck.hpp b/src/SFML/Window/EGLCheck.hpp
index 317d9a8..8eb6d0a 100644
--- a/src/SFML/Window/EGLCheck.hpp
+++ b/src/SFML/Window/EGLCheck.hpp
@@ -29,7 +29,6 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Config.hpp>
-#include <EGL/egl.h>
#include <string>
@@ -42,8 +41,9 @@ namespace priv
////////////////////////////////////////////////////////////
#ifdef SFML_DEBUG
- //// In debug mode, perform a test on every EGL call
- #define eglCheck(x) x; sf::priv::eglCheckError(__FILE__, __LINE__);
+ // In debug mode, perform a test on every EGL call
+ // The do-while loop is needed so that glCheck can be used as a single statement in if/else branches
+ #define eglCheck(expr) do { expr; sf::priv::eglCheckError(__FILE__, __LINE__, #expr); } while (false)
#else
@@ -57,9 +57,10 @@ namespace priv
///
/// \param file Source file where the call is located
/// \param line Line number of the source file where the call is located
+/// \param expression The evaluated expression as a string
///
////////////////////////////////////////////////////////////
-void eglCheckError(const char* file, unsigned int line);
+void eglCheckError(const char* file, unsigned int line, const char* expression);
} // namespace priv
} // namespace sf
diff --git a/src/SFML/Window/EglContext.cpp b/src/SFML/Window/EglContext.cpp
index fb91cda..a43a211 100644
--- a/src/SFML/Window/EglContext.cpp
+++ b/src/SFML/Window/EglContext.cpp
@@ -28,7 +28,6 @@
////////////////////////////////////////////////////////////
#include <SFML/Window/EglContext.hpp>
#include <SFML/Window/WindowImpl.hpp>
-#include <SFML/OpenGL.hpp>
#include <SFML/System/Err.hpp>
#include <SFML/System/Sleep.hpp>
#include <SFML/System/Mutex.hpp>
@@ -36,35 +35,63 @@
#ifdef SFML_SYSTEM_ANDROID
#include <SFML/System/Android/Activity.hpp>
#endif
-#ifdef SFML_SYSTEM_LINUX
+#if defined(SFML_SYSTEM_LINUX) && !defined(SFML_USE_DRM)
#include <X11/Xlib.h>
#endif
+// We check for this definition in order to avoid multiple definitions of GLAD
+// entities during unity builds of SFML.
+#ifndef SF_GLAD_EGL_IMPLEMENTATION_INCLUDED
+#define SF_GLAD_EGL_IMPLEMENTATION_INCLUDED
+#define SF_GLAD_EGL_IMPLEMENTATION
+#include <glad/egl.h>
+#endif
+
namespace
{
- EGLDisplay getInitializedDisplay()
+ // A nested named namespace is used here to allow unity builds of SFML.
+ namespace EglContextImpl
{
-#if defined(SFML_SYSTEM_LINUX)
+ EGLDisplay getInitializedDisplay()
+ {
+#if defined(SFML_SYSTEM_ANDROID)
- static EGLDisplay display = EGL_NO_DISPLAY;
+ // On Android, its native activity handles this for us
+ sf::priv::ActivityStates& states = sf::priv::getActivity();
+ sf::Lock lock(states.mutex);
- if (display == EGL_NO_DISPLAY)
- {
- display = eglCheck(eglGetDisplay(EGL_DEFAULT_DISPLAY));
- eglCheck(eglInitialize(display, NULL, NULL));
- }
+ return states.display;
- return display;
+#endif
-#elif defined(SFML_SYSTEM_ANDROID)
+ static EGLDisplay display = EGL_NO_DISPLAY;
- // On Android, its native activity handles this for us
- sf::priv::ActivityStates* states = sf::priv::getActivity(NULL);
- sf::Lock lock(states->mutex);
+ if (display == EGL_NO_DISPLAY)
+ {
+ eglCheck(display = eglGetDisplay(EGL_DEFAULT_DISPLAY));
+ eglCheck(eglInitialize(display, NULL, NULL));
+ }
- return states->display;
+ return display;
+ }
-#endif
+
+ ////////////////////////////////////////////////////////////
+ void ensureInit()
+ {
+ static bool initialized = false;
+ if (!initialized)
+ {
+ initialized = true;
+
+ // We don't check the return value since the extension
+ // flags are cleared even if loading fails
+ gladLoaderLoadEGL(EGL_NO_DISPLAY);
+
+ // Continue loading with a display
+ gladLoaderLoadEGL(getInitializedDisplay());
+ }
+ }
}
}
@@ -80,8 +107,10 @@ m_context (EGL_NO_CONTEXT),
m_surface (EGL_NO_SURFACE),
m_config (NULL)
{
+ EglContextImpl::ensureInit();
+
// Get the initialized EGL display
- m_display = getInitializedDisplay();
+ m_display = EglContextImpl::getInitializedDisplay();
// Get the best EGL config matching the default video settings
m_config = getBestConfig(m_display, VideoMode::getDesktopMode().bitsPerPixel, ContextSettings());
@@ -95,7 +124,7 @@ m_config (NULL)
EGL_NONE
};
- m_surface = eglCheck(eglCreatePbufferSurface(m_display, m_config, attrib_list));
+ eglCheck(m_surface = eglCreatePbufferSurface(m_display, m_config, attrib_list));
// Create EGL context
createContext(shared);
@@ -109,18 +138,20 @@ m_context (EGL_NO_CONTEXT),
m_surface (EGL_NO_SURFACE),
m_config (NULL)
{
+ EglContextImpl::ensureInit();
+
#ifdef SFML_SYSTEM_ANDROID
// On Android, we must save the created context
- ActivityStates* states = getActivity(NULL);
- Lock lock(states->mutex);
+ ActivityStates& states = getActivity();
+ Lock lock(states.mutex);
- states->context = this;
+ states.context = this;
#endif
// Get the initialized EGL display
- m_display = getInitializedDisplay();
+ m_display = EglContextImpl::getInitializedDisplay();
// Get the best EGL config matching the requested video settings
m_config = getBestConfig(m_display, bitsPerPixel, settings);
@@ -132,18 +163,23 @@ m_config (NULL)
#if !defined(SFML_SYSTEM_ANDROID)
// Create EGL surface (except on Android because the window is created
// asynchronously, its activity manager will call it for us)
- createSurface((EGLNativeWindowType)owner->getSystemHandle());
+ createSurface(owner->getSystemHandle());
+#else
+ (void) owner;
#endif
}
////////////////////////////////////////////////////////////
-EglContext::EglContext(EglContext* shared, const ContextSettings& settings, unsigned int width, unsigned int height) :
+EglContext::EglContext(EglContext* /*shared*/, const ContextSettings& /*settings*/, unsigned int /*width*/, unsigned int /*height*/) :
m_display (EGL_NO_DISPLAY),
m_context (EGL_NO_CONTEXT),
m_surface (EGL_NO_SURFACE),
m_config (NULL)
{
+ EglContextImpl::ensureInit();
+
+ sf::err() << "Warning: context has not been initialized. The constructor EglContext(shared, settings, width, height) is currently not implemented." << std::endl;
}
@@ -154,7 +190,8 @@ EglContext::~EglContext()
cleanupUnsharedResources();
// Deactivate the current context
- EGLContext currentContext = eglCheck(eglGetCurrentContext());
+ EGLContext currentContext = EGL_NO_CONTEXT;
+ eglCheck(currentContext = eglGetCurrentContext());
if (currentContext == m_context)
{
@@ -176,12 +213,32 @@ EglContext::~EglContext()
////////////////////////////////////////////////////////////
+GlFunctionPointer EglContext::getFunction(const char* name)
+{
+ EglContextImpl::ensureInit();
+
+ return eglGetProcAddress(name);
+}
+
+
+////////////////////////////////////////////////////////////
bool EglContext::makeCurrent(bool current)
{
+ if (m_surface == EGL_NO_SURFACE)
+ return false;
+
+ EGLBoolean result = EGL_FALSE;
+
if (current)
- return m_surface != EGL_NO_SURFACE && eglCheck(eglMakeCurrent(m_display, m_surface, m_surface, m_context));
+ {
+ eglCheck(result = eglMakeCurrent(m_display, m_surface, m_surface, m_context));
+ }
+ else
+ {
+ eglCheck(result = eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
+ }
- return m_surface != EGL_NO_SURFACE && eglCheck(eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
+ return (result != EGL_FALSE);
}
@@ -219,37 +276,40 @@ void EglContext::createContext(EglContext* shared)
eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
// Create EGL context
- m_context = eglCheck(eglCreateContext(m_display, m_config, toShared, contextVersion));
+ eglCheck(m_context = eglCreateContext(m_display, m_config, toShared, contextVersion));
}
////////////////////////////////////////////////////////////
void EglContext::createSurface(EGLNativeWindowType window)
{
- m_surface = eglCheck(eglCreateWindowSurface(m_display, m_config, window, NULL));
+ eglCheck(m_surface = eglCreateWindowSurface(m_display, m_config, window, NULL));
}
////////////////////////////////////////////////////////////
void EglContext::destroySurface()
{
+ // Ensure that this context is no longer active since our surface is going to be destroyed
+ setActive(false);
+
eglCheck(eglDestroySurface(m_display, m_surface));
m_surface = EGL_NO_SURFACE;
-
- // Ensure that this context is no longer active since our surface is now destroyed
- setActive(false);
}
////////////////////////////////////////////////////////////
EGLConfig EglContext::getBestConfig(EGLDisplay display, unsigned int bitsPerPixel, const ContextSettings& settings)
{
+ EglContextImpl::ensureInit();
+
// Set our video settings constraint
const EGLint attributes[] = {
EGL_BUFFER_SIZE, static_cast<EGLint>(bitsPerPixel),
EGL_DEPTH_SIZE, static_cast<EGLint>(settings.depthBits),
EGL_STENCIL_SIZE, static_cast<EGLint>(settings.stencilBits),
- EGL_SAMPLE_BUFFERS, static_cast<EGLint>(settings.antialiasingLevel),
+ EGL_SAMPLE_BUFFERS, settings.antialiasingLevel ? 1 : 0,
+ EGL_SAMPLES, static_cast<EGLint>(settings.antialiasingLevel),
EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
EGL_NONE
@@ -270,30 +330,45 @@ EGLConfig EglContext::getBestConfig(EGLDisplay display, unsigned int bitsPerPixe
////////////////////////////////////////////////////////////
void EglContext::updateSettings()
{
- EGLint tmp;
-
+ EGLBoolean result = EGL_FALSE;
+ EGLint tmp = 0;
+
// Update the internal context settings with the current config
- eglCheck(eglGetConfigAttrib(m_display, m_config, EGL_DEPTH_SIZE, &tmp));
- m_settings.depthBits = tmp;
-
- eglCheck(eglGetConfigAttrib(m_display, m_config, EGL_STENCIL_SIZE, &tmp));
- m_settings.stencilBits = tmp;
-
- eglCheck(eglGetConfigAttrib(m_display, m_config, EGL_SAMPLES, &tmp));
- m_settings.antialiasingLevel = tmp;
-
+ eglCheck(result = eglGetConfigAttrib(m_display, m_config, EGL_DEPTH_SIZE, &tmp));
+
+ if (result == EGL_FALSE)
+ err() << "Failed to retrieve EGL_DEPTH_SIZE" << std::endl;
+
+ m_settings.depthBits = static_cast<unsigned int>(tmp);
+
+ eglCheck(result = eglGetConfigAttrib(m_display, m_config, EGL_STENCIL_SIZE, &tmp));
+
+ if (result == EGL_FALSE)
+ err() << "Failed to retrieve EGL_STENCIL_SIZE" << std::endl;
+
+ m_settings.stencilBits = static_cast<unsigned int>(tmp);
+
+ eglCheck(result = eglGetConfigAttrib(m_display, m_config, EGL_SAMPLES, &tmp));
+
+ if (result == EGL_FALSE)
+ err() << "Failed to retrieve EGL_SAMPLES" << std::endl;
+
+ m_settings.antialiasingLevel = static_cast<unsigned int>(tmp);
+
m_settings.majorVersion = 1;
m_settings.minorVersion = 1;
m_settings.attributeFlags = ContextSettings::Default;
}
-#ifdef SFML_SYSTEM_LINUX
+#if defined(SFML_SYSTEM_LINUX) && !defined(SFML_USE_DRM)
////////////////////////////////////////////////////////////
XVisualInfo EglContext::selectBestVisual(::Display* XDisplay, unsigned int bitsPerPixel, const ContextSettings& settings)
{
+ EglContextImpl::ensureInit();
+
// Get the initialized EGL display
- EGLDisplay display = getInitializedDisplay();
+ EGLDisplay display = EglContextImpl::getInitializedDisplay();
// Get the best EGL config matching the default video settings
EGLConfig config = getBestConfig(display, bitsPerPixel, settings);
diff --git a/src/SFML/Window/EglContext.hpp b/src/SFML/Window/EglContext.hpp
index a889c3a..c02e89d 100644
--- a/src/SFML/Window/EglContext.hpp
+++ b/src/SFML/Window/EglContext.hpp
@@ -32,8 +32,12 @@
#include <SFML/Window/ContextSettings.hpp>
#include <SFML/Window/EGLCheck.hpp>
#include <SFML/Window/GlContext.hpp>
-#include <SFML/OpenGL.hpp>
-
+#include <SFML/Window/WindowStyle.hpp> // Prevent conflict with macro None from Xlib
+#include <glad/egl.h>
+#if defined(SFML_SYSTEM_LINUX) && !defined(SFML_USE_DRM)
+ #include <X11/Xlib.h>
+ #include <X11/Xutil.h>
+#endif
namespace sf
{
@@ -64,6 +68,7 @@ public:
////////////////////////////////////////////////////////////
/// \brief Create a new context that embeds its own rendering target
+ /// \warning This constructor is currently not implemented; use a different overload.
///
/// \param shared Context to share the new one with
/// \param settings Creation parameters
@@ -80,6 +85,16 @@ public:
~EglContext();
////////////////////////////////////////////////////////////
+ /// \brief Get the address of an OpenGL function
+ ///
+ /// \param name Name of the function to get the address of
+ ///
+ /// \return Address of the OpenGL function, 0 on failure
+ ///
+ ////////////////////////////////////////////////////////////
+ static GlFunctionPointer getFunction(const char* name);
+
+ ////////////////////////////////////////////////////////////
/// \brief Activate the context as the current target
/// for rendering
///
@@ -151,7 +166,7 @@ public:
////////////////////////////////////////////////////////////
static EGLConfig getBestConfig(EGLDisplay display, unsigned int bitsPerPixel, const ContextSettings& settings);
-#ifdef SFML_SYSTEM_LINUX
+#if defined(SFML_SYSTEM_LINUX) && !defined(SFML_USE_DRM)
////////////////////////////////////////////////////////////
/// \brief Select the best EGL visual for a given set of settings
///
@@ -168,17 +183,17 @@ public:
private:
////////////////////////////////////////////////////////////
- /// \brief Helper to copy the picked EGL configuration
+ /// \brief Helper to copy the picked EGL configuration
////////////////////////////////////////////////////////////
void updateSettings();
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- EGLDisplay m_display; ///< The internal EGL display
- EGLContext m_context; ///< The internal EGL context
- EGLSurface m_surface; ///< The internal EGL surface
- EGLConfig m_config; ///< The internal EGL config
+ EGLDisplay m_display; //!< The internal EGL display
+ EGLContext m_context; //!< The internal EGL context
+ EGLSurface m_surface; //!< The internal EGL surface
+ EGLConfig m_config; //!< The internal EGL config
};
diff --git a/src/SFML/Window/FreeBSD/JoystickImpl.cpp b/src/SFML/Window/FreeBSD/JoystickImpl.cpp
index 6bc646d..4ce4bca 100644
--- a/src/SFML/Window/FreeBSD/JoystickImpl.cpp
+++ b/src/SFML/Window/FreeBSD/JoystickImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
// 2013-2013 David Demelier (demelier.david@gmail.com)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -27,7 +27,6 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Window/JoystickImpl.hpp>
-#include <SFML/System/Err.hpp>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
@@ -124,7 +123,7 @@ namespace
name += directoryEntry->d_name;
if (isJoystick(name.c_str()))
- plugged[joystickCount++] = name;
+ plugged[static_cast<unsigned int>(joystickCount++)] = name;
}
directoryEntry = readdir(directory);
@@ -150,8 +149,8 @@ namespace
void hatValueToSfml(int value, sf::priv::JoystickState& state)
{
- state.axes[sf::Joystick::PovX] = hatValueMap[value].first;
- state.axes[sf::Joystick::PovY] = hatValueMap[value].second;
+ state.axes[sf::Joystick::PovX] = static_cast<float>(hatValueMap[value].first);
+ state.axes[sf::Joystick::PovY] = static_cast<float>(hatValueMap[value].second);
}
}
@@ -221,7 +220,7 @@ bool JoystickImpl::open(unsigned int index)
// Then allocate a buffer for data retrieval
m_length = hid_report_size(m_desc, hid_input, m_id);
- m_buffer.resize(m_length);
+ m_buffer.resize(static_cast<size_t>(m_length));
m_state.connected = true;
@@ -293,7 +292,7 @@ Joystick::Identification JoystickImpl::getIdentification() const
////////////////////////////////////////////////////////////
JoystickState JoystickImpl::JoystickImpl::update()
{
- while (read(m_file, &m_buffer[0], m_length) == m_length)
+ while (read(m_file, &m_buffer[0], static_cast<size_t>(m_length)) == m_length)
{
hid_data_t data = hid_start_parse(m_desc, 1 << hid_input, m_id);
@@ -329,7 +328,7 @@ JoystickState JoystickImpl::JoystickImpl::update()
int maximum = item.logical_maximum;
value = (value - minimum) * 200 / (maximum - minimum) - 100;
- m_state.axes[axis] = value;
+ m_state.axes[axis] = static_cast<float>(value);
}
}
}
diff --git a/src/SFML/Window/FreeBSD/JoystickImpl.hpp b/src/SFML/Window/FreeBSD/JoystickImpl.hpp
index 5b2c029..1727286 100644
--- a/src/SFML/Window/FreeBSD/JoystickImpl.hpp
+++ b/src/SFML/Window/FreeBSD/JoystickImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/GlContext.cpp b/src/SFML/Window/GlContext.cpp
index 3cbb701..b93c632 100644
--- a/src/SFML/Window/GlContext.cpp
+++ b/src/SFML/Window/GlContext.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -31,7 +31,7 @@
#include <SFML/System/Mutex.hpp>
#include <SFML/System/Lock.hpp>
#include <SFML/System/Err.hpp>
-#include <SFML/OpenGL.hpp>
+#include <glad/gl.h>
#include <algorithm>
#include <vector>
#include <string>
@@ -42,48 +42,74 @@
#include <cctype>
#include <cassert>
-#if !defined(SFML_OPENGL_ES)
- #if defined(SFML_SYSTEM_WINDOWS)
-
- #include <SFML/Window/Win32/WglContext.hpp>
- typedef sf::priv::WglContext ContextType;
+#if defined(SFML_SYSTEM_WINDOWS)
- #elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD)
+ #if defined(SFML_OPENGL_ES)
- #include <SFML/Window/Unix/GlxContext.hpp>
- typedef sf::priv::GlxContext ContextType;
+ #include <SFML/Window/EglContext.hpp>
+ typedef sf::priv::EglContext ContextType;
- #elif defined(SFML_SYSTEM_MACOS)
+ #else
- #include <SFML/Window/OSX/SFContext.hpp>
- typedef sf::priv::SFContext ContextType;
+ #include <SFML/Window/Win32/WglContext.hpp>
+ typedef sf::priv::WglContext ContextType;
#endif
-#else
+#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD)
- #if defined(SFML_SYSTEM_IOS)
+ #if defined(SFML_USE_DRM)
- #include <SFML/Window/iOS/EaglContext.hpp>
- typedef sf::priv::EaglContext ContextType;
+ #include <SFML/Window/DRM/DRMContext.hpp>
+ typedef sf::priv::DRMContext ContextType;
- #else
+ #elif defined(SFML_OPENGL_ES)
#include <SFML/Window/EglContext.hpp>
typedef sf::priv::EglContext ContextType;
+ #else
+
+ #include <SFML/Window/Unix/GlxContext.hpp>
+ typedef sf::priv::GlxContext ContextType;
+
#endif
+#elif defined(SFML_SYSTEM_MACOS)
+
+ #include <SFML/Window/OSX/SFContext.hpp>
+ typedef sf::priv::SFContext ContextType;
+
+#elif defined(SFML_SYSTEM_IOS)
+
+ #include <SFML/Window/iOS/EaglContext.hpp>
+ typedef sf::priv::EaglContext ContextType;
+
+#elif defined(SFML_SYSTEM_ANDROID)
+
+ #include <SFML/Window/EglContext.hpp>
+ typedef sf::priv::EglContext ContextType;
+
#endif
#if defined(SFML_SYSTEM_WINDOWS)
+ typedef void (APIENTRY *glEnableFuncType)(GLenum);
+ typedef GLenum (APIENTRY *glGetErrorFuncType)();
+ typedef void (APIENTRY *glGetIntegervFuncType)(GLenum, GLint*);
+ typedef const GLubyte* (APIENTRY *glGetStringFuncType)(GLenum);
typedef const GLubyte* (APIENTRY *glGetStringiFuncType)(GLenum, GLuint);
+ typedef GLboolean (APIENTRY *glIsEnabledFuncType)(GLenum);
#else
+ typedef void (*glEnableFuncType)(GLenum);
+ typedef GLenum (*glGetErrorFuncType)();
+ typedef void (*glGetIntegervFuncType)(GLenum, GLint*);
+ typedef const GLubyte* (*glGetStringFuncType)(GLenum);
typedef const GLubyte* (*glGetStringiFuncType)(GLenum, GLuint);
+ typedef GLboolean (*glIsEnabledFuncType)(GLenum);
#endif
@@ -130,106 +156,162 @@
namespace
{
- // AMD drivers have issues with internal synchronization
- // We need to make sure that no operating system context
- // or pixel format operations are performed simultaneously
- // This mutex is also used to protect the shared context
- // from being locked on multiple threads and for managing
- // the resource count
- sf::Mutex mutex;
-
- // OpenGL resources counter
- unsigned int resourceCount = 0;
-
- // This per-thread variable holds the current context for each thread
- sf::ThreadLocalPtr<sf::priv::GlContext> currentContext(NULL);
-
- // The hidden, inactive context that will be shared with all other contexts
- ContextType* sharedContext = NULL;
-
- // Unique identifier, used for identifying contexts when managing unshareable OpenGL resources
- sf::Uint64 id = 1; // start at 1, zero is "no context"
-
- // Set containing callback functions to be called whenever a
- // context is going to be destroyed
- // Unshareable OpenGL resources rely on this to clean up properly
- // whenever a context containing them is destroyed
- typedef std::set<std::pair<sf::ContextDestroyCallback, void*> > ContextDestroyCallbacks;
- ContextDestroyCallbacks contextDestroyCallbacks;
-
- // This structure contains all the state necessary to
- // track TransientContext usage
- struct TransientContext : private sf::NonCopyable
+ // A nested named namespace is used here to allow unity builds of SFML.
+ namespace GlContextImpl
{
- ////////////////////////////////////////////////////////////
- /// \brief Constructor
- ///
- ////////////////////////////////////////////////////////////
- TransientContext() :
- referenceCount (0),
- context (0),
- sharedContextLock(0),
- useSharedContext (false)
+ // AMD drivers have issues with internal synchronization
+ // We need to make sure that no operating system context
+ // or pixel format operations are performed simultaneously
+ // This mutex is also used to protect the shared context
+ // from being locked on multiple threads and for managing
+ // the resource count
+ sf::Mutex mutex;
+
+ // OpenGL resources counter
+ unsigned int resourceCount = 0;
+
+ // This per-thread variable holds the current context for each thread
+ sf::ThreadLocalPtr<sf::priv::GlContext> currentContext(NULL);
+
+ // The hidden, inactive context that will be shared with all other contexts
+ ContextType* sharedContext = NULL;
+
+ // Unique identifier, used for identifying contexts when managing unshareable OpenGL resources
+ sf::Uint64 id = 1; // start at 1, zero is "no context"
+
+ // Set containing callback functions to be called whenever a
+ // context is going to be destroyed
+ // Unshareable OpenGL resources rely on this to clean up properly
+ // whenever a context containing them is destroyed
+ typedef std::set<std::pair<sf::ContextDestroyCallback, void*> > ContextDestroyCallbacks;
+ ContextDestroyCallbacks contextDestroyCallbacks;
+
+ // This structure contains all the state necessary to
+ // track TransientContext usage
+ struct TransientContext : private sf::NonCopyable
{
- if (resourceCount == 0)
+ ////////////////////////////////////////////////////////////
+ /// \brief Constructor
+ ///
+ ////////////////////////////////////////////////////////////
+ TransientContext() :
+ referenceCount (0),
+ context (0),
+ sharedContextLock(0),
+ useSharedContext (false)
{
- context = new sf::Context;
+ if (resourceCount == 0)
+ {
+ context = new sf::Context;
+ }
+ else if (!currentContext)
+ {
+ sharedContextLock = new sf::Lock(mutex);
+ useSharedContext = true;
+ sharedContext->setActive(true);
+ }
}
- else if (!currentContext)
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Destructor
+ ///
+ ////////////////////////////////////////////////////////////
+ ~TransientContext()
{
- sharedContextLock = new sf::Lock(mutex);
- useSharedContext = true;
- sharedContext->setActive(true);
+ if (useSharedContext)
+ sharedContext->setActive(false);
+
+ delete sharedContextLock;
+ delete context;
}
- }
- ////////////////////////////////////////////////////////////
- /// \brief Destructor
- ///
- ////////////////////////////////////////////////////////////
- ~TransientContext()
+ ///////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ unsigned int referenceCount;
+ sf::Context* context;
+ sf::Lock* sharedContextLock;
+ bool useSharedContext;
+ };
+
+ // This per-thread variable tracks if and how a transient
+ // context is currently being used on the current thread
+ sf::ThreadLocalPtr<TransientContext> transientContext(NULL);
+
+ // Supported OpenGL extensions
+ std::vector<std::string> extensions;
+
+ // Load our extensions vector with the supported extensions
+ void loadExtensions()
{
- if (useSharedContext)
- sharedContext->setActive(false);
+ extensions.clear();
- delete sharedContextLock;
- delete context;
- }
+ glGetErrorFuncType glGetErrorFunc = reinterpret_cast<glGetErrorFuncType>(sf::priv::GlContext::getFunction("glGetError"));
+ glGetIntegervFuncType glGetIntegervFunc = reinterpret_cast<glGetIntegervFuncType>(sf::priv::GlContext::getFunction("glGetIntegerv"));
+ glGetStringFuncType glGetStringFunc = reinterpret_cast<glGetStringFuncType>(sf::priv::GlContext::getFunction("glGetString"));
- ///////////////////////////////////////////////////////////
- // Member data
- ////////////////////////////////////////////////////////////
- unsigned int referenceCount;
- sf::Context* context;
- sf::Lock* sharedContextLock;
- bool useSharedContext;
- };
+ if (!glGetErrorFunc || !glGetIntegervFunc || !glGetStringFunc)
+ return;
- // This per-thread variable tracks if and how a transient
- // context is currently being used on the current thread
- sf::ThreadLocalPtr<TransientContext> transientContext(NULL);
+ // Check whether a >= 3.0 context is available
+ int majorVersion = 0;
+ glGetIntegervFunc(GL_MAJOR_VERSION, &majorVersion);
- // Supported OpenGL extensions
- std::vector<std::string> extensions;
+ glGetStringiFuncType glGetStringiFunc = reinterpret_cast<glGetStringiFuncType>(sf::priv::GlContext::getFunction("glGetStringi"));
- // Helper to parse OpenGL version strings
- bool parseVersionString(const char* version, const char* prefix, unsigned int &major, unsigned int &minor)
- {
- std::size_t prefixLength = std::strlen(prefix);
+ if (glGetErrorFunc() == GL_INVALID_ENUM || !glGetStringiFunc)
+ {
+ // Try to load the < 3.0 way
+ const char* extensionString = reinterpret_cast<const char*>(glGetStringFunc(GL_EXTENSIONS));
- if ((std::strlen(version) >= (prefixLength + 3)) &&
- (std::strncmp(version, prefix, prefixLength) == 0) &&
- std::isdigit(version[prefixLength]) &&
- (version[prefixLength + 1] == '.') &&
- std::isdigit(version[prefixLength + 2]))
- {
- major = version[prefixLength] - '0';
- minor = version[prefixLength + 2] - '0';
+ do
+ {
+ const char* extension = extensionString;
- return true;
+ while (*extensionString && (*extensionString != ' '))
+ extensionString++;
+
+ extensions.push_back(std::string(extension, extensionString));
+ }
+ while (*extensionString++);
+ }
+ else
+ {
+ // Try to load the >= 3.0 way
+ int numExtensions = 0;
+ glGetIntegervFunc(GL_NUM_EXTENSIONS, &numExtensions);
+
+ if (numExtensions)
+ {
+ for (unsigned int i = 0; i < static_cast<unsigned int>(numExtensions); ++i)
+ {
+ const char* extensionString = reinterpret_cast<const char*>(glGetStringiFunc(GL_EXTENSIONS, i));
+
+ extensions.push_back(extensionString);
+ }
+ }
+ }
}
- return false;
+ // Helper to parse OpenGL version strings
+ bool parseVersionString(const char* version, const char* prefix, unsigned int &major, unsigned int &minor)
+ {
+ std::size_t prefixLength = std::strlen(prefix);
+
+ if ((std::strlen(version) >= (prefixLength + 3)) &&
+ (std::strncmp(version, prefix, prefixLength) == 0) &&
+ std::isdigit(version[prefixLength]) &&
+ (version[prefixLength + 1] == '.') &&
+ std::isdigit(version[prefixLength + 2]))
+ {
+ major = static_cast<unsigned int>(version[prefixLength] - '0');
+ minor = static_cast<unsigned int>(version[prefixLength + 2] - '0');
+
+ return true;
+ }
+
+ return false;
+ }
}
}
@@ -241,6 +323,12 @@ namespace priv
////////////////////////////////////////////////////////////
void GlContext::initResource()
{
+ using GlContextImpl::mutex;
+ using GlContextImpl::resourceCount;
+ using GlContextImpl::currentContext;
+ using GlContextImpl::sharedContext;
+ using GlContextImpl::loadExtensions;
+
// Protect from concurrent access
Lock lock(mutex);
@@ -260,50 +348,7 @@ void GlContext::initResource()
sharedContext->initialize(ContextSettings());
// Load our extensions vector
- extensions.clear();
-
- // Check whether a >= 3.0 context is available
- int majorVersion = 0;
- glGetIntegerv(GL_MAJOR_VERSION, &majorVersion);
-
- if (glGetError() == GL_INVALID_ENUM)
- {
- // Try to load the < 3.0 way
- const char* extensionString = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
-
- do
- {
- const char* extension = extensionString;
-
- while(*extensionString && (*extensionString != ' '))
- extensionString++;
-
- extensions.push_back(std::string(extension, extensionString));
- }
- while (*extensionString++);
- }
- else
- {
- // Try to load the >= 3.0 way
- glGetStringiFuncType glGetStringiFunc = NULL;
- glGetStringiFunc = reinterpret_cast<glGetStringiFuncType>(getFunction("glGetStringi"));
-
- if (glGetStringiFunc)
- {
- int numExtensions = 0;
- glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
-
- if (numExtensions)
- {
- for (unsigned int i = 0; i < static_cast<unsigned int>(numExtensions); ++i)
- {
- const char* extensionString = reinterpret_cast<const char*>(glGetStringiFunc(GL_EXTENSIONS, i));
-
- extensions.push_back(extensionString);
- }
- }
- }
- }
+ loadExtensions();
// Deactivate the shared context so that others can activate it when necessary
sharedContext->setActive(false);
@@ -317,6 +362,10 @@ void GlContext::initResource()
////////////////////////////////////////////////////////////
void GlContext::cleanupResource()
{
+ using GlContextImpl::mutex;
+ using GlContextImpl::resourceCount;
+ using GlContextImpl::sharedContext;
+
// Protect from concurrent access
Lock lock(mutex);
@@ -339,13 +388,17 @@ void GlContext::cleanupResource()
////////////////////////////////////////////////////////////
void GlContext::registerContextDestroyCallback(ContextDestroyCallback callback, void* arg)
{
- contextDestroyCallbacks.insert(std::make_pair(callback, arg));
+ GlContextImpl::contextDestroyCallbacks.insert(std::make_pair(callback, arg));
}
////////////////////////////////////////////////////////////
void GlContext::acquireTransientContext()
{
+ using GlContextImpl::mutex;
+ using GlContextImpl::TransientContext;
+ using GlContextImpl::transientContext;
+
// Protect from concurrent access
Lock lock(mutex);
@@ -362,6 +415,9 @@ void GlContext::acquireTransientContext()
////////////////////////////////////////////////////////////
void GlContext::releaseTransientContext()
{
+ using GlContextImpl::mutex;
+ using GlContextImpl::transientContext;
+
// Protect from concurrent access
Lock lock(mutex);
@@ -384,6 +440,9 @@ void GlContext::releaseTransientContext()
////////////////////////////////////////////////////////////
GlContext* GlContext::create()
{
+ using GlContextImpl::mutex;
+ using GlContextImpl::sharedContext;
+
// Make sure that there's an active context (context creation may need extensions, and thus a valid context)
assert(sharedContext != NULL);
@@ -412,11 +471,35 @@ GlContext* GlContext::create()
////////////////////////////////////////////////////////////
GlContext* GlContext::create(const ContextSettings& settings, const WindowImpl* owner, unsigned int bitsPerPixel)
{
+ using GlContextImpl::mutex;
+ using GlContextImpl::resourceCount;
+ using GlContextImpl::sharedContext;
+ using GlContextImpl::loadExtensions;
+
// Make sure that there's an active context (context creation may need extensions, and thus a valid context)
assert(sharedContext != NULL);
Lock lock(mutex);
+ // If resourceCount is 1 we know that we are inside sf::Context or sf::Window
+ // Only in this situation we allow the user to indirectly re-create the shared context as a core context
+
+ // Check if we need to convert our shared context into a core context
+ if ((resourceCount == 1) &&
+ (settings.attributeFlags & ContextSettings::Core) &&
+ !(sharedContext->m_settings.attributeFlags & ContextSettings::Core))
+ {
+ // Re-create our shared context as a core context
+ ContextSettings sharedSettings(0, 0, 0, settings.majorVersion, settings.minorVersion, settings.attributeFlags);
+
+ delete sharedContext;
+ sharedContext = new ContextType(NULL, sharedSettings, 1, 1);
+ sharedContext->initialize(sharedSettings);
+
+ // Reload our extensions vector
+ loadExtensions();
+ }
+
GlContext* context = NULL;
// We don't use acquireTransientContext here since we have
@@ -441,11 +524,35 @@ GlContext* GlContext::create(const ContextSettings& settings, const WindowImpl*
////////////////////////////////////////////////////////////
GlContext* GlContext::create(const ContextSettings& settings, unsigned int width, unsigned int height)
{
+ using GlContextImpl::mutex;
+ using GlContextImpl::resourceCount;
+ using GlContextImpl::sharedContext;
+ using GlContextImpl::loadExtensions;
+
// Make sure that there's an active context (context creation may need extensions, and thus a valid context)
assert(sharedContext != NULL);
Lock lock(mutex);
+ // If resourceCount is 1 we know that we are inside sf::Context or sf::Window
+ // Only in this situation we allow the user to indirectly re-create the shared context as a core context
+
+ // Check if we need to convert our shared context into a core context
+ if ((resourceCount == 1) &&
+ (settings.attributeFlags & ContextSettings::Core) &&
+ !(sharedContext->m_settings.attributeFlags & ContextSettings::Core))
+ {
+ // Re-create our shared context as a core context
+ ContextSettings sharedSettings(0, 0, 0, settings.majorVersion, settings.minorVersion, settings.attributeFlags);
+
+ delete sharedContext;
+ sharedContext = new ContextType(NULL, sharedSettings, 1, 1);
+ sharedContext->initialize(sharedSettings);
+
+ // Reload our extensions vector
+ loadExtensions();
+ }
+
GlContext* context = NULL;
// We don't use acquireTransientContext here since we have
@@ -470,6 +577,7 @@ GlContext* GlContext::create(const ContextSettings& settings, unsigned int width
////////////////////////////////////////////////////////////
bool GlContext::isExtensionAvailable(const char* name)
{
+ using GlContextImpl::extensions;
return std::find(extensions.begin(), extensions.end(), name) != extensions.end();
}
@@ -477,23 +585,24 @@ bool GlContext::isExtensionAvailable(const char* name)
////////////////////////////////////////////////////////////
GlFunctionPointer GlContext::getFunction(const char* name)
{
-#if !defined(SFML_OPENGL_ES)
-
- Lock lock(mutex);
+ Lock lock(GlContextImpl::mutex);
return ContextType::getFunction(name);
+}
-#else
-
- return 0;
-#endif
+////////////////////////////////////////////////////////////
+const GlContext* GlContext::getActiveContext()
+{
+ using GlContextImpl::currentContext;
+ return currentContext;
}
////////////////////////////////////////////////////////////
Uint64 GlContext::getActiveContextId()
{
+ using GlContextImpl::currentContext;
return currentContext ? currentContext->m_id : 0;
}
@@ -501,6 +610,9 @@ Uint64 GlContext::getActiveContextId()
////////////////////////////////////////////////////////////
GlContext::~GlContext()
{
+ using GlContextImpl::currentContext;
+ using GlContextImpl::sharedContext;
+
// Deactivate the context before killing it, unless we're inside Cleanup()
if (sharedContext)
{
@@ -520,6 +632,10 @@ const ContextSettings& GlContext::getSettings() const
////////////////////////////////////////////////////////////
bool GlContext::setActive(bool active)
{
+ using GlContextImpl::mutex;
+ using GlContextImpl::currentContext;
+ using GlContextImpl::sharedContext;
+
if (active)
{
if (this != currentContext)
@@ -572,7 +688,7 @@ bool GlContext::setActive(bool active)
////////////////////////////////////////////////////////////
GlContext::GlContext() :
-m_id(id++)
+m_id(GlContextImpl::id++)
{
// Nothing to do
}
@@ -610,6 +726,10 @@ int GlContext::evaluateFormat(unsigned int bitsPerPixel, const ContextSettings&
////////////////////////////////////////////////////////////
void GlContext::cleanupUnsharedResources()
{
+ using GlContextImpl::currentContext;
+ using GlContextImpl::ContextDestroyCallbacks;
+ using GlContextImpl::contextDestroyCallbacks;
+
// Save the current context so we can restore it later
GlContext* contextToRestore = currentContext;
@@ -641,10 +761,22 @@ void GlContext::initialize(const ContextSettings& requestedSettings)
int minorVersion = 0;
// Try the new way first
- glGetIntegerv(GL_MAJOR_VERSION, &majorVersion);
- glGetIntegerv(GL_MINOR_VERSION, &minorVersion);
+ glGetIntegervFuncType glGetIntegervFunc = reinterpret_cast<glGetIntegervFuncType>(getFunction("glGetIntegerv"));
+ glGetErrorFuncType glGetErrorFunc = reinterpret_cast<glGetErrorFuncType>(getFunction("glGetError"));
+ glGetStringFuncType glGetStringFunc = reinterpret_cast<glGetStringFuncType>(getFunction("glGetString"));
+ glEnableFuncType glEnableFunc = reinterpret_cast<glEnableFuncType>(getFunction("glEnable"));
+ glIsEnabledFuncType glIsEnabledFunc = reinterpret_cast<glIsEnabledFuncType>(getFunction("glIsEnabled"));
+
+ if (!glGetIntegervFunc || !glGetErrorFunc || !glGetStringFunc || !glEnableFunc || !glIsEnabledFunc)
+ {
+ err() << "Could not load necessary function to initialize OpenGL context" << std::endl;
+ return;
+ }
+
+ glGetIntegervFunc(GL_MAJOR_VERSION, &majorVersion);
+ glGetIntegervFunc(GL_MINOR_VERSION, &minorVersion);
- if (glGetError() != GL_INVALID_ENUM)
+ if (glGetErrorFunc() != GL_INVALID_ENUM)
{
m_settings.majorVersion = static_cast<unsigned int>(majorVersion);
m_settings.minorVersion = static_cast<unsigned int>(minorVersion);
@@ -657,7 +789,7 @@ void GlContext::initialize(const ContextSettings& requestedSettings)
m_settings.majorVersion = 1;
m_settings.minorVersion = 1;
- const char* version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
+ const char* version = reinterpret_cast<const char*>(glGetStringFunc(GL_VERSION));
if (version)
{
// OpenGL ES Common Lite profile: The beginning of the returned string is "OpenGL ES-CL major.minor"
@@ -665,6 +797,8 @@ void GlContext::initialize(const ContextSettings& requestedSettings)
// OpenGL ES Full profile: The beginning of the returned string is "OpenGL ES major.minor"
// Desktop OpenGL: The beginning of the returned string is "major.minor"
+ using GlContextImpl::parseVersionString;
+
if (!parseVersionString(version, "OpenGL ES-CL ", m_settings.majorVersion, m_settings.minorVersion) &&
!parseVersionString(version, "OpenGL ES-CM ", m_settings.majorVersion, m_settings.minorVersion) &&
!parseVersionString(version, "OpenGL ES ", m_settings.majorVersion, m_settings.minorVersion) &&
@@ -701,7 +835,7 @@ void GlContext::initialize(const ContextSettings& requestedSettings)
{
// Retrieve the context flags
int flags = 0;
- glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
+ glGetIntegervFunc(GL_CONTEXT_FLAGS, &flags);
if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)
m_settings.attributeFlags |= ContextSettings::Debug;
@@ -715,7 +849,7 @@ void GlContext::initialize(const ContextSettings& requestedSettings)
if (glGetStringiFunc)
{
int numExtensions = 0;
- glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
+ glGetIntegervFunc(GL_NUM_EXTENSIONS, &numExtensions);
for (unsigned int i = 0; i < static_cast<unsigned int>(numExtensions); ++i)
{
@@ -733,7 +867,7 @@ void GlContext::initialize(const ContextSettings& requestedSettings)
{
// Retrieve the context profile
int profile = 0;
- glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
+ glGetIntegervFunc(GL_CONTEXT_PROFILE_MASK, &profile);
if (profile & GL_CONTEXT_CORE_PROFILE_BIT)
m_settings.attributeFlags |= ContextSettings::Core;
@@ -743,7 +877,7 @@ void GlContext::initialize(const ContextSettings& requestedSettings)
// Enable anti-aliasing if requested by the user and supported
if ((requestedSettings.antialiasingLevel > 0) && (m_settings.antialiasingLevel > 0))
{
- glEnable(GL_MULTISAMPLE);
+ glEnableFunc(GL_MULTISAMPLE);
}
else
{
@@ -753,10 +887,10 @@ void GlContext::initialize(const ContextSettings& requestedSettings)
// Enable sRGB if requested by the user and supported
if (requestedSettings.sRgbCapable && m_settings.sRgbCapable)
{
- glEnable(GL_FRAMEBUFFER_SRGB);
+ glEnableFunc(GL_FRAMEBUFFER_SRGB);
// Check to see if the enable was successful
- if (glIsEnabled(GL_FRAMEBUFFER_SRGB) == GL_FALSE)
+ if (glIsEnabledFunc(GL_FRAMEBUFFER_SRGB) == GL_FALSE)
{
err() << "Warning: Failed to enable GL_FRAMEBUFFER_SRGB" << std::endl;
m_settings.sRgbCapable = false;
@@ -774,9 +908,18 @@ void GlContext::checkSettings(const ContextSettings& requestedSettings)
{
// Perform checks to inform the user if they are getting a context they might not have expected
+ glGetStringFuncType glGetStringFunc = reinterpret_cast<glGetStringFuncType>(getFunction("glGetString"));
+
+ if (!glGetStringFunc)
+ {
+ err() << "Could not load glGetString function" << std::endl;
+
+ return;
+ }
+
// Detect any known non-accelerated implementations and warn
- const char* vendorName = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
- const char* rendererName = reinterpret_cast<const char*>(glGetString(GL_RENDERER));
+ const char* vendorName = reinterpret_cast<const char*>(glGetStringFunc(GL_VENDOR));
+ const char* rendererName = reinterpret_cast<const char*>(glGetStringFunc(GL_RENDERER));
if (vendorName && rendererName)
{
@@ -787,8 +930,8 @@ void GlContext::checkSettings(const ContextSettings& requestedSettings)
}
}
- int version = m_settings.majorVersion * 10 + m_settings.minorVersion;
- int requestedVersion = requestedSettings.majorVersion * 10 + requestedSettings.minorVersion;
+ int version = static_cast<int>(m_settings.majorVersion * 10u + m_settings.minorVersion);
+ int requestedVersion = static_cast<int>(requestedSettings.majorVersion * 10u + requestedSettings.minorVersion);
if ((m_settings.attributeFlags != requestedSettings.attributeFlags) ||
(version < requestedVersion) ||
diff --git a/src/SFML/Window/GlContext.hpp b/src/SFML/Window/GlContext.hpp
index 0b66965..e84ff60 100644
--- a/src/SFML/Window/GlContext.hpp
+++ b/src/SFML/Window/GlContext.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -158,6 +158,14 @@ public:
static GlFunctionPointer getFunction(const char* name);
////////////////////////////////////////////////////////////
+ /// \brief Get the currently active context
+ ///
+ /// \return The currently active context or NULL if none is active
+ ///
+ ////////////////////////////////////////////////////////////
+ static const GlContext* getActiveContext();
+
+ ////////////////////////////////////////////////////////////
/// \brief Get the currently active context's ID
///
/// The context ID is used to identify contexts when
@@ -273,7 +281,7 @@ protected:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- ContextSettings m_settings; ///< Creation settings of the context
+ ContextSettings m_settings; //!< Creation settings of the context
private:
@@ -294,7 +302,7 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- const Uint64 m_id; ///< Unique number that identifies the context
+ const Uint64 m_id; //!< Unique number that identifies the context
};
} // namespace priv
diff --git a/src/SFML/Window/GlResource.cpp b/src/SFML/Window/GlResource.cpp
index 64fc88c..a31ff29 100644
--- a/src/SFML/Window/GlResource.cpp
+++ b/src/SFML/Window/GlResource.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/InputImpl.hpp b/src/SFML/Window/InputImpl.hpp
index 305fc09..014cfd9 100644
--- a/src/SFML/Window/InputImpl.hpp
+++ b/src/SFML/Window/InputImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -32,8 +32,12 @@
#if defined(SFML_SYSTEM_WINDOWS)
#include <SFML/Window/Win32/InputImpl.hpp>
-#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD)
- #include <SFML/Window/Unix/InputImpl.hpp>
+#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD)
+ #if defined(SFML_USE_DRM)
+ #include <SFML/Window/DRM/InputImplUDev.hpp>
+ #else
+ #include <SFML/Window/Unix/InputImpl.hpp>
+ #endif
#elif defined(SFML_SYSTEM_MACOS)
#include <SFML/Window/OSX/InputImpl.hpp>
#elif defined(SFML_SYSTEM_IOS)
@@ -42,5 +46,4 @@
#include <SFML/Window/Android/InputImpl.hpp>
#endif
-
#endif // SFML_INPUTIMPL_HPP
diff --git a/src/SFML/Window/Joystick.cpp b/src/SFML/Window/Joystick.cpp
index 62793f1..e223043 100644
--- a/src/SFML/Window/Joystick.cpp
+++ b/src/SFML/Window/Joystick.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/JoystickImpl.hpp b/src/SFML/Window/JoystickImpl.hpp
index e4fd7e2..b915a6f 100644
--- a/src/SFML/Window/JoystickImpl.hpp
+++ b/src/SFML/Window/JoystickImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -30,7 +30,6 @@
////////////////////////////////////////////////////////////
#include <SFML/Config.hpp>
#include <SFML/Window/Joystick.hpp>
-#include <SFML/System/String.hpp>
#include <algorithm>
@@ -50,8 +49,8 @@ struct JoystickCaps
std::fill(axes, axes + Joystick::AxisCount, false);
}
- unsigned int buttonCount; ///< Number of buttons supported by the joystick
- bool axes[Joystick::AxisCount]; ///< Support for each axis
+ unsigned int buttonCount; //!< Number of buttons supported by the joystick
+ bool axes[Joystick::AxisCount]; //!< Support for each axis
};
@@ -68,9 +67,9 @@ struct JoystickState
std::fill(buttons, buttons + Joystick::ButtonCount, false);
}
- bool connected; ///< Is the joystick currently connected?
- float axes[Joystick::AxisCount]; ///< Position of each axis, in range [-100, 100]
- bool buttons[Joystick::ButtonCount]; ///< Status of each button (true = pressed)
+ bool connected; //!< Is the joystick currently connected?
+ float axes[Joystick::AxisCount]; //!< Position of each axis, in range [-100, 100]
+ bool buttons[Joystick::ButtonCount]; //!< Status of each button (true = pressed)
};
} // namespace priv
@@ -94,6 +93,10 @@ struct JoystickState
#include <SFML/Window/OpenBSD/JoystickImpl.hpp>
+#elif defined(SFML_SYSTEM_NETBSD)
+
+ #include <SFML/Window/NetBSD/JoystickImpl.hpp>
+
#elif defined(SFML_SYSTEM_MACOS)
#include <SFML/Window/OSX/JoystickImpl.hpp>
diff --git a/src/SFML/Window/JoystickManager.cpp b/src/SFML/Window/JoystickManager.cpp
index 1574faa..8d4e393 100644
--- a/src/SFML/Window/JoystickManager.cpp
+++ b/src/SFML/Window/JoystickManager.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -64,7 +64,7 @@ const Joystick::Identification& JoystickManager::getIdentification(unsigned int
////////////////////////////////////////////////////////////
void JoystickManager::update()
{
- for (int i = 0; i < Joystick::Count; ++i)
+ for (unsigned int i = 0; i < Joystick::Count; ++i)
{
Item& item = m_joysticks[i];
diff --git a/src/SFML/Window/JoystickManager.hpp b/src/SFML/Window/JoystickManager.hpp
index 08692cd..a593266 100644
--- a/src/SFML/Window/JoystickManager.hpp
+++ b/src/SFML/Window/JoystickManager.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -109,16 +109,16 @@ private:
////////////////////////////////////////////////////////////
struct Item
{
- JoystickImpl joystick; ///< Joystick implementation
- JoystickState state; ///< The current joystick state
- JoystickCaps capabilities; ///< The joystick capabilities
- Joystick::Identification identification; ///< The joystick identification
+ JoystickImpl joystick; //!< Joystick implementation
+ JoystickState state; //!< The current joystick state
+ JoystickCaps capabilities; //!< The joystick capabilities
+ Joystick::Identification identification; //!< The joystick identification
};
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Item m_joysticks[Joystick::Count]; ///< Joysticks information and state
+ Item m_joysticks[Joystick::Count]; //!< Joysticks information and state
};
} // namespace priv
diff --git a/src/SFML/Window/Keyboard.cpp b/src/SFML/Window/Keyboard.cpp
index 14cda19..9856b02 100644
--- a/src/SFML/Window/Keyboard.cpp
+++ b/src/SFML/Window/Keyboard.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -27,6 +27,7 @@
////////////////////////////////////////////////////////////
#include <SFML/Window/Keyboard.hpp>
#include <SFML/Window/InputImpl.hpp>
+#include <SFML/System/String.hpp>
namespace sf
@@ -37,6 +38,29 @@ bool Keyboard::isKeyPressed(Key key)
return priv::InputImpl::isKeyPressed(key);
}
+////////////////////////////////////////////////////////////
+bool Keyboard::isKeyPressed(Scancode code)
+{
+ return priv::InputImpl::isKeyPressed(code);
+}
+
+////////////////////////////////////////////////////////////
+Keyboard::Key Keyboard::localize(Scancode code)
+{
+ return priv::InputImpl::localize(code);
+}
+
+////////////////////////////////////////////////////////////
+Keyboard::Scancode Keyboard::delocalize(Key key)
+{
+ return priv::InputImpl::delocalize(key);
+}
+
+////////////////////////////////////////////////////////////
+String Keyboard::getDescription(Scancode code)
+{
+ return priv::InputImpl::getDescription(code);
+}
////////////////////////////////////////////////////////////
void Keyboard::setVirtualKeyboardVisible(bool visible)
diff --git a/src/SFML/Window/Mouse.cpp b/src/SFML/Window/Mouse.cpp
index 862dc69..fceace8 100644
--- a/src/SFML/Window/Mouse.cpp
+++ b/src/SFML/Window/Mouse.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -47,7 +47,7 @@ Vector2i Mouse::getPosition()
////////////////////////////////////////////////////////////
-Vector2i Mouse::getPosition(const Window& relativeTo)
+Vector2i Mouse::getPosition(const WindowBase& relativeTo)
{
return priv::InputImpl::getMousePosition(relativeTo);
}
@@ -61,7 +61,7 @@ void Mouse::setPosition(const Vector2i& position)
////////////////////////////////////////////////////////////
-void Mouse::setPosition(const Vector2i& position, const Window& relativeTo)
+void Mouse::setPosition(const Vector2i& position, const WindowBase& relativeTo)
{
priv::InputImpl::setMousePosition(position, relativeTo);
}
diff --git a/src/SFML/Window/NetBSD/JoystickImpl.cpp b/src/SFML/Window/NetBSD/JoystickImpl.cpp
new file mode 100644
index 0000000..d187222
--- /dev/null
+++ b/src/SFML/Window/NetBSD/JoystickImpl.cpp
@@ -0,0 +1,350 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+// 2013-2013 David Demelier (demelier.david@gmail.com)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/JoystickImpl.hpp>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <cstring>
+#include <map>
+#include <string>
+#include <utility>
+
+////////////////////////////////////////////////////////////
+/// \brief This file implements NetBSD driver joystick
+///
+////////////////////////////////////////////////////////////
+
+
+namespace
+{
+ std::map<unsigned int, std::string> plugged;
+ std::map<int, std::pair<int, int> > hatValueMap;
+
+ bool isJoystick(const char *name)
+ {
+ int file = ::open(name, O_RDONLY | O_NONBLOCK);
+ int id;
+
+ if (file < 0)
+ return false;
+
+ report_desc_t desc = hid_get_report_desc(file);
+
+ if (!desc)
+ {
+ ::close(file);
+ return false;
+ }
+
+ if (ioctl(file, USB_GET_REPORT_ID, &id) < 0)
+ {
+ ::close(file);
+ return false;
+ }
+
+ hid_data_t data = hid_start_parse(desc, 1 << hid_input, id);
+
+ if (!data)
+ {
+ hid_dispose_report_desc(desc);
+ ::close(file);
+ return false;
+ }
+
+ hid_item_t item;
+
+ // Assume it isn't
+ bool result = false;
+
+ while (hid_get_item(data, &item) > 0)
+ {
+ if ((item.kind == hid_collection) && (HID_PAGE(item.usage) == HUP_GENERIC_DESKTOP))
+ {
+ if ((HID_USAGE(item.usage) == HUG_JOYSTICK) || (HID_USAGE(item.usage) == HUG_GAME_PAD))
+ {
+ result = true;
+ }
+ }
+ }
+
+ hid_end_parse(data);
+ hid_dispose_report_desc(desc);
+ ::close(file);
+
+ return result;
+ }
+
+ void updatePluggedList()
+ {
+ /*
+ * Devices /dev/uhid<x> are shared between joystick and any other
+ * human interface device. We need to iterate over all found devices
+ * and check if they are joysticks. The index of JoystickImpl::open
+ * does not match the /dev/uhid<index> device!
+ */
+ DIR* directory = opendir("/dev");
+
+ if (directory)
+ {
+ int joystickCount = 0;
+ struct dirent* directoryEntry = readdir(directory);
+
+ while (directoryEntry && joystickCount < sf::Joystick::Count)
+ {
+ if (!std::strncmp(directoryEntry->d_name, "uhid", 4))
+ {
+ std::string name("/dev/");
+ name += directoryEntry->d_name;
+
+ if (isJoystick(name.c_str()))
+ plugged[joystickCount++] = name;
+ }
+
+ directoryEntry = readdir(directory);
+ }
+
+ closedir(directory);
+ }
+ }
+
+ int usageToAxis(int usage)
+ {
+ switch (usage)
+ {
+ case HUG_X: return sf::Joystick::X;
+ case HUG_Y: return sf::Joystick::Y;
+ case HUG_Z: return sf::Joystick::Z;
+ case HUG_RZ: return sf::Joystick::R;
+ case HUG_RX: return sf::Joystick::U;
+ case HUG_RY: return sf::Joystick::V;
+ default: return -1;
+ }
+ }
+
+ void hatValueToSfml(int value, sf::priv::JoystickState& state)
+ {
+ state.axes[sf::Joystick::PovX] = hatValueMap[value].first;
+ state.axes[sf::Joystick::PovY] = hatValueMap[value].second;
+ }
+}
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+void JoystickImpl::initialize()
+{
+ hid_init(NULL);
+
+ // Do an initial scan
+ updatePluggedList();
+
+ // Map of hat values
+ hatValueMap[0] = std::make_pair( 0, 0); // center
+
+ hatValueMap[1] = std::make_pair( 0, -100); // top
+ hatValueMap[3] = std::make_pair( 100, 0); // right
+ hatValueMap[5] = std::make_pair( 0, 100); // bottom
+ hatValueMap[7] = std::make_pair(-100, 0); // left
+
+ hatValueMap[2] = std::make_pair( 100, -100); // top-right
+ hatValueMap[4] = std::make_pair( 100, 100); // bottom-right
+ hatValueMap[6] = std::make_pair(-100, 100); // bottom-left
+ hatValueMap[8] = std::make_pair(-100, -100); // top-left
+}
+
+
+////////////////////////////////////////////////////////////
+void JoystickImpl::cleanup()
+{
+}
+
+
+////////////////////////////////////////////////////////////
+bool JoystickImpl::isConnected(unsigned int index)
+{
+ return plugged.find(index) != plugged.end();
+}
+
+
+////////////////////////////////////////////////////////////
+bool JoystickImpl::open(unsigned int index)
+{
+ if (isConnected(index))
+ {
+ // Open the joystick's file descriptor (read-only and non-blocking)
+ m_file = ::open(plugged[index].c_str(), O_RDONLY | O_NONBLOCK);
+ if (m_file >= 0)
+ {
+ // Reset the joystick state
+ m_state = JoystickState();
+
+ // Get the report descriptor
+ m_desc = hid_get_report_desc(m_file);
+ if (!m_desc)
+ {
+ ::close(m_file);
+ return false;
+ }
+
+ // And the id
+ if (ioctl(m_file, USB_GET_REPORT_ID, &m_id) < 0)
+ {
+ ::close(m_file);
+ return false;
+ }
+
+ // Then allocate a buffer for data retrieval
+ m_length = hid_report_size(m_desc, hid_input, m_id);
+ m_buffer.resize(m_length);
+
+ m_state.connected = true;
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////
+void JoystickImpl::close()
+{
+ ::close(m_file);
+ hid_dispose_report_desc(m_desc);
+}
+
+
+////////////////////////////////////////////////////////////
+JoystickCaps JoystickImpl::getCapabilities() const
+{
+ JoystickCaps caps;
+ hid_item_t item;
+
+ hid_data_t data = hid_start_parse(m_desc, 1 << hid_input, m_id);
+
+ while (hid_get_item(data, &item))
+ {
+ if (item.kind == hid_input)
+ {
+ int usage = HID_USAGE(item.usage);
+
+ if (usage == HUP_BUTTON)
+ {
+ caps.buttonCount++;
+ break;
+ }
+ else if (usage == HUP_GENERIC_DESKTOP)
+ {
+ int axis = usageToAxis(usage);
+
+ if (usage == HUG_HAT_SWITCH)
+ {
+ caps.axes[Joystick::PovX] = true;
+ caps.axes[Joystick::PovY] = true;
+ }
+ else if (axis != -1)
+ {
+ caps.axes[axis] = true;
+ }
+ }
+ }
+ }
+
+ hid_end_parse(data);
+
+ return caps;
+}
+
+
+////////////////////////////////////////////////////////////
+Joystick::Identification JoystickImpl::getIdentification() const
+{
+ return m_identification;
+}
+
+
+////////////////////////////////////////////////////////////
+JoystickState JoystickImpl::JoystickImpl::update()
+{
+ while (read(m_file, &m_buffer[0], m_length) == m_length)
+ {
+ hid_data_t data = hid_start_parse(m_desc, 1 << hid_input, m_id);
+
+ // No memory?
+ if (!data)
+ continue;
+
+ int buttonIndex = 0;
+ hid_item_t item;
+
+ while (hid_get_item(data, &item))
+ {
+ if (item.kind == hid_input)
+ {
+ int usage = HID_USAGE(item.usage);
+
+ if (usage == HUP_BUTTON)
+ {
+ m_state.buttons[buttonIndex++] = hid_get_data(&m_buffer[0], &item);
+ }
+ else if (usage == HUP_GENERIC_DESKTOP)
+ {
+ int value = hid_get_data(&m_buffer[0], &item);
+ int axis = usageToAxis(usage);
+
+ if (usage == HUG_HAT_SWITCH)
+ {
+ hatValueToSfml(value, m_state);
+ }
+ else if (axis != -1)
+ {
+ int minimum = item.logical_minimum;
+ int maximum = item.logical_maximum;
+
+ value = (value - minimum) * 200 / (maximum - minimum) - 100;
+ m_state.axes[axis] = value;
+ }
+ }
+ }
+ }
+
+ hid_end_parse(data);
+ }
+
+ return m_state;
+}
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Window/NetBSD/JoystickImpl.hpp b/src/SFML/Window/NetBSD/JoystickImpl.hpp
new file mode 100644
index 0000000..a05cdef
--- /dev/null
+++ b/src/SFML/Window/NetBSD/JoystickImpl.hpp
@@ -0,0 +1,130 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_JOYSTICKIMPLNETBSD_HPP
+#define SFML_JOYSTICKIMPLNETBSD_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <dev/usb/usb.h>
+#include <dev/usb/usbhid.h>
+#include <usbhid.h>
+#include <vector>
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+/// \brief FreeBSD implementation of joysticks
+///
+/// This code has been tested on FreeBSD 9.1 only.
+////////////////////////////////////////////////////////////
+class JoystickImpl
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Perform the global initialization of the joystick module
+ ///
+ ////////////////////////////////////////////////////////////
+ static void initialize();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Perform the global cleanup of the joystick module
+ ///
+ ////////////////////////////////////////////////////////////
+ static void cleanup();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Check if a joystick is currently connected
+ ///
+ /// \param index Index of the joystick to check
+ ///
+ /// \return True if the joystick is connected, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isConnected(unsigned int index);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Open the joystick
+ ///
+ /// \param index Index assigned to the joystick
+ ///
+ /// \return True on success, false on failure
+ ///
+ ////////////////////////////////////////////////////////////
+ bool open(unsigned int index);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Close the joystick
+ ///
+ ////////////////////////////////////////////////////////////
+ void close();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the joystick capabilities
+ ///
+ /// \return Joystick capabilities
+ ///
+ ////////////////////////////////////////////////////////////
+ JoystickCaps getCapabilities() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the joystick identification
+ ///
+ /// \return Joystick identification
+ ///
+ ////////////////////////////////////////////////////////////
+ Joystick::Identification getIdentification() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Update the joystick and get its new state
+ ///
+ /// \return Joystick state
+ ///
+ ////////////////////////////////////////////////////////////
+ JoystickState update();
+
+private:
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ int m_file; ///< File descriptor of the joystick
+ report_desc_t m_desc; ///< USB report descriptor
+ int m_id; ///< USB id
+ std::vector<char> m_buffer; ///< USB HID buffer
+ int m_length; ///< Buffer length
+ Joystick::Identification m_identification; ///< Joystick identification
+ JoystickState m_state; ///< Current state of the joystick
+};
+
+} // namespace priv
+
+} // namespace sf
+
+
+#endif // SFML_JOYSTICKIMPLNETBSD_HPP
diff --git a/src/SFML/Window/OSX/AutoreleasePoolWrapper.hpp b/src/SFML/Window/OSX/AutoreleasePoolWrapper.hpp
new file mode 100644
index 0000000..340ca6f
--- /dev/null
+++ b/src/SFML/Window/OSX/AutoreleasePoolWrapper.hpp
@@ -0,0 +1,76 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
+// Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_AUTORELEASEPOOL_HPP
+#define SFML_AUTORELEASEPOOL_HPP
+
+////////////////////////////////////////////////////////////
+/// Predefine OBJ-C classes
+////////////////////////////////////////////////////////////
+#ifdef __OBJC__
+
+@class NSAutoreleasePool;
+typedef NSAutoreleasePool* NSAutoreleasePoolRef;
+
+#else // If C++
+
+typedef void* NSAutoreleasePoolRef;
+
+#endif
+
+namespace sf
+{
+
+////////////////////////////////////////////////////////////
+/// \brief Wraps an NSAutoreleasePool that is created when the object is
+/// constructed and is drained when the object is destroyed.
+///
+////////////////////////////////////////////////////////////
+class AutoreleasePool
+{
+public:
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct a new NSAutoreleasePool.
+ ///
+ ////////////////////////////////////////////////////////////
+ AutoreleasePool();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Drain the autorelease pool.
+ ///
+ ////////////////////////////////////////////////////////////
+ ~AutoreleasePool();
+
+private:
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ NSAutoreleasePoolRef pool; ///< The autorelease pool.
+};
+
+} // namespace sf
+
+#endif // SFML_AUTORELEASEPOOL_HPP
diff --git a/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm b/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm
index 6b341b2..9b33184 100644
--- a/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm
+++ b/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -26,80 +26,25 @@
////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
-#include <cassert>
-#include <pthread.h>
-#import <SFML/Window/OSX/AutoreleasePoolWrapper.h>
-#import <Foundation/Foundation.h>
-
-
-////////////////////////////////////////////////////////////
-/// Here we manage one and only one pool by thread. This prevents draining one
-/// pool and making other pools invalid which can lead to a crash on 10.5 and an
-/// annoying message on 10.6 (*** attempt to pop an unknown autorelease pool).
-///
-////////////////////////////////////////////////////////////
-
-
-////////////////////////////////////////////////////////////
-// Private data
-////////////////////////////////////////////////////////////
-static pthread_key_t poolKey;
-static pthread_once_t initOnceToken = PTHREAD_ONCE_INIT;
-
-
-////////////////////////////////////////////////////////////
-/// \brief (local function) Drain one more time the pool
-/// but this time don't create a new one.
-///
-////////////////////////////////////////////////////////////
-static void destroyPool(void* data)
-{
- NSAutoreleasePool* pool = (NSAutoreleasePool*)data;
- [pool drain];
-}
+#include <SFML/Window/OSX/AutoreleasePoolWrapper.hpp>
+#import <Foundation/Foundation.h>
-////////////////////////////////////////////////////////////
-/// \brief (local function) Init the pthread key for the pool
-///
-////////////////////////////////////////////////////////////
-static void createPoolKey(void)
+namespace sf
{
- pthread_key_create(&poolKey, destroyPool);
-}
-
-////////////////////////////////////////////////////////////
-/// \brief (local function) Store a new pool for this thread
-///
-////////////////////////////////////////////////////////////
-static void createNewPool(void)
+////////////////////////////////////////////////////////
+AutoreleasePool::AutoreleasePool()
{
- NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
- pthread_setspecific(poolKey, pool);
+ pool = [[NSAutoreleasePool alloc] init];
}
-////////////////////////////////////////////////////////////
-void ensureThreadHasPool(void)
+////////////////////////////////////////////////////////
+AutoreleasePool::~AutoreleasePool()
{
- pthread_once(&initOnceToken, createPoolKey);
- if (pthread_getspecific(poolKey) == NULL)
- {
- createNewPool();
- }
-}
-
-
-////////////////////////////////////////////////////////////
-void drainThreadPool(void)
-{
- void* data = pthread_getspecific(poolKey);
- assert(data != NULL);
-
- // Drain the pool but keep it alive by creating a new one
- destroyPool(data);
- createNewPool();
+ [pool drain];
}
+} // namespace sf
diff --git a/src/SFML/Window/OSX/ClipboardImpl.hpp b/src/SFML/Window/OSX/ClipboardImpl.hpp
index d3aabef..8624682 100644
--- a/src/SFML/Window/OSX/ClipboardImpl.hpp
+++ b/src/SFML/Window/OSX/ClipboardImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/OSX/ClipboardImpl.mm b/src/SFML/Window/OSX/ClipboardImpl.mm
index a14d871..2530033 100644
--- a/src/SFML/Window/OSX/ClipboardImpl.mm
+++ b/src/SFML/Window/OSX/ClipboardImpl.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -25,6 +25,7 @@
////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
+#include <SFML/Window/OSX/AutoreleasePoolWrapper.hpp>
#include <SFML/Window/OSX/ClipboardImpl.hpp>
#import <AppKit/AppKit.h>
@@ -37,6 +38,7 @@ namespace priv
////////////////////////////////////////////////////////////
String ClipboardImpl::getString()
{
+ AutoreleasePool pool;
NSPasteboard* pboard = [NSPasteboard generalPasteboard];
NSString* data = [pboard stringForType:NSPasteboardTypeString];
@@ -50,6 +52,7 @@ String ClipboardImpl::getString()
////////////////////////////////////////////////////////////
void ClipboardImpl::setString(const String& text)
{
+ AutoreleasePool pool;
std::basic_string<Uint8> utf8 = text.toUtf8();
NSString* data = [[NSString alloc] initWithBytes:utf8.data()
length:utf8.length()
diff --git a/src/SFML/Window/OSX/CursorImpl.hpp b/src/SFML/Window/OSX/CursorImpl.hpp
index 43af792..b3ae476 100644
--- a/src/SFML/Window/OSX/CursorImpl.hpp
+++ b/src/SFML/Window/OSX/CursorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/CursorImpl.mm b/src/SFML/Window/OSX/CursorImpl.mm
index ed905ef..cb6c592 100644
--- a/src/SFML/Window/OSX/CursorImpl.mm
+++ b/src/SFML/Window/OSX/CursorImpl.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -27,8 +27,8 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Window/OSX/CursorImpl.hpp>
+#include <SFML/Window/OSX/AutoreleasePoolWrapper.hpp>
-#import <SFML/Window/OSX/AutoreleasePoolWrapper.h>
#import <SFML/Window/OSX/NSImage+raw.h>
#import <AppKit/AppKit.h>
@@ -56,14 +56,14 @@ namespace priv
CursorImpl::CursorImpl() :
m_cursor(nil)
{
- // Just ask for a pool
- ensureThreadHasPool();
+
}
////////////////////////////////////////////////////////////
CursorImpl::~CursorImpl()
{
+ AutoreleasePool pool;
[m_cursor release];
}
@@ -71,7 +71,12 @@ CursorImpl::~CursorImpl()
////////////////////////////////////////////////////////////
bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot)
{
- [m_cursor release];
+ AutoreleasePool pool;
+ if (m_cursor)
+ {
+ [m_cursor release];
+ m_cursor = nil;
+ }
NSSize nssize = NSMakeSize(size.x, size.y);
NSImage* image = [NSImage imageWithRawData:pixels andSize:nssize];
@@ -85,41 +90,54 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot
////////////////////////////////////////////////////////////
bool CursorImpl::loadFromSystem(Cursor::Type type)
{
- [m_cursor release];
+ AutoreleasePool pool;
+ NSCursor* newCursor = nil;
switch (type)
{
default: return false;
- case Cursor::Arrow: m_cursor = [NSCursor arrowCursor]; break;
- case Cursor::Text: m_cursor = [NSCursor IBeamCursor]; break;
- case Cursor::Hand: m_cursor = [NSCursor pointingHandCursor]; break;
- case Cursor::SizeHorizontal: m_cursor = [NSCursor resizeLeftRightCursor]; break;
- case Cursor::SizeVertical: m_cursor = [NSCursor resizeUpDownCursor]; break;
- case Cursor::Cross: m_cursor = [NSCursor crosshairCursor]; break;
- case Cursor::NotAllowed: m_cursor = [NSCursor operationNotAllowedCursor]; break;
+ case Cursor::Arrow: newCursor = [NSCursor arrowCursor]; break;
+ case Cursor::Text: newCursor = [NSCursor IBeamCursor]; break;
+ case Cursor::Hand: newCursor = [NSCursor pointingHandCursor]; break;
+ case Cursor::SizeHorizontal: newCursor = [NSCursor resizeLeftRightCursor]; break;
+ case Cursor::SizeVertical: newCursor = [NSCursor resizeUpDownCursor]; break;
+ case Cursor::Cross: newCursor = [NSCursor crosshairCursor]; break;
+ case Cursor::NotAllowed: newCursor = [NSCursor operationNotAllowedCursor]; break;
+ case Cursor::SizeLeft: newCursor = [NSCursor resizeLeftRightCursor]; break;
+ case Cursor::SizeRight: newCursor = [NSCursor resizeLeftRightCursor]; break;
+ case Cursor::SizeTop: newCursor = [NSCursor resizeUpDownCursor]; break;
+ case Cursor::SizeBottom: newCursor = [NSCursor resizeUpDownCursor]; break;
// These cursor types are undocumented, may not be available on some platforms
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
+ case Cursor::SizeTopRight:
+ case Cursor::SizeBottomLeft:
case Cursor::SizeBottomLeftTopRight:
- m_cursor = loadFromSelector(@selector(_windowResizeNorthEastSouthWestCursor));
+ newCursor = loadFromSelector(@selector(_windowResizeNorthEastSouthWestCursor));
break;
+ case Cursor::SizeTopLeft:
+ case Cursor::SizeBottomRight:
case Cursor::SizeTopLeftBottomRight:
- m_cursor = loadFromSelector(@selector(_windowResizeNorthWestSouthEastCursor));
+ newCursor = loadFromSelector(@selector(_windowResizeNorthWestSouthEastCursor));
break;
case Cursor::Help:
- m_cursor = loadFromSelector(@selector(_helpCursor));
+ newCursor = loadFromSelector(@selector(_helpCursor));
break;
#pragma clang diagnostic pop
}
- if (m_cursor)
+ if (newCursor)
+ {
+ [m_cursor release];
+ m_cursor = newCursor;
[m_cursor retain];
+ }
- return m_cursor != nil;
+ return newCursor != nil;
}
diff --git a/src/SFML/Window/OSX/HIDInputManager.hpp b/src/SFML/Window/OSX/HIDInputManager.hpp
index 388d008..b17d566 100644
--- a/src/SFML/Window/OSX/HIDInputManager.hpp
+++ b/src/SFML/Window/OSX/HIDInputManager.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -65,16 +65,6 @@ public:
////////////////////////////////////////////////////////////
static HIDInputManager& getInstance();
- ////////////////////////////////////////////////////////////
- /// \brief Check if a key is pressed
- ///
- /// \param key Key to check
- ///
- /// \return True if the key is pressed, false otherwise
- ///
- ////////////////////////////////////////////////////////////
- bool isKeyPressed(Keyboard::Key key);
-
public:
////////////////////////////////////////////////////////////
@@ -99,25 +89,68 @@ public:
static CFDictionaryRef copyDevicesMask(UInt32 page, UInt32 usage);
////////////////////////////////////////////////////////////
- /// Try to convert a character into a SFML key code.
+ /// \brief Try to convert a character into a SFML key code
///
/// Return sf::Keyboard::Unknown if it doesn't match any 'localized' keys.
///
- /// By 'localized' I mean keys that depend on the keyboard layout
- /// and might not be the same as the US keycode in some country
- /// (e.g. the keys 'Y' and 'Z' are switched on QWERTZ keyboard and
+ /// By 'localized' we mean keys that depend on the keyboard layout
+ /// and might not be the same as the US keycode for some countries
+ /// (e.g. the keys 'Y' and 'Z' are swapped on QWERTZ keyboard and
/// US keyboard layouts.)
///
////////////////////////////////////////////////////////////
- static Keyboard::Key localizedKeys(UniChar ch);
+ static Keyboard::Key localizedKey(UniChar ch);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Opposite transformation as localizedKeys
+ ///
+ /// Return 0x00 (NULL) for non-convertible keys/numpad numbers.
+ /// For letters, uppercase codes are returned.
+ /// Some returned value are specific to macOS.
+ ///
+ ////////////////////////////////////////////////////////////
+ static UniChar toUnicode(Keyboard::Key key);
////////////////////////////////////////////////////////////
- /// Try to convert a virtual keycode into a SFML key code.
+ /// \brief Try to convert a virtual keycode (HID level) into a
+ /// SFML scancode.
///
- /// Return sf::Keyboard::Unknown if the keycode is unknown.
+ /// Return sf::Keyboard::Scan::Unknown if the keycode is unknown.
///
////////////////////////////////////////////////////////////
- static Keyboard::Key nonLocalizedKeys(UniChar virtualKeycode);
+ static Keyboard::Scancode nonLocalizedKey(UniChar virtualKeycode);
+
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::isKeyPressed(Key)
+ ///
+ ////////////////////////////////////////////////////////////
+ bool isKeyPressed(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::isKeyPressed(Scancode)
+ ///
+ ////////////////////////////////////////////////////////////
+ bool isKeyPressed(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::localize
+ ///
+ ////////////////////////////////////////////////////////////
+ Keyboard::Key localize(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::delocalize
+ ///
+ ////////////////////////////////////////////////////////////
+ Keyboard::Scancode delocalize(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::getDescription
+ ///
+ ////////////////////////////////////////////////////////////
+ String getDescription(Keyboard::Scancode code);
private:
@@ -136,7 +169,13 @@ private:
////////////////////////////////////////////////////////////
/// \brief Initialize the keyboard part of this class
///
- /// If something went wrong freeUp is called
+ /// If something went wrong freeUp is called.
+ ///
+ /// In a nutshell, this function does this:
+ ///
+ /// for each connected keyboard kb:
+ /// for each key k of kb:
+ /// memorize k -> scancode mapping
///
////////////////////////////////////////////////////////////
void initializeKeyboard();
@@ -145,28 +184,46 @@ private:
/// \brief Load the given keyboard into m_keys
///
/// If the given keyboard has no key this function simply
- /// returns. freeUp is _not_ called because this is not fatal.
+ /// returns without calling freeUp because this is not fatal.
///
/// \param keyboard Keyboard to load
///
+ /// \see initializeKeyboard
+ ///
////////////////////////////////////////////////////////////
void loadKeyboard(IOHIDDeviceRef keyboard);
////////////////////////////////////////////////////////////
/// \brief Load the given key into m_keys
///
- /// freeUp is _not_ called by this function.
+ /// On error, freeUp is _not_ called by this function.
///
/// \param key Key to load
///
+ /// \see initializeKeyboard
+ ///
////////////////////////////////////////////////////////////
void loadKey(IOHIDElementRef key);
////////////////////////////////////////////////////////////
+ /// \brief Regenerate the mappings from/to Key and Scancode
+ ///
+ ////////////////////////////////////////////////////////////
+ void buildMappings();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Callback to regenerate mappings from/to Key and
+ /// Scancode when there's a keyboard layout change
+ ///
+ ////////////////////////////////////////////////////////////
+ static void keyboardChanged(CFNotificationCenterRef /* center */, void* observer, CFStringRef /* name */, const void* /* object */, CFDictionaryRef /* userInfo */);
+
+ ////////////////////////////////////////////////////////////
/// \brief Release all resources
///
- /// Close all connections to any devices, if required
- /// Set m_isValid to false
+ /// Close all connections to any devices.
+ ///
+ /// \see initializeKeyboard
///
////////////////////////////////////////////////////////////
void freeUp();
@@ -174,11 +231,11 @@ private:
////////////////////////////////////////////////////////////
/// \brief Filter the devices and return them
///
- /// freeUp is _not_ called by this function.
+ /// On error, freeUp is _not_ called by this function.
///
/// \param page HID page like kHIDPage_GenericDesktop
/// \param usage HID usage page like kHIDUsage_GD_Keyboard or kHIDUsage_GD_Mouse
- /// \return a retained CFSetRef of IOHIDDeviceRef or NULL
+ /// \return a retained, non-empty CFSetRef of IOHIDDeviceRef or NULL
///
////////////////////////////////////////////////////////////
CFSetRef copyDevices(UInt32 page, UInt32 usage);
@@ -196,36 +253,48 @@ private:
bool isPressed(IOHIDElements& elements);
////////////////////////////////////////////////////////////
- /// \brief Convert a HID key usage to its corresponding virtual code
- ///
- /// See IOHIDUsageTables.h
+ /// \brief Convert a HID key usage to its corresponding scancode
///
/// \param usage Any kHIDUsage_Keyboard* usage
- /// \return the virtual code associate with the given HID key usage
- /// or 0xff if it is associate with no virtual code
+ /// \return the scancode associated with the given HID key usage
+ /// or Scan::Unknown if it is associated with no scancode.
///
////////////////////////////////////////////////////////////
- static UInt8 usageToVirtualCode(UInt32 usage);
+ static Keyboard::Scancode usageToScancode(UInt32 usage);
+
+ ////////////////////////////////////////////////////////////
+ /// Convert the scancode to the expected virtual code.
+ ///
+ ////////////////////////////////////////////////////////////
+ static UInt8 scanToVirtualCode(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// Fallback convertion for keys which aren't expected to be impacted
+ /// by the layout. Can return Unknown.
+ ///
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Key localizedKeyFallback(Keyboard::Scancode code);
private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- bool m_isValid; ///< If any error occurs this variable is false
- CFDataRef m_layoutData; ///< CFData containing the layout
- UCKeyboardLayout* m_layout; ///< Current Keyboard Layout
- IOHIDManagerRef m_manager; ///< HID Manager
-
- IOHIDElements m_keys[Keyboard::KeyCount]; ///< All the keys on any connected keyboard
+ IOHIDManagerRef m_manager; ///< Underlying HID Manager
+ IOHIDElements m_keys[Keyboard::Scan::ScancodeCount]; ///< All the keys on any connected keyboard
+ Keyboard::Scancode m_keyToScancodeMapping[Keyboard::KeyCount]; ///< Mapping from Key to Scancode
+ Keyboard::Key m_scancodeToKeyMapping[Keyboard::Scan::ScancodeCount]; ///< Mapping from Scancode to Key
////////////////////////////////////////////////////////////
- /// m_keys' index corresponds to sf::Keyboard::Key enum.
- /// if no key is assigned with key XYZ then m_keys[XYZ].size() == 0.
- /// if there are several keyboards connected and several HID keys associate
+ /// m_keys' index corresponds to sf::Keyboard::Scancode enum.
+ /// If no key is assigned with key XYZ then m_keys[XYZ].size() == 0.
+ /// If there are several keyboards connected and several HID keys associated
/// with the same sf::Keyboard::Key then m_keys[XYZ] contains all these
/// HID keys.
///
+ /// The mappings (both directions) get invalidated when the
+ /// keyboard layout changes. They both default to (Scan::)Unknown.
+ ///
////////////////////////////////////////////////////////////
};
diff --git a/src/SFML/Window/OSX/HIDInputManager.mm b/src/SFML/Window/OSX/HIDInputManager.mm
index a332932..6d31ae6 100644
--- a/src/SFML/Window/OSX/HIDInputManager.mm
+++ b/src/SFML/Window/OSX/HIDInputManager.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -30,6 +30,12 @@
#include <SFML/System/Err.hpp>
#include <AppKit/AppKit.h>
+namespace
+{
+static const sf::Uint8 UnknownVirtualCode = 0xff;
+static const bool IsIsoKeyboard = (KBGetLayoutType(LMGetKbdType()) == kKeyboardISO);
+}
+
namespace sf
{
namespace priv
@@ -43,13 +49,6 @@ HIDInputManager& HIDInputManager::getInstance()
////////////////////////////////////////////////////////////
-bool HIDInputManager::isKeyPressed(Keyboard::Key key)
-{
- return isPressed(m_keys[key]);
-}
-
-
-////////////////////////////////////////////////////////////
long HIDInputManager::getLocationID(IOHIDDeviceRef device)
{
long loc = 0;
@@ -60,7 +59,7 @@ long HIDInputManager::getLocationID(IOHIDDeviceRef device)
if (!typeRef || (CFGetTypeID(typeRef) != CFNumberGetTypeID()))
return 0;
- CFNumberRef locRef = (CFNumberRef)typeRef;
+ CFNumberRef locRef = static_cast<CFNumberRef>(typeRef);
if (!CFNumberGetValue(locRef, kCFNumberLongType, &loc))
return 0;
@@ -91,47 +90,635 @@ CFDictionaryRef HIDInputManager::copyDevicesMask(UInt32 page, UInt32 usage)
}
-////////////////////////////////////////////////////////////
-HIDInputManager::HIDInputManager() :
-m_isValid(true),
-m_layoutData(0),
-m_layout(0),
-m_manager(0)
+////////////////////////////////////////////////////////
+Keyboard::Key HIDInputManager::localizedKey(UniChar ch)
{
- // Get the current keyboard layout
- TISInputSourceRef tis = TISCopyCurrentKeyboardLayoutInputSource();
- m_layoutData = (CFDataRef)TISGetInputSourceProperty(tis,
- kTISPropertyUnicodeKeyLayoutData);
+ // Apple is using the private range 0xE000 - 0xF8FF for special keys.
+ // Otherwise one can refer to the usual Unicode table.
+ switch (ch)
+ {
+ case 0x41: return Keyboard::A; // uppercase A
+ case 0x42: return Keyboard::B;
+ case 0x43: return Keyboard::C;
+ case 0x44: return Keyboard::D;
+ case 0x45: return Keyboard::E;
+ case 0x46: return Keyboard::F;
+ case 0x47: return Keyboard::G;
+ case 0x48: return Keyboard::H;
+ case 0x49: return Keyboard::I;
+ case 0x4a: return Keyboard::J;
+ case 0x4b: return Keyboard::K;
+ case 0x4c: return Keyboard::L;
+ case 0x4d: return Keyboard::M;
+ case 0x4e: return Keyboard::N;
+ case 0x4f: return Keyboard::O;
+ case 0x50: return Keyboard::P;
+ case 0x51: return Keyboard::Q;
+ case 0x52: return Keyboard::R;
+ case 0x53: return Keyboard::S;
+ case 0x54: return Keyboard::T;
+ case 0x55: return Keyboard::U;
+ case 0x56: return Keyboard::V;
+ case 0x57: return Keyboard::W;
+ case 0x58: return Keyboard::X;
+ case 0x59: return Keyboard::Y;
+ case 0x5a: return Keyboard::Z;
+
+ case 0x61: return Keyboard::A; // lowercase A
+ case 0x62: return Keyboard::B;
+ case 0x63: return Keyboard::C;
+ case 0x64: return Keyboard::D;
+ case 0x65: return Keyboard::E;
+ case 0x66: return Keyboard::F;
+ case 0x67: return Keyboard::G;
+ case 0x68: return Keyboard::H;
+ case 0x69: return Keyboard::I;
+ case 0x6a: return Keyboard::J;
+ case 0x6b: return Keyboard::K;
+ case 0x6c: return Keyboard::L;
+ case 0x6d: return Keyboard::M;
+ case 0x6e: return Keyboard::N;
+ case 0x6f: return Keyboard::O;
+ case 0x70: return Keyboard::P;
+ case 0x71: return Keyboard::Q;
+ case 0x72: return Keyboard::R;
+ case 0x73: return Keyboard::S;
+ case 0x74: return Keyboard::T;
+ case 0x75: return Keyboard::U;
+ case 0x76: return Keyboard::V;
+ case 0x77: return Keyboard::W;
+ case 0x78: return Keyboard::X;
+ case 0x79: return Keyboard::Y;
+ case 0x7a: return Keyboard::Z;
+
+ case 0x30: return Keyboard::Num0;
+ case 0x31: return Keyboard::Num1;
+ case 0x32: return Keyboard::Num2;
+ case 0x33: return Keyboard::Num3;
+ case 0x34: return Keyboard::Num4;
+ case 0x35: return Keyboard::Num5;
+ case 0x36: return Keyboard::Num6;
+ case 0x37: return Keyboard::Num7;
+ case 0x38: return Keyboard::Num8;
+ case 0x39: return Keyboard::Num9;
+
+ case 0x1b: return Keyboard::Escape;
+
+ /* Those are not represented using Unicode.
+ * case 0x: return Keyboard::LControl;
+ * case 0x: return Keyboard::LShift;
+ * case 0x: return Keyboard::LAlt;
+ * case 0x: return Keyboard::LSystem;
+ * case 0x: return Keyboard::RControl;
+ * case 0x: return Keyboard::RShift;
+ * case 0x: return Keyboard::RAlt;
+ * case 0x: return Keyboard::RSystem;
+ */
+
+ case NSMenuFunctionKey: return Keyboard::Menu;
+
+ case 0x5b: return Keyboard::LBracket;
+ case 0x5d: return Keyboard::RBracket;
+ case 0x3b: return Keyboard::Semicolon;
+ case 0x2c: return Keyboard::Comma;
+ case 0x2e: return Keyboard::Period;
+ case 0x27: return Keyboard::Apostrophe;
+ case 0x2f: return Keyboard::Slash;
+ case 0x5c: return Keyboard::Backslash;
+ case 0x60: return Keyboard::Grave;
+ case 0x3d: return Keyboard::Equal;
+ case 0x2d: return Keyboard::Hyphen;
+ case 0x20: return Keyboard::Space;
+ case 0x0d: return Keyboard::Enter;
+ case 0x08: return Keyboard::Backspace;
+ case 0x09: return Keyboard::Tab;
+
+ case NSPageUpFunctionKey: return Keyboard::PageUp;
+ case NSPageDownFunctionKey: return Keyboard::PageDown;
+ case NSEndFunctionKey: return Keyboard::End;
+ case NSHomeFunctionKey: return Keyboard::Home;
+ case NSInsertFunctionKey: return Keyboard::Insert;
+ case NSDeleteFunctionKey: return Keyboard::Delete;
+ case 0x7f: return Keyboard::Delete;
+
+ case 0x2b: return Keyboard::Add;
+ // case 0x: return Keyboard::Subtract; // collision with Keyboard::Hyphen
+ case 0x2a: return Keyboard::Multiply;
+ // case 0x: return Keyboard::Divide; // collision with Keyboard::Slash
+
+ case NSLeftArrowFunctionKey: return Keyboard::Left;
+ case NSRightArrowFunctionKey: return Keyboard::Right;
+ case NSUpArrowFunctionKey: return Keyboard::Up;
+ case NSDownArrowFunctionKey: return Keyboard::Down;
+
+ /* Those are not represented using Unicode.
+ * case 0x: return Keyboard::Numpad0;
+ * case 0x: return Keyboard::Numpad1;
+ * case 0x: return Keyboard::Numpad2;
+ * case 0x: return Keyboard::Numpad3;
+ * case 0x: return Keyboard::Numpad4;
+ * case 0x: return Keyboard::Numpad5;
+ * case 0x: return Keyboard::Numpad6;
+ * case 0x: return Keyboard::Numpad7;
+ * case 0x: return Keyboard::Numpad8;
+ * case 0x: return Keyboard::Numpad9;
+ */
+
+ case NSF1FunctionKey: return Keyboard::F1;
+ case NSF2FunctionKey: return Keyboard::F2;
+ case NSF3FunctionKey: return Keyboard::F3;
+ case NSF4FunctionKey: return Keyboard::F4;
+ case NSF5FunctionKey: return Keyboard::F5;
+ case NSF6FunctionKey: return Keyboard::F6;
+ case NSF7FunctionKey: return Keyboard::F7;
+ case NSF8FunctionKey: return Keyboard::F8;
+ case NSF9FunctionKey: return Keyboard::F9;
+ case NSF10FunctionKey: return Keyboard::F10;
+ case NSF11FunctionKey: return Keyboard::F11;
+ case NSF12FunctionKey: return Keyboard::F12;
+ case NSF13FunctionKey: return Keyboard::F13;
+ case NSF14FunctionKey: return Keyboard::F14;
+ case NSF15FunctionKey: return Keyboard::F15;
+
+ case NSPauseFunctionKey: return Keyboard::Pause;
+
+ default: return Keyboard::Unknown;
+ }
+}
- if (m_layoutData == 0)
+
+////////////////////////////////////////////////////////
+UniChar HIDInputManager::toUnicode(Keyboard::Key key)
+{
+ switch (key)
{
- sf::err() << "Cannot get the keyboard layout" << std::endl;
- freeUp();
- return;
+ case Keyboard::A: return 0x41;
+ case Keyboard::B: return 0x42;
+ case Keyboard::C: return 0x43;
+ case Keyboard::D: return 0x44;
+ case Keyboard::E: return 0x45;
+ case Keyboard::F: return 0x46;
+ case Keyboard::G: return 0x47;
+ case Keyboard::H: return 0x48;
+ case Keyboard::I: return 0x49;
+ case Keyboard::J: return 0x4a;
+ case Keyboard::K: return 0x4b;
+ case Keyboard::L: return 0x4c;
+ case Keyboard::M: return 0x4d;
+ case Keyboard::N: return 0x4e;
+ case Keyboard::O: return 0x4f;
+ case Keyboard::P: return 0x50;
+ case Keyboard::Q: return 0x51;
+ case Keyboard::R: return 0x52;
+ case Keyboard::S: return 0x53;
+ case Keyboard::T: return 0x54;
+ case Keyboard::U: return 0x55;
+ case Keyboard::V: return 0x56;
+ case Keyboard::W: return 0x57;
+ case Keyboard::X: return 0x58;
+ case Keyboard::Y: return 0x59;
+ case Keyboard::Z: return 0x5a;
+
+ case Keyboard::Num0: return 0x30;
+ case Keyboard::Num1: return 0x31;
+ case Keyboard::Num2: return 0x32;
+ case Keyboard::Num3: return 0x33;
+ case Keyboard::Num4: return 0x34;
+ case Keyboard::Num5: return 0x35;
+ case Keyboard::Num6: return 0x36;
+ case Keyboard::Num7: return 0x37;
+ case Keyboard::Num8: return 0x38;
+ case Keyboard::Num9: return 0x39;
+
+ case Keyboard::Escape: return 0x1b;
+
+ /* Not representable as Unicode:
+ * case Keyboard::LControl: return 0x;
+ * case Keyboard::LShift: return 0x;
+ * case Keyboard::LAlt: return 0x;
+ * case Keyboard::LSystem: return 0x;
+ * case Keyboard::RControl: return 0x;
+ * case Keyboard::RShift: return 0x;
+ * case Keyboard::RAlt: return 0x;
+ * case Keyboard::RSystem: return 0x;
+ */
+
+ case Keyboard::Menu: return NSMenuFunctionKey;
+
+ case Keyboard::LBracket: return 0x5b;
+ case Keyboard::RBracket: return 0x5d;
+ case Keyboard::Semicolon: return 0x3b;
+ case Keyboard::Comma: return 0x2c;
+ case Keyboard::Period: return 0x2e;
+ case Keyboard::Apostrophe: return 0x27;
+ case Keyboard::Slash: return 0x2f;
+ case Keyboard::Backslash: return 0x5c;
+ case Keyboard::Grave: return 0x60;
+ case Keyboard::Equal: return 0x3d;
+ case Keyboard::Hyphen: return 0x2d;
+ case Keyboard::Space: return 0x20;
+ case Keyboard::Enter: return 0x0d;
+ case Keyboard::Backspace: return 0x08;
+ case Keyboard::Tab: return 0x09;
+
+ case Keyboard::PageUp: return NSPageUpFunctionKey;
+ case Keyboard::PageDown: return NSPageDownFunctionKey;
+ case Keyboard::End: return NSEndFunctionKey;
+ case Keyboard::Home: return NSHomeFunctionKey;
+ case Keyboard::Insert: return NSInsertFunctionKey;
+ case Keyboard::Delete: return NSDeleteFunctionKey;
+
+ case Keyboard::Add: return 0x2b;
+ case Keyboard::Subtract: return 0x2d;
+ case Keyboard::Multiply: return 0x2a;
+ case Keyboard::Divide: return 0x2f;
+
+ case Keyboard::Left: return NSLeftArrowFunctionKey;
+ case Keyboard::Right: return NSRightArrowFunctionKey;
+ case Keyboard::Up: return NSUpArrowFunctionKey;
+ case Keyboard::Down: return NSDownArrowFunctionKey;
+
+ /* Those are not represented using Unicode.
+ * case Keyboard::Numpad0: return 0x;
+ * case Keyboard::Numpad1: return 0x;
+ * case Keyboard::Numpad2: return 0x;
+ * case Keyboard::Numpad3: return 0x;
+ * case Keyboard::Numpad4: return 0x;
+ * case Keyboard::Numpad5: return 0x;
+ * case Keyboard::Numpad6: return 0x;
+ * case Keyboard::Numpad7: return 0x;
+ * case Keyboard::Numpad8: return 0x;
+ * case Keyboard::Numpad9: return 0x;
+ */
+
+ case Keyboard::F1: return NSF1FunctionKey;
+ case Keyboard::F2: return NSF2FunctionKey;
+ case Keyboard::F3: return NSF3FunctionKey;
+ case Keyboard::F4: return NSF4FunctionKey;
+ case Keyboard::F5: return NSF5FunctionKey;
+ case Keyboard::F6: return NSF6FunctionKey;
+ case Keyboard::F7: return NSF7FunctionKey;
+ case Keyboard::F8: return NSF8FunctionKey;
+ case Keyboard::F9: return NSF9FunctionKey;
+ case Keyboard::F10: return NSF10FunctionKey;
+ case Keyboard::F11: return NSF11FunctionKey;
+ case Keyboard::F12: return NSF12FunctionKey;
+ case Keyboard::F13: return NSF13FunctionKey;
+ case Keyboard::F14: return NSF14FunctionKey;
+ case Keyboard::F15: return NSF15FunctionKey;
+
+ case Keyboard::Pause: return NSPauseFunctionKey;
+
+ default: return 0x00;
}
+}
- // Keep a reference for ourself
- CFRetain(m_layoutData);
- m_layout = (UCKeyboardLayout *)CFDataGetBytePtr(m_layoutData);
- // The TIS is no more needed
- CFRelease(tis);
+////////////////////////////////////////////////////////
+Keyboard::Scancode HIDInputManager::nonLocalizedKey(UniChar virtualKeycode)
+{
+ // See Chapter 2, esp. Figure 2-10 of
+ // https://developer.apple.com/legacy/library/documentation/mac/pdf/MacintoshToolboxEssentials.pdf
+ // Additional virtual codes come from
+ // /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h
+ switch (virtualKeycode)
+ {
+ case 0x00: return Keyboard::Scan::A;
+ case 0x0b: return Keyboard::Scan::B;
+ case 0x08: return Keyboard::Scan::C;
+ case 0x02: return Keyboard::Scan::D;
+ case 0x0e: return Keyboard::Scan::E;
+ case 0x03: return Keyboard::Scan::F;
+ case 0x05: return Keyboard::Scan::G;
+ case 0x04: return Keyboard::Scan::H;
+ case 0x22: return Keyboard::Scan::I;
+ case 0x26: return Keyboard::Scan::J;
+ case 0x28: return Keyboard::Scan::K;
+ case 0x25: return Keyboard::Scan::L;
+ case 0x2e: return Keyboard::Scan::M;
+ case 0x2d: return Keyboard::Scan::N;
+ case 0x1f: return Keyboard::Scan::O;
+ case 0x23: return Keyboard::Scan::P;
+ case 0x0c: return Keyboard::Scan::Q;
+ case 0x0f: return Keyboard::Scan::R;
+ case 0x01: return Keyboard::Scan::S;
+ case 0x11: return Keyboard::Scan::T;
+ case 0x20: return Keyboard::Scan::U;
+ case 0x09: return Keyboard::Scan::V;
+ case 0x0d: return Keyboard::Scan::W;
+ case 0x07: return Keyboard::Scan::X;
+ case 0x10: return Keyboard::Scan::Y;
+ case 0x06: return Keyboard::Scan::Z;
+
+ case 0x12: return Keyboard::Scan::Num1;
+ case 0x13: return Keyboard::Scan::Num2;
+ case 0x14: return Keyboard::Scan::Num3;
+ case 0x15: return Keyboard::Scan::Num4;
+ case 0x17: return Keyboard::Scan::Num5;
+ case 0x16: return Keyboard::Scan::Num6;
+ case 0x1a: return Keyboard::Scan::Num7;
+ case 0x1c: return Keyboard::Scan::Num8;
+ case 0x19: return Keyboard::Scan::Num9;
+ case 0x1d: return Keyboard::Scan::Num0;
+
+ case 0x24: return Keyboard::Scan::Enter;
+ case 0x35: return Keyboard::Scan::Escape;
+ case 0x33: return Keyboard::Scan::Backspace;
+ case 0x30: return Keyboard::Scan::Tab;
+ case 0x31: return Keyboard::Scan::Space;
+
+ case 0x18: return Keyboard::Scan::Equal;
+ case 0x21: return Keyboard::Scan::LBracket;
+ case 0x1e: return Keyboard::Scan::RBracket;
+ case 0x2a: return Keyboard::Scan::Backslash;
+ case 0x1b: return Keyboard::Scan::Hyphen;
+ case 0x29: return Keyboard::Scan::Semicolon;
+ case 0x27: return Keyboard::Scan::Apostrophe;
+ case 0x32: return IsIsoKeyboard ? Keyboard::Scan::NonUsBackslash : Keyboard::Scan::Grave;
+ case 0x0a: return Keyboard::Scan::Grave;
+ case 0x2b: return Keyboard::Scan::Comma;
+ case 0x2f: return Keyboard::Scan::Period;
+ case 0x2c: return Keyboard::Scan::Slash;
+
+ case 0x7a: return Keyboard::Scan::F1;
+ case 0x78: return Keyboard::Scan::F2;
+ case 0x63: return Keyboard::Scan::F3;
+ case 0x76: return Keyboard::Scan::F4;
+ case 0x60: return Keyboard::Scan::F5;
+ case 0x61: return Keyboard::Scan::F6;
+ case 0x62: return Keyboard::Scan::F7;
+ case 0x64: return Keyboard::Scan::F8;
+ case 0x65: return Keyboard::Scan::F9;
+ case 0x6d: return Keyboard::Scan::F10;
+ case 0x67: return Keyboard::Scan::F11;
+ case 0x6f: return Keyboard::Scan::F12;
+ case 0x69: return Keyboard::Scan::F13;
+ case 0x6b: return Keyboard::Scan::F14;
+ case 0x71: return Keyboard::Scan::F15;
+
+ case 0x6A: return Keyboard::Scan::F16;
+ case 0x40: return Keyboard::Scan::F17;
+ case 0x4F: return Keyboard::Scan::F18;
+ case 0x50: return Keyboard::Scan::F19;
+ case 0x5A: return Keyboard::Scan::F20;
+
+ /* TODO Those are missing:
+ * case 0x: return Keyboard::Scan::F21;
+ * case 0x: return Keyboard::Scan::F22;
+ * case 0x: return Keyboard::Scan::F23;
+ * case 0x: return Keyboard::Scan::F24;
+ */
+
+ case 0x39: return Keyboard::Scan::CapsLock;
+
+ /* TODO Those are missing:
+ * case 0x: return Keyboard::Scan::PrintScreen;
+ * case 0x: return Keyboard::Scan::ScrollLock;
+ * case 0x: return Keyboard::Scan::Pause;
+ */
+
+ case 0x72: return Keyboard::Scan::Insert;
+ case 0x73: return Keyboard::Scan::Home;
+ case 0x74: return Keyboard::Scan::PageUp;
+ case 0x75: return Keyboard::Scan::Delete;
+ case 0x77: return Keyboard::Scan::End;
+ case 0x79: return Keyboard::Scan::PageDown;
+
+ case 0x7c: return Keyboard::Scan::Right;
+ case 0x7b: return Keyboard::Scan::Left;
+ case 0x7d: return Keyboard::Scan::Down;
+ case 0x7e: return Keyboard::Scan::Up;
+
+ case 0x47: return Keyboard::Scan::NumLock;
+ case 0x4b: return Keyboard::Scan::NumpadDivide;
+ case 0x43: return Keyboard::Scan::NumpadMultiply;
+ case 0x4e: return Keyboard::Scan::NumpadMinus;
+ case 0x45: return Keyboard::Scan::NumpadPlus;
+ case 0x51: return Keyboard::Scan::NumpadEqual;
+ case 0x4c: return Keyboard::Scan::NumpadEnter;
+ case 0x41: return Keyboard::Scan::NumpadDecimal;
+
+ case 0x53: return Keyboard::Scan::Numpad1;
+ case 0x54: return Keyboard::Scan::Numpad2;
+ case 0x55: return Keyboard::Scan::Numpad3;
+ case 0x56: return Keyboard::Scan::Numpad4;
+ case 0x57: return Keyboard::Scan::Numpad5;
+ case 0x58: return Keyboard::Scan::Numpad6;
+ case 0x59: return Keyboard::Scan::Numpad7;
+ case 0x5b: return Keyboard::Scan::Numpad8;
+ case 0x5c: return Keyboard::Scan::Numpad9;
+ case 0x52: return Keyboard::Scan::Numpad0;
+
+ /* TODO Those are missing:
+ * case 0x: return Keyboard::Scan::Application;
+ * case 0x: return Keyboard::Scan::Execute;
+ * case 0x: return Keyboard::Scan::Help;
+ * case 0x: return Keyboard::Scan::Menu;
+ * case 0x: return Keyboard::Scan::Select;
+ * case 0x: return Keyboard::Scan::Stop;
+ * case 0x: return Keyboard::Scan::Redo;
+ * case 0x: return Keyboard::Scan::Undo;
+ * case 0x: return Keyboard::Scan::Cut;
+ * case 0x: return Keyboard::Scan::Copy;
+ * case 0x: return Keyboard::Scan::Paste;
+ * case 0x: return Keyboard::Scan::Search;
+ */
+
+ case 0x4a: return Keyboard::Scan::VolumeMute;
+ case 0x48: return Keyboard::Scan::VolumeUp;
+ case 0x49: return Keyboard::Scan::VolumeDown;
+
+ /* NOTE Those are symmetric so we leave them out.
+ * Thankfully handled through modifiers and not virtual codes.
+ * case 0x3b: return Keyboard::Scan::LControl;
+ * case 0x38: return Keyboard::Scan::LShift;
+ * case 0x3a: return Keyboard::Scan::LAlt;
+ * case 0x37: return Keyboard::Scan::LSystem;
+ * case 0x3b: return Keyboard::Scan::RControl;
+ * case 0x38: return Keyboard::Scan::RShift;
+ * case 0x3a: return Keyboard::Scan::RAlt;
+ * case 0x37: return Keyboard::Scan::RSystem;
+ */
+
+ default: return Keyboard::Scan::Unknown;
+ }
+}
+
+////////////////////////////////////////////////////////////
+bool HIDInputManager::isKeyPressed(Keyboard::Key key)
+{
+ return isKeyPressed(delocalize(key));
+}
+
+
+////////////////////////////////////////////////////////////
+bool HIDInputManager::isKeyPressed(Keyboard::Scancode code)
+{
+ return (code != Keyboard::Scan::Unknown) && isPressed(m_keys[code]);
+}
+
+
+////////////////////////////////////////////////////////////
+Keyboard::Key HIDInputManager::localize(Keyboard::Scancode code)
+{
+ if (code == Keyboard::Scan::Unknown)
+ return Keyboard::Unknown;
+
+ return m_scancodeToKeyMapping[code];
+}
+
+
+////////////////////////////////////////////////////////////
+Keyboard::Scancode HIDInputManager::delocalize(Keyboard::Key key)
+{
+ if (key == Keyboard::Unknown)
+ return Keyboard::Scan::Unknown;
+
+ return m_keyToScancodeMapping[key];
+}
+
+
+////////////////////////////////////////////////////////////
+String HIDInputManager::getDescription(Keyboard::Scancode code)
+{
+ // Phase 1: Get names for layout independent keys
+ switch (code)
+ {
+ case Keyboard::Scan::Enter: return "Enter";
+ case Keyboard::Scan::Escape: return "Escape";
+ case Keyboard::Scan::Backspace: return "Backspace";
+ case Keyboard::Scan::Tab: return "Tab";
+ case Keyboard::Scan::Space: return "Space";
+
+ case Keyboard::Scan::F1: return "F1";
+ case Keyboard::Scan::F2: return "F2";
+ case Keyboard::Scan::F3: return "F3";
+ case Keyboard::Scan::F4: return "F4";
+ case Keyboard::Scan::F5: return "F5";
+ case Keyboard::Scan::F6: return "F6";
+ case Keyboard::Scan::F7: return "F7";
+ case Keyboard::Scan::F8: return "F8";
+ case Keyboard::Scan::F9: return "F9";
+ case Keyboard::Scan::F10: return "F10";
+ case Keyboard::Scan::F11: return "F11";
+ case Keyboard::Scan::F12: return "F12";
+ case Keyboard::Scan::F13: return "F13";
+ case Keyboard::Scan::F14: return "F14";
+ case Keyboard::Scan::F15: return "F15";
+ case Keyboard::Scan::F16: return "F16";
+ case Keyboard::Scan::F17: return "F17";
+ case Keyboard::Scan::F18: return "F18";
+ case Keyboard::Scan::F19: return "F19";
+ case Keyboard::Scan::F20: return "F20";
+ case Keyboard::Scan::F21: return "F21";
+ case Keyboard::Scan::F22: return "F22";
+ case Keyboard::Scan::F23: return "F23";
+ case Keyboard::Scan::F24: return "F24";
+
+ case Keyboard::Scan::CapsLock: return "Caps Lock";
+ case Keyboard::Scan::PrintScreen: return "Print Screen";
+ case Keyboard::Scan::ScrollLock: return "Scroll Lock";
+
+ case Keyboard::Scan::Pause: return "Pause";
+ case Keyboard::Scan::Insert: return "Insert";
+ case Keyboard::Scan::Home: return "Home";
+ case Keyboard::Scan::PageUp: return "Page Up";
+ case Keyboard::Scan::Delete: return "Delete";
+ case Keyboard::Scan::End: return "End";
+ case Keyboard::Scan::PageDown: return "Page Down";
+
+ case Keyboard::Scan::Left: return "Left Arrow";
+ case Keyboard::Scan::Right: return "Right Arrow";
+ case Keyboard::Scan::Down: return "Down Arrow";
+ case Keyboard::Scan::Up: return "Up Arrow";
+
+ case Keyboard::Scan::NumLock: return "Num Lock";
+ case Keyboard::Scan::NumpadDivide: return "Divide (Numpad)";
+ case Keyboard::Scan::NumpadMultiply: return "Multiply (Numpad)";
+ case Keyboard::Scan::NumpadMinus: return "Minus (Numpad)";
+ case Keyboard::Scan::NumpadPlus: return "Plus (Numpad)";
+ case Keyboard::Scan::NumpadEqual: return "Equal (Numpad)";
+ case Keyboard::Scan::NumpadEnter: return "Enter (Numpad)";
+ case Keyboard::Scan::NumpadDecimal: return "Decimal (Numpad)";
+
+ case Keyboard::Scan::Numpad0: return "0 (Numpad)";
+ case Keyboard::Scan::Numpad1: return "1 (Numpad)";
+ case Keyboard::Scan::Numpad2: return "2 (Numpad)";
+ case Keyboard::Scan::Numpad3: return "3 (Numpad)";
+ case Keyboard::Scan::Numpad4: return "4 (Numpad)";
+ case Keyboard::Scan::Numpad5: return "5 (Numpad)";
+ case Keyboard::Scan::Numpad6: return "6 (Numpad)";
+ case Keyboard::Scan::Numpad7: return "7 (Numpad)";
+ case Keyboard::Scan::Numpad8: return "8 (Numpad)";
+ case Keyboard::Scan::Numpad9: return "9 (Numpad)";
+
+ case Keyboard::Scan::Application: return "Application";
+ case Keyboard::Scan::Execute: return "Execute";
+ case Keyboard::Scan::Help: return "Help";
+ case Keyboard::Scan::Menu: return "Menu";
+ case Keyboard::Scan::Select: return "Select";
+ case Keyboard::Scan::Stop: return "Stop";
+ case Keyboard::Scan::Redo: return "Redo";
+ case Keyboard::Scan::Undo: return "Undo";
+ case Keyboard::Scan::Cut: return "Cut";
+ case Keyboard::Scan::Copy: return "Copy";
+ case Keyboard::Scan::Paste: return "Paste";
+ case Keyboard::Scan::Search: return "Search";
+ case Keyboard::Scan::VolumeMute: return "Volume Mute";
+ case Keyboard::Scan::VolumeUp: return "Volume Up";
+ case Keyboard::Scan::VolumeDown: return "Volume Down";
+
+ case Keyboard::Scan::LControl: return "Left Control";
+ case Keyboard::Scan::LShift: return "Left Shift";
+ case Keyboard::Scan::LAlt: return "Left Option";
+ case Keyboard::Scan::LSystem: return "Left Command";
+ case Keyboard::Scan::RControl: return "Right Control";
+ case Keyboard::Scan::RShift: return "Right Shift";
+ case Keyboard::Scan::RAlt: return "Right Option";
+ case Keyboard::Scan::RSystem: return "Right Command";
+
+ default:
+ {
+ // Phase 2: Try to convert the key to unicode
+ UniChar unicode = toUnicode(localize(code));
+ if (unicode != 0x00)
+ return String(static_cast<Uint32>(unicode));
+ }
+
+ // Phase 3: Return final fallback
+ return "Unknown";
+ }
+}
+
+
+////////////////////////////////////////////////////////////
+HIDInputManager::HIDInputManager() :
+m_manager(0)
+{
// Create an HID Manager reference
m_manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
-
- // Open the HID Manager reference
IOReturn openStatus = IOHIDManagerOpen(m_manager, kIOHIDOptionsTypeNone);
if (openStatus != kIOReturnSuccess)
{
- sf::err() << "Error when opening the HID manager" << std::endl;
+ err() << "Error when opening the HID manager" << std::endl;
freeUp();
return;
}
- // Initialize the keyboard
+ // Build up our knownledge of the hardware
initializeKeyboard();
+ buildMappings();
+
+ // Register for notification on keyboard layout changes
+ CFNotificationCenterAddObserver(
+ CFNotificationCenterGetDistributedCenter(),
+ this,
+ keyboardChanged, // callback
+ kTISNotifySelectedKeyboardInputSourceChanged,
+ NULL, // use callback
+ CFNotificationSuspensionBehaviorDeliverImmediately);
}
@@ -139,6 +726,8 @@ m_manager(0)
HIDInputManager::~HIDInputManager()
{
freeUp();
+
+ CFNotificationCenterRemoveEveryObserver(CFNotificationCenterGetDistributedCenter(), this);
}
@@ -146,31 +735,23 @@ void HIDInputManager::initializeKeyboard()
{
////////////////////////////////////////////////////////////
// The purpose of this function is to initialize m_keys so we can get
- // the associate IOHIDElementRef with a sf::Keyboard::Key in ~constant~ time.
+ // the associate IOHIDElementRef with a sf::Keyboard::Scancode
+ // in approximately constant time.
// Get only keyboards
- CFSetRef keyboards = copyDevices(kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard);
- if (keyboards == NULL)
+ CFSetRef underlying = copyDevices(kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard);
+ if (underlying == NULL)
{
- sf::err() << "No keyboard detected by the HID manager!" << std::endl;
+ err() << "No keyboard detected by the HID manager!" << std::endl;
freeUp();
return;
}
- CFIndex keyboardCount = CFSetGetCount(keyboards); // >= 1 (asserted by copyDevices)
+ NSSet* keyboards = static_cast<NSSet*>(underlying); // Toll-Free Bridge
+ for (id keyboard in keyboards)
+ loadKeyboard(static_cast<IOHIDDeviceRef>(keyboard));
- // Get an iterable array
- CFTypeRef devicesArray[keyboardCount];
- CFSetGetValues(keyboards, devicesArray);
-
- for (CFIndex i = 0; i < keyboardCount; ++i)
- {
- IOHIDDeviceRef keyboard = (IOHIDDeviceRef)devicesArray[i];
- loadKeyboard(keyboard);
- }
-
- // Release unused stuff
- CFRelease(keyboards);
+ CFRelease(underlying);
////////////////////////////////////////////////////////////
// At this point m_keys is filled with as many IOHIDElementRef as possible
@@ -180,142 +761,149 @@ void HIDInputManager::initializeKeyboard()
////////////////////////////////////////////////////////////
void HIDInputManager::loadKeyboard(IOHIDDeviceRef keyboard)
{
- CFArrayRef keys = IOHIDDeviceCopyMatchingElements(keyboard,
- NULL,
- kIOHIDOptionsTypeNone);
- if (keys == NULL)
+ CFArrayRef underlying = IOHIDDeviceCopyMatchingElements(keyboard, NULL, kIOHIDOptionsTypeNone);
+ if ((underlying == NULL) || (CFArrayGetCount(underlying) == 0))
{
- sf::err() << "We got a keyboard without any keys (1)" << std::endl;
+ err() << "We got a keyboard without any keys." << std::endl;
return;
}
- // How many elements are there?
- CFIndex keysCount = CFArrayGetCount(keys);
-
- if (keysCount == 0)
+ NSArray* keys = static_cast<NSArray*>(underlying); // Toll-Free Bridge
+ for (id key in keys)
{
- sf::err() << "We got a keyboard without any keys (2)" << std::endl;
- CFRelease(keys);
- return;
+ IOHIDElementRef elem = static_cast<IOHIDElementRef>(key);
+ if (IOHIDElementGetUsagePage(elem) == kHIDPage_KeyboardOrKeypad)
+ loadKey(elem);
}
- // Go through all connected elements.
- for (CFIndex i = 0; i < keysCount; ++i)
- {
- IOHIDElementRef aKey = (IOHIDElementRef) CFArrayGetValueAtIndex(keys, i);
+ CFRelease(underlying);
+}
- // Skip non-matching keys elements
- if (IOHIDElementGetUsagePage(aKey) != kHIDPage_KeyboardOrKeypad)
- continue;
- loadKey(aKey);
+////////////////////////////////////////////////////////////
+void HIDInputManager::loadKey(IOHIDElementRef key)
+{
+ UInt32 usage = IOHIDElementGetUsage(key);
+ Keyboard::Scancode code = usageToScancode(usage);
+ if (code != Keyboard::Scan::Unknown)
+ {
+ CFRetain(key);
+ m_keys[code].push_back(key);
}
-
- // Release unused stuff
- CFRelease(keys);
}
////////////////////////////////////////////////////////////
-void HIDInputManager::loadKey(IOHIDElementRef key)
+void HIDInputManager::buildMappings()
{
- // Get its virtual code
- UInt32 usageCode = IOHIDElementGetUsage(key);
- UInt8 virtualCode = usageToVirtualCode(usageCode);
-
- if (virtualCode == 0xff)
- return; // no corresponding virtual code -> skip
-
- // Now translate the virtual code to Unicode according to
- // the current keyboard layout
-
- UInt32 deadKeyState = 0;
- // Unicode string length is usually less or equal to 4
- UniCharCount maxStringLength = 4;
- UniCharCount actualStringLength = 0;
- UniChar unicodeString[maxStringLength];
-
- OSStatus error;
-
- error = UCKeyTranslate(m_layout, // current layout
- virtualCode, // our key
- kUCKeyActionDown, // or kUCKeyActionUp ?
- 0x100, // no modifiers
- LMGetKbdType(), // keyboard's type
- kUCKeyTranslateNoDeadKeysBit,// some sort of option
- &deadKeyState, // unused stuff
- maxStringLength, // our memory limit
- &actualStringLength, // length of what we get
- unicodeString); // what we get
-
- if (error == noErr)
+ // Reset the mappings
+ for (int i = 0; i < Keyboard::KeyCount; ++i)
+ m_keyToScancodeMapping[i] = Keyboard::Scan::Unknown;
+ for (int i = 0; i < Keyboard::Scan::ScancodeCount; ++i)
+ m_scancodeToKeyMapping[i] = Keyboard::Unknown;
+
+ // Get the current keyboard layout
+ TISInputSourceRef tis = TISCopyCurrentKeyboardLayoutInputSource();
+ CFDataRef layoutData = static_cast<CFDataRef>(TISGetInputSourceProperty(tis, kTISPropertyUnicodeKeyLayoutData));
+
+ if (layoutData == 0)
{
- // Translation went fine
+ err() << "Cannot get the keyboard layout\n";
+ CFRelease(tis);
+ return;
+ }
- // The corresponding SFML key code
- Keyboard::Key code = Keyboard::Unknown; // KeyCound means 'none'
+ UCKeyboardLayout* layout = reinterpret_cast<UCKeyboardLayout*>(const_cast<UInt8*>(CFDataGetBytePtr(layoutData)));
- // First we look if the key down is from a list of characters
- // that depend on keyboard localization
- if (actualStringLength > 0)
- code = localizedKeys(unicodeString[0]);
+ // For each scancode having a IOHIDElement, we translate the corresponding
+ // virtual code to a localized Key.
+ for (int i = 0; i < Keyboard::Scan::ScancodeCount; ++i)
+ {
+ Keyboard::Scancode scan = static_cast<Keyboard::Scancode>(i);
+ UInt8 virtualCode = scanToVirtualCode(scan);
- // The key is not a localized one so we try to find a
- // corresponding code through virtual key code
- if (code == Keyboard::Unknown)
- code = nonLocalizedKeys(virtualCode);
+ if (virtualCode == UnknownVirtualCode)
+ continue;
- // A code was found, wonderful!
- if (code != Keyboard::Unknown)
+ // Translating virtual code to string is not injective. For example, virtual codes corresponding to
+ // Scan::Num0 and Scan::Numpad0 may be both translated to the same string "0". We want to map those to
+ // different Keyboard::Key nonetheless. This is why we do not translate some layout-independent keys
+ // to string and use fallback mapping instead.
+ bool translateToString = true;
+ switch (scan)
{
- // Ok, everything went fine. Now we have a unique
- // corresponding sf::Keyboard::Key to one IOHIDElementRef
- m_keys[code].push_back(key);
+ case Keyboard::Scan::NumpadDivide:
+ case Keyboard::Scan::NumpadMultiply:
+ case Keyboard::Scan::NumpadMinus:
+ case Keyboard::Scan::NumpadPlus:
+ case Keyboard::Scan::Numpad1:
+ case Keyboard::Scan::Numpad2:
+ case Keyboard::Scan::Numpad3:
+ case Keyboard::Scan::Numpad4:
+ case Keyboard::Scan::Numpad5:
+ case Keyboard::Scan::Numpad6:
+ case Keyboard::Scan::Numpad7:
+ case Keyboard::Scan::Numpad8:
+ case Keyboard::Scan::Numpad9:
+ case Keyboard::Scan::Numpad0:
+ translateToString = false;
+ break;
+ default:
+ translateToString = true;
+ break;
+ }
- // And don't forget to keep the reference alive for our usage
- CFRetain(m_keys[code].back());
+ Keyboard::Key code = Keyboard::Unknown;
+ if (translateToString)
+ {
+ // Unicode string length is usually less or equal to 4
+ UniCharCount const MAX_LENGTH = 4;
+ UniChar string[MAX_LENGTH];
+ UniCharCount length = 0;
+ UInt32 deadKeyState = 0; // unused value
+ UInt32 const modifiers = 0x100; // no modifiers
+
+ // Use current layout for translation
+ OSStatus error = UCKeyTranslate(
+ layout, virtualCode, kUCKeyActionDown, modifiers, LMGetKbdType(),
+ kUCKeyTranslateNoDeadKeysMask, &deadKeyState, MAX_LENGTH, &length, string
+ );
+
+ if (error != noErr)
+ {
+ err() << "Cannot translate the virtual key code, error: " << error << "\n";
+ continue;
+ }
+
+ if (length > 0)
+ code = localizedKey(string[0]);
}
+ if (code == Keyboard::Unknown)
+ code = localizedKeyFallback(scan);
+ if (code == Keyboard::Unknown)
+ continue;
- ////////////////////////////////////////////////////////////
- // These are known to be unbound:
- // Supposed Virtual | HID | Supposed Key
- // ===============================================
- // 0x1b | 0x2d | Hyphen
- // 0x39 | 0x39 | CapsLock
- // 0x47 | 0x53 | NumLock
- // 0x6e | 0x65 | Application
- // 0x4c | 0x77 | Select
-
- //if (code == Keyboard::Unknown) { // The key is unknown.
- // sf::err() << "This is an unknown key. Virtual key code is 0x"
- // << std::hex
- // << (UInt32)virtualCode
- // << " and HID usage code is 0x"
- // << usageCode
- // << std::dec
- // << "."
- // << std::endl;
- //}
-
- } /* if (error == noErr) */
- else
- {
- sf::err() << "Cannot translate the virtual key code, error: "
- << error
- << std::endl;
+ // Register the bi-mapping
+ if (m_keyToScancodeMapping[code] == Keyboard::Scan::Unknown)
+ m_keyToScancodeMapping[code] = scan;
+ m_scancodeToKeyMapping[scan] = code;
}
+
+ CFRelease(tis);
}
////////////////////////////////////////////////////////////
-void HIDInputManager::freeUp()
+void HIDInputManager::keyboardChanged(CFNotificationCenterRef /* center */, void* observer, CFStringRef /* name */, const void* /* object */, CFDictionaryRef /* userInfo */)
{
- m_isValid = false;
+ HIDInputManager* manager = static_cast<HIDInputManager*>(observer);
+ manager->buildMappings();
+}
+
- if (m_layoutData != 0)
- CFRelease(m_layoutData);
- m_layoutData = 0;
- // Do not release m_layout! It is owned by m_layoutData.
+////////////////////////////////////////////////////////////
+void HIDInputManager::freeUp()
+{
if (m_manager != 0)
CFRelease(m_manager);
m_manager = 0;
@@ -339,15 +927,14 @@ CFSetRef HIDInputManager::copyDevices(UInt32 page, UInt32 usage)
IOHIDManagerSetDeviceMatching(m_manager, mask);
CFRelease(mask);
- mask = 0;
+ mask = NULL;
CFSetRef devices = IOHIDManagerCopyDevices(m_manager);
if (devices == NULL)
return NULL;
// Is there at least one device?
- CFIndex deviceCount = CFSetGetCount(devices);
- if (deviceCount < 1)
+ if (CFSetGetCount(devices) < 1)
{
CFRelease(devices);
return NULL;
@@ -356,15 +943,12 @@ CFSetRef HIDInputManager::copyDevices(UInt32 page, UInt32 usage)
return devices;
}
+
+////////////////////////////////////////////////////////////
bool HIDInputManager::isPressed(IOHIDElements& elements)
{
- if (!m_isValid)
- return false;
-
- // state = true if at least one corresponding HID button is pressed
- bool state = false;
-
- for (IOHIDElements::iterator it = elements.begin(); it != elements.end(); /* noop */)
+ bool pressed = false;
+ for (IOHIDElements::iterator it = elements.begin(); it != elements.end() && !pressed; /* noop */)
{
IOHIDValueRef value = 0;
@@ -373,493 +957,446 @@ bool HIDInputManager::isPressed(IOHIDElements& elements)
if (!value)
{
- // This means some kind of error / disconnection so we remove this
- // element from our buttons
+ // This means some kind of error / disconnection so we remove this element from our database.
CFRelease(*it);
it = elements.erase(it);
}
- else if (IOHIDValueGetIntegerValue(value) == 1)
- {
- // This means the button is pressed
- state = true;
- break; // Stop here
- }
else
{
- // This means the button is released
+ pressed = (IOHIDValueGetIntegerValue(value) == 1);
++it;
}
+
}
- return state;
+ return pressed;
}
////////////////////////////////////////////////////////////
-UInt8 HIDInputManager::usageToVirtualCode(UInt32 usage)
+Keyboard::Scancode HIDInputManager::usageToScancode(UInt32 usage)
{
- // Some usage key doesn't have any corresponding virtual
- // code or it was not found (return 0xff).
switch (usage)
{
- case kHIDUsage_KeyboardErrorRollOver: return 0xff;
- case kHIDUsage_KeyboardPOSTFail: return 0xff;
- case kHIDUsage_KeyboardErrorUndefined: return 0xff;
-
- case kHIDUsage_KeyboardA: return 0x00;
- case kHIDUsage_KeyboardB: return 0x0b;
- case kHIDUsage_KeyboardC: return 0x08;
- case kHIDUsage_KeyboardD: return 0x02;
- case kHIDUsage_KeyboardE: return 0x0e;
- case kHIDUsage_KeyboardF: return 0x03;
- case kHIDUsage_KeyboardG: return 0x05;
- case kHIDUsage_KeyboardH: return 0x04;
- case kHIDUsage_KeyboardI: return 0x22;
- case kHIDUsage_KeyboardJ: return 0x26;
- case kHIDUsage_KeyboardK: return 0x28;
- case kHIDUsage_KeyboardL: return 0x25;
- case kHIDUsage_KeyboardM: return 0x2e;
- case kHIDUsage_KeyboardN: return 0x2d;
- case kHIDUsage_KeyboardO: return 0x1f;
- case kHIDUsage_KeyboardP: return 0x23;
- case kHIDUsage_KeyboardQ: return 0x0c;
- case kHIDUsage_KeyboardR: return 0x0f;
- case kHIDUsage_KeyboardS: return 0x01;
- case kHIDUsage_KeyboardT: return 0x11;
- case kHIDUsage_KeyboardU: return 0x20;
- case kHIDUsage_KeyboardV: return 0x09;
- case kHIDUsage_KeyboardW: return 0x0d;
- case kHIDUsage_KeyboardX: return 0x07;
- case kHIDUsage_KeyboardY: return 0x10;
- case kHIDUsage_KeyboardZ: return 0x06;
-
- case kHIDUsage_Keyboard1: return 0x12;
- case kHIDUsage_Keyboard2: return 0x13;
- case kHIDUsage_Keyboard3: return 0x14;
- case kHIDUsage_Keyboard4: return 0x15;
- case kHIDUsage_Keyboard5: return 0x17;
- case kHIDUsage_Keyboard6: return 0x16;
- case kHIDUsage_Keyboard7: return 0x1a;
- case kHIDUsage_Keyboard8: return 0x1c;
- case kHIDUsage_Keyboard9: return 0x19;
- case kHIDUsage_Keyboard0: return 0x1d;
-
- case kHIDUsage_KeyboardReturnOrEnter: return 0x24;
- case kHIDUsage_KeyboardEscape: return 0x35;
- case kHIDUsage_KeyboardDeleteOrBackspace: return 0x33;
- case kHIDUsage_KeyboardTab: return 0x30;
- case kHIDUsage_KeyboardSpacebar: return 0x31;
- case kHIDUsage_KeyboardHyphen: return 0x1b;
- case kHIDUsage_KeyboardEqualSign: return 0x18;
- case kHIDUsage_KeyboardOpenBracket: return 0x21;
- case kHIDUsage_KeyboardCloseBracket: return 0x1e;
- case kHIDUsage_KeyboardBackslash: return 0x2a;
- case kHIDUsage_KeyboardNonUSPound: return 0xff;
- case kHIDUsage_KeyboardSemicolon: return 0x29;
- case kHIDUsage_KeyboardQuote: return 0x27;
- case kHIDUsage_KeyboardGraveAccentAndTilde: return 0x32;
- case kHIDUsage_KeyboardComma: return 0x2b;
- case kHIDUsage_KeyboardPeriod: return 0x2F;
- case kHIDUsage_KeyboardSlash: return 0x2c;
- case kHIDUsage_KeyboardCapsLock: return 0x39;
-
- case kHIDUsage_KeyboardF1: return 0x7a;
- case kHIDUsage_KeyboardF2: return 0x78;
- case kHIDUsage_KeyboardF3: return 0x63;
- case kHIDUsage_KeyboardF4: return 0x76;
- case kHIDUsage_KeyboardF5: return 0x60;
- case kHIDUsage_KeyboardF6: return 0x61;
- case kHIDUsage_KeyboardF7: return 0x62;
- case kHIDUsage_KeyboardF8: return 0x64;
- case kHIDUsage_KeyboardF9: return 0x65;
- case kHIDUsage_KeyboardF10: return 0x6d;
- case kHIDUsage_KeyboardF11: return 0x67;
- case kHIDUsage_KeyboardF12: return 0x6f;
-
- case kHIDUsage_KeyboardPrintScreen: return 0xff;
- case kHIDUsage_KeyboardScrollLock: return 0xff;
- case kHIDUsage_KeyboardPause: return 0xff;
- case kHIDUsage_KeyboardInsert: return 0x72;
- case kHIDUsage_KeyboardHome: return 0x73;
- case kHIDUsage_KeyboardPageUp: return 0x74;
- case kHIDUsage_KeyboardDeleteForward: return 0x75;
- case kHIDUsage_KeyboardEnd: return 0x77;
- case kHIDUsage_KeyboardPageDown: return 0x79;
-
- case kHIDUsage_KeyboardRightArrow: return 0x7c;
- case kHIDUsage_KeyboardLeftArrow: return 0x7b;
- case kHIDUsage_KeyboardDownArrow: return 0x7d;
- case kHIDUsage_KeyboardUpArrow: return 0x7e;
-
- case kHIDUsage_KeypadNumLock: return 0x47;
- case kHIDUsage_KeypadSlash: return 0x4b;
- case kHIDUsage_KeypadAsterisk: return 0x43;
- case kHIDUsage_KeypadHyphen: return 0x4e;
- case kHIDUsage_KeypadPlus: return 0x45;
- case kHIDUsage_KeypadEnter: return 0x4c;
-
- case kHIDUsage_Keypad1: return 0x53;
- case kHIDUsage_Keypad2: return 0x54;
- case kHIDUsage_Keypad3: return 0x55;
- case kHIDUsage_Keypad4: return 0x56;
- case kHIDUsage_Keypad5: return 0x57;
- case kHIDUsage_Keypad6: return 0x58;
- case kHIDUsage_Keypad7: return 0x59;
- case kHIDUsage_Keypad8: return 0x5b;
- case kHIDUsage_Keypad9: return 0x5c;
- case kHIDUsage_Keypad0: return 0x52;
-
- case kHIDUsage_KeypadPeriod: return 0x41;
- case kHIDUsage_KeyboardNonUSBackslash: return 0xff;
- case kHIDUsage_KeyboardApplication: return 0x6e;
- case kHIDUsage_KeyboardPower: return 0xff;
- case kHIDUsage_KeypadEqualSign: return 0x51;
-
- case kHIDUsage_KeyboardF13: return 0x69;
- case kHIDUsage_KeyboardF14: return 0x6b;
- case kHIDUsage_KeyboardF15: return 0x71;
- case kHIDUsage_KeyboardF16: return 0xff;
- case kHIDUsage_KeyboardF17: return 0xff;
- case kHIDUsage_KeyboardF18: return 0xff;
- case kHIDUsage_KeyboardF19: return 0xff;
- case kHIDUsage_KeyboardF20: return 0xff;
- case kHIDUsage_KeyboardF21: return 0xff;
- case kHIDUsage_KeyboardF22: return 0xff;
- case kHIDUsage_KeyboardF23: return 0xff;
- case kHIDUsage_KeyboardF24: return 0xff;
-
- case kHIDUsage_KeyboardExecute: return 0xff;
- case kHIDUsage_KeyboardHelp: return 0xff;
- case kHIDUsage_KeyboardMenu: return 0x7F;
- case kHIDUsage_KeyboardSelect: return 0x4c;
- case kHIDUsage_KeyboardStop: return 0xff;
- case kHIDUsage_KeyboardAgain: return 0xff;
- case kHIDUsage_KeyboardUndo: return 0xff;
- case kHIDUsage_KeyboardCut: return 0xff;
- case kHIDUsage_KeyboardCopy: return 0xff;
- case kHIDUsage_KeyboardPaste: return 0xff;
- case kHIDUsage_KeyboardFind: return 0xff;
-
- case kHIDUsage_KeyboardMute: return 0xff;
- case kHIDUsage_KeyboardVolumeUp: return 0xff;
- case kHIDUsage_KeyboardVolumeDown: return 0xff;
-
- case kHIDUsage_KeyboardLockingCapsLock: return 0xff;
- case kHIDUsage_KeyboardLockingNumLock: return 0xff;
- case kHIDUsage_KeyboardLockingScrollLock: return 0xff;
-
- case kHIDUsage_KeypadComma: return 0xff;
- case kHIDUsage_KeypadEqualSignAS400: return 0xff;
- case kHIDUsage_KeyboardInternational1: return 0xff;
- case kHIDUsage_KeyboardInternational2: return 0xff;
- case kHIDUsage_KeyboardInternational3: return 0xff;
- case kHIDUsage_KeyboardInternational4: return 0xff;
- case kHIDUsage_KeyboardInternational5: return 0xff;
- case kHIDUsage_KeyboardInternational6: return 0xff;
- case kHIDUsage_KeyboardInternational7: return 0xff;
- case kHIDUsage_KeyboardInternational8: return 0xff;
- case kHIDUsage_KeyboardInternational9: return 0xff;
-
- case kHIDUsage_KeyboardLANG1: return 0xff;
- case kHIDUsage_KeyboardLANG2: return 0xff;
- case kHIDUsage_KeyboardLANG3: return 0xff;
- case kHIDUsage_KeyboardLANG4: return 0xff;
- case kHIDUsage_KeyboardLANG5: return 0xff;
- case kHIDUsage_KeyboardLANG6: return 0xff;
- case kHIDUsage_KeyboardLANG7: return 0xff;
- case kHIDUsage_KeyboardLANG8: return 0xff;
- case kHIDUsage_KeyboardLANG9: return 0xff;
-
- case kHIDUsage_KeyboardAlternateErase: return 0xff;
- case kHIDUsage_KeyboardSysReqOrAttention: return 0xff;
- case kHIDUsage_KeyboardCancel: return 0xff;
- case kHIDUsage_KeyboardClear: return 0xff;
- case kHIDUsage_KeyboardPrior: return 0xff;
- case kHIDUsage_KeyboardReturn: return 0xff;
- case kHIDUsage_KeyboardSeparator: return 0xff;
- case kHIDUsage_KeyboardOut: return 0xff;
- case kHIDUsage_KeyboardOper: return 0xff;
- case kHIDUsage_KeyboardClearOrAgain: return 0xff;
- case kHIDUsage_KeyboardCrSelOrProps: return 0xff;
- case kHIDUsage_KeyboardExSel: return 0xff;
+ case kHIDUsage_KeyboardErrorRollOver: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardPOSTFail: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardErrorUndefined: return Keyboard::Scan::Unknown;
+
+ case kHIDUsage_KeyboardA: return Keyboard::Scan::A;
+ case kHIDUsage_KeyboardB: return Keyboard::Scan::B;
+ case kHIDUsage_KeyboardC: return Keyboard::Scan::C;
+ case kHIDUsage_KeyboardD: return Keyboard::Scan::D;
+ case kHIDUsage_KeyboardE: return Keyboard::Scan::E;
+ case kHIDUsage_KeyboardF: return Keyboard::Scan::F;
+ case kHIDUsage_KeyboardG: return Keyboard::Scan::G;
+ case kHIDUsage_KeyboardH: return Keyboard::Scan::H;
+ case kHIDUsage_KeyboardI: return Keyboard::Scan::I;
+ case kHIDUsage_KeyboardJ: return Keyboard::Scan::J;
+ case kHIDUsage_KeyboardK: return Keyboard::Scan::K;
+ case kHIDUsage_KeyboardL: return Keyboard::Scan::L;
+ case kHIDUsage_KeyboardM: return Keyboard::Scan::M;
+ case kHIDUsage_KeyboardN: return Keyboard::Scan::N;
+ case kHIDUsage_KeyboardO: return Keyboard::Scan::O;
+ case kHIDUsage_KeyboardP: return Keyboard::Scan::P;
+ case kHIDUsage_KeyboardQ: return Keyboard::Scan::Q;
+ case kHIDUsage_KeyboardR: return Keyboard::Scan::R;
+ case kHIDUsage_KeyboardS: return Keyboard::Scan::S;
+ case kHIDUsage_KeyboardT: return Keyboard::Scan::T;
+ case kHIDUsage_KeyboardU: return Keyboard::Scan::U;
+ case kHIDUsage_KeyboardV: return Keyboard::Scan::V;
+ case kHIDUsage_KeyboardW: return Keyboard::Scan::W;
+ case kHIDUsage_KeyboardX: return Keyboard::Scan::X;
+ case kHIDUsage_KeyboardY: return Keyboard::Scan::Y;
+ case kHIDUsage_KeyboardZ: return Keyboard::Scan::Z;
+
+ case kHIDUsage_Keyboard1: return Keyboard::Scan::Num1;
+ case kHIDUsage_Keyboard2: return Keyboard::Scan::Num2;
+ case kHIDUsage_Keyboard3: return Keyboard::Scan::Num3;
+ case kHIDUsage_Keyboard4: return Keyboard::Scan::Num4;
+ case kHIDUsage_Keyboard5: return Keyboard::Scan::Num5;
+ case kHIDUsage_Keyboard6: return Keyboard::Scan::Num6;
+ case kHIDUsage_Keyboard7: return Keyboard::Scan::Num7;
+ case kHIDUsage_Keyboard8: return Keyboard::Scan::Num8;
+ case kHIDUsage_Keyboard9: return Keyboard::Scan::Num9;
+ case kHIDUsage_Keyboard0: return Keyboard::Scan::Num0;
+
+ case kHIDUsage_KeyboardReturnOrEnter: return Keyboard::Scan::Enter;
+ case kHIDUsage_KeyboardEscape: return Keyboard::Scan::Escape;
+ case kHIDUsage_KeyboardDeleteOrBackspace: return Keyboard::Scan::Backspace;
+ case kHIDUsage_KeyboardTab: return Keyboard::Scan::Tab;
+ case kHIDUsage_KeyboardSpacebar: return Keyboard::Scan::Space;
+ case kHIDUsage_KeyboardHyphen: return Keyboard::Scan::Hyphen;
+ case kHIDUsage_KeyboardEqualSign: return Keyboard::Scan::Equal;
+ case kHIDUsage_KeyboardOpenBracket: return Keyboard::Scan::LBracket;
+ case kHIDUsage_KeyboardCloseBracket: return Keyboard::Scan::RBracket;
+ case kHIDUsage_KeyboardBackslash: return Keyboard::Scan::Backslash;
+ case kHIDUsage_KeyboardNonUSPound: return Keyboard::Scan::Backslash;
+ case kHIDUsage_KeyboardSemicolon: return Keyboard::Scan::Semicolon;
+ case kHIDUsage_KeyboardQuote: return Keyboard::Scan::Apostrophe;
+ case kHIDUsage_KeyboardGraveAccentAndTilde: return IsIsoKeyboard ? Keyboard::Scan::NonUsBackslash : Keyboard::Scan::Grave;
+ case kHIDUsage_KeyboardComma: return Keyboard::Scan::Comma;
+ case kHIDUsage_KeyboardPeriod: return Keyboard::Scan::Period;
+ case kHIDUsage_KeyboardSlash: return Keyboard::Scan::Slash;
+ case kHIDUsage_KeyboardCapsLock: return Keyboard::Scan::CapsLock;
+
+ case kHIDUsage_KeyboardF1: return Keyboard::Scan::F1;
+ case kHIDUsage_KeyboardF2: return Keyboard::Scan::F2;
+ case kHIDUsage_KeyboardF3: return Keyboard::Scan::F3;
+ case kHIDUsage_KeyboardF4: return Keyboard::Scan::F4;
+ case kHIDUsage_KeyboardF5: return Keyboard::Scan::F5;
+ case kHIDUsage_KeyboardF6: return Keyboard::Scan::F6;
+ case kHIDUsage_KeyboardF7: return Keyboard::Scan::F7;
+ case kHIDUsage_KeyboardF8: return Keyboard::Scan::F8;
+ case kHIDUsage_KeyboardF9: return Keyboard::Scan::F9;
+ case kHIDUsage_KeyboardF10: return Keyboard::Scan::F10;
+ case kHIDUsage_KeyboardF11: return Keyboard::Scan::F11;
+ case kHIDUsage_KeyboardF12: return Keyboard::Scan::F12;
+
+ case kHIDUsage_KeyboardPrintScreen: return Keyboard::Scan::PrintScreen;
+ case kHIDUsage_KeyboardScrollLock: return Keyboard::Scan::ScrollLock;
+ case kHIDUsage_KeyboardPause: return Keyboard::Scan::Pause;
+ case kHIDUsage_KeyboardInsert: return Keyboard::Scan::Insert;
+ case kHIDUsage_KeyboardHome: return Keyboard::Scan::Home;
+ case kHIDUsage_KeyboardPageUp: return Keyboard::Scan::PageUp;
+ case kHIDUsage_KeyboardDeleteForward: return Keyboard::Scan::Delete;
+ case kHIDUsage_KeyboardEnd: return Keyboard::Scan::End;
+ case kHIDUsage_KeyboardPageDown: return Keyboard::Scan::PageDown;
+
+ case kHIDUsage_KeyboardRightArrow: return Keyboard::Scan::Right;
+ case kHIDUsage_KeyboardLeftArrow: return Keyboard::Scan::Left;
+ case kHIDUsage_KeyboardDownArrow: return Keyboard::Scan::Down;
+ case kHIDUsage_KeyboardUpArrow: return Keyboard::Scan::Up;
+
+ case kHIDUsage_KeypadNumLock: return Keyboard::Scan::NumLock;
+ case kHIDUsage_KeypadSlash: return Keyboard::Scan::NumpadDivide;
+ case kHIDUsage_KeypadAsterisk: return Keyboard::Scan::NumpadMultiply;
+ case kHIDUsage_KeypadHyphen: return Keyboard::Scan::NumpadMinus;
+ case kHIDUsage_KeypadPlus: return Keyboard::Scan::NumpadPlus;
+ case kHIDUsage_KeypadEqualSign: return Keyboard::Scan::NumpadEqual;
+ case kHIDUsage_KeypadEnter: return Keyboard::Scan::NumpadEnter;
+ case kHIDUsage_KeypadPeriod: return Keyboard::Scan::NumpadDecimal;
+
+ case kHIDUsage_Keypad1: return Keyboard::Scan::Numpad1;
+ case kHIDUsage_Keypad2: return Keyboard::Scan::Numpad2;
+ case kHIDUsage_Keypad3: return Keyboard::Scan::Numpad3;
+ case kHIDUsage_Keypad4: return Keyboard::Scan::Numpad4;
+ case kHIDUsage_Keypad5: return Keyboard::Scan::Numpad5;
+ case kHIDUsage_Keypad6: return Keyboard::Scan::Numpad6;
+ case kHIDUsage_Keypad7: return Keyboard::Scan::Numpad7;
+ case kHIDUsage_Keypad8: return Keyboard::Scan::Numpad8;
+ case kHIDUsage_Keypad9: return Keyboard::Scan::Numpad9;
+ case kHIDUsage_Keypad0: return Keyboard::Scan::Numpad0;
+
+ case kHIDUsage_KeyboardNonUSBackslash: return IsIsoKeyboard ? Keyboard::Scan::Grave : Keyboard::Scan::NonUsBackslash;
+ case kHIDUsage_KeyboardApplication: return Keyboard::Scan::Application;
+ case kHIDUsage_KeyboardPower: return Keyboard::Scan::Unknown;
+
+ case kHIDUsage_KeyboardF13: return Keyboard::Scan::F13;
+ case kHIDUsage_KeyboardF14: return Keyboard::Scan::F14;
+ case kHIDUsage_KeyboardF15: return Keyboard::Scan::F15;
+ case kHIDUsage_KeyboardF16: return Keyboard::Scan::F16;
+ case kHIDUsage_KeyboardF17: return Keyboard::Scan::F17;
+ case kHIDUsage_KeyboardF18: return Keyboard::Scan::F18;
+ case kHIDUsage_KeyboardF19: return Keyboard::Scan::F19;
+ case kHIDUsage_KeyboardF20: return Keyboard::Scan::F20;
+ case kHIDUsage_KeyboardF21: return Keyboard::Scan::F21;
+ case kHIDUsage_KeyboardF22: return Keyboard::Scan::F22;
+ case kHIDUsage_KeyboardF23: return Keyboard::Scan::F23;
+ case kHIDUsage_KeyboardF24: return Keyboard::Scan::F24;
+
+ case kHIDUsage_KeyboardExecute: return Keyboard::Scan::Execute;
+ case kHIDUsage_KeyboardHelp: return Keyboard::Scan::Help;
+ case kHIDUsage_KeyboardMenu: return Keyboard::Scan::Menu;
+ case kHIDUsage_KeyboardSelect: return Keyboard::Scan::Select;
+ case kHIDUsage_KeyboardStop: return Keyboard::Scan::Stop;
+ case kHIDUsage_KeyboardAgain: return Keyboard::Scan::Redo;
+ case kHIDUsage_KeyboardUndo: return Keyboard::Scan::Undo;
+ case kHIDUsage_KeyboardCut: return Keyboard::Scan::Cut;
+ case kHIDUsage_KeyboardCopy: return Keyboard::Scan::Copy;
+ case kHIDUsage_KeyboardPaste: return Keyboard::Scan::Paste;
+ case kHIDUsage_KeyboardFind: return Keyboard::Scan::Search;
+
+ case kHIDUsage_KeyboardMute: return Keyboard::Scan::VolumeMute;
+ case kHIDUsage_KeyboardVolumeUp: return Keyboard::Scan::VolumeUp;
+ case kHIDUsage_KeyboardVolumeDown: return Keyboard::Scan::VolumeDown;
+
+ case kHIDUsage_KeyboardLockingCapsLock: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardLockingNumLock: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardLockingScrollLock: return Keyboard::Scan::Unknown;
+
+ case kHIDUsage_KeypadComma: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeypadEqualSignAS400: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardInternational1: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardInternational2: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardInternational3: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardInternational4: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardInternational5: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardInternational6: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardInternational7: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardInternational8: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardInternational9: return Keyboard::Scan::Unknown;
+
+ case kHIDUsage_KeyboardLANG1: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardLANG2: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardLANG3: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardLANG4: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardLANG5: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardLANG6: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardLANG7: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardLANG8: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardLANG9: return Keyboard::Scan::Unknown;
+
+ case kHIDUsage_KeyboardAlternateErase: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardSysReqOrAttention: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardCancel: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardClear: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardPrior: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardReturn: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardSeparator: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardOut: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardOper: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardClearOrAgain: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardCrSelOrProps: return Keyboard::Scan::Unknown;
+ case kHIDUsage_KeyboardExSel: return Keyboard::Scan::Unknown;
/* 0xa5-0xdf Reserved */
- case kHIDUsage_KeyboardLeftControl: return 0x3b;
- case kHIDUsage_KeyboardLeftShift: return 0x38;
- case kHIDUsage_KeyboardLeftAlt: return 0x3a;
- case kHIDUsage_KeyboardLeftGUI: return 0x37;
- case kHIDUsage_KeyboardRightControl: return 0x3e;
- case kHIDUsage_KeyboardRightShift: return 0x3c;
- case kHIDUsage_KeyboardRightAlt: return 0x3d;
- case kHIDUsage_KeyboardRightGUI: return 0x36;
+ case kHIDUsage_KeyboardLeftControl: return Keyboard::Scan::LControl;
+ case kHIDUsage_KeyboardLeftShift: return Keyboard::Scan::LShift;
+ case kHIDUsage_KeyboardLeftAlt: return Keyboard::Scan::LAlt;
+ case kHIDUsage_KeyboardLeftGUI: return Keyboard::Scan::LSystem;
+ case kHIDUsage_KeyboardRightControl: return Keyboard::Scan::RControl;
+ case kHIDUsage_KeyboardRightShift: return Keyboard::Scan::RShift;
+ case kHIDUsage_KeyboardRightAlt: return Keyboard::Scan::RAlt;
+ case kHIDUsage_KeyboardRightGUI: return Keyboard::Scan::RSystem;
/* 0xe8-0xffff Reserved */
- case kHIDUsage_Keyboard_Reserved: return 0xff;
- default: return 0xff;
+ case kHIDUsage_Keyboard_Reserved: return Keyboard::Scan::Unknown;
+ default: return Keyboard::Scan::Unknown;
}
}
////////////////////////////////////////////////////////
-Keyboard::Key HIDInputManager::localizedKeys(UniChar ch)
+UInt8 HIDInputManager::scanToVirtualCode(Keyboard::Scancode code)
{
- switch (ch)
+ switch (code)
{
- case 'a':
- case 'A': return sf::Keyboard::A;
-
- case 'b':
- case 'B': return sf::Keyboard::B;
-
- case 'c':
- case 'C': return sf::Keyboard::C;
-
- case 'd':
- case 'D': return sf::Keyboard::D;
-
- case 'e':
- case 'E': return sf::Keyboard::E;
-
- case 'f':
- case 'F': return sf::Keyboard::F;
-
- case 'g':
- case 'G': return sf::Keyboard::G;
-
- case 'h':
- case 'H': return sf::Keyboard::H;
-
- case 'i':
- case 'I': return sf::Keyboard::I;
-
- case 'j':
- case 'J': return sf::Keyboard::J;
-
- case 'k':
- case 'K': return sf::Keyboard::K;
-
- case 'l':
- case 'L': return sf::Keyboard::L;
-
- case 'm':
- case 'M': return sf::Keyboard::M;
-
- case 'n':
- case 'N': return sf::Keyboard::N;
-
- case 'o':
- case 'O': return sf::Keyboard::O;
-
- case 'p':
- case 'P': return sf::Keyboard::P;
-
- case 'q':
- case 'Q': return sf::Keyboard::Q;
-
- case 'r':
- case 'R': return sf::Keyboard::R;
-
- case 's':
- case 'S': return sf::Keyboard::S;
-
- case 't':
- case 'T': return sf::Keyboard::T;
-
- case 'u':
- case 'U': return sf::Keyboard::U;
-
- case 'v':
- case 'V': return sf::Keyboard::V;
-
- case 'w':
- case 'W': return sf::Keyboard::W;
-
- case 'x':
- case 'X': return sf::Keyboard::X;
-
- case 'y':
- case 'Y': return sf::Keyboard::Y;
-
- case 'z':
- case 'Z': return sf::Keyboard::Z;
-
- // The key is not 'localized'.
- default: return sf::Keyboard::Unknown;
+ case Keyboard::Scan::A: return 0x00;
+ case Keyboard::Scan::B: return 0x0b;
+ case Keyboard::Scan::C: return 0x08;
+ case Keyboard::Scan::D: return 0x02;
+ case Keyboard::Scan::E: return 0x0e;
+ case Keyboard::Scan::F: return 0x03;
+ case Keyboard::Scan::G: return 0x05;
+ case Keyboard::Scan::H: return 0x04;
+ case Keyboard::Scan::I: return 0x22;
+ case Keyboard::Scan::J: return 0x26;
+ case Keyboard::Scan::K: return 0x28;
+ case Keyboard::Scan::L: return 0x25;
+ case Keyboard::Scan::M: return 0x2e;
+ case Keyboard::Scan::N: return 0x2d;
+ case Keyboard::Scan::O: return 0x1f;
+ case Keyboard::Scan::P: return 0x23;
+ case Keyboard::Scan::Q: return 0x0c;
+ case Keyboard::Scan::R: return 0x0f;
+ case Keyboard::Scan::S: return 0x01;
+ case Keyboard::Scan::T: return 0x11;
+ case Keyboard::Scan::U: return 0x20;
+ case Keyboard::Scan::V: return 0x09;
+ case Keyboard::Scan::W: return 0x0d;
+ case Keyboard::Scan::X: return 0x07;
+ case Keyboard::Scan::Y: return 0x10;
+ case Keyboard::Scan::Z: return 0x06;
+
+ case Keyboard::Scan::Num1: return 0x12;
+ case Keyboard::Scan::Num2: return 0x13;
+ case Keyboard::Scan::Num3: return 0x14;
+ case Keyboard::Scan::Num4: return 0x15;
+ case Keyboard::Scan::Num5: return 0x17;
+ case Keyboard::Scan::Num6: return 0x16;
+ case Keyboard::Scan::Num7: return 0x1a;
+ case Keyboard::Scan::Num8: return 0x1c;
+ case Keyboard::Scan::Num9: return 0x19;
+ case Keyboard::Scan::Num0: return 0x1d;
+
+ case Keyboard::Scan::Enter: return 0x24;
+ case Keyboard::Scan::Escape: return 0x35;
+ case Keyboard::Scan::Backspace: return 0x33;
+ case Keyboard::Scan::Tab: return 0x30;
+ case Keyboard::Scan::Space: return 0x31;
+
+ case Keyboard::Scan::Equal: return 0x18;
+ case Keyboard::Scan::LBracket: return 0x21;
+ case Keyboard::Scan::RBracket: return 0x1e;
+ case Keyboard::Scan::Backslash: return 0x2a;
+ case Keyboard::Scan::Hyphen: return 0x1b;
+ case Keyboard::Scan::Semicolon: return 0x29;
+ case Keyboard::Scan::Apostrophe: return 0x27;
+ case Keyboard::Scan::Grave: return IsIsoKeyboard ? 0x0a : 0x32;
+ case Keyboard::Scan::Comma: return 0x2b;
+ case Keyboard::Scan::Period: return 0x2f;
+ case Keyboard::Scan::Slash: return 0x2c;
+
+ case Keyboard::Scan::F1: return 0x7a;
+ case Keyboard::Scan::F2: return 0x78;
+ case Keyboard::Scan::F3: return 0x63;
+ case Keyboard::Scan::F4: return 0x76;
+ case Keyboard::Scan::F5: return 0x60;
+ case Keyboard::Scan::F6: return 0x61;
+ case Keyboard::Scan::F7: return 0x62;
+ case Keyboard::Scan::F8: return 0x64;
+ case Keyboard::Scan::F9: return 0x65;
+ case Keyboard::Scan::F10: return 0x6d;
+ case Keyboard::Scan::F11: return 0x67;
+ case Keyboard::Scan::F12: return 0x6f;
+ case Keyboard::Scan::F13: return 0x69;
+ case Keyboard::Scan::F14: return 0x6b;
+ case Keyboard::Scan::F15: return 0x71;
+
+ case Keyboard::Scan::CapsLock: return 0x39;
+
+ /* TODO Those are missing:
+ * case Keyboard::Scan::PrintScreen: return 0;
+ * case Keyboard::Scan::ScrollLock: return 0;
+ * case Keyboard::Scan::Pause: return 0;
+ */
+ case Keyboard::Scan::Insert: return 0x72;
+ case Keyboard::Scan::Home: return 0x73;
+ case Keyboard::Scan::PageUp: return 0x74;
+ case Keyboard::Scan::Delete: return 0x75;
+ case Keyboard::Scan::End: return 0x77;
+ case Keyboard::Scan::PageDown: return 0x79;
+
+ case Keyboard::Scan::Right: return 0x7c;
+ case Keyboard::Scan::Left: return 0x7b;
+ case Keyboard::Scan::Down: return 0x7d;
+ case Keyboard::Scan::Up: return 0x7e;
+
+ case Keyboard::Scan::NumLock: return 0x47;
+ case Keyboard::Scan::NumpadDivide: return 0x4b;
+ case Keyboard::Scan::NumpadMultiply: return 0x43;
+ case Keyboard::Scan::NumpadMinus: return 0x4e;
+ case Keyboard::Scan::NumpadPlus: return 0x45;
+ case Keyboard::Scan::NumpadEqual: return 0x51;
+ case Keyboard::Scan::NumpadEnter: return 0x4c;
+ case Keyboard::Scan::NumpadDecimal: return 0x41;
+
+ case Keyboard::Scan::Numpad1: return 0x53;
+ case Keyboard::Scan::Numpad2: return 0x54;
+ case Keyboard::Scan::Numpad3: return 0x55;
+ case Keyboard::Scan::Numpad4: return 0x56;
+ case Keyboard::Scan::Numpad5: return 0x57;
+ case Keyboard::Scan::Numpad6: return 0x58;
+ case Keyboard::Scan::Numpad7: return 0x59;
+ case Keyboard::Scan::Numpad8: return 0x5b;
+ case Keyboard::Scan::Numpad9: return 0x5c;
+ case Keyboard::Scan::Numpad0: return 0x52;
+
+ case Keyboard::Scan::NonUsBackslash: return 0x32;
+
+ /* TODO Those are missing:
+ * case Keyboard::Scan::Application: return 0;
+ * case Keyboard::Scan::Execute: return 0;
+ * case Keyboard::Scan::Help: return 0;
+ * case Keyboard::Scan::Menu: return 0;
+ * case Keyboard::Scan::Select: return 0;
+ * case Keyboard::Scan::Stop: return 0;
+ * case Keyboard::Scan::Redo: return 0;
+ * case Keyboard::Scan::Undo: return 0;
+ * case Keyboard::Scan::Cut: return 0;
+ * case Keyboard::Scan::Copy: return 0;
+ * case Keyboard::Scan::Paste: return 0;
+ * case Keyboard::Scan::Search: return 0;
+ */
+
+ case Keyboard::Scan::VolumeMute: return 0x4a;
+ case Keyboard::Scan::VolumeUp: return 0x48;
+ case Keyboard::Scan::VolumeDown: return 0x49;
+
+ case Keyboard::Scan::LControl: return 0x3b;
+ case Keyboard::Scan::LShift: return 0x38;
+ case Keyboard::Scan::LAlt: return 0x3a;
+ case Keyboard::Scan::LSystem: return 0x37;
+ case Keyboard::Scan::RControl: return 0x3b;
+ case Keyboard::Scan::RShift: return 0x38;
+ case Keyboard::Scan::RAlt: return 0x3a;
+ case Keyboard::Scan::RSystem: return 0x37;
+
+ default: return UnknownVirtualCode;
}
}
////////////////////////////////////////////////////////
-Keyboard::Key HIDInputManager::nonLocalizedKeys(UniChar virtualKeycode)
+Keyboard::Key HIDInputManager::localizedKeyFallback(Keyboard::Scancode code)
{
- // (Some) 0x code based on https://forums.macrumors.com/showthread.php?t=780577
- // Some sf::Keyboard::Key are present twice.
- switch (virtualKeycode)
+ switch (code)
{
- // These cases should not be used but anyway...
- case 0x00: return sf::Keyboard::A;
- case 0x0b: return sf::Keyboard::B;
- case 0x08: return sf::Keyboard::C;
- case 0x02: return sf::Keyboard::D;
- case 0x0e: return sf::Keyboard::E;
- case 0x03: return sf::Keyboard::F;
- case 0x05: return sf::Keyboard::G;
- case 0x04: return sf::Keyboard::H;
- case 0x22: return sf::Keyboard::I;
- case 0x26: return sf::Keyboard::J;
- case 0x28: return sf::Keyboard::K;
- case 0x25: return sf::Keyboard::L;
- case 0x2e: return sf::Keyboard::M;
- case 0x2d: return sf::Keyboard::N;
- case 0x1f: return sf::Keyboard::O;
- case 0x23: return sf::Keyboard::P;
- case 0x0c: return sf::Keyboard::Q;
- case 0x0f: return sf::Keyboard::R;
- case 0x01: return sf::Keyboard::S;
- case 0x11: return sf::Keyboard::T;
- case 0x20: return sf::Keyboard::U;
- case 0x09: return sf::Keyboard::V;
- case 0x0d: return sf::Keyboard::W;
- case 0x07: return sf::Keyboard::X;
- case 0x10: return sf::Keyboard::Y;
- case 0x06: return sf::Keyboard::Z;
-
- // These cases should not be used but anyway...
- case 0x1d: return sf::Keyboard::Num0;
- case 0x12: return sf::Keyboard::Num1;
- case 0x13: return sf::Keyboard::Num2;
- case 0x14: return sf::Keyboard::Num3;
- case 0x15: return sf::Keyboard::Num4;
- case 0x17: return sf::Keyboard::Num5;
- case 0x16: return sf::Keyboard::Num6;
- case 0x1a: return sf::Keyboard::Num7;
- case 0x1c: return sf::Keyboard::Num8;
- case 0x19: return sf::Keyboard::Num9;
-
- case 0x35: return sf::Keyboard::Escape;
-
- // Modifier keys : never happen with keyDown/keyUp methods (?)
- case 0x3b: return sf::Keyboard::LControl;
- case 0x38: return sf::Keyboard::LShift;
- case 0x3a: return sf::Keyboard::LAlt;
- case 0x37: return sf::Keyboard::LSystem;
- case 0x3e: return sf::Keyboard::RControl;
- case 0x3c: return sf::Keyboard::RShift;
- case 0x3d: return sf::Keyboard::RAlt;
- case 0x36: return sf::Keyboard::RSystem;
-
- case 0x7f: return sf::Keyboard::Menu;
- case NSMenuFunctionKey: return sf::Keyboard::Menu;
-
- case 0x21: return sf::Keyboard::LBracket;
- case 0x1e: return sf::Keyboard::RBracket;
- case 0x29: return sf::Keyboard::Semicolon;
- case 0x2b: return sf::Keyboard::Comma;
- case 0x41: /* keypad */ return sf::Keyboard::Period;
- case 0x2f: /* keyboard */ return sf::Keyboard::Period;
- case 0x27: return sf::Keyboard::Quote;
- case 0x2c: return sf::Keyboard::Slash;
- case 0x2a: return sf::Keyboard::Backslash;
-
- // sf::Keyboard::Tilde might be in conflict with some other key.
- // 0x0a is for "Non-US Backslash" according to HID Calibrator,
- // a sample provided by Apple.
- case 0x0a: return sf::Keyboard::Tilde;
-
- case 0x51: /* keypad */ return sf::Keyboard::Equal;
- case 0x18: /* keyboard */ return sf::Keyboard::Equal;
- case 0x32: return sf::Keyboard::Hyphen;
- case 0x31: return sf::Keyboard::Space;
- case 0x4c: /* keypad */ return sf::Keyboard::Enter;
- case 0x24: /* keyboard */ return sf::Keyboard::Enter;
- case 0x33: return sf::Keyboard::Backspace;
- case 0x30: return sf::Keyboard::Tab;
-
- // Duplicates (see next section).
- case 0x74: return sf::Keyboard::PageUp;
- case 0x79: return sf::Keyboard::PageDown;
- case 0x77: return sf::Keyboard::End;
- case 0x73: return sf::Keyboard::Home;
-
- case NSPageUpFunctionKey: return sf::Keyboard::PageUp;
- case NSPageDownFunctionKey: return sf::Keyboard::PageDown;
- case NSEndFunctionKey: return sf::Keyboard::End;
- case NSHomeFunctionKey: return sf::Keyboard::Home;
-
- case 0x72: return sf::Keyboard::Insert;
- case NSInsertFunctionKey: return sf::Keyboard::Insert;
- case 0x75: return sf::Keyboard::Delete;
- case NSDeleteFunctionKey: return sf::Keyboard::Delete;
-
- case 0x45: return sf::Keyboard::Add;
- case 0x4e: return sf::Keyboard::Subtract;
- case 0x43: return sf::Keyboard::Multiply;
- case 0x4b: return sf::Keyboard::Divide;
-
- // Duplicates (see next section).
- case 0x7b: return sf::Keyboard::Left;
- case 0x7c: return sf::Keyboard::Right;
- case 0x7e: return sf::Keyboard::Up;
- case 0x7d: return sf::Keyboard::Down;
-
- case NSLeftArrowFunctionKey: return sf::Keyboard::Left;
- case NSRightArrowFunctionKey: return sf::Keyboard::Right;
- case NSUpArrowFunctionKey: return sf::Keyboard::Up;
- case NSDownArrowFunctionKey: return sf::Keyboard::Down;
-
- case 0x52: return sf::Keyboard::Numpad0;
- case 0x53: return sf::Keyboard::Numpad1;
- case 0x54: return sf::Keyboard::Numpad2;
- case 0x55: return sf::Keyboard::Numpad3;
- case 0x56: return sf::Keyboard::Numpad4;
- case 0x57: return sf::Keyboard::Numpad5;
- case 0x58: return sf::Keyboard::Numpad6;
- case 0x59: return sf::Keyboard::Numpad7;
- case 0x5b: return sf::Keyboard::Numpad8;
- case 0x5c: return sf::Keyboard::Numpad9;
-
- // Duplicates (see next section).
- case 0x7a: return sf::Keyboard::F1;
- case 0x78: return sf::Keyboard::F2;
- case 0x63: return sf::Keyboard::F3;
- case 0x76: return sf::Keyboard::F4;
- case 0x60: return sf::Keyboard::F5;
- case 0x61: return sf::Keyboard::F6;
- case 0x62: return sf::Keyboard::F7;
- case 0x64: return sf::Keyboard::F8;
- case 0x65: return sf::Keyboard::F9;
- case 0x6d: return sf::Keyboard::F10;
- case 0x67: return sf::Keyboard::F11;
- case 0x6f: return sf::Keyboard::F12;
- case 0x69: return sf::Keyboard::F13;
- case 0x6b: return sf::Keyboard::F14;
- case 0x71: return sf::Keyboard::F15;
-
- case NSF1FunctionKey: return sf::Keyboard::F1;
- case NSF2FunctionKey: return sf::Keyboard::F2;
- case NSF3FunctionKey: return sf::Keyboard::F3;
- case NSF4FunctionKey: return sf::Keyboard::F4;
- case NSF5FunctionKey: return sf::Keyboard::F5;
- case NSF6FunctionKey: return sf::Keyboard::F6;
- case NSF7FunctionKey: return sf::Keyboard::F7;
- case NSF8FunctionKey: return sf::Keyboard::F8;
- case NSF9FunctionKey: return sf::Keyboard::F9;
- case NSF10FunctionKey: return sf::Keyboard::F10;
- case NSF11FunctionKey: return sf::Keyboard::F11;
- case NSF12FunctionKey: return sf::Keyboard::F12;
- case NSF13FunctionKey: return sf::Keyboard::F13;
- case NSF14FunctionKey: return sf::Keyboard::F14;
- case NSF15FunctionKey: return sf::Keyboard::F15;
-
- case NSPauseFunctionKey: return sf::Keyboard::Pause;
-
- // keycode 0x1b is not bound to any key.
- // This key is ' on CH-FR, ) on FR and - on US layouts.
-
- // An unknown key.
- default: return sf::Keyboard::Unknown;
+ case Keyboard::Scan::Enter: return Keyboard::Enter;
+ case Keyboard::Scan::Escape: return Keyboard::Escape;
+ case Keyboard::Scan::Backspace: return Keyboard::Backspace;
+ case Keyboard::Scan::Tab: return Keyboard::Tab;
+ case Keyboard::Scan::Space: return Keyboard::Space;
+
+ case Keyboard::Scan::F1: return Keyboard::F1;
+ case Keyboard::Scan::F2: return Keyboard::F2;
+ case Keyboard::Scan::F3: return Keyboard::F3;
+ case Keyboard::Scan::F4: return Keyboard::F4;
+ case Keyboard::Scan::F5: return Keyboard::F5;
+ case Keyboard::Scan::F6: return Keyboard::F6;
+ case Keyboard::Scan::F7: return Keyboard::F7;
+ case Keyboard::Scan::F8: return Keyboard::F8;
+ case Keyboard::Scan::F9: return Keyboard::F9;
+ case Keyboard::Scan::F10: return Keyboard::F10;
+ case Keyboard::Scan::F11: return Keyboard::F11;
+ case Keyboard::Scan::F12: return Keyboard::F12;
+ case Keyboard::Scan::F13: return Keyboard::F13;
+ case Keyboard::Scan::F14: return Keyboard::F14;
+ case Keyboard::Scan::F15: return Keyboard::F15;
+
+ case Keyboard::Scan::Pause: return Keyboard::Pause;
+ case Keyboard::Scan::Insert: return Keyboard::Insert;
+ case Keyboard::Scan::Home: return Keyboard::Home;
+ case Keyboard::Scan::PageUp: return Keyboard::PageUp;
+ case Keyboard::Scan::Delete: return Keyboard::Delete;
+ case Keyboard::Scan::End: return Keyboard::End;
+ case Keyboard::Scan::PageDown: return Keyboard::PageDown;
+
+ case Keyboard::Scan::Right: return Keyboard::Right;
+ case Keyboard::Scan::Left: return Keyboard::Left;
+ case Keyboard::Scan::Down: return Keyboard::Down;
+ case Keyboard::Scan::Up: return Keyboard::Up;
+
+ case Keyboard::Scan::NumpadDivide: return Keyboard::Divide;
+ case Keyboard::Scan::NumpadMultiply: return Keyboard::Multiply;
+ case Keyboard::Scan::NumpadMinus: return Keyboard::Subtract;
+ case Keyboard::Scan::NumpadPlus: return Keyboard::Add;
+
+ case Keyboard::Scan::NumpadEnter: return Keyboard::Enter;
+
+ case Keyboard::Scan::Numpad1: return Keyboard::Numpad1;
+ case Keyboard::Scan::Numpad2: return Keyboard::Numpad2;
+ case Keyboard::Scan::Numpad3: return Keyboard::Numpad3;
+ case Keyboard::Scan::Numpad4: return Keyboard::Numpad4;
+ case Keyboard::Scan::Numpad5: return Keyboard::Numpad5;
+ case Keyboard::Scan::Numpad6: return Keyboard::Numpad6;
+ case Keyboard::Scan::Numpad7: return Keyboard::Numpad7;
+ case Keyboard::Scan::Numpad8: return Keyboard::Numpad8;
+ case Keyboard::Scan::Numpad9: return Keyboard::Numpad9;
+ case Keyboard::Scan::Numpad0: return Keyboard::Numpad0;
+
+ case Keyboard::Scan::LControl: return Keyboard::LControl;
+ case Keyboard::Scan::LShift: return Keyboard::LShift;
+ case Keyboard::Scan::LAlt: return Keyboard::LAlt;
+ case Keyboard::Scan::LSystem: return Keyboard::LSystem;
+ case Keyboard::Scan::RControl: return Keyboard::RControl;
+ case Keyboard::Scan::RShift: return Keyboard::RShift;
+ case Keyboard::Scan::RAlt: return Keyboard::RAlt;
+ case Keyboard::Scan::RSystem: return Keyboard::RSystem;
+
+ default: return Keyboard::Unknown;
}
}
diff --git a/src/SFML/Window/OSX/HIDJoystickManager.cpp b/src/SFML/Window/OSX/HIDJoystickManager.cpp
index 72c165a..170017a 100644
--- a/src/SFML/Window/OSX/HIDJoystickManager.cpp
+++ b/src/SFML/Window/OSX/HIDJoystickManager.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -85,7 +85,7 @@ m_joystickCount(0)
maskArray[0] = mask0;
maskArray[1] = mask1;
- CFArrayRef mask = CFArrayCreate(NULL, (const void**)maskArray, 2, NULL);
+ CFArrayRef mask = CFArrayCreate(NULL, reinterpret_cast<const void**>(maskArray), 2, NULL);
IOHIDManagerSetDeviceMatchingMultiple(m_manager, mask);
CFRelease(mask);
diff --git a/src/SFML/Window/OSX/HIDJoystickManager.hpp b/src/SFML/Window/OSX/HIDJoystickManager.hpp
index eb249cc..c8b9980 100644
--- a/src/SFML/Window/OSX/HIDJoystickManager.hpp
+++ b/src/SFML/Window/OSX/HIDJoystickManager.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/InputImpl.hpp b/src/SFML/Window/OSX/InputImpl.hpp
index 6f874bc..808f112 100644
--- a/src/SFML/Window/OSX/InputImpl.hpp
+++ b/src/SFML/Window/OSX/InputImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -46,19 +46,37 @@ class InputImpl
public:
////////////////////////////////////////////////////////////
- /// \brief Check if a key is pressed
+ /// \copydoc sf::Keyboard::isKeyPressed(Key)
///
- /// \param key Key to check
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::isKeyPressed(Scancode)
///
- /// \return True if the key is pressed, false otherwise
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::localize
///
////////////////////////////////////////////////////////////
- static bool isKeyPressed(Keyboard::Key key);
+ static Keyboard::Key localize(Keyboard::Scancode code);
////////////////////////////////////////////////////////////
- /// \brief Show or hide the virtual keyboard
+ /// \copydoc sf::Keyboard::delocalize
///
- /// \param visible True to show, false to hide
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Scancode delocalize(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::getDescription
+ ///
+ ////////////////////////////////////////////////////////////
+ static String getDescription(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::setVirtualKeyboardVisible
///
////////////////////////////////////////////////////////////
static void setVirtualKeyboardVisible(bool visible);
@@ -96,7 +114,7 @@ public:
/// \return Current position of the mouse
///
////////////////////////////////////////////////////////////
- static Vector2i getMousePosition(const Window& relativeTo);
+ static Vector2i getMousePosition(const WindowBase& relativeTo);
////////////////////////////////////////////////////////////
/// \brief Set the current position of the mouse in desktop coordinates
@@ -121,7 +139,7 @@ public:
/// \param relativeTo Reference window
///
////////////////////////////////////////////////////////////
- static void setMousePosition(const Vector2i& position, const Window& relativeTo);
+ static void setMousePosition(const Vector2i& position, const WindowBase& relativeTo);
////////////////////////////////////////////////////////////
/// \brief Check if a touch event is currently down
@@ -158,7 +176,7 @@ public:
/// \return Current position of \a finger, or undefined if it's not down
///
////////////////////////////////////////////////////////////
- static Vector2i getTouchPosition(unsigned int finger, const Window& relativeTo);
+ static Vector2i getTouchPosition(unsigned int finger, const WindowBase& relativeTo);
};
} // namespace priv
diff --git a/src/SFML/Window/OSX/InputImpl.mm b/src/SFML/Window/OSX/InputImpl.mm
index 361e1be..1211917 100644
--- a/src/SFML/Window/OSX/InputImpl.mm
+++ b/src/SFML/Window/OSX/InputImpl.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -28,6 +28,7 @@
////////////////////////////////////////////////////////////
#include <SFML/Window/VideoMode.hpp>
#include <SFML/Window/Window.hpp>
+#include <SFML/Window/OSX/AutoreleasePoolWrapper.hpp>
#include <SFML/Window/OSX/InputImpl.hpp>
#include <SFML/Window/OSX/HIDInputManager.hpp>
#include <SFML/System/Err.hpp>
@@ -39,9 +40,6 @@
/// In order to keep track of the keyboard's state and mouse buttons' state
/// we use the HID manager. Mouse position is handled differently.
///
-/// NB: we probably could use
-/// NSEvent +addGlobalMonitorForEventsMatchingMask:handler: for mouse only.
-///
////////////////////////////////////////////////////////////
namespace sf
@@ -55,9 +53,9 @@ namespace priv
/// \return nil if something went wrong or a SFOpenGLView*.
///
////////////////////////////////////////////////////////////
-SFOpenGLView* getSFOpenGLViewFromSFMLWindow(const Window& window)
+SFOpenGLView* getSFOpenGLViewFromSFMLWindow(const WindowBase& window)
{
- id nsHandle = (id)window.getSystemHandle();
+ id nsHandle = static_cast<id>(window.getSystemHandle());
// Get our SFOpenGLView from ...
SFOpenGLView* view = nil;
@@ -77,7 +75,7 @@ SFOpenGLView* getSFOpenGLViewFromSFMLWindow(const Window& window)
{
if ([subview isKindOfClass:[SFOpenGLView class]])
{
- view = (SFOpenGLView*)subview;
+ view = static_cast<SFOpenGLView*>(subview);
break;
}
}
@@ -101,7 +99,7 @@ SFOpenGLView* getSFOpenGLViewFromSFMLWindow(const Window& window)
{
if ([subview isKindOfClass:[SFOpenGLView class]])
{
- view = (SFOpenGLView*)subview;
+ view = static_cast<SFOpenGLView*>(subview);
break;
}
}
@@ -122,14 +120,44 @@ SFOpenGLView* getSFOpenGLViewFromSFMLWindow(const Window& window)
return view;
}
+
////////////////////////////////////////////////////////////
bool InputImpl::isKeyPressed(Keyboard::Key key)
{
+ AutoreleasePool pool;
return HIDInputManager::getInstance().isKeyPressed(key);
}
////////////////////////////////////////////////////////////
+bool InputImpl::isKeyPressed(Keyboard::Scancode code)
+{
+ return HIDInputManager::getInstance().isKeyPressed(code);
+}
+
+
+////////////////////////////////////////////////////////////
+Keyboard::Key InputImpl::localize(Keyboard::Scancode code)
+{
+ return HIDInputManager::getInstance().localize(code);
+}
+
+
+////////////////////////////////////////////////////////////
+Keyboard::Scancode InputImpl::delocalize(Keyboard::Key key)
+{
+ return HIDInputManager::getInstance().delocalize(key);
+}
+
+
+////////////////////////////////////////////////////////////
+String InputImpl::getDescription(Keyboard::Scancode code)
+{
+ return HIDInputManager::getInstance().getDescription(code);
+}
+
+
+////////////////////////////////////////////////////////////
void InputImpl::setVirtualKeyboardVisible(bool /*visible*/)
{
// Not applicable
@@ -139,6 +167,7 @@ void InputImpl::setVirtualKeyboardVisible(bool /*visible*/)
////////////////////////////////////////////////////////////
bool InputImpl::isMouseButtonPressed(Mouse::Button button)
{
+ AutoreleasePool pool;
NSUInteger state = [NSEvent pressedMouseButtons];
NSUInteger flag = 1 << button;
return (state & flag) != 0;
@@ -148,18 +177,20 @@ bool InputImpl::isMouseButtonPressed(Mouse::Button button)
////////////////////////////////////////////////////////////
Vector2i InputImpl::getMousePosition()
{
+ AutoreleasePool pool;
// Reverse Y axis to match SFML coord.
NSPoint pos = [NSEvent mouseLocation];
pos.y = sf::VideoMode::getDesktopMode().height - pos.y;
- int scale = [[NSScreen mainScreen] backingScaleFactor];
- return Vector2i(pos.x, pos.y) * scale;
+ int scale = static_cast<int>([[NSScreen mainScreen] backingScaleFactor]);
+ return Vector2i(static_cast<int>(pos.x), static_cast<int>(pos.y)) * scale;
}
////////////////////////////////////////////////////////////
-Vector2i InputImpl::getMousePosition(const Window& relativeTo)
+Vector2i InputImpl::getMousePosition(const WindowBase& relativeTo)
{
+ AutoreleasePool pool;
SFOpenGLView* view = getSFOpenGLViewFromSFMLWindow(relativeTo);
// No view ?
@@ -169,16 +200,17 @@ Vector2i InputImpl::getMousePosition(const Window& relativeTo)
// Use -cursorPositionFromEvent: with nil.
NSPoint pos = [view cursorPositionFromEvent:nil];
- int scale = [view displayScaleFactor];
- return Vector2i(pos.x, pos.y) * scale;
+ int scale = static_cast<int>([view displayScaleFactor]);
+ return Vector2i(static_cast<int>(pos.x), static_cast<int>(pos.y)) * scale;
}
////////////////////////////////////////////////////////////
void InputImpl::setMousePosition(const Vector2i& position)
{
+ AutoreleasePool pool;
// Here we don't need to reverse the coordinates.
- int scale = [[NSScreen mainScreen] backingScaleFactor];
+ int scale = static_cast<int>([[NSScreen mainScreen] backingScaleFactor]);
CGPoint pos = CGPointMake(position.x / scale, position.y / scale);
// Place the cursor.
@@ -193,8 +225,9 @@ void InputImpl::setMousePosition(const Vector2i& position)
////////////////////////////////////////////////////////////
-void InputImpl::setMousePosition(const Vector2i& position, const Window& relativeTo)
+void InputImpl::setMousePosition(const Vector2i& position, const WindowBase& relativeTo)
{
+ AutoreleasePool pool;
SFOpenGLView* view = getSFOpenGLViewFromSFMLWindow(relativeTo);
// No view ?
@@ -202,10 +235,10 @@ void InputImpl::setMousePosition(const Vector2i& position, const Window& relativ
return;
// Let SFOpenGLView compute the position in global coordinate
- int scale = [view displayScaleFactor];
+ int scale = static_cast<int>([view displayScaleFactor]);
NSPoint p = NSMakePoint(position.x / scale, position.y / scale);
p = [view computeGlobalPositionOfRelativePoint:p];
- setMousePosition(sf::Vector2i(p.x, p.y) * scale);
+ setMousePosition(sf::Vector2i(static_cast<int>(p.x), static_cast<int>(p.y)) * scale);
}
@@ -226,7 +259,7 @@ Vector2i InputImpl::getTouchPosition(unsigned int /*finger*/)
////////////////////////////////////////////////////////////
-Vector2i InputImpl::getTouchPosition(unsigned int /*finger*/, const Window& /*relativeTo*/)
+Vector2i InputImpl::getTouchPosition(unsigned int /*finger*/, const WindowBase& /*relativeTo*/)
{
// Not applicable
return Vector2i();
diff --git a/src/SFML/Window/OSX/JoystickImpl.cpp b/src/SFML/Window/OSX/JoystickImpl.cpp
index 9552b19..ac8395c 100644
--- a/src/SFML/Window/OSX/JoystickImpl.cpp
+++ b/src/SFML/Window/OSX/JoystickImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -27,6 +27,7 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Window/JoystickImpl.hpp>
+#include <SFML/Window/OSX/AutoreleasePoolWrapper.hpp>
#include <SFML/Window/OSX/HIDInputManager.hpp>
#include <SFML/Window/OSX/HIDJoystickManager.hpp>
#include <SFML/System/Err.hpp>
@@ -43,7 +44,7 @@ namespace
std::string stringFromCFString(CFStringRef cfString)
{
CFIndex length = CFStringGetLength(cfString);
- std::vector<char> str(length);
+ std::vector<char> str(static_cast<std::size_t>(length));
CFIndex maxSize = CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8);
CFStringGetCString(cfString, &str[0], maxSize, kCFStringEncodingUTF8);
return &str[0];
@@ -71,8 +72,8 @@ namespace
if (typeRef && (CFGetTypeID(typeRef) == CFNumberGetTypeID()))
{
SInt32 value;
- CFNumberGetValue((CFNumberRef)typeRef, kCFNumberSInt32Type, &value);
- return value;
+ CFNumberGetValue(static_cast<CFNumberRef>(typeRef), kCFNumberSInt32Type, &value);
+ return static_cast<unsigned int>(value);
}
sf::err() << "Unable to read uint value for property '" << stringFromCFString(prop) << "' for joystick at index " << index << std::endl;
@@ -106,6 +107,7 @@ void JoystickImpl::cleanup()
////////////////////////////////////////////////////////////
bool JoystickImpl::isConnected(unsigned int index)
{
+ AutoreleasePool pool;
bool state = false; // Is the index-th joystick connected?
// First, let's check if the device was previously detected:
@@ -141,15 +143,15 @@ bool JoystickImpl::isConnected(unsigned int index)
CFIndex size = CFSetGetCount(devices);
if (size > 0)
{
- CFTypeRef array[size]; // array of IOHIDDeviceRef
- CFSetGetValues(devices, array);
+ std::vector<CFTypeRef> array(static_cast<std::size_t>(size)); // array of IOHIDDeviceRef
+ CFSetGetValues(devices, array.data());
// If there exists a device d s.t. there is no j s.t.
// m_locationIDs[j] == d's location then we have a new device.
for (CFIndex didx(0); !state && didx < size; ++didx)
{
- IOHIDDeviceRef d = (IOHIDDeviceRef)array[didx];
+ IOHIDDeviceRef d = static_cast<IOHIDDeviceRef>(const_cast<void*>(array[static_cast<std::size_t>(didx)]));
Location dloc = HIDInputManager::getLocationID(d);
bool foundJ = false;
@@ -180,6 +182,7 @@ bool JoystickImpl::isConnected(unsigned int index)
////////////////////////////////////////////////////////////
bool JoystickImpl::open(unsigned int index)
{
+ AutoreleasePool pool;
m_index = index;
m_hat = NULL;
Location deviceLoc = m_locationIDs[index]; // The device we need to load
@@ -191,14 +194,14 @@ bool JoystickImpl::open(unsigned int index)
// Get a usable copy of the joysticks devices.
CFIndex joysticksCount = CFSetGetCount(devices);
- CFTypeRef devicesArray[joysticksCount];
- CFSetGetValues(devices, devicesArray);
+ std::vector<CFTypeRef> devicesArray(static_cast<std::size_t>(joysticksCount));
+ CFSetGetValues(devices, devicesArray.data());
// Get the desired joystick.
IOHIDDeviceRef self = 0;
for (CFIndex i(0); self == 0 && i < joysticksCount; ++i)
{
- IOHIDDeviceRef d = (IOHIDDeviceRef)devicesArray[i];
+ IOHIDDeviceRef d = static_cast<IOHIDDeviceRef>(const_cast<void*>(devicesArray[static_cast<std::size_t>(i)]));
if (deviceLoc == HIDInputManager::getLocationID(d))
self = d;
}
@@ -226,7 +229,7 @@ bool JoystickImpl::open(unsigned int index)
CFIndex elementsCount = CFArrayGetCount(elements);
for (int i = 0; i < elementsCount; ++i)
{
- IOHIDElementRef element = (IOHIDElementRef) CFArrayGetValueAtIndex(elements, i);
+ IOHIDElementRef element = static_cast<IOHIDElementRef>(const_cast<void*>(CFArrayGetValueAtIndex(elements, i)));
switch (IOHIDElementGetUsagePage(element))
{
case kHIDPage_GenericDesktop:
@@ -325,6 +328,7 @@ bool JoystickImpl::open(unsigned int index)
////////////////////////////////////////////////////////////
void JoystickImpl::close()
{
+ AutoreleasePool pool;
for (ButtonsVector::iterator it(m_buttons.begin()); it != m_buttons.end(); ++it)
CFRelease(*it);
m_buttons.clear();
@@ -345,10 +349,11 @@ void JoystickImpl::close()
////////////////////////////////////////////////////////////
JoystickCaps JoystickImpl::getCapabilities() const
{
+ AutoreleasePool pool;
JoystickCaps caps;
// Buttons:
- caps.buttonCount = m_buttons.size();
+ caps.buttonCount = static_cast<unsigned int>(m_buttons.size());
// Axis:
for (AxisMap::const_iterator it(m_axis.begin()); it != m_axis.end(); ++it)
@@ -364,6 +369,7 @@ JoystickCaps JoystickImpl::getCapabilities() const
////////////////////////////////////////////////////////////
Joystick::Identification JoystickImpl::getIdentification() const
{
+ AutoreleasePool pool;
return m_identification;
}
@@ -371,6 +377,7 @@ Joystick::Identification JoystickImpl::getIdentification() const
////////////////////////////////////////////////////////////
JoystickState JoystickImpl::update()
{
+ AutoreleasePool pool;
static const JoystickState disconnectedState; // return this if joystick was disconnected
JoystickState state; // otherwise return that
state.connected = true;
@@ -388,14 +395,14 @@ JoystickState JoystickImpl::update()
// Get a usable copy of the joysticks devices.
CFIndex joysticksCount = CFSetGetCount(devices);
- CFTypeRef devicesArray[joysticksCount];
- CFSetGetValues(devices, devicesArray);
+ std::vector<CFTypeRef> devicesArray(static_cast<std::size_t>(joysticksCount));
+ CFSetGetValues(devices, devicesArray.data());
// Search for it
bool found = false;
for (CFIndex i(0); !found && i < joysticksCount; ++i)
{
- IOHIDDeviceRef d = (IOHIDDeviceRef)devicesArray[i];
+ IOHIDDeviceRef d = static_cast<IOHIDDeviceRef>(const_cast<void*>(devicesArray[static_cast<std::size_t>(i)]));
if (selfLoc == HIDInputManager::getLocationID(d))
found = true;
}
@@ -446,12 +453,12 @@ JoystickState JoystickImpl::update()
// This method might not be very accurate (the "0 position" can be
// slightly shift with some device) but we don't care because most
// of devices are so sensitive that this is not relevant.
- double physicalMax = IOHIDElementGetPhysicalMax(it->second);
- double physicalMin = IOHIDElementGetPhysicalMin(it->second);
+ double physicalMax = static_cast<double>(IOHIDElementGetPhysicalMax(it->second));
+ double physicalMin = static_cast<double>(IOHIDElementGetPhysicalMin(it->second));
double scaledMin = -100;
double scaledMax = 100;
double physicalValue = IOHIDValueGetScaledValue(value, kIOHIDValueScaleTypePhysical);
- float scaledValue = (((physicalValue - physicalMin) * (scaledMax - scaledMin)) / (physicalMax - physicalMin)) + scaledMin;
+ float scaledValue = static_cast<float>((((physicalValue - physicalMin) * (scaledMax - scaledMin)) / (physicalMax - physicalMin)) + scaledMin);
state.axes[it->first] = scaledValue;
}
diff --git a/src/SFML/Window/OSX/JoystickImpl.hpp b/src/SFML/Window/OSX/JoystickImpl.hpp
index f4ad680..2830adb 100644
--- a/src/SFML/Window/OSX/JoystickImpl.hpp
+++ b/src/SFML/Window/OSX/JoystickImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/NSImage+raw.h b/src/SFML/Window/OSX/NSImage+raw.h
index 99e0484..2ba76f8 100644
--- a/src/SFML/Window/OSX/NSImage+raw.h
+++ b/src/SFML/Window/OSX/NSImage+raw.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/NSImage+raw.mm b/src/SFML/Window/OSX/NSImage+raw.mm
index 56ee6c9..f8b05a6 100644
--- a/src/SFML/Window/OSX/NSImage+raw.mm
+++ b/src/SFML/Window/OSX/NSImage+raw.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -35,8 +35,8 @@
// Create an empty image representation.
NSBitmapImageRep* bitmap =
[[NSBitmapImageRep alloc] initWithBitmapDataPlanes:0 // if 0: only allocate memory
- pixelsWide:size.width
- pixelsHigh:size.height
+ pixelsWide:(static_cast<NSInteger>(size.width))
+ pixelsHigh:(static_cast<NSInteger>(size.height))
bitsPerSample:8 // The number of bits used to specify
// one pixel in a single component of the data.
samplesPerPixel:4 // 3 if no alpha, 4 with it
diff --git a/src/SFML/Window/OSX/SFApplication.h b/src/SFML/Window/OSX/SFApplication.h
index 5f2071f..0b41702 100644
--- a/src/SFML/Window/OSX/SFApplication.h
+++ b/src/SFML/Window/OSX/SFApplication.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/SFApplication.m b/src/SFML/Window/OSX/SFApplication.m
index a922543..7698681 100644
--- a/src/SFML/Window/OSX/SFApplication.m
+++ b/src/SFML/Window/OSX/SFApplication.m
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -28,6 +28,14 @@
////////////////////////////////////////////////////////////
#import <SFML/Window/OSX/SFApplication.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
////////////////////////////////////////////////////////////
@implementation SFApplication
@@ -52,6 +60,8 @@
////////////////////////////////////////////////////////
+(void)setUpMenuBar
{
+ NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+
[SFApplication sharedApplication]; // Make sure NSApp exists
// Set the main menu bar
@@ -76,6 +86,8 @@
NSMenu* windowMenu = [[SFApplication newWindowMenu] autorelease];
[windowItem setSubmenu:windowMenu];
[NSApp setWindowsMenu:windowMenu];
+
+ [pool drain];
}
@@ -98,6 +110,8 @@
// --------------------
// Quit AppName Command+Q
+ NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+
NSString* appName = [SFApplication applicationName];
// APPLE MENU
@@ -154,6 +168,8 @@
action:@selector(terminate:)
keyEquivalent:@"q"];
+ [pool drain];
+
return appleMenu;
}
diff --git a/src/SFML/Window/OSX/SFApplicationDelegate.h b/src/SFML/Window/OSX/SFApplicationDelegate.h
index 542c0a1..73cd494 100644
--- a/src/SFML/Window/OSX/SFApplicationDelegate.h
+++ b/src/SFML/Window/OSX/SFApplicationDelegate.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/SFApplicationDelegate.m b/src/SFML/Window/OSX/SFApplicationDelegate.m
index d7e6050..36bd004 100644
--- a/src/SFML/Window/OSX/SFApplicationDelegate.m
+++ b/src/SFML/Window/OSX/SFApplicationDelegate.m
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -28,6 +28,14 @@
////////////////////////////////////////////////////////////
#import <SFML/Window/OSX/SFApplicationDelegate.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
////////////////////////////////////////////////////////////
@implementation SFApplicationDelegate
diff --git a/src/SFML/Window/OSX/SFContext.hpp b/src/SFML/Window/OSX/SFContext.hpp
index 5fa3b21..6845091 100644
--- a/src/SFML/Window/OSX/SFContext.hpp
+++ b/src/SFML/Window/OSX/SFContext.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/SFContext.mm b/src/SFML/Window/OSX/SFContext.mm
index cf74de9..4383799 100644
--- a/src/SFML/Window/OSX/SFContext.mm
+++ b/src/SFML/Window/OSX/SFContext.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -26,13 +26,20 @@
////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
+#include <SFML/Window/OSX/AutoreleasePoolWrapper.hpp>
#include <SFML/Window/OSX/SFContext.hpp>
#include <SFML/Window/OSX/WindowImplCocoa.hpp>
#include <SFML/System/Err.hpp>
#include <dlfcn.h>
#include <stdint.h>
-#import <SFML/Window/OSX/AutoreleasePoolWrapper.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
namespace sf
{
@@ -42,12 +49,11 @@ namespace priv
////////////////////////////////////////////////////////////
SFContext::SFContext(SFContext* shared) :
+m_context(0),
m_view(0),
m_window(0)
{
- // Ask for a pool.
- ensureThreadHasPool();
-
+ AutoreleasePool pool;
// Create the context
createContext(shared,
VideoMode::getDesktopMode().bitsPerPixel,
@@ -58,12 +64,11 @@ m_window(0)
////////////////////////////////////////////////////////////
SFContext::SFContext(SFContext* shared, const ContextSettings& settings,
const WindowImpl* owner, unsigned int bitsPerPixel) :
+m_context(0),
m_view(0),
m_window(0)
{
- // Ask for a pool.
- ensureThreadHasPool();
-
+ AutoreleasePool pool;
// Create the context.
createContext(shared, bitsPerPixel, settings);
@@ -76,15 +81,14 @@ m_window(0)
////////////////////////////////////////////////////////////
SFContext::SFContext(SFContext* shared, const ContextSettings& settings,
unsigned int width, unsigned int height) :
+m_context(0),
m_view(0),
m_window(0)
{
+ AutoreleasePool pool;
// Ensure the process is setup in order to create a valid window.
WindowImplCocoa::setUpProcess();
- // Ask for a pool.
- ensureThreadHasPool();
-
// Create the context.
createContext(shared, VideoMode::getDesktopMode().bitsPerPixel, settings);
@@ -103,6 +107,7 @@ m_window(0)
////////////////////////////////////////////////////////////
SFContext::~SFContext()
{
+ AutoreleasePool pool;
// Notify unshared OpenGL resources of context destruction
cleanupUnsharedResources();
@@ -121,6 +126,7 @@ SFContext::~SFContext()
////////////////////////////////////////////////////////////
GlFunctionPointer SFContext::getFunction(const char* name)
{
+ AutoreleasePool pool;
static void* image = NULL;
if (!image)
@@ -133,6 +139,7 @@ GlFunctionPointer SFContext::getFunction(const char* name)
////////////////////////////////////////////////////////////
bool SFContext::makeCurrent(bool current)
{
+ AutoreleasePool pool;
if (current)
{
[m_context makeCurrentContext];
@@ -149,6 +156,7 @@ bool SFContext::makeCurrent(bool current)
////////////////////////////////////////////////////////////
void SFContext::display()
{
+ AutoreleasePool pool;
[m_context flushBuffer];
}
@@ -156,6 +164,7 @@ void SFContext::display()
////////////////////////////////////////////////////////////
void SFContext::setVerticalSyncEnabled(bool enabled)
{
+ AutoreleasePool pool;
GLint swapInterval = enabled ? 1 : 0;
[m_context setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
@@ -167,6 +176,7 @@ void SFContext::createContext(SFContext* shared,
unsigned int bitsPerPixel,
const ContextSettings& settings)
{
+ AutoreleasePool pool;
// Save the settings. (OpenGL version is updated elsewhere.)
m_settings = settings;
@@ -182,14 +192,14 @@ void SFContext::createContext(SFContext* shared,
if (bitsPerPixel > 24)
{
attrs.push_back(NSOpenGLPFAAlphaSize);
- attrs.push_back((NSOpenGLPixelFormatAttribute)8);
+ attrs.push_back(static_cast<NSOpenGLPixelFormatAttribute>(8));
}
attrs.push_back(NSOpenGLPFADepthSize);
- attrs.push_back((NSOpenGLPixelFormatAttribute)m_settings.depthBits);
+ attrs.push_back(static_cast<NSOpenGLPixelFormatAttribute>(m_settings.depthBits));
attrs.push_back(NSOpenGLPFAStencilSize);
- attrs.push_back((NSOpenGLPixelFormatAttribute)m_settings.stencilBits);
+ attrs.push_back(static_cast<NSOpenGLPixelFormatAttribute>(m_settings.stencilBits));
if (m_settings.antialiasingLevel > 0)
{
@@ -209,11 +219,11 @@ void SFContext::createContext(SFContext* shared,
// Only one buffer is currently available
attrs.push_back(NSOpenGLPFASampleBuffers);
- attrs.push_back((NSOpenGLPixelFormatAttribute)1);
+ attrs.push_back(static_cast<NSOpenGLPixelFormatAttribute>(1));
// Antialiasing level
attrs.push_back(NSOpenGLPFASamples);
- attrs.push_back((NSOpenGLPixelFormatAttribute)m_settings.antialiasingLevel);
+ attrs.push_back(static_cast<NSOpenGLPixelFormatAttribute>(m_settings.antialiasingLevel));
// No software renderer - only hardware renderer
attrs.push_back(NSOpenGLPFAAccelerated);
@@ -230,7 +240,7 @@ void SFContext::createContext(SFContext* shared,
if (legacy)
{
- m_settings.attributeFlags &= ~ContextSettings::Core;
+ m_settings.attributeFlags &= ~static_cast<unsigned int>(ContextSettings::Core);
m_settings.majorVersion = 2;
m_settings.minorVersion = 1;
attrs.push_back(NSOpenGLPFAOpenGLProfile);
@@ -252,10 +262,10 @@ void SFContext::createContext(SFContext* shared,
if (m_settings.attributeFlags & ContextSettings::Debug)
{
sf::err() << "Warning. OpenGL debugging not supported on this platform." << std::endl;
- m_settings.attributeFlags &= ~ContextSettings::Debug;
+ m_settings.attributeFlags &= ~static_cast<unsigned int>(ContextSettings::Debug);
}
- attrs.push_back((NSOpenGLPixelFormatAttribute)0); // end of array
+ attrs.push_back(static_cast<NSOpenGLPixelFormatAttribute>(0)); // end of array
// All OS X pixel formats are sRGB capable
m_settings.sRgbCapable = true;
diff --git a/src/SFML/Window/OSX/SFKeyboardModifiersHelper.h b/src/SFML/Window/OSX/SFKeyboardModifiersHelper.h
index ee2ef66..bf6cb43 100644
--- a/src/SFML/Window/OSX/SFKeyboardModifiersHelper.h
+++ b/src/SFML/Window/OSX/SFKeyboardModifiersHelper.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -56,7 +56,8 @@ void initialiseKeyboardHelper(void);
/// \brief Set up a SFML key event based on the given modifiers flags and key code
///
////////////////////////////////////////////////////////////
-sf::Event::KeyEvent keyEventWithModifiers(NSUInteger modifiers, sf::Keyboard::Key key);
+sf::Event::KeyEvent keyEventWithModifiers(NSUInteger modifiers, sf::Keyboard::Key key,
+ sf::Keyboard::Scancode code);
////////////////////////////////////////////////////////////
diff --git a/src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm b/src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm
index 763f2ca..275873a 100644
--- a/src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm
+++ b/src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -30,6 +30,14 @@
#import <SFML/Window/OSX/SFKeyboardModifiersHelper.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
////////////////////////////////////////////////////////////
/// Here are define the mask value for the 'modifiers'
@@ -61,6 +69,7 @@ struct ModifiersState
BOOL leftAlternateWasDown;
BOOL leftControlWasDown;
BOOL rightControlWasDown;
+ BOOL capsLockWasOn;
};
@@ -92,6 +101,7 @@ BOOL isKeyMaskActive(NSUInteger modifiers, NSUInteger mask);
////////////////////////////////////////////////////////////
void processOneModifier(NSUInteger modifiers, NSUInteger mask,
BOOL& wasDown, sf::Keyboard::Key key,
+ sf::Keyboard::Scancode code,
sf::priv::WindowImplCocoa& requester);
@@ -105,6 +115,7 @@ void processLeftRightModifiers(NSUInteger modifiers,
NSUInteger leftMask, NSUInteger rightMask,
BOOL& leftWasDown, BOOL& rightWasDown,
sf::Keyboard::Key leftKey, sf::Keyboard::Key rightKey,
+ sf::Keyboard::Scancode leftCode, sf::Keyboard::Scancode rightCode,
sf::priv::WindowImplCocoa& requester);
@@ -130,20 +141,22 @@ void initialiseKeyboardHelper(void)
state.rightAlternateWasDown = isKeyMaskActive(modifiers, NSRightAlternateKeyMask);
state.leftControlWasDown = isKeyMaskActive(modifiers, NSLeftControlKeyMask);
state.rightControlWasDown = isKeyMaskActive(modifiers, NSRightControlKeyMask);
+ state.capsLockWasOn = isKeyMaskActive(modifiers, NSEventModifierFlagCapsLock);
isStateInitialized = YES;
}
////////////////////////////////////////////////////////
-sf::Event::KeyEvent keyEventWithModifiers(NSUInteger modifiers, sf::Keyboard::Key key)
+sf::Event::KeyEvent keyEventWithModifiers(NSUInteger modifiers, sf::Keyboard::Key key, sf::Keyboard::Scancode code)
{
sf::Event::KeyEvent event;
- event.code = key;
- event.alt = modifiers & NSAlternateKeyMask;
- event.control = modifiers & NSControlKeyMask;
- event.shift = modifiers & NSShiftKeyMask;
- event.system = modifiers & NSCommandKeyMask;
+ event.code = key;
+ event.scancode = code;
+ event.alt = modifiers & NSAlternateKeyMask;
+ event.control = modifiers & NSControlKeyMask;
+ event.shift = modifiers & NSShiftKeyMask;
+ event.system = modifiers & NSCommandKeyMask;
return event;
}
@@ -158,6 +171,7 @@ void handleModifiersChanged(NSUInteger modifiers, sf::priv::WindowImplCocoa& req
NSLeftShiftKeyMask, NSRightShiftKeyMask,
state.leftShiftWasDown, state.rightShiftWasDown,
sf::Keyboard::LShift, sf::Keyboard::RShift,
+ sf::Keyboard::Scan::LShift, sf::Keyboard::Scan::RShift,
requester
);
@@ -167,6 +181,7 @@ void handleModifiersChanged(NSUInteger modifiers, sf::priv::WindowImplCocoa& req
NSLeftCommandKeyMask, NSRightCommandKeyMask,
state.leftCommandWasDown, state.rightCommandWasDown,
sf::Keyboard::LSystem, sf::Keyboard::RSystem,
+ sf::Keyboard::Scan::LSystem, sf::Keyboard::Scan::RSystem,
requester
);
@@ -176,6 +191,7 @@ void handleModifiersChanged(NSUInteger modifiers, sf::priv::WindowImplCocoa& req
NSLeftAlternateKeyMask, NSRightAlternateKeyMask,
state.leftAlternateWasDown, state.rightAlternateWasDown,
sf::Keyboard::LAlt, sf::Keyboard::RAlt,
+ sf::Keyboard::Scan::LAlt, sf::Keyboard::Scan::RAlt,
requester
);
@@ -185,6 +201,17 @@ void handleModifiersChanged(NSUInteger modifiers, sf::priv::WindowImplCocoa& req
NSLeftControlKeyMask, NSRightControlKeyMask,
state.leftControlWasDown, state.rightControlWasDown,
sf::Keyboard::LControl, sf::Keyboard::RControl,
+ sf::Keyboard::Scan::LControl, sf::Keyboard::Scan::RControl,
+ requester
+ );
+
+ // Handle caps lock
+ processOneModifier(
+ modifiers,
+ NSEventModifierFlagCapsLock,
+ state.capsLockWasOn,
+ sf::Keyboard::Unknown,
+ sf::Keyboard::Scan::CapsLock,
requester
);
}
@@ -203,10 +230,11 @@ BOOL isKeyMaskActive(NSUInteger modifiers, NSUInteger mask)
////////////////////////////////////////////////////////
void processOneModifier(NSUInteger modifiers, NSUInteger mask,
BOOL& wasDown, sf::Keyboard::Key key,
+ sf::Keyboard::Scancode code,
sf::priv::WindowImplCocoa& requester)
{
// Setup a potential event key.
- sf::Event::KeyEvent event = keyEventWithModifiers(modifiers, key);
+ sf::Event::KeyEvent event = keyEventWithModifiers(modifiers, key, code);
// State
BOOL isDown = isKeyMaskActive(modifiers, mask);
@@ -231,10 +259,11 @@ void processLeftRightModifiers(NSUInteger modifiers,
NSUInteger leftMask, NSUInteger rightMask,
BOOL& leftWasDown, BOOL& rightWasDown,
sf::Keyboard::Key leftKey, sf::Keyboard::Key rightKey,
+ sf::Keyboard::Scancode leftCode, sf::Keyboard::Scancode rightCode,
sf::priv::WindowImplCocoa& requester)
{
- processOneModifier(modifiers, leftMask, leftWasDown, leftKey, requester);
- processOneModifier(modifiers, rightMask, rightWasDown, rightKey, requester);
+ processOneModifier(modifiers, leftMask, leftWasDown, leftKey, leftCode, requester);
+ processOneModifier(modifiers, rightMask, rightWasDown, rightKey, rightCode, requester);
}
diff --git a/src/SFML/Window/OSX/SFOpenGLView+keyboard.mm b/src/SFML/Window/OSX/SFOpenGLView+keyboard.mm
index 907de16..c9d27b2 100644
--- a/src/SFML/Window/OSX/SFOpenGLView+keyboard.mm
+++ b/src/SFML/Window/OSX/SFOpenGLView+keyboard.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -33,6 +33,14 @@
#import <SFML/Window/OSX/SFOpenGLView.h>
#import <SFML/Window/OSX/SFOpenGLView+keyboard_priv.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
////////////////////////////////////////////////////////////
/// In this file, we implement keyboard handling for SFOpenGLView
///
@@ -86,7 +94,7 @@
{
sf::Event::KeyEvent key = [SFOpenGLView convertNSKeyEventToSFMLEvent:theEvent];
- if (key.code != sf::Keyboard::Unknown) // The key is recognized.
+ if ((key.code != sf::Keyboard::Unknown) || (key.scancode != sf::Keyboard::Scan::Unknown))
m_requester->keyDown(key);
}
@@ -158,7 +166,7 @@
sf::Event::KeyEvent key = [SFOpenGLView convertNSKeyEventToSFMLEvent:theEvent];
- if (key.code != sf::Keyboard::Unknown) // The key is recognized.
+ if ((key.code != sf::Keyboard::Unknown) || (key.scancode != sf::Keyboard::Scan::Unknown))
m_requester->keyUp(key);
}
@@ -180,21 +188,13 @@
////////////////////////////////////////////////////////
+(sf::Event::KeyEvent)convertNSKeyEventToSFMLEvent:(NSEvent*)event
{
- // Key code
- sf::Keyboard::Key key = sf::Keyboard::Unknown;
-
- // First we look if the key down is from a list of characters
- // that depend on keyboard localization.
- NSString* string = [event charactersIgnoringModifiers];
- if ([string length] > 0)
- key = sf::priv::HIDInputManager::localizedKeys([string characterAtIndex:0]);
+ // The scancode always depends on the hardware keyboard, not some OS setting.
+ sf::Keyboard::Scancode code = sf::priv::HIDInputManager::nonLocalizedKey([event keyCode]);
- // If the key is not a localized one, we try to find a corresponding code
- // through virtual key code.
- if (key == sf::Keyboard::Unknown)
- key = sf::priv::HIDInputManager::nonLocalizedKeys([event keyCode]);
+ // Get the corresponding key under the current keyboard layout.
+ sf::Keyboard::Key key = sf::Keyboard::localize(code);
- return keyEventWithModifiers([event modifierFlags], key);
+ return keyEventWithModifiers([event modifierFlags], key, code);
}
diff --git a/src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h b/src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h
index 6003c00..ac55470 100644
--- a/src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h
+++ b/src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/SFOpenGLView+mouse.mm b/src/SFML/Window/OSX/SFOpenGLView+mouse.mm
index 4b23042..eb3f5ae 100644
--- a/src/SFML/Window/OSX/SFOpenGLView+mouse.mm
+++ b/src/SFML/Window/OSX/SFOpenGLView+mouse.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -32,6 +32,14 @@
#import <SFML/Window/OSX/SFOpenGLView.h>
#import <SFML/Window/OSX/SFOpenGLView+mouse_priv.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
////////////////////////////////////////////////////////////
/// In this file, we implement mouse handling for SFOpenGLView
@@ -136,7 +144,7 @@
NSPoint loc = [self cursorPositionFromEvent:theEvent];
if (button != sf::Mouse::ButtonCount)
- m_requester->mouseDownAt(button, loc.x, loc.y);
+ m_requester->mouseDownAt(button, static_cast<int>(loc.x), static_cast<int>(loc.y));
}
}
@@ -181,7 +189,7 @@
NSPoint loc = [self cursorPositionFromEvent:theEvent];
if (button != sf::Mouse::ButtonCount)
- m_requester->mouseUpAt(button, loc.x, loc.y);
+ m_requester->mouseUpAt(button, static_cast<int>(loc.x), static_cast<int>(loc.y));
}
}
@@ -242,7 +250,7 @@
// when the mouse is dragged. That would be too easy!)
[self updateMouseState];
if ((m_requester != 0) && m_mouseIsIn)
- m_requester->mouseMovedAt(loc.x, loc.y);
+ m_requester->mouseMovedAt(static_cast<int>(loc.x), static_cast<int>(loc.y));
}
@@ -290,7 +298,7 @@
{
NSScreen* screen = [[self window] screen];
NSNumber* displayId = [[screen deviceDescription] objectForKey:@"NSScreenNumber"];
- return [displayId intValue];
+ return static_cast<unsigned int>([displayId intValue]);
}
@@ -300,7 +308,7 @@
if (m_requester != 0)
{
NSPoint loc = [self cursorPositionFromEvent:theEvent];
- m_requester->mouseWheelScrolledAt([theEvent deltaX], [theEvent deltaY], loc.x, loc.y);
+ m_requester->mouseWheelScrolledAt(static_cast<float>([theEvent deltaX]), static_cast<float>([theEvent deltaY]), static_cast<int>(loc.x), static_cast<int>(loc.y));
}
// Transmit to non-SFML responder
@@ -396,7 +404,7 @@
NSPoint loc = [self convertPoint:rawPos fromView:nil];
// Don't forget to change to SFML coord system.
- float h = [self frame].size.height;
+ const double h = [self frame].size.height;
loc.y = h - loc.y;
return loc;
diff --git a/src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h b/src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h
index 6f509ad..58d4805 100644
--- a/src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h
+++ b/src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/SFOpenGLView.h b/src/SFML/Window/OSX/SFOpenGLView.h
index 7444ff7..5f6a233 100644
--- a/src/SFML/Window/OSX/SFOpenGLView.h
+++ b/src/SFML/Window/OSX/SFOpenGLView.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -28,6 +28,16 @@
////////////////////////////////////////////////////////////
#import <AppKit/AppKit.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
namespace sf {
namespace priv {
class WindowImplCocoa;
@@ -78,6 +88,7 @@ namespace sf {
BOOL m_cursorGrabbed; ///< Is the mouse cursor trapped?
CGFloat m_deltaXBuffer; ///< See note about cursor grabbing above
CGFloat m_deltaYBuffer; ///< See note about cursor grabbing above
+ BOOL m_highDpi; ///< Is high-DPI enabled?
// Hidden text view used to convert key event to actual chars.
// We use a silent responder to prevent sound alerts.
@@ -99,7 +110,7 @@ namespace sf {
/// \return an initialized view
///
////////////////////////////////////////////////////////////
--(id)initWithFrame:(NSRect)frameRect fullscreen:(BOOL)isFullscreen;
+-(id)initWithFrame:(NSRect)frameRect fullscreen:(BOOL)isFullscreen highDpi:(BOOL)isHighDpi;
////////////////////////////////////////////////////////////
/// \brief Finish the creation of the SFML OpenGL view
@@ -198,3 +209,11 @@ namespace sf {
-(void)updateCursorGrabbed;
@end
+
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic pop
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic pop
+ #endif
+#endif
diff --git a/src/SFML/Window/OSX/SFOpenGLView.mm b/src/SFML/Window/OSX/SFOpenGLView.mm
index e8fca84..a24eb8d 100644
--- a/src/SFML/Window/OSX/SFOpenGLView.mm
+++ b/src/SFML/Window/OSX/SFOpenGLView.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -33,6 +33,14 @@
#import <SFML/Window/OSX/SFOpenGLView+mouse_priv.h>
#import <SFML/Window/OSX/SFSilentResponder.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
////////////////////////////////////////////////////////////
/// SFOpenGLView class: Privates Methods Declaration
@@ -86,12 +94,18 @@
////////////////////////////////////////////////////////
-(id)initWithFrame:(NSRect)frameRect
{
- return [self initWithFrame:frameRect fullscreen:NO];
+ return [self initWithFrame:frameRect fullscreen:NO highDpi:NO];
}
////////////////////////////////////////////////////////
-(id)initWithFrame:(NSRect)frameRect fullscreen:(BOOL)isFullscreen
{
+ return [self initWithFrame:frameRect fullscreen:isFullscreen highDpi:NO];
+}
+
+////////////////////////////////////////////////////////
+-(id)initWithFrame:(NSRect)frameRect fullscreen:(BOOL)isFullscreen highDpi:(BOOL)isHighDpi
+{
if ((self = [super initWithFrame:frameRect]))
{
[self setRequesterTo:0];
@@ -118,8 +132,12 @@
m_hiddenTextView = [[NSTextView alloc] initWithFrame:NSZeroRect];
[m_hiddenTextView setNextResponder:m_silentResponder];
- // Request high resolution on high DPI displays
- [self setWantsBestResolutionOpenGLSurface:YES];
+ // If high DPI is requested, then use high resolution for the OpenGL view.
+ // Currently, isHighDpi is always expected to be NO, and so the OpenGL view will render scaled.
+ // Note: setWantsBestResolutionOpenGLSurface requires YES to work properly, rather than simply non-zero value.
+ // isHighDpi is an Objective-C BOOL, which can have non-zero values other than YES.
+ m_highDpi = isHighDpi ? YES : NO;
+ [self setWantsBestResolutionOpenGLSurface:m_highDpi];
// At that point, the view isn't attached to a window. We defer the rest of
// the initialization process to later.
@@ -204,7 +222,7 @@
point = [self convertPointToScreen:point];
// Flip screen coordinates to match CGDisplayMoveCursorToPoint referential.
- const float screenHeight = [[[self window] screen] frame].size.height;
+ const double screenHeight = [[[self window] screen] frame].size.height;
point.y = screenHeight - point.y;
return point;
@@ -224,12 +242,12 @@
NSWindow* window = [self window];
NSScreen* screen = window ? [window screen] : [NSScreen mainScreen];
CGFloat oldScaleFactor = m_scaleFactor;
- m_scaleFactor = [screen backingScaleFactor];
+ m_scaleFactor = m_highDpi ? [screen backingScaleFactor] : 1.0;
// Send a resize event if the scaling factor changed
if ((m_scaleFactor != oldScaleFactor) && (m_requester != 0)) {
NSSize newSize = [self frame].size;
- m_requester->windowResized(newSize.width, newSize.height);
+ m_requester->windowResized(static_cast<unsigned int>(newSize.width), static_cast<unsigned int>(newSize.height));
}
}
@@ -261,7 +279,7 @@
// The new size
NSSize newSize = [self frame].size;
- m_requester->windowResized(newSize.width, newSize.height);
+ m_requester->windowResized(static_cast<unsigned int>(newSize.width), static_cast<unsigned int>(newSize.height));
}
////////////////////////////////////////////////////////
diff --git a/src/SFML/Window/OSX/SFSilentResponder.h b/src/SFML/Window/OSX/SFSilentResponder.h
index a9f9b7c..5447581 100644
--- a/src/SFML/Window/OSX/SFSilentResponder.h
+++ b/src/SFML/Window/OSX/SFSilentResponder.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/SFSilentResponder.m b/src/SFML/Window/OSX/SFSilentResponder.m
index feb5783..4cd8da6 100644
--- a/src/SFML/Window/OSX/SFSilentResponder.m
+++ b/src/SFML/Window/OSX/SFSilentResponder.m
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/SFViewController.h b/src/SFML/Window/OSX/SFViewController.h
index 69dc7a3..0b4bf7e 100644
--- a/src/SFML/Window/OSX/SFViewController.h
+++ b/src/SFML/Window/OSX/SFViewController.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/SFViewController.mm b/src/SFML/Window/OSX/SFViewController.mm
index c92283b..a1d3ab5 100644
--- a/src/SFML/Window/OSX/SFViewController.mm
+++ b/src/SFML/Window/OSX/SFViewController.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -33,6 +33,14 @@
#import <SFML/Window/OSX/SFOpenGLView.h>
#import <SFML/Window/OSX/SFViewController.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
@implementation SFViewController
@@ -197,7 +205,7 @@
////////////////////////////////////////////////////////
-(void)closeWindow
{
- sf::err() << "Cannot close SFML area when SFML is integrated in a NSView." << std::endl;
+ // If the "window" is really a view, this is a no-op.
}
diff --git a/src/SFML/Window/OSX/SFWindow.h b/src/SFML/Window/OSX/SFWindow.h
index 1d35245..fead267 100644
--- a/src/SFML/Window/OSX/SFWindow.h
+++ b/src/SFML/Window/OSX/SFWindow.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -58,6 +58,18 @@
-(BOOL)canBecomeKeyWindow;
////////////////////////////////////////////////////////////
+/// \brief Allow fullscreen windows to become the main window
+///
+/// By default, fullscreen windows (using NSBorderlessWindowMask)
+/// cannot become the main window, so this method is changed to
+/// always return YES.
+///
+/// \return YES
+///
+////////////////////////////////////////////////////////////
+-(BOOL)canBecomeMainWindow;
+
+////////////////////////////////////////////////////////////
/// \brief Prevent system alert
///
/// \param theEvent a Cocoa event
diff --git a/src/SFML/Window/OSX/SFWindow.m b/src/SFML/Window/OSX/SFWindow.m
index 087f990..29df9ea 100644
--- a/src/SFML/Window/OSX/SFWindow.m
+++ b/src/SFML/Window/OSX/SFWindow.m
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -46,6 +46,13 @@
////////////////////////////////////////////////////////
+-(BOOL)canBecomeMainWindow
+{
+ return YES;
+}
+
+
+////////////////////////////////////////////////////////
-(void)keyDown:(NSEvent*)theEvent
{
// Do nothing except preventing a system alert each time a key is pressed
diff --git a/src/SFML/Window/OSX/SFWindowController.h b/src/SFML/Window/OSX/SFWindowController.h
index df0585b..2a17f0a 100644
--- a/src/SFML/Window/OSX/SFWindowController.h
+++ b/src/SFML/Window/OSX/SFWindowController.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -62,6 +62,7 @@ namespace sf {
sf::priv::WindowImplCocoa* m_requester; ///< Requester
BOOL m_fullscreen; ///< Indicate whether the window is fullscreen or not
BOOL m_restoreResize; ///< See note above
+ BOOL m_highDpi; ///< Support high-DPI rendering or not
}
////////////////////////////////////////////////////////////
diff --git a/src/SFML/Window/OSX/SFWindowController.mm b/src/SFML/Window/OSX/SFWindowController.mm
index 186a0fb..f6cb3e9 100644
--- a/src/SFML/Window/OSX/SFWindowController.mm
+++ b/src/SFML/Window/OSX/SFWindowController.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -42,6 +42,14 @@
#import <SFML/Window/OSX/SFWindowController.h>
#import <OpenGL/OpenGL.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
////////////////////////////////////////////////////////////
/// SFBlackView is a simple view filled with black, nothing more
///
@@ -99,6 +107,7 @@
m_requester = 0;
m_fullscreen = NO; // assuming this is the case... too hard to handle anyway.
m_restoreResize = NO;
+ m_highDpi = NO;
// Retain the window for our own use.
m_window = [window retain];
@@ -111,7 +120,8 @@
// Create the view.
m_oglView = [[SFOpenGLView alloc] initWithFrame:[[m_window contentView] frame]
- fullscreen:NO];
+ fullscreen:NO
+ highDpi:NO];
if (m_oglView == nil)
{
@@ -123,6 +133,8 @@
// Set the view to the window as its content view.
[m_window setContentView:m_oglView];
+
+ [m_oglView finishInit];
}
return self;
@@ -149,8 +161,9 @@
m_window = nil;
m_oglView = nil;
m_requester = 0;
- m_fullscreen = (style & sf::Style::Fullscreen);
+ m_fullscreen = ((style & sf::Style::Fullscreen) != 0) ? YES : NO;
m_restoreResize = NO;
+ m_highDpi = NO;
if (m_fullscreen)
[self setupFullscreenViewWithMode:mode];
@@ -216,7 +229,8 @@
NSRect oglRect = NSMakeRect(x, y, width, height);
m_oglView = [[SFOpenGLView alloc] initWithFrame:oglRect
- fullscreen:YES];
+ fullscreen:YES
+ highDpi:m_highDpi];
if (m_oglView == nil)
{
@@ -275,7 +289,8 @@
// Create the view.
m_oglView = [[SFOpenGLView alloc] initWithFrame:[[m_window contentView] frame]
- fullscreen:NO];
+ fullscreen:NO
+ highDpi:m_highDpi];
if (m_oglView == nil)
{
@@ -352,7 +367,7 @@
-(void)setCursorGrabbed:(BOOL)grabbed
{
// Remove or restore resizeable style if needed
- BOOL resizeable = [m_window styleMask] & NSResizableWindowMask;
+ BOOL resizeable = (([m_window styleMask] & NSResizableWindowMask) != 0) ? YES : NO;
if (grabbed && resizeable)
{
m_restoreResize = YES;
@@ -396,7 +411,7 @@
CGFloat y = screen.origin.y + [m_oglView frame].size.height;
// Flip y-axis (titlebar was already taken into account above)
- y = [self screenHeight] - y;
+ y = static_cast<double>([self screenHeight]) - y;
return NSMakePoint(x, y);
}
@@ -408,7 +423,7 @@
NSPoint point = NSMakePoint(x, y);
// Flip for SFML window coordinate system and take titlebar into account
- point.y = [self screenHeight] - point.y + [self titlebarHeight];
+ point.y = static_cast<double>([self screenHeight]) - point.y + static_cast<double>([self titlebarHeight]);
// Place the window.
[m_window setFrameTopLeftPoint:point];
@@ -454,7 +469,7 @@
[m_window setStyleMask:styleMask ^ NSResizableWindowMask];
// Add titlebar height.
- height += [self titlebarHeight];
+ height += static_cast<unsigned int>([self titlebarHeight]);
// Corner case: don't set the window height bigger than the screen height
// or the view will be resized _later_ without generating a resize event.
@@ -462,11 +477,16 @@
CGFloat maxVisibleHeight = screenFrame.size.height;
if (height > maxVisibleHeight)
{
- height = maxVisibleHeight;
+ height = static_cast<unsigned int>(maxVisibleHeight);
// The size is not the requested one, we fire an event
if (m_requester != 0)
- m_requester->windowResized(width, height - [self titlebarHeight]);
+ m_requester->windowResized(width, height - static_cast<unsigned int>([self titlebarHeight]));
+ }
+ else if (width != [self size].width || height != [self size].height + static_cast<CGFloat>([self titlebarHeight]))
+ {
+ if (m_requester != 0)
+ m_requester->windowResized(width, height - static_cast<unsigned int>([self titlebarHeight]));
}
NSRect frame = NSMakeRect([m_window frame].origin.x,
@@ -510,6 +530,7 @@
[m_window close];
[m_window setDelegate:nil];
[self setRequesterTo:0];
+ [SFApplication processEvent];
}
@@ -613,16 +634,15 @@
{
NSDictionary* deviceDescription = [[m_window screen] deviceDescription];
NSNumber* screenNumber = [deviceDescription valueForKey:@"NSScreenNumber"];
- CGDirectDisplayID screenID = (CGDirectDisplayID)[screenNumber intValue];
- CGFloat height = CGDisplayPixelsHigh(screenID);
- return height;
+ CGDirectDisplayID screenID = static_cast<CGDirectDisplayID>([screenNumber intValue]);
+ return static_cast<float>(CGDisplayPixelsHigh(screenID));
}
////////////////////////////////////////////////////////
-(float)titlebarHeight
{
- return NSHeight([m_window frame]) - NSHeight([[m_window contentView] frame]);
+ return static_cast<float>(NSHeight([m_window frame]) - NSHeight([[m_window contentView] frame]));
}
@end
diff --git a/src/SFML/Window/OSX/Scaling.h b/src/SFML/Window/OSX/Scaling.h
index 62f13ae..d4b52c8 100644
--- a/src/SFML/Window/OSX/Scaling.h
+++ b/src/SFML/Window/OSX/Scaling.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -54,7 +54,7 @@ inline CGFloat getDefaultScaleFactor()
template <class T>
void scaleIn(T& in, id<WindowImplDelegateProtocol> delegate)
{
- in /= delegate ? [delegate displayScaleFactor] : getDefaultScaleFactor();
+ in /= static_cast<T>(delegate ? [delegate displayScaleFactor] : getDefaultScaleFactor());
}
template <class T>
@@ -81,7 +81,7 @@ void scaleInXY(T& in, id<WindowImplDelegateProtocol> delegate)
template <class T>
void scaleOut(T& out, id<WindowImplDelegateProtocol> delegate)
{
- out *= delegate ? [delegate displayScaleFactor] : getDefaultScaleFactor();
+ out = out * static_cast<T>(delegate ? [delegate displayScaleFactor] : getDefaultScaleFactor());
}
template <class T>
diff --git a/src/SFML/Window/OSX/SensorImpl.cpp b/src/SFML/Window/OSX/SensorImpl.cpp
index 3496265..7f53f8d 100644
--- a/src/SFML/Window/OSX/SensorImpl.cpp
+++ b/src/SFML/Window/OSX/SensorImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/OSX/SensorImpl.hpp b/src/SFML/Window/OSX/SensorImpl.hpp
index fe81b8d..7a9f3ab 100644
--- a/src/SFML/Window/OSX/SensorImpl.hpp
+++ b/src/SFML/Window/OSX/SensorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/OSX/VideoModeImpl.cpp b/src/SFML/Window/OSX/VideoModeImpl.cpp
index efd5e46..581aba5 100644
--- a/src/SFML/Window/OSX/VideoModeImpl.cpp
+++ b/src/SFML/Window/OSX/VideoModeImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -56,7 +56,7 @@ std::vector<VideoMode> VideoModeImpl::getFullscreenModes()
const CFIndex modesCount = CFArrayGetCount(cgmodes);
for (CFIndex i = 0; i < modesCount; i++)
{
- CGDisplayModeRef cgmode = (CGDisplayModeRef)CFArrayGetValueAtIndex(cgmodes, i);
+ CGDisplayModeRef cgmode = static_cast<CGDisplayModeRef>(const_cast<void*>(CFArrayGetValueAtIndex(cgmodes, i)));
VideoMode mode = convertCGModeToSFMode(cgmode);
diff --git a/src/SFML/Window/OSX/WindowImplCocoa.hpp b/src/SFML/Window/OSX/WindowImplCocoa.hpp
index eea318d..8fb772d 100644
--- a/src/SFML/Window/OSX/WindowImplCocoa.hpp
+++ b/src/SFML/Window/OSX/WindowImplCocoa.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -33,6 +33,16 @@
#include <SFML/Window/WindowImpl.hpp>
#include <SFML/System/String.hpp>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
////////////////////////////////////////////////////////////
/// Predefine OBJ-C classes
////////////////////////////////////////////////////////////
@@ -373,5 +383,12 @@ private:
} // namespace sf
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic pop
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic pop
+ #endif
+#endif
#endif // SFML_WINDOWIMPLCOCOA_HPP
diff --git a/src/SFML/Window/OSX/WindowImplCocoa.mm b/src/SFML/Window/OSX/WindowImplCocoa.mm
index edb6935..57f6635 100644
--- a/src/SFML/Window/OSX/WindowImplCocoa.mm
+++ b/src/SFML/Window/OSX/WindowImplCocoa.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -26,10 +26,10 @@
////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
+#include <SFML/Window/OSX/AutoreleasePoolWrapper.hpp>
#include <SFML/Window/OSX/WindowImplCocoa.hpp>
#include <SFML/System/Err.hpp>
-#import <SFML/Window/OSX/AutoreleasePoolWrapper.h>
#import <SFML/Window/OSX/cpp_objc_conversion.h>
#import <SFML/Window/OSX/Scaling.h>
#import <SFML/Window/OSX/SFApplication.h>
@@ -59,6 +59,7 @@ namespace
////////////////////////////////////////////////////////
void hideMouseCursor()
{
+ AutoreleasePool pool;
if (!isCursorHidden)
{
[NSCursor hide];
@@ -70,6 +71,7 @@ void hideMouseCursor()
////////////////////////////////////////////////////////
void showMouseCursor()
{
+ AutoreleasePool pool;
if (isCursorHidden)
{
[NSCursor unhide];
@@ -84,11 +86,9 @@ void showMouseCursor()
WindowImplCocoa::WindowImplCocoa(WindowHandle handle) :
m_showCursor(true)
{
- // Ask for a pool.
- ensureThreadHasPool();
-
+ AutoreleasePool pool;
// Treat the handle as it real type
- id nsHandle = (id)handle;
+ id nsHandle = static_cast<id>(handle);
if ([nsHandle isKindOfClass:[NSWindow class]])
{
// We have a window.
@@ -126,15 +126,10 @@ WindowImplCocoa::WindowImplCocoa(VideoMode mode,
const ContextSettings& /*settings*/) :
m_showCursor(true)
{
+ AutoreleasePool pool;
// Transform the app process.
setUpProcess();
- // Ask for a pool.
- ensureThreadHasPool();
-
- // Use backing size
- scaleInWidthHeight(mode, nil);
-
m_delegate = [[SFWindowController alloc] initWithMode:mode andStyle:style];
[m_delegate changeTitle:sfStringToNSString(title)];
[m_delegate setRequesterTo:this];
@@ -147,24 +142,29 @@ m_showCursor(true)
////////////////////////////////////////////////////////////
WindowImplCocoa::~WindowImplCocoa()
{
+ AutoreleasePool pool;
[m_delegate closeWindow];
-
+ // Tell the window/view controller (and the OpenGL view) that the delegate
+ // (this object) no longer exists to prevent events being sent to the window
+ // after it has been deleted.
+ [m_delegate setRequesterTo:0];
[m_delegate release];
// Put the next window in front, if any.
NSArray* windows = [NSApp orderedWindows];
if ([windows count] > 0)
- [[windows objectAtIndex:0] makeKeyAndOrderFront:nil];
-
- drainThreadPool(); // Make sure everything was freed
- // This solve some issue when sf::Window::Create is called for the
- // second time (nothing was render until the function was called again)
+ {
+ NSWindow *nextWindow = [windows objectAtIndex:0];
+ if ([nextWindow isVisible])
+ [nextWindow makeKeyAndOrderFront:nil];
+ }
}
////////////////////////////////////////////////////////////
void WindowImplCocoa::applyContext(NSOpenGLContextRef context) const
{
+ AutoreleasePool pool;
[m_delegate applyContext:context];
}
@@ -172,6 +172,7 @@ void WindowImplCocoa::applyContext(NSOpenGLContextRef context) const
////////////////////////////////////////////////////////////
void WindowImplCocoa::setUpProcess(void)
{
+ AutoreleasePool pool;
static bool isTheProcessSetAsApplication = false;
if (!isTheProcessSetAsApplication)
@@ -303,7 +304,7 @@ void WindowImplCocoa::mouseWheelScrolledAt(float deltaX, float deltaY, int x, in
Event event;
event.type = Event::MouseWheelMoved;
- event.mouseWheel.delta = deltaY;
+ event.mouseWheel.delta = static_cast<int>(deltaY);
event.mouseWheel.x = x;
event.mouseWheel.y = y;
scaleOutXY(event.mouseWheel, m_delegate);
@@ -394,8 +395,8 @@ void WindowImplCocoa::textEntered(unichar charcode)
////////////////////////////////////////////////////////////
void WindowImplCocoa::processEvents()
{
+ AutoreleasePool pool;
[m_delegate processEvent];
- drainThreadPool(); // Reduce memory footprint
}
#pragma mark
@@ -404,6 +405,7 @@ void WindowImplCocoa::processEvents()
////////////////////////////////////////////////////////////
WindowHandle WindowImplCocoa::getSystemHandle() const
{
+ AutoreleasePool pool;
return [m_delegate getSystemHandle];
}
@@ -411,8 +413,9 @@ WindowHandle WindowImplCocoa::getSystemHandle() const
////////////////////////////////////////////////////////////
Vector2i WindowImplCocoa::getPosition() const
{
+ AutoreleasePool pool;
NSPoint pos = [m_delegate position];
- sf::Vector2i ret(pos.x, pos.y);
+ sf::Vector2i ret(static_cast<int>(pos.x), static_cast<int>(pos.y));
scaleOutXY(ret, m_delegate);
return ret;
}
@@ -421,6 +424,7 @@ Vector2i WindowImplCocoa::getPosition() const
////////////////////////////////////////////////////////////
void WindowImplCocoa::setPosition(const Vector2i& position)
{
+ AutoreleasePool pool;
sf::Vector2i backingPosition = position;
scaleInXY(backingPosition, m_delegate);
[m_delegate setWindowPositionToX:backingPosition.x Y:backingPosition.y];
@@ -430,8 +434,9 @@ void WindowImplCocoa::setPosition(const Vector2i& position)
////////////////////////////////////////////////////////////
Vector2u WindowImplCocoa::getSize() const
{
+ AutoreleasePool pool;
NSSize size = [m_delegate size];
- Vector2u ret(size.width, size.height);
+ Vector2u ret(static_cast<unsigned int>(size.width), static_cast<unsigned int>(size.height));
scaleOutXY(ret, m_delegate);
return ret;
}
@@ -449,6 +454,7 @@ void WindowImplCocoa::setSize(const Vector2u& size)
////////////////////////////////////////////////////////////
void WindowImplCocoa::setTitle(const String& title)
{
+ AutoreleasePool pool;
[m_delegate changeTitle:sfStringToNSString(title)];
}
@@ -456,6 +462,7 @@ void WindowImplCocoa::setTitle(const String& title)
////////////////////////////////////////////////////////////
void WindowImplCocoa::setIcon(unsigned int width, unsigned int height, const Uint8* pixels)
{
+ AutoreleasePool pool;
[m_delegate setIconTo:width by:height with:pixels];
}
@@ -463,6 +470,7 @@ void WindowImplCocoa::setIcon(unsigned int width, unsigned int height, const Uin
////////////////////////////////////////////////////////////
void WindowImplCocoa::setVisible(bool visible)
{
+ AutoreleasePool pool;
if (visible)
[m_delegate showWindow];
else
@@ -473,6 +481,7 @@ void WindowImplCocoa::setVisible(bool visible)
////////////////////////////////////////////////////////////
void WindowImplCocoa::setMouseCursorVisible(bool visible)
{
+ AutoreleasePool pool;
m_showCursor = visible;
// If the mouse is over the window, we apply the new setting
@@ -489,6 +498,7 @@ void WindowImplCocoa::setMouseCursorVisible(bool visible)
////////////////////////////////////////////////////////////
void WindowImplCocoa::setMouseCursorGrabbed(bool grabbed)
{
+ AutoreleasePool pool;
[m_delegate setCursorGrabbed:grabbed];
}
@@ -496,6 +506,7 @@ void WindowImplCocoa::setMouseCursorGrabbed(bool grabbed)
////////////////////////////////////////////////////////////
void WindowImplCocoa::setMouseCursor(const CursorImpl& cursor)
{
+ AutoreleasePool pool;
[m_delegate setCursor:cursor.m_cursor];
}
@@ -503,6 +514,7 @@ void WindowImplCocoa::setMouseCursor(const CursorImpl& cursor)
////////////////////////////////////////////////////////////
void WindowImplCocoa::setKeyRepeatEnabled(bool enabled)
{
+ AutoreleasePool pool;
if (enabled)
[m_delegate enableKeyRepeat];
else
@@ -513,6 +525,7 @@ void WindowImplCocoa::setKeyRepeatEnabled(bool enabled)
////////////////////////////////////////////////////////////
void WindowImplCocoa::requestFocus()
{
+ AutoreleasePool pool;
[m_delegate requestFocus];
}
@@ -520,6 +533,7 @@ void WindowImplCocoa::requestFocus()
////////////////////////////////////////////////////////////
bool WindowImplCocoa::hasFocus() const
{
+ AutoreleasePool pool;
return [m_delegate hasFocus];
}
@@ -527,4 +541,3 @@ bool WindowImplCocoa::hasFocus() const
} // namespace priv
} // namespace sf
-
diff --git a/src/SFML/Window/OSX/WindowImplDelegateProtocol.h b/src/SFML/Window/OSX/WindowImplDelegateProtocol.h
index d6cfa90..dd9cc28 100644
--- a/src/SFML/Window/OSX/WindowImplDelegateProtocol.h
+++ b/src/SFML/Window/OSX/WindowImplDelegateProtocol.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -31,6 +31,16 @@
#import <AppKit/AppKit.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
namespace sf {
namespace priv {
class WindowImplCocoa;
@@ -232,3 +242,11 @@ namespace sf {
-(void)applyContext:(NSOpenGLContext*)context;
@end
+
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic pop
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic pop
+ #endif
+#endif
diff --git a/src/SFML/Window/OSX/cg_sf_conversion.hpp b/src/SFML/Window/OSX/cg_sf_conversion.hpp
index c928dd9..fc12ff0 100644
--- a/src/SFML/Window/OSX/cg_sf_conversion.hpp
+++ b/src/SFML/Window/OSX/cg_sf_conversion.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/cg_sf_conversion.mm b/src/SFML/Window/OSX/cg_sf_conversion.mm
index 5d9a53f..9d77a00 100644
--- a/src/SFML/Window/OSX/cg_sf_conversion.mm
+++ b/src/SFML/Window/OSX/cg_sf_conversion.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -31,6 +31,14 @@
#import <SFML/Window/OSX/Scaling.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
namespace sf
{
namespace priv
@@ -87,7 +95,7 @@ VideoMode convertCGModeToSFMode(CGDisplayModeRef cgmode)
//
// [1]: "APIs for Supporting High Resolution" > "Additions and Changes for OS X v10.8"
// https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/APIs/APIs.html#//apple_ref/doc/uid/TP40012302-CH5-SW27
- VideoMode mode(CGDisplayModeGetWidth(cgmode), CGDisplayModeGetHeight(cgmode), modeBitsPerPixel(cgmode));
+ VideoMode mode(static_cast<unsigned int>(CGDisplayModeGetWidth(cgmode)), static_cast<unsigned int>(CGDisplayModeGetHeight(cgmode)), static_cast<unsigned int>(modeBitsPerPixel(cgmode)));
scaleOutWidthHeight(mode, nil);
return mode;
}
diff --git a/src/SFML/Window/OSX/cpp_objc_conversion.h b/src/SFML/Window/OSX/cpp_objc_conversion.h
index db0d572..feaecd9 100644
--- a/src/SFML/Window/OSX/cpp_objc_conversion.h
+++ b/src/SFML/Window/OSX/cpp_objc_conversion.h
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
diff --git a/src/SFML/Window/OSX/cpp_objc_conversion.mm b/src/SFML/Window/OSX/cpp_objc_conversion.mm
index 0ac4b50..0512a01 100644
--- a/src/SFML/Window/OSX/cpp_objc_conversion.mm
+++ b/src/SFML/Window/OSX/cpp_objc_conversion.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com),
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
// Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
@@ -44,7 +44,7 @@ NSString* stringToNSString(const std::string& string)
////////////////////////////////////////////////////////////
NSString* sfStringToNSString(const sf::String& string)
{
- sf::Uint32 length = string.getSize() * sizeof(sf::Uint32);
+ sf::Uint32 length = static_cast<sf::Uint32>(string.getSize() * sizeof(sf::Uint32));
const void* data = reinterpret_cast<const void*>(string.getData());
NSStringEncoding encoding;
diff --git a/src/SFML/Window/Sensor.cpp b/src/SFML/Window/Sensor.cpp
index ae37412..17ef9c5 100644
--- a/src/SFML/Window/Sensor.cpp
+++ b/src/SFML/Window/Sensor.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/SensorImpl.hpp b/src/SFML/Window/SensorImpl.hpp
index a543472..095f825 100644
--- a/src/SFML/Window/SensorImpl.hpp
+++ b/src/SFML/Window/SensorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -35,7 +35,7 @@
#include <SFML/Window/Win32/SensorImpl.hpp>
-#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD)
+#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD)
#include <SFML/Window/Unix/SensorImpl.hpp>
diff --git a/src/SFML/Window/SensorManager.cpp b/src/SFML/Window/SensorManager.cpp
index 82665e3..1850321 100644
--- a/src/SFML/Window/SensorManager.cpp
+++ b/src/SFML/Window/SensorManager.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/SensorManager.hpp b/src/SFML/Window/SensorManager.hpp
index 2285ad3..d54e81f 100644
--- a/src/SFML/Window/SensorManager.hpp
+++ b/src/SFML/Window/SensorManager.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -118,16 +118,16 @@ private:
////////////////////////////////////////////////////////////
struct Item
{
- bool available; ///< Is the sensor available on this device?
- bool enabled; ///< Current enable state of the sensor
- SensorImpl sensor; ///< Sensor implementation
- Vector3f value; ///< The current sensor value
+ bool available; //!< Is the sensor available on this device?
+ bool enabled; //!< Current enable state of the sensor
+ SensorImpl sensor; //!< Sensor implementation
+ Vector3f value; //!< The current sensor value
};
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- Item m_sensors[Sensor::Count]; ///< Sensors information and state
+ Item m_sensors[Sensor::Count]; //!< Sensors information and state
};
} // namespace priv
diff --git a/src/SFML/Window/Touch.cpp b/src/SFML/Window/Touch.cpp
index aa63c72..4417d8a 100644
--- a/src/SFML/Window/Touch.cpp
+++ b/src/SFML/Window/Touch.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -46,7 +46,7 @@ Vector2i Touch::getPosition(unsigned int finger)
////////////////////////////////////////////////////////////
-Vector2i Touch::getPosition(unsigned int finger, const Window& relativeTo)
+Vector2i Touch::getPosition(unsigned int finger, const WindowBase& relativeTo)
{
return priv::InputImpl::getTouchPosition(finger, relativeTo);
}
diff --git a/src/SFML/Window/Unix/ClipboardImpl.cpp b/src/SFML/Window/Unix/ClipboardImpl.cpp
index df2fd95..ec222cd 100644
--- a/src/SFML/Window/Unix/ClipboardImpl.cpp
+++ b/src/SFML/Window/Unix/ClipboardImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -209,7 +209,7 @@ void ClipboardImpl::processEvent(XEvent& windowEvent)
// Notification that the current selection owner
// has responded to our request
- XSelectionEvent& selectionEvent = *reinterpret_cast<XSelectionEvent*>(&windowEvent.xselection);
+ XSelectionEvent& selectionEvent = windowEvent.xselection;
m_clipboardContents.clear();
@@ -274,7 +274,7 @@ void ClipboardImpl::processEvent(XEvent& windowEvent)
case SelectionRequest:
{
// Respond to a request for our clipboard contents
- XSelectionRequestEvent& selectionRequestEvent = *reinterpret_cast<XSelectionRequestEvent*>(&windowEvent.xselectionrequest);
+ XSelectionRequestEvent& selectionRequestEvent = windowEvent.xselectionrequest;
// Our reply
XSelectionEvent selectionEvent;
@@ -307,7 +307,7 @@ void ClipboardImpl::processEvent(XEvent& windowEvent)
32,
PropModeReplace,
reinterpret_cast<unsigned char*>(&targets[0]),
- targets.size()
+ static_cast<int>(targets.size())
);
// Notify the requestor that they can read the targets from their window property
@@ -330,7 +330,7 @@ void ClipboardImpl::processEvent(XEvent& windowEvent)
8,
PropModeReplace,
reinterpret_cast<const unsigned char*>(data.c_str()),
- data.size()
+ static_cast<int>(data.size())
);
// Notify the requestor that they can read the data from their window property
@@ -353,8 +353,8 @@ void ClipboardImpl::processEvent(XEvent& windowEvent)
m_utf8String,
8,
PropModeReplace,
- reinterpret_cast<const unsigned char*>(data.c_str()),
- data.size()
+ data.c_str(),
+ static_cast<int>(data.size())
);
// Notify the requestor that they can read the data from their window property
diff --git a/src/SFML/Window/Unix/ClipboardImpl.hpp b/src/SFML/Window/Unix/ClipboardImpl.hpp
index 48ec787..2f836d8 100644
--- a/src/SFML/Window/Unix/ClipboardImpl.hpp
+++ b/src/SFML/Window/Unix/ClipboardImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Unix/CursorImpl.cpp b/src/SFML/Window/Unix/CursorImpl.cpp
index 011a2b1..7c87e1c 100644
--- a/src/SFML/Window/Unix/CursorImpl.cpp
+++ b/src/SFML/Window/Unix/CursorImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,6 +29,7 @@
#include <SFML/Window/Unix/Display.hpp>
#include <X11/cursorfont.h>
#include <X11/Xutil.h>
+#include <X11/Xcursor/Xcursor.h>
#include <cassert>
#include <cstdlib>
#include <vector>
@@ -61,41 +62,87 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot
{
release();
+ if (isColorCursorSupported())
+ return loadFromPixelsARGB(pixels, size, hotspot);
+ else
+ return loadFromPixelsMonochrome(pixels, size, hotspot);
+}
+
+
+////////////////////////////////////////////////////////////
+bool CursorImpl::loadFromPixelsARGB(const Uint8* pixels, Vector2u size, Vector2u hotspot)
+{
+ // Create cursor image, convert from RGBA to ARGB.
+ XcursorImage* cursorImage = XcursorImageCreate(static_cast<int>(size.x), static_cast<int>(size.y));
+ cursorImage->xhot = hotspot.x;
+ cursorImage->yhot = hotspot.y;
+
+ const std::size_t numPixels = size.x * size.y;
+ for (std::size_t pixelIndex = 0; pixelIndex < numPixels; ++pixelIndex)
+ {
+ cursorImage->pixels[pixelIndex] = static_cast<Uint32>(pixels[pixelIndex * 4 + 2] +
+ (pixels[pixelIndex * 4 + 1] << 8) +
+ (pixels[pixelIndex * 4 + 0] << 16) +
+ (pixels[pixelIndex * 4 + 3] << 24));
+ }
+
+ // Create the cursor.
+ m_cursor = XcursorImageLoadCursor(m_display, cursorImage);
+
+ // Free the resources
+ XcursorImageDestroy(cursorImage);
+
+ // We assume everything went fine...
+ return true;
+}
+
+
+////////////////////////////////////////////////////////////
+bool CursorImpl::loadFromPixelsMonochrome(const Uint8* pixels, Vector2u size, Vector2u hotspot)
+{
// Convert the image into a bitmap (monochrome!).
- std::size_t bytes = (size.x + 7) / 8 * size.y;
- std::vector<Uint8> mask(bytes, 0); // Defines which pixel is transparent.
- std::vector<Uint8> data(bytes, 1); // Defines which pixel is white/black.
+ // The bit data is stored packed into bytes. If the number of pixels on each row of the image
+ // does not fit exactly into (width/8) bytes, one extra byte is allocated at the end of each
+ // row to store the extra pixels.
+ std::size_t packedWidth = (size.x + 7) / 8;
+ std::size_t bytes = packedWidth * size.y;
+ std::vector<Uint8> mask(bytes, 0); // Defines which pixel is opaque (1) or transparent (0).
+ std::vector<Uint8> data(bytes, 0); // Defines which pixel is white (1) or black (0).
for (std::size_t j = 0; j < size.y; ++j)
{
for (std::size_t i = 0; i < size.x; ++i)
{
std::size_t pixelIndex = i + j * size.x;
- std::size_t byteIndex = pixelIndex / 8;
+ std::size_t byteIndex = i / 8 + j * packedWidth;
std::size_t bitIndex = i % 8;
// Turn on pixel that are not transparent
Uint8 opacity = pixels[pixelIndex * 4 + 3] > 0 ? 1 : 0;
- mask[byteIndex] |= opacity << bitIndex;
+ mask[byteIndex] |= static_cast<Uint8>(opacity << bitIndex);
// Choose between black/background & white/foreground color for each pixel,
// based on the pixel color intensity: on average, if a channel is "active"
- // at 25%, the bit is white.
- int intensity = pixels[pixelIndex * 4 + 0] + pixels[pixelIndex * 4 + 1] + pixels[pixelIndex * 4 + 2];
- Uint8 bit = intensity > 64 ? 1 : 0;
- data[byteIndex] |= bit << bitIndex;
+ // at 50%, the bit is white.
+ int intensity = (pixels[pixelIndex * 4 + 0] + pixels[pixelIndex * 4 + 1] + pixels[pixelIndex * 4 + 2]) / 3;
+ Uint8 bit = intensity > 128 ? 1 : 0;
+ data[byteIndex] |= static_cast<Uint8>(bit << bitIndex);
}
}
Pixmap maskPixmap = XCreateBitmapFromData(m_display, XDefaultRootWindow(m_display),
- (char*)&mask[0], size.x, size.y);
+ reinterpret_cast<char*>(&mask[0]), size.x, size.y);
Pixmap dataPixmap = XCreateBitmapFromData(m_display, XDefaultRootWindow(m_display),
- (char*)&data[0], size.x, size.y);
+ reinterpret_cast<char*>(&data[0]), size.x, size.y);
// Define the foreground color as white and the background as black.
XColor fg, bg;
- fg.red = fg.blue = fg.green = -1;
- bg.red = bg.blue = bg.green = 0;
+ fg.red = 0xFFFF;
+ fg.blue = 0xFFFF;
+ fg.green = 0xFFFF;
+ bg.red = 0x0000;
+ bg.blue = 0x0000;
+ bg.green = 0x0000;
// Create the monochrome cursor.
m_cursor = XCreatePixmapCursor(m_display,
@@ -122,16 +169,24 @@ bool CursorImpl::loadFromSystem(Cursor::Type type)
{
default: return false;
- case Cursor::Arrow: shape = XC_arrow; break;
- case Cursor::Wait: shape = XC_watch; break;
- case Cursor::Text: shape = XC_xterm; break;
- case Cursor::Hand: shape = XC_hand1; break;
- case Cursor::SizeHorizontal: shape = XC_sb_h_double_arrow; break;
- case Cursor::SizeVertical: shape = XC_sb_v_double_arrow; break;
- case Cursor::SizeAll: shape = XC_fleur; break;
- case Cursor::Cross: shape = XC_crosshair; break;
- case Cursor::Help: shape = XC_question_arrow; break;
- case Cursor::NotAllowed: shape = XC_X_cursor; break;
+ case Cursor::Arrow: shape = XC_arrow; break;
+ case Cursor::Wait: shape = XC_watch; break;
+ case Cursor::Text: shape = XC_xterm; break;
+ case Cursor::Hand: shape = XC_hand2; break;
+ case Cursor::SizeHorizontal: shape = XC_sb_h_double_arrow; break;
+ case Cursor::SizeVertical: shape = XC_sb_v_double_arrow; break;
+ case Cursor::SizeLeft: shape = XC_left_side; break;
+ case Cursor::SizeRight: shape = XC_right_side; break;
+ case Cursor::SizeTop: shape = XC_top_side; break;
+ case Cursor::SizeBottom: shape = XC_bottom_side; break;
+ case Cursor::SizeTopLeft: shape = XC_top_left_corner; break;
+ case Cursor::SizeBottomRight: shape = XC_bottom_right_corner; break;
+ case Cursor::SizeBottomLeft: shape = XC_bottom_left_corner; break;
+ case Cursor::SizeTopRight: shape = XC_top_right_corner; break;
+ case Cursor::SizeAll: shape = XC_fleur; break;
+ case Cursor::Cross: shape = XC_crosshair; break;
+ case Cursor::Help: shape = XC_question_arrow; break;
+ case Cursor::NotAllowed: shape = XC_X_cursor; break;
}
m_cursor = XCreateFontCursor(m_display, shape);
@@ -140,6 +195,13 @@ bool CursorImpl::loadFromSystem(Cursor::Type type)
////////////////////////////////////////////////////////////
+bool CursorImpl::isColorCursorSupported()
+{
+ return XcursorSupportsARGB(m_display);
+}
+
+
+////////////////////////////////////////////////////////////
void CursorImpl::release()
{
if (m_cursor != None)
diff --git a/src/SFML/Window/Unix/CursorImpl.hpp b/src/SFML/Window/Unix/CursorImpl.hpp
index 9bd4052..54e8da6 100644
--- a/src/SFML/Window/Unix/CursorImpl.hpp
+++ b/src/SFML/Window/Unix/CursorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -84,6 +84,28 @@ private:
friend class WindowImplX11;
////////////////////////////////////////////////////////////
+ /// \brief Checks if colored cursors are supported for this display.
+ ///
+ ////////////////////////////////////////////////////////////
+ bool isColorCursorSupported();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a cursor with the provided image (ARGB support)
+ ///
+ /// Refer to sf::Cursor::loadFromPixels().
+ ///
+ ////////////////////////////////////////////////////////////
+ bool loadFromPixelsARGB(const Uint8* pixels, Vector2u size, Vector2u hotspot);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a cursor with the provided image (monochrome)
+ ///
+ /// Refer to sf::Cursor::loadFromPixels().
+ ///
+ ////////////////////////////////////////////////////////////
+ bool loadFromPixelsMonochrome(const Uint8* pixels, Vector2u size, Vector2u hotspot);
+
+ ////////////////////////////////////////////////////////////
/// \brief Release the cursor, if we have loaded one.
///
////////////////////////////////////////////////////////////
diff --git a/src/SFML/Window/Unix/Display.cpp b/src/SFML/Window/Unix/Display.cpp
index 351a128..7e93701 100644
--- a/src/SFML/Window/Unix/Display.cpp
+++ b/src/SFML/Window/Unix/Display.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -40,6 +40,8 @@ namespace
// The shared display and its reference counter
Display* sharedDisplay = NULL;
unsigned int referenceCount = 0;
+ XIM sharedXIM = NULL;
+ unsigned int referenceCountXIM = 0;
sf::Mutex mutex;
typedef std::map<std::string, Atom> AtomMap;
@@ -85,6 +87,56 @@ void CloseDisplay(Display* display)
XCloseDisplay(display);
}
+////////////////////////////////////////////////////////////
+XIM OpenXIM()
+{
+ Lock lock(mutex);
+
+ assert(sharedDisplay != NULL);
+
+ if (referenceCountXIM == 0)
+ {
+ // Create a new XIM instance
+
+ // We need the default (environment) locale and X locale for opening
+ // the IM and properly receiving text
+ // First save the previous ones (this might be able to be written more elegantly?)
+ const char* p;
+ std::string prevLoc((p = setlocale(LC_ALL, NULL)) ? p : "");
+ std::string prevXLoc((p = XSetLocaleModifiers(NULL)) ? p : "");
+
+ // Set the locales from environment
+ setlocale(LC_ALL, "");
+ XSetLocaleModifiers("");
+
+ // Create the input context
+ sharedXIM = XOpenIM(sharedDisplay, NULL, NULL, NULL);
+
+ // Restore the previous locale
+ if (prevLoc.length() != 0)
+ setlocale(LC_ALL, prevLoc.c_str());
+
+ if (prevXLoc.length() != 0)
+ XSetLocaleModifiers(prevXLoc.c_str());
+ }
+
+ referenceCountXIM++;
+
+ return sharedXIM;
+}
+
+////////////////////////////////////////////////////////////
+void CloseXIM(XIM xim)
+{
+ Lock lock(mutex);
+
+ assert(xim == sharedXIM);
+
+ referenceCountXIM--;
+
+ if ((referenceCountXIM == 0) && (xim != NULL))
+ XCloseIM(xim);
+}
////////////////////////////////////////////////////////////
Atom getAtom(const std::string& name, bool onlyIfExists)
diff --git a/src/SFML/Window/Unix/Display.hpp b/src/SFML/Window/Unix/Display.hpp
index d2bb736..9aaca69 100644
--- a/src/SFML/Window/Unix/Display.hpp
+++ b/src/SFML/Window/Unix/Display.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -56,6 +56,27 @@ Display* OpenDisplay();
void CloseDisplay(Display* display);
////////////////////////////////////////////////////////////
+/// \brief Get the shared XIM context for the Display
+///
+/// This function increments the reference count of the XIM context,
+/// it must be matched with a call to CloseXIM.
+///
+/// It must be called with a display already opened.
+///
+/// \return XIM handle (a pointer) of the context
+///
+////////////////////////////////////////////////////////////
+XIM OpenXIM();
+
+////////////////////////////////////////////////////////////
+/// \brief Release a reference to the shared XIM context
+///
+/// \param xim XIM context to release
+///
+////////////////////////////////////////////////////////////
+void CloseXIM(XIM xim);
+
+////////////////////////////////////////////////////////////
/// \brief Get the atom with the specified name
///
/// \param name Name of the atom
diff --git a/src/SFML/Window/Unix/GlxContext.cpp b/src/SFML/Window/Unix/GlxContext.cpp
index cd02236..78accec 100644
--- a/src/SFML/Window/Unix/GlxContext.cpp
+++ b/src/SFML/Window/Unix/GlxContext.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -33,6 +33,14 @@
#include <SFML/System/Err.hpp>
#include <vector>
+// We check for this definition in order to avoid multiple definitions of GLAD
+// entities during unity builds of SFML.
+#ifndef SF_GLAD_GLX_IMPLEMENTATION_INCLUDED
+#define SF_GLAD_GLX_IMPLEMENTATION_INCLUDED
+#define SF_GLAD_GLX_IMPLEMENTATION
+#include <glad/glx.h>
+#endif
+
#if !defined(GLX_DEBUGGING) && defined(SFML_DEBUG)
// Enable this to print messages to err() everytime GLX produces errors
//#define GLX_DEBUGGING
@@ -43,12 +51,31 @@ namespace
sf::Mutex glxErrorMutex;
bool glxErrorOccurred = false;
+
+ ////////////////////////////////////////////////////////////
+ void ensureExtensionsInit(::Display* display, int screen)
+ {
+ static bool initialized = false;
+ if (!initialized)
+ {
+ initialized = true;
+
+ // We don't check the return value since the extension
+ // flags are cleared even if loading fails
+ gladLoaderLoadGLX(display, screen);
+
+ gladLoadGLX(display, screen, sf::priv::GlxContext::getFunction);
+ }
+ }
+
+
int HandleXError(::Display*, XErrorEvent*)
{
glxErrorOccurred = true;
return 0;
}
+
class GlxErrorHandler
{
public:
@@ -80,21 +107,6 @@ namespace sf
namespace priv
{
////////////////////////////////////////////////////////////
-void ensureExtensionsInit(::Display* display, int screen)
-{
- static bool initialized = false;
- if (!initialized)
- {
- initialized = true;
-
- // We don't check the return value since the extension
- // flags are cleared even if loading fails
- sfglx_LoadFunctions(display, screen);
- }
-}
-
-
-////////////////////////////////////////////////////////////
GlxContext::GlxContext(GlxContext* shared) :
m_display (NULL),
m_window (0),
@@ -120,7 +132,7 @@ m_ownsWindow(false)
////////////////////////////////////////////////////////////
-GlxContext::GlxContext(GlxContext* shared, const ContextSettings& settings, const WindowImpl* owner, unsigned int bitsPerPixel) :
+GlxContext::GlxContext(GlxContext* shared, const ContextSettings& settings, const WindowImpl* owner, unsigned int /*bitsPerPixel*/) :
m_display (NULL),
m_window (0),
m_context (NULL),
@@ -137,7 +149,7 @@ m_ownsWindow(false)
ensureExtensionsInit(m_display, DefaultScreen(m_display));
// Create the rendering surface from the owner window
- createSurface(static_cast< ::Window>(owner->getSystemHandle()));
+ createSurface(owner->getSystemHandle());
// Create the context
createContext(shared);
@@ -212,7 +224,7 @@ GlxContext::~GlxContext()
////////////////////////////////////////////////////////////
GlFunctionPointer GlxContext::getFunction(const char* name)
{
- return reinterpret_cast<GlFunctionPointer>(glXGetProcAddressARB(reinterpret_cast<const GLubyte*>(name)));
+ return glXGetProcAddress(reinterpret_cast<const GLubyte*>(name));
}
@@ -281,15 +293,15 @@ void GlxContext::setVerticalSyncEnabled(bool enabled)
// We use the direct pointer to the MESA entry point instead of the alias
// because glx.h declares the entry point as an external function
// which would require us to link in an additional library
- if (sfglx_ext_EXT_swap_control == sfglx_LOAD_SUCCEEDED)
+ if (SF_GLAD_GLX_EXT_swap_control)
{
glXSwapIntervalEXT(m_display, m_pbuffer ? m_pbuffer : m_window, enabled ? 1 : 0);
}
- else if (sfglx_ext_MESA_swap_control == sfglx_LOAD_SUCCEEDED)
+ else if (SF_GLAD_GLX_MESA_swap_control)
{
- result = sf_ptrc_glXSwapIntervalMESA(enabled ? 1 : 0);
+ result = glXSwapIntervalMESA(enabled ? 1 : 0);
}
- else if (sfglx_ext_SGI_swap_control == sfglx_LOAD_SUCCEEDED)
+ else if (SF_GLAD_GLX_SGI_swap_control)
{
result = glXSwapIntervalSGI(enabled ? 1 : 0);
}
@@ -316,6 +328,8 @@ XVisualInfo GlxContext::selectBestVisual(::Display* display, unsigned int bitsPe
// Make sure that extensions are initialized
ensureExtensionsInit(display, DefaultScreen(display));
+ const int screen = DefaultScreen(display);
+
// Retrieve all the visuals
int count;
XVisualInfo* visuals = XGetVisualInfo(display, 0, NULL, &count);
@@ -326,6 +340,10 @@ XVisualInfo GlxContext::selectBestVisual(::Display* display, unsigned int bitsPe
XVisualInfo bestVisual = XVisualInfo();
for (int i = 0; i < count; ++i)
{
+ // Filter by screen
+ if (visuals[i].screen != screen)
+ continue;
+
// Check mandatory attributes
int doubleBuffer;
glXGetConfig(display, &visuals[i], GLX_DOUBLEBUFFER, &doubleBuffer);
@@ -341,7 +359,7 @@ XVisualInfo GlxContext::selectBestVisual(::Display* display, unsigned int bitsPe
glXGetConfig(display, &visuals[i], GLX_DEPTH_SIZE, &depth);
glXGetConfig(display, &visuals[i], GLX_STENCIL_SIZE, &stencil);
- if (sfglx_ext_ARB_multisample == sfglx_LOAD_SUCCEEDED)
+ if (SF_GLAD_GLX_ARB_multisample)
{
glXGetConfig(display, &visuals[i], GLX_SAMPLE_BUFFERS_ARB, &multiSampling);
glXGetConfig(display, &visuals[i], GLX_SAMPLES_ARB, &samples);
@@ -352,7 +370,7 @@ XVisualInfo GlxContext::selectBestVisual(::Display* display, unsigned int bitsPe
samples = 0;
}
- if ((sfglx_ext_EXT_framebuffer_sRGB == sfglx_LOAD_SUCCEEDED) || (sfglx_ext_ARB_framebuffer_sRGB == sfglx_LOAD_SUCCEEDED))
+ if (SF_GLAD_GLX_EXT_framebuffer_sRGB || SF_GLAD_GLX_ARB_framebuffer_sRGB)
{
glXGetConfig(display, &visuals[i], GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB, &sRgb);
}
@@ -399,7 +417,7 @@ void GlxContext::updateSettingsFromVisualInfo(XVisualInfo* visualInfo)
glXGetConfig(m_display, visualInfo, GLX_DEPTH_SIZE, &depth);
glXGetConfig(m_display, visualInfo, GLX_STENCIL_SIZE, &stencil);
- if (sfglx_ext_ARB_multisample == sfglx_LOAD_SUCCEEDED)
+ if (SF_GLAD_GLX_ARB_multisample)
{
glXGetConfig(m_display, visualInfo, GLX_SAMPLE_BUFFERS_ARB, &multiSampling);
glXGetConfig(m_display, visualInfo, GLX_SAMPLES_ARB, &samples);
@@ -410,7 +428,7 @@ void GlxContext::updateSettingsFromVisualInfo(XVisualInfo* visualInfo)
samples = 0;
}
- if ((sfglx_ext_EXT_framebuffer_sRGB == sfglx_LOAD_SUCCEEDED) || (sfglx_ext_ARB_framebuffer_sRGB == sfglx_LOAD_SUCCEEDED))
+ if (SF_GLAD_GLX_EXT_framebuffer_sRGB || SF_GLAD_GLX_ARB_framebuffer_sRGB)
{
glXGetConfig(m_display, visualInfo, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB, &sRgb);
}
@@ -421,7 +439,7 @@ void GlxContext::updateSettingsFromVisualInfo(XVisualInfo* visualInfo)
m_settings.depthBits = static_cast<unsigned int>(depth);
m_settings.stencilBits = static_cast<unsigned int>(stencil);
- m_settings.antialiasingLevel = multiSampling ? samples : 0;
+ m_settings.antialiasingLevel = multiSampling ? static_cast<unsigned int>(samples) : 0;
m_settings.sRgbCapable = (sRgb == True);
}
@@ -460,7 +478,7 @@ void GlxContext::createSurface(GlxContext* shared, unsigned int width, unsigned
XVisualInfo visualInfo = selectBestVisual(m_display, bitsPerPixel, m_settings);
// Check if the shared context already exists and pbuffers are supported
- if (shared && (sfglx_ext_SGIX_pbuffer == sfglx_LOAD_SUCCEEDED))
+ if (shared && SF_GLAD_GLX_SGIX_pbuffer)
{
// There are no GLX versions prior to 1.0
int major = 0;
@@ -529,6 +547,9 @@ void GlxContext::createSurface(GlxContext* shared, unsigned int width, unsigned
XSetWindowAttributes attributes;
attributes.colormap = XCreateColormap(m_display, RootWindow(m_display, screen), visualInfo.visual, AllocNone);
+ // Note: bitsPerPixel is explicitly ignored. Instead, DefaultDepth() is used in order to avoid window creation failure due to
+ // a depth not supported by the X window system. On Unix/Linux, the window's pixel format is not directly associated with the
+ // rendering surface (unlike on Windows, for example).
m_window = XCreateWindow(m_display,
RootWindow(m_display, screen),
0, 0,
@@ -620,7 +641,7 @@ void GlxContext::createContext(GlxContext* shared)
err() << "Failed to query GLX version, limited to legacy context creation" << std::endl;
// Check if glXCreateContextAttribsARB is available (requires GLX 1.3 or greater)
- bool hasCreateContextArb = (sfglx_ext_ARB_create_context == sfglx_LOAD_SUCCEEDED) && ((major > 1) || (minor >= 3));
+ bool hasCreateContextArb = SF_GLAD_GLX_ARB_create_context && ((major > 1) || (minor >= 3));
// Create the OpenGL context -- first try using glXCreateContextAttribsARB
if (hasCreateContextArb)
@@ -662,13 +683,13 @@ void GlxContext::createContext(GlxContext* shared)
if ((m_settings.majorVersion > 1) || ((m_settings.majorVersion == 1) && (m_settings.minorVersion > 1)))
{
attributes.push_back(GLX_CONTEXT_MAJOR_VERSION_ARB);
- attributes.push_back(m_settings.majorVersion);
+ attributes.push_back(static_cast<int>(m_settings.majorVersion));
attributes.push_back(GLX_CONTEXT_MINOR_VERSION_ARB);
- attributes.push_back(m_settings.minorVersion);
+ attributes.push_back(static_cast<int>(m_settings.minorVersion));
}
// Check if setting the profile is supported
- if (sfglx_ext_ARB_create_context_profile == sfglx_LOAD_SUCCEEDED)
+ if (SF_GLAD_GLX_ARB_create_context_profile)
{
int profile = (m_settings.attributeFlags & ContextSettings::Core) ? GLX_CONTEXT_CORE_PROFILE_BIT_ARB : GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
int debug = (m_settings.attributeFlags & ContextSettings::Debug) ? GLX_CONTEXT_DEBUG_BIT_ARB : 0;
diff --git a/src/SFML/Window/Unix/GlxContext.hpp b/src/SFML/Window/Unix/GlxContext.hpp
index e974c44..5e6a8ad 100644
--- a/src/SFML/Window/Unix/GlxContext.hpp
+++ b/src/SFML/Window/Unix/GlxContext.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,7 +29,7 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Window/GlContext.hpp>
-#include <SFML/Window/Unix/GlxExtensions.hpp>
+#include <glad/glx.h>
#include <X11/Xlib.h>
diff --git a/src/SFML/Window/Unix/GlxExtensions.cpp b/src/SFML/Window/Unix/GlxExtensions.cpp
deleted file mode 100644
index cfc35b2..0000000
--- a/src/SFML/Window/Unix/GlxExtensions.cpp
+++ /dev/null
@@ -1,218 +0,0 @@
-////////////////////////////////////////////////////////////
-//
-// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
-//
-// This software is provided 'as-is', without any express or implied warranty.
-// In no event will the authors be held liable for any damages arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it freely,
-// subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented;
-// you must not claim that you wrote the original software.
-// If you use this software in a product, an acknowledgment
-// in the product documentation would be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such,
-// and must not be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source distribution.
-//
-////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////
-// Headers
-////////////////////////////////////////////////////////////
-#include <SFML/Window/Unix/GlxExtensions.hpp>
-#include <SFML/Window/Context.hpp>
-#include <cstdlib>
-#include <cstring>
-#include <cstddef>
-#include <string>
-
-static sf::GlFunctionPointer IntGetProcAddress(const char* name)
-{
- return sf::Context::getFunction(name);
-}
-
-int sfglx_ext_EXT_swap_control = sfglx_LOAD_FAILED;
-int sfglx_ext_MESA_swap_control = sfglx_LOAD_FAILED;
-int sfglx_ext_SGI_swap_control = sfglx_LOAD_FAILED;
-int sfglx_ext_EXT_framebuffer_sRGB = sfglx_LOAD_FAILED;
-int sfglx_ext_ARB_framebuffer_sRGB = sfglx_LOAD_FAILED;
-int sfglx_ext_ARB_multisample = sfglx_LOAD_FAILED;
-int sfglx_ext_SGIX_pbuffer = sfglx_LOAD_FAILED;
-int sfglx_ext_ARB_create_context = sfglx_LOAD_FAILED;
-int sfglx_ext_ARB_create_context_profile = sfglx_LOAD_FAILED;
-
-void (CODEGEN_FUNCPTR *sf_ptrc_glXSwapIntervalEXT)(Display*, GLXDrawable, int) = NULL;
-
-static int Load_EXT_swap_control(void)
-{
- int numFailed = 0;
- sf_ptrc_glXSwapIntervalEXT = reinterpret_cast<void (CODEGEN_FUNCPTR*)(Display*, GLXDrawable, int)>(IntGetProcAddress("glXSwapIntervalEXT"));
- if (!sf_ptrc_glXSwapIntervalEXT)
- numFailed++;
- return numFailed;
-}
-
-int (CODEGEN_FUNCPTR *sf_ptrc_glXSwapIntervalMESA)(int) = NULL;
-
-static int Load_MESA_swap_control(void)
-{
- int numFailed = 0;
- sf_ptrc_glXSwapIntervalMESA = reinterpret_cast<int (CODEGEN_FUNCPTR*)(int)>(IntGetProcAddress("glXSwapIntervalMESA"));
- if (!sf_ptrc_glXSwapIntervalMESA)
- numFailed++;
- return numFailed;
-}
-
-int (CODEGEN_FUNCPTR *sf_ptrc_glXSwapIntervalSGI)(int) = NULL;
-
-static int Load_SGI_swap_control(void)
-{
- int numFailed = 0;
- sf_ptrc_glXSwapIntervalSGI = reinterpret_cast<int (CODEGEN_FUNCPTR *)(int)>(IntGetProcAddress("glXSwapIntervalSGI"));
- if (!sf_ptrc_glXSwapIntervalSGI)
- numFailed++;
- return numFailed;
-}
-
-GLXPbufferSGIX (CODEGEN_FUNCPTR *sf_ptrc_glXCreateGLXPbufferSGIX)(Display*, GLXFBConfigSGIX, unsigned int, unsigned int, int*) = NULL;
-void (CODEGEN_FUNCPTR *sf_ptrc_glXDestroyGLXPbufferSGIX)(Display*, GLXPbufferSGIX) = NULL;
-void (CODEGEN_FUNCPTR *sf_ptrc_glXGetSelectedEventSGIX)(Display*, GLXDrawable, unsigned long*) = NULL;
-int (CODEGEN_FUNCPTR *sf_ptrc_glXQueryGLXPbufferSGIX)(Display*, GLXPbufferSGIX, int, unsigned int*) = NULL;
-void (CODEGEN_FUNCPTR *sf_ptrc_glXSelectEventSGIX)(Display*, GLXDrawable, unsigned long) = NULL;
-
-static int Load_SGIX_pbuffer(void)
-{
- int numFailed = 0;
- sf_ptrc_glXCreateGLXPbufferSGIX = reinterpret_cast<GLXPbufferSGIX (CODEGEN_FUNCPTR*)(Display*, GLXFBConfigSGIX, unsigned int, unsigned int, int*)>(IntGetProcAddress("glXCreateGLXPbufferSGIX"));
- if (!sf_ptrc_glXCreateGLXPbufferSGIX)
- numFailed++;
- sf_ptrc_glXDestroyGLXPbufferSGIX = reinterpret_cast<void (CODEGEN_FUNCPTR*)(Display*, GLXPbufferSGIX)>(IntGetProcAddress("glXDestroyGLXPbufferSGIX"));
- if (!sf_ptrc_glXDestroyGLXPbufferSGIX)
- numFailed++;
- sf_ptrc_glXGetSelectedEventSGIX = reinterpret_cast<void (CODEGEN_FUNCPTR*)(Display*, GLXDrawable, unsigned long*)>(IntGetProcAddress("glXGetSelectedEventSGIX"));
- if (!sf_ptrc_glXGetSelectedEventSGIX)
- numFailed++;
- sf_ptrc_glXQueryGLXPbufferSGIX = reinterpret_cast<int (CODEGEN_FUNCPTR*)(Display*, GLXPbufferSGIX, int, unsigned int*)>(IntGetProcAddress("glXQueryGLXPbufferSGIX"));
- if (!sf_ptrc_glXQueryGLXPbufferSGIX)
- numFailed++;
- sf_ptrc_glXSelectEventSGIX = reinterpret_cast<void (CODEGEN_FUNCPTR*)(Display*, GLXDrawable, unsigned long)>(IntGetProcAddress("glXSelectEventSGIX"));
- if (!sf_ptrc_glXSelectEventSGIX)
- numFailed++;
- return numFailed;
-}
-
-GLXContext (CODEGEN_FUNCPTR *sf_ptrc_glXCreateContextAttribsARB)(Display*, GLXFBConfig, GLXContext, Bool, const int*) = NULL;
-
-static int Load_ARB_create_context(void)
-{
- int numFailed = 0;
- sf_ptrc_glXCreateContextAttribsARB = reinterpret_cast<GLXContext (CODEGEN_FUNCPTR*)(Display*, GLXFBConfig, GLXContext, Bool, const int*)>(IntGetProcAddress("glXCreateContextAttribsARB"));
- if (!sf_ptrc_glXCreateContextAttribsARB)
- numFailed++;
- return numFailed;
-}
-
-typedef int (*PFN_LOADFUNCPOINTERS)(void);
-typedef struct sfglx_StrToExtMap_s
-{
- const char* extensionName;
- int* extensionVariable;
- PFN_LOADFUNCPOINTERS LoadExtension;
-} sfglx_StrToExtMap;
-
-static sfglx_StrToExtMap ExtensionMap[9] = {
- {"GLX_EXT_swap_control", &sfglx_ext_EXT_swap_control, Load_EXT_swap_control},
- {"GLX_MESA_swap_control", &sfglx_ext_MESA_swap_control, Load_MESA_swap_control},
- {"GLX_SGI_swap_control", &sfglx_ext_SGI_swap_control, Load_SGI_swap_control},
- {"GLX_EXT_framebuffer_sRGB", &sfglx_ext_EXT_framebuffer_sRGB, NULL},
- {"GLX_ARB_framebuffer_sRGB", &sfglx_ext_ARB_framebuffer_sRGB, NULL},
- {"GLX_ARB_multisample", &sfglx_ext_ARB_multisample, NULL},
- {"GLX_SGIX_pbuffer", &sfglx_ext_SGIX_pbuffer, Load_SGIX_pbuffer},
- {"GLX_ARB_create_context", &sfglx_ext_ARB_create_context, Load_ARB_create_context},
- {"GLX_ARB_create_context_profile", &sfglx_ext_ARB_create_context_profile, NULL}
-};
-
-static int g_extensionMapSize = 9;
-
-
-static sfglx_StrToExtMap* FindExtEntry(const char* extensionName)
-{
- sfglx_StrToExtMap* currLoc = ExtensionMap;
- for (int loop = 0; loop < g_extensionMapSize; ++loop, ++currLoc)
- {
- if (std::strcmp(extensionName, currLoc->extensionName) == 0)
- return currLoc;
- }
-
- return NULL;
-}
-
-
-static void ClearExtensionVars(void)
-{
- sfglx_ext_EXT_swap_control = sfglx_LOAD_FAILED;
- sfglx_ext_MESA_swap_control = sfglx_LOAD_FAILED;
- sfglx_ext_SGI_swap_control = sfglx_LOAD_FAILED;
- sfglx_ext_EXT_framebuffer_sRGB = sfglx_LOAD_FAILED;
- sfglx_ext_ARB_framebuffer_sRGB = sfglx_LOAD_FAILED;
- sfglx_ext_ARB_multisample = sfglx_LOAD_FAILED;
- sfglx_ext_SGIX_pbuffer = sfglx_LOAD_FAILED;
- sfglx_ext_ARB_create_context = sfglx_LOAD_FAILED;
- sfglx_ext_ARB_create_context_profile = sfglx_LOAD_FAILED;
-}
-
-
-static void LoadExtByName(const char* extensionName)
-{
- sfglx_StrToExtMap* entry = NULL;
- entry = FindExtEntry(extensionName);
- if (entry)
- {
- if (entry->LoadExtension)
- {
- int numFailed = entry->LoadExtension();
- if (numFailed == 0)
- {
- *(entry->extensionVariable) = sfglx_LOAD_SUCCEEDED;
- }
- else
- {
- *(entry->extensionVariable) = sfglx_LOAD_SUCCEEDED + numFailed;
- }
- }
- else
- {
- *(entry->extensionVariable) = sfglx_LOAD_SUCCEEDED;
- }
- }
-}
-
-
-static void ProcExtsFromExtString(const char* strExtList)
-{
- do
- {
- const char* begin = strExtList;
-
- while ((*strExtList != ' ') && *strExtList)
- strExtList++;
-
- LoadExtByName(std::string(begin, strExtList).c_str());
- } while (*strExtList++);
-}
-
-
-int sfglx_LoadFunctions(Display* display, int screen)
-{
- ClearExtensionVars();
-
-
- ProcExtsFromExtString(reinterpret_cast<const char*>(glXQueryExtensionsString(display, screen)));
- return sfglx_LOAD_SUCCEEDED;
-}
diff --git a/src/SFML/Window/Unix/GlxExtensions.hpp b/src/SFML/Window/Unix/GlxExtensions.hpp
deleted file mode 100644
index fb2c7da..0000000
--- a/src/SFML/Window/Unix/GlxExtensions.hpp
+++ /dev/null
@@ -1,251 +0,0 @@
-////////////////////////////////////////////////////////////
-//
-// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
-//
-// This software is provided 'as-is', without any express or implied warranty.
-// In no event will the authors be held liable for any damages arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it freely,
-// subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented;
-// you must not claim that you wrote the original software.
-// If you use this software in a product, an acknowledgment
-// in the product documentation would be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such,
-// and must not be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source distribution.
-//
-////////////////////////////////////////////////////////////
-
-#ifndef SF_POINTER_C_GENERATED_HEADER_GLXWIN_HPP
-#define SF_POINTER_C_GENERATED_HEADER_GLXWIN_HPP
-
-#if defined(__glxext_h_) || defined(__glx_glxext_h_)
-#error Attempt to include glx_exts after including glxext.h
-#endif
-
-#define __glxext_h_
-#define __glx_glxext_h_
-
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <GL/glx.h>
-#ifdef CODEGEN_FUNCPTR
-#undef CODEGEN_FUNCPTR
-#endif // CODEGEN_FUNCPTR
-#define CODEGEN_FUNCPTR
-
-#ifndef GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-#define GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-
-typedef unsigned int GLenum;
-typedef unsigned char GLboolean;
-typedef unsigned int GLbitfield;
-typedef signed char GLbyte;
-typedef short GLshort;
-typedef int GLint;
-typedef int GLsizei;
-typedef unsigned char GLubyte;
-typedef unsigned short GLushort;
-typedef unsigned int GLuint;
-typedef float GLfloat;
-typedef float GLclampf;
-typedef double GLdouble;
-typedef double GLclampd;
-#define GLvoid void
-
-#endif // GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-
-
-#ifndef GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-#define GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-
-
-#endif // GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-
-
-#ifndef GLEXT_64_TYPES_DEFINED
-// This code block is duplicated in glext.h, so must be protected
-#define GLEXT_64_TYPES_DEFINED
-// Define int32_t, int64_t, and uint64_t types for UST/MSC
-// (as used in the GLX_OML_sync_control extension).
-#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-#include <inttypes.h>
-#elif defined(__sun__) || defined(__digital__)
-#include <inttypes.h>
-#if defined(__STDC__)
-#if defined(__arch64__) || defined(_LP64)
-typedef long int int64_t;
-typedef unsigned long int uint64_t;
-#else
-typedef long long int int64_t;
-typedef unsigned long long int uint64_t;
-#endif // __arch64__
-#endif // __STDC__
-#elif defined( __VMS ) || defined(__sgi)
-#include <inttypes.h>
-#elif defined(__SCO__) || defined(__USLC__)
-#include <stdint.h>
-#elif defined(__UNIXOS2__) || defined(__SOL64__)
-typedef long int int32_t;
-typedef long long int int64_t;
-typedef unsigned long long int uint64_t;
-#elif defined(_WIN32) && defined(__GNUC__)
-#include <stdint.h>
-#elif defined(_WIN32)
-typedef __int32 int32_t;
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-#else
-// Fallback if nothing above works
-#include <inttypes.h>
-#endif
-#endif
- typedef struct __GLXFBConfigRec *GLXFBConfig;
- typedef XID GLXContextID;
- typedef struct __GLXcontextRec *GLXContext;
- typedef XID GLXPixmap;
- typedef XID GLXDrawable;
- typedef XID GLXPbuffer;
- typedef void (APIENTRY *__GLXextFuncPtr)(void);
- typedef XID GLXVideoCaptureDeviceNV;
- typedef unsigned int GLXVideoDeviceNV;
- typedef XID GLXVideoSourceSGIX;
- typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;
- typedef XID GLXPbufferSGIX;
- typedef struct {
- char pipeName[80]; // Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]
- int networkId;
-} GLXHyperpipeNetworkSGIX;
- typedef struct {
- char pipeName[80]; // Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]
- int channel;
- unsigned int participationType;
- int timeSlice;
-} GLXHyperpipeConfigSGIX;
- typedef struct {
- char pipeName[80]; // Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]
- int srcXOrigin, srcYOrigin, srcWidth, srcHeight;
- int destXOrigin, destYOrigin, destWidth, destHeight;
-} GLXPipeRect;
- typedef struct {
- char pipeName[80]; // Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]
- int XOrigin, YOrigin, maxHeight, maxWidth;
-} GLXPipeRectLimits;
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-
-extern int sfglx_ext_EXT_swap_control;
-extern int sfglx_ext_MESA_swap_control;
-extern int sfglx_ext_SGI_swap_control;
-extern int sfglx_ext_EXT_framebuffer_sRGB;
-extern int sfglx_ext_ARB_framebuffer_sRGB;
-extern int sfglx_ext_ARB_multisample;
-extern int sfglx_ext_SGIX_pbuffer;
-extern int sfglx_ext_ARB_create_context;
-extern int sfglx_ext_ARB_create_context_profile;
-
-#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2
-#define GLX_SWAP_INTERVAL_EXT 0x20F1
-
-#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2
-
-#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2
-
-#define GLX_SAMPLES_ARB 100001
-#define GLX_SAMPLE_BUFFERS_ARB 100000
-
-#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080
-#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010
-#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004
-#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008
-#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000
-#define GLX_DAMAGED_SGIX 0x8020
-#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020
-#define GLX_EVENT_MASK_SGIX 0x801F
-#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001
-#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002
-#define GLX_HEIGHT_SGIX 0x801E
-#define GLX_LARGEST_PBUFFER_SGIX 0x801C
-#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017
-#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018
-#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016
-#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A
-#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019
-#define GLX_PBUFFER_BIT_SGIX 0x00000004
-#define GLX_PBUFFER_SGIX 0x8023
-#define GLX_PRESERVED_CONTENTS_SGIX 0x801B
-#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100
-#define GLX_SAVED_SGIX 0x8021
-#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040
-#define GLX_WIDTH_SGIX 0x801D
-#define GLX_WINDOW_SGIX 0x8022
-
-#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001
-#define GLX_CONTEXT_FLAGS_ARB 0x2094
-#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
-#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
-#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
-
-#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
-#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
-#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
-
-#ifndef GLX_EXT_swap_control
-#define GLX_EXT_swap_control 1
-extern void (CODEGEN_FUNCPTR *sf_ptrc_glXSwapIntervalEXT)(Display *, GLXDrawable, int);
-#define glXSwapIntervalEXT sf_ptrc_glXSwapIntervalEXT
-#endif // GLX_EXT_swap_control
-
-// Declare entry point even if GLX header already provides glXSwapIntervalMESA
-// We won't make use of an alias here
-extern int (CODEGEN_FUNCPTR *sf_ptrc_glXSwapIntervalMESA)(int);
-
-#ifndef GLX_SGI_swap_control
-#define GLX_SGI_swap_control 1
-extern int (CODEGEN_FUNCPTR *sf_ptrc_glXSwapIntervalSGI)(int);
-#define glXSwapIntervalSGI sf_ptrc_glXSwapIntervalSGI
-#endif // GLX_SGI_swap_control
-
-#ifndef GLX_SGIX_pbuffer
-#define GLX_SGIX_pbuffer 1
-extern GLXPbufferSGIX (CODEGEN_FUNCPTR *sf_ptrc_glXCreateGLXPbufferSGIX)(Display*, GLXFBConfigSGIX, unsigned int, unsigned int, int*);
-#define glXCreateGLXPbufferSGIX sf_ptrc_glXCreateGLXPbufferSGIX
-extern void (CODEGEN_FUNCPTR *sf_ptrc_glXDestroyGLXPbufferSGIX)(Display*, GLXPbufferSGIX);
-#define glXDestroyGLXPbufferSGIX sf_ptrc_glXDestroyGLXPbufferSGIX
-extern void (CODEGEN_FUNCPTR *sf_ptrc_glXGetSelectedEventSGIX)(Display*, GLXDrawable, unsigned long*);
-#define glXGetSelectedEventSGIX sf_ptrc_glXGetSelectedEventSGIX
-extern int (CODEGEN_FUNCPTR *sf_ptrc_glXQueryGLXPbufferSGIX)(Display*, GLXPbufferSGIX, int, unsigned int*);
-#define glXQueryGLXPbufferSGIX sf_ptrc_glXQueryGLXPbufferSGIX
-extern void (CODEGEN_FUNCPTR *sf_ptrc_glXSelectEventSGIX)(Display*, GLXDrawable, unsigned long);
-#define glXSelectEventSGIX sf_ptrc_glXSelectEventSGIX
-#endif // GLX_SGIX_pbuffer
-
-#ifndef GLX_ARB_create_context
-#define GLX_ARB_create_context 1
-extern GLXContext (CODEGEN_FUNCPTR *sf_ptrc_glXCreateContextAttribsARB)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
-#define glXCreateContextAttribsARB sf_ptrc_glXCreateContextAttribsARB
-#endif // GLX_ARB_create_context
-
-
-enum sfglx_LoadStatus
-{
- sfglx_LOAD_FAILED = 0,
- sfglx_LOAD_SUCCEEDED = 1
-};
-
-int sfglx_LoadFunctions(Display *display, int screen);
-
-
-#ifdef __cplusplus
-}
-#endif // __cplusplus
-
-#endif // SF_POINTER_C_GENERATED_HEADER_GLXWIN_HPP
diff --git a/src/SFML/Window/Unix/GlxExtensions.txt b/src/SFML/Window/Unix/GlxExtensions.txt
deleted file mode 100644
index 9c8a641..0000000
--- a/src/SFML/Window/Unix/GlxExtensions.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Created with:
-// https://bitbucket.org/KhronosGroup/glloadgen
-// Commit d143d66ac90d538ed06f806188714861b8e8e2f9
-// lua LoadGen.lua -style=pointer_c -spec=glX -indent=space -prefix=sf -extfile=GlxExtensions.txt GlxExtensions
-
-EXT_swap_control
-// MESA_swap_control
-SGI_swap_control
-EXT_framebuffer_sRGB
-ARB_framebuffer_sRGB
-GLX_ARB_multisample
-GLX_SGIX_pbuffer
-GLX_ARB_create_context
-GLX_ARB_create_context_profile
diff --git a/src/SFML/Window/Unix/InputImpl.cpp b/src/SFML/Window/Unix/InputImpl.cpp
index b404dd5..4f421dd 100644
--- a/src/SFML/Window/Unix/InputImpl.cpp
+++ b/src/SFML/Window/Unix/InputImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -28,11 +28,10 @@
#include <SFML/Window/Window.hpp> // important to be included first (conflict with None)
#include <SFML/Window/Unix/InputImpl.hpp>
#include <SFML/Window/Unix/Display.hpp>
-#include <SFML/System/Err.hpp>
+#include <SFML/Window/Unix/KeyboardImpl.hpp>
#include <X11/Xlib.h>
#include <X11/keysym.h>
-
namespace sf
{
namespace priv
@@ -40,142 +39,35 @@ namespace priv
////////////////////////////////////////////////////////////
bool InputImpl::isKeyPressed(Keyboard::Key key)
{
- // Get the corresponding X11 keysym
- KeySym keysym = 0;
- switch (key)
- {
- case Keyboard::LShift: keysym = XK_Shift_L; break;
- case Keyboard::RShift: keysym = XK_Shift_R; break;
- case Keyboard::LControl: keysym = XK_Control_L; break;
- case Keyboard::RControl: keysym = XK_Control_R; break;
- case Keyboard::LAlt: keysym = XK_Alt_L; break;
- case Keyboard::RAlt: keysym = XK_Alt_R; break;
- case Keyboard::LSystem: keysym = XK_Super_L; break;
- case Keyboard::RSystem: keysym = XK_Super_R; break;
- case Keyboard::Menu: keysym = XK_Menu; break;
- case Keyboard::Escape: keysym = XK_Escape; break;
- case Keyboard::Semicolon: keysym = XK_semicolon; break;
- case Keyboard::Slash: keysym = XK_slash; break;
- case Keyboard::Equal: keysym = XK_equal; break;
- case Keyboard::Hyphen: keysym = XK_minus; break;
- case Keyboard::LBracket: keysym = XK_bracketleft; break;
- case Keyboard::RBracket: keysym = XK_bracketright; break;
- case Keyboard::Comma: keysym = XK_comma; break;
- case Keyboard::Period: keysym = XK_period; break;
- case Keyboard::Quote: keysym = XK_apostrophe; break;
- case Keyboard::Backslash: keysym = XK_backslash; break;
- case Keyboard::Tilde: keysym = XK_grave; break;
- case Keyboard::Space: keysym = XK_space; break;
- case Keyboard::Enter: keysym = XK_Return; break;
- case Keyboard::Backspace: keysym = XK_BackSpace; break;
- case Keyboard::Tab: keysym = XK_Tab; break;
- case Keyboard::PageUp: keysym = XK_Prior; break;
- case Keyboard::PageDown: keysym = XK_Next; break;
- case Keyboard::End: keysym = XK_End; break;
- case Keyboard::Home: keysym = XK_Home; break;
- case Keyboard::Insert: keysym = XK_Insert; break;
- case Keyboard::Delete: keysym = XK_Delete; break;
- case Keyboard::Add: keysym = XK_KP_Add; break;
- case Keyboard::Subtract: keysym = XK_KP_Subtract; break;
- case Keyboard::Multiply: keysym = XK_KP_Multiply; break;
- case Keyboard::Divide: keysym = XK_KP_Divide; break;
- case Keyboard::Pause: keysym = XK_Pause; break;
- case Keyboard::F1: keysym = XK_F1; break;
- case Keyboard::F2: keysym = XK_F2; break;
- case Keyboard::F3: keysym = XK_F3; break;
- case Keyboard::F4: keysym = XK_F4; break;
- case Keyboard::F5: keysym = XK_F5; break;
- case Keyboard::F6: keysym = XK_F6; break;
- case Keyboard::F7: keysym = XK_F7; break;
- case Keyboard::F8: keysym = XK_F8; break;
- case Keyboard::F9: keysym = XK_F9; break;
- case Keyboard::F10: keysym = XK_F10; break;
- case Keyboard::F11: keysym = XK_F11; break;
- case Keyboard::F12: keysym = XK_F12; break;
- case Keyboard::F13: keysym = XK_F13; break;
- case Keyboard::F14: keysym = XK_F14; break;
- case Keyboard::F15: keysym = XK_F15; break;
- case Keyboard::Left: keysym = XK_Left; break;
- case Keyboard::Right: keysym = XK_Right; break;
- case Keyboard::Up: keysym = XK_Up; break;
- case Keyboard::Down: keysym = XK_Down; break;
- case Keyboard::Numpad0: keysym = XK_KP_Insert; break;
- case Keyboard::Numpad1: keysym = XK_KP_End; break;
- case Keyboard::Numpad2: keysym = XK_KP_Down; break;
- case Keyboard::Numpad3: keysym = XK_KP_Page_Down; break;
- case Keyboard::Numpad4: keysym = XK_KP_Left; break;
- case Keyboard::Numpad5: keysym = XK_KP_Begin; break;
- case Keyboard::Numpad6: keysym = XK_KP_Right; break;
- case Keyboard::Numpad7: keysym = XK_KP_Home; break;
- case Keyboard::Numpad8: keysym = XK_KP_Up; break;
- case Keyboard::Numpad9: keysym = XK_KP_Page_Up; break;
- case Keyboard::A: keysym = XK_a; break;
- case Keyboard::B: keysym = XK_b; break;
- case Keyboard::C: keysym = XK_c; break;
- case Keyboard::D: keysym = XK_d; break;
- case Keyboard::E: keysym = XK_e; break;
- case Keyboard::F: keysym = XK_f; break;
- case Keyboard::G: keysym = XK_g; break;
- case Keyboard::H: keysym = XK_h; break;
- case Keyboard::I: keysym = XK_i; break;
- case Keyboard::J: keysym = XK_j; break;
- case Keyboard::K: keysym = XK_k; break;
- case Keyboard::L: keysym = XK_l; break;
- case Keyboard::M: keysym = XK_m; break;
- case Keyboard::N: keysym = XK_n; break;
- case Keyboard::O: keysym = XK_o; break;
- case Keyboard::P: keysym = XK_p; break;
- case Keyboard::Q: keysym = XK_q; break;
- case Keyboard::R: keysym = XK_r; break;
- case Keyboard::S: keysym = XK_s; break;
- case Keyboard::T: keysym = XK_t; break;
- case Keyboard::U: keysym = XK_u; break;
- case Keyboard::V: keysym = XK_v; break;
- case Keyboard::W: keysym = XK_w; break;
- case Keyboard::X: keysym = XK_x; break;
- case Keyboard::Y: keysym = XK_y; break;
- case Keyboard::Z: keysym = XK_z; break;
- case Keyboard::Num0: keysym = XK_0; break;
- case Keyboard::Num1: keysym = XK_1; break;
- case Keyboard::Num2: keysym = XK_2; break;
- case Keyboard::Num3: keysym = XK_3; break;
- case Keyboard::Num4: keysym = XK_4; break;
- case Keyboard::Num5: keysym = XK_5; break;
- case Keyboard::Num6: keysym = XK_6; break;
- case Keyboard::Num7: keysym = XK_7; break;
- case Keyboard::Num8: keysym = XK_8; break;
- case Keyboard::Num9: keysym = XK_9; break;
- default: keysym = 0; break;
- }
+ return KeyboardImpl::isKeyPressed(key);
+}
- // Sanity checks
- if (key < 0 || key >= sf::Keyboard::KeyCount)
- return false;
- // Open a connection with the X server
- Display* display = OpenDisplay();
+////////////////////////////////////////////////////////////
+bool InputImpl::isKeyPressed(Keyboard::Scancode code)
+{
+ return KeyboardImpl::isKeyPressed(code);
+}
- // Convert to keycode
- KeyCode keycode = XKeysymToKeycode(display, keysym);
- if (keycode != 0)
- {
- // Get the whole keyboard state
- char keys[32];
- XQueryKeymap(display, keys);
- // Close the connection with the X server
- CloseDisplay(display);
+////////////////////////////////////////////////////////////
+Keyboard::Key InputImpl::localize(Keyboard::Scancode code)
+{
+ return KeyboardImpl::localize(code);
+}
- // Check our keycode
- return (keys[keycode / 8] & (1 << (keycode % 8))) != 0;
- }
- else
- {
- // Close the connection with the X server
- CloseDisplay(display);
- return false;
- }
+////////////////////////////////////////////////////////////
+Keyboard::Scancode InputImpl::delocalize(Keyboard::Key key)
+{
+ return KeyboardImpl::delocalize(key);
+}
+
+
+////////////////////////////////////////////////////////////
+String InputImpl::getDescription(Keyboard::Scancode code)
+{
+ return KeyboardImpl::getDescription(code);
}
@@ -203,6 +95,9 @@ bool InputImpl::isMouseButtonPressed(Mouse::Button button)
// Close the connection with the X server
CloseDisplay(display);
+ // Buttons 4 and 5 are the vertical wheel and 6 and 7 the horizontal wheel.
+ // There is no mask for buttons 8 and 9, so checking the state of buttons
+ // Mouse::XButton1 and Mouse::XButton2 is not supported.
switch (button)
{
case Mouse::Left: return buttons & Button1Mask;
@@ -240,7 +135,7 @@ Vector2i InputImpl::getMousePosition()
////////////////////////////////////////////////////////////
-Vector2i InputImpl::getMousePosition(const Window& relativeTo)
+Vector2i InputImpl::getMousePosition(const WindowBase& relativeTo)
{
WindowHandle handle = relativeTo.getSystemHandle();
if (handle)
@@ -284,7 +179,7 @@ void InputImpl::setMousePosition(const Vector2i& position)
////////////////////////////////////////////////////////////
-void InputImpl::setMousePosition(const Vector2i& position, const Window& relativeTo)
+void InputImpl::setMousePosition(const Vector2i& position, const WindowBase& relativeTo)
{
// Open a connection with the X server
Display* display = OpenDisplay();
@@ -318,7 +213,7 @@ Vector2i InputImpl::getTouchPosition(unsigned int /*finger*/)
////////////////////////////////////////////////////////////
-Vector2i InputImpl::getTouchPosition(unsigned int /*finger*/, const Window& /*relativeTo*/)
+Vector2i InputImpl::getTouchPosition(unsigned int /*finger*/, const WindowBase& /*relativeTo*/)
{
// Not applicable
return Vector2i();
diff --git a/src/SFML/Window/Unix/InputImpl.hpp b/src/SFML/Window/Unix/InputImpl.hpp
index 88dcc91..7c95a9c 100644
--- a/src/SFML/Window/Unix/InputImpl.hpp
+++ b/src/SFML/Window/Unix/InputImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -45,19 +45,37 @@ class InputImpl
public:
////////////////////////////////////////////////////////////
- /// \brief Check if a key is pressed
+ /// \copydoc sf::Keyboard::isKeyPressed(Key)
///
- /// \param key Key to check
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::isKeyPressed(Scancode)
///
- /// \return True if the key is pressed, false otherwise
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::localize
///
////////////////////////////////////////////////////////////
- static bool isKeyPressed(Keyboard::Key key);
+ static Keyboard::Key localize(Keyboard::Scancode code);
////////////////////////////////////////////////////////////
- /// \brief Show or hide the virtual keyboard
+ /// \copydoc sf::Keyboard::delocalize
///
- /// \param visible True to show, false to hide
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Scancode delocalize(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::getDescription
+ ///
+ ////////////////////////////////////////////////////////////
+ static String getDescription(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::setVirtualKeyboardVisible
///
////////////////////////////////////////////////////////////
static void setVirtualKeyboardVisible(bool visible);
@@ -95,7 +113,7 @@ public:
/// \return Current position of the mouse
///
////////////////////////////////////////////////////////////
- static Vector2i getMousePosition(const Window& relativeTo);
+ static Vector2i getMousePosition(const WindowBase& relativeTo);
////////////////////////////////////////////////////////////
/// \brief Set the current position of the mouse in desktop coordinates
@@ -120,7 +138,7 @@ public:
/// \param relativeTo Reference window
///
////////////////////////////////////////////////////////////
- static void setMousePosition(const Vector2i& position, const Window& relativeTo);
+ static void setMousePosition(const Vector2i& position, const WindowBase& relativeTo);
////////////////////////////////////////////////////////////
/// \brief Check if a touch event is currently down
@@ -157,7 +175,7 @@ public:
/// \return Current position of \a finger, or undefined if it's not down
///
////////////////////////////////////////////////////////////
- static Vector2i getTouchPosition(unsigned int finger, const Window& relativeTo);
+ static Vector2i getTouchPosition(unsigned int finger, const WindowBase& relativeTo);
};
} // namespace priv
diff --git a/src/SFML/Window/Unix/JoystickImpl.cpp b/src/SFML/Window/Unix/JoystickImpl.cpp
index 56c7234..9db7526 100644
--- a/src/SFML/Window/Unix/JoystickImpl.cpp
+++ b/src/SFML/Window/Unix/JoystickImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,6 +29,7 @@
#include <SFML/System/Err.hpp>
#include <linux/joystick.h>
#include <libudev.h>
+#include <poll.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
@@ -155,12 +156,12 @@ namespace
// If not mapped before and it got added, map it now
const char* syspath = udev_device_get_syspath(udevDevice);
- JoystickRecord record;
- record.deviceNode = devnode;
- record.systemPath = syspath ? syspath : "";
- record.plugged = true;
+ JoystickRecord newRecord;
+ newRecord.deviceNode = devnode;
+ newRecord.systemPath = syspath ? syspath : "";
+ newRecord.plugged = true;
- joystickList.push_back(record);
+ joystickList.push_back(newRecord);
}
else if (std::strstr(action, "remove"))
{
@@ -211,12 +212,12 @@ namespace
udev_list_entry_foreach(device, devices) {
const char* syspath = udev_list_entry_get_name(device);
- udev_device* udevDevice = udev_device_new_from_syspath(udevContext, syspath);
+ udev_device* newUdevDevice = udev_device_new_from_syspath(udevContext, syspath);
- if (udevDevice && isJoystick(udevDevice))
+ if (newUdevDevice && isJoystick(newUdevDevice))
{
// Since isJoystick returned true, this has to succeed
- const char* devnode = udev_device_get_devnode(udevDevice);
+ const char* devnode = udev_device_get_devnode(newUdevDevice);
JoystickList::iterator record;
@@ -233,16 +234,16 @@ namespace
// If not mapped before, map it now
if (record == joystickList.end())
{
- JoystickRecord record;
- record.deviceNode = devnode;
- record.systemPath = syspath;
- record.plugged = true;
+ JoystickRecord newRecord;
+ newRecord.deviceNode = devnode;
+ newRecord.systemPath = syspath;
+ newRecord.plugged = true;
- joystickList.push_back(record);
+ joystickList.push_back(newRecord);
}
}
- udev_device_unref(udevDevice);
+ udev_device_unref(newUdevDevice);
}
udev_enumerate_unref(udevEnumerator);
@@ -253,13 +254,9 @@ namespace
// This will not fail since we make sure udevMonitor is valid
int monitorFd = udev_monitor_get_fd(udevMonitor);
- fd_set descriptorSet;
- FD_ZERO(&descriptorSet);
- FD_SET(monitorFd, &descriptorSet);
- timeval timeout = {0, 0};
+ pollfd fds{ monitorFd, POLLIN, 0 };
- return (select(monitorFd + 1, &descriptorSet, NULL, NULL, &timeout) > 0) &&
- FD_ISSET(monitorFd, &descriptorSet);
+ return (poll(&fds, 1, 0) > 0) && ((fds.revents & POLLIN) != 0);
}
// Get a property value from a udev device
@@ -602,7 +599,7 @@ JoystickCaps JoystickImpl::getCapabilities() const
// Get the number of buttons
char buttonCount;
ioctl(m_file, JSIOCGBUTTONS, &buttonCount);
- caps.buttonCount = buttonCount;
+ caps.buttonCount = static_cast<unsigned int>(buttonCount);
if (caps.buttonCount > Joystick::ButtonCount)
caps.buttonCount = Joystick::ButtonCount;
@@ -649,7 +646,7 @@ JoystickState JoystickImpl::JoystickImpl::update()
// pop events from the joystick file
js_event joyState;
- int result = read(m_file, &joyState, sizeof(joyState));
+ ssize_t result = read(m_file, &joyState, sizeof(joyState));
while (result > 0)
{
switch (joyState.type & ~JS_EVENT_INIT)
diff --git a/src/SFML/Window/Unix/JoystickImpl.hpp b/src/SFML/Window/Unix/JoystickImpl.hpp
index f81e744..0ca45f1 100644
--- a/src/SFML/Window/Unix/JoystickImpl.hpp
+++ b/src/SFML/Window/Unix/JoystickImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Unix/KeySymToKeyMapping.cpp b/src/SFML/Window/Unix/KeySymToKeyMapping.cpp
new file mode 100644
index 0000000..7790e2e
--- /dev/null
+++ b/src/SFML/Window/Unix/KeySymToKeyMapping.cpp
@@ -0,0 +1,263 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Unix/KeySymToKeyMapping.hpp>
+#include <X11/keysym.h>
+
+namespace sf
+{
+namespace priv
+{
+
+////////////////////////////////////////////////////////////
+Keyboard::Key keySymToKey(KeySym symbol)
+{
+ switch (symbol)
+ {
+ case XK_Shift_L: return Keyboard::LShift;
+ case XK_Shift_R: return Keyboard::RShift;
+ case XK_Control_L: return Keyboard::LControl;
+ case XK_Control_R: return Keyboard::RControl;
+ case XK_Alt_L: return Keyboard::LAlt;
+ case XK_ISO_Level3_Shift:
+ case XK_Alt_R: return Keyboard::RAlt;
+ case XK_Super_L: return Keyboard::LSystem;
+ case XK_Super_R: return Keyboard::RSystem;
+ case XK_Menu: return Keyboard::Menu;
+ case XK_Escape: return Keyboard::Escape;
+ case XK_semicolon: return Keyboard::SemiColon;
+ case XK_slash: return Keyboard::Slash;
+ case XK_equal: return Keyboard::Equal;
+ case XK_minus: return Keyboard::Dash;
+ case XK_bracketleft: return Keyboard::LBracket;
+ case XK_bracketright: return Keyboard::RBracket;
+ case XK_comma: return Keyboard::Comma;
+ case XK_period: return Keyboard::Period;
+ case XK_apostrophe: return Keyboard::Quote;
+ case XK_backslash: return Keyboard::BackSlash;
+ case XK_grave: return Keyboard::Grave;
+ case XK_space: return Keyboard::Space;
+ case XK_Return: return Keyboard::Return;
+ case XK_KP_Enter: return Keyboard::Return;
+ case XK_BackSpace: return Keyboard::BackSpace;
+ case XK_Tab: return Keyboard::Tab;
+ case XK_Prior: return Keyboard::PageUp;
+ case XK_Next: return Keyboard::PageDown;
+ case XK_End: return Keyboard::End;
+ case XK_Home: return Keyboard::Home;
+ case XK_Insert: return Keyboard::Insert;
+ case XK_Delete: return Keyboard::Delete;
+ case XK_KP_Add: return Keyboard::Add;
+ case XK_KP_Subtract: return Keyboard::Subtract;
+ case XK_KP_Multiply: return Keyboard::Multiply;
+ case XK_KP_Divide: return Keyboard::Divide;
+ case XK_KP_Delete: return Keyboard::Period;
+ case XK_Pause: return Keyboard::Pause;
+ case XK_F1: return Keyboard::F1;
+ case XK_F2: return Keyboard::F2;
+ case XK_F3: return Keyboard::F3;
+ case XK_F4: return Keyboard::F4;
+ case XK_F5: return Keyboard::F5;
+ case XK_F6: return Keyboard::F6;
+ case XK_F7: return Keyboard::F7;
+ case XK_F8: return Keyboard::F8;
+ case XK_F9: return Keyboard::F9;
+ case XK_F10: return Keyboard::F10;
+ case XK_F11: return Keyboard::F11;
+ case XK_F12: return Keyboard::F12;
+ case XK_F13: return Keyboard::F13;
+ case XK_F14: return Keyboard::F14;
+ case XK_F15: return Keyboard::F15;
+ case XK_Left: return Keyboard::Left;
+ case XK_Right: return Keyboard::Right;
+ case XK_Up: return Keyboard::Up;
+ case XK_Down: return Keyboard::Down;
+ case XK_KP_Insert: return Keyboard::Numpad0;
+ case XK_KP_End: return Keyboard::Numpad1;
+ case XK_KP_Down: return Keyboard::Numpad2;
+ case XK_KP_Page_Down: return Keyboard::Numpad3;
+ case XK_KP_Left: return Keyboard::Numpad4;
+ case XK_KP_Begin: return Keyboard::Numpad5;
+ case XK_KP_Right: return Keyboard::Numpad6;
+ case XK_KP_Home: return Keyboard::Numpad7;
+ case XK_KP_Up: return Keyboard::Numpad8;
+ case XK_KP_Page_Up: return Keyboard::Numpad9;
+ case XK_a: return Keyboard::A;
+ case XK_b: return Keyboard::B;
+ case XK_c: return Keyboard::C;
+ case XK_d: return Keyboard::D;
+ case XK_e: return Keyboard::E;
+ case XK_f: return Keyboard::F;
+ case XK_g: return Keyboard::G;
+ case XK_h: return Keyboard::H;
+ case XK_i: return Keyboard::I;
+ case XK_j: return Keyboard::J;
+ case XK_k: return Keyboard::K;
+ case XK_l: return Keyboard::L;
+ case XK_m: return Keyboard::M;
+ case XK_n: return Keyboard::N;
+ case XK_o: return Keyboard::O;
+ case XK_p: return Keyboard::P;
+ case XK_q: return Keyboard::Q;
+ case XK_r: return Keyboard::R;
+ case XK_s: return Keyboard::S;
+ case XK_t: return Keyboard::T;
+ case XK_u: return Keyboard::U;
+ case XK_v: return Keyboard::V;
+ case XK_w: return Keyboard::W;
+ case XK_x: return Keyboard::X;
+ case XK_y: return Keyboard::Y;
+ case XK_z: return Keyboard::Z;
+ case XK_0: return Keyboard::Num0;
+ case XK_1: return Keyboard::Num1;
+ case XK_2: return Keyboard::Num2;
+ case XK_3: return Keyboard::Num3;
+ case XK_4: return Keyboard::Num4;
+ case XK_5: return Keyboard::Num5;
+ case XK_6: return Keyboard::Num6;
+ case XK_7: return Keyboard::Num7;
+ case XK_8: return Keyboard::Num8;
+ case XK_9: return Keyboard::Num9;
+ default: return Keyboard::Unknown;
+ }
+}
+
+
+////////////////////////////////////////////////////////////
+KeySym keyToKeySym(Keyboard::Key key)
+{
+ switch (key)
+ {
+ case Keyboard::LShift: return XK_Shift_L;
+ case Keyboard::RShift: return XK_Shift_R;
+ case Keyboard::LControl: return XK_Control_L;
+ case Keyboard::RControl: return XK_Control_R;
+ case Keyboard::LAlt: return XK_Alt_L;
+ case Keyboard::RAlt: return XK_Alt_R;
+ case Keyboard::LSystem: return XK_Super_L;
+ case Keyboard::RSystem: return XK_Super_R;
+ case Keyboard::Menu: return XK_Menu;
+ case Keyboard::Escape: return XK_Escape;
+ case Keyboard::SemiColon: return XK_semicolon;
+ case Keyboard::Slash: return XK_slash;
+ case Keyboard::Equal: return XK_equal;
+ case Keyboard::Dash: return XK_minus;
+ case Keyboard::LBracket: return XK_bracketleft;
+ case Keyboard::RBracket: return XK_bracketright;
+ case Keyboard::Comma: return XK_comma;
+ case Keyboard::Period: return XK_period;
+ case Keyboard::Quote: return XK_apostrophe;
+ case Keyboard::BackSlash: return XK_backslash;
+ case Keyboard::Grave: return XK_grave;
+ case Keyboard::Space: return XK_space;
+ case Keyboard::Return: return XK_Return;
+ case Keyboard::BackSpace: return XK_BackSpace;
+ case Keyboard::Tab: return XK_Tab;
+ case Keyboard::PageUp: return XK_Prior;
+ case Keyboard::PageDown: return XK_Next;
+ case Keyboard::End: return XK_End;
+ case Keyboard::Home: return XK_Home;
+ case Keyboard::Insert: return XK_Insert;
+ case Keyboard::Delete: return XK_Delete;
+ case Keyboard::Add: return XK_KP_Add;
+ case Keyboard::Subtract: return XK_KP_Subtract;
+ case Keyboard::Multiply: return XK_KP_Multiply;
+ case Keyboard::Divide: return XK_KP_Divide;
+ case Keyboard::Pause: return XK_Pause;
+ case Keyboard::F1: return XK_F1;
+ case Keyboard::F2: return XK_F2;
+ case Keyboard::F3: return XK_F3;
+ case Keyboard::F4: return XK_F4;
+ case Keyboard::F5: return XK_F5;
+ case Keyboard::F6: return XK_F6;
+ case Keyboard::F7: return XK_F7;
+ case Keyboard::F8: return XK_F8;
+ case Keyboard::F9: return XK_F9;
+ case Keyboard::F10: return XK_F10;
+ case Keyboard::F11: return XK_F11;
+ case Keyboard::F12: return XK_F12;
+ case Keyboard::F13: return XK_F13;
+ case Keyboard::F14: return XK_F14;
+ case Keyboard::F15: return XK_F15;
+ case Keyboard::Left: return XK_Left;
+ case Keyboard::Right: return XK_Right;
+ case Keyboard::Up: return XK_Up;
+ case Keyboard::Down: return XK_Down;
+ case Keyboard::Numpad0: return XK_KP_Insert;
+ case Keyboard::Numpad1: return XK_KP_End;
+ case Keyboard::Numpad2: return XK_KP_Down;
+ case Keyboard::Numpad3: return XK_KP_Page_Down;
+ case Keyboard::Numpad4: return XK_KP_Left;
+ case Keyboard::Numpad5: return XK_KP_Begin;
+ case Keyboard::Numpad6: return XK_KP_Right;
+ case Keyboard::Numpad7: return XK_KP_Home;
+ case Keyboard::Numpad8: return XK_KP_Up;
+ case Keyboard::Numpad9: return XK_KP_Page_Up;
+ case Keyboard::A: return XK_a;
+ case Keyboard::B: return XK_b;
+ case Keyboard::C: return XK_c;
+ case Keyboard::D: return XK_d;
+ case Keyboard::E: return XK_e;
+ case Keyboard::F: return XK_f;
+ case Keyboard::G: return XK_g;
+ case Keyboard::H: return XK_h;
+ case Keyboard::I: return XK_i;
+ case Keyboard::J: return XK_j;
+ case Keyboard::K: return XK_k;
+ case Keyboard::L: return XK_l;
+ case Keyboard::M: return XK_m;
+ case Keyboard::N: return XK_n;
+ case Keyboard::O: return XK_o;
+ case Keyboard::P: return XK_p;
+ case Keyboard::Q: return XK_q;
+ case Keyboard::R: return XK_r;
+ case Keyboard::S: return XK_s;
+ case Keyboard::T: return XK_t;
+ case Keyboard::U: return XK_u;
+ case Keyboard::V: return XK_v;
+ case Keyboard::W: return XK_w;
+ case Keyboard::X: return XK_x;
+ case Keyboard::Y: return XK_y;
+ case Keyboard::Z: return XK_z;
+ case Keyboard::Num0: return XK_0;
+ case Keyboard::Num1: return XK_1;
+ case Keyboard::Num2: return XK_2;
+ case Keyboard::Num3: return XK_3;
+ case Keyboard::Num4: return XK_4;
+ case Keyboard::Num5: return XK_5;
+ case Keyboard::Num6: return XK_6;
+ case Keyboard::Num7: return XK_7;
+ case Keyboard::Num8: return XK_8;
+ case Keyboard::Num9: return XK_9;
+ default: return NoSymbol;
+ }
+}
+
+} // namespace priv
+
+} // namespace sf
+
diff --git a/src/SFML/Window/Unix/KeySymToKeyMapping.hpp b/src/SFML/Window/Unix/KeySymToKeyMapping.hpp
new file mode 100644
index 0000000..2c2a7f4
--- /dev/null
+++ b/src/SFML/Window/Unix/KeySymToKeyMapping.hpp
@@ -0,0 +1,63 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_KEYSYMTOKEYMAPPING_HPP
+#define SFML_KEYSYMTOKEYMAPPING_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Keyboard.hpp> // sf::Keyboard::Key
+#include <X11/X.h> // KeySym
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+/// \brief Convert X11 KeySym to sf::Keyboard::Key
+///
+/// \param symbol X11 KeySym
+///
+/// \return The corresponding sf::Keyboard::Key
+///
+////////////////////////////////////////////////////////////
+Keyboard::Key keySymToKey(KeySym symbol);
+
+
+////////////////////////////////////////////////////////////
+/// \brief Convert sf::Keyboard::Key to X11 KeySym
+///
+/// \param key X11 sf::Keyboard::Key
+///
+/// \return The corresponding X11 KeySym
+///
+////////////////////////////////////////////////////////////
+KeySym keyToKeySym(Keyboard::Key key);
+
+} // namespace priv
+
+} // namespace sf
+
+#endif // SFML_KEYSYMTOKEYMAPPING_HPP
diff --git a/src/SFML/Window/Unix/KeySymToUnicodeMapping.cpp b/src/SFML/Window/Unix/KeySymToUnicodeMapping.cpp
new file mode 100644
index 0000000..1ffda9f
--- /dev/null
+++ b/src/SFML/Window/Unix/KeySymToUnicodeMapping.cpp
@@ -0,0 +1,1403 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Unix/KeySymToUnicodeMapping.hpp>
+
+namespace sf
+{
+namespace priv
+{
+
+Uint32 keysymToUnicode(KeySym keysym)
+{
+ switch (keysym)
+ {
+ case 0xff08: return 0x0008; // BackSpace
+ case 0xff89: return 0x0009; // KP_Tab
+ case 0xff09: return 0x0009; // Tab
+ case 0xff0a: return 0x000a; // Linefeed
+ case 0xff0b: return 0x000b; // Clear
+ case 0xff8d: return 0x000d; // KP_Enter
+ case 0xff0d: return 0x000d; // Return
+ case 0xff13: return 0x0013; // Pause
+ case 0xff14: return 0x0014; // Scroll_Lock
+ case 0xff15: return 0x0015; // Sys_Req
+ case 0xff1b: return 0x001b; // Escape
+ case 0xff80: return 0x0020; // KP_Space
+ case 0x0020: return 0x0020; // space
+ case 0x0021: return 0x0021; // exclam
+ case 0x0022: return 0x0022; // quotedbl
+ case 0x0023: return 0x0023; // numbersign
+ case 0x0024: return 0x0024; // dollar
+ case 0x0025: return 0x0025; // percent
+ case 0x0026: return 0x0026; // ampersand
+ case 0x0027: return 0x0027; // quoteright
+ case 0x14a5: return 0x0028; // Armenian_parenleft
+ case 0x0028: return 0x0028; // parenleft
+ case 0x14a4: return 0x0029; // Armenian_parenright
+ case 0x0029: return 0x0029; // parenright
+ case 0xffaa: return 0x002a; // KP_Multiply
+ case 0x002a: return 0x002a; // asterisk
+ case 0xffab: return 0x002b; // KP_Add
+ case 0x002b: return 0x002b; // plus
+ case 0x14ab: return 0x002c; // Armenian_comma
+ case 0xffac: return 0x002c; // KP_Separator
+ case 0x002c: return 0x002c; // comma
+ case 0xffad: return 0x002d; // KP_Subtract
+ case 0x002d: return 0x002d; // minus
+ case 0x14a9: return 0x002e; // Armenian_mijaket
+ case 0xffae: return 0x002e; // KP_Decimal
+ case 0x0abd: return 0x002e; // decimalpoint
+ case 0x002e: return 0x002e; // period
+ case 0xffaf: return 0x002f; // KP_Divide
+ case 0x002f: return 0x002f; // slash
+ case 0x0030: return 0x0030; // 0
+ case 0xffb0: return 0x0030; // KP_0
+ case 0x0031: return 0x0031; // 1
+ case 0xffb1: return 0x0031; // KP_1
+ case 0x0032: return 0x0032; // 2
+ case 0xffb2: return 0x0032; // KP_2
+ case 0x0033: return 0x0033; // 3
+ case 0xffb3: return 0x0033; // KP_3
+ case 0x0034: return 0x0034; // 4
+ case 0xffb4: return 0x0034; // KP_4
+ case 0x0035: return 0x0035; // 5
+ case 0xffb5: return 0x0035; // KP_5
+ case 0x0036: return 0x0036; // 6
+ case 0xffb6: return 0x0036; // KP_6
+ case 0x0037: return 0x0037; // 7
+ case 0xffb7: return 0x0037; // KP_7
+ case 0x0038: return 0x0038; // 8
+ case 0xffb8: return 0x0038; // KP_8
+ case 0x0039: return 0x0039; // 9
+ case 0xffb9: return 0x0039; // KP_9
+ case 0x003a: return 0x003a; // colon
+ case 0x003b: return 0x003b; // semicolon
+ case 0x0ba3: return 0x003c; // leftcaret
+ case 0x003c: return 0x003c; // less
+ case 0xffbd: return 0x003d; // KP_Equal
+ case 0x003d: return 0x003d; // equal
+ case 0x003e: return 0x003e; // greater
+ case 0x0ba6: return 0x003e; // rightcaret
+ case 0x003f: return 0x003f; // question
+ case 0x0040: return 0x0040; // at
+ case 0x0041: return 0x0041; // A
+ case 0x0042: return 0x0042; // B
+ case 0x0043: return 0x0043; // C
+ case 0x0044: return 0x0044; // D
+ case 0x0045: return 0x0045; // E
+ case 0x0046: return 0x0046; // F
+ case 0x0047: return 0x0047; // G
+ case 0x0048: return 0x0048; // H
+ case 0x0049: return 0x0049; // I
+ case 0x004a: return 0x004a; // J
+ case 0x004b: return 0x004b; // K
+ case 0x004c: return 0x004c; // L
+ case 0x004d: return 0x004d; // M
+ case 0x004e: return 0x004e; // N
+ case 0x004f: return 0x004f; // O
+ case 0x0050: return 0x0050; // P
+ case 0x0051: return 0x0051; // Q
+ case 0x0052: return 0x0052; // R
+ case 0x0053: return 0x0053; // S
+ case 0x0054: return 0x0054; // T
+ case 0x0055: return 0x0055; // U
+ case 0x0056: return 0x0056; // V
+ case 0x0057: return 0x0057; // W
+ case 0x0058: return 0x0058; // X
+ case 0x0059: return 0x0059; // Y
+ case 0x005a: return 0x005a; // Z
+ case 0x005b: return 0x005b; // bracketleft
+ case 0x005c: return 0x005c; // backslash
+ case 0x005d: return 0x005d; // bracketright
+ case 0x005e: return 0x005e; // asciicircum
+ case 0x0bc6: return 0x005f; // underbar
+ case 0x005f: return 0x005f; // underscore
+ case 0x0060: return 0x0060; // quoteleft
+ case 0x0061: return 0x0061; // a
+ case 0x0062: return 0x0062; // b
+ case 0x0063: return 0x0063; // c
+ case 0x0064: return 0x0064; // d
+ case 0x0065: return 0x0065; // e
+ case 0x0066: return 0x0066; // f
+ case 0x0067: return 0x0067; // g
+ case 0x0068: return 0x0068; // h
+ case 0x0069: return 0x0069; // i
+ case 0x006a: return 0x006a; // j
+ case 0x006b: return 0x006b; // k
+ case 0x006c: return 0x006c; // l
+ case 0x006d: return 0x006d; // m
+ case 0x006e: return 0x006e; // n
+ case 0x006f: return 0x006f; // o
+ case 0x0070: return 0x0070; // p
+ case 0x0071: return 0x0071; // q
+ case 0x0072: return 0x0072; // r
+ case 0x0073: return 0x0073; // s
+ case 0x0074: return 0x0074; // t
+ case 0x0075: return 0x0075; // u
+ case 0x0076: return 0x0076; // v
+ case 0x0077: return 0x0077; // w
+ case 0x0078: return 0x0078; // x
+ case 0x0079: return 0x0079; // y
+ case 0x007a: return 0x007a; // z
+ case 0x007b: return 0x007b; // braceleft
+ case 0x007c: return 0x007c; // bar
+ case 0x007d: return 0x007d; // braceright
+ case 0x007e: return 0x007e; // asciitilde
+ case 0x00a0: return 0x00a0; // nobreakspace
+ case 0x00a1: return 0x00a1; // exclamdown
+ case 0x00a2: return 0x00a2; // cent
+ case 0x00a3: return 0x00a3; // sterling
+ case 0x00a4: return 0x00a4; // currency
+ case 0x00a5: return 0x00a5; // yen
+ case 0x00a6: return 0x00a6; // brokenbar
+ case 0x14ff: return 0x00a7; // Armenian_section_sign
+ case 0x00a7: return 0x00a7; // section
+ case 0x00a8: return 0x00a8; // diaeresis
+ case 0x00a9: return 0x00a9; // copyright
+ case 0x00aa: return 0x00aa; // ordfeminine
+ case 0x14a7: return 0x00ab; // Armenian_guillemotleft
+ case 0x00ab: return 0x00ab; // guillemotleft
+ case 0x00ac: return 0x00ac; // notsign
+ case 0x00ad: return 0x00ad; // hyphen
+ case 0x00ae: return 0x00ae; // registered
+ case 0x00af: return 0x00af; // macron
+ case 0x0bc0: return 0x00af; // overbar
+ case 0x00b0: return 0x00b0; // degree
+ case 0x00b1: return 0x00b1; // plusminus
+ case 0x00b2: return 0x00b2; // twosuperior
+ case 0x00b3: return 0x00b3; // threesuperior
+ case 0x00b4: return 0x00b4; // acute
+ case 0x00b5: return 0x00b5; // mu
+ case 0x00b6: return 0x00b6; // paragraph
+ case 0x00b7: return 0x00b7; // periodcentered
+ case 0x00b8: return 0x00b8; // cedilla
+ case 0x00b9: return 0x00b9; // onesuperior
+ case 0x00ba: return 0x00ba; // masculine
+ case 0x14a6: return 0x00bb; // Armenian_guillemotright
+ case 0x00bb: return 0x00bb; // guillemotright
+ case 0x00bc: return 0x00bc; // onequarter
+ case 0x00bd: return 0x00bd; // onehalf
+ case 0x00be: return 0x00be; // threequarters
+ case 0x00bf: return 0x00bf; // questiondown
+ case 0x00c0: return 0x00c0; // Agrave
+ case 0x00c1: return 0x00c1; // Aacute
+ case 0x00c2: return 0x00c2; // Acircumflex
+ case 0x00c3: return 0x00c3; // Atilde
+ case 0x00c4: return 0x00c4; // Adiaeresis
+ case 0x00c5: return 0x00c5; // Aring
+ case 0x00c6: return 0x00c6; // AE
+ case 0x00c7: return 0x00c7; // Ccedilla
+ case 0x00c8: return 0x00c8; // Egrave
+ case 0x00c9: return 0x00c9; // Eacute
+ case 0x00ca: return 0x00ca; // Ecircumflex
+ case 0x00cb: return 0x00cb; // Ediaeresis
+ case 0x00cc: return 0x00cc; // Igrave
+ case 0x00cd: return 0x00cd; // Iacute
+ case 0x00ce: return 0x00ce; // Icircumflex
+ case 0x00cf: return 0x00cf; // Idiaeresis
+ case 0x00d0: return 0x00d0; // Eth
+ case 0x00d1: return 0x00d1; // Ntilde
+ case 0x00d2: return 0x00d2; // Ograve
+ case 0x00d3: return 0x00d3; // Oacute
+ case 0x00d4: return 0x00d4; // Ocircumflex
+ case 0x00d5: return 0x00d5; // Otilde
+ case 0x00d6: return 0x00d6; // Odiaeresis
+ case 0x00d7: return 0x00d7; // multiply
+ case 0x00d8: return 0x00d8; // Ooblique
+ case 0x00d9: return 0x00d9; // Ugrave
+ case 0x00da: return 0x00da; // Uacute
+ case 0x00db: return 0x00db; // Ucircumflex
+ case 0x00dc: return 0x00dc; // Udiaeresis
+ case 0x00dd: return 0x00dd; // Yacute
+ case 0x00de: return 0x00de; // Thorn
+ case 0x00df: return 0x00df; // ssharp
+ case 0x00e0: return 0x00e0; // agrave
+ case 0x00e1: return 0x00e1; // aacute
+ case 0x00e2: return 0x00e2; // acircumflex
+ case 0x00e3: return 0x00e3; // atilde
+ case 0x00e4: return 0x00e4; // adiaeresis
+ case 0x00e5: return 0x00e5; // aring
+ case 0x00e6: return 0x00e6; // ae
+ case 0x00e7: return 0x00e7; // ccedilla
+ case 0x00e8: return 0x00e8; // egrave
+ case 0x00e9: return 0x00e9; // eacute
+ case 0x00ea: return 0x00ea; // ecircumflex
+ case 0x00eb: return 0x00eb; // ediaeresis
+ case 0x00ec: return 0x00ec; // igrave
+ case 0x00ed: return 0x00ed; // iacute
+ case 0x00ee: return 0x00ee; // icircumflex
+ case 0x00ef: return 0x00ef; // idiaeresis
+ case 0x00f0: return 0x00f0; // eth
+ case 0x00f1: return 0x00f1; // ntilde
+ case 0x00f2: return 0x00f2; // ograve
+ case 0x00f3: return 0x00f3; // oacute
+ case 0x00f4: return 0x00f4; // ocircumflex
+ case 0x00f5: return 0x00f5; // otilde
+ case 0x00f6: return 0x00f6; // odiaeresis
+ case 0x00f7: return 0x00f7; // division
+ case 0x00f8: return 0x00f8; // oslash
+ case 0x00f9: return 0x00f9; // ugrave
+ case 0x00fa: return 0x00fa; // uacute
+ case 0x00fb: return 0x00fb; // ucircumflex
+ case 0x00fc: return 0x00fc; // udiaeresis
+ case 0x00fd: return 0x00fd; // yacute
+ case 0x00fe: return 0x00fe; // thorn
+ case 0x00ff: return 0x00ff; // ydiaeresis
+ case 0x03c0: return 0x0100; // Amacron
+ case 0x03e0: return 0x0101; // amacron
+ case 0x01c3: return 0x0102; // Abreve
+ case 0x01e3: return 0x0103; // abreve
+ case 0x01a1: return 0x0104; // Aogonek
+ case 0x01b1: return 0x0105; // aogonek
+ case 0x01c6: return 0x0106; // Cacute
+ case 0x01e6: return 0x0107; // cacute
+ case 0x02c6: return 0x0108; // Ccircumflex
+ case 0x02e6: return 0x0109; // ccircumflex
+ case 0x02c5: return 0x010a; // Cabovedot
+ case 0x02e5: return 0x010b; // cabovedot
+ case 0x01c8: return 0x010c; // Ccaron
+ case 0x01e8: return 0x010d; // ccaron
+ case 0x01cf: return 0x010e; // Dcaron
+ case 0x01ef: return 0x010f; // dcaron
+ case 0x01d0: return 0x0110; // Dstroke
+ case 0x01f0: return 0x0111; // dstroke
+ case 0x03aa: return 0x0112; // Emacron
+ case 0x03ba: return 0x0113; // emacron
+ case 0x03cc: return 0x0116; // Eabovedot
+ case 0x03ec: return 0x0117; // eabovedot
+ case 0x01ca: return 0x0118; // Eogonek
+ case 0x01ea: return 0x0119; // eogonek
+ case 0x01cc: return 0x011a; // Ecaron
+ case 0x01ec: return 0x011b; // ecaron
+ case 0x02d8: return 0x011c; // Gcircumflex
+ case 0x02f8: return 0x011d; // gcircumflex
+ case 0x02ab: return 0x011e; // Gbreve
+ case 0x02bb: return 0x011f; // gbreve
+ case 0x02d5: return 0x0120; // Gabovedot
+ case 0x02f5: return 0x0121; // gabovedot
+ case 0x03ab: return 0x0122; // Gcedilla
+ case 0x03bb: return 0x0123; // gcedilla
+ case 0x02a6: return 0x0124; // Hcircumflex
+ case 0x02b6: return 0x0125; // hcircumflex
+ case 0x02a1: return 0x0126; // Hstroke
+ case 0x02b1: return 0x0127; // hstroke
+ case 0x03a5: return 0x0128; // Itilde
+ case 0x03b5: return 0x0129; // itilde
+ case 0x03cf: return 0x012a; // Imacron
+ case 0x03ef: return 0x012b; // imacron
+ case 0x16a6: return 0x012c; // Ibreve
+ case 0x16b6: return 0x012d; // ibreve
+ case 0x03c7: return 0x012e; // Iogonek
+ case 0x03e7: return 0x012f; // iogonek
+ case 0x02a9: return 0x0130; // Iabovedot
+ case 0x02b9: return 0x0131; // idotless
+ case 0x02ac: return 0x0134; // Jcircumflex
+ case 0x02bc: return 0x0135; // jcircumflex
+ case 0x03d3: return 0x0136; // Kcedilla
+ case 0x03f3: return 0x0137; // kcedilla
+ case 0x03a2: return 0x0138; // kra
+ case 0x01c5: return 0x0139; // Lacute
+ case 0x01e5: return 0x013a; // lacute
+ case 0x03a6: return 0x013b; // Lcedilla
+ case 0x03b6: return 0x013c; // lcedilla
+ case 0x01a5: return 0x013d; // Lcaron
+ case 0x01b5: return 0x013e; // lcaron
+ case 0x01a3: return 0x0141; // Lstroke
+ case 0x01b3: return 0x0142; // lstroke
+ case 0x01d1: return 0x0143; // Nacute
+ case 0x01f1: return 0x0144; // nacute
+ case 0x03d1: return 0x0145; // Ncedilla
+ case 0x03f1: return 0x0146; // ncedilla
+ case 0x01d2: return 0x0147; // Ncaron
+ case 0x01f2: return 0x0148; // ncaron
+ case 0x03bd: return 0x014a; // ENG
+ case 0x03bf: return 0x014b; // eng
+ case 0x03d2: return 0x014c; // Omacron
+ case 0x03f2: return 0x014d; // omacron
+ case 0x01d5: return 0x0150; // Odoubleacute
+ case 0x01f5: return 0x0151; // odoubleacute
+ case 0x13bc: return 0x0152; // OE
+ case 0x13bd: return 0x0153; // oe
+ case 0x01c0: return 0x0154; // Racute
+ case 0x01e0: return 0x0155; // racute
+ case 0x03a3: return 0x0156; // Rcedilla
+ case 0x03b3: return 0x0157; // rcedilla
+ case 0x01d8: return 0x0158; // Rcaron
+ case 0x01f8: return 0x0159; // rcaron
+ case 0x01a6: return 0x015a; // Sacute
+ case 0x01b6: return 0x015b; // sacute
+ case 0x02de: return 0x015c; // Scircumflex
+ case 0x02fe: return 0x015d; // scircumflex
+ case 0x01aa: return 0x015e; // Scedilla
+ case 0x01ba: return 0x015f; // scedilla
+ case 0x01a9: return 0x0160; // Scaron
+ case 0x01b9: return 0x0161; // scaron
+ case 0x01de: return 0x0162; // Tcedilla
+ case 0x01fe: return 0x0163; // tcedilla
+ case 0x01ab: return 0x0164; // Tcaron
+ case 0x01bb: return 0x0165; // tcaron
+ case 0x03ac: return 0x0166; // Tslash
+ case 0x03bc: return 0x0167; // tslash
+ case 0x03dd: return 0x0168; // Utilde
+ case 0x03fd: return 0x0169; // utilde
+ case 0x03de: return 0x016a; // Umacron
+ case 0x03fe: return 0x016b; // umacron
+ case 0x02dd: return 0x016c; // Ubreve
+ case 0x02fd: return 0x016d; // ubreve
+ case 0x01d9: return 0x016e; // Uring
+ case 0x01f9: return 0x016f; // uring
+ case 0x01db: return 0x0170; // Udoubleacute
+ case 0x01fb: return 0x0171; // udoubleacute
+ case 0x03d9: return 0x0172; // Uogonek
+ case 0x03f9: return 0x0173; // uogonek
+ case 0x12d0: return 0x0174; // Wcircumflex
+ case 0x12f0: return 0x0175; // wcircumflex
+ case 0x12de: return 0x0176; // Ycircumflex
+ case 0x12fe: return 0x0177; // ycircumflex
+ case 0x13be: return 0x0178; // Ydiaeresis
+ case 0x01ac: return 0x0179; // Zacute
+ case 0x01bc: return 0x017a; // zacute
+ case 0x01af: return 0x017b; // Zabovedot
+ case 0x01bf: return 0x017c; // zabovedot
+ case 0x01ae: return 0x017d; // Zcaron
+ case 0x01be: return 0x017e; // zcaron
+ case 0x16c6: return 0x018f; // SCHWA
+ case 0x08f6: return 0x0192; // function
+ case 0x16af: return 0x019f; // Obarred
+ case 0x1efa: return 0x01a0; // Ohorn
+ case 0x1efb: return 0x01a1; // ohorn
+ case 0x1efc: return 0x01af; // Uhorn
+ case 0x1efd: return 0x01b0; // uhorn
+ case 0x16a9: return 0x01b5; // Zstroke
+ case 0x16b9: return 0x01b6; // zstroke
+ case 0x16bd: return 0x01d2; // ocaron
+ case 0x16aa: return 0x01e6; // Gcaron
+ case 0x16ba: return 0x01e7; // gcaron
+ case 0x16f6: return 0x0259; // schwa
+ case 0x16bf: return 0x0275; // obarred
+ case 0x01b7: return 0x02c7; // caron
+ case 0x01a2: return 0x02d8; // breve
+ case 0x01ff: return 0x02d9; // abovedot
+ case 0x01b2: return 0x02db; // ogonek
+ case 0x01bd: return 0x02dd; // doubleacute
+
+ // Edited to map dead keys to non-combining characters when possible.
+ // The original combining diacritical marks are shown in comments.
+ case 0x1ef2: return 0x0060; // combining_grave (0x0300)
+ case 0xfe50: return 0x0060; // dead_grave (0x0300)
+ case 0x1ef3: return 0x00b4; // combining_acute (0x0301)
+ case 0xfe51: return 0x00b4; // dead_acute (0x0301)
+ case 0xfe52: return 0x005e; // dead_circumflex (0x0302)
+ case 0x1e9f: return 0x007e; // combining_tilde (0x0303)
+ case 0xfe53: return 0x007e; // dead_tilde (0x0303)
+ case 0xfe54: return 0x00af; // dead_macron (0x0304)
+ case 0xfe55: return 0x02d8; // dead_breve (0x0306)
+ case 0xfe56: return 0x02d9; // dead_abovedot (0x0307)
+ case 0xfe57: return 0x00a8; // dead_diaeresis (0x0308)
+ case 0x1efe: return 0x0309; // combining_hook
+ case 0xfe61: return 0x0309; // dead_hook
+ case 0xfe58: return 0x02da; // dead_abovering (0x030a)
+ case 0xfe59: return 0x02dd; // dead_doubleacute (0x030b)
+ case 0xfe5a: return 0x02c7; // dead_caron (0x030c)
+ case 0xfe62: return 0x031b; // dead_horn
+ case 0x1eff: return 0x0323; // combining_belowdot
+ case 0xfe60: return 0x0323; // dead_belowdot
+ case 0xfe5b: return 0x00b8; // dead_cedilla (0x0327)
+ case 0xfe5c: return 0x02db; // dead_ogonek (0x0328)
+ case 0xfe5d: return 0x037a; // dead_iota (0x0345)
+
+ case 0x07ae: return 0x0385; // Greek_accentdieresis
+ case 0x07a1: return 0x0386; // Greek_ALPHAaccent
+ case 0x07a2: return 0x0388; // Greek_EPSILONaccent
+ case 0x07a3: return 0x0389; // Greek_ETAaccent
+ case 0x07a4: return 0x038a; // Greek_IOTAaccent
+ case 0x07a7: return 0x038c; // Greek_OMICRONaccent
+ case 0x07a8: return 0x038e; // Greek_UPSILONaccent
+ case 0x07ab: return 0x038f; // Greek_OMEGAaccent
+ case 0x07b6: return 0x0390; // Greek_iotaaccentdieresis
+ case 0x07c1: return 0x0391; // Greek_ALPHA
+ case 0x07c2: return 0x0392; // Greek_BETA
+ case 0x07c3: return 0x0393; // Greek_GAMMA
+ case 0x07c4: return 0x0394; // Greek_DELTA
+ case 0x07c5: return 0x0395; // Greek_EPSILON
+ case 0x07c6: return 0x0396; // Greek_ZETA
+ case 0x07c7: return 0x0397; // Greek_ETA
+ case 0x07c8: return 0x0398; // Greek_THETA
+ case 0x07c9: return 0x0399; // Greek_IOTA
+ case 0x07ca: return 0x039a; // Greek_KAPPA
+ case 0x07cb: return 0x039b; // Greek_LAMDA
+ case 0x07cc: return 0x039c; // Greek_MU
+ case 0x07cd: return 0x039d; // Greek_NU
+ case 0x07ce: return 0x039e; // Greek_XI
+ case 0x07cf: return 0x039f; // Greek_OMICRON
+ case 0x07d0: return 0x03a0; // Greek_PI
+ case 0x07d1: return 0x03a1; // Greek_RHO
+ case 0x07d2: return 0x03a3; // Greek_SIGMA
+ case 0x07d4: return 0x03a4; // Greek_TAU
+ case 0x07d5: return 0x03a5; // Greek_UPSILON
+ case 0x07d6: return 0x03a6; // Greek_PHI
+ case 0x07d7: return 0x03a7; // Greek_CHI
+ case 0x07d8: return 0x03a8; // Greek_PSI
+ case 0x07d9: return 0x03a9; // Greek_OMEGA
+ case 0x07a5: return 0x03aa; // Greek_IOTAdiaeresis
+ case 0x07a9: return 0x03ab; // Greek_UPSILONdieresis
+ case 0x07b1: return 0x03ac; // Greek_alphaaccent
+ case 0x07b2: return 0x03ad; // Greek_epsilonaccent
+ case 0x07b3: return 0x03ae; // Greek_etaaccent
+ case 0x07b4: return 0x03af; // Greek_iotaaccent
+ case 0x07ba: return 0x03b0; // Greek_upsilonaccentdieresis
+ case 0x07e1: return 0x03b1; // Greek_alpha
+ case 0x07e2: return 0x03b2; // Greek_beta
+ case 0x07e3: return 0x03b3; // Greek_gamma
+ case 0x07e4: return 0x03b4; // Greek_delta
+ case 0x07e5: return 0x03b5; // Greek_epsilon
+ case 0x07e6: return 0x03b6; // Greek_zeta
+ case 0x07e7: return 0x03b7; // Greek_eta
+ case 0x07e8: return 0x03b8; // Greek_theta
+ case 0x07e9: return 0x03b9; // Greek_iota
+ case 0x07ea: return 0x03ba; // Greek_kappa
+ case 0x07eb: return 0x03bb; // Greek_lambda
+ case 0x07ec: return 0x03bc; // Greek_mu
+ case 0x07ed: return 0x03bd; // Greek_nu
+ case 0x07ee: return 0x03be; // Greek_xi
+ case 0x07ef: return 0x03bf; // Greek_omicron
+ case 0x07f0: return 0x03c0; // Greek_pi
+ case 0x07f1: return 0x03c1; // Greek_rho
+ case 0x07f3: return 0x03c2; // Greek_finalsmallsigma
+ case 0x07f2: return 0x03c3; // Greek_sigma
+ case 0x07f4: return 0x03c4; // Greek_tau
+ case 0x07f5: return 0x03c5; // Greek_upsilon
+ case 0x07f6: return 0x03c6; // Greek_phi
+ case 0x07f7: return 0x03c7; // Greek_chi
+ case 0x07f8: return 0x03c8; // Greek_psi
+ case 0x07f9: return 0x03c9; // Greek_omega
+ case 0x07b5: return 0x03ca; // Greek_iotadieresis
+ case 0x07b9: return 0x03cb; // Greek_upsilondieresis
+ case 0x07b7: return 0x03cc; // Greek_omicronaccent
+ case 0x07b8: return 0x03cd; // Greek_upsilonaccent
+ case 0x07bb: return 0x03ce; // Greek_omegaaccent
+ case 0x06b3: return 0x0401; // Cyrillic_IO
+ case 0x06b1: return 0x0402; // Serbian_DJE
+ case 0x06b2: return 0x0403; // Macedonia_GJE
+ case 0x06b4: return 0x0404; // Ukrainian_IE
+ case 0x06b5: return 0x0405; // Macedonia_DSE
+ case 0x06b6: return 0x0406; // Ukrainian_I
+ case 0x06b7: return 0x0407; // Ukrainian_YI
+ case 0x06b8: return 0x0408; // Cyrillic_JE
+ case 0x06b9: return 0x0409; // Cyrillic_LJE
+ case 0x06ba: return 0x040a; // Cyrillic_NJE
+ case 0x06bb: return 0x040b; // Serbian_TSHE
+ case 0x06bc: return 0x040c; // Macedonia_KJE
+ case 0x06be: return 0x040e; // Byelorussian_SHORTU
+ case 0x06bf: return 0x040f; // Cyrillic_DZHE
+ case 0x06e1: return 0x0410; // Cyrillic_A
+ case 0x06e2: return 0x0411; // Cyrillic_BE
+ case 0x06f7: return 0x0412; // Cyrillic_VE
+ case 0x06e7: return 0x0413; // Cyrillic_GHE
+ case 0x06e4: return 0x0414; // Cyrillic_DE
+ case 0x06e5: return 0x0415; // Cyrillic_IE
+ case 0x06f6: return 0x0416; // Cyrillic_ZHE
+ case 0x06fa: return 0x0417; // Cyrillic_ZE
+ case 0x06e9: return 0x0418; // Cyrillic_I
+ case 0x06ea: return 0x0419; // Cyrillic_SHORTI
+ case 0x06eb: return 0x041a; // Cyrillic_KA
+ case 0x06ec: return 0x041b; // Cyrillic_EL
+ case 0x06ed: return 0x041c; // Cyrillic_EM
+ case 0x06ee: return 0x041d; // Cyrillic_EN
+ case 0x06ef: return 0x041e; // Cyrillic_O
+ case 0x06f0: return 0x041f; // Cyrillic_PE
+ case 0x06f2: return 0x0420; // Cyrillic_ER
+ case 0x06f3: return 0x0421; // Cyrillic_ES
+ case 0x06f4: return 0x0422; // Cyrillic_TE
+ case 0x06f5: return 0x0423; // Cyrillic_U
+ case 0x06e6: return 0x0424; // Cyrillic_EF
+ case 0x06e8: return 0x0425; // Cyrillic_HA
+ case 0x06e3: return 0x0426; // Cyrillic_TSE
+ case 0x06fe: return 0x0427; // Cyrillic_CHE
+ case 0x06fb: return 0x0428; // Cyrillic_SHA
+ case 0x06fd: return 0x0429; // Cyrillic_SHCHA
+ case 0x06ff: return 0x042a; // Cyrillic_HARDSIGN
+ case 0x06f9: return 0x042b; // Cyrillic_YERU
+ case 0x06f8: return 0x042c; // Cyrillic_SOFTSIGN
+ case 0x06fc: return 0x042d; // Cyrillic_E
+ case 0x06e0: return 0x042e; // Cyrillic_YU
+ case 0x06f1: return 0x042f; // Cyrillic_YA
+ case 0x06c1: return 0x0430; // Cyrillic_a
+ case 0x06c2: return 0x0431; // Cyrillic_be
+ case 0x06d7: return 0x0432; // Cyrillic_ve
+ case 0x06c7: return 0x0433; // Cyrillic_ghe
+ case 0x06c4: return 0x0434; // Cyrillic_de
+ case 0x06c5: return 0x0435; // Cyrillic_ie
+ case 0x06d6: return 0x0436; // Cyrillic_zhe
+ case 0x06da: return 0x0437; // Cyrillic_ze
+ case 0x06c9: return 0x0438; // Cyrillic_i
+ case 0x06ca: return 0x0439; // Cyrillic_shorti
+ case 0x06cb: return 0x043a; // Cyrillic_ka
+ case 0x06cc: return 0x043b; // Cyrillic_el
+ case 0x06cd: return 0x043c; // Cyrillic_em
+ case 0x06ce: return 0x043d; // Cyrillic_en
+ case 0x06cf: return 0x043e; // Cyrillic_o
+ case 0x06d0: return 0x043f; // Cyrillic_pe
+ case 0x06d2: return 0x0440; // Cyrillic_er
+ case 0x06d3: return 0x0441; // Cyrillic_es
+ case 0x06d4: return 0x0442; // Cyrillic_te
+ case 0x06d5: return 0x0443; // Cyrillic_u
+ case 0x06c6: return 0x0444; // Cyrillic_ef
+ case 0x06c8: return 0x0445; // Cyrillic_ha
+ case 0x06c3: return 0x0446; // Cyrillic_tse
+ case 0x06de: return 0x0447; // Cyrillic_che
+ case 0x06db: return 0x0448; // Cyrillic_sha
+ case 0x06dd: return 0x0449; // Cyrillic_shcha
+ case 0x06df: return 0x044a; // Cyrillic_hardsign
+ case 0x06d9: return 0x044b; // Cyrillic_yeru
+ case 0x06d8: return 0x044c; // Cyrillic_softsign
+ case 0x06dc: return 0x044d; // Cyrillic_e
+ case 0x06c0: return 0x044e; // Cyrillic_yu
+ case 0x06d1: return 0x044f; // Cyrillic_ya
+ case 0x06a3: return 0x0451; // Cyrillic_io
+ case 0x06a1: return 0x0452; // Serbian_dje
+ case 0x06a2: return 0x0453; // Macedonia_gje
+ case 0x06a4: return 0x0454; // Ukrainian_ie
+ case 0x06a5: return 0x0455; // Macedonia_dse
+ case 0x06a6: return 0x0456; // Ukrainian_i
+ case 0x06a7: return 0x0457; // Ukrainian_yi
+ case 0x06a8: return 0x0458; // Cyrillic_je
+ case 0x06a9: return 0x0459; // Cyrillic_lje
+ case 0x06aa: return 0x045a; // Cyrillic_nje
+ case 0x06ab: return 0x045b; // Serbian_tshe
+ case 0x06ac: return 0x045c; // Macedonia_kje
+ case 0x06ae: return 0x045e; // Byelorussian_shortu
+ case 0x06af: return 0x045f; // Cyrillic_dzhe
+ case 0x06bd: return 0x0490; // Ukrainian_GHE_WITH_UPTURN
+ case 0x06ad: return 0x0491; // Ukrainian_ghe_with_upturn
+ case 0x0680: return 0x0492; // Cyrillic_GHE_bar
+ case 0x0690: return 0x0493; // Cyrillic_ghe_bar
+ case 0x0681: return 0x0496; // Cyrillic_ZHE_descender
+ case 0x0691: return 0x0497; // Cyrillic_zhe_descender
+ case 0x0682: return 0x049a; // Cyrillic_KA_descender
+ case 0x0692: return 0x049b; // Cyrillic_ka_descender
+ case 0x0683: return 0x049c; // Cyrillic_KA_vertstroke
+ case 0x0693: return 0x049d; // Cyrillic_ka_vertstroke
+ case 0x0684: return 0x04a2; // Cyrillic_EN_descender
+ case 0x0694: return 0x04a3; // Cyrillic_en_descender
+ case 0x0685: return 0x04ae; // Cyrillic_U_straight
+ case 0x0695: return 0x04af; // Cyrillic_u_straight
+ case 0x0686: return 0x04b0; // Cyrillic_U_straight_bar
+ case 0x0696: return 0x04b1; // Cyrillic_u_straight_bar
+ case 0x0687: return 0x04b2; // Cyrillic_HA_descender
+ case 0x0697: return 0x04b3; // Cyrillic_ha_descender
+ case 0x0688: return 0x04b6; // Cyrillic_CHE_descender
+ case 0x0698: return 0x04b7; // Cyrillic_che_descender
+ case 0x0689: return 0x04b8; // Cyrillic_CHE_vertstroke
+ case 0x0699: return 0x04b9; // Cyrillic_che_vertstroke
+ case 0x068a: return 0x04ba; // Cyrillic_SHHA
+ case 0x069a: return 0x04bb; // Cyrillic_shha
+ case 0x068c: return 0x04d8; // Cyrillic_SCHWA
+ case 0x069c: return 0x04d9; // Cyrillic_schwa
+ case 0x068d: return 0x04e2; // Cyrillic_I_macron
+ case 0x069d: return 0x04e3; // Cyrillic_i_macron
+ case 0x068e: return 0x04e8; // Cyrillic_O_bar
+ case 0x069e: return 0x04e9; // Cyrillic_o_bar
+ case 0x068f: return 0x04ee; // Cyrillic_U_macron
+ case 0x069f: return 0x04ef; // Cyrillic_u_macron
+ case 0x14b2: return 0x0531; // Armenian_AYB
+ case 0x14b4: return 0x0532; // Armenian_BEN
+ case 0x14b6: return 0x0533; // Armenian_GIM
+ case 0x14b8: return 0x0534; // Armenian_DA
+ case 0x14ba: return 0x0535; // Armenian_YECH
+ case 0x14bc: return 0x0536; // Armenian_ZA
+ case 0x14be: return 0x0537; // Armenian_E
+ case 0x14c0: return 0x0538; // Armenian_AT
+ case 0x14c2: return 0x0539; // Armenian_TO
+ case 0x14c4: return 0x053a; // Armenian_ZHE
+ case 0x14c6: return 0x053b; // Armenian_INI
+ case 0x14c8: return 0x053c; // Armenian_LYUN
+ case 0x14ca: return 0x053d; // Armenian_KHE
+ case 0x14cc: return 0x053e; // Armenian_TSA
+ case 0x14ce: return 0x053f; // Armenian_KEN
+ case 0x14d0: return 0x0540; // Armenian_HO
+ case 0x14d2: return 0x0541; // Armenian_DZA
+ case 0x14d4: return 0x0542; // Armenian_GHAT
+ case 0x14d6: return 0x0543; // Armenian_TCHE
+ case 0x14d8: return 0x0544; // Armenian_MEN
+ case 0x14da: return 0x0545; // Armenian_HI
+ case 0x14dc: return 0x0546; // Armenian_NU
+ case 0x14de: return 0x0547; // Armenian_SHA
+ case 0x14e0: return 0x0548; // Armenian_VO
+ case 0x14e2: return 0x0549; // Armenian_CHA
+ case 0x14e4: return 0x054a; // Armenian_PE
+ case 0x14e6: return 0x054b; // Armenian_JE
+ case 0x14e8: return 0x054c; // Armenian_RA
+ case 0x14ea: return 0x054d; // Armenian_SE
+ case 0x14ec: return 0x054e; // Armenian_VEV
+ case 0x14ee: return 0x054f; // Armenian_TYUN
+ case 0x14f0: return 0x0550; // Armenian_RE
+ case 0x14f2: return 0x0551; // Armenian_TSO
+ case 0x14f4: return 0x0552; // Armenian_VYUN
+ case 0x14f6: return 0x0553; // Armenian_PYUR
+ case 0x14f8: return 0x0554; // Armenian_KE
+ case 0x14fa: return 0x0555; // Armenian_O
+ case 0x14fc: return 0x0556; // Armenian_FE
+ case 0x14fe: return 0x055a; // Armenian_apostrophe
+ case 0x14b0: return 0x055b; // Armenian_shesht
+ case 0x14af: return 0x055c; // Armenian_amanak
+ case 0x14aa: return 0x055d; // Armenian_but
+ case 0x14b1: return 0x055e; // Armenian_paruyk
+ case 0x14b3: return 0x0561; // Armenian_ayb
+ case 0x14b5: return 0x0562; // Armenian_ben
+ case 0x14b7: return 0x0563; // Armenian_gim
+ case 0x14b9: return 0x0564; // Armenian_da
+ case 0x14bb: return 0x0565; // Armenian_yech
+ case 0x14bd: return 0x0566; // Armenian_za
+ case 0x14bf: return 0x0567; // Armenian_e
+ case 0x14c1: return 0x0568; // Armenian_at
+ case 0x14c3: return 0x0569; // Armenian_to
+ case 0x14c5: return 0x056a; // Armenian_zhe
+ case 0x14c7: return 0x056b; // Armenian_ini
+ case 0x14c9: return 0x056c; // Armenian_lyun
+ case 0x14cb: return 0x056d; // Armenian_khe
+ case 0x14cd: return 0x056e; // Armenian_tsa
+ case 0x14cf: return 0x056f; // Armenian_ken
+ case 0x14d1: return 0x0570; // Armenian_ho
+ case 0x14d3: return 0x0571; // Armenian_dza
+ case 0x14d5: return 0x0572; // Armenian_ghat
+ case 0x14d7: return 0x0573; // Armenian_tche
+ case 0x14d9: return 0x0574; // Armenian_men
+ case 0x14db: return 0x0575; // Armenian_hi
+ case 0x14dd: return 0x0576; // Armenian_nu
+ case 0x14df: return 0x0577; // Armenian_sha
+ case 0x14e1: return 0x0578; // Armenian_vo
+ case 0x14e3: return 0x0579; // Armenian_cha
+ case 0x14e5: return 0x057a; // Armenian_pe
+ case 0x14e7: return 0x057b; // Armenian_je
+ case 0x14e9: return 0x057c; // Armenian_ra
+ case 0x14eb: return 0x057d; // Armenian_se
+ case 0x14ed: return 0x057e; // Armenian_vev
+ case 0x14ef: return 0x057f; // Armenian_tyun
+ case 0x14f1: return 0x0580; // Armenian_re
+ case 0x14f3: return 0x0581; // Armenian_tso
+ case 0x14f5: return 0x0582; // Armenian_vyun
+ case 0x14f7: return 0x0583; // Armenian_pyur
+ case 0x14f9: return 0x0584; // Armenian_ke
+ case 0x14fb: return 0x0585; // Armenian_o
+ case 0x14fd: return 0x0586; // Armenian_fe
+ case 0x14a2: return 0x0587; // Armenian_ligature_ew
+ case 0x14a3: return 0x0589; // Armenian_verjaket
+ case 0x14ad: return 0x058a; // Armenian_yentamna
+ case 0x0ce0: return 0x05d0; // hebrew_aleph
+ case 0x0ce1: return 0x05d1; // hebrew_beth
+ case 0x0ce2: return 0x05d2; // hebrew_gimmel
+ case 0x0ce3: return 0x05d3; // hebrew_daleth
+ case 0x0ce4: return 0x05d4; // hebrew_he
+ case 0x0ce5: return 0x05d5; // hebrew_waw
+ case 0x0ce6: return 0x05d6; // hebrew_zayin
+ case 0x0ce7: return 0x05d7; // hebrew_het
+ case 0x0ce8: return 0x05d8; // hebrew_teth
+ case 0x0ce9: return 0x05d9; // hebrew_yod
+ case 0x0cea: return 0x05da; // hebrew_finalkaph
+ case 0x0ceb: return 0x05db; // hebrew_kaph
+ case 0x0cec: return 0x05dc; // hebrew_lamed
+ case 0x0ced: return 0x05dd; // hebrew_finalmem
+ case 0x0cee: return 0x05de; // hebrew_mem
+ case 0x0cef: return 0x05df; // hebrew_finalnun
+ case 0x0cf0: return 0x05e0; // hebrew_nun
+ case 0x0cf1: return 0x05e1; // hebrew_samekh
+ case 0x0cf2: return 0x05e2; // hebrew_ayin
+ case 0x0cf3: return 0x05e3; // hebrew_finalpe
+ case 0x0cf4: return 0x05e4; // hebrew_pe
+ case 0x0cf5: return 0x05e5; // hebrew_finalzadi
+ case 0x0cf6: return 0x05e6; // hebrew_zadi
+ case 0x0cf7: return 0x05e7; // hebrew_qoph
+ case 0x0cf8: return 0x05e8; // hebrew_resh
+ case 0x0cf9: return 0x05e9; // hebrew_shin
+ case 0x0cfa: return 0x05ea; // hebrew_taw
+ case 0x05ac: return 0x060c; // Arabic_comma
+ case 0x05bb: return 0x061b; // Arabic_semicolon
+ case 0x05bf: return 0x061f; // Arabic_question_mark
+ case 0x05c1: return 0x0621; // Arabic_hamza
+ case 0x05c2: return 0x0622; // Arabic_maddaonalef
+ case 0x05c3: return 0x0623; // Arabic_hamzaonalef
+ case 0x05c4: return 0x0624; // Arabic_hamzaonwaw
+ case 0x05c5: return 0x0625; // Arabic_hamzaunderalef
+ case 0x05c6: return 0x0626; // Arabic_hamzaonyeh
+ case 0x05c7: return 0x0627; // Arabic_alef
+ case 0x05c8: return 0x0628; // Arabic_beh
+ case 0x05c9: return 0x0629; // Arabic_tehmarbuta
+ case 0x05ca: return 0x062a; // Arabic_teh
+ case 0x05cb: return 0x062b; // Arabic_theh
+ case 0x05cc: return 0x062c; // Arabic_jeem
+ case 0x05cd: return 0x062d; // Arabic_hah
+ case 0x05ce: return 0x062e; // Arabic_khah
+ case 0x05cf: return 0x062f; // Arabic_dal
+ case 0x05d0: return 0x0630; // Arabic_thal
+ case 0x05d1: return 0x0631; // Arabic_ra
+ case 0x05d2: return 0x0632; // Arabic_zain
+ case 0x05d3: return 0x0633; // Arabic_seen
+ case 0x05d4: return 0x0634; // Arabic_sheen
+ case 0x05d5: return 0x0635; // Arabic_sad
+ case 0x05d6: return 0x0636; // Arabic_dad
+ case 0x05d7: return 0x0637; // Arabic_tah
+ case 0x05d8: return 0x0638; // Arabic_zah
+ case 0x05d9: return 0x0639; // Arabic_ain
+ case 0x05da: return 0x063a; // Arabic_ghain
+ case 0x05e0: return 0x0640; // Arabic_tatweel
+ case 0x05e1: return 0x0641; // Arabic_feh
+ case 0x05e2: return 0x0642; // Arabic_qaf
+ case 0x05e3: return 0x0643; // Arabic_kaf
+ case 0x05e4: return 0x0644; // Arabic_lam
+ case 0x05e5: return 0x0645; // Arabic_meem
+ case 0x05e6: return 0x0646; // Arabic_noon
+ case 0x05e7: return 0x0647; // Arabic_ha
+ case 0x05e8: return 0x0648; // Arabic_waw
+ case 0x05e9: return 0x0649; // Arabic_alefmaksura
+ case 0x05ea: return 0x064a; // Arabic_yeh
+ case 0x05eb: return 0x064b; // Arabic_fathatan
+ case 0x05ec: return 0x064c; // Arabic_dammatan
+ case 0x05ed: return 0x064d; // Arabic_kasratan
+ case 0x05ee: return 0x064e; // Arabic_fatha
+ case 0x05ef: return 0x064f; // Arabic_damma
+ case 0x05f0: return 0x0650; // Arabic_kasra
+ case 0x05f1: return 0x0651; // Arabic_shadda
+ case 0x05f2: return 0x0652; // Arabic_sukun
+ case 0x05f3: return 0x0653; // Arabic_madda_above
+ case 0x05f4: return 0x0654; // Arabic_hamza_above
+ case 0x05f5: return 0x0655; // Arabic_hamza_below
+ case 0x05b0: return 0x0660; // Arabic_0
+ case 0x05b1: return 0x0661; // Arabic_1
+ case 0x05b2: return 0x0662; // Arabic_2
+ case 0x05b3: return 0x0663; // Arabic_3
+ case 0x05b4: return 0x0664; // Arabic_4
+ case 0x05b5: return 0x0665; // Arabic_5
+ case 0x05b6: return 0x0666; // Arabic_6
+ case 0x05b7: return 0x0667; // Arabic_7
+ case 0x05b8: return 0x0668; // Arabic_8
+ case 0x05b9: return 0x0669; // Arabic_9
+ case 0x05a5: return 0x066a; // Arabic_percent
+ case 0x05a6: return 0x0670; // Arabic_superscript_alef
+ case 0x05a7: return 0x0679; // Arabic_tteh
+ case 0x05a8: return 0x067e; // Arabic_peh
+ case 0x05a9: return 0x0686; // Arabic_tcheh
+ case 0x05aa: return 0x0688; // Arabic_ddal
+ case 0x05ab: return 0x0691; // Arabic_rreh
+ case 0x05f6: return 0x0698; // Arabic_jeh
+ case 0x05f7: return 0x06a4; // Arabic_veh
+ case 0x05f8: return 0x06a9; // Arabic_keheh
+ case 0x05f9: return 0x06af; // Arabic_gaf
+ case 0x05fa: return 0x06ba; // Arabic_noon_ghunna
+ case 0x05fb: return 0x06be; // Arabic_heh_doachashmee
+ case 0x05fe: return 0x06c1; // Arabic_heh_goal
+ case 0x05fc: return 0x06cc; // Farsi_yeh
+ case 0x05fd: return 0x06d2; // Arabic_yeh_baree
+ case 0x05ae: return 0x06d4; // Arabic_fullstop
+ case 0x0590: return 0x06f0; // Farsi_0
+ case 0x0591: return 0x06f1; // Farsi_1
+ case 0x0592: return 0x06f2; // Farsi_2
+ case 0x0593: return 0x06f3; // Farsi_3
+ case 0x0594: return 0x06f4; // Farsi_4
+ case 0x0595: return 0x06f5; // Farsi_5
+ case 0x0596: return 0x06f6; // Farsi_6
+ case 0x0597: return 0x06f7; // Farsi_7
+ case 0x0598: return 0x06f8; // Farsi_8
+ case 0x0599: return 0x06f9; // Farsi_9
+ case 0x0da1: return 0x0e01; // Thai_kokai
+ case 0x0da2: return 0x0e02; // Thai_khokhai
+ case 0x0da3: return 0x0e03; // Thai_khokhuat
+ case 0x0da4: return 0x0e04; // Thai_khokhwai
+ case 0x0da5: return 0x0e05; // Thai_khokhon
+ case 0x0da6: return 0x0e06; // Thai_khorakhang
+ case 0x0da7: return 0x0e07; // Thai_ngongu
+ case 0x0da8: return 0x0e08; // Thai_chochan
+ case 0x0da9: return 0x0e09; // Thai_choching
+ case 0x0daa: return 0x0e0a; // Thai_chochang
+ case 0x0dab: return 0x0e0b; // Thai_soso
+ case 0x0dac: return 0x0e0c; // Thai_chochoe
+ case 0x0dad: return 0x0e0d; // Thai_yoying
+ case 0x0dae: return 0x0e0e; // Thai_dochada
+ case 0x0daf: return 0x0e0f; // Thai_topatak
+ case 0x0db0: return 0x0e10; // Thai_thothan
+ case 0x0db1: return 0x0e11; // Thai_thonangmontho
+ case 0x0db2: return 0x0e12; // Thai_thophuthao
+ case 0x0db3: return 0x0e13; // Thai_nonen
+ case 0x0db4: return 0x0e14; // Thai_dodek
+ case 0x0db5: return 0x0e15; // Thai_totao
+ case 0x0db6: return 0x0e16; // Thai_thothung
+ case 0x0db7: return 0x0e17; // Thai_thothahan
+ case 0x0db8: return 0x0e18; // Thai_thothong
+ case 0x0db9: return 0x0e19; // Thai_nonu
+ case 0x0dba: return 0x0e1a; // Thai_bobaimai
+ case 0x0dbb: return 0x0e1b; // Thai_popla
+ case 0x0dbc: return 0x0e1c; // Thai_phophung
+ case 0x0dbd: return 0x0e1d; // Thai_fofa
+ case 0x0dbe: return 0x0e1e; // Thai_phophan
+ case 0x0dbf: return 0x0e1f; // Thai_fofan
+ case 0x0dc0: return 0x0e20; // Thai_phosamphao
+ case 0x0dc1: return 0x0e21; // Thai_moma
+ case 0x0dc2: return 0x0e22; // Thai_yoyak
+ case 0x0dc3: return 0x0e23; // Thai_rorua
+ case 0x0dc4: return 0x0e24; // Thai_ru
+ case 0x0dc5: return 0x0e25; // Thai_loling
+ case 0x0dc6: return 0x0e26; // Thai_lu
+ case 0x0dc7: return 0x0e27; // Thai_wowaen
+ case 0x0dc8: return 0x0e28; // Thai_sosala
+ case 0x0dc9: return 0x0e29; // Thai_sorusi
+ case 0x0dca: return 0x0e2a; // Thai_sosua
+ case 0x0dcb: return 0x0e2b; // Thai_hohip
+ case 0x0dcc: return 0x0e2c; // Thai_lochula
+ case 0x0dcd: return 0x0e2d; // Thai_oang
+ case 0x0dce: return 0x0e2e; // Thai_honokhuk
+ case 0x0dcf: return 0x0e2f; // Thai_paiyannoi
+ case 0x0dd0: return 0x0e30; // Thai_saraa
+ case 0x0dd1: return 0x0e31; // Thai_maihanakat
+ case 0x0dd2: return 0x0e32; // Thai_saraaa
+ case 0x0dd3: return 0x0e33; // Thai_saraam
+ case 0x0dd4: return 0x0e34; // Thai_sarai
+ case 0x0dd5: return 0x0e35; // Thai_saraii
+ case 0x0dd6: return 0x0e36; // Thai_saraue
+ case 0x0dd7: return 0x0e37; // Thai_sarauee
+ case 0x0dd8: return 0x0e38; // Thai_sarau
+ case 0x0dd9: return 0x0e39; // Thai_sarauu
+ case 0x0dda: return 0x0e3a; // Thai_phinthu
+ case 0x0ddf: return 0x0e3f; // Thai_baht
+ case 0x0de0: return 0x0e40; // Thai_sarae
+ case 0x0de1: return 0x0e41; // Thai_saraae
+ case 0x0de2: return 0x0e42; // Thai_sarao
+ case 0x0de3: return 0x0e43; // Thai_saraaimaimuan
+ case 0x0de4: return 0x0e44; // Thai_saraaimaimalai
+ case 0x0de5: return 0x0e45; // Thai_lakkhangyao
+ case 0x0de6: return 0x0e46; // Thai_maiyamok
+ case 0x0de7: return 0x0e47; // Thai_maitaikhu
+ case 0x0de8: return 0x0e48; // Thai_maiek
+ case 0x0de9: return 0x0e49; // Thai_maitho
+ case 0x0dea: return 0x0e4a; // Thai_maitri
+ case 0x0deb: return 0x0e4b; // Thai_maichattawa
+ case 0x0dec: return 0x0e4c; // Thai_thanthakhat
+ case 0x0ded: return 0x0e4d; // Thai_nikhahit
+ case 0x0df0: return 0x0e50; // Thai_leksun
+ case 0x0df1: return 0x0e51; // Thai_leknung
+ case 0x0df2: return 0x0e52; // Thai_leksong
+ case 0x0df3: return 0x0e53; // Thai_leksam
+ case 0x0df4: return 0x0e54; // Thai_leksi
+ case 0x0df5: return 0x0e55; // Thai_lekha
+ case 0x0df6: return 0x0e56; // Thai_lekhok
+ case 0x0df7: return 0x0e57; // Thai_lekchet
+ case 0x0df8: return 0x0e58; // Thai_lekpaet
+ case 0x0df9: return 0x0e59; // Thai_lekkao
+ case 0x15d0: return 0x10d0; // Georgian_an
+ case 0x15d1: return 0x10d1; // Georgian_ban
+ case 0x15d2: return 0x10d2; // Georgian_gan
+ case 0x15d3: return 0x10d3; // Georgian_don
+ case 0x15d4: return 0x10d4; // Georgian_en
+ case 0x15d5: return 0x10d5; // Georgian_vin
+ case 0x15d6: return 0x10d6; // Georgian_zen
+ case 0x15d7: return 0x10d7; // Georgian_tan
+ case 0x15d8: return 0x10d8; // Georgian_in
+ case 0x15d9: return 0x10d9; // Georgian_kan
+ case 0x15da: return 0x10da; // Georgian_las
+ case 0x15db: return 0x10db; // Georgian_man
+ case 0x15dc: return 0x10dc; // Georgian_nar
+ case 0x15dd: return 0x10dd; // Georgian_on
+ case 0x15de: return 0x10de; // Georgian_par
+ case 0x15df: return 0x10df; // Georgian_zhar
+ case 0x15e0: return 0x10e0; // Georgian_rae
+ case 0x15e1: return 0x10e1; // Georgian_san
+ case 0x15e2: return 0x10e2; // Georgian_tar
+ case 0x15e3: return 0x10e3; // Georgian_un
+ case 0x15e4: return 0x10e4; // Georgian_phar
+ case 0x15e5: return 0x10e5; // Georgian_khar
+ case 0x15e6: return 0x10e6; // Georgian_ghan
+ case 0x15e7: return 0x10e7; // Georgian_qar
+ case 0x15e8: return 0x10e8; // Georgian_shin
+ case 0x15e9: return 0x10e9; // Georgian_chin
+ case 0x15ea: return 0x10ea; // Georgian_can
+ case 0x15eb: return 0x10eb; // Georgian_jil
+ case 0x15ec: return 0x10ec; // Georgian_cil
+ case 0x15ed: return 0x10ed; // Georgian_char
+ case 0x15ee: return 0x10ee; // Georgian_xan
+ case 0x15ef: return 0x10ef; // Georgian_jhan
+ case 0x15f0: return 0x10f0; // Georgian_hae
+ case 0x15f1: return 0x10f1; // Georgian_he
+ case 0x15f2: return 0x10f2; // Georgian_hie
+ case 0x15f3: return 0x10f3; // Georgian_we
+ case 0x15f4: return 0x10f4; // Georgian_har
+ case 0x15f5: return 0x10f5; // Georgian_hoe
+ case 0x15f6: return 0x10f6; // Georgian_fi
+ case 0x0ed4: return 0x11a8; // Hangul_J_Kiyeog
+ case 0x0ed5: return 0x11a9; // Hangul_J_SsangKiyeog
+ case 0x0ed6: return 0x11aa; // Hangul_J_KiyeogSios
+ case 0x0ed7: return 0x11ab; // Hangul_J_Nieun
+ case 0x0ed8: return 0x11ac; // Hangul_J_NieunJieuj
+ case 0x0ed9: return 0x11ad; // Hangul_J_NieunHieuh
+ case 0x0eda: return 0x11ae; // Hangul_J_Dikeud
+ case 0x0edb: return 0x11af; // Hangul_J_Rieul
+ case 0x0edc: return 0x11b0; // Hangul_J_RieulKiyeog
+ case 0x0edd: return 0x11b1; // Hangul_J_RieulMieum
+ case 0x0ede: return 0x11b2; // Hangul_J_RieulPieub
+ case 0x0edf: return 0x11b3; // Hangul_J_RieulSios
+ case 0x0ee0: return 0x11b4; // Hangul_J_RieulTieut
+ case 0x0ee1: return 0x11b5; // Hangul_J_RieulPhieuf
+ case 0x0ee2: return 0x11b6; // Hangul_J_RieulHieuh
+ case 0x0ee3: return 0x11b7; // Hangul_J_Mieum
+ case 0x0ee4: return 0x11b8; // Hangul_J_Pieub
+ case 0x0ee5: return 0x11b9; // Hangul_J_PieubSios
+ case 0x0ee6: return 0x11ba; // Hangul_J_Sios
+ case 0x0ee7: return 0x11bb; // Hangul_J_SsangSios
+ case 0x0ee8: return 0x11bc; // Hangul_J_Ieung
+ case 0x0ee9: return 0x11bd; // Hangul_J_Jieuj
+ case 0x0eea: return 0x11be; // Hangul_J_Cieuc
+ case 0x0eeb: return 0x11bf; // Hangul_J_Khieuq
+ case 0x0eec: return 0x11c0; // Hangul_J_Tieut
+ case 0x0eed: return 0x11c1; // Hangul_J_Phieuf
+ case 0x0eee: return 0x11c2; // Hangul_J_Hieuh
+ case 0x0ef8: return 0x11eb; // Hangul_J_PanSios
+ case 0x0ef9: return 0x11f0; // Hangul_J_KkogjiDalrinIeung
+ case 0x0efa: return 0x11f9; // Hangul_J_YeorinHieuh
+ case 0x12a1: return 0x1e02; // Babovedot
+ case 0x12a2: return 0x1e03; // babovedot
+ case 0x12a6: return 0x1e0a; // Dabovedot
+ case 0x12ab: return 0x1e0b; // dabovedot
+ case 0x12b0: return 0x1e1e; // Fabovedot
+ case 0x12b1: return 0x1e1f; // fabovedot
+ case 0x16d1: return 0x1e36; // Lbelowdot
+ case 0x16e1: return 0x1e37; // lbelowdot
+ case 0x12b4: return 0x1e40; // Mabovedot
+ case 0x12b5: return 0x1e41; // mabovedot
+ case 0x12b7: return 0x1e56; // Pabovedot
+ case 0x12b9: return 0x1e57; // pabovedot
+ case 0x12bb: return 0x1e60; // Sabovedot
+ case 0x12bf: return 0x1e61; // sabovedot
+ case 0x12d7: return 0x1e6a; // Tabovedot
+ case 0x12f7: return 0x1e6b; // tabovedot
+ case 0x12a8: return 0x1e80; // Wgrave
+ case 0x12b8: return 0x1e81; // wgrave
+ case 0x12aa: return 0x1e82; // Wacute
+ case 0x12ba: return 0x1e83; // wacute
+ case 0x12bd: return 0x1e84; // Wdiaeresis
+ case 0x12be: return 0x1e85; // wdiaeresis
+ case 0x16a3: return 0x1e8a; // Xabovedot
+ case 0x16b3: return 0x1e8b; // xabovedot
+ case 0x1ea0: return 0x1ea0; // Abelowdot
+ case 0x1ea1: return 0x1ea1; // abelowdot
+ case 0x1ea2: return 0x1ea2; // Ahook
+ case 0x1ea3: return 0x1ea3; // ahook
+ case 0x1ea4: return 0x1ea4; // Acircumflexacute
+ case 0x1ea5: return 0x1ea5; // acircumflexacute
+ case 0x1ea6: return 0x1ea6; // Acircumflexgrave
+ case 0x1ea7: return 0x1ea7; // acircumflexgrave
+ case 0x1ea8: return 0x1ea8; // Acircumflexhook
+ case 0x1ea9: return 0x1ea9; // acircumflexhook
+ case 0x1eaa: return 0x1eaa; // Acircumflextilde
+ case 0x1eab: return 0x1eab; // acircumflextilde
+ case 0x1eac: return 0x1eac; // Acircumflexbelowdot
+ case 0x1ead: return 0x1ead; // acircumflexbelowdot
+ case 0x1eae: return 0x1eae; // Abreveacute
+ case 0x1eaf: return 0x1eaf; // abreveacute
+ case 0x1eb0: return 0x1eb0; // Abrevegrave
+ case 0x1eb1: return 0x1eb1; // abrevegrave
+ case 0x1eb2: return 0x1eb2; // Abrevehook
+ case 0x1eb3: return 0x1eb3; // abrevehook
+ case 0x1eb4: return 0x1eb4; // Abrevetilde
+ case 0x1eb5: return 0x1eb5; // abrevetilde
+ case 0x1eb6: return 0x1eb6; // Abrevebelowdot
+ case 0x1eb7: return 0x1eb7; // abrevebelowdot
+ case 0x1eb8: return 0x1eb8; // Ebelowdot
+ case 0x1eb9: return 0x1eb9; // ebelowdot
+ case 0x1eba: return 0x1eba; // Ehook
+ case 0x1ebb: return 0x1ebb; // ehook
+ case 0x1ebc: return 0x1ebc; // Etilde
+ case 0x1ebd: return 0x1ebd; // etilde
+ case 0x1ebe: return 0x1ebe; // Ecircumflexacute
+ case 0x1ebf: return 0x1ebf; // ecircumflexacute
+ case 0x1ec0: return 0x1ec0; // Ecircumflexgrave
+ case 0x1ec1: return 0x1ec1; // ecircumflexgrave
+ case 0x1ec2: return 0x1ec2; // Ecircumflexhook
+ case 0x1ec3: return 0x1ec3; // ecircumflexhook
+ case 0x1ec4: return 0x1ec4; // Ecircumflextilde
+ case 0x1ec5: return 0x1ec5; // ecircumflextilde
+ case 0x1ec6: return 0x1ec6; // Ecircumflexbelowdot
+ case 0x1ec7: return 0x1ec7; // ecircumflexbelowdot
+ case 0x1ec8: return 0x1ec8; // Ihook
+ case 0x1ec9: return 0x1ec9; // ihook
+ case 0x1eca: return 0x1eca; // Ibelowdot
+ case 0x1ecb: return 0x1ecb; // ibelowdot
+ case 0x1ecc: return 0x1ecc; // Obelowdot
+ case 0x1ecd: return 0x1ecd; // obelowdot
+ case 0x1ece: return 0x1ece; // Ohook
+ case 0x1ecf: return 0x1ecf; // ohook
+ case 0x1ed0: return 0x1ed0; // Ocircumflexacute
+ case 0x1ed1: return 0x1ed1; // ocircumflexacute
+ case 0x1ed2: return 0x1ed2; // Ocircumflexgrave
+ case 0x1ed3: return 0x1ed3; // ocircumflexgrave
+ case 0x1ed4: return 0x1ed4; // Ocircumflexhook
+ case 0x1ed5: return 0x1ed5; // ocircumflexhook
+ case 0x1ed6: return 0x1ed6; // Ocircumflextilde
+ case 0x1ed7: return 0x1ed7; // ocircumflextilde
+ case 0x1ed8: return 0x1ed8; // Ocircumflexbelowdot
+ case 0x1ed9: return 0x1ed9; // ocircumflexbelowdot
+ case 0x1eda: return 0x1eda; // Ohornacute
+ case 0x1edb: return 0x1edb; // ohornacute
+ case 0x1edc: return 0x1edc; // Ohorngrave
+ case 0x1edd: return 0x1edd; // ohorngrave
+ case 0x1ede: return 0x1ede; // Ohornhook
+ case 0x1edf: return 0x1edf; // ohornhook
+ case 0x1ee0: return 0x1ee0; // Ohorntilde
+ case 0x1ee1: return 0x1ee1; // ohorntilde
+ case 0x1ee2: return 0x1ee2; // Ohornbelowdot
+ case 0x1ee3: return 0x1ee3; // ohornbelowdot
+ case 0x1ee4: return 0x1ee4; // Ubelowdot
+ case 0x1ee5: return 0x1ee5; // ubelowdot
+ case 0x1ee6: return 0x1ee6; // Uhook
+ case 0x1ee7: return 0x1ee7; // uhook
+ case 0x1ee8: return 0x1ee8; // Uhornacute
+ case 0x1ee9: return 0x1ee9; // uhornacute
+ case 0x1eea: return 0x1eea; // Uhorngrave
+ case 0x1eeb: return 0x1eeb; // uhorngrave
+ case 0x1eec: return 0x1eec; // Uhornhook
+ case 0x1eed: return 0x1eed; // uhornhook
+ case 0x1eee: return 0x1eee; // Uhorntilde
+ case 0x1eef: return 0x1eef; // uhorntilde
+ case 0x1ef0: return 0x1ef0; // Uhornbelowdot
+ case 0x1ef1: return 0x1ef1; // uhornbelowdot
+ case 0x12ac: return 0x1ef2; // Ygrave
+ case 0x12bc: return 0x1ef3; // ygrave
+ case 0x1ef4: return 0x1ef4; // Ybelowdot
+ case 0x1ef5: return 0x1ef5; // ybelowdot
+ case 0x1ef6: return 0x1ef6; // Yhook
+ case 0x1ef7: return 0x1ef7; // yhook
+ case 0x1ef8: return 0x1ef8; // Ytilde
+ case 0x1ef9: return 0x1ef9; // ytilde
+ case 0x0aa2: return 0x2002; // enspace
+ case 0x0aa1: return 0x2003; // emspace
+ case 0x0aa3: return 0x2004; // em3space
+ case 0x0aa4: return 0x2005; // em4space
+ case 0x0aa5: return 0x2007; // digitspace
+ case 0x0aa6: return 0x2008; // punctspace
+ case 0x0aa7: return 0x2009; // thinspace
+ case 0x0aa8: return 0x200a; // hairspace
+ case 0x0abb: return 0x2012; // figdash
+ case 0x14ac: return 0x2013; // Armenian_en_dash
+ case 0x0aaa: return 0x2013; // endash
+ case 0x14a8: return 0x2014; // Armenian_em_dash
+ case 0x0aa9: return 0x2014; // emdash
+ case 0x07af: return 0x2015; // Greek_horizbar
+ case 0x0cdf: return 0x2017; // hebrew_doublelowline
+ case 0x0ad0: return 0x2018; // leftsinglequotemark
+ case 0x0ad1: return 0x2019; // rightsinglequotemark
+ case 0x0afd: return 0x201a; // singlelowquotemark
+ case 0x0ad2: return 0x201c; // leftdoublequotemark
+ case 0x0ad3: return 0x201d; // rightdoublequotemark
+ case 0x0afe: return 0x201e; // doublelowquotemark
+ case 0x0af1: return 0x2020; // dagger
+ case 0x0af2: return 0x2021; // doubledagger
+ case 0x0ae6: return 0x2022; // enfilledcircbullet
+ case 0x0aaf: return 0x2025; // doubbaselinedot
+ case 0x14ae: return 0x2026; // Armenian_ellipsis
+ case 0x0aae: return 0x2026; // ellipsis
+ case 0x0ad6: return 0x2032; // minutes
+ case 0x0ad7: return 0x2033; // seconds
+ case 0x0afc: return 0x2038; // caret
+ case 0x047e: return 0x203e; // overline
+ case 0x20a0: return 0x20a0; // EcuSign
+ case 0x20a1: return 0x20a1; // ColonSign
+ case 0x20a2: return 0x20a2; // CruzeiroSign
+ case 0x20a3: return 0x20a3; // FFrancSign
+ case 0x20a4: return 0x20a4; // LiraSign
+ case 0x20a5: return 0x20a5; // MillSign
+ case 0x20a6: return 0x20a6; // NairaSign
+ case 0x20a7: return 0x20a7; // PesetaSign
+ case 0x20a8: return 0x20a8; // RupeeSign
+ case 0x0eff: return 0x20a9; // Korean_Won
+ case 0x20a9: return 0x20a9; // WonSign
+ case 0x20aa: return 0x20aa; // NewSheqelSign
+ case 0x20ab: return 0x20ab; // DongSign
+ case 0x20ac: return 0x20ac; // EuroSign
+ case 0x0ab8: return 0x2105; // careof
+ case 0x06b0: return 0x2116; // numerosign
+ case 0x0afb: return 0x2117; // phonographcopyright
+ case 0x0ad4: return 0x211e; // prescription
+ case 0x0ac9: return 0x2122; // trademark
+ case 0x0ab0: return 0x2153; // onethird
+ case 0x0ab1: return 0x2154; // twothirds
+ case 0x0ab2: return 0x2155; // onefifth
+ case 0x0ab3: return 0x2156; // twofifths
+ case 0x0ab4: return 0x2157; // threefifths
+ case 0x0ab5: return 0x2158; // fourfifths
+ case 0x0ab6: return 0x2159; // onesixth
+ case 0x0ab7: return 0x215a; // fivesixths
+ case 0x0ac3: return 0x215b; // oneeighth
+ case 0x0ac4: return 0x215c; // threeeighths
+ case 0x0ac5: return 0x215d; // fiveeighths
+ case 0x0ac6: return 0x215e; // seveneighths
+ case 0x08fb: return 0x2190; // leftarrow
+ case 0x08fc: return 0x2191; // uparrow
+ case 0x08fd: return 0x2192; // rightarrow
+ case 0x08fe: return 0x2193; // downarrow
+ case 0x08ce: return 0x21d2; // implies
+ case 0x08cd: return 0x21d4; // ifonlyif
+ case 0x08ef: return 0x2202; // partialderivative
+ case 0x08c5: return 0x2207; // nabla
+ case 0x0bca: return 0x2218; // jot
+ case 0x08d6: return 0x221a; // radical
+ case 0x08c1: return 0x221d; // variation
+ case 0x08c2: return 0x221e; // infinity
+ case 0x08de: return 0x2227; // logicaland
+ case 0x0ba9: return 0x2227; // upcaret
+ case 0x0ba8: return 0x2228; // downcaret
+ case 0x08df: return 0x2228; // logicalor
+ case 0x08dc: return 0x2229; // intersection
+ case 0x0bc3: return 0x2229; // upshoe
+ case 0x0bd6: return 0x222a; // downshoe
+ case 0x08dd: return 0x222a; // union
+ case 0x08bf: return 0x222b; // integral
+ case 0x08c0: return 0x2234; // therefore
+ case 0x08c8: return 0x223c; // approximate
+ case 0x08c9: return 0x2243; // similarequal
+ case 0x08bd: return 0x2260; // notequal
+ case 0x08cf: return 0x2261; // identical
+ case 0x08bc: return 0x2264; // lessthanequal
+ case 0x08be: return 0x2265; // greaterthanequal
+ case 0x08da: return 0x2282; // includedin
+ case 0x0bda: return 0x2282; // leftshoe
+ case 0x08db: return 0x2283; // includes
+ case 0x0bd8: return 0x2283; // rightshoe
+ case 0x0bdc: return 0x22a2; // lefttack
+ case 0x0bfc: return 0x22a3; // righttack
+ case 0x0bce: return 0x22a4; // uptack
+ case 0x0bc2: return 0x22a5; // downtack
+ case 0x0bd3: return 0x2308; // upstile
+ case 0x0bc4: return 0x230a; // downstile
+ case 0x0afa: return 0x2315; // telephonerecorder
+ case 0x08a4: return 0x2320; // topintegral
+ case 0x08a5: return 0x2321; // botintegral
+ case 0x0bcc: return 0x2395; // quad
+ case 0x08ab: return 0x239b; // topleftparens
+ case 0x08ac: return 0x239d; // botleftparens
+ case 0x08ad: return 0x239e; // toprightparens
+ case 0x08ae: return 0x23a0; // botrightparens
+ case 0x08a7: return 0x23a1; // topleftsqbracket
+ case 0x08a8: return 0x23a3; // botleftsqbracket
+ case 0x08a9: return 0x23a4; // toprightsqbracket
+ case 0x08aa: return 0x23a6; // botrightsqbracket
+ case 0x08af: return 0x23a8; // leftmiddlecurlybrace
+ case 0x08b0: return 0x23ac; // rightmiddlecurlybrace
+ case 0x08a1: return 0x23b7; // leftradical
+ case 0x09ef: return 0x23ba; // horizlinescan1
+ case 0x09f0: return 0x23bb; // horizlinescan3
+ case 0x09f2: return 0x23bc; // horizlinescan7
+ case 0x09f3: return 0x23bd; // horizlinescan9
+ case 0x09e2: return 0x2409; // ht
+ case 0x09e5: return 0x240a; // lf
+ case 0x09e9: return 0x240b; // vt
+ case 0x09e3: return 0x240c; // ff
+ case 0x09e4: return 0x240d; // cr
+ case 0x0aac: return 0x2423; // signifblank
+ case 0x09e8: return 0x2424; // nl
+ case 0x08a3: return 0x2500; // horizconnector
+ case 0x09f1: return 0x2500; // horizlinescan5
+ case 0x09f8: return 0x2502; // vertbar
+ case 0x08a6: return 0x2502; // vertconnector
+ case 0x08a2: return 0x250c; // topleftradical
+ case 0x09ec: return 0x250c; // upleftcorner
+ case 0x09eb: return 0x2510; // uprightcorner
+ case 0x09ed: return 0x2514; // lowleftcorner
+ case 0x09ea: return 0x2518; // lowrightcorner
+ case 0x09f4: return 0x251c; // leftt
+ case 0x09f5: return 0x2524; // rightt
+ case 0x09f7: return 0x252c; // topt
+ case 0x09f6: return 0x2534; // bott
+ case 0x09ee: return 0x253c; // crossinglines
+ case 0x09e1: return 0x2592; // checkerboard
+ case 0x0ae7: return 0x25aa; // enfilledsqbullet
+ case 0x0ae1: return 0x25ab; // enopensquarebullet
+ case 0x0adb: return 0x25ac; // filledrectbullet
+ case 0x0ae2: return 0x25ad; // openrectbullet
+ case 0x0adf: return 0x25ae; // emfilledrect
+ case 0x0acf: return 0x25af; // emopenrectangle
+ case 0x0ae8: return 0x25b2; // filledtribulletup
+ case 0x0ae3: return 0x25b3; // opentribulletup
+ case 0x0add: return 0x25b6; // filledrighttribullet
+ case 0x0acd: return 0x25b7; // rightopentriangle
+ case 0x0ae9: return 0x25bc; // filledtribulletdown
+ case 0x0ae4: return 0x25bd; // opentribulletdown
+ case 0x0adc: return 0x25c0; // filledlefttribullet
+ case 0x0acc: return 0x25c1; // leftopentriangle
+ case 0x09e0: return 0x25c6; // soliddiamond
+ case 0x0bcf: return 0x25cb; // circle
+ case 0x0ace: return 0x25cb; // emopencircle
+ case 0x0ade: return 0x25cf; // emfilledcircle
+ case 0x0ae0: return 0x25e6; // enopencircbullet
+ case 0x0ae5: return 0x2606; // openstar
+ case 0x0af9: return 0x260e; // telephone
+ case 0x0aca: return 0x2613; // signaturemark
+ case 0x0aea: return 0x261c; // leftpointer
+ case 0x0aeb: return 0x261e; // rightpointer
+ case 0x0af8: return 0x2640; // femalesymbol
+ case 0x0af7: return 0x2642; // malesymbol
+ case 0x0aec: return 0x2663; // club
+ case 0x0aee: return 0x2665; // heart
+ case 0x0aed: return 0x2666; // diamond
+ case 0x0af6: return 0x266d; // musicalflat
+ case 0x0af5: return 0x266f; // musicalsharp
+ case 0x0af3: return 0x2713; // checkmark
+ case 0x0af4: return 0x2717; // ballotcross
+ case 0x0ad9: return 0x271d; // latincross
+ case 0x0af0: return 0x2720; // maltesecross
+ case 0x0abc: return 0x27e8; // leftanglebracket
+ case 0x0abe: return 0x27e9; // rightanglebracket
+ case 0x04a4: return 0x3001; // kana_comma
+ case 0x04a1: return 0x3002; // kana_fullstop
+ case 0x04a2: return 0x300c; // kana_openingbracket
+ case 0x04a3: return 0x300d; // kana_closingbracket
+ case 0xfe5e: return 0x3099; // dead_voiced_sound
+ case 0xfe5f: return 0x309a; // dead_semivoiced_sound
+ case 0x04de: return 0x309b; // voicedsound
+ case 0x04df: return 0x309c; // semivoicedsound
+ case 0x04a7: return 0x30a1; // kana_a
+ case 0x04b1: return 0x30a2; // kana_A
+ case 0x04a8: return 0x30a3; // kana_i
+ case 0x04b2: return 0x30a4; // kana_I
+ case 0x04a9: return 0x30a5; // kana_u
+ case 0x04b3: return 0x30a6; // kana_U
+ case 0x04aa: return 0x30a7; // kana_e
+ case 0x04b4: return 0x30a8; // kana_E
+ case 0x04ab: return 0x30a9; // kana_o
+ case 0x04b5: return 0x30aa; // kana_O
+ case 0x04b6: return 0x30ab; // kana_KA
+ case 0x04b7: return 0x30ad; // kana_KI
+ case 0x04b8: return 0x30af; // kana_KU
+ case 0x04b9: return 0x30b1; // kana_KE
+ case 0x04ba: return 0x30b3; // kana_KO
+ case 0x04bb: return 0x30b5; // kana_SA
+ case 0x04bc: return 0x30b7; // kana_SHI
+ case 0x04bd: return 0x30b9; // kana_SU
+ case 0x04be: return 0x30bb; // kana_SE
+ case 0x04bf: return 0x30bd; // kana_SO
+ case 0x04c0: return 0x30bf; // kana_TA
+ case 0x04c1: return 0x30c1; // kana_CHI
+ case 0x04af: return 0x30c3; // kana_tsu
+ case 0x04c2: return 0x30c4; // kana_TSU
+ case 0x04c3: return 0x30c6; // kana_TE
+ case 0x04c4: return 0x30c8; // kana_TO
+ case 0x04c5: return 0x30ca; // kana_NA
+ case 0x04c6: return 0x30cb; // kana_NI
+ case 0x04c7: return 0x30cc; // kana_NU
+ case 0x04c8: return 0x30cd; // kana_NE
+ case 0x04c9: return 0x30ce; // kana_NO
+ case 0x04ca: return 0x30cf; // kana_HA
+ case 0x04cb: return 0x30d2; // kana_HI
+ case 0x04cc: return 0x30d5; // kana_FU
+ case 0x04cd: return 0x30d8; // kana_HE
+ case 0x04ce: return 0x30db; // kana_HO
+ case 0x04cf: return 0x30de; // kana_MA
+ case 0x04d0: return 0x30df; // kana_MI
+ case 0x04d1: return 0x30e0; // kana_MU
+ case 0x04d2: return 0x30e1; // kana_ME
+ case 0x04d3: return 0x30e2; // kana_MO
+ case 0x04ac: return 0x30e3; // kana_ya
+ case 0x04d4: return 0x30e4; // kana_YA
+ case 0x04ad: return 0x30e5; // kana_yu
+ case 0x04d5: return 0x30e6; // kana_YU
+ case 0x04ae: return 0x30e7; // kana_yo
+ case 0x04d6: return 0x30e8; // kana_YO
+ case 0x04d7: return 0x30e9; // kana_RA
+ case 0x04d8: return 0x30ea; // kana_RI
+ case 0x04d9: return 0x30eb; // kana_RU
+ case 0x04da: return 0x30ec; // kana_RE
+ case 0x04db: return 0x30ed; // kana_RO
+ case 0x04dc: return 0x30ef; // kana_WA
+ case 0x04a6: return 0x30f2; // kana_WO
+ case 0x04dd: return 0x30f3; // kana_N
+ case 0x04a5: return 0x30fb; // kana_conjunctive
+ case 0x04b0: return 0x30fc; // prolongedsound
+ case 0x0ea1: return 0x3131; // Hangul_Kiyeog
+ case 0x0ea2: return 0x3132; // Hangul_SsangKiyeog
+ case 0x0ea3: return 0x3133; // Hangul_KiyeogSios
+ case 0x0ea4: return 0x3134; // Hangul_Nieun
+ case 0x0ea5: return 0x3135; // Hangul_NieunJieuj
+ case 0x0ea6: return 0x3136; // Hangul_NieunHieuh
+ case 0x0ea7: return 0x3137; // Hangul_Dikeud
+ case 0x0ea8: return 0x3138; // Hangul_SsangDikeud
+ case 0x0ea9: return 0x3139; // Hangul_Rieul
+ case 0x0eaa: return 0x313a; // Hangul_RieulKiyeog
+ case 0x0eab: return 0x313b; // Hangul_RieulMieum
+ case 0x0eac: return 0x313c; // Hangul_RieulPieub
+ case 0x0ead: return 0x313d; // Hangul_RieulSios
+ case 0x0eae: return 0x313e; // Hangul_RieulTieut
+ case 0x0eaf: return 0x313f; // Hangul_RieulPhieuf
+ case 0x0eb0: return 0x3140; // Hangul_RieulHieuh
+ case 0x0eb1: return 0x3141; // Hangul_Mieum
+ case 0x0eb2: return 0x3142; // Hangul_Pieub
+ case 0x0eb3: return 0x3143; // Hangul_SsangPieub
+ case 0x0eb4: return 0x3144; // Hangul_PieubSios
+ case 0x0eb5: return 0x3145; // Hangul_Sios
+ case 0x0eb6: return 0x3146; // Hangul_SsangSios
+ case 0x0eb7: return 0x3147; // Hangul_Ieung
+ case 0x0eb8: return 0x3148; // Hangul_Jieuj
+ case 0x0eb9: return 0x3149; // Hangul_SsangJieuj
+ case 0x0eba: return 0x314a; // Hangul_Cieuc
+ case 0x0ebb: return 0x314b; // Hangul_Khieuq
+ case 0x0ebc: return 0x314c; // Hangul_Tieut
+ case 0x0ebd: return 0x314d; // Hangul_Phieuf
+ case 0x0ebe: return 0x314e; // Hangul_Hieuh
+ case 0x0ebf: return 0x314f; // Hangul_A
+ case 0x0ec0: return 0x3150; // Hangul_AE
+ case 0x0ec1: return 0x3151; // Hangul_YA
+ case 0x0ec2: return 0x3152; // Hangul_YAE
+ case 0x0ec3: return 0x3153; // Hangul_EO
+ case 0x0ec4: return 0x3154; // Hangul_E
+ case 0x0ec5: return 0x3155; // Hangul_YEO
+ case 0x0ec6: return 0x3156; // Hangul_YE
+ case 0x0ec7: return 0x3157; // Hangul_O
+ case 0x0ec8: return 0x3158; // Hangul_WA
+ case 0x0ec9: return 0x3159; // Hangul_WAE
+ case 0x0eca: return 0x315a; // Hangul_OE
+ case 0x0ecb: return 0x315b; // Hangul_YO
+ case 0x0ecc: return 0x315c; // Hangul_U
+ case 0x0ecd: return 0x315d; // Hangul_WEO
+ case 0x0ece: return 0x315e; // Hangul_WE
+ case 0x0ecf: return 0x315f; // Hangul_WI
+ case 0x0ed0: return 0x3160; // Hangul_YU
+ case 0x0ed1: return 0x3161; // Hangul_EU
+ case 0x0ed2: return 0x3162; // Hangul_YI
+ case 0x0ed3: return 0x3163; // Hangul_I
+ case 0x0eef: return 0x316d; // Hangul_RieulYeorinHieuh
+ case 0x0ef0: return 0x3171; // Hangul_SunkyeongeumMieum
+ case 0x0ef1: return 0x3178; // Hangul_SunkyeongeumPieub
+ case 0x0ef2: return 0x317f; // Hangul_PanSios
+ case 0x0ef3: return 0x3181; // Hangul_KkogjiDalrinIeung
+ case 0x0ef4: return 0x3184; // Hangul_SunkyeongeumPhieuf
+ case 0x0ef5: return 0x3186; // Hangul_YeorinHieuh
+ case 0x0ef6: return 0x318d; // Hangul_AraeA
+ case 0x0ef7: return 0x318e; // Hangul_AraeAE
+ default: return 0;
+ }
+}
+
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Window/Unix/KeySymToUnicodeMapping.hpp b/src/SFML/Window/Unix/KeySymToUnicodeMapping.hpp
new file mode 100644
index 0000000..4628941
--- /dev/null
+++ b/src/SFML/Window/Unix/KeySymToUnicodeMapping.hpp
@@ -0,0 +1,60 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_KEYSYMTOUNICODEMAPPING_HPP
+#define SFML_KEYSYMTOUNICODEMAPPING_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Config.hpp> // sf::Uint32
+#include <X11/X.h> // KeySym
+
+namespace sf
+{
+namespace priv
+{
+
+////////////////////////////////////////////////////////////
+/// \brief Converts a KeySym to UTF-32
+///
+/// This code was autogenerated from the following table:
+/// https://www.cl.cam.ac.uk/~mgk25/ucs/keysyms.txt
+///
+/// The generated table was edited so that dead keys are mapped to
+/// non-combining characters instead of combining diacritical marks
+/// because is it more suitable to describe those keys in user interfaces.
+///
+/// \param keysym keysym to be converted
+///
+/// \return corresponding UTF-32
+///
+////////////////////////////////////////////////////////////
+Uint32 keysymToUnicode(KeySym keysym);
+
+} // namespace priv
+
+} // namespace sf
+
+#endif // SFML_KEYSYMTOUNICODEMAPPING_HPP
diff --git a/src/SFML/Window/Unix/KeyboardImpl.cpp b/src/SFML/Window/Unix/KeyboardImpl.cpp
new file mode 100644
index 0000000..b3d991b
--- /dev/null
+++ b/src/SFML/Window/Unix/KeyboardImpl.cpp
@@ -0,0 +1,815 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Unix/KeyboardImpl.hpp>
+#include <SFML/Window/Unix/Display.hpp>
+#include <SFML/Window/Unix/KeySymToKeyMapping.hpp>
+#include <SFML/Window/Unix/KeySymToUnicodeMapping.hpp>
+#include <SFML/System/String.hpp>
+#include <SFML/System/Utf.hpp>
+#include <X11/keysym.h>
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+#include <cstring>
+#include <map>
+#include <string>
+#include <utility>
+
+namespace
+{
+
+const KeyCode NullKeyCode = 0;
+const int MaxKeyCode = 256;
+KeyCode scancodeToKeycode[sf::Keyboard::Scan::ScancodeCount]; ///< Mapping of SFML scancode to X11 KeyCode
+sf::Keyboard::Scancode keycodeToScancode[MaxKeyCode]; ///< Mapping of X11 KeyCode to SFML scancode
+
+////////////////////////////////////////////////////////////
+bool isValidKeycode(KeyCode keycode)
+{
+ // Valid key code range is [8,255], according to the Xlib manual
+ return keycode >= 8;
+}
+
+
+////////////////////////////////////////////////////////////
+sf::Keyboard::Scancode translateKeyCode(Display* display, KeyCode keycode)
+{
+ if (!isValidKeycode(keycode))
+ return sf::Keyboard::Scan::Unknown;
+
+ // Try secondary keysym, for numeric keypad keys
+ // Note: This way we always force "NumLock = ON", which is intentional
+ // since the returned key code should correspond to a physical location.
+ KeySym keySym = XkbKeycodeToKeysym(display, keycode, 0, 1);
+
+ switch (keySym)
+ {
+ case XK_KP_0: return sf::Keyboard::Scan::Numpad0;
+ case XK_KP_1: return sf::Keyboard::Scan::Numpad1;
+ case XK_KP_2: return sf::Keyboard::Scan::Numpad2;
+ case XK_KP_3: return sf::Keyboard::Scan::Numpad3;
+ case XK_KP_4: return sf::Keyboard::Scan::Numpad4;
+ case XK_KP_5: return sf::Keyboard::Scan::Numpad5;
+ case XK_KP_6: return sf::Keyboard::Scan::Numpad6;
+ case XK_KP_7: return sf::Keyboard::Scan::Numpad7;
+ case XK_KP_8: return sf::Keyboard::Scan::Numpad8;
+ case XK_KP_9: return sf::Keyboard::Scan::Numpad9;
+ case XK_KP_Separator: return sf::Keyboard::Scan::NumpadDecimal;
+ case XK_KP_Decimal: return sf::Keyboard::Scan::NumpadDecimal;
+ case XK_KP_Equal: return sf::Keyboard::Scan::NumpadEqual;
+ case XK_KP_Enter: return sf::Keyboard::Scan::NumpadEnter;
+ default: break;
+ }
+
+ // Now try primary keysym for function keys (non-printable keys)
+ // These should not depend on the current keyboard layout
+ keySym = XkbKeycodeToKeysym(display, keycode, 0, 0);
+
+ switch (keySym)
+ {
+ case XK_Return: return sf::Keyboard::Scan::Enter;
+ case XK_Escape: return sf::Keyboard::Scan::Escape;
+ case XK_BackSpace: return sf::Keyboard::Scan::Backspace;
+ case XK_Tab: return sf::Keyboard::Scan::Tab;
+ case XK_Shift_L: return sf::Keyboard::Scan::LShift;
+ case XK_Shift_R: return sf::Keyboard::Scan::RShift;
+ case XK_Control_L: return sf::Keyboard::Scan::LControl;
+ case XK_Control_R: return sf::Keyboard::Scan::RControl;
+ case XK_Alt_L: return sf::Keyboard::Scan::LAlt;
+ case XK_ISO_Level3_Shift: // AltGr on at least some machines
+ case XK_Alt_R: return sf::Keyboard::Scan::RAlt;
+ case XK_Meta_L:
+ case XK_Super_L: return sf::Keyboard::Scan::LSystem;
+ case XK_Meta_R:
+ case XK_Super_R: return sf::Keyboard::Scan::RSystem;
+ case XK_Menu: return sf::Keyboard::Scan::Menu;
+
+ case XK_Num_Lock: return sf::Keyboard::Scan::NumLock;
+ case XK_Caps_Lock: return sf::Keyboard::Scan::CapsLock;
+ case XK_Execute: return sf::Keyboard::Scan::Execute;
+ case XK_Hyper_R: return sf::Keyboard::Scan::Application;
+ case XK_Select: return sf::Keyboard::Scan::Select;
+ case XK_Cancel: return sf::Keyboard::Scan::Stop;
+ case XK_Redo: return sf::Keyboard::Scan::Redo;
+ case XK_Undo: return sf::Keyboard::Scan::Undo;
+ case XK_Find: return sf::Keyboard::Scan::Search;
+ case XK_Mode_switch: return sf::Keyboard::Scan::ModeChange;
+
+ case XK_Print: return sf::Keyboard::Scan::PrintScreen;
+ case XK_Scroll_Lock: return sf::Keyboard::Scan::ScrollLock;
+ case XK_Pause:
+ case XK_Break: return sf::Keyboard::Scan::Pause;
+
+ case XK_Delete:
+ case XK_Clear: return sf::Keyboard::Scan::Delete;
+ case XK_Home: return sf::Keyboard::Scan::Home;
+ case XK_End: return sf::Keyboard::Scan::End;
+ case XK_Page_Up: return sf::Keyboard::Scan::PageUp;
+ case XK_Page_Down: return sf::Keyboard::Scan::PageDown;
+ case XK_Insert: return sf::Keyboard::Scan::Insert;
+
+ case XK_Left: return sf::Keyboard::Scan::Left;
+ case XK_Right: return sf::Keyboard::Scan::Right;
+ case XK_Down: return sf::Keyboard::Scan::Down;
+ case XK_Up: return sf::Keyboard::Scan::Up;
+
+ case XK_F1: return sf::Keyboard::Scan::F1;
+ case XK_F2: return sf::Keyboard::Scan::F2;
+ case XK_F3: return sf::Keyboard::Scan::F3;
+ case XK_F4: return sf::Keyboard::Scan::F4;
+ case XK_F5: return sf::Keyboard::Scan::F5;
+ case XK_F6: return sf::Keyboard::Scan::F6;
+ case XK_F7: return sf::Keyboard::Scan::F7;
+ case XK_F8: return sf::Keyboard::Scan::F8;
+ case XK_F9: return sf::Keyboard::Scan::F9;
+ case XK_F10: return sf::Keyboard::Scan::F10;
+ case XK_F11: return sf::Keyboard::Scan::F11;
+ case XK_F12: return sf::Keyboard::Scan::F12;
+ case XK_F13: return sf::Keyboard::Scan::F13;
+ case XK_F14: return sf::Keyboard::Scan::F14;
+ case XK_F15: return sf::Keyboard::Scan::F15;
+ case XK_F16: return sf::Keyboard::Scan::F16;
+ case XK_F17: return sf::Keyboard::Scan::F17;
+ case XK_F18: return sf::Keyboard::Scan::F18;
+ case XK_F19: return sf::Keyboard::Scan::F19;
+ case XK_F20: return sf::Keyboard::Scan::F20;
+ case XK_F21: return sf::Keyboard::Scan::F21;
+ case XK_F22: return sf::Keyboard::Scan::F22;
+ case XK_F23: return sf::Keyboard::Scan::F23;
+ case XK_F24: return sf::Keyboard::Scan::F24;
+
+ // Numeric keypad
+ case XK_KP_Divide: return sf::Keyboard::Scan::NumpadDivide;
+ case XK_KP_Multiply: return sf::Keyboard::Scan::NumpadMultiply;
+ case XK_KP_Subtract: return sf::Keyboard::Scan::NumpadMinus;
+ case XK_KP_Add: return sf::Keyboard::Scan::NumpadPlus;
+
+ // These should have been detected in secondary keysym test above!
+ case XK_KP_Insert: return sf::Keyboard::Scan::Numpad0;
+ case XK_KP_End: return sf::Keyboard::Scan::Numpad1;
+ case XK_KP_Down: return sf::Keyboard::Scan::Numpad2;
+ case XK_KP_Page_Down: return sf::Keyboard::Scan::Numpad3;
+ case XK_KP_Left: return sf::Keyboard::Scan::Numpad4;
+ case XK_KP_Right: return sf::Keyboard::Scan::Numpad6;
+ case XK_KP_Home: return sf::Keyboard::Scan::Numpad7;
+ case XK_KP_Up: return sf::Keyboard::Scan::Numpad8;
+ case XK_KP_Page_Up: return sf::Keyboard::Scan::Numpad9;
+ case XK_KP_Delete: return sf::Keyboard::Scan::NumpadDecimal;
+ case XK_KP_Equal: return sf::Keyboard::Scan::NumpadEqual;
+ case XK_KP_Enter: return sf::Keyboard::Scan::NumpadEnter;
+
+ // Last resort: Check for printable keys (should not happen if the XKB
+ // extension is available). This will give a layout dependent mapping
+ // (which is wrong, and we may miss some keys, especially on non-US
+ // keyboards), but it's better than nothing...
+ case XK_a:
+ case XK_A: return sf::Keyboard::Scan::A;
+ case XK_b:
+ case XK_B: return sf::Keyboard::Scan::B;
+ case XK_c:
+ case XK_C: return sf::Keyboard::Scan::C;
+ case XK_d:
+ case XK_D: return sf::Keyboard::Scan::D;
+ case XK_e:
+ case XK_E: return sf::Keyboard::Scan::E;
+ case XK_f:
+ case XK_F: return sf::Keyboard::Scan::F;
+ case XK_g:
+ case XK_G: return sf::Keyboard::Scan::G;
+ case XK_h:
+ case XK_H: return sf::Keyboard::Scan::H;
+ case XK_i:
+ case XK_I: return sf::Keyboard::Scan::I;
+ case XK_j:
+ case XK_J: return sf::Keyboard::Scan::J;
+ case XK_k:
+ case XK_K: return sf::Keyboard::Scan::K;
+ case XK_l:
+ case XK_L: return sf::Keyboard::Scan::L;
+ case XK_m:
+ case XK_M: return sf::Keyboard::Scan::M;
+ case XK_n:
+ case XK_N: return sf::Keyboard::Scan::N;
+ case XK_o:
+ case XK_O: return sf::Keyboard::Scan::O;
+ case XK_p:
+ case XK_P: return sf::Keyboard::Scan::P;
+ case XK_q:
+ case XK_Q: return sf::Keyboard::Scan::Q;
+ case XK_r:
+ case XK_R: return sf::Keyboard::Scan::R;
+ case XK_s:
+ case XK_S: return sf::Keyboard::Scan::S;
+ case XK_t:
+ case XK_T: return sf::Keyboard::Scan::T;
+ case XK_u:
+ case XK_U: return sf::Keyboard::Scan::U;
+ case XK_v:
+ case XK_V: return sf::Keyboard::Scan::V;
+ case XK_w:
+ case XK_W: return sf::Keyboard::Scan::W;
+ case XK_x:
+ case XK_X: return sf::Keyboard::Scan::X;
+ case XK_y:
+ case XK_Y: return sf::Keyboard::Scan::Y;
+ case XK_z:
+ case XK_Z: return sf::Keyboard::Scan::Z;
+
+ case XK_1: return sf::Keyboard::Scan::Num1;
+ case XK_2: return sf::Keyboard::Scan::Num2;
+ case XK_3: return sf::Keyboard::Scan::Num3;
+ case XK_4: return sf::Keyboard::Scan::Num4;
+ case XK_5: return sf::Keyboard::Scan::Num5;
+ case XK_6: return sf::Keyboard::Scan::Num6;
+ case XK_7: return sf::Keyboard::Scan::Num7;
+ case XK_8: return sf::Keyboard::Scan::Num8;
+ case XK_9: return sf::Keyboard::Scan::Num9;
+ case XK_0: return sf::Keyboard::Scan::Num0;
+
+ case XK_space: return sf::Keyboard::Scan::Space;
+ case XK_minus: return sf::Keyboard::Scan::Hyphen;
+ case XK_equal: return sf::Keyboard::Scan::Equal;
+ case XK_bracketleft: return sf::Keyboard::Scan::LBracket;
+ case XK_bracketright: return sf::Keyboard::Scan::RBracket;
+ case XK_backslash: return sf::Keyboard::Scan::Backslash;
+ case XK_semicolon: return sf::Keyboard::Scan::Semicolon;
+ case XK_apostrophe: return sf::Keyboard::Scan::Apostrophe;
+ case XK_grave: return sf::Keyboard::Scan::Grave;
+ case XK_comma: return sf::Keyboard::Scan::Comma;
+ case XK_period: return sf::Keyboard::Scan::Period;
+ case XK_slash: return sf::Keyboard::Scan::Slash;
+ case XK_less: return sf::Keyboard::Scan::NonUsBackslash;
+
+ default: return sf::Keyboard::Scan::Unknown;
+ }
+}
+
+////////////////////////////////////////////////////////////
+std::map<std::string, sf::Keyboard::Scancode> GetNameScancodeMap()
+{
+ std::map<std::string, sf::Keyboard::Scancode> mapping;
+
+ mapping.insert(std::make_pair("LSGT", sf::Keyboard::Scan::NonUsBackslash));
+
+ mapping.insert(std::make_pair("TLDE", sf::Keyboard::Scan::Grave));
+ mapping.insert(std::make_pair("AE01", sf::Keyboard::Scan::Num1));
+ mapping.insert(std::make_pair("AE02", sf::Keyboard::Scan::Num2));
+ mapping.insert(std::make_pair("AE03", sf::Keyboard::Scan::Num3));
+ mapping.insert(std::make_pair("AE04", sf::Keyboard::Scan::Num4));
+ mapping.insert(std::make_pair("AE05", sf::Keyboard::Scan::Num5));
+ mapping.insert(std::make_pair("AE06", sf::Keyboard::Scan::Num6));
+ mapping.insert(std::make_pair("AE07", sf::Keyboard::Scan::Num7));
+ mapping.insert(std::make_pair("AE08", sf::Keyboard::Scan::Num8));
+ mapping.insert(std::make_pair("AE09", sf::Keyboard::Scan::Num9));
+ mapping.insert(std::make_pair("AE10", sf::Keyboard::Scan::Num0));
+ mapping.insert(std::make_pair("AE11", sf::Keyboard::Scan::Hyphen));
+ mapping.insert(std::make_pair("AE12", sf::Keyboard::Scan::Equal));
+ mapping.insert(std::make_pair("BKSP", sf::Keyboard::Scan::Backspace));
+ mapping.insert(std::make_pair("TAB", sf::Keyboard::Scan::Tab));
+ mapping.insert(std::make_pair("AD01", sf::Keyboard::Scan::Q));
+ mapping.insert(std::make_pair("AD02", sf::Keyboard::Scan::W));
+ mapping.insert(std::make_pair("AD03", sf::Keyboard::Scan::E));
+ mapping.insert(std::make_pair("AD04", sf::Keyboard::Scan::R));
+ mapping.insert(std::make_pair("AD05", sf::Keyboard::Scan::T));
+ mapping.insert(std::make_pair("AD06", sf::Keyboard::Scan::Y));
+ mapping.insert(std::make_pair("AD07", sf::Keyboard::Scan::U));
+ mapping.insert(std::make_pair("AD08", sf::Keyboard::Scan::I));
+ mapping.insert(std::make_pair("AD09", sf::Keyboard::Scan::O));
+ mapping.insert(std::make_pair("AD10", sf::Keyboard::Scan::P));
+ mapping.insert(std::make_pair("AD11", sf::Keyboard::Scan::LBracket));
+ mapping.insert(std::make_pair("AD12", sf::Keyboard::Scan::RBracket));
+ mapping.insert(std::make_pair("BKSL", sf::Keyboard::Scan::Backslash));
+ mapping.insert(std::make_pair("RTRN", sf::Keyboard::Scan::Enter));
+
+ mapping.insert(std::make_pair("CAPS", sf::Keyboard::Scan::CapsLock));
+ mapping.insert(std::make_pair("AC01", sf::Keyboard::Scan::A));
+ mapping.insert(std::make_pair("AC02", sf::Keyboard::Scan::S));
+ mapping.insert(std::make_pair("AC03", sf::Keyboard::Scan::D));
+ mapping.insert(std::make_pair("AC04", sf::Keyboard::Scan::F));
+ mapping.insert(std::make_pair("AC05", sf::Keyboard::Scan::G));
+ mapping.insert(std::make_pair("AC06", sf::Keyboard::Scan::H));
+ mapping.insert(std::make_pair("AC07", sf::Keyboard::Scan::J));
+ mapping.insert(std::make_pair("AC08", sf::Keyboard::Scan::K));
+ mapping.insert(std::make_pair("AC09", sf::Keyboard::Scan::L));
+ mapping.insert(std::make_pair("AC10", sf::Keyboard::Scan::Semicolon));
+ mapping.insert(std::make_pair("AC11", sf::Keyboard::Scan::Apostrophe));
+ mapping.insert(std::make_pair("AC12", sf::Keyboard::Scan::Backslash));
+
+ mapping.insert(std::make_pair("LFSH", sf::Keyboard::Scan::LShift));
+ mapping.insert(std::make_pair("AB01", sf::Keyboard::Scan::Z));
+ mapping.insert(std::make_pair("AB02", sf::Keyboard::Scan::X));
+ mapping.insert(std::make_pair("AB03", sf::Keyboard::Scan::C));
+ mapping.insert(std::make_pair("AB04", sf::Keyboard::Scan::V));
+ mapping.insert(std::make_pair("AB05", sf::Keyboard::Scan::B));
+ mapping.insert(std::make_pair("AB06", sf::Keyboard::Scan::N));
+ mapping.insert(std::make_pair("AB07", sf::Keyboard::Scan::M));
+ mapping.insert(std::make_pair("AB08", sf::Keyboard::Scan::Comma));
+ mapping.insert(std::make_pair("AB09", sf::Keyboard::Scan::Period));
+ mapping.insert(std::make_pair("AB10", sf::Keyboard::Scan::Slash));
+ mapping.insert(std::make_pair("RTSH", sf::Keyboard::Scan::RShift));
+
+ mapping.insert(std::make_pair("LCTL", sf::Keyboard::Scan::LControl));
+ mapping.insert(std::make_pair("LALT", sf::Keyboard::Scan::LAlt));
+ mapping.insert(std::make_pair("SPCE", sf::Keyboard::Scan::Space));
+ mapping.insert(std::make_pair("RCTL", sf::Keyboard::Scan::RControl));
+ mapping.insert(std::make_pair("RALT", sf::Keyboard::Scan::RAlt));
+ mapping.insert(std::make_pair("LVL3", sf::Keyboard::Scan::RAlt));
+ mapping.insert(std::make_pair("ALGR", sf::Keyboard::Scan::RAlt));
+ mapping.insert(std::make_pair("LWIN", sf::Keyboard::Scan::LSystem));
+ mapping.insert(std::make_pair("RWIN", sf::Keyboard::Scan::RSystem));
+
+ mapping.insert(std::make_pair("HYPR", sf::Keyboard::Scan::Application));
+ mapping.insert(std::make_pair("EXEC", sf::Keyboard::Scan::Execute));
+ mapping.insert(std::make_pair("MDSW", sf::Keyboard::Scan::ModeChange));
+ mapping.insert(std::make_pair("MENU", sf::Keyboard::Scan::Menu));
+ mapping.insert(std::make_pair("COMP", sf::Keyboard::Scan::Menu));
+ mapping.insert(std::make_pair("SELE", sf::Keyboard::Scan::Select));
+
+ mapping.insert(std::make_pair("ESC", sf::Keyboard::Scan::Escape));
+ mapping.insert(std::make_pair("FK01", sf::Keyboard::Scan::F1));
+ mapping.insert(std::make_pair("FK02", sf::Keyboard::Scan::F2));
+ mapping.insert(std::make_pair("FK03", sf::Keyboard::Scan::F3));
+ mapping.insert(std::make_pair("FK04", sf::Keyboard::Scan::F4));
+ mapping.insert(std::make_pair("FK05", sf::Keyboard::Scan::F5));
+ mapping.insert(std::make_pair("FK06", sf::Keyboard::Scan::F6));
+ mapping.insert(std::make_pair("FK07", sf::Keyboard::Scan::F7));
+ mapping.insert(std::make_pair("FK08", sf::Keyboard::Scan::F8));
+ mapping.insert(std::make_pair("FK09", sf::Keyboard::Scan::F9));
+ mapping.insert(std::make_pair("FK10", sf::Keyboard::Scan::F10));
+ mapping.insert(std::make_pair("FK11", sf::Keyboard::Scan::F11));
+ mapping.insert(std::make_pair("FK12", sf::Keyboard::Scan::F12));
+
+ mapping.insert(std::make_pair("PRSC", sf::Keyboard::Scan::PrintScreen));
+ mapping.insert(std::make_pair("SCLK", sf::Keyboard::Scan::ScrollLock));
+ mapping.insert(std::make_pair("PAUS", sf::Keyboard::Scan::Pause));
+
+ mapping.insert(std::make_pair("INS", sf::Keyboard::Scan::Insert));
+ mapping.insert(std::make_pair("HOME", sf::Keyboard::Scan::Home));
+ mapping.insert(std::make_pair("PGUP", sf::Keyboard::Scan::PageUp));
+ mapping.insert(std::make_pair("DELE", sf::Keyboard::Scan::Delete));
+ mapping.insert(std::make_pair("END", sf::Keyboard::Scan::End));
+ mapping.insert(std::make_pair("PGDN", sf::Keyboard::Scan::PageDown));
+
+ mapping.insert(std::make_pair("UP", sf::Keyboard::Scan::Up));
+ mapping.insert(std::make_pair("RGHT", sf::Keyboard::Scan::Right));
+ mapping.insert(std::make_pair("DOWN", sf::Keyboard::Scan::Down));
+ mapping.insert(std::make_pair("LEFT", sf::Keyboard::Scan::Left));
+
+ mapping.insert(std::make_pair("NMLK", sf::Keyboard::Scan::NumLock));
+ mapping.insert(std::make_pair("KPDV", sf::Keyboard::Scan::NumpadDivide));
+ mapping.insert(std::make_pair("KPMU", sf::Keyboard::Scan::NumpadMultiply));
+ mapping.insert(std::make_pair("KPSU", sf::Keyboard::Scan::NumpadMinus));
+
+ mapping.insert(std::make_pair("KP7", sf::Keyboard::Scan::Numpad7));
+ mapping.insert(std::make_pair("KP8", sf::Keyboard::Scan::Numpad8));
+ mapping.insert(std::make_pair("KP9", sf::Keyboard::Scan::Numpad9));
+ mapping.insert(std::make_pair("KPAD", sf::Keyboard::Scan::NumpadPlus));
+ mapping.insert(std::make_pair("KP4", sf::Keyboard::Scan::Numpad4));
+ mapping.insert(std::make_pair("KP5", sf::Keyboard::Scan::Numpad5));
+ mapping.insert(std::make_pair("KP6", sf::Keyboard::Scan::Numpad6));
+ mapping.insert(std::make_pair("KP1", sf::Keyboard::Scan::Numpad1));
+ mapping.insert(std::make_pair("KP2", sf::Keyboard::Scan::Numpad2));
+ mapping.insert(std::make_pair("KP3", sf::Keyboard::Scan::Numpad3));
+ mapping.insert(std::make_pair("KPEN", sf::Keyboard::Scan::NumpadEnter));
+ mapping.insert(std::make_pair("KP0", sf::Keyboard::Scan::Numpad0));
+ mapping.insert(std::make_pair("KPDL", sf::Keyboard::Scan::NumpadDecimal));
+ mapping.insert(std::make_pair("KPEQ", sf::Keyboard::Scan::NumpadEqual));
+
+ mapping.insert(std::make_pair("FK13", sf::Keyboard::Scan::F13));
+ mapping.insert(std::make_pair("FK14", sf::Keyboard::Scan::F14));
+ mapping.insert(std::make_pair("FK15", sf::Keyboard::Scan::F15));
+ mapping.insert(std::make_pair("FK16", sf::Keyboard::Scan::F16));
+ mapping.insert(std::make_pair("FK17", sf::Keyboard::Scan::F17));
+ mapping.insert(std::make_pair("FK18", sf::Keyboard::Scan::F18));
+ mapping.insert(std::make_pair("FK19", sf::Keyboard::Scan::F19));
+ mapping.insert(std::make_pair("FK20", sf::Keyboard::Scan::F20));
+ mapping.insert(std::make_pair("FK21", sf::Keyboard::Scan::F21));
+ mapping.insert(std::make_pair("FK22", sf::Keyboard::Scan::F22));
+ mapping.insert(std::make_pair("FK23", sf::Keyboard::Scan::F23));
+ mapping.insert(std::make_pair("FK24", sf::Keyboard::Scan::F24));
+ mapping.insert(std::make_pair("LMTA", sf::Keyboard::Scan::LSystem));
+ mapping.insert(std::make_pair("RMTA", sf::Keyboard::Scan::RSystem));
+ mapping.insert(std::make_pair("MUTE", sf::Keyboard::Scan::VolumeMute));
+ mapping.insert(std::make_pair("VOL-", sf::Keyboard::Scan::VolumeDown));
+ mapping.insert(std::make_pair("VOL+", sf::Keyboard::Scan::VolumeUp));
+ mapping.insert(std::make_pair("STOP", sf::Keyboard::Scan::Stop));
+ mapping.insert(std::make_pair("REDO", sf::Keyboard::Scan::Redo));
+ mapping.insert(std::make_pair("AGAI", sf::Keyboard::Scan::Redo));
+ mapping.insert(std::make_pair("UNDO", sf::Keyboard::Scan::Undo));
+ mapping.insert(std::make_pair("COPY", sf::Keyboard::Scan::Copy));
+ mapping.insert(std::make_pair("PAST", sf::Keyboard::Scan::Paste));
+ mapping.insert(std::make_pair("FIND", sf::Keyboard::Scan::Search));
+ mapping.insert(std::make_pair("CUT", sf::Keyboard::Scan::Cut));
+ mapping.insert(std::make_pair("HELP", sf::Keyboard::Scan::Help));
+
+ mapping.insert(std::make_pair("I156", sf::Keyboard::Scan::LaunchApplication1));
+ mapping.insert(std::make_pair("I157", sf::Keyboard::Scan::LaunchApplication2));
+ mapping.insert(std::make_pair("I164", sf::Keyboard::Scan::Favorites));
+ mapping.insert(std::make_pair("I166", sf::Keyboard::Scan::Back));
+ mapping.insert(std::make_pair("I167", sf::Keyboard::Scan::Forward));
+ mapping.insert(std::make_pair("I171", sf::Keyboard::Scan::MediaNextTrack));
+ mapping.insert(std::make_pair("I172", sf::Keyboard::Scan::MediaPlayPause));
+ mapping.insert(std::make_pair("I173", sf::Keyboard::Scan::MediaPreviousTrack));
+ mapping.insert(std::make_pair("I174", sf::Keyboard::Scan::MediaStop));
+ mapping.insert(std::make_pair("I180", sf::Keyboard::Scan::HomePage));
+ mapping.insert(std::make_pair("I181", sf::Keyboard::Scan::Refresh));
+ mapping.insert(std::make_pair("I223", sf::Keyboard::Scan::LaunchMail));
+ mapping.insert(std::make_pair("I234", sf::Keyboard::Scan::LaunchMediaSelect));
+
+ return mapping;
+}
+
+////////////////////////////////////////////////////////////
+void ensureMapping()
+{
+ static bool isMappingInitialized = false;
+
+ if (isMappingInitialized)
+ return;
+
+ // Phase 1: Initialize mappings with default values
+ for (int i = 0; i < sf::Keyboard::Scan::ScancodeCount; ++i)
+ scancodeToKeycode[i] = NullKeyCode;
+
+ for (int i = 0; i < MaxKeyCode; ++i)
+ keycodeToScancode[i] = sf::Keyboard::Scan::Unknown;
+
+ // Phase 2: Get XKB names with key code
+ Display* display = sf::priv::OpenDisplay();
+
+ char name[XkbKeyNameLength + 1];
+ XkbDescPtr descriptor = XkbGetMap(display, 0, XkbUseCoreKbd);
+ XkbGetNames(display, XkbKeyNamesMask, descriptor);
+
+ std::map<std::string, sf::Keyboard::Scancode> nameScancodeMap = GetNameScancodeMap();
+ sf::Keyboard::Scancode scancode = sf::Keyboard::Scan::Unknown;
+
+ for (int keycode = descriptor->min_key_code; keycode <= descriptor->max_key_code; ++keycode)
+ {
+ if (!isValidKeycode(static_cast<KeyCode>(keycode)))
+ {
+ continue;
+ }
+
+ std::memcpy(name, descriptor->names->keys[keycode].name, XkbKeyNameLength);
+ name[XkbKeyNameLength] = '\0';
+
+ std::map<std::string, sf::Keyboard::Scancode>::iterator mappedScancode = nameScancodeMap.find(std::string(name));
+ scancode = sf::Keyboard::Scan::Unknown;
+
+ if (mappedScancode != nameScancodeMap.end())
+ scancode = mappedScancode->second;
+
+ if (scancode != sf::Keyboard::Scan::Unknown)
+ scancodeToKeycode[scancode] = static_cast<KeyCode>(keycode);
+
+ keycodeToScancode[keycode] = scancode;
+ }
+
+ XkbFreeNames(descriptor, XkbKeyNamesMask, True);
+ XkbFreeKeyboard(descriptor, 0, True);
+
+ // Phase 3: Translate un-translated keycodes using traditional X11 KeySym lookups
+ for (int keycode = 8; keycode < MaxKeyCode; ++keycode)
+ {
+ if (keycodeToScancode[static_cast<KeyCode>(keycode)] == sf::Keyboard::Scan::Unknown)
+ {
+ scancode = translateKeyCode(display, static_cast<KeyCode>(keycode));
+
+ if (scancode != sf::Keyboard::Scan::Unknown && scancodeToKeycode[scancode] == NullKeyCode)
+ scancodeToKeycode[scancode] = static_cast<KeyCode>(keycode);
+
+ keycodeToScancode[keycode] = scancode;
+ }
+ }
+
+ sf::priv::CloseDisplay(display);
+
+ isMappingInitialized = true;
+}
+
+
+////////////////////////////////////////////////////////////
+KeyCode scancodeToKeyCode(sf::Keyboard::Scancode code)
+{
+ ensureMapping();
+
+ if (code != sf::Keyboard::Scan::Unknown)
+ return scancodeToKeycode[code];
+
+ return NullKeyCode;
+}
+
+
+////////////////////////////////////////////////////////////
+sf::Keyboard::Scancode keyCodeToScancode(KeyCode code)
+{
+ ensureMapping();
+
+ if (isValidKeycode(code))
+ return keycodeToScancode[code];
+
+ return sf::Keyboard::Scan::Unknown;
+}
+
+
+////////////////////////////////////////////////////////////
+KeyCode keyToKeyCode(sf::Keyboard::Key key)
+{
+ KeySym keysym = sf::priv::keyToKeySym(key);
+
+ if (keysym != NoSymbol)
+ {
+ Display* display = sf::priv::OpenDisplay();
+ KeyCode keycode = XKeysymToKeycode(display, keysym);
+ sf::priv::CloseDisplay(display);
+
+ if (keycode != NullKeyCode)
+ return keycode;
+ }
+
+ // Fallback for when XKeysymToKeycode cannot tell the KeyCode for XK_Alt_R
+ if (key == sf::Keyboard::RAlt)
+ return scancodeToKeycode[sf::Keyboard::Scan::RAlt];
+
+ return NullKeyCode;
+}
+
+
+////////////////////////////////////////////////////////////
+KeySym scancodeToKeySym(sf::Keyboard::Scancode code)
+{
+ Display* display = sf::priv::OpenDisplay();
+
+ KeySym keysym = NoSymbol;
+ KeyCode keycode = scancodeToKeyCode(code);
+
+ if (keycode != NullKeyCode) // ensure that this Scancode is mapped to keycode
+ keysym = XkbKeycodeToKeysym(display, keycode, 0, 0);
+
+ sf::priv::CloseDisplay(display);
+
+ return keysym;
+}
+
+
+////////////////////////////////////////////////////////////
+bool isKeyPressedImpl(KeyCode keycode)
+{
+ if (keycode != NullKeyCode)
+ {
+ Display* display = sf::priv::OpenDisplay();
+
+ // Get the whole keyboard state
+ char keys[32];
+ XQueryKeymap(display, keys);
+
+ sf::priv::CloseDisplay(display);
+
+ // Check our keycode
+ return (keys[keycode / 8] & (1 << (keycode % 8))) != 0;
+ }
+
+ return false;
+}
+
+} // anonymous namespace
+
+namespace sf
+{
+namespace priv
+{
+
+////////////////////////////////////////////////////////////
+bool KeyboardImpl::isKeyPressed(Keyboard::Key key)
+{
+ KeyCode keycode = keyToKeyCode(key);
+ return isKeyPressedImpl(keycode);
+}
+
+
+////////////////////////////////////////////////////////////
+bool KeyboardImpl::isKeyPressed(Keyboard::Scancode code)
+{
+ KeyCode keycode = scancodeToKeyCode(code);
+ return isKeyPressedImpl(keycode);
+}
+
+
+////////////////////////////////////////////////////////////
+Keyboard::Scancode KeyboardImpl::delocalize(Keyboard::Key key)
+{
+ KeyCode keycode = keyToKeyCode(key);
+ return keyCodeToScancode(keycode);
+}
+
+
+////////////////////////////////////////////////////////////
+Keyboard::Key KeyboardImpl::localize(Keyboard::Scancode code)
+{
+ KeySym keysym = scancodeToKeySym(code);
+ return keySymToKey(keysym);
+}
+
+
+////////////////////////////////////////////////////////////
+String KeyboardImpl::getDescription(Keyboard::Scancode code)
+{
+ bool checkInput = true;
+
+ // these scancodes actually correspond to keys with input
+ // but we want to return their description, not their behaviour
+ if (code == Keyboard::Scan::Enter ||
+ code == Keyboard::Scan::Escape ||
+ code == Keyboard::Scan::Backspace ||
+ code == Keyboard::Scan::Tab ||
+ code == Keyboard::Scan::Space ||
+ code == Keyboard::Scan::ScrollLock ||
+ code == Keyboard::Scan::Pause ||
+ code == Keyboard::Scan::Delete ||
+ code == Keyboard::Scan::NumpadDivide ||
+ code == Keyboard::Scan::NumpadMultiply ||
+ code == Keyboard::Scan::NumpadMinus ||
+ code == Keyboard::Scan::NumpadPlus ||
+ code == Keyboard::Scan::NumpadEqual ||
+ code == Keyboard::Scan::NumpadEnter ||
+ code == Keyboard::Scan::NumpadDecimal)
+ {
+ checkInput = false;
+ }
+
+ if (checkInput)
+ {
+ KeySym keysym = scancodeToKeySym(code);
+ Uint32 unicode = keysymToUnicode(keysym);
+
+ if (unicode != 0)
+ return String(unicode);
+ }
+
+ // Fallback to our best guess for the keys that are known to be independent of the layout.
+ switch (code)
+ {
+ case Keyboard::Scan::Enter: return "Enter";
+ case Keyboard::Scan::Escape: return "Escape";
+ case Keyboard::Scan::Backspace: return "Backspace";
+ case Keyboard::Scan::Tab: return "Tab";
+ case Keyboard::Scan::Space: return "Space";
+
+ case Keyboard::Scan::F1: return "F1";
+ case Keyboard::Scan::F2: return "F2";
+ case Keyboard::Scan::F3: return "F3";
+ case Keyboard::Scan::F4: return "F4";
+ case Keyboard::Scan::F5: return "F5";
+ case Keyboard::Scan::F6: return "F6";
+ case Keyboard::Scan::F7: return "F7";
+ case Keyboard::Scan::F8: return "F8";
+ case Keyboard::Scan::F9: return "F9";
+ case Keyboard::Scan::F10: return "F10";
+ case Keyboard::Scan::F11: return "F11";
+ case Keyboard::Scan::F12: return "F12";
+ case Keyboard::Scan::F13: return "F13";
+ case Keyboard::Scan::F14: return "F14";
+ case Keyboard::Scan::F15: return "F15";
+ case Keyboard::Scan::F16: return "F16";
+ case Keyboard::Scan::F17: return "F17";
+ case Keyboard::Scan::F18: return "F18";
+ case Keyboard::Scan::F19: return "F19";
+ case Keyboard::Scan::F20: return "F20";
+ case Keyboard::Scan::F21: return "F21";
+ case Keyboard::Scan::F22: return "F22";
+ case Keyboard::Scan::F23: return "F23";
+ case Keyboard::Scan::F24: return "F24";
+
+ case Keyboard::Scan::CapsLock: return "Caps Lock";
+ case Keyboard::Scan::PrintScreen: return "Print Screen";
+ case Keyboard::Scan::ScrollLock: return "Scroll Lock";
+
+ case Keyboard::Scan::Pause: return "Pause";
+ case Keyboard::Scan::Insert: return "Insert";
+ case Keyboard::Scan::Home: return "Home";
+ case Keyboard::Scan::PageUp: return "Page Up";
+ case Keyboard::Scan::Delete: return "Delete";
+ case Keyboard::Scan::End: return "End";
+ case Keyboard::Scan::PageDown: return "Page Down";
+
+ case Keyboard::Scan::Left: return "Left Arrow";
+ case Keyboard::Scan::Right: return "Right Arrow";
+ case Keyboard::Scan::Down: return "Down Arrow";
+ case Keyboard::Scan::Up: return "Up Arrow";
+
+ case Keyboard::Scan::NumLock: return "Num Lock";
+ case Keyboard::Scan::NumpadDivide: return "Divide (Numpad)";
+ case Keyboard::Scan::NumpadMultiply: return "Multiply (Numpad)";
+ case Keyboard::Scan::NumpadMinus: return "Minus (Numpad)";
+ case Keyboard::Scan::NumpadPlus: return "Plus (Numpad)";
+ case Keyboard::Scan::NumpadEqual: return "Equal (Numpad)";
+ case Keyboard::Scan::NumpadEnter: return "Enter (Numpad)";
+ case Keyboard::Scan::NumpadDecimal: return "Decimal (Numpad)";
+
+ case Keyboard::Scan::Numpad0: return "0 (Numpad)";
+ case Keyboard::Scan::Numpad1: return "1 (Numpad)";
+ case Keyboard::Scan::Numpad2: return "2 (Numpad)";
+ case Keyboard::Scan::Numpad3: return "3 (Numpad)";
+ case Keyboard::Scan::Numpad4: return "4 (Numpad)";
+ case Keyboard::Scan::Numpad5: return "5 (Numpad)";
+ case Keyboard::Scan::Numpad6: return "6 (Numpad)";
+ case Keyboard::Scan::Numpad7: return "7 (Numpad)";
+ case Keyboard::Scan::Numpad8: return "8 (Numpad)";
+ case Keyboard::Scan::Numpad9: return "9 (Numpad)";
+
+ case Keyboard::Scan::Application: return "Application";
+ case Keyboard::Scan::Execute: return "Execute";
+ case Keyboard::Scan::Help: return "Help";
+ case Keyboard::Scan::Menu: return "Menu";
+ case Keyboard::Scan::Select: return "Select";
+ case Keyboard::Scan::Stop: return "Stop";
+ case Keyboard::Scan::Redo: return "Redo";
+ case Keyboard::Scan::Undo: return "Undo";
+ case Keyboard::Scan::Cut: return "Cut";
+ case Keyboard::Scan::Copy: return "Copy";
+ case Keyboard::Scan::Paste: return "Paste";
+ case Keyboard::Scan::Search: return "Search";
+
+ case Keyboard::Scan::VolumeMute: return "Volume Mute";
+ case Keyboard::Scan::VolumeUp: return "Volume Up";
+ case Keyboard::Scan::VolumeDown: return "Volume Down";
+
+ case Keyboard::Scan::LControl: return "Left Control";
+ case Keyboard::Scan::LShift: return "Left Shift";
+ case Keyboard::Scan::LAlt: return "Left Alt";
+ case Keyboard::Scan::LSystem: return "Left System";
+ case Keyboard::Scan::RControl: return "Right Control";
+ case Keyboard::Scan::RShift: return "Right Shift";
+ case Keyboard::Scan::RAlt: return "Right Alt";
+ case Keyboard::Scan::RSystem: return "Right System";
+
+ case Keyboard::Scan::LaunchApplication1: return "Launch Application 1";
+ case Keyboard::Scan::LaunchApplication2: return "Launch Application 2";
+ case Keyboard::Scan::Favorites: return "Favorites";
+ case Keyboard::Scan::Back: return "Back";
+ case Keyboard::Scan::Forward: return "Forward";
+ case Keyboard::Scan::MediaNextTrack: return "Media Next Track";
+ case Keyboard::Scan::MediaPlayPause: return "Media Play Pause";
+ case Keyboard::Scan::MediaPreviousTrack: return "Media Previous Track";
+ case Keyboard::Scan::MediaStop: return "Media Stop";
+ case Keyboard::Scan::HomePage: return "Home Page";
+ case Keyboard::Scan::Refresh: return "Refresh";
+ case Keyboard::Scan::LaunchMail: return "Launch Mail";
+ case Keyboard::Scan::LaunchMediaSelect: return "Launch Media Select";
+
+ default: return "Unknown Scancode";
+ }
+}
+
+
+////////////////////////////////////////////////////////////
+Keyboard::Key KeyboardImpl::getKeyFromEvent(XKeyEvent& event)
+{
+ // Try each KeySym index (modifier group) until we get a match
+ for (int i = 0; i < 4; ++i)
+ {
+ // Get the SFML keyboard code from the keysym of the key that has been pressed
+ KeySym keysym = XLookupKeysym(&event, i);
+ Keyboard::Key key = keySymToKey(keysym);
+ if (key != Keyboard::Unknown)
+ return key;
+ }
+
+ return Keyboard::Unknown;
+}
+
+
+////////////////////////////////////////////////////////////
+Keyboard::Scancode KeyboardImpl::getScancodeFromEvent(XKeyEvent& event)
+{
+ return keyCodeToScancode(static_cast<KeyCode>(event.keycode));
+}
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Window/Unix/KeyboardImpl.hpp b/src/SFML/Window/Unix/KeyboardImpl.hpp
new file mode 100644
index 0000000..fc0a576
--- /dev/null
+++ b/src/SFML/Window/Unix/KeyboardImpl.hpp
@@ -0,0 +1,104 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_KEYBOARD_IMPL_HPP
+#define SFML_KEYBOARD_IMPL_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Keyboard.hpp>
+#include <X11/Xlib.h> // XKeyEvent
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+/// \brief sf::priv::KeyboardImpl helper
+///
+/// This class implements keyboard handling functions
+/// to help sf::priv::InputImpl class.
+////////////////////////////////////////////////////////////
+class KeyboardImpl
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::isKeyPressed(Key)
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::isKeyPressed(Scancode)
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::localize
+ ///
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Scancode delocalize(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::delocalize
+ ///
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Key localize(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::getDescription
+ ///
+ ////////////////////////////////////////////////////////////
+ static String getDescription(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the sf::Keyboard::Key from XKeyEvent
+ ///
+ /// \param event Event from which key is gotten
+ ///
+ /// \return A key being pressed or released
+ ///
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Key getKeyFromEvent(XKeyEvent& event);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the sf::Keyboard::Scancode from XKeyEvent
+ ///
+ /// \param event Event from which scancode is gotten
+ ///
+ /// \return A scancode of a key being pressed or released
+ ///
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Scancode getScancodeFromEvent(XKeyEvent& event);
+};
+
+} // namespace priv
+
+} // namespace sf
+
+#endif // SFML_KEYBOARD_IMPL_HPP
diff --git a/src/SFML/Window/Unix/SensorImpl.cpp b/src/SFML/Window/Unix/SensorImpl.cpp
index 3496265..7f53f8d 100644
--- a/src/SFML/Window/Unix/SensorImpl.cpp
+++ b/src/SFML/Window/Unix/SensorImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Unix/SensorImpl.hpp b/src/SFML/Window/Unix/SensorImpl.hpp
index 2667de3..2369538 100644
--- a/src/SFML/Window/Unix/SensorImpl.hpp
+++ b/src/SFML/Window/Unix/SensorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Unix/VideoModeImpl.cpp b/src/SFML/Window/Unix/VideoModeImpl.cpp
index 288ef3e..87762ed 100644
--- a/src/SFML/Window/Unix/VideoModeImpl.cpp
+++ b/src/SFML/Window/Unix/VideoModeImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -73,7 +73,9 @@ std::vector<VideoMode> VideoModeImpl::getFullscreenModes()
for (int j = 0; j < nbSizes; ++j)
{
// Convert to VideoMode
- VideoMode mode(sizes[j].width, sizes[j].height, depths[i]);
+ VideoMode mode(static_cast<unsigned int>(sizes[j].width),
+ static_cast<unsigned int>(sizes[j].height),
+ static_cast<unsigned int>(depths[i]));
Rotation currentRotation;
XRRConfigRotations(config, &currentRotation);
@@ -149,12 +151,14 @@ VideoMode VideoModeImpl::getDesktopMode()
XRRScreenSize* sizes = XRRConfigSizes(config, &nbSizes);
if (sizes && (nbSizes > 0))
{
- desktopMode = VideoMode(sizes[currentMode].width, sizes[currentMode].height, DefaultDepth(display, screen));
+ desktopMode = VideoMode(static_cast<unsigned int>(sizes[currentMode].width),
+ static_cast<unsigned int>(sizes[currentMode].height),
+ static_cast<unsigned int>(DefaultDepth(display, screen)));
- Rotation currentRotation;
- XRRConfigRotations(config, &currentRotation);
+ Rotation modeRotation;
+ XRRConfigRotations(config, &modeRotation);
- if (currentRotation == RR_Rotate_90 || currentRotation == RR_Rotate_270)
+ if (modeRotation == RR_Rotate_90 || modeRotation == RR_Rotate_270)
std::swap(desktopMode.width, desktopMode.height);
}
diff --git a/src/SFML/Window/Unix/VulkanImplX11.cpp b/src/SFML/Window/Unix/VulkanImplX11.cpp
new file mode 100644
index 0000000..195db6e
--- /dev/null
+++ b/src/SFML/Window/Unix/VulkanImplX11.cpp
@@ -0,0 +1,225 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Unix/VulkanImplX11.hpp>
+#include <SFML/Window/Unix/Display.hpp>
+#include <dlfcn.h>
+#define VK_USE_PLATFORM_XLIB_KHR
+#define VK_NO_PROTOTYPES
+#include <vulkan/vulkan.h>
+#include <string>
+#include <map>
+#include <cstring>
+
+
+namespace
+{
+ struct VulkanLibraryWrapper
+ {
+ VulkanLibraryWrapper() :
+ library(NULL)
+ {
+ }
+
+ ~VulkanLibraryWrapper()
+ {
+ if (library)
+ dlclose(library);
+ }
+
+ // Try to load the library and all the required entry points
+ bool loadLibrary()
+ {
+ if (library)
+ return true;
+
+ library = dlopen("libvulkan.so.1", RTLD_LAZY);
+
+ if (!library)
+ return false;
+
+ if (!loadEntryPoint(vkGetInstanceProcAddr, "vkGetInstanceProcAddr"))
+ {
+ dlclose(library);
+ library = NULL;
+ return false;
+ }
+
+ if (!loadEntryPoint(vkEnumerateInstanceLayerProperties, "vkEnumerateInstanceLayerProperties"))
+ {
+ dlclose(library);
+ library = NULL;
+ return false;
+ }
+
+ if (!loadEntryPoint(vkEnumerateInstanceExtensionProperties, "vkEnumerateInstanceExtensionProperties"))
+ {
+ dlclose(library);
+ library = NULL;
+ return false;
+ }
+
+ return true;
+ }
+
+ template<typename T>
+ bool loadEntryPoint(T& entryPoint, const char* name)
+ {
+ entryPoint = reinterpret_cast<T>(dlsym(library, name));
+
+ return (entryPoint != NULL);
+ }
+
+ void* library;
+
+ PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
+ PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
+ PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
+ };
+
+ VulkanLibraryWrapper wrapper;
+}
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+bool VulkanImplX11::isAvailable(bool requireGraphics)
+{
+ static bool checked = false;
+ static bool computeAvailable = false;
+ static bool graphicsAvailable = false;
+
+ if (!checked)
+ {
+ checked = true;
+
+ // Check if the library is available
+ computeAvailable = wrapper.loadLibrary();
+
+ // To check for instance extensions we don't need to differentiate between graphics and compute
+ graphicsAvailable = computeAvailable;
+
+ if (graphicsAvailable)
+ {
+ // Retrieve the available instance extensions
+ std::vector<VkExtensionProperties> extensionProperties;
+
+ uint32_t extensionCount = 0;
+
+ wrapper.vkEnumerateInstanceExtensionProperties(0, &extensionCount, NULL);
+
+ extensionProperties.resize(extensionCount);
+
+ wrapper.vkEnumerateInstanceExtensionProperties(0, &extensionCount, &extensionProperties[0]);
+
+ // Check if the necessary extensions are available
+ bool has_VK_KHR_surface = false;
+ bool has_VK_KHR_platform_surface = false;
+
+ for (std::vector<VkExtensionProperties>::const_iterator iter = extensionProperties.begin(); iter != extensionProperties.end(); ++iter)
+ {
+ if (!std::strcmp(iter->extensionName, VK_KHR_SURFACE_EXTENSION_NAME))
+ {
+ has_VK_KHR_surface = true;
+ }
+ else if (!std::strcmp(iter->extensionName, VK_KHR_XLIB_SURFACE_EXTENSION_NAME))
+ {
+ has_VK_KHR_platform_surface = true;
+ }
+ }
+
+ if (!has_VK_KHR_surface || !has_VK_KHR_platform_surface)
+ graphicsAvailable = false;
+ }
+ }
+
+ if (requireGraphics)
+ return graphicsAvailable;
+
+ return computeAvailable;
+}
+
+
+////////////////////////////////////////////////////////////
+VulkanFunctionPointer VulkanImplX11::getFunction(const char* name)
+{
+ if (!isAvailable(false))
+ return 0;
+
+ return reinterpret_cast<VulkanFunctionPointer>(dlsym(wrapper.library, name));
+}
+
+
+////////////////////////////////////////////////////////////
+const std::vector<const char*>& VulkanImplX11::getGraphicsRequiredInstanceExtensions()
+{
+ static std::vector<const char*> extensions;
+
+ if (extensions.empty())
+ {
+ extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
+ extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
+ }
+
+ return extensions;
+}
+
+
+////////////////////////////////////////////////////////////
+bool VulkanImplX11::createVulkanSurface(const VkInstance& instance, WindowHandle windowHandle, VkSurfaceKHR& surface, const VkAllocationCallbacks* allocator)
+{
+ if (!isAvailable())
+ return false;
+
+ // Make a copy of the instance handle since we get it passed as a reference
+ VkInstance inst = instance;
+
+ PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR = reinterpret_cast<PFN_vkCreateXlibSurfaceKHR>(wrapper.vkGetInstanceProcAddr(inst, "vkCreateXlibSurfaceKHR"));
+
+ if (!vkCreateXlibSurfaceKHR)
+ return false;
+
+ // Since the surface is basically attached to the window, the connection
+ // to the X display will stay open even after we open and close it here
+ VkXlibSurfaceCreateInfoKHR surfaceCreateInfo = VkXlibSurfaceCreateInfoKHR();
+ surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
+ surfaceCreateInfo.dpy = OpenDisplay();
+ surfaceCreateInfo.window = windowHandle;
+
+ bool result = (vkCreateXlibSurfaceKHR(instance, &surfaceCreateInfo, allocator, &surface) == VK_SUCCESS);
+
+ CloseDisplay(surfaceCreateInfo.dpy);
+
+ return result;
+}
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Window/Unix/VulkanImplX11.hpp b/src/SFML/Window/Unix/VulkanImplX11.hpp
new file mode 100644
index 0000000..0dd27e3
--- /dev/null
+++ b/src/SFML/Window/Unix/VulkanImplX11.hpp
@@ -0,0 +1,103 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_VULKANIMPLX11_HPP
+#define SFML_VULKANIMPLX11_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Vulkan.hpp>
+#include <SFML/Window/WindowHandle.hpp>
+#include <vector>
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+/// \brief Linux (X11) implementation of Vulkan
+///
+////////////////////////////////////////////////////////////
+class VulkanImplX11
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Tell whether or not the system supports Vulkan
+ ///
+ /// This function should always be called before using
+ /// the Vulkan features. If it returns false, then
+ /// any attempt to use Vulkan will fail.
+ ///
+ /// If only compute is required, set \a requireGraphics
+ /// to false to skip checking for the extensions necessary
+ /// for graphics rendering.
+ ///
+ /// \param requireGraphics
+ ///
+ /// \return True if Vulkan is supported, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isAvailable(bool requireGraphics = true);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the address of a Vulkan function
+ ///
+ /// \param name Name of the function to get the address of
+ ///
+ /// \return Address of the Vulkan function, 0 on failure
+ ///
+ ////////////////////////////////////////////////////////////
+ static VulkanFunctionPointer getFunction(const char* name);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get Vulkan instance extensions required for graphics
+ ///
+ /// \return Vulkan instance extensions required for graphics
+ ///
+ ////////////////////////////////////////////////////////////
+ static const std::vector<const char*>& getGraphicsRequiredInstanceExtensions();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a Vulkan rendering surface
+ ///
+ /// \param instance Vulkan instance
+ /// \param windowHandle Handle to the window to create the surface for
+ /// \param surface Created surface
+ /// \param allocator Allocator to use
+ ///
+ /// \return True if surface creation was successful, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool createVulkanSurface(const VkInstance& instance, WindowHandle windowHandle, VkSurfaceKHR& surface, const VkAllocationCallbacks* allocator);
+};
+
+} // namespace priv
+
+} // namespace sf
+
+
+#endif // SFML_VULKANIMPLX11_HPP
diff --git a/src/SFML/Window/Unix/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp
index da69750..554a9db 100644
--- a/src/SFML/Window/Unix/WindowImplX11.cpp
+++ b/src/SFML/Window/Unix/WindowImplX11.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,11 +29,13 @@
#include <SFML/Window/Unix/ClipboardImpl.hpp>
#include <SFML/Window/Unix/Display.hpp>
#include <SFML/Window/Unix/InputImpl.hpp>
+#include <SFML/Window/Unix/KeyboardImpl.hpp>
#include <SFML/System/Utf.hpp>
#include <SFML/System/Err.hpp>
#include <SFML/System/Mutex.hpp>
#include <SFML/System/Lock.hpp>
#include <SFML/System/Sleep.hpp>
+#include <bitset> // <X11/Xlibint.h> defines min/max as macros, so <bitset> has to come before that
#include <X11/Xlibint.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
@@ -48,6 +50,7 @@
#include <vector>
#include <string>
#include <cstring>
+#include <cassert>
#ifdef SFML_OPENGL_ES
#include <SFML/Window/EglContext.hpp>
@@ -62,105 +65,143 @@
////////////////////////////////////////////////////////////
namespace
{
- sf::priv::WindowImplX11* fullscreenWindow = NULL;
- std::vector<sf::priv::WindowImplX11*> allWindows;
- sf::Mutex allWindowsMutex;
- sf::String windowManagerName;
-
- sf::String wmAbsPosGood[] = { "Enlightenment", "FVWM", "i3" };
+ // A nested named namespace is used here to allow unity builds of SFML.
+ namespace WindowsImplX11Impl
+ {
+ sf::priv::WindowImplX11* fullscreenWindow = NULL;
+ std::vector<sf::priv::WindowImplX11*> allWindows;
+ std::bitset<256> isKeyFiltered;
+ sf::Mutex allWindowsMutex;
+ sf::String windowManagerName;
- static const unsigned long eventMask = FocusChangeMask | ButtonPressMask |
- ButtonReleaseMask | ButtonMotionMask |
- PointerMotionMask | KeyPressMask |
- KeyReleaseMask | StructureNotifyMask |
- EnterWindowMask | LeaveWindowMask |
- VisibilityChangeMask | PropertyChangeMask;
+ sf::String wmAbsPosGood[] = { "Enlightenment", "FVWM", "i3" };
- static const unsigned int maxTrialsCount = 5;
+ static const unsigned long eventMask = FocusChangeMask | ButtonPressMask |
+ ButtonReleaseMask | ButtonMotionMask |
+ PointerMotionMask | KeyPressMask |
+ KeyReleaseMask | StructureNotifyMask |
+ EnterWindowMask | LeaveWindowMask |
+ VisibilityChangeMask | PropertyChangeMask;
- // Predicate we use to find key repeat events in processEvent
- struct KeyRepeatFinder
- {
- KeyRepeatFinder(unsigned int keycode, Time time) : keycode(keycode), time(time) {}
+ static const unsigned int maxTrialsCount = 5;
- // Predicate operator that checks event type, keycode and timestamp
- bool operator()(const XEvent& event)
+ // Filter the events received by windows (only allow those matching a specific window or those needed for the IM to work)
+ Bool checkEvent(::Display*, XEvent* event, XPointer userData)
{
- return ((event.type == KeyPress) && (event.xkey.keycode == keycode) && (event.xkey.time - time < 2));
+ if (event->xany.window == reinterpret_cast<::Window>(userData))
+ {
+ // The event matches the current window so pick it up
+ return true;
+ }
+ if (event->type == ClientMessage)
+ {
+ // The input method sometimes sends ClientMessage with a different window ID.
+ // Our event loop has to process them for the IM to work.
+ // We assume ClientMessage events not having WM_PROTOCOLS message type are such events.
+ // ClientMessage events having WM_PROTOCOLS message type should be handled by their own window,
+ // so we ignore them here. They will eventually be picked up with the first condition.
+ static const Atom wmProtocols = sf::priv::getAtom("WM_PROTOCOLS");
+ return event->xclient.message_type != wmProtocols;
+ }
+ return false;
}
- unsigned int keycode;
- Time time;
- };
+ // Find the name of the current executable
+ std::string findExecutableName()
+ {
+ // We use /proc/self/cmdline to get the command line
+ // the user used to invoke this instance of the application
+ int file = ::open("/proc/self/cmdline", O_RDONLY | O_NONBLOCK);
- // Filter the events received by windows (only allow those matching a specific window)
- Bool checkEvent(::Display*, XEvent* event, XPointer userData)
- {
- // Just check if the event matches the window
- return event->xany.window == reinterpret_cast< ::Window >(userData);
- }
+ if (file < 0)
+ return "sfml";
- // Find the name of the current executable
- std::string findExecutableName()
- {
- // We use /proc/self/cmdline to get the command line
- // the user used to invoke this instance of the application
- int file = ::open("/proc/self/cmdline", O_RDONLY | O_NONBLOCK);
+ std::vector<char> buffer(256, 0);
+ std::size_t offset = 0;
+ ssize_t result = 0;
- if (file < 0)
- return "sfml";
+ while ((result = read(file, &buffer[offset], 256)) > 0)
+ {
+ buffer.resize(buffer.size() + static_cast<std::size_t>(result), 0);
+ offset += static_cast<std::size_t>(result);
+ }
- std::vector<char> buffer(256, 0);
- std::size_t offset = 0;
- ssize_t result = 0;
+ ::close(file);
- while ((result = read(file, &buffer[offset], 256)) > 0)
- {
- buffer.resize(buffer.size() + result, 0);
- offset += result;
- }
-
- ::close(file);
+ if (offset)
+ {
+ buffer[offset] = 0;
- if (offset)
- {
- buffer[offset] = 0;
+ // Remove the path to keep the executable name only
+ return basename(&buffer[0]);
+ }
- // Remove the path to keep the executable name only
- return basename(&buffer[0]);
+ // Default fallback name
+ return "sfml";
}
- // Default fallback name
- return "sfml";
- }
-
- // Check if Extended Window Manager Hints are supported
- bool ewmhSupported()
- {
- static bool checked = false;
- static bool ewmhSupported = false;
-
- if (checked)
- return ewmhSupported;
+ // Check if Extended Window Manager Hints are supported
+ bool ewmhSupported()
+ {
+ static bool checked = false;
+ static bool ewmhSupported = false;
+
+ if (checked)
+ return ewmhSupported;
+
+ checked = true;
+
+ Atom netSupportingWmCheck = sf::priv::getAtom("_NET_SUPPORTING_WM_CHECK", true);
+ Atom netSupported = sf::priv::getAtom("_NET_SUPPORTED", true);
+
+ if (!netSupportingWmCheck || !netSupported)
+ return false;
+
+ ::Display* display = sf::priv::OpenDisplay();
+
+ Atom actualType;
+ int actualFormat;
+ unsigned long numItems;
+ unsigned long numBytes;
+ unsigned char* data;
+
+ int result = XGetWindowProperty(display,
+ DefaultRootWindow(display),
+ netSupportingWmCheck,
+ 0,
+ 1,
+ False,
+ XA_WINDOW,
+ &actualType,
+ &actualFormat,
+ &numItems,
+ &numBytes,
+ &data);
+
+ if (result != Success || actualType != XA_WINDOW || numItems != 1)
+ {
+ if (result == Success)
+ XFree(data);
- checked = true;
+ sf::priv::CloseDisplay(display);
+ return false;
+ }
- Atom netSupportingWmCheck = sf::priv::getAtom("_NET_SUPPORTING_WM_CHECK", true);
- Atom netSupported = sf::priv::getAtom("_NET_SUPPORTED", true);
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wcast-align"
+ ::Window rootWindow = *reinterpret_cast< ::Window* >(data);
+ #pragma GCC diagnostic pop
- if (!netSupportingWmCheck || !netSupported)
- return false;
-
- ::Display* display = sf::priv::OpenDisplay();
+ XFree(data);
- Atom actualType;
- int actualFormat;
- unsigned long numItems;
- unsigned long numBytes;
- unsigned char* data;
+ if (!rootWindow)
+ {
+ sf::priv::CloseDisplay(display);
+ return false;
+ }
- int result = XGetWindowProperty(display,
- DefaultRootWindow(display),
+ result = XGetWindowProperty(display,
+ rootWindow,
netSupportingWmCheck,
0,
1,
@@ -172,305 +213,169 @@ namespace
&numBytes,
&data);
- if (result != Success || actualType != XA_WINDOW || numItems != 1)
- {
- if (result == Success)
- XFree(data);
+ if (result != Success || actualType != XA_WINDOW || numItems != 1)
+ {
+ if (result == Success)
+ XFree(data);
- sf::priv::CloseDisplay(display);
- return false;
- }
+ sf::priv::CloseDisplay(display);
+ return false;
+ }
- ::Window rootWindow = *reinterpret_cast< ::Window* >(data);
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wcast-align"
+ ::Window childWindow = *reinterpret_cast< ::Window* >(data);
+ #pragma GCC diagnostic pop
- XFree(data);
+ XFree(data);
- if (!rootWindow)
- {
- sf::priv::CloseDisplay(display);
- return false;
- }
+ if (!childWindow)
+ {
+ sf::priv::CloseDisplay(display);
+ return false;
+ }
- result = XGetWindowProperty(display,
- rootWindow,
- netSupportingWmCheck,
- 0,
- 1,
- False,
- XA_WINDOW,
- &actualType,
- &actualFormat,
- &numItems,
- &numBytes,
- &data);
-
- if (result != Success || actualType != XA_WINDOW || numItems != 1)
- {
- if (result == Success)
- XFree(data);
+ // Conforming window managers should return the same window for both queries
+ if (rootWindow != childWindow)
+ {
+ sf::priv::CloseDisplay(display);
+ return false;
+ }
- sf::priv::CloseDisplay(display);
- return false;
- }
+ ewmhSupported = true;
- ::Window childWindow = *reinterpret_cast< ::Window* >(data);
+ // We try to get the name of the window manager
+ // for window manager specific workarounds
+ Atom netWmName = sf::priv::getAtom("_NET_WM_NAME", true);
- XFree(data);
+ if (!netWmName)
+ {
+ sf::priv::CloseDisplay(display);
+ return true;
+ }
- if (!childWindow)
- {
- sf::priv::CloseDisplay(display);
- return false;
- }
+ Atom utf8StringType = sf::priv::getAtom("UTF8_STRING");
- // Conforming window managers should return the same window for both queries
- if (rootWindow != childWindow)
- {
- sf::priv::CloseDisplay(display);
- return false;
- }
+ if (!utf8StringType)
+ utf8StringType = XA_STRING;
- ewmhSupported = true;
+ result = XGetWindowProperty(display,
+ rootWindow,
+ netWmName,
+ 0,
+ 0x7fffffff,
+ False,
+ utf8StringType,
+ &actualType,
+ &actualFormat,
+ &numItems,
+ &numBytes,
+ &data);
- // We try to get the name of the window manager
- // for window manager specific workarounds
- Atom netWmName = sf::priv::getAtom("_NET_WM_NAME", true);
+ if (actualType && numItems)
+ {
+ // It seems the wm name string reply is not necessarily
+ // null-terminated. The work around is to get its actual
+ // length to build a proper string
+ const char* begin = reinterpret_cast<const char*>(data);
+ const char* end = begin + numItems;
+ windowManagerName = sf::String::fromUtf8(begin, end);
+ }
+
+ if (result == Success)
+ XFree(data);
- if (!netWmName)
- {
sf::priv::CloseDisplay(display);
+
return true;
}
- Atom utf8StringType = sf::priv::getAtom("UTF8_STRING");
-
- if (!utf8StringType)
- utf8StringType = XA_STRING;
-
- result = XGetWindowProperty(display,
- rootWindow,
- netWmName,
- 0,
- 0x7fffffff,
- False,
- utf8StringType,
- &actualType,
- &actualFormat,
- &numItems,
- &numBytes,
- &data);
-
- if (actualType && numItems)
+ // Get the parent window.
+ ::Window getParentWindow(::Display* disp, ::Window win)
{
- // It seems the wm name string reply is not necessarily
- // null-terminated. The work around is to get its actual
- // length to build a proper string
- const char* begin = reinterpret_cast<const char*>(data);
- const char* end = begin + numItems;
- windowManagerName = sf::String::fromUtf8(begin, end);
- }
-
- if (result == Success)
- XFree(data);
-
- sf::priv::CloseDisplay(display);
-
- return true;
- }
-
- // Get the parent window.
- ::Window getParentWindow(::Display* disp, ::Window win)
- {
- ::Window root, parent;
- ::Window* children = NULL;
- unsigned int numChildren;
-
- XQueryTree(disp, win, &root, &parent, &children, &numChildren);
-
- // Children information is not used, so must be freed.
- if (children != NULL)
- XFree(children);
-
- return parent;
- }
+ ::Window root, parent;
+ ::Window* children = NULL;
+ unsigned int numChildren;
- // Get the Frame Extents from EWMH WMs that support it.
- bool getEWMHFrameExtents(::Display* disp, ::Window win,
- long& xFrameExtent, long& yFrameExtent)
- {
- if (!ewmhSupported())
- return false;
+ XQueryTree(disp, win, &root, &parent, &children, &numChildren);
- Atom frameExtents = sf::priv::getAtom("_NET_FRAME_EXTENTS", true);
+ // Children information is not used, so must be freed.
+ if (children != NULL)
+ XFree(children);
- if (frameExtents == None)
- return false;
-
- bool gotFrameExtents = false;
- Atom actualType;
- int actualFormat;
- unsigned long numItems;
- unsigned long numBytesLeft;
- unsigned char* data = NULL;
-
- int result = XGetWindowProperty(disp,
- win,
- frameExtents,
- 0,
- 4,
- False,
- XA_CARDINAL,
- &actualType,
- &actualFormat,
- &numItems,
- &numBytesLeft,
- &data);
+ return parent;
+ }
- if ((result == Success) && (actualType == XA_CARDINAL) &&
- (actualFormat == 32) && (numItems == 4) && (numBytesLeft == 0) &&
- (data != NULL))
+ // Get the Frame Extents from EWMH WMs that support it.
+ bool getEWMHFrameExtents(::Display* disp, ::Window win,
+ long& xFrameExtent, long& yFrameExtent)
{
- gotFrameExtents = true;
-
- long* extents = (long*) data;
+ if (!ewmhSupported())
+ return false;
+
+ Atom frameExtents = sf::priv::getAtom("_NET_FRAME_EXTENTS", true);
+
+ if (frameExtents == None)
+ return false;
+
+ bool gotFrameExtents = false;
+ Atom actualType;
+ int actualFormat;
+ unsigned long numItems;
+ unsigned long numBytesLeft;
+ unsigned char* data = NULL;
+
+ int result = XGetWindowProperty(disp,
+ win,
+ frameExtents,
+ 0,
+ 4,
+ False,
+ XA_CARDINAL,
+ &actualType,
+ &actualFormat,
+ &numItems,
+ &numBytesLeft,
+ &data);
+
+ if ((result == Success) && (actualType == XA_CARDINAL) &&
+ (actualFormat == 32) && (numItems == 4) && (numBytesLeft == 0) &&
+ (data != NULL))
+ {
+ gotFrameExtents = true;
- xFrameExtent = extents[0]; // Left.
- yFrameExtent = extents[2]; // Top.
- }
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wcast-align"
+ long* extents = reinterpret_cast<long*>(data);
+ #pragma GCC diagnostic pop
- // Always free data.
- if (data != NULL)
- XFree(data);
+ xFrameExtent = extents[0]; // Left.
+ yFrameExtent = extents[2]; // Top.
+ }
- return gotFrameExtents;
- }
+ // Always free data.
+ if (data != NULL)
+ XFree(data);
- // Check if the current WM is in the list of good WMs that provide
- // a correct absolute position for the window when queried.
- bool isWMAbsolutePositionGood()
- {
- // This can only work with EWMH, to get the name.
- if (!ewmhSupported())
- return false;
+ return gotFrameExtents;
+ }
- for (size_t i = 0; i < (sizeof(wmAbsPosGood) / sizeof(wmAbsPosGood[0])); i++)
+ // Check if the current WM is in the list of good WMs that provide
+ // a correct absolute position for the window when queried.
+ bool isWMAbsolutePositionGood()
{
- if (wmAbsPosGood[i] == windowManagerName)
- return true;
- }
+ // This can only work with EWMH, to get the name.
+ if (!ewmhSupported())
+ return false;
- return false;
- }
+ for (size_t i = 0; i < (sizeof(wmAbsPosGood) / sizeof(wmAbsPosGood[0])); i++)
+ {
+ if (wmAbsPosGood[i] == windowManagerName)
+ return true;
+ }
- sf::Keyboard::Key keysymToSF(KeySym symbol)
- {
- switch (symbol)
- {
- case XK_Shift_L: return sf::Keyboard::LShift;
- case XK_Shift_R: return sf::Keyboard::RShift;
- case XK_Control_L: return sf::Keyboard::LControl;
- case XK_Control_R: return sf::Keyboard::RControl;
- case XK_Alt_L: return sf::Keyboard::LAlt;
- case XK_Alt_R: return sf::Keyboard::RAlt;
- case XK_Super_L: return sf::Keyboard::LSystem;
- case XK_Super_R: return sf::Keyboard::RSystem;
- case XK_Menu: return sf::Keyboard::Menu;
- case XK_Escape: return sf::Keyboard::Escape;
- case XK_semicolon: return sf::Keyboard::Semicolon;
- case XK_slash: return sf::Keyboard::Slash;
- case XK_equal: return sf::Keyboard::Equal;
- case XK_minus: return sf::Keyboard::Hyphen;
- case XK_bracketleft: return sf::Keyboard::LBracket;
- case XK_bracketright: return sf::Keyboard::RBracket;
- case XK_comma: return sf::Keyboard::Comma;
- case XK_period: return sf::Keyboard::Period;
- case XK_apostrophe: return sf::Keyboard::Quote;
- case XK_backslash: return sf::Keyboard::Backslash;
- case XK_grave: return sf::Keyboard::Tilde;
- case XK_space: return sf::Keyboard::Space;
- case XK_Return: return sf::Keyboard::Enter;
- case XK_KP_Enter: return sf::Keyboard::Enter;
- case XK_BackSpace: return sf::Keyboard::Backspace;
- case XK_Tab: return sf::Keyboard::Tab;
- case XK_Prior: return sf::Keyboard::PageUp;
- case XK_Next: return sf::Keyboard::PageDown;
- case XK_End: return sf::Keyboard::End;
- case XK_Home: return sf::Keyboard::Home;
- case XK_Insert: return sf::Keyboard::Insert;
- case XK_Delete: return sf::Keyboard::Delete;
- case XK_KP_Add: return sf::Keyboard::Add;
- case XK_KP_Subtract: return sf::Keyboard::Subtract;
- case XK_KP_Multiply: return sf::Keyboard::Multiply;
- case XK_KP_Divide: return sf::Keyboard::Divide;
- case XK_Pause: return sf::Keyboard::Pause;
- case XK_F1: return sf::Keyboard::F1;
- case XK_F2: return sf::Keyboard::F2;
- case XK_F3: return sf::Keyboard::F3;
- case XK_F4: return sf::Keyboard::F4;
- case XK_F5: return sf::Keyboard::F5;
- case XK_F6: return sf::Keyboard::F6;
- case XK_F7: return sf::Keyboard::F7;
- case XK_F8: return sf::Keyboard::F8;
- case XK_F9: return sf::Keyboard::F9;
- case XK_F10: return sf::Keyboard::F10;
- case XK_F11: return sf::Keyboard::F11;
- case XK_F12: return sf::Keyboard::F12;
- case XK_F13: return sf::Keyboard::F13;
- case XK_F14: return sf::Keyboard::F14;
- case XK_F15: return sf::Keyboard::F15;
- case XK_Left: return sf::Keyboard::Left;
- case XK_Right: return sf::Keyboard::Right;
- case XK_Up: return sf::Keyboard::Up;
- case XK_Down: return sf::Keyboard::Down;
- case XK_KP_Insert: return sf::Keyboard::Numpad0;
- case XK_KP_End: return sf::Keyboard::Numpad1;
- case XK_KP_Down: return sf::Keyboard::Numpad2;
- case XK_KP_Page_Down: return sf::Keyboard::Numpad3;
- case XK_KP_Left: return sf::Keyboard::Numpad4;
- case XK_KP_Begin: return sf::Keyboard::Numpad5;
- case XK_KP_Right: return sf::Keyboard::Numpad6;
- case XK_KP_Home: return sf::Keyboard::Numpad7;
- case XK_KP_Up: return sf::Keyboard::Numpad8;
- case XK_KP_Page_Up: return sf::Keyboard::Numpad9;
- case XK_a: return sf::Keyboard::A;
- case XK_b: return sf::Keyboard::B;
- case XK_c: return sf::Keyboard::C;
- case XK_d: return sf::Keyboard::D;
- case XK_e: return sf::Keyboard::E;
- case XK_f: return sf::Keyboard::F;
- case XK_g: return sf::Keyboard::G;
- case XK_h: return sf::Keyboard::H;
- case XK_i: return sf::Keyboard::I;
- case XK_j: return sf::Keyboard::J;
- case XK_k: return sf::Keyboard::K;
- case XK_l: return sf::Keyboard::L;
- case XK_m: return sf::Keyboard::M;
- case XK_n: return sf::Keyboard::N;
- case XK_o: return sf::Keyboard::O;
- case XK_p: return sf::Keyboard::P;
- case XK_q: return sf::Keyboard::Q;
- case XK_r: return sf::Keyboard::R;
- case XK_s: return sf::Keyboard::S;
- case XK_t: return sf::Keyboard::T;
- case XK_u: return sf::Keyboard::U;
- case XK_v: return sf::Keyboard::V;
- case XK_w: return sf::Keyboard::W;
- case XK_x: return sf::Keyboard::X;
- case XK_y: return sf::Keyboard::Y;
- case XK_z: return sf::Keyboard::Z;
- case XK_0: return sf::Keyboard::Num0;
- case XK_1: return sf::Keyboard::Num1;
- case XK_2: return sf::Keyboard::Num2;
- case XK_3: return sf::Keyboard::Num3;
- case XK_4: return sf::Keyboard::Num4;
- case XK_5: return sf::Keyboard::Num5;
- case XK_6: return sf::Keyboard::Num6;
- case XK_7: return sf::Keyboard::Num7;
- case XK_8: return sf::Keyboard::Num8;
- case XK_9: return sf::Keyboard::Num9;
+ return false;
}
-
- return sf::Keyboard::Unknown;
}
}
@@ -500,6 +405,8 @@ m_iconPixmap (0),
m_iconMaskPixmap (0),
m_lastInputTime (0)
{
+ using namespace WindowsImplX11Impl;
+
// Open a connection with the X server
m_display = OpenDisplay();
@@ -549,6 +456,8 @@ m_iconPixmap (0),
m_iconMaskPixmap (0),
m_lastInputTime (0)
{
+ using namespace WindowsImplX11Impl;
+
// Open a connection with the X server
m_display = OpenDisplay();
@@ -565,19 +474,35 @@ m_lastInputTime (0)
}
else
{
- windowPosition.x = (DisplayWidth(m_display, m_screen) - mode.width) / 2;
- windowPosition.y = (DisplayWidth(m_display, m_screen) - mode.height) / 2;
+ windowPosition.x = (DisplayWidth(m_display, m_screen) - static_cast<int>(mode.width)) / 2;
+ windowPosition.y = (DisplayHeight(m_display, m_screen) - static_cast<int>(mode.height)) / 2;
}
- int width = mode.width;
- int height = mode.height;
+ unsigned int width = mode.width;
+ unsigned int height = mode.height;
+
+ Visual* visual = NULL;
+ int depth = 0;
+
+ // Check if the user chose to not create an OpenGL context (settings.attributeFlags will be 0xFFFFFFFF)
+ if (settings.attributeFlags == 0xFFFFFFFF)
+ {
+ // Choose default visual since the user is going to use their own rendering API
+ visual = DefaultVisual(m_display, m_screen);
+ depth = DefaultDepth(m_display, m_screen);
+ }
+ else
+ {
+ // Choose the visual according to the context settings
+ XVisualInfo visualInfo = ContextType::selectBestVisual(m_display, mode.bitsPerPixel, settings);
- // Choose the visual according to the context settings
- XVisualInfo visualInfo = ContextType::selectBestVisual(m_display, mode.bitsPerPixel, settings);
+ visual = visualInfo.visual;
+ depth = visualInfo.depth;
+ }
// Define the window attributes
XSetWindowAttributes attributes;
- attributes.colormap = XCreateColormap(m_display, DefaultRootWindow(m_display), visualInfo.visual, AllocNone);
+ attributes.colormap = XCreateColormap(m_display, DefaultRootWindow(m_display), visual, AllocNone);
attributes.event_mask = eventMask;
attributes.override_redirect = (m_fullscreen && !ewmhSupported()) ? True : False;
@@ -586,9 +511,9 @@ m_lastInputTime (0)
windowPosition.x, windowPosition.y,
width, height,
0,
- visualInfo.depth,
+ depth,
InputOutput,
- visualInfo.visual,
+ visual,
CWEventMask | CWOverrideRedirect | CWColormap,
&attributes);
@@ -602,11 +527,11 @@ m_lastInputTime (0)
setProtocols();
// Set the WM initial state to the normal state
- XWMHints* hints = XAllocWMHints();
- hints->flags = StateHint;
- hints->initial_state = NormalState;
- XSetWMHints(m_display, m_window, hints);
- XFree(hints);
+ XWMHints* xHints = XAllocWMHints();
+ xHints->flags = StateHint;
+ xHints->initial_state = NormalState;
+ XSetWMHints(m_display, m_window, xHints);
+ XFree(xHints);
// If not in fullscreen, set the window's style (tell the window manager to
// change our window's decorations and functions according to the requested style)
@@ -681,8 +606,8 @@ m_lastInputTime (0)
m_useSizeHints = true;
XSizeHints* sizeHints = XAllocSizeHints();
sizeHints->flags = PMinSize | PMaxSize | USPosition;
- sizeHints->min_width = sizeHints->max_width = width;
- sizeHints->min_height = sizeHints->max_height = height;
+ sizeHints->min_width = sizeHints->max_width = static_cast<int>(width);
+ sizeHints->min_height = sizeHints->max_height = static_cast<int>(height);
sizeHints->x = windowPosition.x;
sizeHints->y = windowPosition.y;
XSetWMNormalHints(m_display, m_window, sizeHints);
@@ -729,7 +654,7 @@ m_lastInputTime (0)
sizeHints->flags &= ~(PMinSize | PMaxSize);
XSetWMNormalHints(m_display, m_window, sizeHints);
XFree(sizeHints);
-
+
setVideoMode(mode);
switchToFullscreen();
}
@@ -739,6 +664,8 @@ m_lastInputTime (0)
////////////////////////////////////////////////////////////
WindowImplX11::~WindowImplX11()
{
+ using namespace WindowsImplX11Impl;
+
// Cleanup graphical resources
cleanup();
@@ -767,7 +694,7 @@ WindowImplX11::~WindowImplX11()
// Close the input method
if (m_inputMethod)
- XCloseIM(m_inputMethod);
+ CloseXIM(m_inputMethod);
// Close the connection with the X server
CloseDisplay(m_display);
@@ -788,18 +715,67 @@ WindowHandle WindowImplX11::getSystemHandle() const
////////////////////////////////////////////////////////////
void WindowImplX11::processEvents()
{
+ using namespace WindowsImplX11Impl;
+
XEvent event;
// Pick out the events that are interesting for this window
while (XCheckIfEvent(m_display, &event, &checkEvent, reinterpret_cast<XPointer>(m_window)))
- m_events.push_back(event);
-
- // Handle the events for this window that we just picked out
- while (!m_events.empty())
{
- event = m_events.front();
- m_events.pop_front();
- processEvent(event);
+ // This function implements a workaround to properly discard
+ // repeated key events when necessary. The problem is that the
+ // system's key events policy doesn't match SFML's one: X server will generate
+ // both repeated KeyPress and KeyRelease events when maintaining a key down, while
+ // SFML only wants repeated KeyPress events. Thus, we have to:
+ // - Discard duplicated KeyRelease events when m_keyRepeat is true
+ // - Discard both duplicated KeyPress and KeyRelease events when m_keyRepeat is false
+
+ bool processThisEvent = true;
+
+ // Detect repeated key events
+ while (event.type == KeyRelease)
+ {
+ XEvent nextEvent;
+ if (XCheckIfEvent(m_display, &nextEvent, checkEvent, reinterpret_cast<XPointer>(m_window)))
+ {
+ if ((nextEvent.type == KeyPress) && (nextEvent.xkey.keycode == event.xkey.keycode) &&
+ (event.xkey.time <= nextEvent.xkey.time) && (nextEvent.xkey.time <= event.xkey.time + 1))
+ {
+ // This sequence of events comes from maintaining a key down
+ if (m_keyRepeat)
+ {
+ // Ignore the KeyRelease event and process the KeyPress event
+ event = nextEvent;
+ break;
+ }
+ else
+ {
+ // Ignore both events
+ processThisEvent = false;
+ break;
+ }
+ }
+ else
+ {
+ // This sequence of events does not come from maintaining a key down,
+ // so process the KeyRelease event normally,
+ processEvent(event);
+ // but loop because the next event can be the first half
+ // of a sequence coming from maintaining a key down.
+ event = nextEvent;
+ }
+ }
+ else
+ {
+ // No event after this KeyRelease event so assume it can be processed.
+ break;
+ }
+ }
+
+ if (processThisEvent)
+ {
+ processEvent(event);
+ }
}
// Process clipboard window events
@@ -810,6 +786,8 @@ void WindowImplX11::processEvents()
////////////////////////////////////////////////////////////
Vector2i WindowImplX11::getPosition() const
{
+ using namespace WindowsImplX11Impl;
+
// Get absolute position of our window relative to root window. This
// takes into account all information that X11 has, including X11
// border widths and any decorations. It corresponds to where the
@@ -837,7 +815,7 @@ Vector2i WindowImplX11::getPosition() const
{
// Get final X/Y coordinates: subtract EWMH frame extents from
// absolute window position.
- return Vector2i((xAbsRelToRoot - xFrameExtent), (yAbsRelToRoot - yFrameExtent));
+ return Vector2i((xAbsRelToRoot - static_cast<int>(xFrameExtent)), (yAbsRelToRoot - static_cast<int>(yFrameExtent)));
}
// CASE 3: EWMH frame extents were not available, use geometry.
@@ -887,7 +865,7 @@ Vector2u WindowImplX11::getSize() const
{
XWindowAttributes attributes;
XGetWindowAttributes(m_display, m_window, &attributes);
- return Vector2u(attributes.width, attributes.height);
+ return Vector2u(Vector2i(attributes.width, attributes.height));
}
@@ -899,8 +877,8 @@ void WindowImplX11::setSize(const Vector2u& size)
{
XSizeHints* sizeHints = XAllocSizeHints();
sizeHints->flags = PMinSize | PMaxSize;
- sizeHints->min_width = sizeHints->max_width = size.x;
- sizeHints->min_height = sizeHints->max_height = size.y;
+ sizeHints->min_width = sizeHints->max_width = static_cast<int>(size.x);
+ sizeHints->min_height = sizeHints->max_height = static_cast<int>(size.y);
XSetWMNormalHints(m_display, m_window, sizeHints);
XFree(sizeHints);
}
@@ -925,12 +903,12 @@ void WindowImplX11::setTitle(const String& title)
// Set the _NET_WM_NAME atom, which specifies a UTF-8 encoded window title.
Atom wmName = getAtom("_NET_WM_NAME", false);
XChangeProperty(m_display, m_window, wmName, useUtf8, 8,
- PropModeReplace, utf8Title.c_str(), utf8Title.size());
+ PropModeReplace, utf8Title.c_str(), static_cast<int>(utf8Title.size()));
// Set the _NET_WM_ICON_NAME atom, which specifies a UTF-8 encoded window title.
Atom wmIconName = getAtom("_NET_WM_ICON_NAME", false);
XChangeProperty(m_display, m_window, wmIconName, useUtf8, 8,
- PropModeReplace, utf8Title.c_str(), utf8Title.size());
+ PropModeReplace, utf8Title.c_str(), static_cast<int>(utf8Title.size()));
// Set the non-Unicode title as a fallback for window managers who don't support _NET_WM_NAME.
#ifdef X_HAVE_UTF8_STRING
@@ -973,8 +951,8 @@ void WindowImplX11::setIcon(unsigned int width, unsigned int height, const Uint8
// Create the icon pixmap
Visual* defVisual = DefaultVisual(m_display, m_screen);
- unsigned int defDepth = DefaultDepth(m_display, m_screen);
- XImage* iconImage = XCreateImage(m_display, defVisual, defDepth, ZPixmap, 0, (char*)iconPixels, width, height, 32, 0);
+ unsigned int defDepth = static_cast<unsigned int>(DefaultDepth(m_display, m_screen));
+ XImage* iconImage = XCreateImage(m_display, defVisual, defDepth, ZPixmap, 0, reinterpret_cast<char*>(iconPixels), width, height, 32, 0);
if (!iconImage)
{
err() << "Failed to set the window's icon" << std::endl;
@@ -1006,12 +984,12 @@ void WindowImplX11::setIcon(unsigned int width, unsigned int height, const Uint8
if (i * 8 + k < width)
{
Uint8 opacity = (pixels[(i * 8 + k + j * width) * 4 + 3] > 0) ? 1 : 0;
- maskPixels[i + j * pitch] |= (opacity << k);
+ maskPixels[i + j * pitch] |= static_cast<Uint8>(opacity << k);
}
}
}
}
- m_iconMaskPixmap = XCreatePixmapFromBitmapData(m_display, m_window, (char*)&maskPixels[0], width, height, 1, 0, 1);
+ m_iconMaskPixmap = XCreatePixmapFromBitmapData(m_display, m_window, reinterpret_cast<char*>(&maskPixels[0]), width, height, 1, 0, 1);
// Send our new icon to the window through the WMHints
XWMHints* hints = XAllocWMHints();
@@ -1026,15 +1004,18 @@ void WindowImplX11::setIcon(unsigned int width, unsigned int height, const Uint8
std::vector<unsigned long> icccmIconPixels(2 + width * height, 0);
unsigned long* ptr = &icccmIconPixels[0];
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wnull-dereference" // False positive.
*ptr++ = width;
*ptr++ = height;
+ #pragma GCC diagnostic pop
for (std::size_t i = 0; i < width * height; ++i)
{
- *ptr++ = (pixels[i * 4 + 2] << 0 ) |
- (pixels[i * 4 + 1] << 8 ) |
- (pixels[i * 4 + 0] << 16) |
- (pixels[i * 4 + 3] << 24);
+ *ptr++ = static_cast<unsigned long>((pixels[i * 4 + 2] << 0 ) |
+ (pixels[i * 4 + 1] << 8 ) |
+ (pixels[i * 4 + 0] << 16) |
+ (pixels[i * 4 + 3] << 24));
}
Atom netWmIcon = getAtom("_NET_WM_ICON");
@@ -1046,7 +1027,7 @@ void WindowImplX11::setIcon(unsigned int width, unsigned int height, const Uint8
32,
PropModeReplace,
reinterpret_cast<const unsigned char*>(&icccmIconPixels[0]),
- 2 + width * height);
+ static_cast<int>(2 + width * height));
XFlush(m_display);
}
@@ -1096,12 +1077,15 @@ void WindowImplX11::setMouseCursor(const CursorImpl& cursor)
{
m_lastCursor = cursor.m_cursor;
XDefineCursor(m_display, m_window, m_lastCursor);
+ XFlush(m_display);
}
////////////////////////////////////////////////////////////
void WindowImplX11::setMouseCursorGrabbed(bool grabbed)
{
+ using namespace WindowsImplX11Impl;
+
// This has no effect in fullscreen mode
if (m_fullscreen || (m_cursorGrabbed == grabbed))
return;
@@ -1128,7 +1112,9 @@ void WindowImplX11::setMouseCursorGrabbed(bool grabbed)
}
else
{
+ // Release the cursor from the window and disable cursor grabbing
XUngrabPointer(m_display, CurrentTime);
+ m_cursorGrabbed = false;
}
}
@@ -1143,6 +1129,8 @@ void WindowImplX11::setKeyRepeatEnabled(bool enabled)
////////////////////////////////////////////////////////////
void WindowImplX11::requestFocus()
{
+ using namespace WindowsImplX11Impl;
+
// Focus is only stolen among SFML windows, not between applications
// Check the global list of windows to find out whether an SFML window has the focus
// Note: can't handle console and other non-SFML windows belonging to the application.
@@ -1207,6 +1195,8 @@ bool WindowImplX11::hasFocus() const
////////////////////////////////////////////////////////////
void WindowImplX11::grabFocus()
{
+ using namespace WindowsImplX11Impl;
+
Atom netActiveWindow = None;
if (ewmhSupported())
@@ -1230,7 +1220,7 @@ void WindowImplX11::grabFocus()
event.xclient.format = 32;
event.xclient.message_type = netActiveWindow;
event.xclient.data.l[0] = 1; // Normal application
- event.xclient.data.l[1] = m_lastInputTime;
+ event.xclient.data.l[1] = static_cast<long>(m_lastInputTime);
event.xclient.data.l[2] = 0; // We don't know the currently active window
int result = XSendEvent(m_display,
@@ -1256,6 +1246,8 @@ void WindowImplX11::grabFocus()
////////////////////////////////////////////////////////////
void WindowImplX11::setVideoMode(const VideoMode& mode)
{
+ using namespace WindowsImplX11Impl;
+
// Skip mode switching if the new mode is equal to the desktop mode
if (mode == VideoMode::getDesktopMode())
return;
@@ -1316,8 +1308,8 @@ void WindowImplX11::setVideoMode(const VideoMode& mode)
std::swap(res->modes[i].height, res->modes[i].width);
// Check if screen size match
- if (res->modes[i].width == static_cast<int>(mode.width) &&
- res->modes[i].height == static_cast<int>(mode.height))
+ if ((res->modes[i].width == mode.width) &&
+ (res->modes[i].height == mode.height))
{
xRandMode = res->modes[i].id;
modeFound = true;
@@ -1360,6 +1352,8 @@ void WindowImplX11::setVideoMode(const VideoMode& mode)
////////////////////////////////////////////////////////////
void WindowImplX11::resetVideoMode()
{
+ using namespace WindowsImplX11Impl;
+
if (fullscreenWindow == this)
{
// Try to set old configuration
@@ -1422,6 +1416,8 @@ void WindowImplX11::resetVideoMode()
////////////////////////////////////////////////////////////
void WindowImplX11::switchToFullscreen()
{
+ using namespace WindowsImplX11Impl;
+
grabFocus();
if (ewmhSupported())
@@ -1459,7 +1455,7 @@ void WindowImplX11::switchToFullscreen()
event.xclient.format = 32;
event.xclient.message_type = netWmState;
event.xclient.data.l[0] = 1; // _NET_WM_STATE_ADD
- event.xclient.data.l[1] = netWmStateFullscreen;
+ event.xclient.data.l[1] = static_cast<long>(netWmStateFullscreen);
event.xclient.data.l[2] = 0; // No second property
event.xclient.data.l[3] = 1; // Normal window
@@ -1478,6 +1474,8 @@ void WindowImplX11::switchToFullscreen()
////////////////////////////////////////////////////////////
void WindowImplX11::setProtocols()
{
+ using namespace WindowsImplX11Impl;
+
Atom wmProtocols = getAtom("WM_PROTOCOLS");
Atom wmDeleteWindow = getAtom("WM_DELETE_WINDOW");
@@ -1532,7 +1530,7 @@ void WindowImplX11::setProtocols()
32,
PropModeReplace,
reinterpret_cast<const unsigned char*>(&atoms[0]),
- atoms.size());
+ static_cast<int>(atoms.size()));
}
else
{
@@ -1544,8 +1542,10 @@ void WindowImplX11::setProtocols()
////////////////////////////////////////////////////////////
void WindowImplX11::initialize()
{
+ using namespace WindowsImplX11Impl;
+
// Create the input context
- m_inputMethod = XOpenIM(m_display, NULL, NULL, NULL);
+ m_inputMethod = OpenXIM();
if (m_inputMethod)
{
@@ -1556,7 +1556,7 @@ void WindowImplX11::initialize()
m_window,
XNInputStyle,
XIMPreeditNothing | XIMStatusNothing,
- reinterpret_cast<void*>(NULL));
+ NULL);
}
else
{
@@ -1657,34 +1657,7 @@ void WindowImplX11::cleanup()
////////////////////////////////////////////////////////////
bool WindowImplX11::processEvent(XEvent& windowEvent)
{
- // This function implements a workaround to properly discard
- // repeated key events when necessary. The problem is that the
- // system's key events policy doesn't match SFML's one: X server will generate
- // both repeated KeyPress and KeyRelease events when maintaining a key down, while
- // SFML only wants repeated KeyPress events. Thus, we have to:
- // - Discard duplicated KeyRelease events when KeyRepeatEnabled is true
- // - Discard both duplicated KeyPress and KeyRelease events when KeyRepeatEnabled is false
-
- // Detect repeated key events
- if (windowEvent.type == KeyRelease)
- {
- // Find the next KeyPress event with matching keycode and time
- std::deque<XEvent>::iterator iter = std::find_if(
- m_events.begin(),
- m_events.end(),
- KeyRepeatFinder(windowEvent.xkey.keycode, windowEvent.xkey.time)
- );
-
- if (iter != m_events.end())
- {
- // If we don't want repeated events, remove the next KeyPress from the queue
- if (!m_keyRepeat)
- m_events.erase(iter);
-
- // This KeyRelease is a repeated event and we don't want it
- return false;
- }
- }
+ using namespace WindowsImplX11Impl;
// Convert the X11 event to a sf::Event
switch (windowEvent.type)
@@ -1768,8 +1741,8 @@ bool WindowImplX11::processEvent(XEvent& windowEvent)
{
Event event;
event.type = Event::Resized;
- event.size.width = windowEvent.xconfigure.width;
- event.size.height = windowEvent.xconfigure.height;
+ event.size.width = static_cast<unsigned int>(windowEvent.xconfigure.width);
+ event.size.height = static_cast<unsigned int>(windowEvent.xconfigure.height);
pushEvent(event);
m_previousSize.x = windowEvent.xconfigure.width;
@@ -1781,27 +1754,31 @@ bool WindowImplX11::processEvent(XEvent& windowEvent)
// Close event
case ClientMessage:
{
- static Atom wmProtocols = getAtom("WM_PROTOCOLS");
-
- // Handle window manager protocol messages we support
- if (windowEvent.xclient.message_type == wmProtocols)
+ // Input methods might want random ClientMessage events
+ if (!XFilterEvent(&windowEvent, None))
{
- static Atom wmDeleteWindow = getAtom("WM_DELETE_WINDOW");
- static Atom netWmPing = ewmhSupported() ? getAtom("_NET_WM_PING", true) : None;
+ static Atom wmProtocols = getAtom("WM_PROTOCOLS");
- if ((windowEvent.xclient.format == 32) && (windowEvent.xclient.data.l[0]) == static_cast<long>(wmDeleteWindow))
+ // Handle window manager protocol messages we support
+ if (windowEvent.xclient.message_type == wmProtocols)
{
- // Handle the WM_DELETE_WINDOW message
- Event event;
- event.type = Event::Closed;
- pushEvent(event);
- }
- else if (netWmPing && (windowEvent.xclient.format == 32) && (windowEvent.xclient.data.l[0]) == static_cast<long>(netWmPing))
- {
- // Handle the _NET_WM_PING message, send pong back to WM to show that we are responsive
- windowEvent.xclient.window = DefaultRootWindow(m_display);
+ static Atom wmDeleteWindow = getAtom("WM_DELETE_WINDOW");
+ static Atom netWmPing = ewmhSupported() ? getAtom("_NET_WM_PING", true) : None;
- XSendEvent(m_display, DefaultRootWindow(m_display), False, SubstructureNotifyMask | SubstructureRedirectMask, &windowEvent);
+ if ((windowEvent.xclient.format == 32) && (windowEvent.xclient.data.l[0]) == static_cast<long>(wmDeleteWindow))
+ {
+ // Handle the WM_DELETE_WINDOW message
+ Event event;
+ event.type = Event::Closed;
+ pushEvent(event);
+ }
+ else if (netWmPing && (windowEvent.xclient.format == 32) && (windowEvent.xclient.data.l[0]) == static_cast<long>(netWmPing))
+ {
+ // Handle the _NET_WM_PING message, send pong back to WM to show that we are responsive
+ windowEvent.xclient.window = DefaultRootWindow(m_display);
+
+ XSendEvent(m_display, DefaultRootWindow(m_display), False, SubstructureNotifyMask | SubstructureRedirectMask, &windowEvent);
+ }
}
}
break;
@@ -1810,37 +1787,46 @@ bool WindowImplX11::processEvent(XEvent& windowEvent)
// Key down event
case KeyPress:
{
- Keyboard::Key key = Keyboard::Unknown;
-
- // Try each KeySym index (modifier group) until we get a match
- for (int i = 0; i < 4; ++i)
- {
- // Get the SFML keyboard code from the keysym of the key that has been pressed
- key = keysymToSF(XLookupKeysym(&windowEvent.xkey, i));
-
- if (key != Keyboard::Unknown)
- break;
- }
-
// Fill the event parameters
// TODO: if modifiers are wrong, use XGetModifierMapping to retrieve the actual modifiers mapping
Event event;
- event.type = Event::KeyPressed;
- event.key.code = key;
- event.key.alt = windowEvent.xkey.state & Mod1Mask;
- event.key.control = windowEvent.xkey.state & ControlMask;
- event.key.shift = windowEvent.xkey.state & ShiftMask;
- event.key.system = windowEvent.xkey.state & Mod4Mask;
- pushEvent(event);
+ event.type = Event::KeyPressed;
+ event.key.code = KeyboardImpl::getKeyFromEvent(windowEvent.xkey);
+ event.key.scancode = KeyboardImpl::getScancodeFromEvent(windowEvent.xkey);
+ event.key.alt = windowEvent.xkey.state & Mod1Mask;
+ event.key.control = windowEvent.xkey.state & ControlMask;
+ event.key.shift = windowEvent.xkey.state & ShiftMask;
+ event.key.system = windowEvent.xkey.state & Mod4Mask;
+
+ const bool filtered = XFilterEvent(&windowEvent, None);
+
+ // Generate a KeyPressed event if needed
+ if (filtered)
+ {
+ pushEvent(event);
+ isKeyFiltered.set(windowEvent.xkey.keycode);
+ }
+ else
+ {
+ // Push a KeyPressed event if the key has never been filtered before
+ // (a KeyPressed event would have already been pushed if it had been filtered).
+ //
+ // Some dummy IMs (like the built-in one you get by setting XMODIFIERS=@im=none)
+ // never filter events away, and we have to take care of that.
+ //
+ // In addition, ignore text-only KeyPress events generated by IMs (with keycode set to 0).
+ if (!isKeyFiltered.test(windowEvent.xkey.keycode) && windowEvent.xkey.keycode != 0)
+ pushEvent(event);
+ }
- // Generate a TextEntered event
- if (!XFilterEvent(&windowEvent, None))
+ // Generate TextEntered events if needed
+ if (!filtered)
{
#ifdef X_HAVE_UTF8_STRING
if (m_inputContext)
{
Status status;
- Uint8 keyBuffer[16];
+ Uint8 keyBuffer[64];
int length = Xutf8LookupString(
m_inputContext,
@@ -1851,16 +1837,26 @@ bool WindowImplX11::processEvent(XEvent& windowEvent)
&status
);
- if (length > 0)
+ if (status == XBufferOverflow)
+ err() << "A TextEntered event has more than 64 bytes of UTF-8 input, and "
+ "has been discarded\nThis means either you have typed a very long string "
+ "(more than 20 chars), or your input method is broken in obscure ways." << std::endl;
+ else if (status == XLookupChars)
{
+ // There might be more than 1 characters in this event,
+ // so we must iterate it
Uint32 unicode = 0;
- Utf8::decode(keyBuffer, keyBuffer + length, unicode, 0);
- if (unicode != 0)
+ Uint8* iter = keyBuffer;
+ while (iter < keyBuffer + length)
{
- Event textEvent;
- textEvent.type = Event::TextEntered;
- textEvent.text.unicode = unicode;
- pushEvent(textEvent);
+ iter = Utf8::decode(iter, keyBuffer + length, unicode, 0);
+ if (unicode != 0)
+ {
+ Event textEvent;
+ textEvent.type = Event::TextEntered;
+ textEvent.text.unicode = unicode;
+ pushEvent(textEvent);
+ }
}
}
}
@@ -1887,26 +1883,15 @@ bool WindowImplX11::processEvent(XEvent& windowEvent)
// Key up event
case KeyRelease:
{
- Keyboard::Key key = Keyboard::Unknown;
-
- // Try each KeySym index (modifier group) until we get a match
- for (int i = 0; i < 4; ++i)
- {
- // Get the SFML keyboard code from the keysym of the key that has been released
- key = keysymToSF(XLookupKeysym(&windowEvent.xkey, i));
-
- if (key != Keyboard::Unknown)
- break;
- }
-
// Fill the event parameters
Event event;
- event.type = Event::KeyReleased;
- event.key.code = key;
- event.key.alt = windowEvent.xkey.state & Mod1Mask;
- event.key.control = windowEvent.xkey.state & ControlMask;
- event.key.shift = windowEvent.xkey.state & ShiftMask;
- event.key.system = windowEvent.xkey.state & Mod4Mask;
+ event.type = Event::KeyReleased;
+ event.key.code = KeyboardImpl::getKeyFromEvent(windowEvent.xkey);
+ event.key.scancode = KeyboardImpl::getScancodeFromEvent(windowEvent.xkey);
+ event.key.alt = windowEvent.xkey.state & Mod1Mask;
+ event.key.control = windowEvent.xkey.state & ControlMask;
+ event.key.shift = windowEvent.xkey.state & ShiftMask;
+ event.key.system = windowEvent.xkey.state & Mod4Mask;
pushEvent(event);
break;
@@ -1915,8 +1900,7 @@ bool WindowImplX11::processEvent(XEvent& windowEvent)
// Mouse button pressed
case ButtonPress:
{
- // XXX: Why button 8 and 9?
- // Because 4 and 5 are the vertical wheel and 6 and 7 are horizontal wheel ;)
+ // Buttons 4 and 5 are the vertical wheel and 6 and 7 the horizontal wheel.
unsigned int button = windowEvent.xbutton.button;
if ((button == Button1) ||
(button == Button2) ||
@@ -2033,6 +2017,15 @@ bool WindowImplX11::processEvent(XEvent& windowEvent)
break;
}
+ // Keyboard mapping changed
+ case MappingNotify:
+ {
+ if (windowEvent.xmapping.request == MappingKeyboard)
+ XRefreshKeyboardMapping(&windowEvent.xmapping);
+
+ break;
+ }
+
// Window unmapped
case UnmapNotify:
{
@@ -2177,5 +2170,4 @@ Vector2i WindowImplX11::getPrimaryMonitorPosition()
}
} // namespace priv
-
} // namespace sf
diff --git a/src/SFML/Window/Unix/WindowImplX11.hpp b/src/SFML/Window/Unix/WindowImplX11.hpp
index a025a1a..886de79 100644
--- a/src/SFML/Window/Unix/WindowImplX11.hpp
+++ b/src/SFML/Window/Unix/WindowImplX11.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -300,26 +300,25 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- ::Window m_window; ///< X identifier defining our window
- ::Display* m_display; ///< Pointer to the display
- int m_screen; ///< Screen identifier
- XIM m_inputMethod; ///< Input method linked to the X display
- XIC m_inputContext; ///< Input context used to get unicode input in our window
- std::deque<XEvent> m_events; ///< Queue we use to store pending events for this window
- bool m_isExternal; ///< Tell whether the window has been created externally or by SFML
- int m_oldVideoMode; ///< Video mode in use before we switch to fullscreen
- RRCrtc m_oldRRCrtc; ///< RRCrtc in use before we switch to fullscreen
- ::Cursor m_hiddenCursor; ///< As X11 doesn't provide cursor hiding, we must create a transparent one
- ::Cursor m_lastCursor; ///< Last cursor used -- this data is not owned by the window and is required to be always valid
- bool m_keyRepeat; ///< Is the KeyRepeat feature enabled?
- Vector2i m_previousSize; ///< Previous size of the window, to find if a ConfigureNotify event is a resize event (could be a move event only)
- bool m_useSizeHints; ///< Is the size of the window fixed with size hints?
- bool m_fullscreen; ///< Is the window in fullscreen?
- bool m_cursorGrabbed; ///< Is the mouse cursor trapped?
- bool m_windowMapped; ///< Has the window been mapped by the window manager?
- Pixmap m_iconPixmap; ///< The current icon pixmap if in use
- Pixmap m_iconMaskPixmap; ///< The current icon mask pixmap if in use
- ::Time m_lastInputTime; ///< Last time we received user input
+ ::Window m_window; ///< X identifier defining our window
+ ::Display* m_display; ///< Pointer to the display
+ int m_screen; ///< Screen identifier
+ XIM m_inputMethod; ///< Input method linked to the X display
+ XIC m_inputContext; ///< Input context used to get unicode input in our window
+ bool m_isExternal; ///< Tell whether the window has been created externally or by SFML
+ RRMode m_oldVideoMode; ///< Video mode in use before we switch to fullscreen
+ RRCrtc m_oldRRCrtc; ///< RRCrtc in use before we switch to fullscreen
+ ::Cursor m_hiddenCursor; ///< As X11 doesn't provide cursor hiding, we must create a transparent one
+ ::Cursor m_lastCursor; ///< Last cursor used -- this data is not owned by the window and is required to be always valid
+ bool m_keyRepeat; ///< Is the KeyRepeat feature enabled?
+ Vector2i m_previousSize; ///< Previous size of the window, to find if a ConfigureNotify event is a resize event (could be a move event only)
+ bool m_useSizeHints; ///< Is the size of the window fixed with size hints?
+ bool m_fullscreen; ///< Is the window in fullscreen?
+ bool m_cursorGrabbed; ///< Is the mouse cursor trapped?
+ bool m_windowMapped; ///< Has the window been mapped by the window manager?
+ Pixmap m_iconPixmap; ///< The current icon pixmap if in use
+ Pixmap m_iconMaskPixmap; ///< The current icon mask pixmap if in use
+ ::Time m_lastInputTime; ///< Last time we received user input
};
} // namespace priv
diff --git a/src/SFML/Window/VideoMode.cpp b/src/SFML/Window/VideoMode.cpp
index 12c3801..b2fb265 100644
--- a/src/SFML/Window/VideoMode.cpp
+++ b/src/SFML/Window/VideoMode.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/VideoModeImpl.hpp b/src/SFML/Window/VideoModeImpl.hpp
index 7371472..408ebaa 100644
--- a/src/SFML/Window/VideoModeImpl.hpp
+++ b/src/SFML/Window/VideoModeImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Vulkan.cpp b/src/SFML/Window/Vulkan.cpp
new file mode 100644
index 0000000..66c5ae3
--- /dev/null
+++ b/src/SFML/Window/Vulkan.cpp
@@ -0,0 +1,105 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Vulkan.hpp>
+
+#if defined(SFML_SYSTEM_WINDOWS)
+
+ #include <SFML/Window/Win32/VulkanImplWin32.hpp>
+ typedef sf::priv::VulkanImplWin32 VulkanImplType;
+
+#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD)
+
+ #if defined(SFML_USE_DRM)
+
+ #define SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE
+
+ #else
+
+ #include <SFML/Window/Unix/VulkanImplX11.hpp>
+ typedef sf::priv::VulkanImplX11 VulkanImplType;
+
+ #endif
+
+#else
+
+#define SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE
+
+#endif
+
+
+namespace sf
+{
+////////////////////////////////////////////////////////////
+bool Vulkan::isAvailable(bool requireGraphics)
+{
+#if defined(SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE)
+
+ (void) requireGraphics;
+ return false;
+
+#else
+
+ return VulkanImplType::isAvailable(requireGraphics);
+
+#endif
+}
+
+
+////////////////////////////////////////////////////////////
+VulkanFunctionPointer Vulkan::getFunction(const char* name)
+{
+#if defined(SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE)
+
+ (void) name;
+ return NULL;
+
+#else
+
+ return VulkanImplType::getFunction(name);
+
+#endif
+}
+
+
+////////////////////////////////////////////////////////////
+const std::vector<const char*>& Vulkan::getGraphicsRequiredInstanceExtensions()
+{
+#if defined(SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE)
+
+ static const std::vector<const char*> empty;
+
+ return empty;
+
+#else
+
+ return VulkanImplType::getGraphicsRequiredInstanceExtensions();
+
+#endif
+}
+
+} // namespace sf
diff --git a/src/SFML/Window/Win32/ClipboardImpl.cpp b/src/SFML/Window/Win32/ClipboardImpl.cpp
index 13fd06f..7353af9 100644
--- a/src/SFML/Window/Win32/ClipboardImpl.cpp
+++ b/src/SFML/Window/Win32/ClipboardImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Win32/ClipboardImpl.hpp b/src/SFML/Window/Win32/ClipboardImpl.hpp
index c42ec5e..5c526d6 100644
--- a/src/SFML/Window/Win32/ClipboardImpl.hpp
+++ b/src/SFML/Window/Win32/ClipboardImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Win32/CursorImpl.cpp b/src/SFML/Window/Win32/CursorImpl.cpp
index d1913d6..0fe346d 100755
--- a/src/SFML/Window/Win32/CursorImpl.cpp
+++ b/src/SFML/Window/Win32/CursorImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -36,7 +36,8 @@ namespace priv
////////////////////////////////////////////////////////////
CursorImpl::CursorImpl() :
-m_cursor(NULL)
+m_cursor(NULL),
+m_systemCursor(false)
{
// That's it.
}
@@ -59,8 +60,8 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot
std::memset(&bitmapHeader, 0, sizeof(BITMAPV5HEADER));
bitmapHeader.bV5Size = sizeof(BITMAPV5HEADER);
- bitmapHeader.bV5Width = size.x;
- bitmapHeader.bV5Height = -static_cast<int>(size.y); // Negative indicates origin is in upper-left corner
+ bitmapHeader.bV5Width = static_cast<LONG>(size.x);
+ bitmapHeader.bV5Height = -static_cast<LONG>(size.y); // Negative indicates origin is in upper-left corner
bitmapHeader.bV5Planes = 1;
bitmapHeader.bV5BitCount = 32;
bitmapHeader.bV5Compression = BI_BITFIELDS;
@@ -93,11 +94,11 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot
Uint32* bitmapOffset = bitmapData;
for (std::size_t remaining = size.x * size.y; remaining > 0; --remaining, pixels += 4)
{
- *bitmapOffset++ = (pixels[3] << 24) | (pixels[0] << 16) | (pixels[1] << 8) | pixels[2];
+ *bitmapOffset++ = static_cast<Uint32>((pixels[3] << 24) | (pixels[0] << 16) | (pixels[1] << 8) | pixels[2]);
}
// Create a dummy mask bitmap (it won't be used)
- HBITMAP mask = CreateBitmap(size.x, size.y, 1, 1, NULL);
+ HBITMAP mask = CreateBitmap(static_cast<int>(size.x), static_cast<int>(size.y), 1, 1, NULL);
if (!mask)
{
@@ -118,6 +119,7 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot
// Create the cursor
m_cursor = reinterpret_cast<HCURSOR>(CreateIconIndirect(&cursorInfo));
+ m_systemCursor = false;
// The data has been copied into the cursor, so get rid of these
DeleteObject(color);
@@ -140,7 +142,7 @@ bool CursorImpl::loadFromSystem(Cursor::Type type)
{
release();
- LPCTSTR shape;
+ LPCTSTR shape = NULL;
switch (type)
{
case Cursor::Arrow: shape = IDC_ARROW; break;
@@ -152,14 +154,23 @@ bool CursorImpl::loadFromSystem(Cursor::Type type)
case Cursor::SizeVertical: shape = IDC_SIZENS; break;
case Cursor::SizeTopLeftBottomRight: shape = IDC_SIZENWSE; break;
case Cursor::SizeBottomLeftTopRight: shape = IDC_SIZENESW; break;
+ case Cursor::SizeLeft: shape = IDC_SIZEWE; break;
+ case Cursor::SizeRight: shape = IDC_SIZEWE; break;
+ case Cursor::SizeTop: shape = IDC_SIZENS; break;
+ case Cursor::SizeBottom: shape = IDC_SIZENS; break;
+ case Cursor::SizeTopLeft: shape = IDC_SIZENWSE; break;
+ case Cursor::SizeBottomRight: shape = IDC_SIZENWSE; break;
+ case Cursor::SizeBottomLeft: shape = IDC_SIZENESW; break;
+ case Cursor::SizeTopRight: shape = IDC_SIZENESW; break;
case Cursor::SizeAll: shape = IDC_SIZEALL; break;
case Cursor::Cross: shape = IDC_CROSS; break;
case Cursor::Help: shape = IDC_HELP; break;
case Cursor::NotAllowed: shape = IDC_NO; break;
}
- // Create a copy of the shared system cursor that we can destroy later
- m_cursor = CopyCursor(LoadCursor(NULL, shape));
+ // Get the shared system cursor and make sure not to destroy it
+ m_cursor = LoadCursor(NULL, shape);
+ m_systemCursor = true;
if (m_cursor)
{
@@ -176,7 +187,7 @@ bool CursorImpl::loadFromSystem(Cursor::Type type)
////////////////////////////////////////////////////////////
void CursorImpl::release()
{
- if (m_cursor) {
+ if (m_cursor && !m_systemCursor) {
DestroyCursor(m_cursor);
m_cursor = NULL;
}
diff --git a/src/SFML/Window/Win32/CursorImpl.hpp b/src/SFML/Window/Win32/CursorImpl.hpp
index 602f223..71c9904 100755
--- a/src/SFML/Window/Win32/CursorImpl.hpp
+++ b/src/SFML/Window/Win32/CursorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -93,6 +93,7 @@ private:
// Member data
////////////////////////////////////////////////////////////
HCURSOR m_cursor;
+ bool m_systemCursor;
};
} // namespace priv
diff --git a/src/SFML/Window/Win32/InputImpl.cpp b/src/SFML/Window/Win32/InputImpl.cpp
index 0482740..9c223dd 100644
--- a/src/SFML/Window/Win32/InputImpl.cpp
+++ b/src/SFML/Window/Win32/InputImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -37,127 +37,591 @@
#include <SFML/Window/Win32/InputImpl.hpp>
#include <windows.h>
-
namespace sf
{
namespace priv
{
////////////////////////////////////////////////////////////
-bool InputImpl::isKeyPressed(Keyboard::Key key)
+Keyboard::Scancode InputImpl::m_keyToScancodeMapping[Keyboard::KeyCount]; ///< Mapping from Key to Scancode
+Keyboard::Key InputImpl::m_scancodeToKeyMapping[Keyboard::Scan::ScancodeCount]; ///< Mapping from Scancode to Key
+
+////////////////////////////////////////////////////////////
+Keyboard::Key virtualKeyToSfKey(UINT virtualKey)
+{
+ switch (virtualKey)
+ {
+ case 'A': return Keyboard::A;
+ case 'B': return Keyboard::B;
+ case 'C': return Keyboard::C;
+ case 'D': return Keyboard::D;
+ case 'E': return Keyboard::E;
+ case 'F': return Keyboard::F;
+ case 'G': return Keyboard::G;
+ case 'H': return Keyboard::H;
+ case 'I': return Keyboard::I;
+ case 'J': return Keyboard::J;
+ case 'K': return Keyboard::K;
+ case 'L': return Keyboard::L;
+ case 'M': return Keyboard::M;
+ case 'N': return Keyboard::N;
+ case 'O': return Keyboard::O;
+ case 'P': return Keyboard::P;
+ case 'Q': return Keyboard::Q;
+ case 'R': return Keyboard::R;
+ case 'S': return Keyboard::S;
+ case 'T': return Keyboard::T;
+ case 'U': return Keyboard::U;
+ case 'V': return Keyboard::V;
+ case 'W': return Keyboard::W;
+ case 'X': return Keyboard::X;
+ case 'Y': return Keyboard::Y;
+ case 'Z': return Keyboard::Z;
+ case '0': return Keyboard::Num0;
+ case '1': return Keyboard::Num1;
+ case '2': return Keyboard::Num2;
+ case '3': return Keyboard::Num3;
+ case '4': return Keyboard::Num4;
+ case '5': return Keyboard::Num5;
+ case '6': return Keyboard::Num6;
+ case '7': return Keyboard::Num7;
+ case '8': return Keyboard::Num8;
+ case '9': return Keyboard::Num9;
+ case VK_ESCAPE: return Keyboard::Escape;
+ case VK_LCONTROL: return Keyboard::LControl;
+ case VK_LSHIFT: return Keyboard::LShift;
+ case VK_LMENU: return Keyboard::LAlt;
+ case VK_LWIN: return Keyboard::LSystem;
+ case VK_RCONTROL: return Keyboard::RControl;
+ case VK_RSHIFT: return Keyboard::RShift;
+ case VK_RMENU: return Keyboard::RAlt;
+ case VK_RWIN: return Keyboard::RSystem;
+ case VK_APPS: return Keyboard::Menu;
+ case VK_OEM_4: return Keyboard::LBracket;
+ case VK_OEM_6: return Keyboard::RBracket;
+ case VK_OEM_1: return Keyboard::Semicolon;
+ case VK_OEM_COMMA: return Keyboard::Comma;
+ case VK_OEM_PERIOD: return Keyboard::Period;
+ case VK_OEM_7: return Keyboard::Apostrophe;
+ case VK_OEM_2: return Keyboard::Slash;
+ case VK_OEM_5: return Keyboard::Backslash;
+ case VK_OEM_3: return Keyboard::Grave;
+ case VK_OEM_PLUS: return Keyboard::Equal;
+ case VK_OEM_MINUS: return Keyboard::Hyphen;
+ case VK_SPACE: return Keyboard::Space;
+ case VK_RETURN: return Keyboard::Enter;
+ case VK_BACK: return Keyboard::Backspace;
+ case VK_TAB: return Keyboard::Tab;
+ case VK_PRIOR: return Keyboard::PageUp;
+ case VK_NEXT: return Keyboard::PageDown;
+ case VK_END: return Keyboard::End;
+ case VK_HOME: return Keyboard::Home;
+ case VK_INSERT: return Keyboard::Insert;
+ case VK_DELETE: return Keyboard::Delete;
+ case VK_ADD: return Keyboard::Add;
+ case VK_SUBTRACT: return Keyboard::Subtract;
+ case VK_MULTIPLY: return Keyboard::Multiply;
+ case VK_DIVIDE: return Keyboard::Divide;
+ case VK_LEFT: return Keyboard::Left;
+ case VK_RIGHT: return Keyboard::Right;
+ case VK_UP: return Keyboard::Up;
+ case VK_DOWN: return Keyboard::Down;
+ case VK_NUMPAD0: return Keyboard::Numpad0;
+ case VK_NUMPAD1: return Keyboard::Numpad1;
+ case VK_NUMPAD2: return Keyboard::Numpad2;
+ case VK_NUMPAD3: return Keyboard::Numpad3;
+ case VK_NUMPAD4: return Keyboard::Numpad4;
+ case VK_NUMPAD5: return Keyboard::Numpad5;
+ case VK_NUMPAD6: return Keyboard::Numpad6;
+ case VK_NUMPAD7: return Keyboard::Numpad7;
+ case VK_NUMPAD8: return Keyboard::Numpad8;
+ case VK_NUMPAD9: return Keyboard::Numpad9;
+ case VK_F1: return Keyboard::F1;
+ case VK_F2: return Keyboard::F2;
+ case VK_F3: return Keyboard::F3;
+ case VK_F4: return Keyboard::F4;
+ case VK_F5: return Keyboard::F5;
+ case VK_F6: return Keyboard::F6;
+ case VK_F7: return Keyboard::F7;
+ case VK_F8: return Keyboard::F8;
+ case VK_F9: return Keyboard::F9;
+ case VK_F10: return Keyboard::F10;
+ case VK_F11: return Keyboard::F11;
+ case VK_F12: return Keyboard::F12;
+ case VK_F13: return Keyboard::F13;
+ case VK_F14: return Keyboard::F14;
+ case VK_F15: return Keyboard::F15;
+ case VK_PAUSE: return Keyboard::Pause;
+ default: return Keyboard::Unknown;
+ }
+}
+
+////////////////////////////////////////////////////////////
+int sfKeyToVirtualKey(Keyboard::Key key)
{
- int vkey = 0;
switch (key)
+ {
+ case Keyboard::A: return 'A';
+ case Keyboard::B: return 'B';
+ case Keyboard::C: return 'C';
+ case Keyboard::D: return 'D';
+ case Keyboard::E: return 'E';
+ case Keyboard::F: return 'F';
+ case Keyboard::G: return 'G';
+ case Keyboard::H: return 'H';
+ case Keyboard::I: return 'I';
+ case Keyboard::J: return 'J';
+ case Keyboard::K: return 'K';
+ case Keyboard::L: return 'L';
+ case Keyboard::M: return 'M';
+ case Keyboard::N: return 'N';
+ case Keyboard::O: return 'O';
+ case Keyboard::P: return 'P';
+ case Keyboard::Q: return 'Q';
+ case Keyboard::R: return 'R';
+ case Keyboard::S: return 'S';
+ case Keyboard::T: return 'T';
+ case Keyboard::U: return 'U';
+ case Keyboard::V: return 'V';
+ case Keyboard::W: return 'W';
+ case Keyboard::X: return 'X';
+ case Keyboard::Y: return 'Y';
+ case Keyboard::Z: return 'Z';
+ case Keyboard::Num0: return '0';
+ case Keyboard::Num1: return '1';
+ case Keyboard::Num2: return '2';
+ case Keyboard::Num3: return '3';
+ case Keyboard::Num4: return '4';
+ case Keyboard::Num5: return '5';
+ case Keyboard::Num6: return '6';
+ case Keyboard::Num7: return '7';
+ case Keyboard::Num8: return '8';
+ case Keyboard::Num9: return '9';
+ case Keyboard::Escape: return VK_ESCAPE;
+ case Keyboard::LControl: return VK_LCONTROL;
+ case Keyboard::LShift: return VK_LSHIFT;
+ case Keyboard::LAlt: return VK_LMENU;
+ case Keyboard::LSystem: return VK_LWIN;
+ case Keyboard::RControl: return VK_RCONTROL;
+ case Keyboard::RShift: return VK_RSHIFT;
+ case Keyboard::RAlt: return VK_RMENU;
+ case Keyboard::RSystem: return VK_RWIN;
+ case Keyboard::Menu: return VK_APPS;
+ case Keyboard::LBracket: return VK_OEM_4;
+ case Keyboard::RBracket: return VK_OEM_6;
+ case Keyboard::Semicolon: return VK_OEM_1;
+ case Keyboard::Comma: return VK_OEM_COMMA;
+ case Keyboard::Period: return VK_OEM_PERIOD;
+ case Keyboard::Apostrophe: return VK_OEM_7;
+ case Keyboard::Slash: return VK_OEM_2;
+ case Keyboard::Backslash: return VK_OEM_5;
+ case Keyboard::Grave: return VK_OEM_3;
+ case Keyboard::Equal: return VK_OEM_PLUS;
+ case Keyboard::Hyphen: return VK_OEM_MINUS;
+ case Keyboard::Space: return VK_SPACE;
+ case Keyboard::Enter: return VK_RETURN;
+ case Keyboard::Backspace: return VK_BACK;
+ case Keyboard::Tab: return VK_TAB;
+ case Keyboard::PageUp: return VK_PRIOR;
+ case Keyboard::PageDown: return VK_NEXT;
+ case Keyboard::End: return VK_END;
+ case Keyboard::Home: return VK_HOME;
+ case Keyboard::Insert: return VK_INSERT;
+ case Keyboard::Delete: return VK_DELETE;
+ case Keyboard::Add: return VK_ADD;
+ case Keyboard::Subtract: return VK_SUBTRACT;
+ case Keyboard::Multiply: return VK_MULTIPLY;
+ case Keyboard::Divide: return VK_DIVIDE;
+ case Keyboard::Left: return VK_LEFT;
+ case Keyboard::Right: return VK_RIGHT;
+ case Keyboard::Up: return VK_UP;
+ case Keyboard::Down: return VK_DOWN;
+ case Keyboard::Numpad0: return VK_NUMPAD0;
+ case Keyboard::Numpad1: return VK_NUMPAD1;
+ case Keyboard::Numpad2: return VK_NUMPAD2;
+ case Keyboard::Numpad3: return VK_NUMPAD3;
+ case Keyboard::Numpad4: return VK_NUMPAD4;
+ case Keyboard::Numpad5: return VK_NUMPAD5;
+ case Keyboard::Numpad6: return VK_NUMPAD6;
+ case Keyboard::Numpad7: return VK_NUMPAD7;
+ case Keyboard::Numpad8: return VK_NUMPAD8;
+ case Keyboard::Numpad9: return VK_NUMPAD9;
+ case Keyboard::F1: return VK_F1;
+ case Keyboard::F2: return VK_F2;
+ case Keyboard::F3: return VK_F3;
+ case Keyboard::F4: return VK_F4;
+ case Keyboard::F5: return VK_F5;
+ case Keyboard::F6: return VK_F6;
+ case Keyboard::F7: return VK_F7;
+ case Keyboard::F8: return VK_F8;
+ case Keyboard::F9: return VK_F9;
+ case Keyboard::F10: return VK_F10;
+ case Keyboard::F11: return VK_F11;
+ case Keyboard::F12: return VK_F12;
+ case Keyboard::F13: return VK_F13;
+ case Keyboard::F14: return VK_F14;
+ case Keyboard::F15: return VK_F15;
+ case Keyboard::Pause: return VK_PAUSE;
+ default: return 0;
+ }
+}
+
+////////////////////////////////////////////////////////////
+WORD sfScanToWinScan(Keyboard::Scancode code)
+{
+ // Convert an SFML scancode to a Windows scancode
+ // Reference: https://msdn.microsoft.com/en-us/library/aa299374(v=vs.60).aspx
+ switch (code)
+ {
+ case Keyboard::Scan::A: return 0x1E;
+ case Keyboard::Scan::B: return 0x30;
+ case Keyboard::Scan::C: return 0x2E;
+ case Keyboard::Scan::D: return 0x20;
+ case Keyboard::Scan::E: return 0x12;
+ case Keyboard::Scan::F: return 0x21;
+ case Keyboard::Scan::G: return 0x22;
+ case Keyboard::Scan::H: return 0x23;
+ case Keyboard::Scan::I: return 0x17;
+ case Keyboard::Scan::J: return 0x24;
+ case Keyboard::Scan::K: return 0x25;
+ case Keyboard::Scan::L: return 0x26;
+ case Keyboard::Scan::M: return 0x32;
+ case Keyboard::Scan::N: return 0x31;
+ case Keyboard::Scan::O: return 0x18;
+ case Keyboard::Scan::P: return 0x19;
+ case Keyboard::Scan::Q: return 0x10;
+ case Keyboard::Scan::R: return 0x13;
+ case Keyboard::Scan::S: return 0x1F;
+ case Keyboard::Scan::T: return 0x14;
+ case Keyboard::Scan::U: return 0x16;
+ case Keyboard::Scan::V: return 0x2F;
+ case Keyboard::Scan::W: return 0x11;
+ case Keyboard::Scan::X: return 0x2D;
+ case Keyboard::Scan::Y: return 0x15;
+ case Keyboard::Scan::Z: return 0x2C;
+
+ case Keyboard::Scan::Num1: return 0x02;
+ case Keyboard::Scan::Num2: return 0x03;
+ case Keyboard::Scan::Num3: return 0x04;
+ case Keyboard::Scan::Num4: return 0x05;
+ case Keyboard::Scan::Num5: return 0x06;
+ case Keyboard::Scan::Num6: return 0x07;
+ case Keyboard::Scan::Num7: return 0x08;
+ case Keyboard::Scan::Num8: return 0x09;
+ case Keyboard::Scan::Num9: return 0x0A;
+ case Keyboard::Scan::Num0: return 0x0B;
+
+ case Keyboard::Scan::Enter: return 0x1C;
+ case Keyboard::Scan::Escape: return 0x01;
+ case Keyboard::Scan::Backspace: return 0x0E;
+ case Keyboard::Scan::Tab: return 0x0F;
+ case Keyboard::Scan::Space: return 0x39;
+ case Keyboard::Scan::Hyphen: return 0x0C;
+ case Keyboard::Scan::Equal: return 0x0D;
+ case Keyboard::Scan::LBracket: return 0x1A;
+ case Keyboard::Scan::RBracket: return 0x1B;
+ case Keyboard::Scan::Backslash: return 0x2B;
+ case Keyboard::Scan::Semicolon: return 0x27;
+ case Keyboard::Scan::Apostrophe: return 0x28;
+ case Keyboard::Scan::Grave: return 0x29;
+ case Keyboard::Scan::Comma: return 0x33;
+ case Keyboard::Scan::Period: return 0x34;
+ case Keyboard::Scan::Slash: return 0x35;
+
+ case Keyboard::Scan::F1: return 0x3B;
+ case Keyboard::Scan::F2: return 0x3C;
+ case Keyboard::Scan::F3: return 0x3D;
+ case Keyboard::Scan::F4: return 0x3E;
+ case Keyboard::Scan::F5: return 0x3F;
+ case Keyboard::Scan::F6: return 0x40;
+ case Keyboard::Scan::F7: return 0x41;
+ case Keyboard::Scan::F8: return 0x42;
+ case Keyboard::Scan::F9: return 0x43;
+ case Keyboard::Scan::F10: return 0x44;
+ case Keyboard::Scan::F11: return 0x57;
+ case Keyboard::Scan::F12: return 0x58;
+ case Keyboard::Scan::F13: return 0x64;
+ case Keyboard::Scan::F14: return 0x65;
+ case Keyboard::Scan::F15: return 0x66;
+ case Keyboard::Scan::F16: return 0x67;
+ case Keyboard::Scan::F17: return 0x68;
+ case Keyboard::Scan::F18: return 0x69;
+ case Keyboard::Scan::F19: return 0x6A;
+ case Keyboard::Scan::F20: return 0x6B;
+ case Keyboard::Scan::F21: return 0x6C;
+ case Keyboard::Scan::F22: return 0x6D;
+ case Keyboard::Scan::F23: return 0x6E;
+ case Keyboard::Scan::F24: return 0x76;
+
+ case Keyboard::Scan::CapsLock: return 0x3A;
+ case Keyboard::Scan::PrintScreen: return 0xE037;
+ case Keyboard::Scan::ScrollLock: return 0x46;
+ case Keyboard::Scan::Pause: return 0x45;
+ case Keyboard::Scan::Insert: return 0xE052;
+ case Keyboard::Scan::Home: return 0xE047;
+ case Keyboard::Scan::PageUp: return 0xE049;
+ case Keyboard::Scan::Delete: return 0xE053;
+ case Keyboard::Scan::End: return 0xE04F;
+ case Keyboard::Scan::PageDown: return 0xE051;
+ case Keyboard::Scan::Right: return 0xE04D;
+ case Keyboard::Scan::Left: return 0xE04B;
+ case Keyboard::Scan::Down: return 0xE050;
+ case Keyboard::Scan::Up: return 0xE048;
+ case Keyboard::Scan::NumLock: return 0xE045;
+
+ case Keyboard::Scan::NumpadDivide: return 0xE035;
+ case Keyboard::Scan::NumpadMultiply: return 0x37;
+ case Keyboard::Scan::NumpadMinus: return 0x4A;
+ case Keyboard::Scan::NumpadPlus: return 0x4E;
+ case Keyboard::Scan::NumpadEqual: return 0x7E;
+ case Keyboard::Scan::NumpadEnter: return 0xE01C;
+ case Keyboard::Scan::NumpadDecimal: return 0x53;
+
+ case Keyboard::Scan::Numpad1: return 0x4F;
+ case Keyboard::Scan::Numpad2: return 0x50;
+ case Keyboard::Scan::Numpad3: return 0x51;
+ case Keyboard::Scan::Numpad4: return 0x4B;
+ case Keyboard::Scan::Numpad5: return 0x4C;
+ case Keyboard::Scan::Numpad6: return 0x4D;
+ case Keyboard::Scan::Numpad7: return 0x47;
+ case Keyboard::Scan::Numpad8: return 0x48;
+ case Keyboard::Scan::Numpad9: return 0x49;
+ case Keyboard::Scan::Numpad0: return 0x52;
+
+ case Keyboard::Scan::NonUsBackslash: return 0x56;
+ // No known scancode for Keyboard::Scan::Application
+ // No known scancode for Keyboard::Scan::Execute
+ // No known scancode for Keyboard::Scan::ModeChange
+ case Keyboard::Scan::Help: return 0xE061;
+ case Keyboard::Scan::Menu: return 0xE05D;
+ case Keyboard::Scan::Select: return 0xE01E;
+ // No known scancode for Keyboard::Scan::Redo
+ // No known scancode for Keyboard::Scan::Undo
+ // No known scancode for Keyboard::Scan::Cut
+ // No known scancode for Keyboard::Scan::Copy
+ // No known scancode for Keyboard::Scan::Paste
+
+ case Keyboard::Scan::VolumeMute: return 0xE020;
+ case Keyboard::Scan::VolumeUp: return 0xE02E;
+ case Keyboard::Scan::VolumeDown: return 0xE02C;
+ case Keyboard::Scan::MediaPlayPause: return 0xE022;
+ case Keyboard::Scan::MediaStop: return 0xE024;
+ case Keyboard::Scan::MediaNextTrack: return 0xE019;
+ case Keyboard::Scan::MediaPreviousTrack: return 0xE010;
+
+ case Keyboard::Scan::LControl: return 0x1D;
+ case Keyboard::Scan::LShift: return 0x2A;
+ case Keyboard::Scan::LAlt: return 0x38;
+ case Keyboard::Scan::LSystem: return 0xE05B;
+ case Keyboard::Scan::RControl: return 0xE01D;
+ case Keyboard::Scan::RShift: return 0x36;
+ case Keyboard::Scan::RAlt: return 0xE038;
+ case Keyboard::Scan::RSystem: return 0xE05C;
+
+ case Keyboard::Scan::Back: return 0xE06A;
+ case Keyboard::Scan::Forward: return 0xE069;
+ case Keyboard::Scan::Refresh: return 0xE067;
+ case Keyboard::Scan::Stop: return 0xE068;
+ case Keyboard::Scan::Search: return 0xE065;
+ case Keyboard::Scan::Favorites: return 0xE066;
+ case Keyboard::Scan::HomePage: return 0xE030;
+
+ case Keyboard::Scan::LaunchApplication1: return 0xE06B;
+ case Keyboard::Scan::LaunchApplication2: return 0xE021;
+ case Keyboard::Scan::LaunchMail: return 0xE06C;
+ case Keyboard::Scan::LaunchMediaSelect: return 0xE06D;
+
+ // Unable to map to a scancode
+ default: return 0x0;
+ }
+}
+
+////////////////////////////////////////////////////////////
+WORD sfScanToWinScanExtended(Keyboard::Scancode code)
+{
+ // Convert an SFML scancode to a Windows scancode
+ // Reference: https://msdn.microsoft.com/en-us/library/aa299374(v=vs.60).aspx
+ switch (code)
+ {
+ case Keyboard::Scan::PrintScreen: return 55 | 0xE100;
+ case Keyboard::Scan::Insert: return 82 | 0xE100;
+ case Keyboard::Scan::Home: return 71 | 0xE100;
+ case Keyboard::Scan::PageUp: return 73 | 0xE100;
+ case Keyboard::Scan::Delete: return 83 | 0xE100;
+ case Keyboard::Scan::End: return 79 | 0xE100;
+ case Keyboard::Scan::PageDown: return 81 | 0xE100;
+ case Keyboard::Scan::Right: return 77 | 0xE100;
+ case Keyboard::Scan::Left: return 75 | 0xE100;
+ case Keyboard::Scan::Down: return 80 | 0xE100;
+ case Keyboard::Scan::Up: return 72 | 0xE100;
+ case Keyboard::Scan::NumLock: return 69 | 0xE100;
+ case Keyboard::Scan::NumpadEnter: return 28 | 0xE100;
+ case Keyboard::Scan::NumpadDivide: return 53 | 0xE100;
+ case Keyboard::Scan::Help: return 97 | 0xE100;
+ case Keyboard::Scan::Menu: return 93 | 0xE100;
+ case Keyboard::Scan::Select: return 30 | 0xE100;
+ case Keyboard::Scan::VolumeMute: return 32 | 0xE100;
+ case Keyboard::Scan::VolumeUp: return 46 | 0xE100;
+ case Keyboard::Scan::VolumeDown: return 44 | 0xE100;
+ case Keyboard::Scan::MediaPlayPause: return 34 | 0xE100;
+ case Keyboard::Scan::MediaStop: return 36 | 0xE100;
+ case Keyboard::Scan::MediaNextTrack: return 25 | 0xE100;
+ case Keyboard::Scan::MediaPreviousTrack: return 16 | 0xE100;
+ case Keyboard::Scan::LSystem: return 91 | 0xE100;
+ case Keyboard::Scan::RControl: return 29 | 0xE100;
+ case Keyboard::Scan::RAlt: return 56 | 0xE100;
+ case Keyboard::Scan::RSystem: return 92 | 0xE100;
+ case Keyboard::Scan::Back: return 106 | 0xE100;
+ case Keyboard::Scan::Forward: return 105 | 0xE100;
+ case Keyboard::Scan::Refresh: return 103 | 0xE100;
+ case Keyboard::Scan::Stop: return 104 | 0xE100;
+ case Keyboard::Scan::Search: return 101 | 0xE100;
+ case Keyboard::Scan::Favorites: return 102 | 0xE100;
+ case Keyboard::Scan::HomePage: return 48 | 0xE100;
+ case Keyboard::Scan::LaunchApplication1: return 107 | 0xE100;
+ case Keyboard::Scan::LaunchApplication2: return 33 | 0xE100;
+ case Keyboard::Scan::LaunchMail: return 108 | 0xE100;
+ case Keyboard::Scan::LaunchMediaSelect: return 109 | 0xE100;
+
+ // Use non-extended mapping
+ default: return sfScanToWinScan(code);
+ }
+}
+
+UINT sfScanToVirtualKey(Keyboard::Scancode code)
+{
+ WORD winScancode = sfScanToWinScan(code);
+
+ // Manually map non-extended key codes
+ switch (code)
+ {
+ case Keyboard::Scan::Numpad0:
+ return VK_NUMPAD0;
+ case Keyboard::Scan::Numpad1:
+ return VK_NUMPAD1;
+ case Keyboard::Scan::Numpad2:
+ return VK_NUMPAD2;
+ case Keyboard::Scan::Numpad3:
+ return VK_NUMPAD3;
+ case Keyboard::Scan::Numpad4:
+ return VK_NUMPAD4;
+ case Keyboard::Scan::Numpad5:
+ return VK_NUMPAD5;
+ case Keyboard::Scan::Numpad6:
+ return VK_NUMPAD6;
+ case Keyboard::Scan::Numpad7:
+ return VK_NUMPAD7;
+ case Keyboard::Scan::Numpad8:
+ return VK_NUMPAD8;
+ case Keyboard::Scan::Numpad9:
+ return VK_NUMPAD9;
+ case Keyboard::Scan::NumpadMinus:
+ return VK_SUBTRACT;
+ case Keyboard::Scan::NumpadDecimal:
+ return VK_DECIMAL;
+ case Keyboard::Scan::NumpadDivide:
+ return VK_DIVIDE;
+ case Keyboard::Scan::Pause:
+ return VK_PAUSE;
+ case Keyboard::Scan::RControl:
+ return VK_RCONTROL;
+ case Keyboard::Scan::RAlt:
+ return VK_RMENU;
+ default:
+ return MapVirtualKey(winScancode, MAPVK_VSC_TO_VK_EX);
+ }
+}
+
+bool isValidScancode(Keyboard::Scancode code)
+{
+ return code > Keyboard::Scan::Unknown && code < Keyboard::Scan::ScancodeCount;
+}
+
+bool isValidKey(Keyboard::Key key)
+{
+ return key > Keyboard::Unknown && key < Keyboard::KeyCount;
+}
+
+////////////////////////////////////////////////////////////
+void InputImpl::ensureMappings()
+{
+ static bool isMappingInitialized = false;
+
+ if (isMappingInitialized)
+ return;
+
+ // Phase 1: Initialize mappings with default values
+ for (int i = 0; i < Keyboard::KeyCount; ++i)
+ m_keyToScancodeMapping[i] = Keyboard::Scan::Unknown;
+
+ for (int i = 0; i < Keyboard::Scan::ScancodeCount; ++i)
+ m_scancodeToKeyMapping[i] = Keyboard::Unknown;
+
+ // Phase 2: Translate scancode to virtual code to key names
+ for (int i = 0; i < Keyboard::Scan::ScancodeCount; ++i)
{
- default: vkey = 0; break;
- case Keyboard::A: vkey = 'A'; break;
- case Keyboard::B: vkey = 'B'; break;
- case Keyboard::C: vkey = 'C'; break;
- case Keyboard::D: vkey = 'D'; break;
- case Keyboard::E: vkey = 'E'; break;
- case Keyboard::F: vkey = 'F'; break;
- case Keyboard::G: vkey = 'G'; break;
- case Keyboard::H: vkey = 'H'; break;
- case Keyboard::I: vkey = 'I'; break;
- case Keyboard::J: vkey = 'J'; break;
- case Keyboard::K: vkey = 'K'; break;
- case Keyboard::L: vkey = 'L'; break;
- case Keyboard::M: vkey = 'M'; break;
- case Keyboard::N: vkey = 'N'; break;
- case Keyboard::O: vkey = 'O'; break;
- case Keyboard::P: vkey = 'P'; break;
- case Keyboard::Q: vkey = 'Q'; break;
- case Keyboard::R: vkey = 'R'; break;
- case Keyboard::S: vkey = 'S'; break;
- case Keyboard::T: vkey = 'T'; break;
- case Keyboard::U: vkey = 'U'; break;
- case Keyboard::V: vkey = 'V'; break;
- case Keyboard::W: vkey = 'W'; break;
- case Keyboard::X: vkey = 'X'; break;
- case Keyboard::Y: vkey = 'Y'; break;
- case Keyboard::Z: vkey = 'Z'; break;
- case Keyboard::Num0: vkey = '0'; break;
- case Keyboard::Num1: vkey = '1'; break;
- case Keyboard::Num2: vkey = '2'; break;
- case Keyboard::Num3: vkey = '3'; break;
- case Keyboard::Num4: vkey = '4'; break;
- case Keyboard::Num5: vkey = '5'; break;
- case Keyboard::Num6: vkey = '6'; break;
- case Keyboard::Num7: vkey = '7'; break;
- case Keyboard::Num8: vkey = '8'; break;
- case Keyboard::Num9: vkey = '9'; break;
- case Keyboard::Escape: vkey = VK_ESCAPE; break;
- case Keyboard::LControl: vkey = VK_LCONTROL; break;
- case Keyboard::LShift: vkey = VK_LSHIFT; break;
- case Keyboard::LAlt: vkey = VK_LMENU; break;
- case Keyboard::LSystem: vkey = VK_LWIN; break;
- case Keyboard::RControl: vkey = VK_RCONTROL; break;
- case Keyboard::RShift: vkey = VK_RSHIFT; break;
- case Keyboard::RAlt: vkey = VK_RMENU; break;
- case Keyboard::RSystem: vkey = VK_RWIN; break;
- case Keyboard::Menu: vkey = VK_APPS; break;
- case Keyboard::LBracket: vkey = VK_OEM_4; break;
- case Keyboard::RBracket: vkey = VK_OEM_6; break;
- case Keyboard::Semicolon: vkey = VK_OEM_1; break;
- case Keyboard::Comma: vkey = VK_OEM_COMMA; break;
- case Keyboard::Period: vkey = VK_OEM_PERIOD; break;
- case Keyboard::Quote: vkey = VK_OEM_7; break;
- case Keyboard::Slash: vkey = VK_OEM_2; break;
- case Keyboard::Backslash: vkey = VK_OEM_5; break;
- case Keyboard::Tilde: vkey = VK_OEM_3; break;
- case Keyboard::Equal: vkey = VK_OEM_PLUS; break;
- case Keyboard::Hyphen: vkey = VK_OEM_MINUS; break;
- case Keyboard::Space: vkey = VK_SPACE; break;
- case Keyboard::Enter: vkey = VK_RETURN; break;
- case Keyboard::Backspace: vkey = VK_BACK; break;
- case Keyboard::Tab: vkey = VK_TAB; break;
- case Keyboard::PageUp: vkey = VK_PRIOR; break;
- case Keyboard::PageDown: vkey = VK_NEXT; break;
- case Keyboard::End: vkey = VK_END; break;
- case Keyboard::Home: vkey = VK_HOME; break;
- case Keyboard::Insert: vkey = VK_INSERT; break;
- case Keyboard::Delete: vkey = VK_DELETE; break;
- case Keyboard::Add: vkey = VK_ADD; break;
- case Keyboard::Subtract: vkey = VK_SUBTRACT; break;
- case Keyboard::Multiply: vkey = VK_MULTIPLY; break;
- case Keyboard::Divide: vkey = VK_DIVIDE; break;
- case Keyboard::Left: vkey = VK_LEFT; break;
- case Keyboard::Right: vkey = VK_RIGHT; break;
- case Keyboard::Up: vkey = VK_UP; break;
- case Keyboard::Down: vkey = VK_DOWN; break;
- case Keyboard::Numpad0: vkey = VK_NUMPAD0; break;
- case Keyboard::Numpad1: vkey = VK_NUMPAD1; break;
- case Keyboard::Numpad2: vkey = VK_NUMPAD2; break;
- case Keyboard::Numpad3: vkey = VK_NUMPAD3; break;
- case Keyboard::Numpad4: vkey = VK_NUMPAD4; break;
- case Keyboard::Numpad5: vkey = VK_NUMPAD5; break;
- case Keyboard::Numpad6: vkey = VK_NUMPAD6; break;
- case Keyboard::Numpad7: vkey = VK_NUMPAD7; break;
- case Keyboard::Numpad8: vkey = VK_NUMPAD8; break;
- case Keyboard::Numpad9: vkey = VK_NUMPAD9; break;
- case Keyboard::F1: vkey = VK_F1; break;
- case Keyboard::F2: vkey = VK_F2; break;
- case Keyboard::F3: vkey = VK_F3; break;
- case Keyboard::F4: vkey = VK_F4; break;
- case Keyboard::F5: vkey = VK_F5; break;
- case Keyboard::F6: vkey = VK_F6; break;
- case Keyboard::F7: vkey = VK_F7; break;
- case Keyboard::F8: vkey = VK_F8; break;
- case Keyboard::F9: vkey = VK_F9; break;
- case Keyboard::F10: vkey = VK_F10; break;
- case Keyboard::F11: vkey = VK_F11; break;
- case Keyboard::F12: vkey = VK_F12; break;
- case Keyboard::F13: vkey = VK_F13; break;
- case Keyboard::F14: vkey = VK_F14; break;
- case Keyboard::F15: vkey = VK_F15; break;
- case Keyboard::Pause: vkey = VK_PAUSE; break;
+ Keyboard::Scancode scan = static_cast<Keyboard::Scancode>(i);
+ UINT virtualKey = sfScanToVirtualKey(scan);
+ Keyboard::Key key = virtualKeyToSfKey(virtualKey);
+ if (key != Keyboard::Unknown && m_keyToScancodeMapping[key] == Keyboard::Scan::Unknown)
+ m_keyToScancodeMapping[key] = scan;
+ m_scancodeToKeyMapping[scan] = key;
}
- return (GetAsyncKeyState(vkey) & 0x8000) != 0;
+ isMappingInitialized = true;
+}
+
+////////////////////////////////////////////////////////////
+bool InputImpl::isKeyPressed(Keyboard::Key key)
+{
+ int virtualKey = sfKeyToVirtualKey(key);
+ return (GetAsyncKeyState(virtualKey) & 0x8000) != 0;
+}
+
+////////////////////////////////////////////////////////////
+bool InputImpl::isKeyPressed(Keyboard::Scancode code)
+{
+ UINT virtualKey = sfScanToVirtualKey(code);
+ return (GetAsyncKeyState(static_cast<int>(virtualKey)) & KF_UP) != 0;
+}
+
+////////////////////////////////////////////////////////////
+Keyboard::Key InputImpl::localize(Keyboard::Scancode code)
+{
+ if (!isValidScancode(code))
+ return Keyboard::Unknown;
+
+ ensureMappings();
+
+ return m_scancodeToKeyMapping[code];
}
+////////////////////////////////////////////////////////////
+Keyboard::Scancode InputImpl::delocalize(Keyboard::Key key)
+{
+ if (!isValidKey(key))
+ return Keyboard::Scan::Unknown;
+
+ ensureMappings();
+
+ return m_keyToScancodeMapping[key];
+}
+
+////////////////////////////////////////////////////////////
+String InputImpl::getDescription(Keyboard::Scancode code)
+{
+ WORD winCode = sfScanToWinScanExtended(code);
+ const int bufSize = 1024;
+ WCHAR name[bufSize];
+ int result = GetKeyNameText(winCode << 16, name, bufSize);
+ if (result > 0)
+ {
+ return name;
+ }
+ return "Unknown";
+}
////////////////////////////////////////////////////////////
-void InputImpl::setVirtualKeyboardVisible(bool visible)
+void InputImpl::setVirtualKeyboardVisible(bool /*visible*/)
{
// Not applicable
}
@@ -166,18 +630,18 @@ void InputImpl::setVirtualKeyboardVisible(bool visible)
////////////////////////////////////////////////////////////
bool InputImpl::isMouseButtonPressed(Mouse::Button button)
{
- int vkey = 0;
+ int virtualKey = 0;
switch (button)
{
- case Mouse::Left: vkey = GetSystemMetrics(SM_SWAPBUTTON) ? VK_RBUTTON : VK_LBUTTON; break;
- case Mouse::Right: vkey = GetSystemMetrics(SM_SWAPBUTTON) ? VK_LBUTTON : VK_RBUTTON; break;
- case Mouse::Middle: vkey = VK_MBUTTON; break;
- case Mouse::XButton1: vkey = VK_XBUTTON1; break;
- case Mouse::XButton2: vkey = VK_XBUTTON2; break;
- default: vkey = 0; break;
+ case Mouse::Left: virtualKey = GetSystemMetrics(SM_SWAPBUTTON) ? VK_RBUTTON : VK_LBUTTON; break;
+ case Mouse::Right: virtualKey = GetSystemMetrics(SM_SWAPBUTTON) ? VK_LBUTTON : VK_RBUTTON; break;
+ case Mouse::Middle: virtualKey = VK_MBUTTON; break;
+ case Mouse::XButton1: virtualKey = VK_XBUTTON1; break;
+ case Mouse::XButton2: virtualKey = VK_XBUTTON2; break;
+ default: virtualKey = 0; break;
}
- return (GetAsyncKeyState(vkey) & 0x8000) != 0;
+ return (GetAsyncKeyState(virtualKey) & 0x8000) != 0;
}
@@ -191,7 +655,7 @@ Vector2i InputImpl::getMousePosition()
////////////////////////////////////////////////////////////
-Vector2i InputImpl::getMousePosition(const Window& relativeTo)
+Vector2i InputImpl::getMousePosition(const WindowBase& relativeTo)
{
WindowHandle handle = relativeTo.getSystemHandle();
if (handle)
@@ -216,7 +680,7 @@ void InputImpl::setMousePosition(const Vector2i& position)
////////////////////////////////////////////////////////////
-void InputImpl::setMousePosition(const Vector2i& position, const Window& relativeTo)
+void InputImpl::setMousePosition(const Vector2i& position, const WindowBase& relativeTo)
{
WindowHandle handle = relativeTo.getSystemHandle();
if (handle)
@@ -245,7 +709,7 @@ Vector2i InputImpl::getTouchPosition(unsigned int /*finger*/)
////////////////////////////////////////////////////////////
-Vector2i InputImpl::getTouchPosition(unsigned int /*finger*/, const Window& /*relativeTo*/)
+Vector2i InputImpl::getTouchPosition(unsigned int /*finger*/, const WindowBase& /*relativeTo*/)
{
// Not applicable
return Vector2i();
diff --git a/src/SFML/Window/Win32/InputImpl.hpp b/src/SFML/Window/Win32/InputImpl.hpp
index 17ac482..a3a3457 100644
--- a/src/SFML/Window/Win32/InputImpl.hpp
+++ b/src/SFML/Window/Win32/InputImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -31,7 +31,6 @@
#include <SFML/Window/Keyboard.hpp>
#include <SFML/Window/Mouse.hpp>
-
namespace sf
{
namespace priv
@@ -43,21 +42,38 @@ namespace priv
class InputImpl
{
public:
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::isKeyPressed(Key)
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Key key);
////////////////////////////////////////////////////////////
- /// \brief Check if a key is pressed
+ /// \copydoc sf::Keyboard::isKeyPressed(Scancode)
///
- /// \param key Key to check
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::localize
///
- /// \return True if the key is pressed, false otherwise
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Key localize(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::delocalize
///
////////////////////////////////////////////////////////////
- static bool isKeyPressed(Keyboard::Key key);
+ static Keyboard::Scancode delocalize(Keyboard::Key key);
////////////////////////////////////////////////////////////
- /// \brief Show or hide the virtual keyboard
+ /// \copydoc sf::Keyboard::getDescription
///
- /// \param visible True to show, false to hide
+ ////////////////////////////////////////////////////////////
+ static String getDescription(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::setVirtualKeyboardVisible
///
////////////////////////////////////////////////////////////
static void setVirtualKeyboardVisible(bool visible);
@@ -95,7 +111,7 @@ public:
/// \return Current position of the mouse
///
////////////////////////////////////////////////////////////
- static Vector2i getMousePosition(const Window& relativeTo);
+ static Vector2i getMousePosition(const WindowBase& relativeTo);
////////////////////////////////////////////////////////////
/// \brief Set the current position of the mouse in desktop coordinates
@@ -120,7 +136,7 @@ public:
/// \param relativeTo Reference window
///
////////////////////////////////////////////////////////////
- static void setMousePosition(const Vector2i& position, const Window& relativeTo);
+ static void setMousePosition(const Vector2i& position, const WindowBase& relativeTo);
////////////////////////////////////////////////////////////
/// \brief Check if a touch event is currently down
@@ -157,7 +173,21 @@ public:
/// \return Current position of \a finger, or undefined if it's not down
///
////////////////////////////////////////////////////////////
- static Vector2i getTouchPosition(unsigned int finger, const Window& relativeTo);
+ static Vector2i getTouchPosition(unsigned int finger, const WindowBase& relativeTo);
+
+private:
+
+ ////////////////////////////////////////////////////////////
+ /// Ensure the mappings are generated from/to Key and Scancode.
+ ///
+ ////////////////////////////////////////////////////////////
+ static void ensureMappings();
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Scancode m_keyToScancodeMapping[Keyboard::KeyCount]; ///< Mapping from Key to Scancode
+ static Keyboard::Key m_scancodeToKeyMapping[Keyboard::Scan::ScancodeCount]; ///< Mapping from Scancode to Key
};
} // namespace priv
diff --git a/src/SFML/Window/Win32/JoystickImpl.cpp b/src/SFML/Window/Win32/JoystickImpl.cpp
index 1b98d9d..ae77f1d 100644
--- a/src/SFML/Window/Win32/JoystickImpl.cpp
+++ b/src/SFML/Window/Win32/JoystickImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -80,6 +80,17 @@ namespace
typedef std::vector<JoystickRecord> JoystickList;
JoystickList joystickList;
+
+ struct JoystickBlacklistEntry
+ {
+ unsigned int vendorId;
+ unsigned int productId;
+ };
+
+ typedef std::vector<JoystickBlacklistEntry> JoystickBlacklist;
+ JoystickBlacklist joystickBlacklist;
+
+ const DWORD directInputEventBufferSize = 32;
}
@@ -141,7 +152,7 @@ namespace
if (result != ERROR_SUCCESS)
{
- sf::err() << "Unable to open registry for joystick at index " << index << ": " << getErrorString(result) << std::endl;
+ sf::err() << "Unable to open registry for joystick at index " << index << ": " << getErrorString(static_cast<DWORD>(result)) << std::endl;
return joystickDescription;
}
}
@@ -161,7 +172,7 @@ namespace
if (result != ERROR_SUCCESS)
{
- sf::err() << "Unable to query registry key for joystick at index " << index << ": " << getErrorString(result) << std::endl;
+ sf::err() << "Unable to query registry key for joystick at index " << index << ": " << getErrorString(static_cast<DWORD>(result)) << std::endl;
return joystickDescription;
}
@@ -173,7 +184,7 @@ namespace
if (result != ERROR_SUCCESS)
{
- sf::err() << "Unable to open registry key for joystick at index " << index << ": " << getErrorString(result) << std::endl;
+ sf::err() << "Unable to open registry key for joystick at index " << index << ": " << getErrorString(static_cast<DWORD>(result)) << std::endl;
return joystickDescription;
}
@@ -184,7 +195,7 @@ namespace
if (result != ERROR_SUCCESS)
{
- sf::err() << "Unable to query name for joystick at index " << index << ": " << getErrorString(result) << std::endl;
+ sf::err() << "Unable to query name for joystick at index " << index << ": " << getErrorString(static_cast<DWORD>(result)) << std::endl;
return joystickDescription;
}
@@ -330,7 +341,16 @@ Joystick::Identification JoystickImpl::getIdentification() const
JoystickState JoystickImpl::update()
{
if (directInput)
- return updateDInput();
+ {
+ if (m_buffered)
+ {
+ return updateDInputBuffered();
+ }
+ else
+ {
+ return updateDInputPolled();
+ }
+ }
JoystickState state;
@@ -345,17 +365,17 @@ JoystickState JoystickImpl::update()
state.connected = true;
// Axes
- state.axes[Joystick::X] = (pos.dwXpos - (m_caps.wXmax + m_caps.wXmin) / 2.f) * 200.f / (m_caps.wXmax - m_caps.wXmin);
- state.axes[Joystick::Y] = (pos.dwYpos - (m_caps.wYmax + m_caps.wYmin) / 2.f) * 200.f / (m_caps.wYmax - m_caps.wYmin);
- state.axes[Joystick::Z] = (pos.dwZpos - (m_caps.wZmax + m_caps.wZmin) / 2.f) * 200.f / (m_caps.wZmax - m_caps.wZmin);
- state.axes[Joystick::R] = (pos.dwRpos - (m_caps.wRmax + m_caps.wRmin) / 2.f) * 200.f / (m_caps.wRmax - m_caps.wRmin);
- state.axes[Joystick::U] = (pos.dwUpos - (m_caps.wUmax + m_caps.wUmin) / 2.f) * 200.f / (m_caps.wUmax - m_caps.wUmin);
- state.axes[Joystick::V] = (pos.dwVpos - (m_caps.wVmax + m_caps.wVmin) / 2.f) * 200.f / (m_caps.wVmax - m_caps.wVmin);
+ state.axes[Joystick::X] = (static_cast<float>(pos.dwXpos) - static_cast<float>(m_caps.wXmax + m_caps.wXmin) / 2.f) * 200.f / static_cast<float>(m_caps.wXmax - m_caps.wXmin);
+ state.axes[Joystick::Y] = (static_cast<float>(pos.dwYpos) - static_cast<float>(m_caps.wYmax + m_caps.wYmin) / 2.f) * 200.f / static_cast<float>(m_caps.wYmax - m_caps.wYmin);
+ state.axes[Joystick::Z] = (static_cast<float>(pos.dwZpos) - static_cast<float>(m_caps.wZmax + m_caps.wZmin) / 2.f) * 200.f / static_cast<float>(m_caps.wZmax - m_caps.wZmin);
+ state.axes[Joystick::R] = (static_cast<float>(pos.dwRpos) - static_cast<float>(m_caps.wRmax + m_caps.wRmin) / 2.f) * 200.f / static_cast<float>(m_caps.wRmax - m_caps.wRmin);
+ state.axes[Joystick::U] = (static_cast<float>(pos.dwUpos) - static_cast<float>(m_caps.wUmax + m_caps.wUmin) / 2.f) * 200.f / static_cast<float>(m_caps.wUmax - m_caps.wUmin);
+ state.axes[Joystick::V] = (static_cast<float>(pos.dwVpos) - static_cast<float>(m_caps.wVmax + m_caps.wVmin) / 2.f) * 200.f / static_cast<float>(m_caps.wVmax - m_caps.wVmin);
// Special case for POV, it is given as an angle
if (pos.dwPOV != 0xFFFF)
{
- float angle = pos.dwPOV / 18000.f * 3.141592654f;
+ float angle = static_cast<float>(pos.dwPOV) / 18000.f * 3.141592654f;
state.axes[Joystick::PovX] = std::sin(angle) * 100;
state.axes[Joystick::PovY] = std::cos(angle) * 100;
}
@@ -367,7 +387,7 @@ JoystickState JoystickImpl::update()
// Buttons
for (unsigned int i = 0; i < Joystick::ButtonCount; ++i)
- state.buttons[i] = (pos.dwButtons & (1 << i)) != 0;
+ state.buttons[i] = (pos.dwButtons & (1u << i)) != 0;
}
return state;
@@ -384,14 +404,14 @@ void JoystickImpl::initializeDInput()
{
// Try to get the address of the DirectInput8Create entry point
typedef HRESULT(WINAPI *DirectInput8CreateFunc)(HINSTANCE, DWORD, REFIID, LPVOID*, LPUNKNOWN);
- DirectInput8CreateFunc directInput8Create = reinterpret_cast<DirectInput8CreateFunc>(GetProcAddress(dinput8dll, "DirectInput8Create"));
+ DirectInput8CreateFunc directInput8Create = reinterpret_cast<DirectInput8CreateFunc>(reinterpret_cast<void*>(GetProcAddress(dinput8dll, "DirectInput8Create")));
if (directInput8Create)
{
// Try to acquire a DirectInput 8.x interface
HRESULT result = directInput8Create(GetModuleHandleW(NULL), 0x0800, guids::IID_IDirectInput8W, reinterpret_cast<void**>(&directInput), NULL);
- if (result)
+ if (FAILED(result))
{
// De-initialize everything
directInput = NULL;
@@ -460,7 +480,7 @@ void JoystickImpl::updateConnectionsDInput()
++i;
}
- if (result)
+ if (FAILED(result))
{
err() << "Failed to enumerate DirectInput devices: " << result << std::endl;
@@ -499,22 +519,65 @@ bool JoystickImpl::openDInput(unsigned int index)
std::memset(&m_deviceCaps, 0, sizeof(DIDEVCAPS));
m_deviceCaps.dwSize = sizeof(DIDEVCAPS);
+ m_state = JoystickState();
+ m_buffered = false;
// Search for a joystick with the given index in the connected list
- for (std::vector<JoystickRecord>::iterator i = joystickList.begin(); i != joystickList.end(); ++i)
+ for (std::vector<JoystickRecord>::iterator it = joystickList.begin(); it != joystickList.end(); ++it)
{
- if (i->index == index)
+ if (it->index == index)
{
// Create device
- HRESULT result = directInput->CreateDevice(i->guid, &m_device, NULL);
+ HRESULT result = directInput->CreateDevice(it->guid, &m_device, NULL);
- if (result)
+ if (FAILED(result))
{
err() << "Failed to create DirectInput device: " << result << std::endl;
return false;
}
+ // Get vendor and product id of the device
+ DIPROPDWORD property;
+ std::memset(&property, 0, sizeof(property));
+ property.diph.dwSize = sizeof(property);
+ property.diph.dwHeaderSize = sizeof(property.diph);
+ property.diph.dwHow = DIPH_DEVICE;
+
+ if (SUCCEEDED(m_device->GetProperty(DIPROP_VIDPID, &property.diph)))
+ {
+ m_identification.productId = HIWORD(property.dwData);
+ m_identification.vendorId = LOWORD(property.dwData);
+
+ // Check if device is already blacklisted
+ if (m_identification.productId && m_identification.vendorId)
+ {
+ for (JoystickBlacklist::const_iterator iter = joystickBlacklist.begin(); iter != joystickBlacklist.end(); ++iter)
+ {
+ if ((m_identification.productId == iter->productId) &&
+ (m_identification.vendorId == iter->vendorId))
+ {
+ // Device is blacklisted
+ m_device->Release();
+ m_device = NULL;
+
+ return false;
+ }
+ }
+ }
+ }
+
+ // Get friendly product name of the device
+ DIPROPSTRING stringProperty;
+ std::memset(&stringProperty, 0, sizeof(stringProperty));
+ stringProperty.diph.dwSize = sizeof(stringProperty);
+ stringProperty.diph.dwHeaderSize = sizeof(stringProperty.diph);
+ stringProperty.diph.dwHow = DIPH_DEVICE;
+ stringProperty.diph.dwObj = 0;
+
+ if (SUCCEEDED(m_device->GetProperty(DIPROP_PRODUCTNAME, &stringProperty.diph)))
+ m_identification.name = stringProperty.wsz;
+
static bool formatInitialized = false;
static DIDATAFORMAT format;
@@ -524,59 +587,80 @@ bool JoystickImpl::openDInput(unsigned int index)
const DWORD povType = DIDFT_POV | DIDFT_OPTIONAL | DIDFT_ANYINSTANCE;
const DWORD buttonType = DIDFT_BUTTON | DIDFT_OPTIONAL | DIDFT_ANYINSTANCE;
- static DIOBJECTDATAFORMAT data[8 + 4 + sf::Joystick::ButtonCount];
-
- data[0].pguid = &guids::GUID_XAxis;
- data[0].dwOfs = DIJOFS_X;
-
- data[1].pguid = &guids::GUID_YAxis;
- data[1].dwOfs = DIJOFS_Y;
-
- data[2].pguid = &guids::GUID_ZAxis;
- data[2].dwOfs = DIJOFS_Z;
-
- data[3].pguid = &guids::GUID_RxAxis;
- data[3].dwOfs = DIJOFS_RX;
-
- data[4].pguid = &guids::GUID_RyAxis;
- data[4].dwOfs = DIJOFS_RY;
+ static DIOBJECTDATAFORMAT data[8 * 4 + 4 + sf::Joystick::ButtonCount];
- data[5].pguid = &guids::GUID_RzAxis;
- data[5].dwOfs = DIJOFS_RZ;
-
- data[6].pguid = &guids::GUID_Slider;
- data[6].dwOfs = DIJOFS_SLIDER(0);
-
- data[7].pguid = &guids::GUID_Slider;
- data[7].dwOfs = DIJOFS_SLIDER(1);
+ for (int i = 0; i < 4; ++i)
+ {
+ data[8 * i + 0].pguid = &guids::GUID_XAxis;
+ data[8 * i + 1].pguid = &guids::GUID_YAxis;
+ data[8 * i + 2].pguid = &guids::GUID_ZAxis;
+ data[8 * i + 3].pguid = &guids::GUID_RxAxis;
+ data[8 * i + 4].pguid = &guids::GUID_RyAxis;
+ data[8 * i + 5].pguid = &guids::GUID_RzAxis;
+ data[8 * i + 6].pguid = &guids::GUID_Slider;
+ data[8 * i + 7].pguid = &guids::GUID_Slider;
+ }
- for (int i = 0; i < 8; ++i)
+ data[ 0].dwOfs = DIJOFS_X;
+ data[ 1].dwOfs = DIJOFS_Y;
+ data[ 2].dwOfs = DIJOFS_Z;
+ data[ 3].dwOfs = DIJOFS_RX;
+ data[ 4].dwOfs = DIJOFS_RY;
+ data[ 5].dwOfs = DIJOFS_RZ;
+ data[ 6].dwOfs = DIJOFS_SLIDER(0);
+ data[ 7].dwOfs = DIJOFS_SLIDER(1);
+ data[ 8].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lVX);
+ data[ 9].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lVY);
+ data[10].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lVZ);
+ data[11].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lVRx);
+ data[12].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lVRy);
+ data[13].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lVRz);
+ data[14].dwOfs = FIELD_OFFSET(DIJOYSTATE2, rglVSlider[0]);
+ data[15].dwOfs = FIELD_OFFSET(DIJOYSTATE2, rglVSlider[1]);
+ data[16].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lAX);
+ data[17].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lAY);
+ data[18].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lAZ);
+ data[19].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lARx);
+ data[20].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lARy);
+ data[21].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lARz);
+ data[22].dwOfs = FIELD_OFFSET(DIJOYSTATE2, rglASlider[0]);
+ data[23].dwOfs = FIELD_OFFSET(DIJOYSTATE2, rglASlider[1]);
+ data[24].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lFX);
+ data[25].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lFY);
+ data[26].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lFZ);
+ data[27].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lFRx);
+ data[28].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lFRy);
+ data[29].dwOfs = FIELD_OFFSET(DIJOYSTATE2, lFRz);
+ data[30].dwOfs = FIELD_OFFSET(DIJOYSTATE2, rglFSlider[0]);
+ data[31].dwOfs = FIELD_OFFSET(DIJOYSTATE2, rglFSlider[1]);
+
+ for (int i = 0; i < 8 * 4; ++i)
{
data[i].dwType = axisType;
- data[i].dwFlags = DIDOI_ASPECTPOSITION;
+ data[i].dwFlags = 0;
}
for (int i = 0; i < 4; ++i)
{
- data[8 + i].pguid = &guids::GUID_POV;
- data[8 + i].dwOfs = static_cast<DWORD>(DIJOFS_POV(i));
- data[8 + i].dwType = povType;
- data[8 + i].dwFlags = 0;
+ data[8 * 4 + i].pguid = &guids::GUID_POV;
+ data[8 * 4 + i].dwOfs = static_cast<DWORD>(DIJOFS_POV(static_cast<unsigned int>(i)));
+ data[8 * 4 + i].dwType = povType;
+ data[8 * 4 + i].dwFlags = 0;
}
for (int i = 0; i < sf::Joystick::ButtonCount; ++i)
{
- data[8 + 4 + i].pguid = NULL;
- data[8 + 4 + i].dwOfs = static_cast<DWORD>(DIJOFS_BUTTON(i));
- data[8 + 4 + i].dwType = buttonType;
- data[8 + 4 + i].dwFlags = 0;
+ data[8 * 4 + 4 + i].pguid = NULL;
+ data[8 * 4 + 4 + i].dwOfs = static_cast<DWORD>(DIJOFS_BUTTON(i));
+ data[8 * 4 + 4 + i].dwType = buttonType;
+ data[8 * 4 + 4 + i].dwFlags = 0;
}
format.dwSize = sizeof(DIDATAFORMAT);
format.dwObjSize = sizeof(DIOBJECTDATAFORMAT);
format.dwFlags = DIDFT_ABSAXIS;
- format.dwDataSize = sizeof(DIJOYSTATE);
- format.dwNumObjs = 8 + 4 + sf::Joystick::ButtonCount;
+ format.dwDataSize = sizeof(DIJOYSTATE2);
+ format.dwNumObjs = 8 * 4 + 4 + sf::Joystick::ButtonCount;
format.rgodf = data;
formatInitialized = true;
@@ -585,7 +669,7 @@ bool JoystickImpl::openDInput(unsigned int index)
// Set device data format
result = m_device->SetDataFormat(&format);
- if (result)
+ if (FAILED(result))
{
err() << "Failed to set DirectInput device data format: " << result << std::endl;
@@ -598,7 +682,7 @@ bool JoystickImpl::openDInput(unsigned int index)
// Get device capabilities
result = m_device->GetCapabilities(&m_deviceCaps);
- if (result)
+ if (FAILED(result))
{
err() << "Failed to get DirectInput device capabilities: " << result << std::endl;
@@ -608,19 +692,12 @@ bool JoystickImpl::openDInput(unsigned int index)
return false;
}
- // Set axis mode to absolute
- DIPROPDWORD property;
- std::memset(&property, 0, sizeof(property));
- property.diph.dwSize = sizeof(property);
- property.diph.dwHeaderSize = sizeof(property.diph);
- property.diph.dwHow = DIPH_DEVICE;
- property.dwData = DIPROPAXISMODE_ABS;
-
- result = m_device->SetProperty(DIPROP_AXISMODE, &property.diph);
+ // Enumerate device objects (axes/povs/buttons)
+ result = m_device->EnumObjects(&JoystickImpl::deviceObjectEnumerationCallback, this, DIDFT_AXIS | DIDFT_BUTTON | DIDFT_POV);
- if (result)
+ if (FAILED(result))
{
- err() << "Failed to set DirectInput device axis mode: " << result << std::endl;
+ err() << "Failed to enumerate DirectInput device objects: " << result << std::endl;
m_device->Release();
m_device = NULL;
@@ -628,42 +705,116 @@ bool JoystickImpl::openDInput(unsigned int index)
return false;
}
- // Enumerate device objects (axes/povs/buttons)
- result = m_device->EnumObjects(&JoystickImpl::deviceObjectEnumerationCallback, this, DIDFT_AXIS | DIDFT_BUTTON | DIDFT_POV);
-
- if (result)
+ // Set device's axis mode to absolute if the device reports having at least one axis
+ for (int i = 0; i < Joystick::AxisCount; ++i)
{
- err() << "Failed to enumerate DirectInput device objects: " << result << std::endl;
+ if (m_axes[i] != -1)
+ {
+ std::memset(&property, 0, sizeof(property));
+ property.diph.dwSize = sizeof(property);
+ property.diph.dwHeaderSize = sizeof(property.diph);
+ property.diph.dwHow = DIPH_DEVICE;
+ property.diph.dwObj = 0;
- m_device->Release();
- m_device = NULL;
+ result = m_device->GetProperty(DIPROP_AXISMODE, &property.diph);
- return false;
- }
+ if (FAILED(result))
+ {
+ err() << "Failed to get DirectInput device axis mode for device \""
+ << m_identification.name.toAnsiString() << "\": " << result << std::endl;
- // Get friendly product name of the device
- DIPROPSTRING stringProperty;
- std::memset(&stringProperty, 0, sizeof(stringProperty));
- stringProperty.diph.dwSize = sizeof(stringProperty);
- stringProperty.diph.dwHeaderSize = sizeof(stringProperty.diph);
- stringProperty.diph.dwHow = DIPH_DEVICE;
- stringProperty.diph.dwObj = 0;
+ m_device->Release();
+ m_device = NULL;
- if (!m_device->GetProperty(DIPROP_PRODUCTNAME, &stringProperty.diph))
- {
- m_identification.name = stringProperty.wsz;
+ return false;
+ }
+
+ // If the axis mode is already set to absolute we don't need to set it again ourselves
+ if (property.dwData == DIPROPAXISMODE_ABS)
+ break;
+
+ std::memset(&property, 0, sizeof(property));
+ property.diph.dwSize = sizeof(property);
+ property.diph.dwHeaderSize = sizeof(property.diph);
+ property.diph.dwHow = DIPH_DEVICE;
+ property.dwData = DIPROPAXISMODE_ABS;
+
+ m_device->SetProperty(DIPROP_AXISMODE, &property.diph);
+
+ // Check if the axis mode has been set to absolute
+ std::memset(&property, 0, sizeof(property));
+ property.diph.dwSize = sizeof(property);
+ property.diph.dwHeaderSize = sizeof(property.diph);
+ property.diph.dwHow = DIPH_DEVICE;
+ property.diph.dwObj = 0;
+
+ result = m_device->GetProperty(DIPROP_AXISMODE, &property.diph);
+
+ if (FAILED(result))
+ {
+ err() << "Failed to verify DirectInput device axis mode for device \""
+ << m_identification.name.toAnsiString() << "\": " << result << std::endl;
+
+ m_device->Release();
+ m_device = NULL;
+
+ return false;
+ }
+
+ // If the axis mode hasn't been set to absolute fail here and blacklist the device
+ if (property.dwData != DIPROPAXISMODE_ABS)
+ {
+ if (m_identification.vendorId && m_identification.productId)
+ {
+ JoystickBlacklistEntry entry;
+
+ entry.vendorId = m_identification.vendorId;
+ entry.productId = m_identification.productId;
+
+ joystickBlacklist.push_back(entry);
+
+ // Pre-C++11 shrink_to_fit()
+ JoystickBlacklist(joystickBlacklist.begin(), joystickBlacklist.end()).swap(joystickBlacklist);
+ }
+
+ m_device->Release();
+ m_device = NULL;
+
+ return false;
+ }
+
+ break;
+ }
}
- // Get vendor and produce id of the device
+ // Try to enable buffering by setting the buffer size
std::memset(&property, 0, sizeof(property));
property.diph.dwSize = sizeof(property);
property.diph.dwHeaderSize = sizeof(property.diph);
property.diph.dwHow = DIPH_DEVICE;
+ property.dwData = directInputEventBufferSize;
+
+ result = m_device->SetProperty(DIPROP_BUFFERSIZE, &property.diph);
- if (!m_device->GetProperty(DIPROP_VIDPID, &property.diph))
+ if (result == DI_OK)
{
- m_identification.productId = HIWORD(property.dwData);
- m_identification.vendorId = LOWORD(property.dwData);
+ // Buffering supported
+ m_buffered = true;
+ }
+ else if (result == DI_POLLEDDEVICE)
+ {
+ // Only polling supported
+ m_buffered = false;
+ }
+ else
+ {
+ err() << "Failed to set DirectInput device buffer size for device \""
+ << m_identification.name.toAnsiString() << "\": " << result << std::endl;
+
+ m_device->Release();
+ m_device = NULL;
+
+ return false;
}
return true;
@@ -709,7 +860,100 @@ JoystickCaps JoystickImpl::getCapabilitiesDInput() const
////////////////////////////////////////////////////////////
-JoystickState JoystickImpl::updateDInput()
+JoystickState JoystickImpl::updateDInputBuffered()
+{
+ // If we don't make it to the end of this function, mark the device as disconnected
+ m_state.connected = false;
+
+ if (!m_device)
+ return m_state;
+
+ DIDEVICEOBJECTDATA events[directInputEventBufferSize];
+ DWORD eventCount = directInputEventBufferSize;
+
+ // Try to get the device data
+ HRESULT result = m_device->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), events, &eventCount, 0);
+
+ // If we have not acquired or have lost the device, attempt to (re-)acquire it and get the device data again
+ if ((result == DIERR_NOTACQUIRED) || (result == DIERR_INPUTLOST))
+ {
+ m_device->Acquire();
+ result = m_device->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), events, &eventCount, 0);
+ }
+
+ // If we still can't get the device data, assume it has been disconnected
+ if ((result == DIERR_NOTACQUIRED) || (result == DIERR_INPUTLOST))
+ {
+ m_device->Release();
+ m_device = NULL;
+
+ return m_state;
+ }
+
+ if (FAILED(result))
+ {
+ err() << "Failed to get DirectInput device data: " << result << std::endl;
+
+ return m_state;
+ }
+
+ // Iterate through all buffered events
+ for (DWORD i = 0; i < eventCount; ++i)
+ {
+ bool eventHandled = false;
+
+ // Get the current state of each axis
+ for (int j = 0; j < Joystick::AxisCount; ++j)
+ {
+ if (m_axes[j] == static_cast<int>(events[i].dwOfs))
+ {
+ if ((j == Joystick::PovX) || (j == Joystick::PovY))
+ {
+ unsigned short value = LOWORD(events[i].dwData);
+
+ if (value != 0xFFFF)
+ {
+ float angle = (static_cast<float>(value)) * 3.141592654f / DI_DEGREES / 180.f;
+
+ m_state.axes[Joystick::PovX] = std::sin(angle) * 100.f;
+ m_state.axes[Joystick::PovY] = std::cos(angle) * 100.f;
+ }
+ else
+ {
+ m_state.axes[Joystick::PovX] = 0.f;
+ m_state.axes[Joystick::PovY] = 0.f;
+ }
+ }
+ else
+ {
+ m_state.axes[j] = (static_cast<float>(static_cast<short>(events[i].dwData)) + 0.5f) * 100.f / 32767.5f;
+ }
+
+ eventHandled = true;
+
+ break;
+ }
+ }
+
+ if (eventHandled)
+ continue;
+
+ // Get the current state of each button
+ for (int j = 0; j < Joystick::ButtonCount; ++j)
+ {
+ if (m_buttons[j] == static_cast<int>(events[i].dwOfs))
+ m_state.buttons[j] = (events[i].dwData != 0);
+ }
+ }
+
+ m_state.connected = true;
+
+ return m_state;
+}
+
+
+////////////////////////////////////////////////////////////
+JoystickState JoystickImpl::updateDInputPolled()
{
JoystickState state;
@@ -718,7 +962,7 @@ JoystickState JoystickImpl::updateDInput()
// Poll the device
m_device->Poll();
- DIJOYSTATE joystate;
+ DIJOYSTATE2 joystate;
// Try to get the device state
HRESULT result = m_device->GetDeviceState(sizeof(joystate), &joystate);
@@ -740,7 +984,7 @@ JoystickState JoystickImpl::updateDInput()
return state;
}
- if (result)
+ if (FAILED(result))
{
err() << "Failed to get DirectInput device state: " << result << std::endl;
@@ -752,22 +996,7 @@ JoystickState JoystickImpl::updateDInput()
{
if (m_axes[i] != -1)
{
- if (i == Joystick::PovX)
- {
- unsigned short value = LOWORD(*reinterpret_cast<const DWORD*>(reinterpret_cast<const char*>(&joystate) + m_axes[i]));
-
- if (value != 0xFFFF)
- {
- float angle = (static_cast<float>(value)) * 3.141592654f / DI_DEGREES / 180.f;
-
- state.axes[i] = std::sin(angle) * 100.f;
- }
- else
- {
- state.axes[i] = 0;
- }
- }
- else if (i == Joystick::PovY)
+ if ((i == Joystick::PovX) || (i == Joystick::PovY))
{
unsigned short value = LOWORD(*reinterpret_cast<const DWORD*>(reinterpret_cast<const char*>(&joystate) + m_axes[i]));
@@ -775,11 +1004,13 @@ JoystickState JoystickImpl::updateDInput()
{
float angle = (static_cast<float>(value)) * 3.141592654f / DI_DEGREES / 180.f;
- state.axes[i] = std::cos(angle) * 100.f;
+ state.axes[Joystick::PovX] = std::sin(angle) * 100.f;
+ state.axes[Joystick::PovY] = std::cos(angle) * 100.f;
}
else
{
- state.axes[i] = 0.f;
+ state.axes[Joystick::PovX] = 0.f;
+ state.axes[Joystick::PovY] = 0.f;
}
}
else
@@ -878,7 +1109,7 @@ BOOL CALLBACK JoystickImpl::deviceObjectEnumerationCallback(const DIDEVICEOBJECT
HRESULT result = joystick.m_device->SetProperty(DIPROP_RANGE, &propertyRange.diph);
- if (result)
+ if (result != DI_OK)
err() << "Failed to set DirectInput device axis property range: " << result << std::endl;
return DIENUM_CONTINUE;
diff --git a/src/SFML/Window/Win32/JoystickImpl.hpp b/src/SFML/Window/Win32/JoystickImpl.hpp
index 8affc27..268657d 100644
--- a/src/SFML/Window/Win32/JoystickImpl.hpp
+++ b/src/SFML/Window/Win32/JoystickImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -39,7 +39,6 @@
#define DIRECTINPUT_VERSION 0x0800
#include <SFML/Window/Joystick.hpp>
#include <SFML/Window/JoystickImpl.hpp>
-#include <SFML/System/String.hpp>
#include <windows.h>
#include <mmsystem.h>
#include <dinput.h>
@@ -186,12 +185,20 @@ public:
JoystickCaps getCapabilitiesDInput() const;
////////////////////////////////////////////////////////////
- /// \brief Update the joystick and get its new state (DInput)
+ /// \brief Update the joystick and get its new state (DInput, Buffered)
///
/// \return Joystick state
///
////////////////////////////////////////////////////////////
- JoystickState updateDInput();
+ JoystickState updateDInputBuffered();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Update the joystick and get its new state (DInput, Polled)
+ ///
+ /// \return Joystick state
+ ///
+ ////////////////////////////////////////////////////////////
+ JoystickState updateDInputPolled();
private:
@@ -220,13 +227,15 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- unsigned int m_index; ///< Index of the joystick
- JOYCAPS m_caps; ///< Joystick capabilities
- IDirectInputDevice8W* m_device; ///< DirectInput 8.x device
- DIDEVCAPS m_deviceCaps; ///< DirectInput device capabilities
- int m_axes[Joystick::AxisCount]; ///< Offsets to the bytes containing the axes states, -1 if not available
- int m_buttons[Joystick::ButtonCount]; ///< Offsets to the bytes containing the button states, -1 if not available
- Joystick::Identification m_identification; ///< Joystick identification
+ unsigned int m_index; //!< Index of the joystick
+ JOYCAPS m_caps; //!< Joystick capabilities
+ IDirectInputDevice8W* m_device; //!< DirectInput 8.x device
+ DIDEVCAPS m_deviceCaps; //!< DirectInput device capabilities
+ int m_axes[Joystick::AxisCount]; //!< Offsets to the bytes containing the axes states, -1 if not available
+ int m_buttons[Joystick::ButtonCount]; //!< Offsets to the bytes containing the button states, -1 if not available
+ Joystick::Identification m_identification; //!< Joystick identification
+ JoystickState m_state; //!< Buffered joystick state
+ bool m_buffered; //!< true if the device uses buffering, false if the device uses polling
};
} // namespace priv
diff --git a/src/SFML/Window/Win32/SensorImpl.cpp b/src/SFML/Window/Win32/SensorImpl.cpp
index 3496265..7f53f8d 100644
--- a/src/SFML/Window/Win32/SensorImpl.cpp
+++ b/src/SFML/Window/Win32/SensorImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Win32/SensorImpl.hpp b/src/SFML/Window/Win32/SensorImpl.hpp
index e8b618e..029a3f2 100644
--- a/src/SFML/Window/Win32/SensorImpl.hpp
+++ b/src/SFML/Window/Win32/SensorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/Win32/VideoModeImpl.cpp b/src/SFML/Window/Win32/VideoModeImpl.cpp
index 71ad671..89b7296 100644
--- a/src/SFML/Window/Win32/VideoModeImpl.cpp
+++ b/src/SFML/Window/Win32/VideoModeImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -43,7 +43,7 @@ std::vector<VideoMode> VideoModeImpl::getFullscreenModes()
DEVMODE win32Mode;
win32Mode.dmSize = sizeof(win32Mode);
win32Mode.dmDriverExtra = 0;
- for (int count = 0; EnumDisplaySettings(NULL, count, &win32Mode); ++count)
+ for (int count = 0; EnumDisplaySettings(NULL, static_cast<DWORD>(count), &win32Mode); ++count)
{
// Convert to sf::VideoMode
VideoMode mode(win32Mode.dmPelsWidth, win32Mode.dmPelsHeight, win32Mode.dmBitsPerPel);
diff --git a/src/SFML/Window/Win32/VulkanImplWin32.cpp b/src/SFML/Window/Win32/VulkanImplWin32.cpp
new file mode 100644
index 0000000..ec12539
--- /dev/null
+++ b/src/SFML/Window/Win32/VulkanImplWin32.cpp
@@ -0,0 +1,221 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Win32/VulkanImplWin32.hpp>
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+#define VK_USE_PLATFORM_WIN32_KHR
+#define VK_NO_PROTOTYPES
+#include <vulkan/vulkan.h>
+#include <string>
+#include <map>
+#include <cstring>
+
+
+namespace
+{
+ struct VulkanLibraryWrapper
+ {
+ VulkanLibraryWrapper() :
+ library(NULL)
+ {
+ }
+
+ ~VulkanLibraryWrapper()
+ {
+ if (library)
+ FreeLibrary(library);
+ }
+
+ // Try to load the library and all the required entry points
+ bool loadLibrary()
+ {
+ if (library)
+ return true;
+
+ library = LoadLibraryA("vulkan-1.dll");
+
+ if (!library)
+ return false;
+
+ if (!loadEntryPoint(vkGetInstanceProcAddr, "vkGetInstanceProcAddr"))
+ {
+ FreeLibrary(library);
+ library = NULL;
+ return false;
+ }
+
+ if (!loadEntryPoint(vkEnumerateInstanceLayerProperties, "vkEnumerateInstanceLayerProperties"))
+ {
+ FreeLibrary(library);
+ library = NULL;
+ return false;
+ }
+
+ if (!loadEntryPoint(vkEnumerateInstanceExtensionProperties, "vkEnumerateInstanceExtensionProperties"))
+ {
+ FreeLibrary(library);
+ library = NULL;
+ return false;
+ }
+
+ return true;
+ }
+
+ template<typename T>
+ bool loadEntryPoint(T& entryPoint, const char* name)
+ {
+ entryPoint = reinterpret_cast<T>(reinterpret_cast<void*>(GetProcAddress(library, name)));
+
+ return (entryPoint != NULL);
+ }
+
+ HMODULE library;
+
+ PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
+ PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
+ PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
+ };
+
+ VulkanLibraryWrapper wrapper;
+}
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+bool VulkanImplWin32::isAvailable(bool requireGraphics)
+{
+ static bool checked = false;
+ static bool computeAvailable = false;
+ static bool graphicsAvailable = false;
+
+ if (!checked)
+ {
+ checked = true;
+
+ // Check if the library is available
+ computeAvailable = wrapper.loadLibrary();
+
+ // To check for instance extensions we don't need to differentiate between graphics and compute
+ graphicsAvailable = computeAvailable;
+
+ if (graphicsAvailable)
+ {
+ // Retrieve the available instance extensions
+ std::vector<VkExtensionProperties> extensionProperties;
+
+ uint32_t extensionCount = 0;
+
+ wrapper.vkEnumerateInstanceExtensionProperties(0, &extensionCount, NULL);
+
+ extensionProperties.resize(extensionCount);
+
+ wrapper.vkEnumerateInstanceExtensionProperties(0, &extensionCount, &extensionProperties[0]);
+
+ // Check if the necessary extensions are available
+ bool has_VK_KHR_surface = false;
+ bool has_VK_KHR_platform_surface = false;
+
+ for (std::vector<VkExtensionProperties>::const_iterator iter = extensionProperties.begin(); iter != extensionProperties.end(); ++iter)
+ {
+ if (!std::strcmp(iter->extensionName, VK_KHR_SURFACE_EXTENSION_NAME))
+ {
+ has_VK_KHR_surface = true;
+ }
+ else if (!std::strcmp(iter->extensionName, VK_KHR_WIN32_SURFACE_EXTENSION_NAME))
+ {
+ has_VK_KHR_platform_surface = true;
+ }
+ }
+
+ if (!has_VK_KHR_surface || !has_VK_KHR_platform_surface)
+ graphicsAvailable = false;
+ }
+ }
+
+ if (requireGraphics)
+ return graphicsAvailable;
+
+ return computeAvailable;
+}
+
+
+////////////////////////////////////////////////////////////
+VulkanFunctionPointer VulkanImplWin32::getFunction(const char* name)
+{
+ if (!isAvailable(false))
+ return 0;
+
+ return reinterpret_cast<VulkanFunctionPointer>(GetProcAddress(wrapper.library, name));
+}
+
+
+////////////////////////////////////////////////////////////
+const std::vector<const char*>& VulkanImplWin32::getGraphicsRequiredInstanceExtensions()
+{
+ static std::vector<const char*> extensions;
+
+ if (extensions.empty())
+ {
+ extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
+ extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
+ }
+
+ return extensions;
+}
+
+
+////////////////////////////////////////////////////////////
+bool VulkanImplWin32::createVulkanSurface(const VkInstance& instance, WindowHandle windowHandle, VkSurfaceKHR& surface, const VkAllocationCallbacks* allocator)
+{
+ if (!isAvailable())
+ return false;
+
+ // Make a copy of the instance handle since we get it passed as a reference
+ VkInstance inst = instance;
+
+ PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR = reinterpret_cast<PFN_vkCreateWin32SurfaceKHR>(wrapper.vkGetInstanceProcAddr(inst, "vkCreateWin32SurfaceKHR"));
+
+ if (!vkCreateWin32SurfaceKHR)
+ return false;
+
+ VkWin32SurfaceCreateInfoKHR surfaceCreateInfo = VkWin32SurfaceCreateInfoKHR();
+ surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
+ surfaceCreateInfo.hinstance = GetModuleHandleA(NULL);
+ surfaceCreateInfo.hwnd = windowHandle;
+
+ return (vkCreateWin32SurfaceKHR(instance, &surfaceCreateInfo, allocator, &surface) == VK_SUCCESS);
+}
+
+} // namespace priv
+
+} // namespace sf
diff --git a/src/SFML/Window/Win32/VulkanImplWin32.hpp b/src/SFML/Window/Win32/VulkanImplWin32.hpp
new file mode 100644
index 0000000..661ce06
--- /dev/null
+++ b/src/SFML/Window/Win32/VulkanImplWin32.hpp
@@ -0,0 +1,103 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_VULKANIMPLWIN32_HPP
+#define SFML_VULKANIMPLWIN32_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/Vulkan.hpp>
+#include <SFML/Window/WindowHandle.hpp>
+#include <vector>
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+/// \brief Windows implementation of Vulkan
+///
+////////////////////////////////////////////////////////////
+class VulkanImplWin32
+{
+public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Tell whether or not the system supports Vulkan
+ ///
+ /// This function should always be called before using
+ /// the Vulkan features. If it returns false, then
+ /// any attempt to use Vulkan will fail.
+ ///
+ /// If only compute is required, set \a requireGraphics
+ /// to false to skip checking for the extensions necessary
+ /// for graphics rendering.
+ ///
+ /// \param requireGraphics
+ ///
+ /// \return True if Vulkan is supported, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool isAvailable(bool requireGraphics = true);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the address of a Vulkan function
+ ///
+ /// \param name Name of the function to get the address of
+ ///
+ /// \return Address of the Vulkan function, 0 on failure
+ ///
+ ////////////////////////////////////////////////////////////
+ static VulkanFunctionPointer getFunction(const char* name);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get Vulkan instance extensions required for graphics
+ ///
+ /// \return Vulkan instance extensions required for graphics
+ ///
+ ////////////////////////////////////////////////////////////
+ static const std::vector<const char*>& getGraphicsRequiredInstanceExtensions();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a Vulkan rendering surface
+ ///
+ /// \param instance Vulkan instance
+ /// \param windowHandle Handle to the window to create the surface for
+ /// \param surface Created surface
+ /// \param allocator Allocator to use
+ ///
+ /// \return True if surface creation was successful, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ static bool createVulkanSurface(const VkInstance& instance, WindowHandle windowHandle, VkSurfaceKHR& surface, const VkAllocationCallbacks* allocator);
+};
+
+} // namespace priv
+
+} // namespace sf
+
+
+#endif // SFML_VULKANIMPLWIN32_HPP
diff --git a/src/SFML/Window/Win32/WglContext.cpp b/src/SFML/Window/Win32/WglContext.cpp
index fd9f89e..4931555 100644
--- a/src/SFML/Window/Win32/WglContext.cpp
+++ b/src/SFML/Window/Win32/WglContext.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -26,7 +26,6 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Window/WindowImpl.hpp> // included first to avoid a warning about macro redefinition
-#include <SFML/OpenGL.hpp> // included second to avoid an error in WglExtensions.hpp
#include <SFML/Window/Win32/WglContext.hpp>
#include <SFML/System/ThreadLocalPtr.hpp>
#include <SFML/System/Lock.hpp>
@@ -35,12 +34,50 @@
#include <sstream>
#include <vector>
+// We check for this definition in order to avoid multiple definitions of GLAD
+// entities during unity builds of SFML.
+#ifndef SF_GLAD_WGL_IMPLEMENTATION_INCLUDED
+#define SF_GLAD_WGL_IMPLEMENTATION_INCLUDED
+#define SF_GLAD_WGL_IMPLEMENTATION
+#include <glad/wgl.h>
+#endif
namespace
{
- // Some drivers are bugged and don't track the current HDC/HGLRC properly
- // In order to deactivate successfully, we need to track it ourselves as well
- sf::ThreadLocalPtr<sf::priv::WglContext> currentContext(NULL);
+ namespace WglContextImpl
+ {
+ // Some drivers are bugged and don't track the current HDC/HGLRC properly
+ // In order to deactivate successfully, we need to track it ourselves as well
+ sf::ThreadLocalPtr<sf::priv::WglContext> currentContext(NULL);
+
+
+ ////////////////////////////////////////////////////////////
+ void ensureInit()
+ {
+ static bool initialized = false;
+ if (!initialized)
+ {
+ initialized = true;
+
+ gladLoadWGL(NULL, sf::priv::WglContext::getFunction);
+ }
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ void ensureExtensionsInit(HDC deviceContext)
+ {
+ static bool initialized = false;
+ if (!initialized)
+ {
+ initialized = true;
+
+ // We don't check the return value since the extension
+ // flags are cleared even if loading fails
+ gladLoadWGL(deviceContext, sf::priv::WglContext::getFunction);
+ }
+ }
+ }
}
@@ -49,30 +86,19 @@ namespace sf
namespace priv
{
////////////////////////////////////////////////////////////
-void ensureExtensionsInit(HDC deviceContext)
+String getErrorString(DWORD errorCode)
{
- static bool initialized = false;
- if (!initialized)
+ PTCHAR buffer;
+ if (FormatMessage(FORMAT_MESSAGE_MAX_WIDTH_MASK | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorCode, 0, reinterpret_cast<LPTSTR>(&buffer), 256, NULL) != 0)
{
- initialized = true;
-
- // We don't check the return value since the extension
- // flags are cleared even if loading fails
- sfwgl_LoadFunctions(deviceContext);
+ String errMsg(buffer);
+ LocalFree(buffer);
+ return errMsg;
}
-}
-
-////////////////////////////////////////////////////////////
-String getErrorString(DWORD errorCode)
-{
- std::basic_ostringstream<TCHAR, std::char_traits<TCHAR> > ss;
- TCHAR errBuff[256];
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorCode, 0, errBuff, sizeof(errBuff), NULL);
- ss << errBuff;
- String errMsg(ss.str());
-
- return errMsg;
+ std::ostringstream ss;
+ ss << "Error " << errorCode;
+ return String(ss.str());
}
@@ -84,20 +110,18 @@ m_deviceContext(NULL),
m_context (NULL),
m_ownsWindow (false)
{
+ WglContextImpl::ensureInit();
+
+ // TODO: Delegate to the other constructor in C++11
+
// Save the creation settings
m_settings = ContextSettings();
- // Make sure that extensions are initialized if this is not the shared context
- // The shared context is the context used to initialize the extensions
- if (shared && shared->m_deviceContext)
- ensureExtensionsInit(shared->m_deviceContext);
-
// Create the rendering surface (window or pbuffer if supported)
createSurface(shared, 1, 1, VideoMode::getDesktopMode().bitsPerPixel);
// Create the context
- if (m_deviceContext)
- createContext(shared);
+ createContext(shared);
}
@@ -109,20 +133,16 @@ m_deviceContext(NULL),
m_context (NULL),
m_ownsWindow (false)
{
+ WglContextImpl::ensureInit();
+
// Save the creation settings
m_settings = settings;
- // Make sure that extensions are initialized if this is not the shared context
- // The shared context is the context used to initialize the extensions
- if (shared && shared->m_deviceContext)
- ensureExtensionsInit(shared->m_deviceContext);
-
// Create the rendering surface from the owner window
createSurface(owner->getSystemHandle(), bitsPerPixel);
// Create the context
- if (m_deviceContext)
- createContext(shared);
+ createContext(shared);
}
@@ -134,20 +154,16 @@ m_deviceContext(NULL),
m_context (NULL),
m_ownsWindow (false)
{
+ WglContextImpl::ensureInit();
+
// Save the creation settings
m_settings = settings;
- // Make sure that extensions are initialized if this is not the shared context
- // The shared context is the context used to initialize the extensions
- if (shared && shared->m_deviceContext)
- ensureExtensionsInit(shared->m_deviceContext);
-
// Create the rendering surface (window or pbuffer if supported)
createSurface(shared, width, height, VideoMode::getDesktopMode().bitsPerPixel);
// Create the context
- if (m_deviceContext)
- createContext(shared);
+ createContext(shared);
}
@@ -160,10 +176,10 @@ WglContext::~WglContext()
// Destroy the OpenGL context
if (m_context)
{
- if (currentContext == this)
+ if (WglContextImpl::currentContext == this)
{
if (wglMakeCurrent(m_deviceContext, NULL) == TRUE)
- currentContext = NULL;
+ WglContextImpl::currentContext = NULL;
}
wglDeleteContext(m_context);
@@ -227,7 +243,7 @@ bool WglContext::makeCurrent(bool current)
return false;
}
- currentContext = (current ? this : NULL);
+ WglContextImpl::currentContext = (current ? this : NULL);
return true;
}
@@ -245,9 +261,9 @@ void WglContext::display()
void WglContext::setVerticalSyncEnabled(bool enabled)
{
// Make sure that extensions are initialized
- ensureExtensionsInit(m_deviceContext);
+ WglContextImpl::ensureExtensionsInit(m_deviceContext);
- if (sfwgl_ext_EXT_swap_control == sfwgl_LOAD_SUCCEEDED)
+ if (SF_GLAD_WGL_EXT_swap_control)
{
if (wglSwapIntervalEXT(enabled ? 1 : 0) == FALSE)
err() << "Setting vertical sync failed: " << getErrorString(GetLastError()).toAnsiString() << std::endl;
@@ -270,9 +286,11 @@ void WglContext::setVerticalSyncEnabled(bool enabled)
////////////////////////////////////////////////////////////
int WglContext::selectBestPixelFormat(HDC deviceContext, unsigned int bitsPerPixel, const ContextSettings& settings, bool pbuffer)
{
+ WglContextImpl::ensureInit();
+
// Let's find a suitable pixel format -- first try with wglChoosePixelFormatARB
int bestFormat = 0;
- if (sfwgl_ext_ARB_pixel_format == sfwgl_LOAD_SUCCEEDED)
+ if (SF_GLAD_WGL_ARB_pixel_format)
{
// Define the basic attributes we want for our window
int intAttributes[] =
@@ -286,7 +304,7 @@ int WglContext::selectBestPixelFormat(HDC deviceContext, unsigned int bitsPerPix
// Let's check how many formats are supporting our requirements
int formats[512];
- UINT nbFormats;
+ UINT nbFormats = 0; // We must initialize to 0 otherwise broken drivers might fill with garbage in the following call
bool isValid = wglChoosePixelFormatARB(deviceContext, intAttributes, NULL, 512, formats, &nbFormats) != FALSE;
if (!isValid)
@@ -318,7 +336,7 @@ int WglContext::selectBestPixelFormat(HDC deviceContext, unsigned int bitsPerPix
}
int sampleValues[2] = {0, 0};
- if (sfwgl_ext_ARB_multisample == sfwgl_LOAD_SUCCEEDED)
+ if (SF_GLAD_WGL_ARB_multisample)
{
const int sampleAttributes[] =
{
@@ -334,7 +352,7 @@ int WglContext::selectBestPixelFormat(HDC deviceContext, unsigned int bitsPerPix
}
int sRgbCapableValue = 0;
- if ((sfwgl_ext_ARB_framebuffer_sRGB == sfwgl_LOAD_SUCCEEDED) || (sfwgl_ext_EXT_framebuffer_sRGB == sfwgl_LOAD_SUCCEEDED))
+ if (SF_GLAD_WGL_ARB_framebuffer_sRGB || SF_GLAD_WGL_EXT_framebuffer_sRGB)
{
const int sRgbCapableAttribute = WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB;
@@ -455,15 +473,15 @@ void WglContext::updateSettingsFromPixelFormat()
return;
}
- if (sfwgl_ext_ARB_pixel_format == sfwgl_LOAD_SUCCEEDED)
+ if (SF_GLAD_WGL_ARB_pixel_format)
{
const int attributes[] = {WGL_DEPTH_BITS_ARB, WGL_STENCIL_BITS_ARB};
int values[2];
if (wglGetPixelFormatAttribivARB(m_deviceContext, format, PFD_MAIN_PLANE, 2, attributes, values) == TRUE)
{
- m_settings.depthBits = values[0];
- m_settings.stencilBits = values[1];
+ m_settings.depthBits = static_cast<unsigned int>(values[0]);
+ m_settings.stencilBits = static_cast<unsigned int>(values[1]);
}
else
{
@@ -472,14 +490,14 @@ void WglContext::updateSettingsFromPixelFormat()
m_settings.stencilBits = actualFormat.cStencilBits;
}
- if (sfwgl_ext_ARB_multisample == sfwgl_LOAD_SUCCEEDED)
+ if (SF_GLAD_WGL_ARB_multisample)
{
const int sampleAttributes[] = {WGL_SAMPLE_BUFFERS_ARB, WGL_SAMPLES_ARB};
int sampleValues[2];
if (wglGetPixelFormatAttribivARB(m_deviceContext, format, PFD_MAIN_PLANE, 2, sampleAttributes, sampleValues) == TRUE)
{
- m_settings.antialiasingLevel = sampleValues[0] ? sampleValues[1] : 0;
+ m_settings.antialiasingLevel = static_cast<unsigned int>(sampleValues[0] ? sampleValues[1] : 0);
}
else
{
@@ -492,7 +510,7 @@ void WglContext::updateSettingsFromPixelFormat()
m_settings.antialiasingLevel = 0;
}
- if ((sfwgl_ext_ARB_framebuffer_sRGB == sfwgl_LOAD_SUCCEEDED) || (sfwgl_ext_EXT_framebuffer_sRGB == sfwgl_LOAD_SUCCEEDED))
+ if (SF_GLAD_WGL_ARB_framebuffer_sRGB || SF_GLAD_WGL_EXT_framebuffer_sRGB)
{
const int sRgbCapableAttribute = WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB;
int sRgbCapableValue = 0;
@@ -525,7 +543,7 @@ void WglContext::updateSettingsFromPixelFormat()
void WglContext::createSurface(WglContext* shared, unsigned int width, unsigned int height, unsigned int bitsPerPixel)
{
// Check if the shared context already exists and pbuffers are supported
- if (shared && shared->m_deviceContext && (sfwgl_ext_ARB_pbuffer == sfwgl_LOAD_SUCCEEDED))
+ if (shared && shared->m_deviceContext && SF_GLAD_WGL_ARB_pbuffer)
{
int bestFormat = selectBestPixelFormat(shared->m_deviceContext, bitsPerPixel, m_settings, true);
@@ -533,7 +551,7 @@ void WglContext::createSurface(WglContext* shared, unsigned int width, unsigned
{
int attributes[] = {0, 0};
- m_pbuffer = wglCreatePbufferARB(shared->m_deviceContext, bestFormat, width, height, attributes);
+ m_pbuffer = wglCreatePbufferARB(shared->m_deviceContext, bestFormat, static_cast<int>(width), static_cast<int>(height), attributes);
if (m_pbuffer)
{
@@ -562,7 +580,7 @@ void WglContext::createSurface(WglContext* shared, unsigned int width, unsigned
// with other contexts and thus wglShareLists would always fail
// Create the hidden window
- m_window = CreateWindowA("STATIC", "", WS_POPUP | WS_DISABLED, 0, 0, width, height, NULL, NULL, GetModuleHandle(NULL), NULL);
+ m_window = CreateWindowA("STATIC", "", WS_POPUP | WS_DISABLED, 0, 0, static_cast<int>(width), static_cast<int>(height), NULL, NULL, GetModuleHandle(NULL), NULL);
ShowWindow(m_window, SW_HIDE);
m_deviceContext = GetDC(m_window);
@@ -594,6 +612,10 @@ void WglContext::createSurface(HWND window, unsigned int bitsPerPixel)
////////////////////////////////////////////////////////////
void WglContext::createContext(WglContext* shared)
{
+ // We can't create an OpenGL context if we don't have a DC
+ if (!m_deviceContext)
+ return;
+
// Get a working copy of the context settings
ContextSettings settings = m_settings;
@@ -603,7 +625,7 @@ void WglContext::createContext(WglContext* shared)
// Create the OpenGL context -- first try using wglCreateContextAttribsARB
while (!m_context && m_settings.majorVersion)
{
- if (sfwgl_ext_ARB_create_context == sfwgl_LOAD_SUCCEEDED)
+ if (SF_GLAD_WGL_ARB_create_context)
{
std::vector<int> attributes;
@@ -611,13 +633,13 @@ void WglContext::createContext(WglContext* shared)
if ((m_settings.majorVersion > 1) || ((m_settings.majorVersion == 1) && (m_settings.minorVersion > 1)))
{
attributes.push_back(WGL_CONTEXT_MAJOR_VERSION_ARB);
- attributes.push_back(m_settings.majorVersion);
+ attributes.push_back(static_cast<int>(m_settings.majorVersion));
attributes.push_back(WGL_CONTEXT_MINOR_VERSION_ARB);
- attributes.push_back(m_settings.minorVersion);
+ attributes.push_back(static_cast<int>(m_settings.minorVersion));
}
// Check if setting the profile is supported
- if (sfwgl_ext_ARB_create_context_profile == sfwgl_LOAD_SUCCEEDED)
+ if (SF_GLAD_WGL_ARB_create_context_profile)
{
int profile = (m_settings.attributeFlags & ContextSettings::Core) ? WGL_CONTEXT_CORE_PROFILE_BIT_ARB : WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
int debug = (m_settings.attributeFlags & ContextSettings::Debug) ? WGL_CONTEXT_DEBUG_BIT_ARB : 0;
@@ -645,7 +667,7 @@ void WglContext::createContext(WglContext* shared)
static Mutex mutex;
Lock lock(mutex);
- if (currentContext == shared)
+ if (WglContextImpl::currentContext == shared)
{
if (wglMakeCurrent(shared->m_deviceContext, NULL) == FALSE)
{
@@ -653,7 +675,7 @@ void WglContext::createContext(WglContext* shared)
return;
}
- currentContext = NULL;
+ WglContextImpl::currentContext = NULL;
}
}
@@ -715,7 +737,7 @@ void WglContext::createContext(WglContext* shared)
static Mutex mutex;
Lock lock(mutex);
- if (currentContext == shared)
+ if (WglContextImpl::currentContext == shared)
{
if (wglMakeCurrent(shared->m_deviceContext, NULL) == FALSE)
{
@@ -723,13 +745,22 @@ void WglContext::createContext(WglContext* shared)
return;
}
- currentContext = NULL;
+ WglContextImpl::currentContext = NULL;
}
if (wglShareLists(sharedContext, m_context) == FALSE)
err() << "Failed to share the OpenGL context: " << getErrorString(GetLastError()).toAnsiString() << std::endl;
}
}
+
+ // If we are the shared context, initialize extensions now
+ // This enables us to re-create the shared context using extensions if we need to
+ if (!shared && m_context)
+ {
+ makeCurrent(true);
+ WglContextImpl::ensureExtensionsInit(m_deviceContext);
+ makeCurrent(false);
+ }
}
} // namespace priv
diff --git a/src/SFML/Window/Win32/WglContext.hpp b/src/SFML/Window/Win32/WglContext.hpp
index d692605..56e0a78 100644
--- a/src/SFML/Window/Win32/WglContext.hpp
+++ b/src/SFML/Window/Win32/WglContext.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -29,7 +29,7 @@
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Window/GlContext.hpp>
-#include <SFML/Window/Win32/WglExtensions.hpp>
+#include <glad/wgl.h>
namespace sf
@@ -179,11 +179,11 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- HWND m_window; ///< Window to which the context is attached
- HPBUFFERARB m_pbuffer; ///< Handle to a pbuffer if one was created
- HDC m_deviceContext; ///< Device context associated to the context
- HGLRC m_context; ///< OpenGL context
- bool m_ownsWindow; ///< Do we own the target window?
+ HWND m_window; //!< Window to which the context is attached
+ HPBUFFERARB m_pbuffer; //!< Handle to a pbuffer if one was created
+ HDC m_deviceContext; //!< Device context associated to the context
+ HGLRC m_context; //!< OpenGL context
+ bool m_ownsWindow; //!< Do we own the target window?
};
} // namespace priv
diff --git a/src/SFML/Window/Win32/WglExtensions.cpp b/src/SFML/Window/Win32/WglExtensions.cpp
deleted file mode 100644
index b96271b..0000000
--- a/src/SFML/Window/Win32/WglExtensions.cpp
+++ /dev/null
@@ -1,223 +0,0 @@
-////////////////////////////////////////////////////////////
-//
-// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
-//
-// This software is provided 'as-is', without any express or implied warranty.
-// In no event will the authors be held liable for any damages arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it freely,
-// subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented;
-// you must not claim that you wrote the original software.
-// If you use this software in a product, an acknowledgment
-// in the product documentation would be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such,
-// and must not be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source distribution.
-//
-////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////
-// Headers
-////////////////////////////////////////////////////////////
-#include <SFML/Window/Win32/WglExtensions.hpp>
-#include <SFML/Window/Context.hpp>
-#include <cstdlib>
-#include <cstring>
-#include <cstddef>
-#include <string>
-
-static sf::GlFunctionPointer IntGetProcAddress(const char* name)
-{
- return sf::Context::getFunction(name);
-}
-
-int sfwgl_ext_EXT_swap_control = sfwgl_LOAD_FAILED;
-int sfwgl_ext_EXT_framebuffer_sRGB = sfwgl_LOAD_FAILED;
-int sfwgl_ext_ARB_framebuffer_sRGB = sfwgl_LOAD_FAILED;
-int sfwgl_ext_ARB_multisample = sfwgl_LOAD_FAILED;
-int sfwgl_ext_ARB_pixel_format = sfwgl_LOAD_FAILED;
-int sfwgl_ext_ARB_pbuffer = sfwgl_LOAD_FAILED;
-int sfwgl_ext_ARB_create_context = sfwgl_LOAD_FAILED;
-int sfwgl_ext_ARB_create_context_profile = sfwgl_LOAD_FAILED;
-
-int (CODEGEN_FUNCPTR *sf_ptrc_wglGetSwapIntervalEXT)(void) = NULL;
-BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglSwapIntervalEXT)(int) = NULL;
-
-static int Load_EXT_swap_control(void)
-{
- int numFailed = 0;
- sf_ptrc_wglGetSwapIntervalEXT = reinterpret_cast<int (CODEGEN_FUNCPTR*)(void)>(IntGetProcAddress("wglGetSwapIntervalEXT"));
- if (!sf_ptrc_wglGetSwapIntervalEXT)
- numFailed++;
- sf_ptrc_wglSwapIntervalEXT = reinterpret_cast<BOOL (CODEGEN_FUNCPTR*)(int)>(IntGetProcAddress("wglSwapIntervalEXT"));
- if (!sf_ptrc_wglSwapIntervalEXT)
- numFailed++;
- return numFailed;
-}
-
-BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglChoosePixelFormatARB)(HDC, const int*, const FLOAT*, UINT, int*, UINT*) = NULL;
-BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglGetPixelFormatAttribfvARB)(HDC, int, int, UINT, const int*, FLOAT*) = NULL;
-BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglGetPixelFormatAttribivARB)(HDC, int, int, UINT, const int*, int*) = NULL;
-
-static int Load_ARB_pixel_format(void)
-{
- int numFailed = 0;
- sf_ptrc_wglChoosePixelFormatARB = reinterpret_cast<BOOL (CODEGEN_FUNCPTR*)(HDC, const int*, const FLOAT*, UINT, int*, UINT*)>(IntGetProcAddress("wglChoosePixelFormatARB"));
- if (!sf_ptrc_wglChoosePixelFormatARB)
- numFailed++;
- sf_ptrc_wglGetPixelFormatAttribfvARB = reinterpret_cast<BOOL (CODEGEN_FUNCPTR *)(HDC, int, int, UINT, const int*, FLOAT*)>(IntGetProcAddress("wglGetPixelFormatAttribfvARB"));
- if (!sf_ptrc_wglGetPixelFormatAttribfvARB)
- numFailed++;
- sf_ptrc_wglGetPixelFormatAttribivARB = reinterpret_cast<BOOL (CODEGEN_FUNCPTR*)(HDC, int, int, UINT, const int*, int*)>(IntGetProcAddress("wglGetPixelFormatAttribivARB"));
- if (!sf_ptrc_wglGetPixelFormatAttribivARB)
- numFailed++;
- return numFailed;
-}
-
-HPBUFFERARB (CODEGEN_FUNCPTR *sf_ptrc_wglCreatePbufferARB)(HDC, int, int, int, const int*) = NULL;
-BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglDestroyPbufferARB)(HPBUFFERARB) = NULL;
-HDC (CODEGEN_FUNCPTR *sf_ptrc_wglGetPbufferDCARB)(HPBUFFERARB) = NULL;
-BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglQueryPbufferARB)(HPBUFFERARB, int, int*) = NULL;
-int (CODEGEN_FUNCPTR *sf_ptrc_wglReleasePbufferDCARB)(HPBUFFERARB, HDC) = NULL;
-
-static int Load_ARB_pbuffer()
-{
- int numFailed = 0;
- sf_ptrc_wglCreatePbufferARB = reinterpret_cast<HPBUFFERARB (CODEGEN_FUNCPTR*)(HDC, int, int, int, const int*)>(IntGetProcAddress("wglCreatePbufferARB"));
- if (!sf_ptrc_wglCreatePbufferARB)
- numFailed++;
- sf_ptrc_wglDestroyPbufferARB = reinterpret_cast<BOOL (CODEGEN_FUNCPTR*)(HPBUFFERARB)>(IntGetProcAddress("wglDestroyPbufferARB"));
- if (!sf_ptrc_wglDestroyPbufferARB)
- numFailed++;
- sf_ptrc_wglGetPbufferDCARB = reinterpret_cast<HDC (CODEGEN_FUNCPTR*)(HPBUFFERARB)>(IntGetProcAddress("wglGetPbufferDCARB"));
- if (!sf_ptrc_wglGetPbufferDCARB)
- numFailed++;
- sf_ptrc_wglQueryPbufferARB = reinterpret_cast<BOOL (CODEGEN_FUNCPTR*)(HPBUFFERARB, int, int*)>(IntGetProcAddress("wglQueryPbufferARB"));
- if (!sf_ptrc_wglQueryPbufferARB)
- numFailed++;
- sf_ptrc_wglReleasePbufferDCARB = reinterpret_cast<int (CODEGEN_FUNCPTR*)(HPBUFFERARB, HDC)>(IntGetProcAddress("wglReleasePbufferDCARB"));
- if (!sf_ptrc_wglReleasePbufferDCARB)
- numFailed++;
- return numFailed;
-}
-
-HGLRC (CODEGEN_FUNCPTR *sf_ptrc_wglCreateContextAttribsARB)(HDC, HGLRC, const int*) = NULL;
-
-static int Load_ARB_create_context(void)
-{
- int numFailed = 0;
- sf_ptrc_wglCreateContextAttribsARB = reinterpret_cast<HGLRC (CODEGEN_FUNCPTR*)(HDC, HGLRC, const int*)>(IntGetProcAddress("wglCreateContextAttribsARB"));
- if (!sf_ptrc_wglCreateContextAttribsARB)
- numFailed++;
- return numFailed;
-}
-
-
-static const char* (CODEGEN_FUNCPTR *sf_ptrc_wglGetExtensionsStringARB)(HDC) = NULL;
-
-typedef int (*PFN_LOADFUNCPOINTERS)(void);
-typedef struct sfwgl_StrToExtMap_s
-{
- const char* extensionName;
- int* extensionVariable;
- PFN_LOADFUNCPOINTERS LoadExtension;
-} sfwgl_StrToExtMap;
-
-static sfwgl_StrToExtMap ExtensionMap[8] = {
- {"WGL_EXT_swap_control", &sfwgl_ext_EXT_swap_control, Load_EXT_swap_control},
- {"WGL_EXT_framebuffer_sRGB", &sfwgl_ext_EXT_framebuffer_sRGB, NULL},
- {"WGL_ARB_framebuffer_sRGB", &sfwgl_ext_ARB_framebuffer_sRGB, NULL},
- {"WGL_ARB_multisample", &sfwgl_ext_ARB_multisample, NULL},
- {"WGL_ARB_pixel_format", &sfwgl_ext_ARB_pixel_format, Load_ARB_pixel_format},
- {"WGL_ARB_pbuffer", &sfwgl_ext_ARB_pbuffer, Load_ARB_pbuffer},
- {"WGL_ARB_create_context", &sfwgl_ext_ARB_create_context, Load_ARB_create_context},
- {"WGL_ARB_create_context_profile", &sfwgl_ext_ARB_create_context_profile, NULL}
-};
-
-static int g_extensionMapSize = 8;
-
-
-static sfwgl_StrToExtMap* FindExtEntry(const char* extensionName)
-{
- sfwgl_StrToExtMap* currLoc = ExtensionMap;
- for (int loop = 0; loop < g_extensionMapSize; ++loop, ++currLoc)
- {
- if (std::strcmp(extensionName, currLoc->extensionName) == 0)
- return currLoc;
- }
-
- return NULL;
-}
-
-
-static void ClearExtensionVars(void)
-{
- sfwgl_ext_EXT_swap_control = sfwgl_LOAD_FAILED;
- sfwgl_ext_EXT_framebuffer_sRGB = sfwgl_LOAD_FAILED;
- sfwgl_ext_ARB_framebuffer_sRGB = sfwgl_LOAD_FAILED;
- sfwgl_ext_ARB_multisample = sfwgl_LOAD_FAILED;
- sfwgl_ext_ARB_pixel_format = sfwgl_LOAD_FAILED;
- sfwgl_ext_ARB_pbuffer = sfwgl_LOAD_FAILED;
- sfwgl_ext_ARB_create_context = sfwgl_LOAD_FAILED;
- sfwgl_ext_ARB_create_context_profile = sfwgl_LOAD_FAILED;
-}
-
-
-static void LoadExtByName(const char* extensionName)
-{
- sfwgl_StrToExtMap* entry = NULL;
- entry = FindExtEntry(extensionName);
- if (entry)
- {
- if (entry->LoadExtension)
- {
- int numFailed = entry->LoadExtension();
- if (numFailed == 0)
- {
- *(entry->extensionVariable) = sfwgl_LOAD_SUCCEEDED;
- }
- else
- {
- *(entry->extensionVariable) = sfwgl_LOAD_SUCCEEDED + numFailed;
- }
- }
- else
- {
- *(entry->extensionVariable) = sfwgl_LOAD_SUCCEEDED;
- }
- }
-}
-
-
-static void ProcExtsFromExtString(const char* strExtList)
-{
- do
- {
- const char* begin = strExtList;
-
- while ((*strExtList != ' ') && *strExtList)
- strExtList++;
-
- LoadExtByName(std::string(begin, strExtList).c_str());
- } while (*strExtList++);
-}
-
-
-int sfwgl_LoadFunctions(HDC hdc)
-{
- ClearExtensionVars();
-
- sf_ptrc_wglGetExtensionsStringARB = reinterpret_cast<const char* (CODEGEN_FUNCPTR*)(HDC)>(IntGetProcAddress("wglGetExtensionsStringARB"));
- if (!sf_ptrc_wglGetExtensionsStringARB)
- return sfwgl_LOAD_FAILED;
-
- ProcExtsFromExtString(reinterpret_cast<const char*>(sf_ptrc_wglGetExtensionsStringARB(hdc)));
- return sfwgl_LOAD_SUCCEEDED;
-}
-
diff --git a/src/SFML/Window/Win32/WglExtensions.hpp b/src/SFML/Window/Win32/WglExtensions.hpp
deleted file mode 100644
index 3cefd99..0000000
--- a/src/SFML/Window/Win32/WglExtensions.hpp
+++ /dev/null
@@ -1,236 +0,0 @@
-////////////////////////////////////////////////////////////
-//
-// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
-//
-// This software is provided 'as-is', without any express or implied warranty.
-// In no event will the authors be held liable for any damages arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it freely,
-// subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented;
-// you must not claim that you wrote the original software.
-// If you use this software in a product, an acknowledgment
-// in the product documentation would be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such,
-// and must not be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source distribution.
-//
-////////////////////////////////////////////////////////////
-
-#ifndef SF_POINTER_C_GENERATED_HEADER_WINDOWSGL_HPP
-#define SF_POINTER_C_GENERATED_HEADER_WINDOWSGL_HPP
-
-#ifdef __wglext_h_
-#error Attempt to include auto-generated WGL header after wglext.h
-#endif
-
-#define __wglext_h_
-
-#ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN 1
-#endif
-#ifndef NOMINMAX
- #define NOMINMAX
-#endif
-#include <windows.h>
-
-#ifdef CODEGEN_FUNCPTR
-#undef CODEGEN_FUNCPTR
-#endif // CODEGEN_FUNCPTR
-#define CODEGEN_FUNCPTR WINAPI
-
-#ifndef GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-#define GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-
-typedef unsigned int GLenum;
-typedef unsigned char GLboolean;
-typedef unsigned int GLbitfield;
-typedef signed char GLbyte;
-typedef short GLshort;
-typedef int GLint;
-typedef int GLsizei;
-typedef unsigned char GLubyte;
-typedef unsigned short GLushort;
-typedef unsigned int GLuint;
-typedef float GLfloat;
-typedef float GLclampf;
-typedef double GLdouble;
-typedef double GLclampd;
-#define GLvoid void
-
-#endif // GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-
-
-#ifndef GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-#define GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-
-
-#endif // GL_LOAD_GEN_BASIC_OPENGL_TYPEDEFS
-
-
-struct _GPU_DEVICE {
- DWORD cb;
- CHAR DeviceName[32];
- CHAR DeviceString[128];
- DWORD Flags;
- RECT rcVirtualScreen;
-};
-DECLARE_HANDLE(HPBUFFERARB);
-DECLARE_HANDLE(HPBUFFEREXT);
-DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);
-DECLARE_HANDLE(HPVIDEODEV);
-DECLARE_HANDLE(HGPUNV);
-DECLARE_HANDLE(HVIDEOINPUTDEVICENV);
-typedef struct _GPU_DEVICE *PGPU_DEVICE;
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-
-extern int sfwgl_ext_EXT_swap_control;
-extern int sfwgl_ext_EXT_framebuffer_sRGB;
-extern int sfwgl_ext_ARB_framebuffer_sRGB;
-extern int sfwgl_ext_ARB_multisample;
-extern int sfwgl_ext_ARB_pixel_format;
-extern int sfwgl_ext_ARB_pbuffer;
-extern int sfwgl_ext_ARB_create_context;
-extern int sfwgl_ext_ARB_create_context_profile;
-
-#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9
-
-#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9
-
-#define WGL_SAMPLES_ARB 0x2042
-#define WGL_SAMPLE_BUFFERS_ARB 0x2041
-
-#define WGL_ACCELERATION_ARB 0x2003
-#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
-#define WGL_ACCUM_BITS_ARB 0x201D
-#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
-#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
-#define WGL_ACCUM_RED_BITS_ARB 0x201E
-#define WGL_ALPHA_BITS_ARB 0x201B
-#define WGL_ALPHA_SHIFT_ARB 0x201C
-#define WGL_AUX_BUFFERS_ARB 0x2024
-#define WGL_BLUE_BITS_ARB 0x2019
-#define WGL_BLUE_SHIFT_ARB 0x201A
-#define WGL_COLOR_BITS_ARB 0x2014
-#define WGL_DEPTH_BITS_ARB 0x2022
-#define WGL_DOUBLE_BUFFER_ARB 0x2011
-#define WGL_DRAW_TO_BITMAP_ARB 0x2002
-#define WGL_DRAW_TO_WINDOW_ARB 0x2001
-#define WGL_FULL_ACCELERATION_ARB 0x2027
-#define WGL_GENERIC_ACCELERATION_ARB 0x2026
-#define WGL_GREEN_BITS_ARB 0x2017
-#define WGL_GREEN_SHIFT_ARB 0x2018
-#define WGL_NEED_PALETTE_ARB 0x2004
-#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
-#define WGL_NO_ACCELERATION_ARB 0x2025
-#define WGL_NUMBER_OVERLAYS_ARB 0x2008
-#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
-#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
-#define WGL_PIXEL_TYPE_ARB 0x2013
-#define WGL_RED_BITS_ARB 0x2015
-#define WGL_RED_SHIFT_ARB 0x2017
-#define WGL_SHARE_ACCUM_ARB 0x200E
-#define WGL_SHARE_DEPTH_ARB 0x200C
-#define WGL_SHARE_STENCIL_ARB 0x200D
-#define WGL_STENCIL_BITS_ARB 0x2023
-#define WGL_STEREO_ARB 0x2012
-#define WGL_SUPPORT_GDI_ARB 0x200F
-#define WGL_SUPPORT_OPENGL_ARB 0x2010
-#define WGL_SWAP_COPY_ARB 0x2029
-#define WGL_SWAP_EXCHANGE_ARB 0x2028
-#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
-#define WGL_SWAP_METHOD_ARB 0x2007
-#define WGL_SWAP_UNDEFINED_ARB 0x202A
-#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
-#define WGL_TRANSPARENT_ARB 0x200A
-#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
-#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
-#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
-#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
-#define WGL_TYPE_COLORINDEX_ARB 0x202C
-#define WGL_TYPE_RGBA_ARB 0x202B
-
-#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
-#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
-#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
-#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
-#define WGL_PBUFFER_HEIGHT_ARB 0x2035
-#define WGL_PBUFFER_LARGEST_ARB 0x2033
-#define WGL_PBUFFER_LOST_ARB 0x2036
-#define WGL_PBUFFER_WIDTH_ARB 0x2034
-
-#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001
-#define WGL_CONTEXT_FLAGS_ARB 0x2094
-#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
-#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
-#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
-#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
-#define WGL_ERROR_INVALID_VERSION_ARB 0x2095
-
-#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
-#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
-#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
-#define WGL_ERROR_INVALID_PROFILE_ARB 0x2096
-
-#ifndef WGL_EXT_swap_control
-#define WGL_EXT_swap_control 1
-extern int (CODEGEN_FUNCPTR *sf_ptrc_wglGetSwapIntervalEXT)(void);
-#define wglGetSwapIntervalEXT sf_ptrc_wglGetSwapIntervalEXT
-extern BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglSwapIntervalEXT)(int);
-#define wglSwapIntervalEXT sf_ptrc_wglSwapIntervalEXT
-#endif // WGL_EXT_swap_control
-
-
-#ifndef WGL_ARB_pixel_format
-#define WGL_ARB_pixel_format 1
-extern BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglChoosePixelFormatARB)(HDC, const int*, const FLOAT*, UINT, int*, UINT*);
-#define wglChoosePixelFormatARB sf_ptrc_wglChoosePixelFormatARB
-extern BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglGetPixelFormatAttribfvARB)(HDC, int, int, UINT, const int*, FLOAT*);
-#define wglGetPixelFormatAttribfvARB sf_ptrc_wglGetPixelFormatAttribfvARB
-extern BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglGetPixelFormatAttribivARB)(HDC, int, int, UINT, const int*, int*);
-#define wglGetPixelFormatAttribivARB sf_ptrc_wglGetPixelFormatAttribivARB
-#endif // WGL_ARB_pixel_format
-
-#ifndef WGL_ARB_pbuffer
-#define WGL_ARB_pbuffer 1
-extern HPBUFFERARB (CODEGEN_FUNCPTR *sf_ptrc_wglCreatePbufferARB)(HDC, int, int, int, const int*);
-#define wglCreatePbufferARB sf_ptrc_wglCreatePbufferARB
-extern BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglDestroyPbufferARB)(HPBUFFERARB);
-#define wglDestroyPbufferARB sf_ptrc_wglDestroyPbufferARB
-extern HDC (CODEGEN_FUNCPTR *sf_ptrc_wglGetPbufferDCARB)(HPBUFFERARB);
-#define wglGetPbufferDCARB sf_ptrc_wglGetPbufferDCARB
-extern BOOL (CODEGEN_FUNCPTR *sf_ptrc_wglQueryPbufferARB)(HPBUFFERARB, int, int*);
-#define wglQueryPbufferARB sf_ptrc_wglQueryPbufferARB
-extern int (CODEGEN_FUNCPTR *sf_ptrc_wglReleasePbufferDCARB)(HPBUFFERARB, HDC);
-#define wglReleasePbufferDCARB sf_ptrc_wglReleasePbufferDCARB
-#endif // WGL_ARB_pbuffer
-
-#ifndef WGL_ARB_create_context
-#define WGL_ARB_create_context 1
-extern HGLRC (CODEGEN_FUNCPTR *sf_ptrc_wglCreateContextAttribsARB)(HDC, HGLRC, const int*);
-#define wglCreateContextAttribsARB sf_ptrc_wglCreateContextAttribsARB
-#endif // WGL_ARB_create_context
-
-
-enum sfwgl_LoadStatus
-{
- sfwgl_LOAD_FAILED = 0,
- sfwgl_LOAD_SUCCEEDED = 1
-};
-
-int sfwgl_LoadFunctions(HDC hdc);
-
-
-#ifdef __cplusplus
-}
-#endif // __cplusplus
-
-#endif // SF_POINTER_C_GENERATED_HEADER_WINDOWSGL_HPP
diff --git a/src/SFML/Window/Win32/WglExtensions.txt b/src/SFML/Window/Win32/WglExtensions.txt
deleted file mode 100644
index fa61675..0000000
--- a/src/SFML/Window/Win32/WglExtensions.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Created with:
-// https://bitbucket.org/KhronosGroup/glloadgen
-// Commit d143d66ac90d538ed06f806188714861b8e8e2f9
-// lua LoadGen.lua -style=pointer_c -spec=wgl -indent=space -prefix=sf -extfile=WglExtensions.txt WglExtensions
-
-EXT_swap_control
-EXT_framebuffer_sRGB
-ARB_framebuffer_sRGB
-WGL_ARB_multisample
-WGL_ARB_pixel_format
-WGL_ARB_pbuffer
-WGL_ARB_create_context
-WGL_ARB_create_context_profile
diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp
index e8e17fe..799834f 100755
--- a/src/SFML/Window/Win32/WindowImplWin32.cpp
+++ b/src/SFML/Window/Win32/WindowImplWin32.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -31,12 +31,14 @@
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
+#ifdef WINVER
+ #undef WINVER
+#endif
#define _WIN32_WINDOWS 0x0501
#define _WIN32_WINNT 0x0501
#define WINVER 0x0501
#include <SFML/Window/Win32/WindowImplWin32.hpp>
#include <SFML/Window/WindowStyle.hpp>
-#include <GL/gl.h>
#include <SFML/System/Err.hpp>
#include <SFML/System/Utf.hpp>
// dbt.h is lowercase here, as a cross-compile on linux with mingw-w64
@@ -45,6 +47,8 @@
#include <dbt.h>
#include <vector>
#include <cstring>
+#include <iostream>
+#include <string>
// MinGW lacks the definition of some Win32 constants
#ifndef XBUTTON1
@@ -84,14 +88,18 @@ namespace
};
typedef HRESULT (WINAPI* SetProcessDpiAwarenessFuncType)(ProcessDpiAwareness);
- SetProcessDpiAwarenessFuncType SetProcessDpiAwarenessFunc = reinterpret_cast<SetProcessDpiAwarenessFuncType>(GetProcAddress(shCoreDll, "SetProcessDpiAwareness"));
+ SetProcessDpiAwarenessFuncType SetProcessDpiAwarenessFunc = reinterpret_cast<SetProcessDpiAwarenessFuncType>(reinterpret_cast<void*>(GetProcAddress(shCoreDll, "SetProcessDpiAwareness")));
if (SetProcessDpiAwarenessFunc)
{
// We only check for E_INVALIDARG because we would get
// E_ACCESSDENIED if the DPI was already set previously
- // and S_OK means the call was successful
- if (SetProcessDpiAwarenessFunc(ProcessSystemDpiAware) == E_INVALIDARG)
+ // and S_OK means the call was successful.
+ // We intentionally don't use Per Monitor V2 which can be
+ // enabled with SetProcessDpiAwarenessContext, because that
+ // would scale the title bar and thus change window size
+ // by default when moving the window between monitors.
+ if (SetProcessDpiAwarenessFunc(ProcessPerMonitorDpiAware) == E_INVALIDARG)
{
sf::err() << "Failed to set process DPI awareness" << std::endl;
}
@@ -112,7 +120,7 @@ namespace
if (user32Dll)
{
typedef BOOL (WINAPI* SetProcessDPIAwareFuncType)(void);
- SetProcessDPIAwareFuncType SetProcessDPIAwareFunc = reinterpret_cast<SetProcessDPIAwareFuncType>(GetProcAddress(user32Dll, "SetProcessDPIAware"));
+ SetProcessDPIAwareFuncType SetProcessDPIAwareFunc = reinterpret_cast<SetProcessDPIAwareFuncType>(reinterpret_cast<void*>(GetProcAddress(user32Dll, "SetProcessDPIAware")));
if (SetProcessDPIAwareFunc)
{
@@ -188,8 +196,8 @@ m_cursorGrabbed (m_fullscreen)
HDC screenDC = GetDC(NULL);
int left = (GetDeviceCaps(screenDC, HORZRES) - static_cast<int>(mode.width)) / 2;
int top = (GetDeviceCaps(screenDC, VERTRES) - static_cast<int>(mode.height)) / 2;
- int width = mode.width;
- int height = mode.height;
+ int width = static_cast<int>(mode.width);
+ int height = static_cast<int>(mode.height);
ReleaseDC(NULL, screenDC);
// Choose the window style according to the Style parameter
@@ -218,7 +226,7 @@ m_cursorGrabbed (m_fullscreen)
m_handle = CreateWindowW(className, title.toWideString().c_str(), win32Style, left, top, width, height, NULL, NULL, GetModuleHandle(NULL), this);
// Register to receive device interface change notifications (used for joystick connection handling)
- DEV_BROADCAST_DEVICEINTERFACE deviceInterface = {sizeof(DEV_BROADCAST_DEVICEINTERFACE), DBT_DEVTYP_DEVICEINTERFACE, 0, GUID_DEVINTERFACE_HID, 0};
+ DEV_BROADCAST_DEVICEINTERFACE deviceInterface = {sizeof(DEV_BROADCAST_DEVICEINTERFACE), DBT_DEVTYP_DEVICEINTERFACE, 0, GUID_DEVINTERFACE_HID, {0}};
RegisterDeviceNotification(m_handle, &deviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE);
// If we're the first window handle, we only need to poll for joysticks when WM_DEVICECHANGE message is received
@@ -331,7 +339,7 @@ Vector2u WindowImplWin32::getSize() const
RECT rect;
GetClientRect(m_handle, &rect);
- return Vector2u(rect.right - rect.left, rect.bottom - rect.top);
+ return Vector2u(static_cast<unsigned int>(rect.right - rect.left), static_cast<unsigned int>(rect.bottom - rect.top));
}
@@ -341,7 +349,7 @@ void WindowImplWin32::setSize(const Vector2u& size)
// SetWindowPos wants the total size of the window (including title bar and borders),
// so we have to compute it
RECT rectangle = {0, 0, static_cast<long>(size.x), static_cast<long>(size.y)};
- AdjustWindowRect(&rectangle, GetWindowLong(m_handle, GWL_STYLE), false);
+ AdjustWindowRect(&rectangle, static_cast<DWORD>(GetWindowLongPtr(m_handle, GWL_STYLE)), false);
int width = rectangle.right - rectangle.left;
int height = rectangle.bottom - rectangle.top;
@@ -374,13 +382,13 @@ void WindowImplWin32::setIcon(unsigned int width, unsigned int height, const Uin
}
// Create the icon from the pixel array
- m_icon = CreateIcon(GetModuleHandleW(NULL), width, height, 1, 32, NULL, &iconPixels[0]);
+ m_icon = CreateIcon(GetModuleHandleW(NULL), static_cast<int>(width), static_cast<int>(height), 1, 32, NULL, &iconPixels[0]);
// Set it as both big and small icon of the window
if (m_icon)
{
- SendMessageW(m_handle, WM_SETICON, ICON_BIG, (LPARAM)m_icon);
- SendMessageW(m_handle, WM_SETICON, ICON_SMALL, (LPARAM)m_icon);
+ SendMessageW(m_handle, WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(m_icon));
+ SendMessageW(m_handle, WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(m_icon));
}
else
{
@@ -399,14 +407,8 @@ void WindowImplWin32::setVisible(bool visible)
////////////////////////////////////////////////////////////
void WindowImplWin32::setMouseCursorVisible(bool visible)
{
- // Don't call twice ShowCursor with the same parameter value;
- // we don't want to increment/decrement the internal counter
- // more than once.
- if (visible != m_cursorVisible)
- {
- m_cursorVisible = visible;
- ShowCursor(visible);
- }
+ m_cursorVisible = visible;
+ SetCursor(m_cursorVisible ? m_lastCursor : NULL);
}
@@ -422,7 +424,7 @@ void WindowImplWin32::setMouseCursorGrabbed(bool grabbed)
void WindowImplWin32::setMouseCursor(const CursorImpl& cursor)
{
m_lastCursor = cursor.m_cursor;
- SetCursor(m_lastCursor);
+ SetCursor(m_cursorVisible ? m_lastCursor : NULL);
}
@@ -437,8 +439,9 @@ void WindowImplWin32::setKeyRepeatEnabled(bool enabled)
void WindowImplWin32::requestFocus()
{
// Allow focus stealing only within the same process; compare PIDs of current and foreground window
- DWORD thisPid = GetWindowThreadProcessId(m_handle, NULL);
- DWORD foregroundPid = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
+ DWORD thisPid, foregroundPid;
+ GetWindowThreadProcessId(m_handle, &thisPid);
+ GetWindowThreadProcessId(GetForegroundWindow(), &foregroundPid);
if (thisPid == foregroundPid)
{
@@ -503,11 +506,11 @@ void WindowImplWin32::switchToFullscreen(const VideoMode& mode)
}
// Make the window flags compatible with fullscreen mode
- SetWindowLongW(m_handle, GWL_STYLE, WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
- SetWindowLongW(m_handle, GWL_EXSTYLE, WS_EX_APPWINDOW);
+ SetWindowLongPtr(m_handle, GWL_STYLE, static_cast<LONG_PTR>(WS_POPUP) | static_cast<LONG_PTR>(WS_CLIPCHILDREN) | static_cast<LONG_PTR>(WS_CLIPSIBLINGS));
+ SetWindowLongPtr(m_handle, GWL_EXSTYLE, WS_EX_APPWINDOW);
// Resize the window so that it fits the entire screen
- SetWindowPos(m_handle, HWND_TOP, 0, 0, mode.width, mode.height, SWP_FRAMECHANGED);
+ SetWindowPos(m_handle, HWND_TOP, 0, 0, static_cast<int>(mode.width), static_cast<int>(mode.height), SWP_FRAMECHANGED);
ShowWindow(m_handle, SW_SHOW);
// Set "this" as the current fullscreen window
@@ -564,6 +567,131 @@ void WindowImplWin32::grabCursor(bool grabbed)
}
}
+////////////////////////////////////////////////////////////
+Keyboard::Scancode WindowImplWin32::toScancode(WPARAM wParam, LPARAM lParam)
+{
+ int code = (lParam & (0xFF << 16)) >> 16;
+
+ // Retrieve the scancode from the VirtualKey for synthetic key messages
+ if (code == 0)
+ {
+ code = static_cast<int>(MapVirtualKey(static_cast<UINT>(wParam), MAPVK_VK_TO_VSC));
+ }
+
+ // Windows scancodes
+ // Reference: https://msdn.microsoft.com/en-us/library/aa299374(v=vs.60).aspx
+ switch (code)
+ {
+ case 1: return Keyboard::Scan::Escape;
+ case 2: return Keyboard::Scan::Num1;
+ case 3: return Keyboard::Scan::Num2;
+ case 4: return Keyboard::Scan::Num3;
+ case 5: return Keyboard::Scan::Num4;
+ case 6: return Keyboard::Scan::Num5;
+ case 7: return Keyboard::Scan::Num6;
+ case 8: return Keyboard::Scan::Num7;
+ case 9: return Keyboard::Scan::Num8;
+ case 10: return Keyboard::Scan::Num9;
+ case 11: return Keyboard::Scan::Num0;
+ case 12: return Keyboard::Scan::Hyphen;
+ case 13: return Keyboard::Scan::Equal;
+ case 14: return Keyboard::Scan::Backspace;
+ case 15: return Keyboard::Scan::Tab;
+ case 16: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::MediaPreviousTrack : Keyboard::Scan::Q;
+ case 17: return Keyboard::Scan::W;
+ case 18: return Keyboard::Scan::E;
+ case 19: return Keyboard::Scan::R;
+ case 20: return Keyboard::Scan::T;
+ case 21: return Keyboard::Scan::Y;
+ case 22: return Keyboard::Scan::U;
+ case 23: return Keyboard::Scan::I;
+ case 24: return Keyboard::Scan::O;
+ case 25: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::MediaNextTrack : Keyboard::Scan::P;
+ case 26: return Keyboard::Scan::LBracket;
+ case 27: return Keyboard::Scan::RBracket;
+ case 28: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::NumpadEnter : Keyboard::Scan::Enter;
+ case 29: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::RControl : Keyboard::Scan::LControl;
+ case 30: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Select : Keyboard::Scan::A;
+ case 31: return Keyboard::Scan::S;
+ case 32: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::VolumeMute : Keyboard::Scan::D;
+ case 33: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::LaunchApplication1 : Keyboard::Scan::F;
+ case 34: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::MediaPlayPause : Keyboard::Scan::G;
+ case 35: return Keyboard::Scan::H;
+ case 36: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::MediaStop : Keyboard::Scan::J;
+ case 37: return Keyboard::Scan::K;
+ case 38: return Keyboard::Scan::L;
+ case 39: return Keyboard::Scan::Semicolon;
+ case 40: return Keyboard::Scan::Apostrophe;
+ case 41: return Keyboard::Scan::Grave;
+ case 42: return Keyboard::Scan::LShift;
+ case 43: return Keyboard::Scan::Backslash;
+ case 44: return Keyboard::Scan::Z;
+ case 45: return Keyboard::Scan::X;
+ case 46: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::VolumeDown : Keyboard::Scan::C;
+ case 47: return Keyboard::Scan::V;
+ case 48: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::VolumeUp : Keyboard::Scan::B;
+ case 49: return Keyboard::Scan::N;
+ case 50: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::HomePage : Keyboard::Scan::M;
+ case 51: return Keyboard::Scan::Comma;
+ case 52: return Keyboard::Scan::Period;
+ case 53: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::NumpadDivide : Keyboard::Scan::Slash;
+ case 54: return Keyboard::Scan::RShift;
+ case 55: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::PrintScreen : Keyboard::Scan::NumpadMultiply;
+ case 56: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::RAlt : Keyboard::Scan::LAlt;
+ case 57: return Keyboard::Scan::Space;
+ case 58: return Keyboard::Scan::CapsLock;
+ case 59: return Keyboard::Scan::F1;
+ case 60: return Keyboard::Scan::F2;
+ case 61: return Keyboard::Scan::F3;
+ case 62: return Keyboard::Scan::F4;
+ case 63: return Keyboard::Scan::F5;
+ case 64: return Keyboard::Scan::F6;
+ case 65: return Keyboard::Scan::F7;
+ case 66: return Keyboard::Scan::F8;
+ case 67: return Keyboard::Scan::F9;
+ case 68: return Keyboard::Scan::F10;
+ case 69: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::NumLock : Keyboard::Scan::Pause;
+ case 70: return Keyboard::Scan::ScrollLock;
+ case 71: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Home : Keyboard::Scan::Numpad7;
+ case 72: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Up : Keyboard::Scan::Numpad8;
+ case 73: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::PageUp : Keyboard::Scan::Numpad9;
+ case 74: return Keyboard::Scan::NumpadMinus;
+ case 75: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Left : Keyboard::Scan::Numpad4;
+ case 76: return Keyboard::Scan::Numpad5;
+ case 77: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Right : Keyboard::Scan::Numpad6;
+ case 78: return Keyboard::Scan::NumpadPlus;
+ case 79: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::End : Keyboard::Scan::Numpad1;
+ case 80: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Down : Keyboard::Scan::Numpad2;
+ case 81: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::PageDown : Keyboard::Scan::Numpad3;
+ case 82: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Insert : Keyboard::Scan::Numpad0;
+ case 83: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Delete : Keyboard::Scan::NumpadDecimal;
+
+ case 86: return Keyboard::Scan::NonUsBackslash;
+ case 87: return Keyboard::Scan::F11;
+ case 88: return Keyboard::Scan::F12;
+
+ case 91: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::LSystem : Keyboard::Scan::Unknown;
+ case 92: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::RSystem : Keyboard::Scan::Unknown;
+ case 93: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Menu : Keyboard::Scan::Unknown;
+
+ case 99: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Help : Keyboard::Scan::Unknown;
+ case 100: return Keyboard::Scan::F13;
+ case 101: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Search : Keyboard::Scan::F14;
+ case 102: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Favorites : Keyboard::Scan::F15;
+ case 103: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Refresh : Keyboard::Scan::F16;
+ case 104: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Stop : Keyboard::Scan::F17;
+ case 105: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Forward : Keyboard::Scan::F18;
+ case 106: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::Back : Keyboard::Scan::F19;
+ case 107: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::LaunchApplication1 : Keyboard::Scan::F20;
+ case 108: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::LaunchMail : Keyboard::Scan::F21;
+ case 109: return (HIWORD(lParam) & KF_EXTENDED) ? Keyboard::Scan::LaunchMediaSelect : Keyboard::Scan::F22;
+ case 110: return Keyboard::Scan::F23;
+
+ case 118: return Keyboard::Scan::F24;
+
+ default: return Keyboard::Scan::Unknown;
+ }
+}
////////////////////////////////////////////////////////////
void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam)
@@ -586,8 +714,9 @@ void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam)
case WM_SETCURSOR:
{
// The mouse has moved, if the cursor is in our window we must refresh the cursor
- if (LOWORD(lParam) == HTCLIENT)
- SetCursor(m_lastCursor);
+ if (LOWORD(lParam) == HTCLIENT) {
+ SetCursor(m_cursorVisible ? m_lastCursor : NULL);
+ }
break;
}
@@ -732,12 +861,13 @@ void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam)
if (m_keyRepeatEnabled || ((HIWORD(lParam) & KF_REPEAT) == 0))
{
Event event;
- event.type = Event::KeyPressed;
- event.key.alt = HIWORD(GetKeyState(VK_MENU)) != 0;
- event.key.control = HIWORD(GetKeyState(VK_CONTROL)) != 0;
- event.key.shift = HIWORD(GetKeyState(VK_SHIFT)) != 0;
- event.key.system = HIWORD(GetKeyState(VK_LWIN)) || HIWORD(GetKeyState(VK_RWIN));
- event.key.code = virtualKeyCodeToSF(wParam, lParam);
+ event.type = Event::KeyPressed;
+ event.key.alt = HIWORD(GetKeyState(VK_MENU)) != 0;
+ event.key.control = HIWORD(GetKeyState(VK_CONTROL)) != 0;
+ event.key.shift = HIWORD(GetKeyState(VK_SHIFT)) != 0;
+ event.key.system = HIWORD(GetKeyState(VK_LWIN)) || HIWORD(GetKeyState(VK_RWIN));
+ event.key.code = virtualKeyCodeToSF(wParam, lParam);
+ event.key.scancode = toScancode(wParam, lParam);
pushEvent(event);
}
break;
@@ -748,12 +878,13 @@ void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam)
case WM_SYSKEYUP:
{
Event event;
- event.type = Event::KeyReleased;
- event.key.alt = HIWORD(GetKeyState(VK_MENU)) != 0;
- event.key.control = HIWORD(GetKeyState(VK_CONTROL)) != 0;
- event.key.shift = HIWORD(GetKeyState(VK_SHIFT)) != 0;
- event.key.system = HIWORD(GetKeyState(VK_LWIN)) || HIWORD(GetKeyState(VK_RWIN));
- event.key.code = virtualKeyCodeToSF(wParam, lParam);
+ event.type = Event::KeyReleased;
+ event.key.alt = HIWORD(GetKeyState(VK_MENU)) != 0;
+ event.key.control = HIWORD(GetKeyState(VK_CONTROL)) != 0;
+ event.key.shift = HIWORD(GetKeyState(VK_SHIFT)) != 0;
+ event.key.system = HIWORD(GetKeyState(VK_LWIN)) || HIWORD(GetKeyState(VK_RWIN));
+ event.key.code = virtualKeyCodeToSF(wParam, lParam);
+ event.key.scancode = toScancode(wParam, lParam);
pushEvent(event);
break;
}
@@ -985,6 +1116,8 @@ void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam)
pushEvent(event);
break;
}
+
+ // Hardware configuration change event
case WM_DEVICECHANGE:
{
// Some sort of device change has happened, update joystick connections
@@ -1034,9 +1167,9 @@ Keyboard::Key WindowImplWin32::virtualKeyCodeToSF(WPARAM key, LPARAM flags)
case VK_OEM_6: return Keyboard::RBracket;
case VK_OEM_COMMA: return Keyboard::Comma;
case VK_OEM_PERIOD: return Keyboard::Period;
- case VK_OEM_7: return Keyboard::Quote;
+ case VK_OEM_7: return Keyboard::Apostrophe;
case VK_OEM_5: return Keyboard::Backslash;
- case VK_OEM_3: return Keyboard::Tilde;
+ case VK_OEM_3: return Keyboard::Grave;
case VK_ESCAPE: return Keyboard::Escape;
case VK_SPACE: return Keyboard::Space;
case VK_RETURN: return Keyboard::Enter;
@@ -1131,7 +1264,7 @@ LRESULT CALLBACK WindowImplWin32::globalOnEvent(HWND handle, UINT message, WPARA
if (message == WM_CREATE)
{
// Get WindowImplWin32 instance (it was passed as the last argument of CreateWindow)
- LONG_PTR window = (LONG_PTR)reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams;
+ LONG_PTR window = reinterpret_cast<LONG_PTR>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams);
// Set as the "user data" parameter of the window
SetWindowLongPtrW(handle, GWLP_USERDATA, window);
diff --git a/src/SFML/Window/Win32/WindowImplWin32.hpp b/src/SFML/Window/Win32/WindowImplWin32.hpp
index 4114c51..0a8cb80 100755
--- a/src/SFML/Window/Win32/WindowImplWin32.hpp
+++ b/src/SFML/Window/Win32/WindowImplWin32.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -270,20 +270,30 @@ private:
static LRESULT CALLBACK globalOnEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam);
////////////////////////////////////////////////////////////
+ /// \brief Convert a Win32 scancode to an sfml scancode
+ ///
+ /// \param flags input flags
+ ///
+ /// \return SFML scancode corresponding to the key
+ ///
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Scancode toScancode(WPARAM wParam, LPARAM lParam);
+
+ ////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- HWND m_handle; ///< Win32 handle of the window
- LONG_PTR m_callback; ///< Stores the original event callback function of the control
- bool m_cursorVisible; ///< Is the cursor visible or hidden?
- HCURSOR m_lastCursor; ///< Last cursor used -- this data is not owned by the window and is required to be always valid
- HICON m_icon; ///< Custom icon assigned to the window
- bool m_keyRepeatEnabled; ///< Automatic key-repeat state for keydown events
- Vector2u m_lastSize; ///< The last handled size of the window
- bool m_resizing; ///< Is the window being resized?
- Uint16 m_surrogate; ///< First half of the surrogate pair, in case we're receiving a Unicode character in two events
- bool m_mouseInside; ///< Mouse is inside the window?
- bool m_fullscreen; ///< Is the window fullscreen?
- bool m_cursorGrabbed; ///< Is the mouse cursor trapped?
+ HWND m_handle; //!< Win32 handle of the window
+ LONG_PTR m_callback; //!< Stores the original event callback function of the control
+ bool m_cursorVisible; //!< Is the cursor visible or hidden?
+ HCURSOR m_lastCursor; //!< Last cursor used -- this data is not owned by the window and is required to be always valid
+ HICON m_icon; //!< Custom icon assigned to the window
+ bool m_keyRepeatEnabled; //!< Automatic key-repeat state for keydown events
+ Vector2u m_lastSize; //!< The last handled size of the window
+ bool m_resizing; //!< Is the window being resized?
+ Uint16 m_surrogate; //!< First half of the surrogate pair, in case we're receiving a Unicode character in two events
+ bool m_mouseInside; //!< Mouse is inside the window?
+ bool m_fullscreen; //!< Is the window fullscreen?
+ bool m_cursorGrabbed; //!< Is the mouse cursor trapped?
};
} // namespace priv
diff --git a/src/SFML/Window/Window.cpp b/src/SFML/Window/Window.cpp
index b1ed548..802247b 100644
--- a/src/SFML/Window/Window.cpp
+++ b/src/SFML/Window/Window.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -32,20 +32,12 @@
#include <SFML/System/Err.hpp>
-namespace
-{
- const sf::Window* fullscreenWindow = NULL;
-}
-
-
namespace sf
{
////////////////////////////////////////////////////////////
Window::Window() :
-m_impl (NULL),
m_context (NULL),
-m_frameTimeLimit(Time::Zero),
-m_size (0, 0)
+m_frameTimeLimit(Time::Zero)
{
}
@@ -53,23 +45,19 @@ m_size (0, 0)
////////////////////////////////////////////////////////////
Window::Window(VideoMode mode, const String& title, Uint32 style, const ContextSettings& settings) :
-m_impl (NULL),
m_context (NULL),
-m_frameTimeLimit(Time::Zero),
-m_size (0, 0)
+m_frameTimeLimit(Time::Zero)
{
- create(mode, title, style, settings);
+ Window::create(mode, title, style, settings);
}
////////////////////////////////////////////////////////////
Window::Window(WindowHandle handle, const ContextSettings& settings) :
-m_impl (NULL),
m_context (NULL),
-m_frameTimeLimit(Time::Zero),
-m_size (0, 0)
+m_frameTimeLimit(Time::Zero)
{
- create(handle, settings);
+ Window::create(handle, settings);
}
@@ -81,6 +69,13 @@ Window::~Window()
////////////////////////////////////////////////////////////
+void Window::create(VideoMode mode, const String& title, Uint32 style)
+{
+ Window::create(mode, title, style, ContextSettings());
+}
+
+
+////////////////////////////////////////////////////////////
void Window::create(VideoMode mode, const String& title, Uint32 style, const ContextSettings& settings)
{
// Destroy the previous window implementation
@@ -90,10 +85,10 @@ void Window::create(VideoMode mode, const String& title, Uint32 style, const Con
if (style & Style::Fullscreen)
{
// Make sure there's not already a fullscreen window (only one is allowed)
- if (fullscreenWindow)
+ if (getFullscreenWindow())
{
err() << "Creating two fullscreen windows is not allowed, switching to windowed mode" << std::endl;
- style &= ~Style::Fullscreen;
+ style &= ~static_cast<Uint32>(Style::Fullscreen);
}
else
{
@@ -105,14 +100,14 @@ void Window::create(VideoMode mode, const String& title, Uint32 style, const Con
}
// Update the fullscreen window
- fullscreenWindow = this;
+ setFullscreenWindow(this);
}
}
// Check validity of style according to the underlying platform
#if defined(SFML_SYSTEM_IOS) || defined(SFML_SYSTEM_ANDROID)
if (style & Style::Fullscreen)
- style &= ~Style::Titlebar;
+ style &= ~static_cast<Uint32>(Style::Titlebar);
else
style |= Style::Titlebar;
#else
@@ -132,13 +127,20 @@ void Window::create(VideoMode mode, const String& title, Uint32 style, const Con
////////////////////////////////////////////////////////////
+void Window::create(WindowHandle handle)
+{
+ Window::create(handle, ContextSettings());
+}
+
+
+////////////////////////////////////////////////////////////
void Window::create(WindowHandle handle, const ContextSettings& settings)
{
// Destroy the previous window implementation
close();
// Recreate the window implementation
- m_impl = priv::WindowImpl::create(handle);
+ WindowBase::create(handle);
// Recreate the context
m_context = priv::GlContext::create(settings, m_impl, VideoMode::getDesktopMode().bitsPerPixel);
@@ -155,20 +157,8 @@ void Window::close()
delete m_context;
m_context = NULL;
- // Delete the window implementation
- delete m_impl;
- m_impl = NULL;
-
- // Update the fullscreen window
- if (this == fullscreenWindow)
- fullscreenWindow = NULL;
-}
-
-
-////////////////////////////////////////////////////////////
-bool Window::isOpen() const
-{
- return m_impl != NULL;
+ // Close the base window
+ WindowBase::close();
}
@@ -182,97 +172,6 @@ const ContextSettings& Window::getSettings() const
////////////////////////////////////////////////////////////
-bool Window::pollEvent(Event& event)
-{
- if (m_impl && m_impl->popEvent(event, false))
- {
- return filterEvent(event);
- }
- else
- {
- return false;
- }
-}
-
-
-////////////////////////////////////////////////////////////
-bool Window::waitEvent(Event& event)
-{
- if (m_impl && m_impl->popEvent(event, true))
- {
- return filterEvent(event);
- }
- else
- {
- return false;
- }
-}
-
-
-////////////////////////////////////////////////////////////
-Vector2i Window::getPosition() const
-{
- return m_impl ? m_impl->getPosition() : Vector2i();
-}
-
-
-////////////////////////////////////////////////////////////
-void Window::setPosition(const Vector2i& position)
-{
- if (m_impl)
- m_impl->setPosition(position);
-}
-
-
-////////////////////////////////////////////////////////////
-Vector2u Window::getSize() const
-{
- return m_size;
-}
-
-
-////////////////////////////////////////////////////////////
-void Window::setSize(const Vector2u& size)
-{
- if (m_impl)
- {
- m_impl->setSize(size);
-
- // Cache the new size
- m_size.x = size.x;
- m_size.y = size.y;
-
- // Notify the derived class
- onResize();
- }
-}
-
-
-////////////////////////////////////////////////////////////
-void Window::setTitle(const String& title)
-{
- if (m_impl)
- m_impl->setTitle(title);
-}
-
-
-////////////////////////////////////////////////////////////
-void Window::setIcon(unsigned int width, unsigned int height, const Uint8* pixels)
-{
- if (m_impl)
- m_impl->setIcon(width, height, pixels);
-}
-
-
-////////////////////////////////////////////////////////////
-void Window::setVisible(bool visible)
-{
- if (m_impl)
- m_impl->setVisible(visible);
-}
-
-
-////////////////////////////////////////////////////////////
void Window::setVerticalSyncEnabled(bool enabled)
{
if (setActive())
@@ -281,56 +180,16 @@ void Window::setVerticalSyncEnabled(bool enabled)
////////////////////////////////////////////////////////////
-void Window::setMouseCursorVisible(bool visible)
-{
- if (m_impl)
- m_impl->setMouseCursorVisible(visible);
-}
-
-
-////////////////////////////////////////////////////////////
-void Window::setMouseCursorGrabbed(bool grabbed)
-{
- if (m_impl)
- m_impl->setMouseCursorGrabbed(grabbed);
-}
-
-
-////////////////////////////////////////////////////////////
-void Window::setMouseCursor(const Cursor& cursor)
-{
- if (m_impl)
- m_impl->setMouseCursor(cursor.getImpl());
-}
-
-
-////////////////////////////////////////////////////////////
-void Window::setKeyRepeatEnabled(bool enabled)
-{
- if (m_impl)
- m_impl->setKeyRepeatEnabled(enabled);
-}
-
-
-////////////////////////////////////////////////////////////
void Window::setFramerateLimit(unsigned int limit)
{
if (limit > 0)
- m_frameTimeLimit = seconds(1.f / limit);
+ m_frameTimeLimit = seconds(1.f / static_cast<float>(limit));
else
m_frameTimeLimit = Time::Zero;
}
////////////////////////////////////////////////////////////
-void Window::setJoystickThreshold(float threshold)
-{
- if (m_impl)
- m_impl->setJoystickThreshold(threshold);
-}
-
-
-////////////////////////////////////////////////////////////
bool Window::setActive(bool active) const
{
if (m_context)
@@ -353,22 +212,6 @@ bool Window::setActive(bool active) const
////////////////////////////////////////////////////////////
-void Window::requestFocus()
-{
- if (m_impl)
- m_impl->requestFocus();
-}
-
-
-////////////////////////////////////////////////////////////
-bool Window::hasFocus() const
-{
- return m_impl && m_impl->hasFocus();
-}
-
-
-////////////////////////////////////////////////////////////
-
void Window::display()
{
// Display the backbuffer on screen
@@ -385,65 +228,19 @@ void Window::display()
////////////////////////////////////////////////////////////
-WindowHandle Window::getSystemHandle() const
-{
- return m_impl ? m_impl->getSystemHandle() : 0;
-}
-
-
-////////////////////////////////////////////////////////////
-void Window::onCreate()
-{
- // Nothing by default
-}
-
-
-////////////////////////////////////////////////////////////
-void Window::onResize()
-{
- // Nothing by default
-}
-
-
-////////////////////////////////////////////////////////////
-bool Window::filterEvent(const Event& event)
-{
- // Notify resize events to the derived class
- if (event.type == Event::Resized)
- {
- // Cache the new size
- m_size.x = event.size.width;
- m_size.y = event.size.height;
-
- // Notify the derived class
- onResize();
- }
-
- return true;
-}
-
-
-////////////////////////////////////////////////////////////
void Window::initialize()
{
// Setup default behaviors (to get a consistent behavior across different implementations)
- setVisible(true);
- setMouseCursorVisible(true);
setVerticalSyncEnabled(false);
- setKeyRepeatEnabled(true);
setFramerateLimit(0);
- // Get and cache the initial size of the window
- m_size = m_impl->getSize();
-
// Reset frame time
m_clock.restart();
// Activate the window
setActive();
- // Notify the derived class
- onCreate();
+ WindowBase::initialize();
}
} // namespace sf
diff --git a/src/SFML/Window/WindowBase.cpp b/src/SFML/Window/WindowBase.cpp
new file mode 100644
index 0000000..1f414dc
--- /dev/null
+++ b/src/SFML/Window/WindowBase.cpp
@@ -0,0 +1,383 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/WindowBase.hpp>
+#include <SFML/Window/ContextSettings.hpp>
+#include <SFML/Window/WindowImpl.hpp>
+#include <SFML/System/Err.hpp>
+
+
+namespace
+{
+ // A nested named namespace is used here to allow unity builds of SFML.
+ namespace WindowsBaseImpl
+ {
+ const sf::WindowBase* fullscreenWindow = NULL;
+ }
+}
+
+
+namespace sf
+{
+////////////////////////////////////////////////////////////
+WindowBase::WindowBase() :
+m_impl (NULL),
+m_size (0, 0)
+{
+
+}
+
+
+////////////////////////////////////////////////////////////
+WindowBase::WindowBase(VideoMode mode, const String& title, Uint32 style) :
+m_impl (NULL),
+m_size (0, 0)
+{
+ WindowBase::create(mode, title, style);
+}
+
+
+////////////////////////////////////////////////////////////
+WindowBase::WindowBase(WindowHandle handle) :
+m_impl (NULL),
+m_size (0, 0)
+{
+ WindowBase::create(handle);
+}
+
+
+////////////////////////////////////////////////////////////
+WindowBase::~WindowBase()
+{
+ close();
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::create(VideoMode mode, const String& title, Uint32 style)
+{
+ // Destroy the previous window implementation
+ close();
+
+ // Fullscreen style requires some tests
+ if (style & Style::Fullscreen)
+ {
+ // Make sure there's not already a fullscreen window (only one is allowed)
+ if (getFullscreenWindow())
+ {
+ err() << "Creating two fullscreen windows is not allowed, switching to windowed mode" << std::endl;
+ style &= ~static_cast<Uint32>(Style::Fullscreen);
+ }
+ else
+ {
+ // Make sure that the chosen video mode is compatible
+ if (!mode.isValid())
+ {
+ err() << "The requested video mode is not available, switching to a valid mode" << std::endl;
+ mode = VideoMode::getFullscreenModes()[0];
+ }
+
+ // Update the fullscreen window
+ setFullscreenWindow(this);
+ }
+ }
+
+ // Check validity of style according to the underlying platform
+ #if defined(SFML_SYSTEM_IOS) || defined(SFML_SYSTEM_ANDROID)
+ if (style & Style::Fullscreen)
+ style &= ~static_cast<Uint32>(Style::Titlebar);
+ else
+ style |= Style::Titlebar;
+ #else
+ if ((style & Style::Close) || (style & Style::Resize))
+ style |= Style::Titlebar;
+ #endif
+
+ // Recreate the window implementation
+ m_impl = priv::WindowImpl::create(mode, title, style, ContextSettings(0, 0, 0, 0, 0, 0xFFFFFFFF, false));
+
+ // Perform common initializations
+ initialize();
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::create(WindowHandle handle)
+{
+ // Destroy the previous window implementation
+ close();
+
+ // Recreate the window implementation
+ m_impl = priv::WindowImpl::create(handle);
+
+ // Perform common initializations
+ initialize();
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::close()
+{
+ // Delete the window implementation
+ delete m_impl;
+ m_impl = NULL;
+
+ // Update the fullscreen window
+ if (this == getFullscreenWindow())
+ setFullscreenWindow(NULL);
+}
+
+
+////////////////////////////////////////////////////////////
+bool WindowBase::isOpen() const
+{
+ return m_impl != NULL;
+}
+
+
+////////////////////////////////////////////////////////////
+bool WindowBase::pollEvent(Event& event)
+{
+ if (m_impl && m_impl->popEvent(event, false))
+ {
+ return filterEvent(event);
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+////////////////////////////////////////////////////////////
+bool WindowBase::waitEvent(Event& event)
+{
+ if (m_impl && m_impl->popEvent(event, true))
+ {
+ return filterEvent(event);
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+////////////////////////////////////////////////////////////
+Vector2i WindowBase::getPosition() const
+{
+ return m_impl ? m_impl->getPosition() : Vector2i();
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::setPosition(const Vector2i& position)
+{
+ if (m_impl)
+ m_impl->setPosition(position);
+}
+
+
+////////////////////////////////////////////////////////////
+Vector2u WindowBase::getSize() const
+{
+ return m_size;
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::setSize(const Vector2u& size)
+{
+ if (m_impl)
+ {
+ m_impl->setSize(size);
+
+ // Cache the new size
+ m_size.x = size.x;
+ m_size.y = size.y;
+
+ // Notify the derived class
+ onResize();
+ }
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::setTitle(const String& title)
+{
+ if (m_impl)
+ m_impl->setTitle(title);
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::setIcon(unsigned int width, unsigned int height, const Uint8* pixels)
+{
+ if (m_impl)
+ m_impl->setIcon(width, height, pixels);
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::setVisible(bool visible)
+{
+ if (m_impl)
+ m_impl->setVisible(visible);
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::setMouseCursorVisible(bool visible)
+{
+ if (m_impl)
+ m_impl->setMouseCursorVisible(visible);
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::setMouseCursorGrabbed(bool grabbed)
+{
+ if (m_impl)
+ m_impl->setMouseCursorGrabbed(grabbed);
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::setMouseCursor(const Cursor& cursor)
+{
+ if (m_impl)
+ m_impl->setMouseCursor(cursor.getImpl());
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::setKeyRepeatEnabled(bool enabled)
+{
+ if (m_impl)
+ m_impl->setKeyRepeatEnabled(enabled);
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::setJoystickThreshold(float threshold)
+{
+ if (m_impl)
+ m_impl->setJoystickThreshold(threshold);
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::requestFocus()
+{
+ if (m_impl)
+ m_impl->requestFocus();
+}
+
+
+////////////////////////////////////////////////////////////
+bool WindowBase::hasFocus() const
+{
+ return m_impl && m_impl->hasFocus();
+}
+
+
+////////////////////////////////////////////////////////////
+WindowHandle WindowBase::getSystemHandle() const
+{
+ return m_impl ? m_impl->getSystemHandle() : 0;
+}
+
+
+////////////////////////////////////////////////////////////
+bool WindowBase::createVulkanSurface(const VkInstance& instance, VkSurfaceKHR& surface, const VkAllocationCallbacks* allocator)
+{
+ return m_impl ? m_impl->createVulkanSurface(instance, surface, allocator) : false;
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::onCreate()
+{
+ // Nothing by default
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::onResize()
+{
+ // Nothing by default
+}
+
+
+////////////////////////////////////////////////////////////
+bool WindowBase::filterEvent(const Event& event)
+{
+ // Notify resize events to the derived class
+ if (event.type == Event::Resized)
+ {
+ // Cache the new size
+ m_size.x = event.size.width;
+ m_size.y = event.size.height;
+
+ // Notify the derived class
+ onResize();
+ }
+
+ return true;
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::initialize()
+{
+ // Setup default behaviors (to get a consistent behavior across different implementations)
+ setVisible(true);
+ setMouseCursorVisible(true);
+ setKeyRepeatEnabled(true);
+
+ // Get and cache the initial size of the window
+ m_size = m_impl->getSize();
+
+ // Notify the derived class
+ onCreate();
+}
+
+
+////////////////////////////////////////////////////////////
+const WindowBase* WindowBase::getFullscreenWindow()
+{
+ return WindowsBaseImpl::fullscreenWindow;
+}
+
+
+////////////////////////////////////////////////////////////
+void WindowBase::setFullscreenWindow(const WindowBase* window)
+{
+ WindowsBaseImpl::fullscreenWindow = window;
+}
+
+} // namespace sf
diff --git a/src/SFML/Window/WindowImpl.cpp b/src/SFML/Window/WindowImpl.cpp
index 3de404a..d1e224d 100644
--- a/src/SFML/Window/WindowImpl.cpp
+++ b/src/SFML/Window/WindowImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -38,26 +38,49 @@
#include <SFML/Window/Win32/WindowImplWin32.hpp>
typedef sf::priv::WindowImplWin32 WindowImplType;
-#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD)
+ #include <SFML/Window/Win32/VulkanImplWin32.hpp>
+ typedef sf::priv::VulkanImplWin32 VulkanImplType;
- #include <SFML/Window/Unix/WindowImplX11.hpp>
- typedef sf::priv::WindowImplX11 WindowImplType;
+#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD)
+
+ #if defined(SFML_USE_DRM)
+
+ #include <SFML/Window/DRM/WindowImplDRM.hpp>
+ typedef sf::priv::WindowImplDRM WindowImplType;
+
+ #define SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE
+
+ #else
+
+ #include <SFML/Window/Unix/WindowImplX11.hpp>
+ typedef sf::priv::WindowImplX11 WindowImplType;
+
+ #include <SFML/Window/Unix/VulkanImplX11.hpp>
+ typedef sf::priv::VulkanImplX11 VulkanImplType;
+
+ #endif
#elif defined(SFML_SYSTEM_MACOS)
#include <SFML/Window/OSX/WindowImplCocoa.hpp>
typedef sf::priv::WindowImplCocoa WindowImplType;
+ #define SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE
+
#elif defined(SFML_SYSTEM_IOS)
#include <SFML/Window/iOS/WindowImplUIKit.hpp>
typedef sf::priv::WindowImplUIKit WindowImplType;
+ #define SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE
+
#elif defined(SFML_SYSTEM_ANDROID)
#include <SFML/Window/Android/WindowImplAndroid.hpp>
typedef sf::priv::WindowImplAndroid WindowImplType;
+ #define SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE
+
#endif
@@ -65,6 +88,7 @@ namespace sf
{
namespace priv
{
+
////////////////////////////////////////////////////////////
WindowImpl* WindowImpl::create(VideoMode mode, const String& title, Uint32 style, const ContextSettings& settings)
{
@@ -169,7 +193,6 @@ void WindowImpl::processJoystickEvents()
// Copy the previous state of the joystick and get the new one
JoystickState previousState = m_joystickStates[i];
m_joystickStates[i] = JoystickManager::getInstance().getState(i);
- JoystickCaps caps = JoystickManager::getInstance().getCapabilities(i);
// Connection state
bool connected = m_joystickStates[i].connected;
@@ -187,6 +210,8 @@ void WindowImpl::processJoystickEvents()
if (connected)
{
+ JoystickCaps caps = JoystickManager::getInstance().getCapabilities(i);
+
// Axes
for (unsigned int j = 0; j < Joystick::AxisCount; ++j)
{
@@ -195,7 +220,7 @@ void WindowImpl::processJoystickEvents()
Joystick::Axis axis = static_cast<Joystick::Axis>(j);
float prevPos = m_previousAxes[i][axis];
float currPos = m_joystickStates[i].axes[axis];
- if (fabs(currPos - prevPos) >= m_joystickThreshold)
+ if (std::abs(currPos - prevPos) >= m_joystickThreshold)
{
Event event;
event.type = Event::JoystickMoved;
@@ -261,6 +286,24 @@ void WindowImpl::processSensorEvents()
}
}
+
+////////////////////////////////////////////////////////////
+bool WindowImpl::createVulkanSurface(const VkInstance& instance, VkSurfaceKHR& surface, const VkAllocationCallbacks* allocator)
+{
+#if defined(SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE)
+
+ (void) instance;
+ (void) surface;
+ (void) allocator;
+ return false;
+
+#else
+
+ return VulkanImplType::createVulkanSurface(instance, getSystemHandle(), surface, allocator);
+
+#endif
+}
+
} // namespace priv
} // namespace sf
diff --git a/src/SFML/Window/WindowImpl.hpp b/src/SFML/Window/WindowImpl.hpp
index a360a01..5beb06f 100644
--- a/src/SFML/Window/WindowImpl.hpp
+++ b/src/SFML/Window/WindowImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -227,6 +227,18 @@ public:
////////////////////////////////////////////////////////////
virtual bool hasFocus() const = 0;
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a Vulkan rendering surface
+ ///
+ /// \param instance Vulkan instance
+ /// \param surface Created surface
+ /// \param allocator Allocator to use
+ ///
+ /// \return True if surface creation was successful, false otherwise
+ ///
+ ////////////////////////////////////////////////////////////
+ bool createVulkanSurface(const VkInstance& instance, VkSurfaceKHR& surface, const VkAllocationCallbacks* allocator);
+
protected:
////////////////////////////////////////////////////////////
@@ -270,11 +282,11 @@ private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
- std::queue<Event> m_events; ///< Queue of available events
- JoystickState m_joystickStates[Joystick::Count]; ///< Previous state of the joysticks
- Vector3f m_sensorValue[Sensor::Count]; ///< Previous value of the sensors
- float m_joystickThreshold; ///< Joystick threshold (minimum motion for "move" event to be generated)
- float m_previousAxes[Joystick::Count][Joystick::AxisCount]; ///< Position of each axis last time a move event triggered, in range [-100, 100]
+ std::queue<Event> m_events; //!< Queue of available events
+ JoystickState m_joystickStates[Joystick::Count]; //!< Previous state of the joysticks
+ Vector3f m_sensorValue[Sensor::Count]; //!< Previous value of the sensors
+ float m_joystickThreshold; //!< Joystick threshold (minimum motion for "move" event to be generated)
+ float m_previousAxes[Joystick::Count][Joystick::AxisCount]; //!< Position of each axis last time a move event triggered, in range [-100, 100]
};
} // namespace priv
diff --git a/src/SFML/Window/iOS/ClipboardImpl.hpp b/src/SFML/Window/iOS/ClipboardImpl.hpp
index f89d5a9..a571570 100644
--- a/src/SFML/Window/iOS/ClipboardImpl.hpp
+++ b/src/SFML/Window/iOS/ClipboardImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/ClipboardImpl.mm b/src/SFML/Window/iOS/ClipboardImpl.mm
index 641e16c..f11989d 100644
--- a/src/SFML/Window/iOS/ClipboardImpl.mm
+++ b/src/SFML/Window/iOS/ClipboardImpl.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/CursorImpl.cpp b/src/SFML/Window/iOS/CursorImpl.cpp
index a886f32..47c5cbe 100644
--- a/src/SFML/Window/iOS/CursorImpl.cpp
+++ b/src/SFML/Window/iOS/CursorImpl.cpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -47,7 +47,7 @@ CursorImpl::~CursorImpl()
////////////////////////////////////////////////////////////
-bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot)
+bool CursorImpl::loadFromPixels(const Uint8* /* pixels */, Vector2u /* size */, Vector2u /* hotspot */)
{
// Not supported
return false;
@@ -55,7 +55,7 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot
////////////////////////////////////////////////////////////
-bool CursorImpl::loadFromSystem(Cursor::Type type)
+bool CursorImpl::loadFromSystem(Cursor::Type /* type */)
{
// Not supported
return false;
diff --git a/src/SFML/Window/iOS/CursorImpl.hpp b/src/SFML/Window/iOS/CursorImpl.hpp
index 9d1dbfc..72d459f 100644
--- a/src/SFML/Window/iOS/CursorImpl.hpp
+++ b/src/SFML/Window/iOS/CursorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/EaglContext.hpp b/src/SFML/Window/iOS/EaglContext.hpp
index 7121f2e..9e32e07 100644
--- a/src/SFML/Window/iOS/EaglContext.hpp
+++ b/src/SFML/Window/iOS/EaglContext.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -32,7 +32,7 @@
#include <SFML/Window/iOS/ObjCType.hpp>
#include <SFML/System/Vector2.hpp>
#include <SFML/System/Clock.hpp>
-#include <OpenGLES/ES1/gl.h>
+#include <glad/gl.h>
SFML_DECLARE_OBJC_CLASS(EAGLContext);
@@ -91,6 +91,16 @@ public:
~EaglContext();
////////////////////////////////////////////////////////////
+ /// \brief Get the address of an OpenGL function
+ ///
+ /// \param name Name of the function to get the address of
+ ///
+ /// \return Address of the OpenGL function, 0 on failure
+ ///
+ ////////////////////////////////////////////////////////////
+ static GlFunctionPointer getFunction(const char* name);
+
+ ////////////////////////////////////////////////////////////
/// \brief Recreate the render buffers of the context
///
/// This function must be called whenever the containing view
diff --git a/src/SFML/Window/iOS/EaglContext.mm b/src/SFML/Window/iOS/EaglContext.mm
index 9fd6b83..97c4ce0 100644
--- a/src/SFML/Window/iOS/EaglContext.mm
+++ b/src/SFML/Window/iOS/EaglContext.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -32,8 +32,52 @@
#include <SFML/System/Sleep.hpp>
#include <OpenGLES/EAGL.h>
#include <OpenGLES/EAGLDrawable.h>
-#include <OpenGLES/ES1/glext.h>
#include <QuartzCore/CAEAGLLayer.h>
+#include <dlfcn.h>
+
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
+
+namespace
+{
+ PFNGLBINDFRAMEBUFFEROESPROC glBindFramebufferOESFunc = 0;
+ PFNGLBINDRENDERBUFFEROESPROC glBindRenderbufferOESFunc = 0;
+ PFNGLCHECKFRAMEBUFFERSTATUSOESPROC glCheckFramebufferStatusOESFunc = 0;
+ PFNGLDELETEFRAMEBUFFERSOESPROC glDeleteFramebuffersOESFunc = 0;
+ PFNGLDELETERENDERBUFFERSOESPROC glDeleteRenderbuffersOESFunc = 0;
+ PFNGLFRAMEBUFFERRENDERBUFFEROESPROC glFramebufferRenderbufferOESFunc = 0;
+ PFNGLGENFRAMEBUFFERSOESPROC glGenFramebuffersOESFunc = 0;
+ PFNGLGENRENDERBUFFERSOESPROC glGenRenderbuffersOESFunc = 0;
+ PFNGLGETRENDERBUFFERPARAMETERIVOESPROC glGetRenderbufferParameterivOESFunc = 0;
+ PFNGLRENDERBUFFERSTORAGEOESPROC glRenderbufferStorageOESFunc = 0;
+
+
+ void ensureInit()
+ {
+ static bool initialized = false;
+ if (!initialized)
+ {
+ initialized = true;
+
+ glBindFramebufferOESFunc = reinterpret_cast<PFNGLBINDFRAMEBUFFEROESPROC> (sf::priv::EaglContext::getFunction("glBindFramebufferOES"));
+ glBindRenderbufferOESFunc = reinterpret_cast<PFNGLBINDRENDERBUFFEROESPROC> (sf::priv::EaglContext::getFunction("glBindRenderbufferOES"));
+ glCheckFramebufferStatusOESFunc = reinterpret_cast<PFNGLCHECKFRAMEBUFFERSTATUSOESPROC> (sf::priv::EaglContext::getFunction("glCheckFramebufferStatusOES"));
+ glDeleteFramebuffersOESFunc = reinterpret_cast<PFNGLDELETEFRAMEBUFFERSOESPROC> (sf::priv::EaglContext::getFunction("glDeleteFramebuffersOES"));
+ glDeleteRenderbuffersOESFunc = reinterpret_cast<PFNGLDELETERENDERBUFFERSOESPROC> (sf::priv::EaglContext::getFunction("glDeleteRenderbuffersOES"));
+ glFramebufferRenderbufferOESFunc = reinterpret_cast<PFNGLFRAMEBUFFERRENDERBUFFEROESPROC> (sf::priv::EaglContext::getFunction("glFramebufferRenderbufferOES"));
+ glGenFramebuffersOESFunc = reinterpret_cast<PFNGLGENFRAMEBUFFERSOESPROC> (sf::priv::EaglContext::getFunction("glGenFramebuffersOES"));
+ glGenRenderbuffersOESFunc = reinterpret_cast<PFNGLGENRENDERBUFFERSOESPROC> (sf::priv::EaglContext::getFunction("glGenRenderbuffersOES"));
+ glGetRenderbufferParameterivOESFunc = reinterpret_cast<PFNGLGETRENDERBUFFERPARAMETERIVOESPROC>(sf::priv::EaglContext::getFunction("glGetRenderbufferParameterivOES"));
+ glRenderbufferStorageOESFunc = reinterpret_cast<PFNGLRENDERBUFFERSTORAGEOESPROC> (sf::priv::EaglContext::getFunction("glRenderbufferStorageOES"));
+ }
+ }
+}
namespace sf
@@ -49,6 +93,8 @@ m_depthbuffer (0),
m_vsyncEnabled(false),
m_clock ()
{
+ ensureInit();
+
// Create the context
if (shared)
m_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:[shared->m_context sharegroup]];
@@ -67,6 +113,8 @@ m_depthbuffer (0),
m_vsyncEnabled(false),
m_clock ()
{
+ ensureInit();
+
const WindowImplUIKit* window = static_cast<const WindowImplUIKit*>(owner);
createContext(shared, window, bitsPerPixel, settings);
@@ -74,8 +122,8 @@ m_clock ()
////////////////////////////////////////////////////////////
-EaglContext::EaglContext(EaglContext* shared, const ContextSettings& settings,
- unsigned int width, unsigned int height) :
+EaglContext::EaglContext(EaglContext* /* shared */, const ContextSettings& /* settings */,
+ unsigned int /* width */, unsigned int /* height */) :
m_context (nil),
m_framebuffer (0),
m_colorbuffer (0),
@@ -83,6 +131,8 @@ m_depthbuffer (0),
m_vsyncEnabled(false),
m_clock ()
{
+ ensureInit();
+
// This constructor should never be used by implementation
err() << "Calling bad EaglContext constructor, please contact your developer :)" << std::endl;
}
@@ -102,11 +152,11 @@ EaglContext::~EaglContext()
// Destroy the buffers
if (m_framebuffer)
- glDeleteFramebuffersOES(1, &m_framebuffer);
+ glDeleteFramebuffersOESFunc(1, &m_framebuffer);
if (m_colorbuffer)
- glDeleteRenderbuffersOES(1, &m_colorbuffer);
+ glDeleteRenderbuffersOESFunc(1, &m_colorbuffer);
if (m_depthbuffer)
- glDeleteRenderbuffersOES(1, &m_depthbuffer);
+ glDeleteRenderbuffersOESFunc(1, &m_depthbuffer);
// Restore the previous context
[EAGLContext setCurrentContext:previousContext];
@@ -118,6 +168,33 @@ EaglContext::~EaglContext()
////////////////////////////////////////////////////////////
+GlFunctionPointer EaglContext::getFunction(const char* name)
+{
+ static void* module = 0;
+
+ const int libCount = 3;
+ const char* libs[libCount] =
+ {
+ "libGLESv1_CM.dylib",
+ "/System/Library/Frameworks/OpenGLES.framework/OpenGLES",
+ "OpenGLES.framework/OpenGLES"
+ };
+
+ for (int i = 0; i < libCount; ++i)
+ {
+ if (!module)
+ module = dlopen(libs[i], RTLD_LAZY | RTLD_LOCAL);
+ }
+
+ if (module)
+ return reinterpret_cast<GlFunctionPointer>(
+ reinterpret_cast<uintptr_t>(dlsym(module, name)));
+
+ return 0;
+}
+
+
+////////////////////////////////////////////////////////////
void EaglContext::recreateRenderBuffers(SFView* glView)
{
// Activate the context
@@ -125,20 +202,20 @@ void EaglContext::recreateRenderBuffers(SFView* glView)
[EAGLContext setCurrentContext:m_context];
// Bind the frame buffer
- glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_framebuffer);
+ glBindFramebufferOESFunc(GL_FRAMEBUFFER_OES, m_framebuffer);
// Destroy previous render-buffers
if (m_colorbuffer)
- glDeleteRenderbuffersOES(1, &m_colorbuffer);
+ glDeleteRenderbuffersOESFunc(1, &m_colorbuffer);
if (m_depthbuffer)
- glDeleteRenderbuffersOES(1, &m_depthbuffer);
+ glDeleteRenderbuffersOESFunc(1, &m_depthbuffer);
// Create the color buffer
- glGenRenderbuffersOES(1, &m_colorbuffer);
- glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorbuffer);
+ glGenRenderbuffersOESFunc(1, &m_colorbuffer);
+ glBindRenderbufferOESFunc(GL_RENDERBUFFER_OES, m_colorbuffer);
if (glView)
- [m_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)glView.layer];
- glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorbuffer);
+ [m_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(static_cast<CAEAGLLayer*>(glView.layer))];
+ glFramebufferRenderbufferOESFunc(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorbuffer);
// Create a depth buffer if requested
if (m_settings.depthBits > 0)
@@ -150,20 +227,20 @@ void EaglContext::recreateRenderBuffers(SFView* glView)
// Get the size of the color-buffer (which fits the current size of the GL view)
GLint width, height;
- glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width);
- glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &height);
+ glGetRenderbufferParameterivOESFunc(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width);
+ glGetRenderbufferParameterivOESFunc(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &height);
// Create the depth buffer
- glGenRenderbuffersOES(1, &m_depthbuffer);
- glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthbuffer);
- glRenderbufferStorageOES(GL_RENDERBUFFER_OES, format, width, height);
- glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthbuffer);
+ glGenRenderbuffersOESFunc(1, &m_depthbuffer);
+ glBindRenderbufferOESFunc(GL_RENDERBUFFER_OES, m_depthbuffer);
+ glRenderbufferStorageOESFunc(GL_RENDERBUFFER_OES, format, width, height);
+ glFramebufferRenderbufferOESFunc(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthbuffer);
if (m_settings.stencilBits > 0)
- glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthbuffer);
+ glFramebufferRenderbufferOESFunc(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthbuffer);
}
// Make sure that everything's ok
- GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
+ GLenum status = glCheckFramebufferStatusOESFunc(GL_FRAMEBUFFER_OES);
if (status != GL_FRAMEBUFFER_COMPLETE_OES)
err() << "Failed to create a valid frame buffer (error code: " << status << ")" << std::endl;
@@ -185,7 +262,7 @@ bool EaglContext::makeCurrent(bool current)
////////////////////////////////////////////////////////////
void EaglContext::display()
{
- glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorbuffer);
+ glBindRenderbufferOESFunc(GL_RENDERBUFFER_OES, m_colorbuffer);
[m_context presentRenderbuffer:GL_RENDERBUFFER_OES];
// The proper way of doing v-sync on iOS would be to use CADisplayLink
@@ -210,7 +287,7 @@ void EaglContext::setVerticalSyncEnabled(bool enabled)
////////////////////////////////////////////////////////////
void EaglContext::createContext(EaglContext* shared,
const WindowImplUIKit* window,
- unsigned int bitsPerPixel,
+ unsigned int /* bitsPerPixel */,
const ContextSettings& settings)
{
// Save the settings
@@ -238,7 +315,7 @@ void EaglContext::createContext(EaglContext* shared,
makeCurrent(true);
// Create the framebuffer (this is the only allowed drawable on iOS)
- glGenFramebuffersOES(1, &m_framebuffer);
+ glGenFramebuffersOESFunc(1, &m_framebuffer);
// Create the render buffers
recreateRenderBuffers(window->getGlView());
diff --git a/src/SFML/Window/iOS/InputImpl.hpp b/src/SFML/Window/iOS/InputImpl.hpp
index 0d62071..e92018e 100644
--- a/src/SFML/Window/iOS/InputImpl.hpp
+++ b/src/SFML/Window/iOS/InputImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -45,19 +45,37 @@ class InputImpl
public:
////////////////////////////////////////////////////////////
- /// \brief Check if a key is pressed
+ /// \copydoc sf::Keyboard::isKeyPressed(Key)
///
- /// \param key Key to check
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::isKeyPressed(Scancode)
///
- /// \return True if the key is pressed, false otherwise
+ ////////////////////////////////////////////////////////////
+ static bool isKeyPressed(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::localize
///
////////////////////////////////////////////////////////////
- static bool isKeyPressed(Keyboard::Key key);
+ static Keyboard::Key localize(Keyboard::Scancode code);
////////////////////////////////////////////////////////////
- /// \brief Show or hide the virtual keyboard
+ /// \copydoc sf::Keyboard::delocalize
///
- /// \param visible True to show, false to hide
+ ////////////////////////////////////////////////////////////
+ static Keyboard::Scancode delocalize(Keyboard::Key key);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::getDescription
+ ///
+ ////////////////////////////////////////////////////////////
+ static String getDescription(Keyboard::Scancode code);
+
+ ////////////////////////////////////////////////////////////
+ /// \copydoc sf::Keyboard::setVirtualKeyboardVisible
///
////////////////////////////////////////////////////////////
static void setVirtualKeyboardVisible(bool visible);
@@ -95,7 +113,7 @@ public:
/// \return Current position of the mouse
///
////////////////////////////////////////////////////////////
- static Vector2i getMousePosition(const Window& relativeTo);
+ static Vector2i getMousePosition(const WindowBase& relativeTo);
////////////////////////////////////////////////////////////
/// \brief Set the current position of the mouse in desktop coordinates
@@ -120,7 +138,7 @@ public:
/// \param relativeTo Reference window
///
////////////////////////////////////////////////////////////
- static void setMousePosition(const Vector2i& position, const Window& relativeTo);
+ static void setMousePosition(const Vector2i& position, const WindowBase& relativeTo);
////////////////////////////////////////////////////////////
/// \brief Check if a touch event is currently down
@@ -157,7 +175,7 @@ public:
/// \return Current position of \a finger, or undefined if it's not down
///
////////////////////////////////////////////////////////////
- static Vector2i getTouchPosition(unsigned int finger, const Window& relativeTo);
+ static Vector2i getTouchPosition(unsigned int finger, const WindowBase& relativeTo);
};
} // namespace priv
diff --git a/src/SFML/Window/iOS/InputImpl.mm b/src/SFML/Window/iOS/InputImpl.mm
index bada27d..f5efcc3 100644
--- a/src/SFML/Window/iOS/InputImpl.mm
+++ b/src/SFML/Window/iOS/InputImpl.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -37,12 +37,35 @@ namespace sf
namespace priv
{
////////////////////////////////////////////////////////////
-bool InputImpl::isKeyPressed(Keyboard::Key key)
+bool InputImpl::isKeyPressed(Keyboard::Key /* key */)
{
// Not applicable
return false;
}
+bool InputImpl::isKeyPressed(Keyboard::Scancode /* codes */)
+{
+ // Not applicable
+ return false;
+}
+
+Keyboard::Key InputImpl::localize(Keyboard::Scancode /* code */)
+{
+ // Not applicable
+ return Keyboard::Unknown;
+}
+
+Keyboard::Scancode InputImpl::delocalize(Keyboard::Key /* key */)
+{
+ // Not applicable
+ return Keyboard::Scan::Unknown;
+}
+
+String InputImpl::getDescription(Keyboard::Scancode /* code */)
+{
+ // Not applicable
+ return "";
+}
////////////////////////////////////////////////////////////
void InputImpl::setVirtualKeyboardVisible(bool visible)
@@ -52,7 +75,7 @@ void InputImpl::setVirtualKeyboardVisible(bool visible)
////////////////////////////////////////////////////////////
-bool InputImpl::isMouseButtonPressed(Mouse::Button button)
+bool InputImpl::isMouseButtonPressed(Mouse::Button /* button */)
{
// Not applicable
return false;
@@ -67,23 +90,21 @@ Vector2i InputImpl::getMousePosition()
////////////////////////////////////////////////////////////
-Vector2i InputImpl::getMousePosition(const Window& relativeTo)
+Vector2i InputImpl::getMousePosition(const WindowBase& /* relativeTo */)
{
- (void)relativeTo;
-
return getMousePosition();
}
////////////////////////////////////////////////////////////
-void InputImpl::setMousePosition(const Vector2i& position)
+void InputImpl::setMousePosition(const Vector2i& /* position */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void InputImpl::setMousePosition(const Vector2i& position, const Window& relativeTo)
+void InputImpl::setMousePosition(const Vector2i& /* position */, const WindowBase& /* relativeTo */)
{
// Not applicable
}
@@ -104,10 +125,8 @@ Vector2i InputImpl::getTouchPosition(unsigned int finger)
////////////////////////////////////////////////////////////
-Vector2i InputImpl::getTouchPosition(unsigned int finger, const Window& relativeTo)
+Vector2i InputImpl::getTouchPosition(unsigned int finger, const WindowBase& /* relativeTo */)
{
- (void)relativeTo;
-
return getTouchPosition(finger);
}
diff --git a/src/SFML/Window/iOS/JoystickImpl.hpp b/src/SFML/Window/iOS/JoystickImpl.hpp
index e9fc8bd..e7409a5 100644
--- a/src/SFML/Window/iOS/JoystickImpl.hpp
+++ b/src/SFML/Window/iOS/JoystickImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/JoystickImpl.mm b/src/SFML/Window/iOS/JoystickImpl.mm
index 47fa8d3..283affd 100644
--- a/src/SFML/Window/iOS/JoystickImpl.mm
+++ b/src/SFML/Window/iOS/JoystickImpl.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -47,7 +47,7 @@ void JoystickImpl::cleanup()
////////////////////////////////////////////////////////////
-bool JoystickImpl::isConnected(unsigned int index)
+bool JoystickImpl::isConnected(unsigned int /* index */)
{
// Not implemented
return false;
@@ -55,7 +55,7 @@ bool JoystickImpl::isConnected(unsigned int index)
////////////////////////////////////////////////////////////
-bool JoystickImpl::open(unsigned int index)
+bool JoystickImpl::open(unsigned int /* index */)
{
// Not implemented
return false;
diff --git a/src/SFML/Window/iOS/ObjCType.hpp b/src/SFML/Window/iOS/ObjCType.hpp
index 5d06c51..5789e2e 100644
--- a/src/SFML/Window/iOS/ObjCType.hpp
+++ b/src/SFML/Window/iOS/ObjCType.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/SFAppDelegate.hpp b/src/SFML/Window/iOS/SFAppDelegate.hpp
index e389655..f907fd4 100644
--- a/src/SFML/Window/iOS/SFAppDelegate.hpp
+++ b/src/SFML/Window/iOS/SFAppDelegate.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/SFAppDelegate.mm b/src/SFML/Window/iOS/SFAppDelegate.mm
index ea69f41..cf34677 100644
--- a/src/SFML/Window/iOS/SFAppDelegate.mm
+++ b/src/SFML/Window/iOS/SFAppDelegate.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -171,7 +171,26 @@ namespace
if (!self.sfWindow)
return false;
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wold-style-cast"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wold-style-cast"
+ #endif
+#endif
+
UIViewController* rootViewController = [((__bridge UIWindow*)(self.sfWindow->getSystemHandle())) rootViewController];
+
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic pop
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic pop
+ #endif
+#endif
+
if (!rootViewController || ![rootViewController shouldAutorotate])
return false;
@@ -189,7 +208,7 @@ namespace
if ([supportedOrientations containsObject:@"UIInterfaceOrientationLandscapeRight"])
appFlags += UIInterfaceOrientationMaskLandscapeRight;
- return (1 << orientation) & [rootViewController supportedInterfaceOrientations] & appFlags;
+ return (1 << orientation) & [rootViewController supportedInterfaceOrientations] & static_cast<unsigned long>(appFlags);
}
- (bool)needsToFlipFrameForOrientation:(UIDeviceOrientation)orientation
@@ -244,11 +263,11 @@ namespace
////////////////////////////////////////////////////////////
-- (void)notifyTouchBegin:(unsigned int)index atPosition:(sf::Vector2i)position;
+- (void)notifyTouchBegin:(unsigned int)index atPosition:(sf::Vector2i)position
{
- position.x *= backingScaleFactor;
- position.y *= backingScaleFactor;
-
+ position.x *= static_cast<int>(backingScaleFactor);
+ position.y *= static_cast<int>(backingScaleFactor);
+
// save the touch position
if (index >= touchPositions.size())
touchPositions.resize(index + 1, sf::Vector2i(-1, -1));
@@ -268,11 +287,11 @@ namespace
////////////////////////////////////////////////////////////
-- (void)notifyTouchMove:(unsigned int)index atPosition:(sf::Vector2i)position;
+- (void)notifyTouchMove:(unsigned int)index atPosition:(sf::Vector2i)position
{
- position.x *= backingScaleFactor;
- position.y *= backingScaleFactor;
-
+ position.x *= static_cast<int>(backingScaleFactor);
+ position.y *= static_cast<int>(backingScaleFactor);
+
// save the touch position
if (index >= touchPositions.size())
touchPositions.resize(index + 1, sf::Vector2i(-1, -1));
@@ -292,7 +311,7 @@ namespace
////////////////////////////////////////////////////////////
-- (void)notifyTouchEnd:(unsigned int)index atPosition:(sf::Vector2i)position;
+- (void)notifyTouchEnd:(unsigned int)index atPosition:(sf::Vector2i)position
{
// clear the touch position
if (index < touchPositions.size())
@@ -304,8 +323,8 @@ namespace
sf::Event event;
event.type = sf::Event::TouchEnded;
event.touch.finger = index;
- event.touch.x = position.x * backingScaleFactor;
- event.touch.y = position.y * backingScaleFactor;
+ event.touch.x = position.x * static_cast<int>(backingScaleFactor);
+ event.touch.y = position.y * static_cast<int>(backingScaleFactor);
sfWindow->forwardEvent(event);
}
}
diff --git a/src/SFML/Window/iOS/SFMain.hpp b/src/SFML/Window/iOS/SFMain.hpp
index 4d0b5b4..9b98a17 100644
--- a/src/SFML/Window/iOS/SFMain.hpp
+++ b/src/SFML/Window/iOS/SFMain.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/SFMain.mm b/src/SFML/Window/iOS/SFMain.mm
index 4e9910a..12f67b3 100644
--- a/src/SFML/Window/iOS/SFMain.mm
+++ b/src/SFML/Window/iOS/SFMain.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/SFView.hpp b/src/SFML/Window/iOS/SFView.hpp
index f3f4276..c2234c6 100644
--- a/src/SFML/Window/iOS/SFView.hpp
+++ b/src/SFML/Window/iOS/SFView.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/SFView.mm b/src/SFML/Window/iOS/SFView.mm
index 940d0a8..e639065 100644
--- a/src/SFML/Window/iOS/SFView.mm
+++ b/src/SFML/Window/iOS/SFView.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -31,6 +31,14 @@
#include <QuartzCore/CAEAGLLayer.h>
#include <cstring>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
@interface SFView()
@property (nonatomic) NSMutableArray* touches;
@@ -103,7 +111,7 @@
sf::Vector2i position(static_cast<int>(point.x), static_cast<int>(point.y));
// notify the application delegate
- [[SFAppDelegate getInstance] notifyTouchBegin:index atPosition:position];
+ [[SFAppDelegate getInstance] notifyTouchBegin:(static_cast<unsigned int>(index)) atPosition:position];
}
}
@@ -122,7 +130,7 @@
sf::Vector2i position(static_cast<int>(point.x), static_cast<int>(point.y));
// notify the application delegate
- [[SFAppDelegate getInstance] notifyTouchMove:index atPosition:position];
+ [[SFAppDelegate getInstance] notifyTouchMove:(static_cast<unsigned int>(index)) atPosition:position];
}
}
}
@@ -142,7 +150,7 @@
sf::Vector2i position(static_cast<int>(point.x), static_cast<int>(point.y));
// notify the application delegate
- [[SFAppDelegate getInstance] notifyTouchEnd:index atPosition:position];
+ [[SFAppDelegate getInstance] notifyTouchEnd:(static_cast<unsigned int>(index)) atPosition:position];
// remove the touch
[self.touches replaceObjectAtIndex:index withObject:[NSNull null]];
@@ -187,7 +195,7 @@
self.touches = [NSMutableArray array];
// Configure the EAGL layer
- CAEAGLLayer* eaglLayer = (CAEAGLLayer*)self.layer;
+ CAEAGLLayer* eaglLayer = static_cast<CAEAGLLayer*>(self.layer);
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking,
diff --git a/src/SFML/Window/iOS/SFViewController.hpp b/src/SFML/Window/iOS/SFViewController.hpp
index 2b65d35..0e28311 100644
--- a/src/SFML/Window/iOS/SFViewController.hpp
+++ b/src/SFML/Window/iOS/SFViewController.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/SFViewController.mm b/src/SFML/Window/iOS/SFViewController.mm
index 8c23cdc..1cb7c94 100644
--- a/src/SFML/Window/iOS/SFViewController.mm
+++ b/src/SFML/Window/iOS/SFViewController.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/SensorImpl.hpp b/src/SFML/Window/iOS/SensorImpl.hpp
index 05c6b93..47e5b2c 100644
--- a/src/SFML/Window/iOS/SensorImpl.hpp
+++ b/src/SFML/Window/iOS/SensorImpl.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/SensorImpl.mm b/src/SFML/Window/iOS/SensorImpl.mm
index 249c41a..350c651 100644
--- a/src/SFML/Window/iOS/SensorImpl.mm
+++ b/src/SFML/Window/iOS/SensorImpl.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -139,37 +139,37 @@ Vector3f SensorImpl::update()
{
case Sensor::Accelerometer:
// Acceleration is given in G, convert to m/s^2
- value.x = manager.accelerometerData.acceleration.x * 9.81f;
- value.y = manager.accelerometerData.acceleration.y * 9.81f;
- value.z = manager.accelerometerData.acceleration.z * 9.81f;
+ value.x = static_cast<float>(manager.accelerometerData.acceleration.x * 9.81);
+ value.y = static_cast<float>(manager.accelerometerData.acceleration.y * 9.81);
+ value.z = static_cast<float>(manager.accelerometerData.acceleration.z * 9.81);
break;
case Sensor::Gyroscope:
// Rotation rates are given in rad/s, convert to deg/s
- value.x = toDegrees(manager.gyroData.rotationRate.x);
- value.y = toDegrees(manager.gyroData.rotationRate.y);
- value.z = toDegrees(manager.gyroData.rotationRate.z);
+ value.x = toDegrees(static_cast<float>(manager.gyroData.rotationRate.x));
+ value.y = toDegrees(static_cast<float>(manager.gyroData.rotationRate.y));
+ value.z = toDegrees(static_cast<float>(manager.gyroData.rotationRate.z));
break;
case Sensor::Magnetometer:
// Magnetic field is given in microteslas
- value.x = manager.magnetometerData.magneticField.x;
- value.y = manager.magnetometerData.magneticField.y;
- value.z = manager.magnetometerData.magneticField.z;
+ value.x = static_cast<float>(manager.magnetometerData.magneticField.x);
+ value.y = static_cast<float>(manager.magnetometerData.magneticField.y);
+ value.z = static_cast<float>(manager.magnetometerData.magneticField.z);
break;
case Sensor::UserAcceleration:
// User acceleration is given in G, convert to m/s^2
- value.x = manager.deviceMotion.userAcceleration.x * 9.81f;
- value.y = manager.deviceMotion.userAcceleration.y * 9.81f;
- value.z = manager.deviceMotion.userAcceleration.z * 9.81f;
+ value.x = static_cast<float>(manager.deviceMotion.userAcceleration.x * 9.81);
+ value.y = static_cast<float>(manager.deviceMotion.userAcceleration.y * 9.81);
+ value.z = static_cast<float>(manager.deviceMotion.userAcceleration.z * 9.81);
break;
case Sensor::Orientation:
// Absolute rotation (Euler) angles are given in radians, convert to degrees
- value.x = toDegrees(manager.deviceMotion.attitude.yaw);
- value.y = toDegrees(manager.deviceMotion.attitude.pitch);
- value.z = toDegrees(manager.deviceMotion.attitude.roll);
+ value.x = toDegrees(static_cast<float>(manager.deviceMotion.attitude.yaw));
+ value.y = toDegrees(static_cast<float>(manager.deviceMotion.attitude.pitch));
+ value.z = toDegrees(static_cast<float>(manager.deviceMotion.attitude.roll));
break;
default:
diff --git a/src/SFML/Window/iOS/VideoModeImpl.mm b/src/SFML/Window/iOS/VideoModeImpl.mm
index 7296d9d..de005fb 100644
--- a/src/SFML/Window/iOS/VideoModeImpl.mm
+++ b/src/SFML/Window/iOS/VideoModeImpl.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -50,8 +50,8 @@ std::vector<VideoMode> VideoModeImpl::getFullscreenModes()
VideoMode VideoModeImpl::getDesktopMode()
{
CGRect bounds = [[UIScreen mainScreen] bounds];
- float backingScale = [SFAppDelegate getInstance].backingScaleFactor;
- return VideoMode(bounds.size.width * backingScale, bounds.size.height * backingScale);
+ double backingScale = [SFAppDelegate getInstance].backingScaleFactor;
+ return VideoMode(static_cast<unsigned int>(bounds.size.width * backingScale), static_cast<unsigned int>(bounds.size.height * backingScale));
}
} // namespace priv
diff --git a/src/SFML/Window/iOS/WindowImplUIKit.hpp b/src/SFML/Window/iOS/WindowImplUIKit.hpp
index 60e0407..715c942 100644
--- a/src/SFML/Window/iOS/WindowImplUIKit.hpp
+++ b/src/SFML/Window/iOS/WindowImplUIKit.hpp
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/src/SFML/Window/iOS/WindowImplUIKit.mm b/src/SFML/Window/iOS/WindowImplUIKit.mm
index 35337db..6978205 100644
--- a/src/SFML/Window/iOS/WindowImplUIKit.mm
+++ b/src/SFML/Window/iOS/WindowImplUIKit.mm
@@ -1,7 +1,7 @@
////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
-// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
+// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
@@ -33,12 +33,20 @@
#include <SFML/System/Err.hpp>
#include <UIKit/UIKit.h>
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ #endif
+#endif
+
namespace sf
{
namespace priv
{
////////////////////////////////////////////////////////////
-WindowImplUIKit::WindowImplUIKit(WindowHandle handle)
+WindowImplUIKit::WindowImplUIKit(WindowHandle /* handle */)
{
// Not implemented
}
@@ -46,11 +54,11 @@ WindowImplUIKit::WindowImplUIKit(WindowHandle handle)
////////////////////////////////////////////////////////////
WindowImplUIKit::WindowImplUIKit(VideoMode mode,
- const String& title,
+ const String& /* title */,
unsigned long style,
- const ContextSettings& /*settings*/)
+ const ContextSettings& /* settings */)
{
- m_backingScale = [SFAppDelegate getInstance].backingScaleFactor;
+ m_backingScale = static_cast<float>([SFAppDelegate getInstance].backingScaleFactor);
// Apply the fullscreen flag
[UIApplication sharedApplication].statusBarHidden = !(style & Style::Titlebar) || (style & Style::Fullscreen);
@@ -77,7 +85,7 @@ WindowImplUIKit::WindowImplUIKit(VideoMode mode,
std::swap(viewRect.size.width, viewRect.size.height);
// Create the view
- m_view = [[SFView alloc] initWithFrame:viewRect andContentScaleFactor:m_backingScale];
+ m_view = [[SFView alloc] initWithFrame:viewRect andContentScaleFactor:(static_cast<double>(m_backingScale))];
[m_view resignFirstResponder];
// Create the view controller
@@ -108,7 +116,25 @@ void WindowImplUIKit::processEvents()
////////////////////////////////////////////////////////////
WindowHandle WindowImplUIKit::getSystemHandle() const
{
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wold-style-cast"
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wold-style-cast"
+ #endif
+#endif
+
return (__bridge WindowHandle)m_window;
+
+#if defined(__APPLE__)
+ #if defined(__clang__)
+ #pragma clang diagnostic pop
+ #elif defined(__GNUC__)
+ #pragma GCC diagnostic pop
+ #endif
+#endif
}
@@ -116,12 +142,12 @@ WindowHandle WindowImplUIKit::getSystemHandle() const
Vector2i WindowImplUIKit::getPosition() const
{
CGPoint origin = m_window.frame.origin;
- return Vector2i(origin.x * m_backingScale, origin.y * m_backingScale);
+ return Vector2i(static_cast<int>(origin.x * static_cast<double>(m_backingScale)), static_cast<int>(origin.y * static_cast<double>(m_backingScale)));
}
////////////////////////////////////////////////////////////
-void WindowImplUIKit::setPosition(const Vector2i& position)
+void WindowImplUIKit::setPosition(const Vector2i& /* position */)
{
}
@@ -129,12 +155,12 @@ void WindowImplUIKit::setPosition(const Vector2i& position)
////////////////////////////////////////////////////////////
Vector2u WindowImplUIKit::getSize() const
{
- auto physicalFrame = m_window.frame;
+ CGRect physicalFrame = m_window.frame;
// iOS 7 and 8 do different stuff here. In iOS 7 frame.x<frame.y always! In iOS 8 it correctly depends on orientation
if ((NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1)
&& UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]))
std::swap(physicalFrame.size.width, physicalFrame.size.height);
- return Vector2u(physicalFrame.size.width * m_backingScale, physicalFrame.size.height * m_backingScale);
+ return Vector2u(static_cast<unsigned int>(physicalFrame.size.width * static_cast<double>(m_backingScale)), static_cast<unsigned int>(physicalFrame.size.height * static_cast<double>(m_backingScale)));
}
@@ -156,49 +182,49 @@ void WindowImplUIKit::setSize(const Vector2u& size)
////////////////////////////////////////////////////////////
-void WindowImplUIKit::setTitle(const String& title)
+void WindowImplUIKit::setTitle(const String& /* title */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplUIKit::setIcon(unsigned int width, unsigned int height, const Uint8* pixels)
+void WindowImplUIKit::setIcon(unsigned int /* width */, unsigned int /* height */, const Uint8* /* pixels */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplUIKit::setVisible(bool visible)
+void WindowImplUIKit::setVisible(bool /* visible */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplUIKit::setMouseCursorVisible(bool visible)
+void WindowImplUIKit::setMouseCursorVisible(bool /* visible */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplUIKit::setMouseCursorGrabbed(bool grabbed)
+void WindowImplUIKit::setMouseCursorGrabbed(bool /* grabbed */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplUIKit::setMouseCursor(const CursorImpl& cursor)
+void WindowImplUIKit::setMouseCursor(const CursorImpl& /* cursor */)
{
// Not applicable
}
////////////////////////////////////////////////////////////
-void WindowImplUIKit::setKeyRepeatEnabled(bool enabled)
+void WindowImplUIKit::setKeyRepeatEnabled(bool /* enabled */)
{
// Not applicable
}
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..8a40f63
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,49 @@
+set(SRCROOT "${PROJECT_SOURCE_DIR}/test/src")
+
+include_directories("${PROJECT_SOURCE_DIR}/include")
+include_directories("${PROJECT_SOURCE_DIR}/extlibs/headers")
+include_directories("${SRCROOT}/TestUtilities")
+
+# System is always built
+SET(SYSTEM_SRC
+ "${SRCROOT}/CatchMain.cpp"
+ "${SRCROOT}/System/Vector2.cpp"
+ "${SRCROOT}/System/Vector3.cpp"
+ "${SRCROOT}/TestUtilities/SystemUtil.hpp"
+ "${SRCROOT}/TestUtilities/SystemUtil.cpp"
+)
+sfml_add_test(test-sfml-system "${SYSTEM_SRC}" sfml-system)
+
+if(SFML_BUILD_WINDOW)
+ SET(WINDOW_SRC
+ "${SRCROOT}/CatchMain.cpp"
+ "${SRCROOT}/TestUtilities/WindowUtil.hpp"
+ "${SRCROOT}/TestUtilities/WindowUtil.cpp"
+ )
+ sfml_add_test(test-sfml-window "${WINDOW_SRC}" sfml-window)
+endif()
+
+if(SFML_BUILD_GRAPHICS)
+ SET(GRAPHICS_SRC
+ "${SRCROOT}/CatchMain.cpp"
+ "${SRCROOT}/Graphics/Rect.cpp"
+ "${SRCROOT}/TestUtilities/GraphicsUtil.hpp"
+ "${SRCROOT}/TestUtilities/GraphicsUtil.cpp"
+ )
+ sfml_add_test(test-sfml-graphics "${GRAPHICS_SRC}" sfml-graphics)
+endif()
+
+if(SFML_BUILD_NETWORK)
+ SET(NETWORK_SRC
+ "${SRCROOT}/CatchMain.cpp"
+ "${SRCROOT}/Network/Packet.cpp"
+ )
+ sfml_add_test(test-sfml-network "${NETWORK_SRC}" sfml-network)
+endif()
+
+# Convenience for building and running tests in a single command
+add_custom_target(runtests DEPENDS test-sfml-system test-sfml-window test-sfml-graphics test-sfml-network test-sfml-audio)
+add_custom_command(TARGET runtests
+ COMMENT "Run tests"
+ POST_BUILD COMMAND ctest ARGS --output-on-failure
+)
diff --git a/test/src/CatchMain.cpp b/test/src/CatchMain.cpp
new file mode 100644
index 0000000..b3143fb
--- /dev/null
+++ b/test/src/CatchMain.cpp
@@ -0,0 +1,2 @@
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
diff --git a/test/src/Graphics/Rect.cpp b/test/src/Graphics/Rect.cpp
new file mode 100644
index 0000000..e67fd91
--- /dev/null
+++ b/test/src/Graphics/Rect.cpp
@@ -0,0 +1,120 @@
+#include <SFML/Graphics/Rect.hpp>
+#include <SFML/System/Vector2.hpp>
+#include "GraphicsUtil.hpp"
+
+TEST_CASE("sf::Rect class template", "[graphics]")
+{
+ SECTION("Construction")
+ {
+ SECTION("Default constructor")
+ {
+ sf::IntRect rectangle;
+ CHECK(rectangle.left == 0);
+ CHECK(rectangle.top == 0);
+ CHECK(rectangle.width == 0);
+ CHECK(rectangle.height == 0);
+ }
+
+ SECTION("(left, top, width, height) constructor")
+ {
+ sf::IntRect rectangle(1, 2, 3, 4);
+ CHECK(rectangle.left == 1);
+ CHECK(rectangle.top == 2);
+ CHECK(rectangle.width == 3);
+ CHECK(rectangle.height == 4);
+ }
+
+ SECTION("(Vector2, Vector2) constructor")
+ {
+ sf::Vector2i position(1, 2);
+ sf::Vector2i dimension(3, 4);
+ sf::IntRect rectangle(position, dimension);
+
+ CHECK(rectangle.left == 1);
+ CHECK(rectangle.top == 2);
+ CHECK(rectangle.width == 3);
+ CHECK(rectangle.height == 4);
+ }
+
+ SECTION("Conversion constructor")
+ {
+ sf::FloatRect sourceRectangle(1.0f, 2.0f, 3.0f, 4.0f);
+ sf::IntRect rectangle(sourceRectangle);
+
+ CHECK(rectangle.left == static_cast<int>(sourceRectangle.left));
+ CHECK(rectangle.top == static_cast<int>(sourceRectangle.top));
+ CHECK(rectangle.width == static_cast<int>(sourceRectangle.width));
+ CHECK(rectangle.height == static_cast<int>(sourceRectangle.height));
+ }
+ }
+
+ SECTION("Containment")
+ {
+ SECTION("contains(x, y)")
+ {
+ sf::IntRect rectangle(0, 0, 10, 10);
+
+ CHECK(rectangle.contains(0, 0) == true);
+ CHECK(rectangle.contains(9, 0) == true);
+ CHECK(rectangle.contains(0, 9) == true);
+ CHECK(rectangle.contains(9, 9) == true);
+ CHECK(rectangle.contains(9, 10) == false);
+ CHECK(rectangle.contains(10, 9) == false);
+ CHECK(rectangle.contains(10, 10) == false);
+ CHECK(rectangle.contains(15, 15) == false);
+ }
+
+ SECTION("contains(Vector2)")
+ {
+ sf::IntRect rectangle(0, 0, 10, 10);
+
+ CHECK(rectangle.contains(sf::Vector2i(0, 0)) == true);
+ CHECK(rectangle.contains(sf::Vector2i(9, 0)) == true);
+ CHECK(rectangle.contains(sf::Vector2i(0, 9)) == true);
+ CHECK(rectangle.contains(sf::Vector2i(9, 9)) == true);
+ CHECK(rectangle.contains(sf::Vector2i(9, 10)) == false);
+ CHECK(rectangle.contains(sf::Vector2i(10, 9)) == false);
+ CHECK(rectangle.contains(sf::Vector2i(10, 10)) == false);
+ CHECK(rectangle.contains(sf::Vector2i(15, 15)) == false);
+ }
+ }
+
+ SECTION("Intersection")
+ {
+ SECTION("intersects(Rect)")
+ {
+ sf::IntRect rectangle(0, 0, 10, 10);
+ sf::IntRect intersectingRectangle(5, 5, 10, 10);
+ sf::IntRect nonIntersectingRectangle(-5, -5, 5, 5);
+
+ CHECK(rectangle.intersects(intersectingRectangle) == true);
+ CHECK(rectangle.intersects(nonIntersectingRectangle) == false);
+ }
+
+ SECTION("intersects(Rect, Rect)")
+ {
+ sf::IntRect rectangle(0, 0, 10, 10);
+ sf::IntRect intersectingRectangle(5, 5, 10, 10);
+ sf::IntRect nonIntersectingRectangle(-5, -5, 5, 5);
+ sf::IntRect intersectionResult;
+
+ CHECK(rectangle.intersects(intersectingRectangle, intersectionResult) == true);
+ CHECK(intersectionResult.top == 5);
+ CHECK(intersectionResult.left == 5);
+ CHECK(intersectionResult.width == 5);
+ CHECK(intersectionResult.height == 5);
+
+ CHECK(rectangle.intersects(nonIntersectingRectangle, intersectionResult) == false);
+ }
+ }
+
+ SECTION("Comparison operations")
+ {
+ sf::IntRect firstRectangle(1, 3, 2, 5);
+ sf::IntRect secondRectangle(1, 3, 2, 5);
+ sf::IntRect differentRectangle(3, 1, 5, 2);
+
+ CHECK(firstRectangle == secondRectangle);
+ CHECK(firstRectangle != differentRectangle);
+ }
+}
diff --git a/test/src/Network/Packet.cpp b/test/src/Network/Packet.cpp
new file mode 100644
index 0000000..6bd89cb
--- /dev/null
+++ b/test/src/Network/Packet.cpp
@@ -0,0 +1,52 @@
+#include <SFML/Network.hpp>
+
+#include <catch.hpp>
+#include <limits>
+
+template <typename IntegerType>
+static void testPacketStreamOperators(IntegerType expected)
+{
+ sf::Packet packet;
+ packet << expected;
+ IntegerType received;
+ packet >> received;
+ CHECK(expected == received);
+}
+
+TEST_CASE("sf::Packet class", "[network]")
+{
+ SECTION("Stream operators")
+ {
+ SECTION("Int8")
+ {
+ testPacketStreamOperators(sf::Int8(0));
+ testPacketStreamOperators(sf::Int8(1));
+ testPacketStreamOperators(std::numeric_limits<sf::Int8>::min());
+ testPacketStreamOperators(std::numeric_limits<sf::Int8>::max());
+ }
+
+ SECTION("Int16")
+ {
+ testPacketStreamOperators(sf::Int16(0));
+ testPacketStreamOperators(sf::Int16(1));
+ testPacketStreamOperators(std::numeric_limits<sf::Int16>::min());
+ testPacketStreamOperators(std::numeric_limits<sf::Int16>::max());
+ }
+
+ SECTION("Int32")
+ {
+ testPacketStreamOperators(sf::Int32(0));
+ testPacketStreamOperators(sf::Int32(1));
+ testPacketStreamOperators(std::numeric_limits<sf::Int32>::min());
+ testPacketStreamOperators(std::numeric_limits<sf::Int32>::max());
+ }
+
+ SECTION("Int64")
+ {
+ testPacketStreamOperators(sf::Int64(0));
+ testPacketStreamOperators(sf::Int64(1));
+ testPacketStreamOperators(std::numeric_limits<sf::Int64>::min());
+ testPacketStreamOperators(std::numeric_limits<sf::Int64>::max());
+ }
+ }
+}
diff --git a/test/src/System/Vector2.cpp b/test/src/System/Vector2.cpp
new file mode 100644
index 0000000..bb3b28e
--- /dev/null
+++ b/test/src/System/Vector2.cpp
@@ -0,0 +1,148 @@
+#include <SFML/System/Vector2.hpp>
+#include "SystemUtil.hpp"
+
+// Use sf::Vector2i for tests. Test coverage is given, as there are no template specializations.
+
+TEST_CASE("sf::Vector2 class template", "[system]")
+{
+ SECTION("Construction")
+ {
+ SECTION("Default constructor")
+ {
+ sf::Vector2i vector;
+ CHECK(vector.x == 0);
+ CHECK(vector.y == 0);
+ }
+
+ SECTION("(x, y) coordinate constructor")
+ {
+ sf::Vector2i vector(1, 2);
+ CHECK(vector.x == 1);
+ CHECK(vector.y == 2);
+ }
+
+ SECTION("Conversion constructor")
+ {
+ sf::Vector2f sourceVector(1.0f, 2.0f);
+ sf::Vector2i vector(sourceVector);
+
+ CHECK(vector.x == static_cast<int>(sourceVector.x));
+ CHECK(vector.y == static_cast<int>(sourceVector.y));
+ }
+ }
+
+ SECTION("Unary operations")
+ {
+ SECTION("-vector")
+ {
+ sf::Vector2i vector(1, 2);
+ sf::Vector2i negatedVector = -vector;
+
+ CHECK(negatedVector.x == -1);
+ CHECK(negatedVector.y == -2);
+ }
+ }
+
+ SECTION("Arithmetic operations between two vectors")
+ {
+ sf::Vector2i firstVector(2, 5);
+ sf::Vector2i secondVector(8, 3);
+
+ SECTION("vector += vector")
+ {
+ firstVector += secondVector;
+
+ CHECK(firstVector.x == 10);
+ CHECK(firstVector.y == 8);
+ }
+
+ SECTION("vector -= vector")
+ {
+ firstVector -= secondVector;
+
+ CHECK(firstVector.x == -6);
+ CHECK(firstVector.y == 2);
+ }
+
+ SECTION("vector + vector")
+ {
+ sf::Vector2i result = firstVector + secondVector;
+
+ CHECK(result.x == 10);
+ CHECK(result.y == 8);
+ }
+
+ SECTION("vector - vector")
+ {
+ sf::Vector2i result = firstVector - secondVector;
+
+ CHECK(result.x == -6);
+ CHECK(result.y == 2);
+ }
+ }
+
+ SECTION("Arithmetic operations between vector and scalar value")
+ {
+ sf::Vector2i vector(26, 12);
+ int scalar = 2;
+
+ SECTION("vector * scalar")
+ {
+ sf::Vector2i result = vector * scalar;
+
+ CHECK(result.x == 52);
+ CHECK(result.y == 24);
+ }
+
+ SECTION("scalar * vector")
+ {
+ sf::Vector2i result = scalar * vector;
+
+ CHECK(result.x == 52);
+ CHECK(result.y == 24);
+ }
+
+ SECTION("vector *= scalar")
+ {
+ vector *= scalar;
+
+ CHECK(vector.x == 52);
+ CHECK(vector.y == 24);
+ }
+
+ SECTION("vector / scalar")
+ {
+ sf::Vector2i result = vector / scalar;
+
+ CHECK(result.x == 13);
+ CHECK(result.y == 6);
+ }
+
+ SECTION("vector /= scalar")
+ {
+ vector /= scalar;
+
+ CHECK(vector.x == 13);
+ CHECK(vector.y == 6);
+ }
+ }
+
+ SECTION("Comparison operations (two equal and one different vector)")
+ {
+ sf::Vector2i firstEqualVector(1, 5);
+ sf::Vector2i secondEqualVector(1, 5);
+ sf::Vector2i differentVector(6, 9);
+
+ SECTION("vector == vector")
+ {
+ CHECK(firstEqualVector == secondEqualVector);
+ CHECK_FALSE(firstEqualVector == differentVector);
+ }
+
+ SECTION("vector != vector")
+ {
+ CHECK(firstEqualVector != differentVector);
+ CHECK_FALSE(firstEqualVector != secondEqualVector);
+ }
+ }
+}
diff --git a/test/src/System/Vector3.cpp b/test/src/System/Vector3.cpp
new file mode 100644
index 0000000..948a0ff
--- /dev/null
+++ b/test/src/System/Vector3.cpp
@@ -0,0 +1,161 @@
+#include <SFML/System/Vector3.hpp>
+#include "SystemUtil.hpp"
+
+// Use sf::Vector3i for tests. Test coverage is given, as there are no template specializations.
+
+TEST_CASE("sf::Vector3 class template", "[system]")
+{
+ SECTION("Construction")
+ {
+ SECTION("Default constructor")
+ {
+ sf::Vector3i vector;
+ CHECK(vector.x == 0);
+ CHECK(vector.y == 0);
+ CHECK(vector.z == 0);
+ }
+
+ SECTION("(x, y, z) coordinate constructor")
+ {
+ sf::Vector3i vector(1, 2, 3);
+ CHECK(vector.x == 1);
+ CHECK(vector.y == 2);
+ CHECK(vector.z == 3);
+ }
+
+ SECTION("Conversion constructor")
+ {
+ sf::Vector3f sourceVector(1.0f, 2.0f, 3.0f);
+ sf::Vector3i vector(sourceVector);
+
+ CHECK(vector.x == static_cast<int>(sourceVector.x));
+ CHECK(vector.y == static_cast<int>(sourceVector.y));
+ CHECK(vector.z == static_cast<int>(sourceVector.z));
+ }
+ }
+
+ SECTION("Unary operations")
+ {
+ SECTION("-vector")
+ {
+ sf::Vector3i vector(1, 2, 3);
+ sf::Vector3i negatedVector = -vector;
+
+ CHECK(negatedVector.x == -1);
+ CHECK(negatedVector.y == -2);
+ CHECK(negatedVector.z == -3);
+ }
+ }
+
+ SECTION("Arithmetic operations between two vectors")
+ {
+ sf::Vector3i firstVector(2, 5, 6);
+ sf::Vector3i secondVector(8, 3, 7);
+
+ SECTION("vector += vector")
+ {
+ firstVector += secondVector;
+
+ CHECK(firstVector.x == 10);
+ CHECK(firstVector.y == 8);
+ CHECK(firstVector.z == 13);
+ }
+
+ SECTION("vector -= vector")
+ {
+ firstVector -= secondVector;
+
+ CHECK(firstVector.x == -6);
+ CHECK(firstVector.y == 2);
+ CHECK(firstVector.z == -1);
+ }
+
+ SECTION("vector + vector")
+ {
+ sf::Vector3i result = firstVector + secondVector;
+
+ CHECK(result.x == 10);
+ CHECK(result.y == 8);
+ CHECK(result.z == 13);
+ }
+
+ SECTION("vector - vector")
+ {
+ sf::Vector3i result = firstVector - secondVector;
+
+ CHECK(result.x == -6);
+ CHECK(result.y == 2);
+ CHECK(result.z == -1);
+ }
+ }
+
+ SECTION("Arithmetic operations between vector and scalar value")
+ {
+ sf::Vector3i vector(26, 12, 6);
+ int scalar = 2;
+
+ SECTION("vector * scalar")
+ {
+ sf::Vector3i result = vector * scalar;
+
+ CHECK(result.x == 52);
+ CHECK(result.y == 24);
+ CHECK(result.z == 12);
+ }
+
+ SECTION("scalar * vector")
+ {
+ sf::Vector3i result = scalar * vector;
+
+ CHECK(result.x == 52);
+ CHECK(result.y == 24);
+ CHECK(result.z == 12);
+ }
+
+ SECTION("vector *= scalar")
+ {
+ vector *= scalar;
+
+ CHECK(vector.x == 52);
+ CHECK(vector.y == 24);
+ CHECK(vector.z == 12);
+ }
+
+ SECTION("vector / scalar")
+ {
+ sf::Vector3i result = vector / scalar;
+
+ CHECK(result.x == 13);
+ CHECK(result.y == 6);
+ CHECK(result.z == 3);
+ }
+
+ SECTION("vector /= scalar")
+ {
+ vector /= scalar;
+
+ CHECK(vector.x == 13);
+ CHECK(vector.y == 6);
+ CHECK(vector.z == 3);
+ }
+ }
+
+ SECTION("Comparison operations (two equal and one different vector)")
+ {
+ sf::Vector3i firstEqualVector(1, 5, 6);
+ sf::Vector3i secondEqualVector(1, 5, 6);
+ sf::Vector3i differentVector(6, 9, 7);
+
+ SECTION("vector == vector")
+ {
+ CHECK(firstEqualVector == secondEqualVector);
+ CHECK_FALSE(firstEqualVector == differentVector);
+ }
+
+ SECTION("vector != vector")
+ {
+ CHECK(firstEqualVector != differentVector);
+ CHECK_FALSE(firstEqualVector != secondEqualVector);
+ }
+ }
+}
diff --git a/test/src/TestUtilities/GraphicsUtil.cpp b/test/src/TestUtilities/GraphicsUtil.cpp
new file mode 100644
index 0000000..e323bb7
--- /dev/null
+++ b/test/src/TestUtilities/GraphicsUtil.cpp
@@ -0,0 +1,19 @@
+// Note: No need to increase compile time by including TestUtilities/Graphics.hpp
+#include <SFML/Graphics/Color.hpp>
+#include <sstream>
+
+// String conversions for Catch framework
+namespace Catch
+{
+ std::string toString(const sf::Color& color)
+ {
+ std::ostringstream stream;
+ stream << "0x" << std::hex << color.toInteger() << std::dec
+ << " (r=" << static_cast<int>(color.r)
+ << ", g=" << static_cast<int>(color.g)
+ << ", b=" << static_cast<int>(color.b)
+ << ", a=" << static_cast<int>(color.a) << ")";
+
+ return stream.str();
+ }
+}
diff --git a/test/src/TestUtilities/GraphicsUtil.hpp b/test/src/TestUtilities/GraphicsUtil.hpp
new file mode 100644
index 0000000..2a792e4
--- /dev/null
+++ b/test/src/TestUtilities/GraphicsUtil.hpp
@@ -0,0 +1,23 @@
+// Header for SFML unit tests.
+//
+// For a new graphics module test case, include this header and not <catch.hpp> directly.
+// This ensures that string conversions are visible and can be used by Catch for debug output.
+
+#ifndef SFML_TESTUTILITIES_GRAPHICS_HPP
+#define SFML_TESTUTILITIES_GRAPHICS_HPP
+
+#include "WindowUtil.hpp"
+
+// Forward declarations for non-template types
+namespace sf
+{
+ class Color;
+}
+
+// String conversions for Catch framework
+namespace Catch
+{
+ std::string toString(const sf::Color& color);
+}
+
+#endif // SFML_TESTUTILITIES_GRAPHICS_HPP
diff --git a/test/src/TestUtilities/SystemUtil.cpp b/test/src/TestUtilities/SystemUtil.cpp
new file mode 100644
index 0000000..21a92d6
--- /dev/null
+++ b/test/src/TestUtilities/SystemUtil.cpp
@@ -0,0 +1,20 @@
+// Note: No need to increase compile time by including TestUtilities/System.hpp
+#include <SFML/System/String.hpp>
+#include <SFML/System/Time.hpp>
+#include <sstream>
+
+// String conversions for Catch framework
+namespace Catch
+{
+ std::string toString(const sf::String& string)
+ {
+ return string.toAnsiString();
+ }
+
+ std::string toString(sf::Time time)
+ {
+ std::ostringstream stream;
+ stream << time.asMicroseconds() << "us";
+ return stream.str();
+ }
+}
diff --git a/test/src/TestUtilities/SystemUtil.hpp b/test/src/TestUtilities/SystemUtil.hpp
new file mode 100644
index 0000000..8a48f22
--- /dev/null
+++ b/test/src/TestUtilities/SystemUtil.hpp
@@ -0,0 +1,45 @@
+// Header for SFML unit tests.
+//
+// For a new system module test case, include this header and not <catch.hpp> directly.
+// This ensures that string conversions are visible and can be used by Catch for debug output.
+
+#ifndef SFML_TESTUTILITIES_SYSTEM_HPP
+#define SFML_TESTUTILITIES_SYSTEM_HPP
+
+#include <catch.hpp>
+
+#include <SFML/System/Vector2.hpp>
+#include <SFML/System/Vector3.hpp>
+#include <sstream>
+
+// Forward declarations for non-template types
+namespace sf
+{
+ class String;
+ class Time;
+}
+
+// String conversions for Catch framework
+namespace Catch
+{
+ std::string toString(const sf::String& string);
+ std::string toString(sf::Time time);
+
+ template <typename T>
+ std::string toString(const sf::Vector2<T>& vector)
+ {
+ std::ostringstream stream;
+ stream << "(" << vector.x << ", " << vector.y << ")";
+ return stream.str();
+ }
+
+ template <typename T>
+ std::string toString(const sf::Vector3<T>& vector)
+ {
+ std::ostringstream stream;
+ stream << "(" << vector.x << ", " << vector.y << ", " << vector.z << ")";
+ return stream.str();
+ }
+}
+
+#endif // SFML_TESTUTILITIES_SYSTEM_HPP
diff --git a/test/src/TestUtilities/WindowUtil.cpp b/test/src/TestUtilities/WindowUtil.cpp
new file mode 100644
index 0000000..52b3635
--- /dev/null
+++ b/test/src/TestUtilities/WindowUtil.cpp
@@ -0,0 +1,14 @@
+// Note: No need to increase compile time by including TestUtilities/Window.hpp
+#include <SFML/Window/VideoMode.hpp>
+#include <sstream>
+
+// String conversions for Catch framework
+namespace Catch
+{
+ std::string toString(const sf::VideoMode& videoMode)
+ {
+ std::ostringstream stream;
+ stream << videoMode.width << "x" << videoMode.height << "x" << videoMode.bitsPerPixel;
+ return stream.str();
+ }
+}
diff --git a/test/src/TestUtilities/WindowUtil.hpp b/test/src/TestUtilities/WindowUtil.hpp
new file mode 100644
index 0000000..b0a9f21
--- /dev/null
+++ b/test/src/TestUtilities/WindowUtil.hpp
@@ -0,0 +1,33 @@
+// Header for SFML unit tests.
+//
+// For a new window module test case, include this header and not <catch.hpp> directly.
+// This ensures that string conversions are visible and can be used by Catch for debug output.
+
+#ifndef SFML_TESTUTILITIES_WINDOW_HPP
+#define SFML_TESTUTILITIES_WINDOW_HPP
+
+#include "SystemUtil.hpp"
+
+#include <SFML/Graphics/Rect.hpp>
+
+// Forward declarations for non-template types
+namespace sf
+{
+ class VideoMode;
+}
+
+// String conversions for Catch framework
+namespace Catch
+{
+ std::string toString(const sf::VideoMode& videoMode);
+
+ template <typename T>
+ std::string toString(const sf::Rect<T>& rect)
+ {
+ std::ostringstream stream;
+ stream << "(left=" << rect.left << ", top=" << rect.top << ", width=" << rect.width << ", height=" << rect.height << ")";
+ return stream.str();
+ }
+}
+
+#endif // SFML_TESTUTILITIES_WINDOW_HPP
diff --git a/tools/nsis/header.bmp b/tools/nsis/header.bmp
new file mode 100644
index 0000000..2fc7962
--- /dev/null
+++ b/tools/nsis/header.bmp
Binary files differ
diff --git a/tools/nsis/sfml.ico b/tools/nsis/sfml.ico
new file mode 100644
index 0000000..150d3ca
--- /dev/null
+++ b/tools/nsis/sfml.ico
Binary files differ
diff --git a/tools/nsis/sidebar.bmp b/tools/nsis/sidebar.bmp
new file mode 100644
index 0000000..ce5a6ac
--- /dev/null
+++ b/tools/nsis/sidebar.bmp
Binary files differ
diff --git a/tools/pkg-config/sfml-all.pc.in b/tools/pkg-config/sfml-all.pc.in
index dd2d4c3..3dba4f7 100644
--- a/tools/pkg-config/sfml-all.pc.in
+++ b/tools/pkg-config/sfml-all.pc.in
@@ -1,6 +1,6 @@
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=${prefix}
-libdir=${exec_prefix}/lib@LIB_SUFFIX@
+libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/include
Name: SFML-all
diff --git a/tools/pkg-config/sfml-audio.pc.in b/tools/pkg-config/sfml-audio.pc.in
index 7456daa..5440543 100644
--- a/tools/pkg-config/sfml-audio.pc.in
+++ b/tools/pkg-config/sfml-audio.pc.in
@@ -1,6 +1,6 @@
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=${prefix}
-libdir=${exec_prefix}/lib@LIB_SUFFIX@
+libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/include
Name: SFML-audio
diff --git a/tools/pkg-config/sfml-graphics.pc.in b/tools/pkg-config/sfml-graphics.pc.in
index d0a88a1..49326c4 100644
--- a/tools/pkg-config/sfml-graphics.pc.in
+++ b/tools/pkg-config/sfml-graphics.pc.in
@@ -1,6 +1,6 @@
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=${prefix}
-libdir=${exec_prefix}/lib@LIB_SUFFIX@
+libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/include
Name: SFML-graphics
diff --git a/tools/pkg-config/sfml-network.pc.in b/tools/pkg-config/sfml-network.pc.in
index 4381ca0..c019935 100644
--- a/tools/pkg-config/sfml-network.pc.in
+++ b/tools/pkg-config/sfml-network.pc.in
@@ -1,6 +1,6 @@
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=${prefix}
-libdir=${exec_prefix}/lib@LIB_SUFFIX@
+libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/include
Name: SFML-network
diff --git a/tools/pkg-config/sfml-system.pc.in b/tools/pkg-config/sfml-system.pc.in
index 647ab53..285852d 100644
--- a/tools/pkg-config/sfml-system.pc.in
+++ b/tools/pkg-config/sfml-system.pc.in
@@ -1,6 +1,6 @@
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=${prefix}
-libdir=${exec_prefix}/lib@LIB_SUFFIX@
+libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/include
Name: SFML-system
diff --git a/tools/pkg-config/sfml-window.pc.in b/tools/pkg-config/sfml-window.pc.in
index b0266e6..34311da 100644
--- a/tools/pkg-config/sfml-window.pc.in
+++ b/tools/pkg-config/sfml-window.pc.in
@@ -1,6 +1,6 @@
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=${prefix}
-libdir=${exec_prefix}/lib@LIB_SUFFIX@
+libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/include
Name: SFML-window
diff --git a/tools/windows/resource.rc.in b/tools/windows/resource.rc.in
new file mode 100644
index 0000000..944fcc9
--- /dev/null
+++ b/tools/windows/resource.rc.in
@@ -0,0 +1,63 @@
+#include "winresrc.h"
+
+#define VER_COMPANYNAME_STR "\0"
+#define VER_LEGALCOPYRIGHT_STR "Copyright (C) 2007-@RC_CURRENT_YEAR@ Laurent Gomila\0"
+#define VER_FILEDESCRIPTION_STR "SFML @RC_MODULE_NAME@ Module\0"
+#define VER_PRODUCTNAME_STR "Simple and Fast Multimedia Library\0"
+
+#define VER_FILEVERSION @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_PATCH@,0
+#define VER_FILEVERSION_STR "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@@RC_VERSION_SUFFIX@\0"
+
+#define VER_PRODUCTVERSION @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_PATCH@,0
+#define VER_PRODUCTVERSION_STR "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@@RC_VERSION_SUFFIX@\0"
+
+#ifndef DEBUG
+ #define VER_INTERNALNAME_STR "@RC_TARGET_NAME@@RC_TARGET_FILE_NAME_SUFFIX@\0"
+ #define VER_ORIGINALFILENAME_STR "@RC_TARGET_NAME@@RC_TARGET_FILE_NAME_SUFFIX@\0"
+#else
+ #define VER_INTERNALNAME_STR "@RC_TARGET_NAME@-d@RC_TARGET_FILE_NAME_SUFFIX@\0"
+ #define VER_ORIGINALFILENAME_STR "@RC_TARGET_NAME@-d@RC_TARGET_FILE_NAME_SUFFIX@\0"
+#endif
+
+#if @RC_PRERELEASE@
+ #define VER_PRERELEASE 0
+#else
+ #define VER_PRERELEASE VS_FF_PRERELEASE
+#endif
+
+#ifndef DEBUG
+ #define VER_DEBUG 0
+#else
+ #define VER_DEBUG VS_FF_DEBUG
+#endif
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION VER_FILEVERSION
+PRODUCTVERSION VER_PRODUCTVERSION
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+FILEFLAGS (VER_PRERELEASE | VER_DEBUG)
+FILEOS VOS_NT
+FILETYPE VFT_DLL
+FILESUBTYPE VFT2_UNKNOWN
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "CompanyName", VER_COMPANYNAME_STR
+ VALUE "FileDescription", VER_FILEDESCRIPTION_STR
+ VALUE "FileVersion", VER_FILEVERSION_STR
+ VALUE "InternalName", VER_INTERNALNAME_STR
+ VALUE "LegalCopyright", VER_LEGALCOPYRIGHT_STR
+ VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR
+ VALUE "ProductName", VER_PRODUCTNAME_STR
+ VALUE "ProductVersion", VER_PRODUCTVERSION_STR
+ END
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1252 //en-US
+ END
+END
diff --git a/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp
new file mode 100644
index 0000000..0a009e5
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp
@@ -0,0 +1,43 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
+// Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef RESOURCE_PATH_HPP
+#define RESOURCE_PATH_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <string>
+
+////////////////////////////////////////////////////////////
+/// \brief Return the path to the resource folder.
+///
+/// \return The path to the resource folder associate
+/// with the main bundle or an empty string is there is no bundle.
+///
+////////////////////////////////////////////////////////////
+std::string resourcePath(void);
+
+#endif
diff --git a/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm
new file mode 100644
index 0000000..cd6bd78
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm
@@ -0,0 +1,52 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
+// Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include "ResourcePath.hpp"
+#import <Foundation/Foundation.h>
+
+////////////////////////////////////////////////////////////
+std::string resourcePath(void)
+{
+ NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+
+ std::string rpath;
+ NSBundle* bundle = [NSBundle mainBundle];
+
+ if (bundle == nil) {
+#ifdef DEBUG
+ NSLog(@"bundle is nil... thus no resources path can be found.");
+#endif
+ } else {
+ NSString* path = [bundle resourcePath];
+ rpath = [path UTF8String] + std::string("/");
+ }
+
+ [pool drain];
+
+ return rpath;
+}
diff --git a/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateIcon.icns b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateIcon.icns
new file mode 100644
index 0000000..1aaf19b
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateIcon.icns
Binary files differ
diff --git a/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in
new file mode 100644
index 0000000..3592607
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+
+<!--
+SFML - Simple and Fast Multimedia Library
+Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
+ Laurent Gomila (laurent@sfml-dev.org)
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment
+ in the product documentation would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such,
+ and must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.
+-->
+
+<!--
+ This template can create a SFML 2 Bundle Application project.
+ -->
+
+<plist version="1.0">
+ <dict>
+ <!--
+ BASIC INFO
+ -->
+ <key>Identifier</key>
+ <string>org.sfml-dev.app</string>
+
+ <key>Concrete</key>
+ <true />
+
+ <key>Description</key>
+ <string>This template creates a SFML Application Bundle.</string>
+
+ <key>Kind</key>
+ <string>Xcode.Xcode3.ProjectTemplateUnitKind</string>
+
+ <key>Ancestors</key>
+ <array>
+ <string>org.sfml-dev.bundle</string>
+ <string>org.sfml-dev.compiler</string>
+ <string>org.sfml-dev.linker</string>
+ </array>
+
+ <!--
+ FILES
+ -->
+ <key>Nodes</key>
+ <array>
+ <string>ResourcePath.mm</string>
+ <string>ResourcePath.hpp</string>
+ <string>main.cpp</string>
+ <string>background.jpg</string>
+ <string>doodle_pop.ogg</string>
+ <string>tuffy.ttf</string>
+ <string>icon.png</string>
+ </array>
+
+ <!--
+ DEFINITIONS
+ -->
+ <key>Definitions</key>
+ <dict>
+ <!-- RESOURCE PATH -->
+ <key>ResourcePath.mm</key>
+ <dict>
+ <key>Path</key>
+ <string>ResourcePath.mm</string>
+ </dict>
+ <key>ResourcePath.hpp</key>
+ <dict>
+ <key>Path</key>
+ <string>ResourcePath.hpp</string>
+ <key>TargetIndices</key>
+ <array /> <!-- don't copy it to "Resources" ! -->
+ </dict>
+
+ <!-- MAIN -->
+ <key>main.cpp</key>
+ <dict>
+ <key>Path</key>
+ <string>main.cpp</string>
+ </dict>
+
+ <!-- RESOURCES -->
+ <key>background.jpg</key>
+ <dict>
+ <key>Path</key>
+ <string>background.jpg</string>
+ <key>Group</key>
+ <string>Resources</string>
+ </dict>
+
+ <key>doodle_pop.ogg</key>
+ <dict>
+ <key>Path</key>
+ <string>doodle_pop.ogg</string>
+ <key>Group</key>
+ <string>Resources</string>
+ </dict>
+
+ <key>tuffy.ttf</key>
+ <dict>
+ <key>Path</key>
+ <string>tuffy.ttf</string>
+ <key>Group</key>
+ <string>Resources</string>
+ </dict>
+
+ <key>icon.png</key>
+ <dict>
+ <key>Path</key>
+ <string>icon.png</string>
+ <key>Group</key>
+ <string>Resources</string>
+ </dict>
+ </dict>
+
+ <!--
+ COPY LIBRARY PHASE
+ -->
+ <key>Targets</key>
+ <array>
+ <dict>
+ <key>BuildPhases</key>
+ <array>
+ <dict>
+ <key>Class</key>
+ <string>ShellScript</string>
+
+ <key>ShellPath</key>
+ <string>/bin/sh</string>
+
+ <key>ShellScript</key>
+ <string># This shell script simply copies required SFML dylibs/frameworks into the application bundle frameworks folder.
+# If you're using static libraries (which is not recommended) you should remove this script from your project.
+
+# SETTINGS
+SFML_DEPENDENCIES_INSTALL_PREFIX="@SFML_DEPENDENCIES_INSTALL_PREFIX@"
+CMAKE_INSTALL_FRAMEWORK_PREFIX="@CMAKE_INSTALL_PREFIX@"
+CMAKE_INSTALL_LIB_PREFIX="@CMAKE_INSTALL_PREFIX@/lib"
+FRAMEWORKS_FULL_PATH="$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/"
+
+# Are we building a project that uses frameworks or dylibs?
+case "$SFML_BINARY_TYPE" in
+ DYLIBS)
+ frameworks="false"
+ ;;
+ *)
+ frameworks="true"
+ ;;
+esac
+
+# Echoes to stderr
+error () # $* message to display
+{
+ echo $* 1>&amp;2
+ exit 2
+}
+
+assert () # $1 is a boolean, $2...N is an error message
+{
+ if [ $# -lt 2 ]
+ then
+ error "Internal error in assert: not enough args"
+ fi
+
+ if [ $1 -ne 0 ]
+ then
+ shift
+ error "$*"
+ fi
+}
+
+force_remove () # $@ is some paths
+{
+ test $# -ge 1
+ assert $? "force_remove() requires at least one parameter"
+ rm -fr $@
+ assert $? "couldn't remove $@"
+}
+
+copy () # $1 is a source, $2 is a destination
+{
+ test $# -eq 2
+ assert $? "copy() requires two parameters"
+ ditto "$1" "$2"
+ assert $? "couldn't copy $1 to $2"
+}
+
+require () # $1 is a SFML module like 'system' or 'audio'
+{
+ dest="$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/"
+
+ if [ -z "$1" ]
+ then
+ error "require() requires one parameter!"
+ else
+ # clean potentially old stuff
+ force_remove "$dest/libsfml-$1"*
+ force_remove "$dest/sfml-$1.framework"
+
+ # copy SFML libraries
+ if [ "$frameworks" = "true" ]
+ then
+ source="$CMAKE_INSTALL_FRAMEWORK_PREFIX/sfml-$1.framework"
+ target="sfml-$1.framework"
+ elif [ "$SFML_LINK_DYLIBS_SUFFIX" = "-d" ]
+ then
+ source="$CMAKE_INSTALL_LIB_PREFIX/libsfml-$1-d.dylib"
+ target="`readlink $source`"
+ else
+ source="$CMAKE_INSTALL_LIB_PREFIX/libsfml-$1.dylib"
+ target="`readlink $source`"
+ fi
+
+ copy "$source" "$dest/$target"
+
+ # copy extra dependencies
+ if [ "$1" = "audio" ]
+ then
+ # copy "FLAC" "ogg" "vorbis" "vorbisenc" "vorbisfile" "OpenAL" frameworks too
+ for f in "FLAC" "ogg" "vorbis" "vorbisenc" "vorbisfile" "OpenAL"
+ do
+ copy "$SFML_DEPENDENCIES_INSTALL_PREFIX/$f.framework" "$dest/$f.framework"
+ done
+ elif [ "$1" = "graphics" ]
+ then
+ copy "$SFML_DEPENDENCIES_INSTALL_PREFIX/freetype.framework" "$dest/freetype.framework"
+ fi
+ fi
+}
+
+if [ -n "$SFML_SYSTEM" ]
+then
+ require "system"
+fi
+
+if [ -n "$SFML_AUDIO" ]
+then
+ require "audio"
+fi
+
+if [ -n "$SFML_NETWORK" ]
+then
+ require "network"
+fi
+
+if [ -n "$SFML_WINDOW" ]
+then
+ require "window"
+fi
+
+if [ -n "$SFML_GRAPHICS" ]
+then
+ require "graphics"
+fi
+
+ </string>
+
+ <key>RunOnlyForDeploymentPostprocessing</key>
+ <string>NO</string>
+ </dict>
+ </array>
+ </dict>
+ </array>
+ </dict>
+</plist>
diff --git a/tools/xcode/templates/SFML/SFML App.xctemplate/background.jpg b/tools/xcode/templates/SFML/SFML App.xctemplate/background.jpg
new file mode 100644
index 0000000..bdf133d
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML App.xctemplate/background.jpg
Binary files differ
diff --git a/tools/xcode/templates/SFML/SFML App.xctemplate/doodle_pop.ogg b/tools/xcode/templates/SFML/SFML App.xctemplate/doodle_pop.ogg
new file mode 100644
index 0000000..555ea34
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML App.xctemplate/doodle_pop.ogg
Binary files differ
diff --git a/tools/xcode/templates/SFML/SFML App.xctemplate/icon.png b/tools/xcode/templates/SFML/SFML App.xctemplate/icon.png
new file mode 100644
index 0000000..10aa70b
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML App.xctemplate/icon.png
Binary files differ
diff --git a/tools/xcode/templates/SFML/SFML App.xctemplate/main.cpp b/tools/xcode/templates/SFML/SFML App.xctemplate/main.cpp
new file mode 100644
index 0000000..129ff88
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML App.xctemplate/main.cpp
@@ -0,0 +1,91 @@
+
+//
+// Disclaimer:
+// ----------
+//
+// This code will work only if you selected window, graphics and audio.
+//
+// Note that the "Run Script" build phase will copy the required frameworks
+// or dylibs to your application bundle so you can execute it on any OS X
+// computer.
+//
+// Your resource files (images, sounds, fonts, ...) are also copied to your
+// application bundle. To get the path to these resources, use the helper
+// function `resourcePath()` from ResourcePath.hpp
+//
+
+#include <SFML/Audio.hpp>
+#include <SFML/Graphics.hpp>
+
+// Here is a small helper for you! Have a look.
+#include "ResourcePath.hpp"
+
+int main(int, char const**)
+{
+ // Create the main window
+ sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
+
+ // Set the Icon
+ sf::Image icon;
+ if (!icon.loadFromFile(resourcePath() + "icon.png")) {
+ return EXIT_FAILURE;
+ }
+ window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr());
+
+ // Load a sprite to display
+ sf::Texture texture;
+ if (!texture.loadFromFile(resourcePath() + "background.jpg")) {
+ return EXIT_FAILURE;
+ }
+ sf::Sprite sprite(texture);
+
+ // Create a graphical text to display
+ sf::Font font;
+ if (!font.loadFromFile(resourcePath() + "tuffy.ttf")) {
+ return EXIT_FAILURE;
+ }
+ sf::Text text("Hello SFML", font, 50);
+ text.setFillColor(sf::Color::Black);
+
+ // Load a music to play
+ sf::Music music;
+ if (!music.openFromFile(resourcePath() + "doodle_pop.ogg")) {
+ return EXIT_FAILURE;
+ }
+
+ // Play the music
+ music.play();
+
+ // Start the game loop
+ while (window.isOpen())
+ {
+ // Process events
+ sf::Event event;
+ while (window.pollEvent(event))
+ {
+ // Close window: exit
+ if (event.type == sf::Event::Closed) {
+ window.close();
+ }
+
+ // Escape pressed: exit
+ if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) {
+ window.close();
+ }
+ }
+
+ // Clear screen
+ window.clear();
+
+ // Draw the sprite
+ window.draw(sprite);
+
+ // Draw the string
+ window.draw(text);
+
+ // Update the window
+ window.display();
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/tools/xcode/templates/SFML/SFML App.xctemplate/tuffy.ttf b/tools/xcode/templates/SFML/SFML App.xctemplate/tuffy.ttf
new file mode 100755
index 0000000..8ea6470
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML App.xctemplate/tuffy.ttf
Binary files differ
diff --git a/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist
new file mode 100644
index 0000000..db9ef1f
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+
+<!--
+SFML - Simple and Fast Multimedia Library
+Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
+ Laurent Gomila (laurent@sfml-dev.org)
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment
+ in the product documentation would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such,
+ and must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.
+ -->
+
+<!--
+ This template defines :
+ - the product name
+ - the organization name
+ - the bundle prefix
+ -->
+
+<plist version="1.0">
+ <dict>
+ <!--
+ BASIC INFO
+ -->
+ <key>Identifier</key>
+ <string>org.sfml-dev.base</string>
+
+ <key>Kind</key>
+ <string>Xcode.Xcode3.ProjectTemplateUnitKind</string>
+
+ <key>Platforms</key>
+ <array>
+ <string>com.apple.platform.macosx</string>
+ </array>
+
+ <!--
+ OPTIONS
+ -->
+ <key>Options</key>
+ <array>
+ <dict>
+ <key>Identifier</key>
+ <string>productName</string>
+ <key>Required</key>
+ <true />
+ <key>Name</key>
+ <string>Product Name</string>
+ <key>NotPersisted</key>
+ <true />
+ <key>Description</key>
+ <string>Your new product&apos;s name</string>
+ <key>EmptyReplacement</key>
+ <string>ProductName</string>
+ <key>Type</key>
+ <string>text</string>
+ </dict>
+
+ <dict>
+ <key>Identifier</key>
+ <string>organizationName</string>
+ <key>Name</key>
+ <string>Organization Name</string>
+ <key>Description</key>
+ <string>Your company&apos;s name</string>
+ <key>Type</key>
+ <string>text</string>
+ <key>Default</key>
+ <string>___FULLUSERNAME___</string>
+ </dict>
+
+ <dict>
+ <key>Identifier</key>
+ <string>bundleIdentifierPrefix</string>
+ <key>Required</key>
+ <true />
+ <key>Name</key>
+ <string>Company Identifier</string>
+ <key>Description</key>
+ <string>Your company&apos;s bundle identifier prefix</string>
+ <key>EmptyReplacement</key>
+ <string>com.yourcompany</string>
+ <key>Type</key>
+ <string>text</string>
+ </dict>
+
+ <dict>
+ <key>Identifier</key>
+ <string>bundleIdentifier</string>
+ <key>Name</key>
+ <string>Bundle Identifier</string>
+ <key>NotPersisted</key>
+ <true />
+ <key>Description</key>
+ <string>Your new product&apos;s bundle identifier</string>
+ <key>Default</key>
+ <string>___VARIABLE_bundleIdentifierPrefix:bundleIdentifier___.___VARIABLE_productName:RFC1034Identifier___</string>
+ <key>Type</key>
+ <string>static</string>
+ </dict>
+ </array>
+ </dict>
+</plist>
diff --git a/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist
new file mode 100644
index 0000000..8fc682c
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+
+<!--
+SFML - Simple and Fast Multimedia Library
+Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
+ Laurent Gomila (laurent@sfml-dev.org)
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment
+ in the product documentation would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such,
+ and must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.
+ -->
+
+<!--
+ This template defines :
+ - the bundle properties (plist)
+ - the target type (.app)
+ - the build phases
+ -->
+
+<plist version="1.0">
+ <dict>
+ <!--
+ BASIC INFO
+ -->
+ <key>Identifier</key>
+ <string>org.sfml-dev.bundle</string>
+
+ <key>Kind</key>
+ <string>Xcode.Xcode3.ProjectTemplateUnitKind</string>
+
+ <key>Ancestors</key>
+ <array>
+ <string>org.sfml-dev.base</string>
+ </array>
+
+ <!--
+ FILES
+ -->
+ <key>Nodes</key>
+ <array>
+ <string>___PACKAGENAME___-Info.plist:Content</string>
+ </array>
+
+ <!--
+ DEFINITIONS
+ -->
+ <key>Definitions</key>
+ <dict>
+ <key>___PACKAGENAME___-Info.plist:Content</key> <!-- TODO add more fields here -->
+ <string>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
+&lt;plist version=&quot;1.0&quot;&gt;
+&lt;dict&gt;
+ &lt;key&gt;CFBundleIdentifier&lt;/key&gt;
+ &lt;string&gt;___VARIABLE_bundleIdentifierPrefix:bundleIdentifier___.${PRODUCT_NAME:rfc1034identifier}&lt;/string&gt;
+ &lt;key&gt;CFBundleDevelopmentRegion&lt;/key&gt;
+ &lt;string&gt;en&lt;/string&gt;
+ &lt;key&gt;CFBundleExecutable&lt;/key&gt;
+ &lt;string&gt;${EXECUTABLE_NAME}&lt;/string&gt;
+ &lt;key&gt;CFBundleIconFile&lt;/key&gt;
+ &lt;string&gt;&lt;/string&gt;
+ &lt;key&gt;CFBundleInfoDictionaryVersion&lt;/key&gt;
+ &lt;string&gt;6.0&lt;/string&gt;
+ &lt;key&gt;CFBundleName&lt;/key&gt;
+ &lt;string&gt;${PRODUCT_NAME}&lt;/string&gt;
+ &lt;key&gt;CFBundlePackageType&lt;/key&gt;
+ &lt;string&gt;APPL&lt;/string&gt;
+ &lt;key&gt;CFBundleSignature&lt;/key&gt;
+ &lt;string&gt;????&lt;/string&gt;
+ &lt;key&gt;NSHighResolutionCapable&lt;/key&gt;
+ &lt;true/&gt;
+&lt;/dict&gt;
+&lt;/plist&gt;
+</string>
+
+ <key>___PACKAGENAME___-Info.plist</key>
+ <dict>
+ <key>Group</key>
+ <string>Supporting Files</string>
+ <key>TargetIndices</key>
+ <array />
+ <key>SubstituteMacros</key>
+ <true />
+ </dict>
+ </dict>
+
+ <!--
+ TARGET
+ -->
+ <key>Targets</key>
+ <array>
+ <dict>
+ <key>BuildPhases</key>
+ <array>
+ <dict>
+ <key>Class</key>
+ <string>Sources</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>Frameworks</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>Resources</string>
+ </dict>
+ </array>
+
+ <key>ProductType</key>
+ <string>com.apple.product-type.application</string>
+
+ <key>SharedSettings</key>
+ <dict>
+ <key>INFOPLIST_FILE</key>
+ <string>___PACKAGENAME___/___PACKAGENAME___-Info.plist</string>
+
+ <key>LD_RUNPATH_SEARCH_PATHS</key>
+ <string>@loader_path/../Frameworks</string>
+ </dict>
+ </dict>
+ </array>
+ </dict>
+</plist>
diff --git a/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateIcon.icns b/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateIcon.icns
new file mode 100644
index 0000000..1aaf19b
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateIcon.icns
Binary files differ
diff --git a/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist
new file mode 100644
index 0000000..ef3605a
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+
+<!--
+SFML - Simple and Fast Multimedia Library
+Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
+ Laurent Gomila (laurent@sfml-dev.org)
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment
+ in the product documentation would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such,
+ and must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.
+-->
+
+<!--
+ This template can create a SFML 2 Command Line Tool project.
+ -->
+
+<plist version="1.0">
+ <dict>
+ <!--
+ BASIC INFO
+ -->
+ <key>Identifier</key>
+ <string>org.sfml-dev.clt</string>
+
+ <key>Concrete</key>
+ <true />
+
+ <key>Description</key>
+ <string>This template creates a SFML Command Line Tool.</string>
+
+ <key>Kind</key>
+ <string>Xcode.Xcode3.ProjectTemplateUnitKind</string>
+
+ <key>Ancestors</key>
+ <array>
+ <string>org.sfml-dev.base</string>
+ <string>org.sfml-dev.compiler</string>
+ <string>org.sfml-dev.linker</string>
+ </array>
+
+ <!--
+ FILES
+ -->
+ <key>Nodes</key>
+ <array>
+ <string>main.cpp</string>
+ <string>background.jpg</string>
+ <string>doodle_pop.ogg</string>
+ <string>tuffy.ttf</string>
+ <string>icon.png</string>
+ </array>
+
+ <!--
+ DEFINITIONS
+ -->
+ <key>Definitions</key>
+ <dict>
+ <!-- MAIN -->
+ <key>main.cpp</key>
+ <dict>
+ <key>Path</key>
+ <string>main.cpp</string>
+ </dict>
+
+ <!-- RESOURCES -->
+ <key>background.jpg</key>
+ <dict>
+ <key>Path</key>
+ <string>background.jpg</string>
+ <key>Group</key>
+ <string>Resources</string>
+ </dict>
+
+ <key>doodle_pop.ogg</key>
+ <dict>
+ <key>Path</key>
+ <string>doodle_pop.ogg</string>
+ <key>Group</key>
+ <string>Resources</string>
+ </dict>
+
+ <key>tuffy.ttf</key>
+ <dict>
+ <key>Path</key>
+ <string>tuffy.ttf</string>
+ <key>Group</key>
+ <string>Resources</string>
+ </dict>
+
+ <key>icon.png</key>
+ <dict>
+ <key>Path</key>
+ <string>icon.png</string>
+ <key>Group</key>
+ <string>Resources</string>
+ </dict>
+ </dict>
+
+ <!--
+ TARGET
+ -->
+ <key>Targets</key>
+ <array>
+ <dict>
+ <key>BuildPhases</key>
+ <array>
+ <dict>
+ <key>Class</key>
+ <string>Sources</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>Frameworks</string>
+ </dict>
+ </array>
+
+ <key>ProductType</key>
+ <string>com.apple.product-type.tool</string>
+ </dict>
+ </array>
+ </dict>
+</plist>
diff --git a/tools/xcode/templates/SFML/SFML CLT.xctemplate/background.jpg b/tools/xcode/templates/SFML/SFML CLT.xctemplate/background.jpg
new file mode 100644
index 0000000..bdf133d
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML CLT.xctemplate/background.jpg
Binary files differ
diff --git a/tools/xcode/templates/SFML/SFML CLT.xctemplate/doodle_pop.ogg b/tools/xcode/templates/SFML/SFML CLT.xctemplate/doodle_pop.ogg
new file mode 100644
index 0000000..555ea34
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML CLT.xctemplate/doodle_pop.ogg
Binary files differ
diff --git a/tools/xcode/templates/SFML/SFML CLT.xctemplate/icon.png b/tools/xcode/templates/SFML/SFML CLT.xctemplate/icon.png
new file mode 100644
index 0000000..10aa70b
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML CLT.xctemplate/icon.png
Binary files differ
diff --git a/tools/xcode/templates/SFML/SFML CLT.xctemplate/main.cpp b/tools/xcode/templates/SFML/SFML CLT.xctemplate/main.cpp
new file mode 100644
index 0000000..666cf9a
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML CLT.xctemplate/main.cpp
@@ -0,0 +1,89 @@
+
+//
+// Disclaimer:
+// ----------
+//
+// This code will work only if you selected window, graphics and audio.
+//
+// In order to load the resources like background.png, you have to set up
+// your target scheme:
+//
+// - Select "Edit Schemeā€¦" in the "Product" menu;
+// - Check the box "use custom working directory";
+// - Fill the text field with the folder path containing your resources;
+// (e.g. your project folder)
+// - Click OK.
+//
+
+#include <SFML/Audio.hpp>
+#include <SFML/Graphics.hpp>
+
+int main(int argc, char const** argv)
+{
+ // Create the main window
+ sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
+
+ // Set the Icon
+ sf::Image icon;
+ if (!icon.loadFromFile("icon.png")) {
+ return EXIT_FAILURE;
+ }
+ window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr());
+
+ // Load a sprite to display
+ sf::Texture texture;
+ if (!texture.loadFromFile("background.jpg")) {
+ return EXIT_FAILURE;
+ }
+ sf::Sprite sprite(texture);
+
+ // Create a graphical text to display
+ sf::Font font;
+ if (!font.loadFromFile("tuffy.ttf")) {
+ return EXIT_FAILURE;
+ }
+ sf::Text text("Hello SFML", font, 50);
+ text.setFillColor(sf::Color::Black);
+
+ // Load a music to play
+ sf::Music music;
+ if (!music.openFromFile("doodle_pop.ogg")) {
+ return EXIT_FAILURE;
+ }
+
+ // Play the music
+ music.play();
+
+ // Start the game loop
+ while (window.isOpen())
+ {
+ // Process events
+ sf::Event event;
+ while (window.pollEvent(event))
+ {
+ // Close window: exit
+ if (event.type == sf::Event::Closed) {
+ window.close();
+ }
+
+ // Escape pressed: exit
+ if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) {
+ window.close();
+ }
+ }
+
+ // Clear screen
+ window.clear();
+
+ // Draw the sprite
+ window.draw(sprite);
+
+ // Draw the string
+ window.draw(text);
+
+ // Update the window
+ window.display();
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/tools/xcode/templates/SFML/SFML CLT.xctemplate/tuffy.ttf b/tools/xcode/templates/SFML/SFML CLT.xctemplate/tuffy.ttf
new file mode 100755
index 0000000..8ea6470
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML CLT.xctemplate/tuffy.ttf
Binary files differ
diff --git a/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in b/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in
new file mode 100644
index 0000000..f7855ab
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+
+<!--
+SFML - Simple and Fast Multimedia Library
+Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
+ Laurent Gomila (laurent@sfml-dev.org)
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment
+ in the product documentation would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such,
+ and must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.
+ -->
+
+<!--
+ This template defines :
+ - the compiler & std lib
+ - the supported arch (only 64 bit)
+ - some other target's settings (e.g. warnings flags)
+ - the search paths
+ - deployment target (according to CMake build settings)
+ -->
+
+<plist version="1.0">
+ <dict>
+ <!--
+ BASIC INFO
+ -->
+ <key>Identifier</key>
+ <string>org.sfml-dev.compiler</string>
+
+ <key>Kind</key>
+ <string>Xcode.Xcode3.ProjectTemplateUnitKind</string>
+
+ <!--
+ SETTINGS
+ -->
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <!-- PLATFORM -->
+ <key>SUPPORTED_PLATFORMS</key>
+ <string>macosx</string>
+
+ <!-- Compiler & std lib -->
+ <key>GCC_VERSION</key>
+ <string>com.apple.compilers.llvm.clang.1_0</string>
+
+ <key>CLANG_CXX_LANGUAGE_STANDARD</key>
+ <string>c++11</string>
+
+ <key>CLANG_CXX_LIBRARY</key>
+ <string>libc++</string>
+
+ <!-- ARCHITECTURES -->
+ <key>ARCHS</key>
+ <string>@XCODE_TEMPLATES_ARCH@</string>
+
+ <!-- DEPLOYMENT -->
+ <key>MACOSX_DEPLOYMENT_TARGET</key>
+ <string>@CMAKE_OSX_DEPLOYMENT_TARGET@</string>
+
+ <!-- SERACH PATHS -->
+ <key>FRAMEWORK_SEARCH_PATHS</key>
+ <string> /Library/Frameworks/ $(inherited) </string>
+
+ <key>HEADER_SEARCH_PATHS</key>
+ <string> /usr/local/include/ $(inherited) </string>
+
+ <key>LIBRARY_SEARCH_PATHS</key>
+ <string> /usr/local/lib/ $(inherited) </string>
+ </dict>
+
+ <key>Configurations</key>
+ <dict>
+ <key>Debug</key>
+ <dict>
+ </dict>
+
+ <key>Release</key>
+ <dict>
+ </dict>
+ </dict>
+ </dict>
+
+ <!--
+ TARGET
+ -->
+ <key>Targets</key>
+ <array>
+ <dict>
+ <key>Name</key>
+ <string>___PACKAGENAME___</string>
+
+ <key>SharedSettings</key>
+ <dict>
+ <key>PRODUCT_NAME</key>
+ <string>$(TARGET_NAME)</string>
+ </dict>
+
+ <key>Configurations</key>
+ <dict>
+ <key>Debug</key>
+ <dict />
+ <key>Release</key>
+ <dict />
+ </dict>
+ </dict>
+ </array>
+ </dict>
+</plist>
diff --git a/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist
new file mode 100644
index 0000000..d7efb08
--- /dev/null
+++ b/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist
@@ -0,0 +1,362 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+
+<!--
+SFML - Simple and Fast Multimedia Library
+Copyright (C) 2007-2023 Marco Antognini (antognini.marco@gmail.com),
+ Laurent Gomila (laurent@sfml-dev.org)
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment
+ in the product documentation would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such,
+ and must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.
+-->
+
+<!--
+ This template defines :
+ - whether the project uses dylibs or frameworks
+ - which modules are used
+ - how the project links against those modules
+ -->
+
+<plist version="1.0">
+ <dict>
+ <!--
+ BASIC INFO
+ -->
+ <key>Identifier</key>
+ <string>org.sfml-dev.linker</string>
+
+ <key>Kind</key>
+ <string>Xcode.Xcode3.ProjectTemplateUnitKind</string>
+
+ <!--
+ OPTIONS
+ -->
+ <key>Options</key>
+ <array>
+ <!-- BINARY TYPE -->
+ <dict>
+ <key>Identifier</key>
+ <string>binaryType</string>
+
+ <key>Name</key>
+ <string>[ADVANCED] SFML binaries</string>
+
+ <key>Description</key>
+ <string>Choose between dylibs and frameworks. If you're not sure, keep the default value.</string>
+
+ <key>Default</key>
+ <string>Frameworks</string>
+
+ <key>NotPersisted</key>
+ <true />
+
+ <key>Type</key>
+ <string>popup</string>
+
+ <key>Units</key>
+ <dict>
+ <!-- Use frameworks -->
+ <key>Frameworks</key>
+ <dict>
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <key>SFML_BINARY_TYPE</key>
+ <string>FRAMEWORKS</string>
+
+ <key>SFML_LINK_DYLIBS_SUFFIX</key>
+ <string></string>
+ </dict>
+ </dict>
+ </dict>
+
+ <!-- Use dylibs -->
+ <key>Dylibs</key>
+ <dict>
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <key>SFML_BINARY_TYPE</key>
+ <string>DYLIBS</string>
+
+ <key>SFML_LINK_DYLIBS_SUFFIX</key>
+ <string></string>
+ </dict>
+ </dict>
+ </dict>
+
+ <!-- Use dylibs (debug) -->
+ <key>Dylibs (debug)</key>
+ <dict>
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <key>SFML_BINARY_TYPE</key>
+ <string>DYLIBS</string>
+ </dict>
+
+ <key>Configurations</key>
+ <dict>
+ <key>Debug</key>
+ <dict>
+ <key>SFML_LINK_DYLIBS_SUFFIX</key>
+ <string>-d</string>
+ </dict>
+
+ <key>Release</key>
+ <dict>
+ <key>SFML_LINK_DYLIBS_SUFFIX</key>
+ <string></string>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+
+ <!-- WINDOW MODULE -->
+ <dict>
+ <key>Identifier</key>
+ <string>windowModule</string>
+
+ <key>Name</key>
+ <string>Use window module</string>
+
+ <key>Description</key>
+ <string>Indicates whether window module should be used or not.</string>
+
+ <key>Type</key>
+ <string>checkbox</string>
+
+ <key>Default</key>
+ <string>true</string>
+
+ <key>Units</key>
+ <dict>
+ <!-- WINDOW MODULE : YES -->
+ <key>true</key>
+ <dict>
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <key>SFML_WINDOW</key>
+ <string>$(SFML_LINK_PREFIX) sfml-window$(SFML_LINK_SUFFIX)</string>
+ </dict>
+ </dict>
+ </dict>
+
+ <!-- WINDOW MODULE : NO -->
+ <key>false</key>
+ <dict>
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <key>SFML_WINDOW</key>
+ <string></string>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+
+ <!-- GRAPHICS MODULE -->
+ <dict>
+ <key>Identifier</key>
+ <string>graphicsModule</string>
+
+ <key>Name</key>
+ <string>Use graphics module</string>
+
+ <key>Description</key>
+ <string>Indicates whether graphics module should be used or not.</string>
+
+ <key>RequiredOptions</key>
+ <dict>
+ <key>windowModule</key>
+ <string>true</string>
+ </dict>
+
+ <key>Type</key>
+ <string>checkbox</string>
+
+ <key>Default</key>
+ <string>true</string>
+
+ <key>Units</key>
+ <dict>
+ <!-- GRAPHICS MODULE : YES -->
+ <key>true</key>
+ <dict>
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <key>SFML_GRAPHICS</key>
+ <string>$(SFML_LINK_PREFIX) sfml-graphics$(SFML_LINK_SUFFIX)</string>
+ </dict>
+ </dict>
+ </dict>
+
+ <!-- GRAPHICS MODULE : NO -->
+ <key>false</key>
+ <dict>
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <key>SFML_GRAPHICS</key>
+ <string></string>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+
+ <!-- AUDIO MODULE -->
+ <dict>
+ <key>Identifier</key>
+ <string>audioModule</string>
+
+ <key>Name</key>
+ <string>Use audio module</string>
+
+ <key>Description</key>
+ <string>Indicates whether audio module should be used or not.</string>
+
+ <key>Type</key>
+ <string>checkbox</string>
+
+ <key>Default</key>
+ <string>true</string>
+
+ <key>Units</key>
+ <dict>
+ <!-- AUDIO MODULE : YES -->
+ <key>true</key>
+ <dict>
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <key>SFML_AUDIO</key>
+ <string>$(SFML_LINK_PREFIX) sfml-audio$(SFML_LINK_SUFFIX)</string>
+ </dict>
+ </dict>
+ </dict>
+
+ <!-- AUDIO MODULE : NO -->
+ <key>false</key>
+ <dict>
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <key>SFML_AUDIO</key>
+ <string></string>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+
+ <!-- NETWORK MODULE -->
+ <dict>
+ <key>Identifier</key>
+ <string>networkModule</string>
+
+ <key>Name</key>
+ <string>Use network module</string>
+
+ <key>Description</key>
+ <string>Indicates whether network module should be used or not.</string>
+
+ <key>Type</key>
+ <string>checkbox</string>
+
+ <key>Default</key>
+ <string>true</string>
+
+ <key>Units</key>
+ <dict>
+ <!-- NETWORK MODULE : YES -->
+ <key>true</key>
+ <dict>
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <key>SFML_NETWORK</key>
+ <string>$(SFML_LINK_PREFIX) sfml-network$(SFML_LINK_SUFFIX)</string>
+ </dict>
+ </dict>
+ </dict>
+
+ <!-- NETWORK MODULE : NO -->
+ <key>false</key>
+ <dict>
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <key>SFML_NETWORK</key>
+ <string></string>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+ </array>
+
+ <!--
+ SETTINGS
+ -->
+ <key>Project</key>
+ <dict>
+ <key>SharedSettings</key>
+ <dict>
+ <!-- Define some prefixes and suffixes -->
+ <key>SFML_LINK_DYLIBS_PREFIX</key>
+ <string>-l</string>
+
+ <key>SFML_LINK_FRAMEWORKS_PREFIX</key>
+ <string>-framework</string>
+
+ <key>SFML_LINK_FRAMEWORKS_SUFFIX</key>
+ <string></string>
+
+ <key>SFML_LINK_PREFIX</key>
+ <string>$(SFML_LINK_$(SFML_BINARY_TYPE)_PREFIX)</string>
+
+ <key>SFML_LINK_SUFFIX</key>
+ <string>$(SFML_LINK_$(SFML_BINARY_TYPE)_SUFFIX)</string>
+
+ <!-- SFML SYSTEM : always used -->
+ <key>SFML_SYSTEM</key>
+ <string>$(SFML_LINK_PREFIX) sfml-system$(SFML_LINK_SUFFIX)</string>
+
+ <!-- LINKER FLAGS -->
+ <key>OTHER_LDFLAGS</key>
+ <string>$(inherited) $(SFML_SYSTEM) $(SFML_WINDOW) $(SFML_GRAPHICS) $(SFML_AUDIO) $(SFML_NETWORK)</string>
+ </dict>
+ </dict>
+ </dict>
+</plist>
diff --git a/tools/xcode/templates/readme.txt b/tools/xcode/templates/readme.txt
new file mode 100644
index 0000000..225ea7a
--- /dev/null
+++ b/tools/xcode/templates/readme.txt
@@ -0,0 +1,150 @@
+
+XCODE TEMPLATES FOR SFML 2
+==========================
+
+These templates help you to easily create a new SFML 2 project for Xcode 4 or greater.
+
+
+
+Web Site
+--------
+
+You can find more resources and information on the official web site: http://www.sfml-dev.org/
+
+
+
+Authors & Licenses
+----------------
+
+The templates were written by Marco Antognini <antognini.marco@gmail.com> and are provided under
+the terms of the zlib/png license: http://opensource.org/licenses/zlib-license.php
+
+The assets including doodle_pop.ogg and background.jpg are public domain. More information
+can be found in the examples/ folder.
+
+Features
+--------
+
+ * You can choose between command line tool or bundle application, the latter will contains all
+ SFML dependencies so you can run your app on another computer without manually installing SFML.
+ * You can choose between using SFML libraries as dylibs or frameworks.
+ * You can choose with SFML module you want to use into your project.
+ * You automatically get a basic example to test SFML right away.
+
+
+
+Prerequisites
+-------------
+
+Before installing the template, make sure you have installed:
+
+ - Xcode 4 or greater, up to date;
+ - the Command Line Tools;
+ - SFML 2, either as frameworks or dylibs, as described in the official tutorials.
+
+
+You should also be familiar with Xcode. If needed checkout this document:
+http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Conceptual/Xcode4UserGuide/000-About_Xcode/about.html
+
+
+
+Install
+-------
+
+If you are building SFML from sources you can set CMake's INSTALL_XCODE_TEMPLATES variable to TRUE
+to install the templates automatically.
+
+
+
+Usage
+-----
+
+To use these templates follow these steps:
+
+ 1. open Xcode,
+ 2. select "create a new Xcode project" from the "Welcome to Xcode" window or select menus
+ File > New > New Project,
+ 3. select "SFML" subsection under "Mac OS X" on the left,
+ 4. then select either "SFML App", if you want an application bundle, or "SFML CLT", if you
+ prefer a classic Unix executable,
+ 5. fill in the requested information and you're ready to go!
+
+Note: some settings are marked as "[ADVANCED]" in the wizard. If you're not sure what they are,
+simply keep the default settings. If you get errors later, explore the FAQ below.
+
+
+FAQ
+---
+
+ * I want to use Xcode 3. Can I use these templates anyway?
+
+ No, Xcode 3 and 4 don't have the same template system. Therefore these templates won't work with
+ a older version of Xcode.
+
+
+
+ * I'm still using SFML 1.6. Can I use these templates anyway?
+
+ No, these templates were made for SFML 2 only.
+
+
+
+ * I would like to add/remove a module of SFML from my current project without creating a new
+ project. How can I do that?
+
+ 1. select your project in the project navigator panel,
+ 2. select your project's target on the main area,
+ 3. go to the "Build Settings" tab,
+ 4. go down to the bottom,
+ 5. set SFML_XXX variable, where XXX is the name of the module to add/remove, to
+ "$(SFML_LINK_PREFIX) sfml-XXX$(SFML_LINK_SUFFIX)" to add it or to "" (nothing) to remove it.
+
+
+
+ * I changed my mind and would like to switch from dylibs to frameworks or vice versa. How can I do that?
+
+ 1. select your project in the project navigator panel,
+ 2. select your project's target on the main area,
+ 3. go to the "Build Settings" tab,
+ 4. go down to the bottom,
+ 5. set SFML_BINARY_TYPE to either "DYLIBS" or "FRAMEWORKS".
+
+
+
+ * How to use/don't use debug dylibs?
+
+ You can choose to use or not SFML debug binaries when creating a new project. However, if you
+ have already created your project you can do the following:
+
+ 1. select your project from the project navigator panel,
+ 2. select your project's target on the main area,
+ 3. go to the "Build Settings" tab,
+ 4. go down to the bottom,
+ 5. set SFML_LINK_DYLIBS_SUFFIX to "-d" to use them or to "" (empty string) to use only
+ release binaries.
+
+
+
+ * I want to use the static version of SFML. Is it possible?
+
+ Short answer: Don't do that!
+
+ We strongly recommend you to use either dylibs or frameworks on Mac OS X. Please refer to Apple
+ documentation for information about static vs shared libraries debate.
+
+ If you really need/want to use static libraries proceed as follow. First, set your project to
+ use dylibs (see above Q & A). Then set SFML_LINK_DYLIBS_SUFFIX to "-s-d" in debug mode and to
+ "-s" in release mode. Finally, remove the script automatically generated by the template (see
+ Build Phases tab).
+
+
+
+ * I get strange linker error about std::string and other STL types. What should I do?
+
+ This probably means you're compiling your project against a different
+ implementation of the STL than the one used by SFML. You can update your
+ project build settings to match the settings used to compile SFML; more
+ specifically the Compiler for C/C++/Objective-C, the C++ language Dialect
+ and the C++ Standard Library.
+
+