From 3871e01a9fd8c9c889eeb9ad56ff6dc386be15d3 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sun, 19 Nov 2017 01:33:57 +0100 Subject: [PATCH 001/211] Added missing code to reset the parameters of the target texture after copying using FBOs and make sure to flip the source data back into non-flipped orientation when blitting from a flipped texture. (Fixes #1319) --- src/SFML/Graphics/Texture.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/SFML/Graphics/Texture.cpp b/src/SFML/Graphics/Texture.cpp index a3eb1234..11bcafe9 100644 --- a/src/SFML/Graphics/Texture.cpp +++ b/src/SFML/Graphics/Texture.cpp @@ -502,7 +502,11 @@ void Texture::update(const Texture& texture, unsigned int x, unsigned int y) if ((sourceStatus == GLEXT_GL_FRAMEBUFFER_COMPLETE) && (destStatus == GLEXT_GL_FRAMEBUFFER_COMPLETE)) { // Blit the texture contents from the source to the destination texture - glCheck(GLEXT_glBlitFramebuffer(0, 0, texture.m_size.x, texture.m_size.y, x, y, x + texture.m_size.x, y + texture.m_size.y, GL_COLOR_BUFFER_BIT, GL_NEAREST)); + 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 + GL_COLOR_BUFFER_BIT, GL_NEAREST + )); } else { @@ -517,6 +521,20 @@ void Texture::update(const Texture& texture, unsigned int x, unsigned int y) glCheck(GLEXT_glDeleteFramebuffers(1, &sourceFrameBuffer)); glCheck(GLEXT_glDeleteFramebuffers(1, &destFrameBuffer)); + // Make sure that the current texture binding will be preserved + priv::TextureSaver save; + + // Set the parameters of this texture + glCheck(glBindTexture(GL_TEXTURE_2D, m_texture)); + glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_isSmooth ? GL_LINEAR : GL_NEAREST)); + m_hasMipmap = false; + m_pixelsFlipped = false; + m_cacheId = getUniqueId(); + + // Force an OpenGL flush, so that the texture data will appear updated + // in all contexts immediately (solves problems in multi-threaded apps) + glCheck(glFlush()); + return; } From b83085bf777a2417175353708a1ac0ee2c82f6ee Mon Sep 17 00:00:00 2001 From: Marco Antognini <antognini.marco@gmail.com> Date: Tue, 28 Nov 2017 22:01:17 +0000 Subject: [PATCH 002/211] Dropped support for 10.7 & 10.8 --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dd1c18ed..4dd83345 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,7 @@ 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_DEPLOYMENT_TARGET) - set(CMAKE_OSX_DEPLOYMENT_TARGET "10.7" CACHE STRING "macOS deployement target; 10.7+ is expected" FORCE) + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "macOS deployement target; 10.9+ 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. @@ -268,9 +268,9 @@ if(SFML_OS_MACOSX) message(FATAL_ERROR "Only 64-bit architecture is supported") endif() - # Ensure macOS 10.7+ is used - if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS "10.7") - message(FATAL_ERROR "macOS 10.7 or greater is required for the deployment target.") + # Ensure macOS 10.9+ is used + if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS "10.9") + message(FATAL_ERROR "macOS 10.9 or greater is required for the deployment target.") endif() # configure Xcode templates From 8a02dc0ad59ff5ab7c6cb69a0eb50c2e0e3c005b Mon Sep 17 00:00:00 2001 From: marukrap <marukrap@gmail.com> Date: Tue, 24 Oct 2017 07:06:29 +0900 Subject: [PATCH 003/211] Change a character from en-dash(u2013) to hypen-minus(u002d) --- include/SFML/Window/WindowHandle.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/SFML/Window/WindowHandle.hpp b/include/SFML/Window/WindowHandle.hpp index bfb4dc50..001842a5 100644 --- a/include/SFML/Window/WindowHandle.hpp +++ b/include/SFML/Window/WindowHandle.hpp @@ -65,7 +65,7 @@ namespace sf #elif defined(SFML_DOXYGEN) // Define typedef symbol so that Doxygen can attach some documentation to it - typedef "platform–specific" WindowHandle; + typedef "platform-specific" WindowHandle; #endif From c352f5228b22e6698912c6d72452599686a7b7b2 Mon Sep 17 00:00:00 2001 From: Marco Antognini <antognini.marco@gmail.com> Date: Wed, 22 Nov 2017 19:03:20 +0100 Subject: [PATCH 004/211] Fixed typo in sf::Music documentation --- include/SFML/Audio/Music.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/SFML/Audio/Music.hpp b/include/SFML/Audio/Music.hpp index 0e22aba1..d48fab6b 100644 --- a/include/SFML/Audio/Music.hpp +++ b/include/SFML/Audio/Music.hpp @@ -266,7 +266,7 @@ private: //////////////////////////////////////////////////////////// /// \brief Helper to convert a sample position to an sf::Time /// - /// \param position Sample count to convert to Time + /// \param samples Sample count to convert to Time /// /// \return The Time position of the given sample /// From dd307cc23e643c74b4b117509248c48dcf301f4b Mon Sep 17 00:00:00 2001 From: Marco Antognini <antognini.marco@gmail.com> Date: Wed, 8 Nov 2017 15:25:55 +0100 Subject: [PATCH 005/211] Fixed crash with application messing hardware detection This prevents crashes & reduces the amount of logging but does not actually make isKeyPressed work when using e.g. TeamViewer. --- src/SFML/Window/OSX/HIDInputManager.mm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SFML/Window/OSX/HIDInputManager.mm b/src/SFML/Window/OSX/HIDInputManager.mm index c74200ce..d11c9092 100644 --- a/src/SFML/Window/OSX/HIDInputManager.mm +++ b/src/SFML/Window/OSX/HIDInputManager.mm @@ -152,6 +152,7 @@ void HIDInputManager::initializeKeyboard() CFSetRef keyboards = copyDevices(kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard); if (keyboards == NULL) { + sf::err() << "No keyboard detected by the HID manager!" << std::endl; freeUp(); return; } @@ -313,9 +314,11 @@ void HIDInputManager::freeUp() if (m_layoutData != 0) CFRelease(m_layoutData); + m_layoutData = 0; // Do not release m_layout! It is owned by m_layoutData. if (m_manager != 0) CFRelease(m_manager); + m_manager = 0; for (unsigned int i = 0; i < Keyboard::KeyCount; ++i) { @@ -355,11 +358,8 @@ CFSetRef HIDInputManager::copyDevices(UInt32 page, UInt32 usage) bool HIDInputManager::isPressed(IOHIDElements& elements) { - if (!m_isValid) - { - sf::err() << "HIDInputManager is invalid." << std::endl; + if (!m_isValid) return false; - } // state = true if at least one corresponding HID button is pressed bool state = false; From 883ec9391db4e631cc79ec8ab543afdcd5e07a8a Mon Sep 17 00:00:00 2001 From: Marco Antognini <antognini.marco@gmail.com> Date: Sat, 1 Jul 2017 13:02:56 +0200 Subject: [PATCH 006/211] Added support for (some) Hat/POV axis --- src/SFML/Window/OSX/JoystickImpl.cpp | 173 ++++++++++++++++++++------- src/SFML/Window/OSX/JoystickImpl.hpp | 5 +- 2 files changed, 134 insertions(+), 44 deletions(-) diff --git a/src/SFML/Window/OSX/JoystickImpl.cpp b/src/SFML/Window/OSX/JoystickImpl.cpp index 215a6a92..2f5e055b 100644 --- a/src/SFML/Window/OSX/JoystickImpl.cpp +++ b/src/SFML/Window/OSX/JoystickImpl.cpp @@ -147,19 +147,16 @@ bool JoystickImpl::isConnected(unsigned int index) // 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); didx < size; ++didx) + for (CFIndex didx(0); !state && didx < size; ++didx) { IOHIDDeviceRef d = (IOHIDDeviceRef)array[didx]; Location dloc = HIDInputManager::getLocationID(d); bool foundJ = false; - for (unsigned int j(0); j < Joystick::Count; ++j) + for (unsigned int j(0); !foundJ && j < Joystick::Count; ++j) { if (m_locationIDs[j] == dloc) - { foundJ = true; - break; // no need to loop again - } } if (!foundJ) { @@ -167,7 +164,6 @@ bool JoystickImpl::isConnected(unsigned int index) // We set it up for Open(..) m_locationIDs[index] = dloc; state = true; - break; // We stop looking for a new device } } } @@ -185,6 +181,7 @@ bool JoystickImpl::isConnected(unsigned int index) bool JoystickImpl::open(unsigned int index) { m_index = index; + m_hat = NULL; Location deviceLoc = m_locationIDs[index]; // The device we need to load // Get all devices @@ -199,19 +196,15 @@ bool JoystickImpl::open(unsigned int index) // Get the desired joystick. IOHIDDeviceRef self = 0; - for (CFIndex i(0); i < joysticksCount; ++i) + for (CFIndex i(0); self == 0 && i < joysticksCount; ++i) { IOHIDDeviceRef d = (IOHIDDeviceRef)devicesArray[i]; if (deviceLoc == HIDInputManager::getLocationID(d)) - { self = d; - break; // We found it so we stop looping. - } } if (self == 0) { - // This shouldn't happen! CFRelease(devices); return false; } @@ -229,24 +222,14 @@ bool JoystickImpl::open(unsigned int index) return false; } - // How many elements are there? - CFIndex elementsCount = CFArrayGetCount(elements); - - if (elementsCount == 0) - { - // What is a joystick with no element? - CFRelease(elements); - CFRelease(devices); - return false; - } - // Go through all connected elements. + CFIndex elementsCount = CFArrayGetCount(elements); for (int i = 0; i < elementsCount; ++i) { IOHIDElementRef element = (IOHIDElementRef) CFArrayGetValueAtIndex(elements, i); - switch (IOHIDElementGetType(element)) + switch (IOHIDElementGetUsagePage(element)) { - case kIOHIDElementTypeInput_Misc: + case kHIDPage_GenericDesktop: switch (IOHIDElementGetUsage(element)) { case kHIDUsage_GD_X: m_axis[Joystick::X] = element; break; @@ -255,19 +238,64 @@ bool JoystickImpl::open(unsigned int index) case kHIDUsage_GD_Rx: m_axis[Joystick::U] = element; break; case kHIDUsage_GD_Ry: m_axis[Joystick::V] = element; break; case kHIDUsage_GD_Rz: m_axis[Joystick::R] = element; break; - default: break; - // kHIDUsage_GD_Vx, kHIDUsage_GD_Vy, kHIDUsage_GD_Vz are ignored. + + case kHIDUsage_GD_Hatswitch: + // From §4.3 MiscellaneousControls of HUT v1.12: + // + // > Hat Switch: + // > A typical example is four switches that are capable of generating + // > information about four possible directions in which the knob can be + // > tilted. Intermediate positions can also be decoded if the hardware + // > allows two switches to be reported simultaneously. + // + // We assume this model here as well. Hence, with 4 switches and intermediate + // positions we have 8 values (0-7) plus the "null" state (8). + { + CFIndex min = IOHIDElementGetLogicalMin(element); + CFIndex max = IOHIDElementGetLogicalMax(element); + + if (min != 0 || max != 7) + { + sf::err() << std::hex + << "Joystick (vendor/product id: 0x" << m_identification.vendorId + << "/0x" << m_identification.productId << std::dec + << ") range is an unexpected one: [" << min << ", " << max << "]" + << std::endl; + } + else + { + m_hat = element; + } + } + break; + + case kHIDUsage_GD_GamePad: + // We assume a game pad is an application collection, meaning it doesn't hold + // any values per say. They kind of "emit" the joystick's usages. + // See §3.4.3 Usage Types (Collection) of HUT v1.12 + if (IOHIDElementGetCollectionType(element) != kIOHIDElementCollectionTypeApplication) + { + sf::err() << std::hex << "Gamepage (vendor/product id: 0x" << m_identification.vendorId + << "/0x" << m_identification.productId << ") is not an CA but a 0x" + << IOHIDElementGetCollectionType(element) << std::dec << std::endl; + } + break; + + default: +#ifdef SFML_DEBUG + sf::err() << "Unexpected usage for element of Page Generic Desktop: 0x" << std::hex << IOHIDElementGetUsage(element) << std::dec << std::endl; +#endif + break; } break; - case kIOHIDElementTypeInput_Button: + case kHIDPage_Button: if (m_buttons.size() < Joystick::ButtonCount) // If we have free slot... m_buttons.push_back(element); // ...we add this element to the list // Else: too many buttons. We ignore this one. break; - default: // Make compiler happy - break; + default: /* No other page is expected because of the mask applied by the HID manager. */ break; } } @@ -275,17 +303,16 @@ bool JoystickImpl::open(unsigned int index) // HID Usage (assigned by manufacturer and/or a driver). std::sort(m_buttons.begin(), m_buttons.end(), JoystickButtonSortPredicate); - // Note: Joy::AxisPovX/Y are not supported (yet). - // Maybe kIOHIDElementTypeInput_Axis is the corresponding type but I can't test. - // Retain all these objects for personal use for (ButtonsVector::iterator it(m_buttons.begin()); it != m_buttons.end(); ++it) CFRetain(*it); for (AxisMap::iterator it(m_axis.begin()); it != m_axis.end(); ++it) CFRetain(it->second); + if (m_hat != NULL) + CFRetain(m_hat); // Note: we didn't retain element in the switch because we might have multiple - // Axis X (for example) and we want to keep only the last one. So to prevent + // Axis X (for example) and we want to keep only the last one. To prevent // leaking we retain objects 'only' now. CFRelease(devices); @@ -306,6 +333,10 @@ void JoystickImpl::close() CFRelease(it->second); m_axis.clear(); + if (m_hat != NULL) + CFRelease(m_hat); + m_hat = NULL; + // And we unregister this joystick m_locationIDs[m_index] = 0; } @@ -320,9 +351,11 @@ JoystickCaps JoystickImpl::getCapabilities() const caps.buttonCount = m_buttons.size(); // Axis: - for (AxisMap::const_iterator it(m_axis.begin()); it != m_axis.end(); ++it) { + for (AxisMap::const_iterator it(m_axis.begin()); it != m_axis.end(); ++it) caps.axes[it->first] = true; - } + + if (m_hat != NULL) + caps.axes[Joystick::PovX] = caps.axes[Joystick::PovY] = true; return caps; } @@ -339,7 +372,7 @@ Joystick::Identification JoystickImpl::getIdentification() const JoystickState JoystickImpl::update() { static const JoystickState disconnectedState; // return this if joystick was disconnected - JoystickState state; // otherwise return that + JoystickState state; // otherwise return that state.connected = true; // Note: free up is done in close() which is called, if required, @@ -360,14 +393,11 @@ JoystickState JoystickImpl::update() // Search for it bool found = false; - for (CFIndex i(0); i < joysticksCount; ++i) + for (CFIndex i(0); !found && i < joysticksCount; ++i) { IOHIDDeviceRef d = (IOHIDDeviceRef)devicesArray[i]; if (selfLoc == HIDInputManager::getLocationID(d)) - { found = true; - break; // Stop looping - } } // Release unused stuff @@ -387,7 +417,6 @@ JoystickState JoystickImpl::update() // Check for plug out. if (!value) { - // No value? Hum... Seems like the joystick is gone return disconnectedState; } @@ -404,7 +433,6 @@ JoystickState JoystickImpl::update() // Check for plug out. if (!value) { - // No value? Hum... Seems like the joystick is gone return disconnectedState; } @@ -427,9 +455,70 @@ JoystickState JoystickImpl::update() state.axes[it->first] = scaledValue; } + // Update POV/Hat state. Assuming model described in `open`, values are: + // + // North-West / 7 North / 0 North-East / 1 + // West / 6 Null / 8 East / 2 + // South-West / 5 South / 4 South-East / 3 + // + if (m_hat != NULL) + { + IOHIDValueRef value = 0; + IOHIDDeviceGetValue(IOHIDElementGetDevice(m_hat), m_hat, &value); + + // Check for plug out. + if (!value) + { + return disconnectedState; + } + + CFIndex raw = IOHIDValueGetIntegerValue(value); + + // Load PovX + switch (raw) + { + case 1: + case 2: + case 3: + state.axes[Joystick::PovX] = +100; + break; + + case 5: + case 6: + case 7: + state.axes[Joystick::PovX] = -100; + break; + + default: + state.axes[Joystick::PovX] = 0; + break; + } + + // Load PovY + switch (raw) + { + case 0: + case 1: + case 7: + state.axes[Joystick::PovY] = +100; + break; + + case 3: + case 4: + case 5: + state.axes[Joystick::PovY] = -100; + break; + + default: + state.axes[Joystick::PovY] = 0; + break; + } + } + return state; } } // namespace priv } // namespace sf + diff --git a/src/SFML/Window/OSX/JoystickImpl.hpp b/src/SFML/Window/OSX/JoystickImpl.hpp index 9d185cbe..b0fce5e8 100644 --- a/src/SFML/Window/OSX/JoystickImpl.hpp +++ b/src/SFML/Window/OSX/JoystickImpl.hpp @@ -120,8 +120,9 @@ private: typedef std::map<sf::Joystick::Axis, IOHIDElementRef> AxisMap; typedef std::vector<IOHIDElementRef> ButtonsVector; - AxisMap m_axis; ///< Axis (IOHIDElementRef) connected to the joystick - ButtonsVector m_buttons; ///< Buttons (IOHIDElementRef) connected to the joystick + AxisMap m_axis; ///< Axes (but not POV/Hat) of the joystick + IOHIDElementRef m_hat; ///< POV/Hat axis of the joystick + ButtonsVector m_buttons; ///< Buttons of the joystick unsigned int m_index; ///< SFML index Joystick::Identification m_identification; ///< Joystick identification From 5a135a3b7d1d68c83e4e3485db3c80e1c3f28f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@my-gate.net> Date: Mon, 13 Nov 2017 16:09:36 +0100 Subject: [PATCH 007/211] Added 'SFML Community' to the author list. --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index 7f1486b2..baf30335 100644 --- a/readme.md +++ b/readme.md @@ -15,6 +15,7 @@ SFML is a simple, fast, cross-platform and object-oriented multimedia API. It pr - binary1248 (binary1248@hotmail.com) - Artur Moreira (artturmoreira@gmail.com) - Mario Liebisch (mario@sfml-dev.org) + - And many other members of the SFML community ## Download From 6f3282623f6c484d24e120f839eb0f33e8f90772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <lukas.duerrenberger@zuehlke.com> Date: Thu, 7 Dec 2017 14:46:19 +0100 Subject: [PATCH 008/211] Fixed various type conversion/comparison warnings. --- src/SFML/Audio/Music.cpp | 2 +- src/SFML/Audio/SoundFileReaderFlac.cpp | 6 +++--- src/SFML/Audio/SoundFileReaderWav.cpp | 2 +- src/SFML/Graphics/Font.cpp | 8 ++++---- src/SFML/Graphics/RenderTarget.cpp | 2 +- src/SFML/Graphics/Shader.cpp | 12 ++++++------ src/SFML/Network/Ftp.cpp | 4 ++-- src/SFML/System/FileInputStream.cpp | 2 +- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/SFML/Audio/Music.cpp b/src/SFML/Audio/Music.cpp index 62855f80..dc9a896d 100644 --- a/src/SFML/Audio/Music.cpp +++ b/src/SFML/Audio/Music.cpp @@ -188,7 +188,7 @@ bool Music::onGetData(SoundStream::Chunk& data) // This will trip an "onLoop()" call from the underlying SoundStream, // and we can then take action. if (getLoop() && (m_loopSpan.length != 0) && (currentOffset <= loopEnd) && (currentOffset + toFill > loopEnd)) - toFill = loopEnd - currentOffset; + toFill = static_cast<std::size_t>(loopEnd - currentOffset); // Fill the chunk parameters data.samples = &m_samples[0]; diff --git a/src/SFML/Audio/SoundFileReaderFlac.cpp b/src/SFML/Audio/SoundFileReaderFlac.cpp index 00794b66..8828af23 100644 --- a/src/SFML/Audio/SoundFileReaderFlac.cpp +++ b/src/SFML/Audio/SoundFileReaderFlac.cpp @@ -284,14 +284,14 @@ Uint64 SoundFileReaderFlac::read(Int16* samples, Uint64 maxCount) assert(m_decoder); // If there are leftovers from previous call, use it first - Uint64 left = m_clientData.leftovers.size(); + std::size_t left = m_clientData.leftovers.size(); if (left > 0) { if (left > maxCount) { // There are more leftovers than needed - std::copy(m_clientData.leftovers.begin(), m_clientData.leftovers.begin() + maxCount, samples); - std::vector<Int16> leftovers(m_clientData.leftovers.begin() + maxCount, m_clientData.leftovers.end()); + 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()); m_clientData.leftovers.swap(leftovers); return maxCount; } diff --git a/src/SFML/Audio/SoundFileReaderWav.cpp b/src/SFML/Audio/SoundFileReaderWav.cpp index b49909e8..30f23e5b 100644 --- a/src/SFML/Audio/SoundFileReaderWav.cpp +++ b/src/SFML/Audio/SoundFileReaderWav.cpp @@ -155,7 +155,7 @@ Uint64 SoundFileReaderWav::read(Int16* samples, Uint64 maxCount) assert(m_stream); Uint64 count = 0; - while ((count < maxCount) && (m_stream->tell() < m_dataEnd)) + while ((count < maxCount) && (static_cast<Uint64>(m_stream->tell()) < m_dataEnd)) { switch (m_bytesPerSample) { diff --git a/src/SFML/Graphics/Font.cpp b/src/SFML/Graphics/Font.cpp index 0ab41b9b..f148956e 100644 --- a/src/SFML/Graphics/Font.cpp +++ b/src/SFML/Graphics/Font.cpp @@ -631,9 +631,9 @@ Glyph Font::loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, f if (bitmap.pixel_mode == FT_PIXEL_MODE_MONO) { // Pixels are 1 bit monochrome values - for (int y = padding; y < height - padding; ++y) + for (unsigned int y = padding; y < height - padding; ++y) { - for (int x = padding; x < width - padding; ++x) + for (unsigned int x = padding; x < width - padding; ++x) { // The color channels remain white, just fill the alpha channel std::size_t index = x + y * width; @@ -645,9 +645,9 @@ Glyph Font::loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, f else { // Pixels are 8 bits gray levels - for (int y = padding; y < height - padding; ++y) + for (unsigned int y = padding; y < height - padding; ++y) { - for (int x = padding; x < width - padding; ++x) + for (unsigned int x = padding; x < width - padding; ++x) { // The color channels remain white, just fill the alpha channel std::size_t index = x + y * width; diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index 4faa7ddb..2dce1b40 100644 --- a/src/SFML/Graphics/RenderTarget.cpp +++ b/src/SFML/Graphics/RenderTarget.cpp @@ -298,7 +298,7 @@ void RenderTarget::draw(const Vertex* vertices, std::size_t vertexCount, GLenum mode = modes[type]; // Draw the primitives - glCheck(glDrawArrays(mode, 0, vertexCount)); + glCheck(glDrawArrays(mode, 0, static_cast<GLsizei>(vertexCount))); // Unbind the shader, if any if (states.shader) diff --git a/src/SFML/Graphics/Shader.cpp b/src/SFML/Graphics/Shader.cpp index 92b92dbf..b423ca68 100644 --- a/src/SFML/Graphics/Shader.cpp +++ b/src/SFML/Graphics/Shader.cpp @@ -593,7 +593,7 @@ void Shader::setUniformArray(const std::string& name, const float* scalarArray, { UniformBinder binder(*this, name); if (binder.location != -1) - glCheck(GLEXT_glUniform1fv(binder.location, length, scalarArray)); + glCheck(GLEXT_glUniform1fv(binder.location, static_cast<GLsizei>(length), scalarArray)); } @@ -604,7 +604,7 @@ void Shader::setUniformArray(const std::string& name, const Glsl::Vec2* vectorAr UniformBinder binder(*this, name); if (binder.location != -1) - glCheck(GLEXT_glUniform2fv(binder.location, length, &contiguous[0])); + glCheck(GLEXT_glUniform2fv(binder.location, static_cast<GLsizei>(length), &contiguous[0])); } @@ -615,7 +615,7 @@ void Shader::setUniformArray(const std::string& name, const Glsl::Vec3* vectorAr UniformBinder binder(*this, name); if (binder.location != -1) - glCheck(GLEXT_glUniform3fv(binder.location, length, &contiguous[0])); + glCheck(GLEXT_glUniform3fv(binder.location, static_cast<GLsizei>(length), &contiguous[0])); } @@ -626,7 +626,7 @@ void Shader::setUniformArray(const std::string& name, const Glsl::Vec4* vectorAr UniformBinder binder(*this, name); if (binder.location != -1) - glCheck(GLEXT_glUniform4fv(binder.location, length, &contiguous[0])); + glCheck(GLEXT_glUniform4fv(binder.location, static_cast<GLsizei>(length), &contiguous[0])); } @@ -641,7 +641,7 @@ void Shader::setUniformArray(const std::string& name, const Glsl::Mat3* matrixAr UniformBinder binder(*this, name); if (binder.location != -1) - glCheck(GLEXT_glUniformMatrix3fv(binder.location, length, GL_FALSE, &contiguous[0])); + glCheck(GLEXT_glUniformMatrix3fv(binder.location, static_cast<GLsizei>(length), GL_FALSE, &contiguous[0])); } @@ -656,7 +656,7 @@ void Shader::setUniformArray(const std::string& name, const Glsl::Mat4* matrixAr UniformBinder binder(*this, name); if (binder.location != -1) - glCheck(GLEXT_glUniformMatrix4fv(binder.location, length, GL_FALSE, &contiguous[0])); + glCheck(GLEXT_glUniformMatrix4fv(binder.location, static_cast<GLsizei>(length), GL_FALSE, &contiguous[0])); } diff --git a/src/SFML/Network/Ftp.cpp b/src/SFML/Network/Ftp.cpp index 1882da86..c77ccd2f 100644 --- a/src/SFML/Network/Ftp.cpp +++ b/src/SFML/Network/Ftp.cpp @@ -463,7 +463,7 @@ Ftp::Response Ftp::getResponse() } // Save the remaining data for the next time getResponse() is called - m_receiveBuffer.assign(buffer + in.tellg(), length - in.tellg()); + m_receiveBuffer.assign(buffer + static_cast<std::streamoff>(in.tellg()), length - static_cast<std::size_t>(in.tellg())); // Return the response code and message return Response(static_cast<Response::Status>(code), message); @@ -631,7 +631,7 @@ void Ftp::DataChannel::send(std::istream& stream) break; } - count = stream.gcount(); + count = static_cast<std::size_t>(stream.gcount()); if (count > 0) { diff --git a/src/SFML/System/FileInputStream.cpp b/src/SFML/System/FileInputStream.cpp index e6f1c838..1684e812 100644 --- a/src/SFML/System/FileInputStream.cpp +++ b/src/SFML/System/FileInputStream.cpp @@ -95,7 +95,7 @@ Int64 FileInputStream::seek(Int64 position) #else if (m_file) { - if (std::fseek(m_file, static_cast<std::size_t>(position), SEEK_SET)) + if (std::fseek(m_file, static_cast<long>(position), SEEK_SET)) return -1; return tell(); From 247b03172c34f25a808bcfdc49f390d619e7d5e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <lukas.duerrenberger@zuehlke.com> Date: Thu, 7 Dec 2017 14:46:19 +0100 Subject: [PATCH 009/211] Fixed casting type. --- src/SFML/Network/Ftp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Network/Ftp.cpp b/src/SFML/Network/Ftp.cpp index c77ccd2f..af3be1a4 100644 --- a/src/SFML/Network/Ftp.cpp +++ b/src/SFML/Network/Ftp.cpp @@ -463,7 +463,7 @@ Ftp::Response Ftp::getResponse() } // Save the remaining data for the next time getResponse() is called - m_receiveBuffer.assign(buffer + static_cast<std::streamoff>(in.tellg()), length - static_cast<std::size_t>(in.tellg())); + m_receiveBuffer.assign(buffer + static_cast<std::size_t>(in.tellg()), length - static_cast<std::size_t>(in.tellg())); // Return the response code and message return Response(static_cast<Response::Status>(code), message); From 30ec3edd8bda55d0239b856c10b5706ce3f7eb33 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Thu, 4 Jan 2018 14:23:49 -0800 Subject: [PATCH 010/211] Enable audio component build on iOS --- CMakeLists.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dd1c18ed..b4febf68 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,9 +93,7 @@ endif() # add options to select which modules to build sfml_set_option(SFML_BUILD_WINDOW TRUE BOOL "TRUE to build SFML's Window module. This setting is ignored, if the graphics module is built.") sfml_set_option(SFML_BUILD_GRAPHICS TRUE BOOL "TRUE to build SFML's Graphics module.") -if(NOT SFML_OS_IOS) - sfml_set_option(SFML_BUILD_AUDIO TRUE BOOL "TRUE to build SFML's Audio module.") -endif() +sfml_set_option(SFML_BUILD_AUDIO TRUE BOOL "TRUE to build SFML's Audio module.") sfml_set_option(SFML_BUILD_NETWORK TRUE BOOL "TRUE to build SFML's Network module.") # add an option for building the API documentation From bba5808717159963f71c4fd2fc653dd0feb4aae8 Mon Sep 17 00:00:00 2001 From: tlein <tlein@radford.edu> Date: Fri, 25 Aug 2017 00:02:50 -0500 Subject: [PATCH 011/211] use a toolchain file for iOS instead of setting the necessary CMake variables in SFML --- cmake/Config.cmake | 8 - cmake/toolchains/iOS.toolchain.cmake | 211 +++++++++++++++++++++++++++ src/SFML/Audio/CMakeLists.txt | 12 +- src/SFML/Graphics/CMakeLists.txt | 2 +- 4 files changed, 218 insertions(+), 15 deletions(-) create mode 100644 cmake/toolchains/iOS.toolchain.cmake diff --git a/cmake/Config.cmake b/cmake/Config.cmake index c447113a..594d5e67 100644 --- a/cmake/Config.cmake +++ b/cmake/Config.cmake @@ -35,14 +35,6 @@ elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") if(IOS) set(SFML_OS_IOS 1) - # set the target framework and platforms - set(CMAKE_OSX_SYSROOT "iphoneos") - set(CMAKE_OSX_ARCHITECTURES "armv6;armv7;i386") - set(CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphoneos;-iphonesimulator") - - # help the compiler detection script below - set(CMAKE_COMPILER_IS_GNUCXX 1) - # use the OpenGL ES implementation on iOS set(OPENGL_ES 1) else() diff --git a/cmake/toolchains/iOS.toolchain.cmake b/cmake/toolchains/iOS.toolchain.cmake new file mode 100644 index 00000000..836c1dbd --- /dev/null +++ b/cmake/toolchains/iOS.toolchain.cmake @@ -0,0 +1,211 @@ +# This file is based off of the Platform/Darwin.cmake and Platform/UnixPaths.cmake +# files which are included with CMake 2.8.4 +# It has been altered for iOS development + +# Options: +# +# IOS_PLATFORM = OS (default) or SIMULATOR or SIMULATOR64 +# This decides if SDKS will be selected from the iPhoneOS.platform or iPhoneSimulator.platform folders +# OS - the default, used to build for iPhone and iPad physical devices, which have an arm arch. +# SIMULATOR - used to build for the Simulator platforms, which have an x86 arch. +# +# CMAKE_IOS_DEVELOPER_ROOT = automatic(default) or /path/to/platform/Developer folder +# By default this location is automatcially chosen based on the IOS_PLATFORM value above. +# If set manually, it will override the default location and force the user of a particular Developer Platform +# +# CMAKE_IOS_SDK_ROOT = automatic(default) or /path/to/platform/Developer/SDKs/SDK folder +# By default this location is automatcially chosen based on the CMAKE_IOS_DEVELOPER_ROOT value. +# In this case it will always be the most up-to-date SDK found in the CMAKE_IOS_DEVELOPER_ROOT path. +# If set manually, this will force the use of a specific SDK version + +# Macros: +# +# set_xcode_property (TARGET XCODE_PROPERTY XCODE_VALUE) +# A convenience macro for setting xcode specific properties on targets +# example: set_xcode_property (myioslib IPHONEOS_DEPLOYMENT_TARGET "3.1") +# +# find_host_package (PROGRAM ARGS) +# A macro used to find executable programs on the host system, not within the iOS environment. +# Thanks to the android-cmake project for providing the command + +# Standard settings +set (CMAKE_SYSTEM_NAME Darwin) +set (CMAKE_SYSTEM_VERSION 1) +set (UNIX True) +set (APPLE True) +set (IOS True) + +# Required as of cmake 2.8.10 +set (CMAKE_OSX_DEPLOYMENT_TARGET "" CACHE STRING "Force unset of the deployment target for iOS" FORCE) + +# Determine the cmake host system version so we know where to find the iOS SDKs +find_program (CMAKE_UNAME uname /bin /usr/bin /usr/local/bin) +if (CMAKE_UNAME) + exec_program(uname ARGS -r OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION) + string (REGEX REPLACE "^([0-9]+)\\.([0-9]+).*$" "\\1" DARWIN_MAJOR_VERSION "${CMAKE_HOST_SYSTEM_VERSION}") +endif (CMAKE_UNAME) + +set(CMAKE_C_COMPILER /usr/bin/gcc CACHE FILEPATH "" FORCE) +set(CMAKE_CXX_COMPILER /usr/bin/g++ CACHE FILEPATH "" FORCE) +set(CMAKE_AR ar CACHE FILEPATH "" FORCE) + +# Skip the platform compiler checks for cross compiling +set (CMAKE_CXX_COMPILER_WORKS TRUE) +set (CMAKE_C_COMPILER_WORKS TRUE) + +# All iOS/Darwin specific settings - some may be redundant +set (CMAKE_SHARED_LIBRARY_PREFIX "lib") +set (CMAKE_SHARED_LIBRARY_SUFFIX ".dylib") +set (CMAKE_SHARED_MODULE_PREFIX "lib") +set (CMAKE_SHARED_MODULE_SUFFIX ".so") +set (CMAKE_MODULE_EXISTS 1) +set (CMAKE_DL_LIBS "") + +set (CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ") +set (CMAKE_C_OSX_CURRENT_VERSION_FLAG "-current_version ") +set (CMAKE_CXX_OSX_COMPATIBILITY_VERSION_FLAG "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}") +set (CMAKE_CXX_OSX_CURRENT_VERSION_FLAG "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}") + +# Hidden visibilty is required for cxx on iOS +set (CMAKE_C_FLAGS_INIT "") +set (CMAKE_CXX_FLAGS_INIT "-fvisibility=hidden -fvisibility-inlines-hidden") + +set (CMAKE_C_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}") +set (CMAKE_CXX_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}") + +set (CMAKE_PLATFORM_HAS_INSTALLNAME 1) +set (CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -headerpad_max_install_names") +set (CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -headerpad_max_install_names") +set (CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,") +set (CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,") +set (CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".so" ".a") + +# hack: if a new cmake (which uses CMAKE_INSTALL_NAME_TOOL) runs on an old build tree +# (where install_name_tool was hardcoded) and where CMAKE_INSTALL_NAME_TOOL isn't in the cache +# and still cmake didn't fail in CMakeFindBinUtils.cmake (because it isn't rerun) +# hardcode CMAKE_INSTALL_NAME_TOOL here to install_name_tool, so it behaves as it did before, Alex +if (NOT DEFINED CMAKE_INSTALL_NAME_TOOL) + find_program(CMAKE_INSTALL_NAME_TOOL install_name_tool) +endif (NOT DEFINED CMAKE_INSTALL_NAME_TOOL) + +# Setup iOS platform unless specified manually with IOS_PLATFORM +if (NOT DEFINED IOS_PLATFORM) + set (IOS_PLATFORM "OS") +endif (NOT DEFINED IOS_PLATFORM) +set (IOS_PLATFORM ${IOS_PLATFORM} CACHE STRING "Type of iOS Platform") + +# Setup building for arm64 or not +if (NOT DEFINED BUILD_ARM64) + set (BUILD_ARM64 true) +endif (NOT DEFINED BUILD_ARM64) +set (BUILD_ARM64 ${BUILD_ARM64} CACHE STRING "Build arm64 arch or not") + +# Check the platform selection and setup for developer root +if (${IOS_PLATFORM} STREQUAL OS) + message (STATUS "Targeting iPhone platform") + set (IOS_PLATFORM_LOCATION "iPhoneOS.platform") + + # This causes the installers to properly locate the output libraries + set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphoneos") +elseif (${IOS_PLATFORM} STREQUAL SIMULATOR) + message (STATUS "Targeting iPhoneSimulator platform") + set (SIMULATOR true) + set (IOS_PLATFORM_LOCATION "iPhoneSimulator.platform") + + # This causes the installers to properly locate the output libraries + set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphonesimulator") +elseif (${IOS_PLATFORM} STREQUAL SIMULATOR64) + message (STATUS "Targeting iPhoneSimulator64 platform") + set (SIMULATOR true) + set (IOS_PLATFORM_LOCATION "iPhoneSimulator.platform") + + # This causes the installers to properly locate the output libraries + set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphonesimulator") +else (${IOS_PLATFORM} STREQUAL OS) + message (FATAL_ERROR "Unsupported IOS_PLATFORM value '${IOS_PLATFORM}' selected. Please choose OS, SIMULATOR, or SIMULATOR64") +endif (${IOS_PLATFORM} STREQUAL OS) + +# Setup iOS developer location unless specified manually with CMAKE_IOS_DEVELOPER_ROOT +# Note Xcode 4.3 changed the installation location, choose the most recent one available +exec_program(/usr/bin/xcode-select ARGS -print-path OUTPUT_VARIABLE CMAKE_XCODE_DEVELOPER_DIR) +set (XCODE_POST_43_ROOT "${CMAKE_XCODE_DEVELOPER_DIR}/Platforms/${IOS_PLATFORM_LOCATION}/Developer") +set (XCODE_PRE_43_ROOT "/Developer/Platforms/${IOS_PLATFORM_LOCATION}/Developer") +if (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT) + if (EXISTS ${XCODE_POST_43_ROOT}) + set (CMAKE_IOS_DEVELOPER_ROOT ${XCODE_POST_43_ROOT}) + elseif(EXISTS ${XCODE_PRE_43_ROOT}) + set (CMAKE_IOS_DEVELOPER_ROOT ${XCODE_PRE_43_ROOT}) + endif (EXISTS ${XCODE_POST_43_ROOT}) +endif (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT) +set (CMAKE_IOS_DEVELOPER_ROOT ${CMAKE_IOS_DEVELOPER_ROOT} CACHE PATH "Location of iOS Platform") + +# Find and use the most recent iOS sdk unless specified manually with CMAKE_IOS_SDK_ROOT +if (NOT DEFINED CMAKE_IOS_SDK_ROOT) + file (GLOB _CMAKE_IOS_SDKS "${CMAKE_IOS_DEVELOPER_ROOT}/SDKs/*") + if (_CMAKE_IOS_SDKS) + list (SORT _CMAKE_IOS_SDKS) + list (REVERSE _CMAKE_IOS_SDKS) + list (GET _CMAKE_IOS_SDKS 0 CMAKE_IOS_SDK_ROOT) + else (_CMAKE_IOS_SDKS) + message (FATAL_ERROR "No iOS SDK's found in default search path ${CMAKE_IOS_DEVELOPER_ROOT}. Manually set CMAKE_IOS_SDK_ROOT or install the iOS SDK.") + endif (_CMAKE_IOS_SDKS) + message (STATUS "Toolchain using default iOS SDK: ${CMAKE_IOS_SDK_ROOT}") +endif (NOT DEFINED CMAKE_IOS_SDK_ROOT) +set (CMAKE_IOS_SDK_ROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Location of the selected iOS SDK") + +# Set the sysroot default to the most recent SDK +set (CMAKE_OSX_SYSROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Sysroot used for iOS support") +message (STATUS "iOS sysroot=${CMAKE_OSX_SYSROOT}") + +# set the architecture for iOS +if (${IOS_PLATFORM} STREQUAL OS) + set (OSX_UNIVERSAL true) + set (IOS_ARCH armv7 armv7s arm64) +elseif (${IOS_PLATFORM} STREQUAL SIMULATOR) + set (IOS_ARCH i386) +elseif (${IOS_PLATFORM} STREQUAL SIMULATOR64) + set (IOS_ARCH x86_64) +endif (${IOS_PLATFORM} STREQUAL OS) + +set (CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE string "Build architecture for iOS") +message (STATUS "iOS arches=${IOS_ARCH}") + +# Set the find root to the iOS developer roots and to user defined paths +set (CMAKE_FIND_ROOT_PATH ${CMAKE_IOS_DEVELOPER_ROOT} ${CMAKE_IOS_SDK_ROOT} ${CMAKE_PREFIX_PATH} CACHE string "iOS find search path root") + +# default to searching for frameworks first +set (CMAKE_FIND_FRAMEWORK FIRST) + +# set up the default search directories for frameworks +set (CMAKE_SYSTEM_FRAMEWORK_PATH + ${CMAKE_IOS_SDK_ROOT}/System/Library/Frameworks + ${CMAKE_IOS_SDK_ROOT}/System/Library/PrivateFrameworks + ${CMAKE_IOS_SDK_ROOT}/Developer/Library/Frameworks +) + +# only search the iOS sdks, not the remainder of the host filesystem +set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) +set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + + +# This little macro lets you set any XCode specific property +macro (set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE) + set_property (TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} ${XCODE_VALUE}) +endmacro (set_xcode_property) + + +# This macro lets you find executable programs on the host system +macro (find_host_package) + set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) + set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + set (IOS FALSE) + + find_package(${ARGN}) + + set (IOS TRUE) + set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) + set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endmacro (find_host_package) diff --git a/src/SFML/Audio/CMakeLists.txt b/src/SFML/Audio/CMakeLists.txt index e375057e..eac6b8c8 100644 --- a/src/SFML/Audio/CMakeLists.txt +++ b/src/SFML/Audio/CMakeLists.txt @@ -66,16 +66,16 @@ elseif(SFML_OS_ANDROID) endif() # find external libraries -if(NOT SFML_OS_ANDROID) +if(SFML_OS_ANDROID OR SFML_OS_IOS) if(NOT SFML_OS_IOS) - find_package(OpenAL REQUIRED) + find_host_package(OpenAL REQUIRED) endif() - find_package(Vorbis REQUIRED) - find_package(FLAC REQUIRED) -else() - find_host_package(OpenAL REQUIRED) find_host_package(Vorbis REQUIRED) find_host_package(FLAC REQUIRED) +else() + find_package(OpenAL REQUIRED) + find_package(Vorbis REQUIRED) + find_package(FLAC REQUIRED) endif() if(NOT SFML_OS_IOS) diff --git a/src/SFML/Graphics/CMakeLists.txt b/src/SFML/Graphics/CMakeLists.txt index 7bbb565f..d2eab8b2 100644 --- a/src/SFML/Graphics/CMakeLists.txt +++ b/src/SFML/Graphics/CMakeLists.txt @@ -114,7 +114,7 @@ if(SFML_OPENGL_ES AND SFML_OS_LINUX) find_package(GLES REQUIRED) include_directories(${EGL_INCLUDE_DIR} ${GLES_INCLUDE_DIR}) endif() -if(SFML_OS_ANDROID) +if(SFML_OS_ANDROID OR SFML_OS_IOS) find_host_package(Freetype REQUIRED) else() find_package(Freetype REQUIRED) From b6c1acab3ce4e6caf3cb0b2f7997b2f5f78b7f21 Mon Sep 17 00:00:00 2001 From: Tucker Lein <self@tuckerle.in> Date: Mon, 27 Nov 2017 11:59:49 -0600 Subject: [PATCH 012/211] add license to top of toolchain file --- cmake/toolchains/iOS.toolchain.cmake | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cmake/toolchains/iOS.toolchain.cmake b/cmake/toolchains/iOS.toolchain.cmake index 836c1dbd..0dbc67df 100644 --- a/cmake/toolchains/iOS.toolchain.cmake +++ b/cmake/toolchains/iOS.toolchain.cmake @@ -1,3 +1,16 @@ +# Copyright (c) 2016, Bogdan Cristea <cristeab@gmail.com> +# 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. + # This file is based off of the Platform/Darwin.cmake and Platform/UnixPaths.cmake # files which are included with CMake 2.8.4 # It has been altered for iOS development From c24de5fcaf70012c507dcc6ed6b011732c1d7b8f Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <maximilian.wagenbach@native-instruments.de> Date: Mon, 15 Jan 2018 17:37:50 +0100 Subject: [PATCH 013/211] Fix for broken text when the font is reloaded. --- include/SFML/Graphics/Text.hpp | 1 + include/SFML/Graphics/Texture.hpp | 6 ++++-- src/SFML/Graphics/Text.cpp | 20 ++++++++++++++------ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/include/SFML/Graphics/Text.hpp b/include/SFML/Graphics/Text.hpp index 7b7cf611..b135ceb8 100644 --- a/include/SFML/Graphics/Text.hpp +++ b/include/SFML/Graphics/Text.hpp @@ -393,6 +393,7 @@ private: 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 20a8ede8..551dde6b 100644 --- a/include/SFML/Graphics/Texture.hpp +++ b/include/SFML/Graphics/Texture.hpp @@ -35,10 +35,11 @@ namespace sf { -class Window; +class InputStream; class RenderTarget; class RenderTexture; -class InputStream; +class Text; +class Window; //////////////////////////////////////////////////////////// /// \brief Image living on the graphics card that can be used for drawing @@ -584,6 +585,7 @@ public: private: + friend class Text; friend class RenderTexture; friend class RenderTarget; diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 5ad50c1f..6b6344c8 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -84,7 +84,8 @@ m_outlineThickness (0), m_vertices (Triangles), m_outlineVertices (Triangles), m_bounds (), -m_geometryNeedUpdate(false) +m_geometryNeedUpdate(false), +m_fontTextureId (0) { } @@ -102,7 +103,8 @@ m_outlineThickness (0), m_vertices (Triangles), m_outlineVertices (Triangles), m_bounds (), -m_geometryNeedUpdate(true) +m_geometryNeedUpdate(true), +m_fontTextureId (0) { } @@ -346,10 +348,16 @@ void Text::draw(RenderTarget& target, RenderStates states) const //////////////////////////////////////////////////////////// void Text::ensureGeometryUpdate() const { - // Do nothing, if geometry has not changed - if (!m_geometryNeedUpdate) + if (!m_font) return; + // Do nothing, if geometry has not changed and the font texture has not changed + if (!m_geometryNeedUpdate && m_font->getTexture(m_characterSize).m_cacheId == m_fontTextureId) + return; + + // Save the current fonts texture id + m_fontTextureId = m_font->getTexture(m_characterSize).m_cacheId; + // Mark geometry as updated m_geometryNeedUpdate = false; @@ -358,8 +366,8 @@ void Text::ensureGeometryUpdate() const m_outlineVertices.clear(); m_bounds = FloatRect(); - // No font or text: nothing to draw - if (!m_font || m_string.isEmpty()) + // No text: nothing to draw + if (m_string.isEmpty()) return; // Compute values related to the text style From 777ec2c04d90a4c5a45dcfe51427409e5313fff2 Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Fri, 12 Jan 2018 21:34:22 +0100 Subject: [PATCH 014/211] Fix launch of Cocoa example due to missing MainMenu.nib in bundle app --- cmake/Macros.cmake | 30 ++++++++---- examples/cocoa/CMakeLists.txt | 84 ++++++++++++++++------------------ examples/opengl/CMakeLists.txt | 3 +- examples/pong/CMakeLists.txt | 3 +- examples/shader/CMakeLists.txt | 3 +- examples/sound/CMakeLists.txt | 3 +- examples/win32/CMakeLists.txt | 3 +- 7 files changed, 69 insertions(+), 60 deletions(-) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 0f316034..ae53369a 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -151,21 +151,29 @@ endmacro() # add a new target which is a SFML example # ex: sfml_add_example(ftp # SOURCES ftp.cpp ... -# DEPENDS sfml-network sfml-system) +# BUNDLE_RESOURCES MainMenu.nib ... # Files to be added in target but not installed next to the executable +# DEPENDS sfml-network sfml-system +# [INSTALL_RESOURCES_DIR]) # In addition to the sources, also install the "resources" directory macro(sfml_add_example target) # parse the arguments - cmake_parse_arguments(THIS "GUI_APP" "" "SOURCES;DEPENDS" ${ARGN}) + cmake_parse_arguments(THIS "GUI_APP;INSTALL_RESOURCES_DIR" "" "SOURCES;BUNDLE_RESOURCES;DEPENDS" ${ARGN}) # set a source group for the source files source_group("" FILES ${THIS_SOURCES}) + # check whether resources must be added in target + set(target_input ${THIS_SOURCES}) + if(THIS_BUNDLE_RESOURCES) + set(target_input ${target_input} ${THIS_BUNDLE_RESOURCES}) + endif() + # create the target if(THIS_GUI_APP AND SFML_OS_WINDOWS AND NOT DEFINED CMAKE_CONFIGURATION_TYPES AND ${CMAKE_BUILD_TYPE} STREQUAL "Release") - add_executable(${target} WIN32 ${THIS_SOURCES}) + add_executable(${target} WIN32 ${target_input}) target_link_libraries(${target} sfml-main) else() - add_executable(${target} ${THIS_SOURCES}) + add_executable(${target} ${target_input}) endif() # set the debug suffix @@ -198,12 +206,14 @@ macro(sfml_add_example target) DESTINATION ${INSTALL_MISC_DIR}/examples/${target} COMPONENT examples) - # install the example's resources as well - set(EXAMPLE_RESOURCES "${CMAKE_SOURCE_DIR}/examples/${target}/resources") - if(EXISTS ${EXAMPLE_RESOURCES}) - install(DIRECTORY ${EXAMPLE_RESOURCES} - DESTINATION ${INSTALL_MISC_DIR}/examples/${target} - COMPONENT examples) + if (THIS_INSTALL_RESOURCES_DIR) + # install the example's resources as well + set(EXAMPLE_RESOURCES "${CMAKE_SOURCE_DIR}/examples/${target}/resources") + if(EXISTS ${EXAMPLE_RESOURCES}) + install(DIRECTORY ${EXAMPLE_RESOURCES} + DESTINATION ${INSTALL_MISC_DIR}/examples/${target} + COMPONENT examples) + endif() endif() endmacro() diff --git a/examples/cocoa/CMakeLists.txt b/examples/cocoa/CMakeLists.txt index 5f67a1d4..22b9f94a 100644 --- a/examples/cocoa/CMakeLists.txt +++ b/examples/cocoa/CMakeLists.txt @@ -1,6 +1,34 @@ set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/cocoa) +# Usage: compile_xib(INPUT path/to/file.xib OUTPUT path/to/file.nib) +function(compile_xib) + cmake_parse_arguments(THIS "" "INPUT;OUTPUT" "" ${ARGN}) + if (NOT THIS_INPUT) + message(FATAL_ERROR "Missing required argument INPUT in call to compile_xib()") + endif() + + if (NOT THIS_OUTPUT) + message(FATAL_ERROR "Missing required argument OUTPUT in call to compile_xib()") + endif() + + if (NOT DEFINED IBTOOL) + find_program(IBTOOL ibtool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin") + endif() + if(NOT IBTOOL) + message(FATAL_ERROR "ibtool is required to compile .xib files but wasn't found.") + endif() + + # Default args taken from Xcode 9 when it generates a nib from a xib + set(DEFAULT_ARGS --errors --warnings --notices --module cocoa --auto-activate-custom-fonts --target-device mac --minimum-deployment-target ${CMAKE_OSX_DEPLOYMENT_TARGET} --output-format human-readable-text) + + add_custom_command(OUTPUT "${THIS_OUTPUT}" + COMMAND "${IBTOOL}" ${DEFAULT_ARGS} "${THIS_INPUT}" --compile "${THIS_OUTPUT}" + DEPENDS "${THIS_INPUT}" + COMMENT "Generating ${THIS_OUTPUT}" + VERBATIM) +endfunction() + # all source files set(SRC ${SRCROOT}/CocoaAppDelegate.h ${SRCROOT}/CocoaAppDelegate.mm @@ -8,8 +36,7 @@ set(SRC ${SRCROOT}/CocoaAppDelegate.h ${SRCROOT}/NSString+stdstring.mm ${SRCROOT}/main.m) -# all XIB files -set(XIBS MainMenu) +compile_xib(INPUT "${SRCROOT}/MainMenu.xib" OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/MainMenu.nib") # all resource files set(RESOURCES ${SRCROOT}/resources/logo.png @@ -18,50 +45,17 @@ set(RESOURCES ${SRCROOT}/resources/logo.png ${SRCROOT}/resources/blue.png ${SRCROOT}/resources/green.png ${SRCROOT}/resources/red.png - ${SRCROOT}/resources/Credits.rtf) - -# define the cocoa target and customize it -add_executable(cocoa MACOSX_BUNDLE ${SRC} ${RESOURCES}) + ${SRCROOT}/resources/Credits.rtf + ${CMAKE_CURRENT_BINARY_DIR}/MainMenu.nib) set_source_files_properties(${RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + +# define the cocoa target and customize it +sfml_add_example(cocoa + SOURCES ${SRC} + BUNDLE_RESOURCES ${RESOURCES} + DEPENDS sfml-system sfml-window sfml-graphics) set_target_properties(cocoa PROPERTIES + MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST ${SRCROOT}/resources/Cocoa-Info.plist) -target_link_libraries(cocoa "-framework Cocoa -framework Foundation" - sfml-system sfml-window sfml-graphics) - -# set the target's folder (for IDEs that support it, e.g. Visual Studio) -set_target_properties(cocoa PROPERTIES FOLDER "Examples") - -# compile XIB files -find_program(IBTOOL ibtool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin") -if(${IBTOOL} STREQUAL "IBTOOL-NOTFOUND") - message(FATAL_ERROR "ibtool is required to compile .xib files but wasn't found.") -endif() -set(RESOURCE_PATH "cocoa.app/Contents/Resources") -set(XIB_OUTPUT_PATH "${RESOURCE_PATH}/") -set(XIB_INPUT_PATH "${SRCROOT}/") -foreach(XIB ${XIBS}) - add_custom_command(TARGET cocoa - POST_BUILD - COMMAND ${IBTOOL} --errors - --output-format human-readable-text - --compile ${XIB_OUTPUT_PATH}/${XIB}.nib - ${XIB_INPUT_PATH}/${XIB}.xib - COMMENT "Compiling ${XIB}.xib") - # deactivated options: --warnings --notices -endforeach() - -# add install rule -install(TARGETS cocoa - BUNDLE DESTINATION ${INSTALL_MISC_DIR}/examples/cocoa - COMPONENT examples) - -# -# define the cocoa target -# sfml_add_example is not compatible with application bundles ! -# -#sfml_add_example(cocoa -# SOURCES ${SRC} -# DEPENDS sfml-system sfml-window sfml-graphics) -# - +target_link_libraries(cocoa "-framework Cocoa -framework Foundation") diff --git a/examples/opengl/CMakeLists.txt b/examples/opengl/CMakeLists.txt index 3bac2b90..33ee64dd 100644 --- a/examples/opengl/CMakeLists.txt +++ b/examples/opengl/CMakeLists.txt @@ -12,4 +12,5 @@ set(ADDITIONAL_LIBRARIES ${OPENGL_LIBRARIES}) # define the opengl target sfml_add_example(opengl GUI_APP SOURCES ${SRC} - DEPENDS sfml-graphics sfml-window sfml-system ${ADDITIONAL_LIBRARIES}) + DEPENDS sfml-graphics sfml-window sfml-system ${ADDITIONAL_LIBRARIES} + INSTALL_RESOURCES_DIR) diff --git a/examples/pong/CMakeLists.txt b/examples/pong/CMakeLists.txt index 8b1c4bcb..4bec5474 100644 --- a/examples/pong/CMakeLists.txt +++ b/examples/pong/CMakeLists.txt @@ -7,4 +7,5 @@ set(SRC ${SRCROOT}/Pong.cpp) # define the pong target sfml_add_example(pong GUI_APP SOURCES ${SRC} - DEPENDS sfml-audio sfml-graphics sfml-window sfml-system) + DEPENDS sfml-audio sfml-graphics sfml-window sfml-system + INSTALL_RESOURCES_DIR) diff --git a/examples/shader/CMakeLists.txt b/examples/shader/CMakeLists.txt index eb908b25..0b85f4a5 100644 --- a/examples/shader/CMakeLists.txt +++ b/examples/shader/CMakeLists.txt @@ -9,4 +9,5 @@ set(SRC # define the shader target sfml_add_example(shader GUI_APP SOURCES ${SRC} - DEPENDS sfml-graphics sfml-window sfml-system) + DEPENDS sfml-graphics sfml-window sfml-system + INSTALL_RESOURCES_DIR) diff --git a/examples/sound/CMakeLists.txt b/examples/sound/CMakeLists.txt index 01085771..b266356a 100644 --- a/examples/sound/CMakeLists.txt +++ b/examples/sound/CMakeLists.txt @@ -7,4 +7,5 @@ set(SRC ${SRCROOT}/Sound.cpp) # define the sound target sfml_add_example(sound SOURCES ${SRC} - DEPENDS sfml-audio sfml-system) + DEPENDS sfml-audio sfml-system + INSTALL_RESOURCES_DIR) diff --git a/examples/win32/CMakeLists.txt b/examples/win32/CMakeLists.txt index c0bea6e2..3155b28a 100644 --- a/examples/win32/CMakeLists.txt +++ b/examples/win32/CMakeLists.txt @@ -7,4 +7,5 @@ set(SRC ${SRCROOT}/Win32.cpp) # define the win32 target sfml_add_example(win32 GUI_APP SOURCES ${SRC} - DEPENDS sfml-graphics sfml-window sfml-system) + DEPENDS sfml-graphics sfml-window sfml-system + INSTALL_RESOURCES_DIR) From ce7ced5488f41a67bc56727220de4c826981e3ff Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Sat, 13 Jan 2018 00:19:56 +0100 Subject: [PATCH 015/211] Replace INSTALL_RESOURCES_DIR option of sfml_add_example() command with RESOURCES_DIR --- cmake/Macros.cmake | 18 ++++++++++-------- examples/opengl/CMakeLists.txt | 2 +- examples/pong/CMakeLists.txt | 2 +- examples/shader/CMakeLists.txt | 2 +- examples/sound/CMakeLists.txt | 2 +- examples/win32/CMakeLists.txt | 2 +- 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index ae53369a..99a99603 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -153,11 +153,11 @@ endmacro() # SOURCES ftp.cpp ... # BUNDLE_RESOURCES MainMenu.nib ... # Files to be added in target but not installed next to the executable # DEPENDS sfml-network sfml-system -# [INSTALL_RESOURCES_DIR]) # In addition to the sources, also install the "resources" directory +# RESOURCES_DIR resources) # A directory to install next to the executable and sources macro(sfml_add_example target) # parse the arguments - cmake_parse_arguments(THIS "GUI_APP;INSTALL_RESOURCES_DIR" "" "SOURCES;BUNDLE_RESOURCES;DEPENDS" ${ARGN}) + cmake_parse_arguments(THIS "GUI_APP" "RESOURCES_DIR" "SOURCES;BUNDLE_RESOURCES;DEPENDS" ${ARGN}) # set a source group for the source files source_group("" FILES ${THIS_SOURCES}) @@ -206,14 +206,16 @@ macro(sfml_add_example target) DESTINATION ${INSTALL_MISC_DIR}/examples/${target} COMPONENT examples) - if (THIS_INSTALL_RESOURCES_DIR) + if (THIS_RESOURCES_DIR) # install the example's resources as well - set(EXAMPLE_RESOURCES "${CMAKE_SOURCE_DIR}/examples/${target}/resources") - if(EXISTS ${EXAMPLE_RESOURCES}) - install(DIRECTORY ${EXAMPLE_RESOURCES} - DESTINATION ${INSTALL_MISC_DIR}/examples/${target} - COMPONENT examples) + get_filename_component(THIS_RESOURCES_DIR "${THIS_RESOURCES_DIR}" ABSOLUTE) + + 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 ${INSTALL_MISC_DIR}/examples/${target} + COMPONENT examples) endif() endmacro() diff --git a/examples/opengl/CMakeLists.txt b/examples/opengl/CMakeLists.txt index 33ee64dd..14fad5de 100644 --- a/examples/opengl/CMakeLists.txt +++ b/examples/opengl/CMakeLists.txt @@ -13,4 +13,4 @@ set(ADDITIONAL_LIBRARIES ${OPENGL_LIBRARIES}) sfml_add_example(opengl GUI_APP SOURCES ${SRC} DEPENDS sfml-graphics sfml-window sfml-system ${ADDITIONAL_LIBRARIES} - INSTALL_RESOURCES_DIR) + RESOURCES_DIR resources) diff --git a/examples/pong/CMakeLists.txt b/examples/pong/CMakeLists.txt index 4bec5474..31334fa1 100644 --- a/examples/pong/CMakeLists.txt +++ b/examples/pong/CMakeLists.txt @@ -8,4 +8,4 @@ set(SRC ${SRCROOT}/Pong.cpp) sfml_add_example(pong GUI_APP SOURCES ${SRC} DEPENDS sfml-audio sfml-graphics sfml-window sfml-system - INSTALL_RESOURCES_DIR) + RESOURCES_DIR resources) diff --git a/examples/shader/CMakeLists.txt b/examples/shader/CMakeLists.txt index 0b85f4a5..a90b2c95 100644 --- a/examples/shader/CMakeLists.txt +++ b/examples/shader/CMakeLists.txt @@ -10,4 +10,4 @@ set(SRC sfml_add_example(shader GUI_APP SOURCES ${SRC} DEPENDS sfml-graphics sfml-window sfml-system - INSTALL_RESOURCES_DIR) + RESOURCES_DIR resources) diff --git a/examples/sound/CMakeLists.txt b/examples/sound/CMakeLists.txt index b266356a..99c11ca1 100644 --- a/examples/sound/CMakeLists.txt +++ b/examples/sound/CMakeLists.txt @@ -8,4 +8,4 @@ set(SRC ${SRCROOT}/Sound.cpp) sfml_add_example(sound SOURCES ${SRC} DEPENDS sfml-audio sfml-system - INSTALL_RESOURCES_DIR) + RESOURCES_DIR resources) diff --git a/examples/win32/CMakeLists.txt b/examples/win32/CMakeLists.txt index 3155b28a..1f970600 100644 --- a/examples/win32/CMakeLists.txt +++ b/examples/win32/CMakeLists.txt @@ -8,4 +8,4 @@ set(SRC ${SRCROOT}/Win32.cpp) sfml_add_example(win32 GUI_APP SOURCES ${SRC} DEPENDS sfml-graphics sfml-window sfml-system - INSTALL_RESOURCES_DIR) + RESOURCES_DIR resources) From fe39af4ec8ffb8d67e55a2e3aee33e3b6c3091aa Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Wed, 8 Nov 2017 15:30:28 +0100 Subject: [PATCH 016/211] Worked around render target bug on macOS --- src/SFML/Graphics/RenderTarget.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index 2dce1b40..cba622cd 100644 --- a/src/SFML/Graphics/RenderTarget.cpp +++ b/src/SFML/Graphics/RenderTarget.cpp @@ -373,6 +373,12 @@ void RenderTarget::resetGLStates() // Check here to make sure a context change does not happen after activate(true) bool shaderAvailable = Shader::isAvailable(); + // Workaround for states not being properly reset on + // macOS unless a context switch really takes place + #if defined(SFML_SYSTEM_MACOS) + setActive(false); + #endif + if (setActive(true)) { // Make sure that extensions are initialized From 61cdcd47ca88e0cedb10ac3ef0d3b0907267bb7d Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Tue, 24 Oct 2017 18:57:26 +0200 Subject: [PATCH 017/211] Added sf::VertexBuffer class. --- include/SFML/Graphics.hpp | 1 + include/SFML/Graphics/RenderTarget.hpp | 48 +++ include/SFML/Graphics/VertexBuffer.hpp | 408 +++++++++++++++++++++++++ src/SFML/Graphics/CMakeLists.txt | 2 + src/SFML/Graphics/GLExtensions.hpp | 38 +++ src/SFML/Graphics/GLExtensions.txt | 2 + src/SFML/Graphics/GLLoader.cpp | 86 +++++- src/SFML/Graphics/GLLoader.hpp | 69 +++++ src/SFML/Graphics/RenderTarget.cpp | 195 +++++++++--- src/SFML/Graphics/VertexBuffer.cpp | 363 ++++++++++++++++++++++ 10 files changed, 1165 insertions(+), 47 deletions(-) create mode 100644 include/SFML/Graphics/VertexBuffer.hpp create mode 100644 src/SFML/Graphics/VertexBuffer.cpp diff --git a/include/SFML/Graphics.hpp b/include/SFML/Graphics.hpp index 5bb622aa..81923520 100644 --- a/include/SFML/Graphics.hpp +++ b/include/SFML/Graphics.hpp @@ -54,6 +54,7 @@ #include <SFML/Graphics/Transformable.hpp> #include <SFML/Graphics/Vertex.hpp> #include <SFML/Graphics/VertexArray.hpp> +#include <SFML/Graphics/VertexBuffer.hpp> #include <SFML/Graphics/View.hpp> diff --git a/include/SFML/Graphics/RenderTarget.hpp b/include/SFML/Graphics/RenderTarget.hpp index 50bf7a6f..a6c7c836 100644 --- a/include/SFML/Graphics/RenderTarget.hpp +++ b/include/SFML/Graphics/RenderTarget.hpp @@ -43,6 +43,7 @@ namespace sf { class Drawable; +class VertexBuffer; //////////////////////////////////////////////////////////// /// \brief Base class for all render targets (window, texture, ...) @@ -247,6 +248,26 @@ public: void draw(const Vertex* vertices, std::size_t vertexCount, PrimitiveType type, const RenderStates& states = RenderStates::Default); + //////////////////////////////////////////////////////////// + /// \brief Draw primitives defined by a vertex buffer + /// + /// \param vertexBuffer Vertex buffer + /// \param states Render states to use for drawing + /// + //////////////////////////////////////////////////////////// + void draw(const VertexBuffer& vertexBuffer, const RenderStates& states = RenderStates::Default); + + //////////////////////////////////////////////////////////// + /// \brief Draw primitives defined by a vertex buffer + /// + /// \param vertexBuffer Vertex buffer + /// \param firstVertex Index of the first vertex to render + /// \param vertexCount Number of vertices to render + /// \param states Render states to use for drawing + /// + //////////////////////////////////////////////////////////// + void draw(const VertexBuffer& vertexBuffer, std::size_t firstVertex, std::size_t vertexCount, const RenderStates& states = RenderStates::Default); + //////////////////////////////////////////////////////////// /// \brief Return the size of the rendering region of the target /// @@ -402,6 +423,33 @@ private: //////////////////////////////////////////////////////////// void applyShader(const Shader* shader); + //////////////////////////////////////////////////////////// + /// \brief Setup environment for drawing + /// + /// \param useVertexCache Are we going to use the vertex cache? + /// \param states Render states to use for drawing + /// + //////////////////////////////////////////////////////////// + void setupDraw(bool useVertexCache, const RenderStates& states); + + //////////////////////////////////////////////////////////// + /// \brief Draw the primitives + /// + /// \param type Type of primitives to draw + /// \param firstVertex Index of the first vertex to use when drawing + /// \param vertexCount Number of vertices to use when drawing + /// + //////////////////////////////////////////////////////////// + void drawPrimitives(PrimitiveType type, std::size_t firstVertex, std::size_t vertexCount); + + //////////////////////////////////////////////////////////// + /// \brief Clean up environment after drawing + /// + /// \param states Render states used for drawing + /// + //////////////////////////////////////////////////////////// + void cleanupDraw(const RenderStates& states); + //////////////////////////////////////////////////////////// /// \brief Render states cache /// diff --git a/include/SFML/Graphics/VertexBuffer.hpp b/include/SFML/Graphics/VertexBuffer.hpp new file mode 100644 index 00000000..321e875e --- /dev/null +++ b/include/SFML/Graphics/VertexBuffer.hpp @@ -0,0 +1,408 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without 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_VERTEXBUFFER_HPP +#define SFML_VERTEXBUFFER_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include <SFML/Graphics/Export.hpp> +#include <SFML/Graphics/PrimitiveType.hpp> +#include <SFML/Graphics/Drawable.hpp> +#include <SFML/Window/GlResource.hpp> + + +namespace sf +{ +class RenderTarget; +class Vertex; + +//////////////////////////////////////////////////////////// +/// \brief Vertex buffer storage for one or more 2D primitives +/// +//////////////////////////////////////////////////////////// +class SFML_GRAPHICS_API VertexBuffer : public Drawable, private GlResource +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Usage specifiers + /// + /// If data is going to be updated once or more every frame, + /// set the usage to Stream. If data is going to be set once + /// and used for a long time without being modified, set the + /// usage to Static. For everything else Dynamic should be a + /// good compromise. + /// + //////////////////////////////////////////////////////////// + enum Usage + { + Stream, ///< Constantly changing data + Dynamic, ///< Occasionally changing data + Static ///< Rarely changing data + }; + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// Creates an empty vertex buffer. + /// + //////////////////////////////////////////////////////////// + VertexBuffer(); + + //////////////////////////////////////////////////////////// + /// \brief Construct a VertexBuffer with a specific PrimitiveType + /// + /// Creates an empty vertex buffer and sets its primitive type to \p type. + /// + /// \param type Type of primitive + /// + //////////////////////////////////////////////////////////// + explicit VertexBuffer(PrimitiveType type); + + //////////////////////////////////////////////////////////// + /// \brief Construct a VertexBuffer with a specific usage specifier + /// + /// Creates an empty vertex buffer and sets its usage to \p usage. + /// + /// \param usage Usage specifier + /// + //////////////////////////////////////////////////////////// + explicit VertexBuffer(Usage usage); + + //////////////////////////////////////////////////////////// + /// \brief Construct a VertexBuffer with a specific PrimitiveType and usage specifier + /// + /// Creates an empty vertex buffer and sets its primitive type + /// to \p type and usage to \p usage. + /// + /// \param type Type of primitive + /// \param usage Usage specifier + /// + //////////////////////////////////////////////////////////// + VertexBuffer(PrimitiveType type, Usage usage); + + //////////////////////////////////////////////////////////// + /// \brief Copy constructor + /// + /// \param copy instance to copy + /// + //////////////////////////////////////////////////////////// + VertexBuffer(const VertexBuffer& copy); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~VertexBuffer(); + + //////////////////////////////////////////////////////////// + /// \brief Create the vertex buffer + /// + /// Creates the vertex buffer and allocates enough graphics + /// memory to hold \p vertexCount vertices. Any previously + /// allocated memory is freed in the process. + /// + /// In order to deallocate previously allocated memory pass 0 + /// as \p vertexCount. Don't forget to recreate with a non-zero + /// value when graphics memory should be allocated again. + /// + /// \param vertexCount Number of vertices worth of memory to allocate + /// + /// \return True if creation was successful + /// + //////////////////////////////////////////////////////////// + bool create(std::size_t vertexCount); + + //////////////////////////////////////////////////////////// + /// \brief Return the vertex count + /// + /// \return Number of vertices in the vertex buffer + /// + //////////////////////////////////////////////////////////// + std::size_t getVertexCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Update the whole buffer from an array of vertices + /// + /// The \a vertex array is assumed to have the same size as + /// the \a created buffer. + /// + /// No additional check is performed on the size of the vertex + /// array, passing invalid arguments will lead to undefined + /// behavior. + /// + /// This function does nothing if \a vertices is null or if the + /// buffer was not previously created. + /// + /// \param vertices Array of vertices to copy to the buffer + /// + /// \return True if the update was successful + /// + //////////////////////////////////////////////////////////// + bool update(const Vertex* vertices); + + //////////////////////////////////////////////////////////// + /// \brief Update a part of the buffer from an array of vertices + /// + /// \p offset is specified as the number of vertices to skip + /// from the beginning of the buffer. + /// + /// If \p offset is 0 and \p vertexCount is equal to the size of + /// the currently created buffer, its whole contents are replaced. + /// + /// If \p offset is 0 and \p vertexCount is greater than the + /// size of the currently created buffer, a new buffer is created + /// containing the vertex data. + /// + /// If \p offset is 0 and \p vertexCount is less than the size of + /// the currently created buffer, only the corresponding region + /// is updated. + /// + /// If \p offset is not 0 and \p offset + \p vertexCount is greater + /// than the size of the currently created buffer, the update fails. + /// + /// No additional check is performed on the size of the vertex + /// array, passing invalid arguments will lead to undefined + /// behavior. + /// + /// \param vertices Array of vertices to copy to the buffer + /// \param vertexCount Number of vertices to copy + /// \param offset Offset in the buffer to copy to + /// + /// \return True if the update was successful + /// + //////////////////////////////////////////////////////////// + bool update(const Vertex* vertices, std::size_t vertexCount, unsigned int offset); + + //////////////////////////////////////////////////////////// + /// \brief Copy the contents of another buffer into this buffer + /// + /// \param vertexBuffer Vertex buffer whose contents to copy into this vertex buffer + /// + /// \return True if the copy was successful + /// + //////////////////////////////////////////////////////////// + bool update(const VertexBuffer& vertexBuffer); + + //////////////////////////////////////////////////////////// + /// \brief Overload of assignment operator + /// + /// \param right Instance to assign + /// + /// \return Reference to self + /// + //////////////////////////////////////////////////////////// + VertexBuffer& operator =(const VertexBuffer& right); + + //////////////////////////////////////////////////////////// + /// \brief Swap the contents of this vertex buffer with those of another + /// + /// \param right Instance to swap with + /// + //////////////////////////////////////////////////////////// + void swap(VertexBuffer& right); + + //////////////////////////////////////////////////////////// + /// \brief Get the underlying OpenGL handle of the vertex buffer. + /// + /// 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 OpenGL handle of the vertex buffer or 0 if not yet created + /// + //////////////////////////////////////////////////////////// + unsigned int getNativeHandle() const; + + //////////////////////////////////////////////////////////// + /// \brief Set the type of primitives to draw + /// + /// This function defines how the vertices must be interpreted + /// when it's time to draw them. + /// + /// The default primitive type is sf::Points. + /// + /// \param type Type of primitive + /// + //////////////////////////////////////////////////////////// + void setPrimitiveType(PrimitiveType type); + + //////////////////////////////////////////////////////////// + /// \brief Get the type of primitives drawn by the vertex buffer + /// + /// \return Primitive type + /// + //////////////////////////////////////////////////////////// + PrimitiveType getPrimitiveType() const; + + //////////////////////////////////////////////////////////// + /// \brief Set the usage specifier of this vertex buffer + /// + /// This function provides a hint about how this vertex buffer is + /// going to be used in terms of data update frequency. + /// + /// After changing the usage specifier, the vertex buffer has + /// to be updated with new data for the usage specifier to + /// take effect. + /// + /// The default primitive type is sf::VertexBuffer::Stream. + /// + /// \param usage Usage specifier + /// + //////////////////////////////////////////////////////////// + void setUsage(Usage usage); + + //////////////////////////////////////////////////////////// + /// \brief Get the usage specifier of this vertex buffer + /// + /// \return Usage specifier + /// + //////////////////////////////////////////////////////////// + Usage getUsage() const; + + //////////////////////////////////////////////////////////// + /// \brief Bind a vertex buffer for rendering + /// + /// This function is not part of the graphics API, it mustn't be + /// used when drawing SFML entities. It must be used only if you + /// mix sf::VertexBuffer with OpenGL code. + /// + /// \code + /// sf::VertexBuffer vb1, vb2; + /// ... + /// sf::VertexBuffer::bind(&vb1); + /// // draw OpenGL stuff that use vb1... + /// sf::VertexBuffer::bind(&vb2); + /// // draw OpenGL stuff that use vb2... + /// sf::VertexBuffer::bind(NULL); + /// // draw OpenGL stuff that use no vertex buffer... + /// \endcode + /// + /// \param vertexBuffer Pointer to the vertex buffer to bind, can be null to use no vertex buffer + /// + //////////////////////////////////////////////////////////// + static void bind(const VertexBuffer* vertexBuffer); + + //////////////////////////////////////////////////////////// + /// \brief Tell whether or not the system supports vertex buffers + /// + /// This function should always be called before using + /// the vertex buffer features. If it returns false, then + /// any attempt to use sf::VertexBuffer will fail. + /// + /// \return True if vertex buffers are supported, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool isAvailable(); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Draw the vertex buffer to a render target + /// + /// \param target Render target to draw to + /// \param states Current render states + /// + //////////////////////////////////////////////////////////// + virtual void draw(RenderTarget& target, RenderStates states) const; + +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 +}; + +} // namespace sf + + +#endif // SFML_VERTEXBUFFER_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::VertexBuffer +/// \ingroup graphics +/// +/// sf::VertexBuffer is a simple wrapper around a dynamic +/// buffer of vertices and a primitives type. +/// +/// Unlike sf::VertexArray, the vertex data is stored in +/// graphics memory. +/// +/// In situations where a large amount of vertex data would +/// have to be transferred from system memory to graphics memory +/// every frame, using sf::VertexBuffer can help. By using a +/// sf::VertexBuffer, data that has not been changed between frames +/// does not have to be re-transferred from system to graphics +/// memory as would be the case with sf::VertexArray. If data transfer +/// is a bottleneck, this can lead to performance gains. +/// +/// Using sf::VertexBuffer, the user also has the ability to only modify +/// a portion of the buffer in graphics memory. This way, a large buffer +/// can be allocated at the start of the application and only the +/// applicable portions of it need to be updated during the course of +/// the application. This allows the user to take full control of data +/// transfers between system and graphics memory if they need to. +/// +/// In special cases, the user can make use of multiple threads to update +/// vertex data in multiple distinct regions of the buffer simultaneously. +/// This might make sense when e.g. the position of multiple objects has to +/// be recalculated very frequently. The computation load can be spread +/// across multiple threads as long as there are no other data dependencies. +/// +/// Simultaneous updates to the vertex buffer are not guaranteed to be +/// carried out by the driver in any specific order. Updating the same +/// region of the buffer from multiple threads will not cause undefined +/// behaviour, however the final state of the buffer will be unpredictable. +/// +/// Simultaneous updates of distinct non-overlapping regions of the buffer +/// are also not guaranteed to complete in a specific order. However, in +/// this case the user can make sure to synchronize the writer threads at +/// well-defined points in their code. The driver will make sure that all +/// pending data transfers complete before the vertex buffer is sourced +/// by the rendering pipeline. +/// +/// It inherits sf::Drawable, but unlike other drawables it +/// is not transformable. +/// +/// Example: +/// \code +/// sf::Vertex vertices[15]; +/// ... +/// sf::VertexBuffer triangles(sf::Triangles); +/// triangles.create(15); +/// triangles.update(vertices); +/// ... +/// window.draw(triangles); +/// \endcode +/// +/// \see sf::Vertex, sf::VertexArray +/// +//////////////////////////////////////////////////////////// diff --git a/src/SFML/Graphics/CMakeLists.txt b/src/SFML/Graphics/CMakeLists.txt index d2eab8b2..3ad9b8d4 100644 --- a/src/SFML/Graphics/CMakeLists.txt +++ b/src/SFML/Graphics/CMakeLists.txt @@ -72,6 +72,8 @@ set(DRAWABLES_SRC ${INCROOT}/Text.hpp ${SRCROOT}/VertexArray.cpp ${INCROOT}/VertexArray.hpp + ${SRCROOT}/VertexBuffer.cpp + ${INCROOT}/VertexBuffer.hpp ) source_group("drawables" FILES ${DRAWABLES_SRC}) diff --git a/src/SFML/Graphics/GLExtensions.hpp b/src/SFML/Graphics/GLExtensions.hpp index 76c97512..cc5da64b 100644 --- a/src/SFML/Graphics/GLExtensions.hpp +++ b/src/SFML/Graphics/GLExtensions.hpp @@ -53,6 +53,19 @@ #define GLEXT_GL_CLAMP GL_CLAMP_TO_EDGE #define GLEXT_GL_CLAMP_TO_EDGE GL_CLAMP_TO_EDGE + // Core since 1.1 + // 1.1 does not support GL_STREAM_DRAW so we just define it to GL_DYNAMIC_DRAW + #define GLEXT_vertex_buffer_object true + #define GLEXT_GL_ARRAY_BUFFER GL_ARRAY_BUFFER + #define GLEXT_GL_DYNAMIC_DRAW GL_DYNAMIC_DRAW + #define GLEXT_GL_STATIC_DRAW GL_STATIC_DRAW + #define GLEXT_GL_STREAM_DRAW GL_DYNAMIC_DRAW + #define GLEXT_glBindBuffer glBindBuffer + #define GLEXT_glBufferData glBufferData + #define GLEXT_glBufferSubData glBufferSubData + #define GLEXT_glDeleteBuffers glDeleteBuffers + #define GLEXT_glGenBuffers glGenBuffers + // The following extensions are listed chronologically // Extension macro first, followed by tokens then // functions according to the corresponding specification @@ -114,6 +127,9 @@ // Core since 3.0 #define GLEXT_framebuffer_blit false + // Core since 3.0 - NV_copy_buffer + #define GLEXT_copy_buffer false + // Core since 3.0 - EXT_sRGB #ifdef GL_EXT_sRGB #define GLEXT_texture_sRGB GL_EXT_sRGB @@ -168,6 +184,22 @@ #define GLEXT_blend_func_separate sfogl_ext_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_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 + #define GLEXT_GL_STATIC_DRAW GL_STATIC_DRAW_ARB + #define GLEXT_GL_STREAM_DRAW GL_STREAM_DRAW_ARB + #define GLEXT_GL_WRITE_ONLY GL_WRITE_ONLY_ARB + #define GLEXT_glBindBuffer glBindBufferARB + #define GLEXT_glBufferData glBufferDataARB + #define GLEXT_glBufferSubData glBufferSubDataARB + #define GLEXT_glDeleteBuffers glDeleteBuffersARB + #define GLEXT_glGenBuffers glGenBuffersARB + #define GLEXT_glMapBuffer glMapBufferARB + #define GLEXT_glUnmapBuffer glUnmapBufferARB + // Core since 2.0 - ARB_shading_language_100 #define GLEXT_shading_language_100 sfogl_ext_ARB_shading_language_100 @@ -254,6 +286,12 @@ #define GLEXT_GL_DRAW_FRAMEBUFFER_BINDING GL_DRAW_FRAMEBUFFER_BINDING_EXT #define GLEXT_GL_READ_FRAMEBUFFER_BINDING GL_READ_FRAMEBUFFER_BINDING_EXT + // Core since 3.1 - ARB_copy_buffer + #define GLEXT_copy_buffer sfogl_ext_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_GL_GEOMETRY_SHADER GL_GEOMETRY_SHADER_ARB diff --git a/src/SFML/Graphics/GLExtensions.txt b/src/SFML/Graphics/GLExtensions.txt index 4b3ac662..fe65158c 100644 --- a/src/SFML/Graphics/GLExtensions.txt +++ b/src/SFML/Graphics/GLExtensions.txt @@ -7,6 +7,7 @@ EXT_blend_minmax EXT_blend_subtract ARB_multitexture EXT_blend_func_separate +ARB_vertex_buffer_object ARB_shading_language_100 ARB_shader_objects ARB_vertex_shader @@ -16,4 +17,5 @@ EXT_blend_equation_separate EXT_texture_sRGB EXT_framebuffer_object EXT_framebuffer_blit +ARB_copy_buffer ARB_geometry_shader4 diff --git a/src/SFML/Graphics/GLLoader.cpp b/src/SFML/Graphics/GLLoader.cpp index ec1531fb..2b459072 100644 --- a/src/SFML/Graphics/GLLoader.cpp +++ b/src/SFML/Graphics/GLLoader.cpp @@ -39,6 +39,7 @@ 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; @@ -48,6 +49,7 @@ 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_framebuffer_blit = 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; @@ -254,6 +256,69 @@ static int Load_EXT_blend_func_separate() 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; @@ -814,6 +879,19 @@ static int Load_EXT_framebuffer_blit() 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; @@ -850,13 +928,14 @@ typedef struct sfogl_StrToExtMap_s PFN_LOADFUNCPOINTERS LoadExtension; } sfogl_StrToExtMap; -static sfogl_StrToExtMap ExtensionMap[16] = { +static sfogl_StrToExtMap ExtensionMap[18] = { {"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}, @@ -866,10 +945,11 @@ static sfogl_StrToExtMap ExtensionMap[16] = { {"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_framebuffer_blit", &sfogl_ext_EXT_framebuffer_blit, Load_EXT_framebuffer_blit}, + {"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 = 16; +static int g_extensionMapSize = 18; static void ClearExtensionVars() @@ -880,6 +960,7 @@ static void ClearExtensionVars() 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; @@ -889,6 +970,7 @@ static void ClearExtensionVars() sfogl_ext_EXT_texture_sRGB = sfogl_LOAD_FAILED; sfogl_ext_EXT_framebuffer_object = sfogl_LOAD_FAILED; sfogl_ext_EXT_framebuffer_blit = sfogl_LOAD_FAILED; + sfogl_ext_ARB_copy_buffer = sfogl_LOAD_FAILED; sfogl_ext_ARB_geometry_shader4 = sfogl_LOAD_FAILED; } diff --git a/src/SFML/Graphics/GLLoader.hpp b/src/SFML/Graphics/GLLoader.hpp index a802808c..4990d3d8 100644 --- a/src/SFML/Graphics/GLLoader.hpp +++ b/src/SFML/Graphics/GLLoader.hpp @@ -176,6 +176,7 @@ 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; @@ -185,6 +186,7 @@ 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_framebuffer_blit; +extern int sfogl_ext_ARB_copy_buffer; extern int sfogl_ext_ARB_geometry_shader4; #define GL_CLAMP_TO_EDGE_SGIS 0x812F @@ -240,6 +242,38 @@ extern int sfogl_ext_ARB_geometry_shader4; #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 @@ -385,6 +419,9 @@ extern int sfogl_ext_ARB_geometry_shader4; #define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA #define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#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 @@ -1022,6 +1059,32 @@ extern void (GL_FUNCPTR *sf_ptrc_glBlendFuncSeparateEXT)(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 @@ -1254,6 +1317,12 @@ extern void (GL_FUNCPTR *sf_ptrc_glBlitFramebufferEXT)(GLint, GLint, GLint, GLin #define glBlitFramebufferEXT sf_ptrc_glBlitFramebufferEXT #endif // GL_EXT_framebuffer_blit +#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); diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index cba622cd..be2b2b6c 100644 --- a/src/SFML/Graphics/RenderTarget.cpp +++ b/src/SFML/Graphics/RenderTarget.cpp @@ -30,10 +30,21 @@ #include <SFML/Graphics/Shader.hpp> #include <SFML/Graphics/Texture.hpp> #include <SFML/Graphics/VertexArray.hpp> +#include <SFML/Graphics/VertexBuffer.hpp> #include <SFML/Graphics/GLCheck.hpp> #include <SFML/System/Err.hpp> #include <cassert> #include <iostream> +#include <algorithm> + + +// GL_QUADS is unavailable on OpenGL ES, thus we need to define GL_QUADS ourselves +#ifdef SFML_OPENGL_ES + + #define GL_QUADS 0 + +#endif // SFML_OPENGL_ES + namespace { @@ -211,17 +222,13 @@ void RenderTarget::draw(const Vertex* vertices, std::size_t vertexCount, err() << "sf::Quads primitive type is not supported on OpenGL ES platforms, drawing skipped" << std::endl; return; } - #define GL_QUADS 0 #endif if (setActive(true)) { - // First set the persistent OpenGL states if it's the very first call - if (!m_cache.glStatesSet) - resetGLStates(); - // Check if the vertex count is low enough so that we can pre-transform them bool useVertexCache = (vertexCount <= StatesCache::VertexCacheSize); + if (useVertexCache) { // Pre-transform the vertices and store them into the vertex cache @@ -232,32 +239,9 @@ void RenderTarget::draw(const Vertex* vertices, std::size_t vertexCount, vertex.color = vertices[i].color; vertex.texCoords = vertices[i].texCoords; } - - // Since vertices are transformed, we must use an identity transform to render them - if (!m_cache.useVertexCache) - glCheck(glLoadIdentity()); - } - else - { - applyTransform(states.transform); } - // Apply the view - if (m_cache.viewChanged) - applyCurrentView(); - - // Apply the blend mode - if (states.blendMode != m_cache.lastBlendMode) - applyBlendMode(states.blendMode); - - // Apply the texture - Uint64 textureId = states.texture ? states.texture->m_cacheId : 0; - if (textureId != m_cache.lastTextureId) - applyTexture(states.texture); - - // Apply the shader - if (states.shader) - applyShader(states.shader); + setupDraw(useVertexCache, states); // Check if texture coordinates array is needed, and update client state accordingly bool enableTexCoordsArray = (states.texture || states.shader); @@ -292,22 +276,8 @@ void RenderTarget::draw(const Vertex* vertices, std::size_t vertexCount, glCheck(glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), data + 12)); } - // Find the OpenGL primitive type - static const GLenum modes[] = {GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_TRIANGLES, - GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS}; - GLenum mode = modes[type]; - - // Draw the primitives - glCheck(glDrawArrays(mode, 0, static_cast<GLsizei>(vertexCount))); - - // Unbind the shader, if any - if (states.shader) - applyShader(NULL); - - // If the texture we used to draw belonged to a RenderTexture, then forcibly unbind that texture. - // This prevents a bug where some drivers do not clear RenderTextures properly. - if (states.texture && states.texture->m_fboAttachment) - applyTexture(NULL); + drawPrimitives(type, 0, vertexCount); + cleanupDraw(states); // Update the cache m_cache.useVertexCache = useVertexCache; @@ -316,6 +286,73 @@ void RenderTarget::draw(const Vertex* vertices, std::size_t vertexCount, } +//////////////////////////////////////////////////////////// +void RenderTarget::draw(const VertexBuffer& vertexBuffer, const RenderStates& states) +{ + draw(vertexBuffer, 0, vertexBuffer.getVertexCount(), states); +} + + +//////////////////////////////////////////////////////////// +void RenderTarget::draw(const VertexBuffer& vertexBuffer, std::size_t firstVertex, + std::size_t vertexCount, const RenderStates& states) +{ + // VertexBuffer not supported? + if (!VertexBuffer::isAvailable()) + { + err() << "sf::VertexBuffer is not available, drawing skipped" << std::endl; + return; + } + + // Sanity check + if (firstVertex > vertexBuffer.getVertexCount()) + return; + + // Clamp vertexCount to something that makes sense + vertexCount = std::min(vertexCount, vertexBuffer.getVertexCount() - firstVertex); + + // Nothing to draw? + if (!vertexCount || !vertexBuffer.getNativeHandle()) + return; + + // GL_QUADS is unavailable on OpenGL ES + #ifdef SFML_OPENGL_ES + if (vertexBuffer.getPrimitiveType() == Quads) + { + err() << "sf::Quads primitive type is not supported on OpenGL ES platforms, drawing skipped" << std::endl; + return; + } + #endif + + if (setActive(true)) + { + setupDraw(false, states); + + // Bind vertex buffer + VertexBuffer::bind(&vertexBuffer); + + // Always enable texture coordinates + if (!m_cache.texCoordsArrayEnabled) + glCheck(glEnableClientState(GL_TEXTURE_COORD_ARRAY)); + + glCheck(glVertexPointer(2, GL_FLOAT, sizeof(Vertex), reinterpret_cast<const void*>(0))); + glCheck(glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), reinterpret_cast<const void*>(8))); + glCheck(glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), reinterpret_cast<const void*>(12))); + + drawPrimitives(vertexBuffer.getPrimitiveType(), firstVertex, vertexCount); + + // Unbind vertex buffer + VertexBuffer::bind(NULL); + + cleanupDraw(states); + + // Update the cache + m_cache.useVertexCache = false; + m_cache.texCoordsArrayEnabled = true; + } +} + + //////////////////////////////////////////////////////////// void RenderTarget::pushGLStates() { @@ -372,6 +409,7 @@ void RenderTarget::resetGLStates() { // Check here to make sure a context change does not happen after activate(true) bool shaderAvailable = Shader::isAvailable(); + bool vertexBufferAvailable = VertexBuffer::isAvailable(); // Workaround for states not being properly reset on // macOS unless a context switch really takes place @@ -411,6 +449,9 @@ void RenderTarget::resetGLStates() if (shaderAvailable) applyShader(NULL); + if (vertexBufferAvailable) + glCheck(VertexBuffer::bind(NULL)); + m_cache.texCoordsArrayEnabled = true; m_cache.useVertexCache = false; @@ -527,6 +568,70 @@ void RenderTarget::applyShader(const Shader* shader) Shader::bind(shader); } + +//////////////////////////////////////////////////////////// +void RenderTarget::setupDraw(bool useVertexCache, const RenderStates& states) +{ + // First set the persistent OpenGL states if it's the very first call + if (!m_cache.glStatesSet) + resetGLStates(); + + if (useVertexCache) + { + // Since vertices are transformed, we must use an identity transform to render them + if (!m_cache.useVertexCache) + glCheck(glLoadIdentity()); + } + else + { + applyTransform(states.transform); + } + + // Apply the view + if (m_cache.viewChanged) + applyCurrentView(); + + // Apply the blend mode + if (states.blendMode != m_cache.lastBlendMode) + applyBlendMode(states.blendMode); + + // Apply the texture + Uint64 textureId = states.texture ? states.texture->m_cacheId : 0; + if (textureId != m_cache.lastTextureId) + applyTexture(states.texture); + + // Apply the shader + if (states.shader) + applyShader(states.shader); +} + + +//////////////////////////////////////////////////////////// +void RenderTarget::drawPrimitives(PrimitiveType type, std::size_t firstVertex, std::size_t vertexCount) +{ + // Find the OpenGL primitive type + static const GLenum modes[] = {GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_TRIANGLES, + GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS}; + GLenum mode = modes[type]; + + // Draw the primitives + glCheck(glDrawArrays(mode, firstVertex, static_cast<GLsizei>(vertexCount))); +} + + +//////////////////////////////////////////////////////////// +void RenderTarget::cleanupDraw(const RenderStates& states) +{ + // Unbind the shader, if any + if (states.shader) + applyShader(NULL); + + // If the texture we used to draw belonged to a RenderTexture, then forcibly unbind that texture. + // This prevents a bug where some drivers do not clear RenderTextures properly. + if (states.texture && states.texture->m_fboAttachment) + applyTexture(NULL); +} + } // namespace sf diff --git a/src/SFML/Graphics/VertexBuffer.cpp b/src/SFML/Graphics/VertexBuffer.cpp new file mode 100644 index 00000000..c1cc11e9 --- /dev/null +++ b/src/SFML/Graphics/VertexBuffer.cpp @@ -0,0 +1,363 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without 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/VertexBuffer.hpp> +#include <SFML/Graphics/RenderTarget.hpp> +#include <SFML/Graphics/Vertex.hpp> +#include <SFML/Graphics/GLCheck.hpp> +#include <SFML/System/Mutex.hpp> +#include <SFML/System/Lock.hpp> +#include <SFML/System/Err.hpp> +#include <cstring> + +namespace +{ + sf::Mutex isAvailableMutex; + + GLenum usageToGlEnum(sf::VertexBuffer::Usage usage) + { + 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; + } + } +} + + +namespace sf +{ +//////////////////////////////////////////////////////////// +VertexBuffer::VertexBuffer() : +m_buffer (0), +m_size (0), +m_primitiveType(Points), +m_usage (Stream) +{ +} + + +//////////////////////////////////////////////////////////// +VertexBuffer::VertexBuffer(PrimitiveType type) : +m_buffer (0), +m_size (0), +m_primitiveType(type), +m_usage (Stream) +{ +} + + +//////////////////////////////////////////////////////////// +VertexBuffer::VertexBuffer(VertexBuffer::Usage usage) : +m_buffer (0), +m_size (0), +m_primitiveType(Points), +m_usage (usage) +{ +} + + +//////////////////////////////////////////////////////////// +VertexBuffer::VertexBuffer(PrimitiveType type, VertexBuffer::Usage usage) : +m_buffer (0), +m_size (0), +m_primitiveType(type), +m_usage (usage) +{ +} + + +//////////////////////////////////////////////////////////// +VertexBuffer::VertexBuffer(const VertexBuffer& copy) : +m_buffer (0), +m_size (0), +m_primitiveType(copy.m_primitiveType), +m_usage (copy.m_usage) +{ + if (copy.m_buffer && copy.m_size) + { + if (!create(copy.m_size)) + { + err() << "Could not create vertex buffer for copying" << std::endl; + return; + } + + if (!update(copy)) + err() << "Could not copy vertex buffer" << std::endl; + } +} + + +//////////////////////////////////////////////////////////// +VertexBuffer::~VertexBuffer() +{ + if (m_buffer) + { + TransientContextLock contextLock; + + glCheck(GLEXT_glDeleteBuffers(1, &m_buffer)); + } +} + + +//////////////////////////////////////////////////////////// +bool VertexBuffer::create(std::size_t vertexCount) +{ + if (!isAvailable()) + return false; + + TransientContextLock contextLock; + + if (!m_buffer) + glCheck(GLEXT_glGenBuffers(1, &m_buffer)); + + if (!m_buffer) + { + err() << "Could not create vertex buffer, generation failed" << std::endl; + return false; + } + + 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_glBindBuffer(GLEXT_GL_ARRAY_BUFFER, 0)); + + m_size = vertexCount; + + return true; +} + + +//////////////////////////////////////////////////////////// +std::size_t VertexBuffer::getVertexCount() const +{ + return m_size; +} + + +//////////////////////////////////////////////////////////// +bool VertexBuffer::update(const Vertex* vertices) +{ + return update(vertices, m_size, 0); +} + + +//////////////////////////////////////////////////////////// +bool VertexBuffer::update(const Vertex* vertices, std::size_t vertexCount, unsigned int offset) +{ + // Sanity checks + if (!m_buffer) + return false; + + if (!vertices) + return false; + + if (offset && (offset + vertexCount > m_size)) + return false; + + TransientContextLock contextLock; + + glCheck(GLEXT_glBindBuffer(GLEXT_GL_ARRAY_BUFFER, m_buffer)); + + // 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))); + + m_size = vertexCount; + } + + glCheck(GLEXT_glBufferSubData(GLEXT_GL_ARRAY_BUFFER, sizeof(Vertex) * offset, sizeof(Vertex) * vertexCount, vertices)); + + glCheck(GLEXT_glBindBuffer(GLEXT_GL_ARRAY_BUFFER, 0)); + + return true; +} + + +//////////////////////////////////////////////////////////// +bool VertexBuffer::update(const VertexBuffer& vertexBuffer) +{ +#ifdef SFML_OPENGL_ES + + return false; + +#else + + if (!m_buffer || !vertexBuffer.m_buffer) + return false; + + TransientContextLock contextLock; + + // Make sure that extensions are initialized + sf::priv::ensureExtensionsInit(); + + if (GLEXT_copy_buffer) + { + 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_glBindBuffer(GLEXT_GL_COPY_WRITE_BUFFER, 0)); + glCheck(GLEXT_glBindBuffer(GLEXT_GL_COPY_READ_BUFFER, 0)); + + return true; + } + + 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))); + + void* destination = 0; + glCheck(destination = GLEXT_glMapBuffer(GLEXT_GL_ARRAY_BUFFER, GLEXT_GL_WRITE_ONLY)); + + glCheck(GLEXT_glBindBuffer(GLEXT_GL_ARRAY_BUFFER, vertexBuffer.m_buffer)); + + void* source = 0; + glCheck(source = GLEXT_glMapBuffer(GLEXT_GL_ARRAY_BUFFER, GLEXT_GL_READ_ONLY)); + + std::memcpy(destination, source, sizeof(Vertex) * vertexBuffer.m_size); + + GLboolean sourceResult = GL_FALSE; + glCheck(sourceResult = GLEXT_glUnmapBuffer(GLEXT_GL_ARRAY_BUFFER)); + + glCheck(GLEXT_glBindBuffer(GLEXT_GL_ARRAY_BUFFER, m_buffer)); + + GLboolean destinationResult = GL_FALSE; + glCheck(destinationResult = GLEXT_glUnmapBuffer(GLEXT_GL_ARRAY_BUFFER)); + + glCheck(GLEXT_glBindBuffer(GLEXT_GL_ARRAY_BUFFER, 0)); + + if ((sourceResult == GL_FALSE) || (destinationResult == GL_FALSE)) + return false; + + return true; + +#endif // SFML_OPENGL_ES +} + + +//////////////////////////////////////////////////////////// +VertexBuffer& VertexBuffer::operator =(const VertexBuffer& right) +{ + VertexBuffer temp(right); + + swap(temp); + + return *this; +} + + +//////////////////////////////////////////////////////////// +void VertexBuffer::swap(VertexBuffer& right) +{ + std::swap(m_size, right.m_size); + std::swap(m_buffer, right.m_buffer); + std::swap(m_primitiveType, right.m_primitiveType); + std::swap(m_usage, right.m_usage); +} + + +//////////////////////////////////////////////////////////// +unsigned int VertexBuffer::getNativeHandle() const +{ + return m_buffer; +} + + +//////////////////////////////////////////////////////////// +void VertexBuffer::bind(const VertexBuffer* vertexBuffer) +{ + if (!isAvailable()) + return; + + TransientContextLock lock; + + glCheck(GLEXT_glBindBuffer(GLEXT_GL_ARRAY_BUFFER, vertexBuffer ? vertexBuffer->m_buffer : 0)); +} + + +//////////////////////////////////////////////////////////// +void VertexBuffer::setPrimitiveType(PrimitiveType type) +{ + m_primitiveType = type; +} + + +//////////////////////////////////////////////////////////// +PrimitiveType VertexBuffer::getPrimitiveType() const +{ + return m_primitiveType; +} + + +//////////////////////////////////////////////////////////// +void VertexBuffer::setUsage(VertexBuffer::Usage usage) +{ + m_usage = usage; +} + + +//////////////////////////////////////////////////////////// +VertexBuffer::Usage VertexBuffer::getUsage() const +{ + return m_usage; +} + + +//////////////////////////////////////////////////////////// +bool VertexBuffer::isAvailable() +{ + Lock lock(isAvailableMutex); + + static bool checked = false; + static bool available = false; + + if (!checked) + { + checked = true; + + TransientContextLock contextLock; + + // Make sure that extensions are initialized + sf::priv::ensureExtensionsInit(); + + available = GLEXT_vertex_buffer_object; + } + + return available; +} + + +//////////////////////////////////////////////////////////// +void VertexBuffer::draw(RenderTarget& target, RenderStates states) const +{ + if (m_buffer && m_size) + target.draw(*this, 0, m_size, states); +} + +} // namespace sf From e31b925234676472f2705f8cfe0dc46901518929 Mon Sep 17 00:00:00 2001 From: "jonathan.r.paton@googlemail.com" <jonathan.r.paton@googlemail.com> Date: Mon, 23 Jan 2017 16:13:13 +0000 Subject: [PATCH 018/211] Added functionality to allow polymorphism with sf::SoundSource --- include/SFML/Audio/SoundSource.hpp | 51 +++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/include/SFML/Audio/SoundSource.hpp b/include/SFML/Audio/SoundSource.hpp index edcaaa29..fc71859d 100644 --- a/include/SFML/Audio/SoundSource.hpp +++ b/include/SFML/Audio/SoundSource.hpp @@ -250,6 +250,49 @@ public: //////////////////////////////////////////////////////////// SoundSource& operator =(const SoundSource& right); + //////////////////////////////////////////////////////////// + /// \brief Start or resume playing the sound source + /// + /// This function starts the source if it was stopped, resumes + /// it if it was paused, and restarts it from the beginning if + /// it was already playing. + /// + /// \see pause, stop + /// + //////////////////////////////////////////////////////////// + virtual void play() = 0; + + //////////////////////////////////////////////////////////// + /// \brief Pause the sound source + /// + /// This function pauses the source if it was playing, + /// otherwise (source already paused or stopped) it has no effect. + /// + /// \see play, stop + /// + //////////////////////////////////////////////////////////// + virtual void pause() = 0; + + //////////////////////////////////////////////////////////// + /// \brief Stop playing the sound source + /// + /// This function stops the source if it was playing or paused, + /// and does nothing if it was already stopped. + /// It also resets the playing position (unlike pause()). + /// + /// \see play, pause + /// + //////////////////////////////////////////////////////////// + virtual void stop() = 0; + + //////////////////////////////////////////////////////////// + /// \brief Get the current status of the sound (stopped, paused, playing) + /// + /// \return Current status of the sound + /// + //////////////////////////////////////////////////////////// + virtual Status getStatus() const; + protected: //////////////////////////////////////////////////////////// @@ -260,14 +303,6 @@ protected: //////////////////////////////////////////////////////////// SoundSource(); - //////////////////////////////////////////////////////////// - /// \brief Get the current status of the sound (stopped, paused, playing) - /// - /// \return Current status of the sound - /// - //////////////////////////////////////////////////////////// - Status getStatus() const; - //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// From 9e2f2eb27faeb412a75b59d19c781b5dd6e96664 Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <s52211@beuth-hochschule.de> Date: Tue, 21 Jul 2015 19:00:01 +0200 Subject: [PATCH 019/211] Implemented letter spacing in sf::Text. --- include/SFML/Graphics/Text.hpp | 26 ++++++++++++++++++++++++++ src/SFML/Graphics/Text.cpp | 28 ++++++++++++++++++++++++---- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/include/SFML/Graphics/Text.hpp b/include/SFML/Graphics/Text.hpp index b135ceb8..d109ae58 100644 --- a/include/SFML/Graphics/Text.hpp +++ b/include/SFML/Graphics/Text.hpp @@ -144,6 +144,21 @@ public: //////////////////////////////////////////////////////////// void setCharacterSize(unsigned int size); + //////////////////////////////////////////////////////////// + /// \brief Set the additional letter spacing offset + /// + /// The spacing between letters is defined by the font. + /// This method enables you to set an additional spacing + /// between letters. By default the additional letter + /// spacing offset is 0. + /// + /// \param spacing New additional letter spacing offset, in pixel + /// + /// \see getLetterSpacing + /// + //////////////////////////////////////////////////////////// + void setLetterSpacing(float spacing); + //////////////////////////////////////////////////////////// /// \brief Set the text's style /// @@ -260,6 +275,16 @@ public: //////////////////////////////////////////////////////////// unsigned int getCharacterSize() const; + //////////////////////////////////////////////////////////// + /// \brief Get the size of the additional letter spacing offset + /// + /// \return Size of the additional letter spacing offset, in pixel + /// + /// \see setLetterSpacing + /// + //////////////////////////////////////////////////////////// + float getLetterSpacing() const; + //////////////////////////////////////////////////////////// /// \brief Get the text's style /// @@ -385,6 +410,7 @@ private: 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_letterSpacing; ///< Additional spacing offset between letters, in pixel Uint32 m_style; ///< Text style (see Style enum) Color m_fillColor; ///< Text fill color Color m_outlineColor; ///< Text outline color diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 6b6344c8..24808ed0 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -77,6 +77,7 @@ Text::Text() : m_string (), m_font (NULL), m_characterSize (30), +m_letterSpacing (0.f), m_style (Regular), m_fillColor (255, 255, 255), m_outlineColor (0, 0, 0), @@ -96,6 +97,7 @@ Text::Text(const String& string, const Font& font, unsigned int characterSize) : m_string (string), m_font (&font), m_characterSize (characterSize), +m_letterSpacing (0.f), m_style (Regular), m_fillColor (255, 255, 255), m_outlineColor (0, 0, 0), @@ -143,6 +145,17 @@ void Text::setCharacterSize(unsigned int size) } +//////////////////////////////////////////////////////////// +void Text::setLetterSpacing(float spacing) +{ + if (m_letterSpacing != spacing) + { + m_letterSpacing = spacing; + m_geometryNeedUpdate = true; + } +} + + //////////////////////////////////////////////////////////// void Text::setStyle(Uint32 style) { @@ -229,6 +242,13 @@ unsigned int Text::getCharacterSize() const } +//////////////////////////////////////////////////////////// +float Text::getLetterSpacing() const +{ + return m_letterSpacing; +} + + //////////////////////////////////////////////////////////// Uint32 Text::getStyle() const { @@ -277,7 +297,7 @@ Vector2f Text::findCharacterPos(std::size_t index) const // Precompute the variables needed by the algorithm bool bold = (m_style & Bold) != 0; - float hspace = static_cast<float>(m_font->getGlyph(L' ', m_characterSize, bold).advance); + float hspace = static_cast<float>(m_font->getGlyph(L' ', m_characterSize, bold).advance) + m_letterSpacing; float vspace = static_cast<float>(m_font->getLineSpacing(m_characterSize)); // Compute the position @@ -300,7 +320,7 @@ Vector2f Text::findCharacterPos(std::size_t index) const } // For regular characters, add the advance offset of the glyph - position.x += static_cast<float>(m_font->getGlyph(curChar, m_characterSize, bold).advance); + position.x += static_cast<float>(m_font->getGlyph(curChar, m_characterSize, bold).advance) + m_letterSpacing; } // Transform the position to global coordinates @@ -385,7 +405,7 @@ void Text::ensureGeometryUpdate() const float strikeThroughOffset = xBounds.top + xBounds.height / 2.f; // Precompute the variables needed by the algorithm - float hspace = static_cast<float>(m_font->getGlyph(L' ', m_characterSize, bold).advance); + float hspace = static_cast<float>(m_font->getGlyph(L' ', m_characterSize, bold).advance) + m_letterSpacing; float vspace = static_cast<float>(m_font->getLineSpacing(m_characterSize)); float x = 0.f; float y = static_cast<float>(m_characterSize); @@ -486,7 +506,7 @@ void Text::ensureGeometryUpdate() const } // Advance to the next character - x += glyph.advance; + x += glyph.advance + m_letterSpacing; } // If we're using the underlined style, add the last line From 812dea70d058df7ce50f3b059cab27f11cb9f2b6 Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <s52211@beuth-hochschule.de> Date: Thu, 23 Jul 2015 12:17:23 +0200 Subject: [PATCH 020/211] Implemented line spacing in sf::Text. --- include/SFML/Graphics/Text.hpp | 26 +++++++++++++++++++ src/SFML/Graphics/Text.cpp | 46 ++++++++++++++++++++++++---------- 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/include/SFML/Graphics/Text.hpp b/include/SFML/Graphics/Text.hpp index d109ae58..225f9151 100644 --- a/include/SFML/Graphics/Text.hpp +++ b/include/SFML/Graphics/Text.hpp @@ -144,6 +144,21 @@ public: //////////////////////////////////////////////////////////// void setCharacterSize(unsigned int size); + //////////////////////////////////////////////////////////// + /// \brief Set the additional line spacing offset + /// + /// The spacing between lines is defined by the font. + /// This method enables you to set an additional spacing + /// between lines. By default the additional line + /// spacing offset is 0. + /// + /// \param spacing New additional line spacing offset, in pixel + /// + /// \see getLineSpacing + /// + //////////////////////////////////////////////////////////// + void setLineSpacing(float spacing); + //////////////////////////////////////////////////////////// /// \brief Set the additional letter spacing offset /// @@ -285,6 +300,16 @@ public: //////////////////////////////////////////////////////////// float getLetterSpacing() const; + //////////////////////////////////////////////////////////// + /// \brief Get the size of the additional line spacing offset + /// + /// \return Size of the additional line spacing offset, in pixel + /// + /// \see setLineSpacing + /// + //////////////////////////////////////////////////////////// + float getLineSpacing() const; + //////////////////////////////////////////////////////////// /// \brief Get the text's style /// @@ -411,6 +436,7 @@ private: const Font* m_font; ///< Font used to display the string unsigned int m_characterSize; ///< Base size of characters, in pixels float m_letterSpacing; ///< Additional spacing offset between letters, in pixel + float m_lineSpacing; ///< Additional spacing offset between lines, in pixel Uint32 m_style; ///< Text style (see Style enum) Color m_fillColor; ///< Text fill color Color m_outlineColor; ///< Text outline color diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 24808ed0..3c0abfb5 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -78,6 +78,7 @@ m_string (), m_font (NULL), m_characterSize (30), m_letterSpacing (0.f), +m_lineSpacing (0.f), m_style (Regular), m_fillColor (255, 255, 255), m_outlineColor (0, 0, 0), @@ -98,6 +99,7 @@ m_string (string), m_font (&font), m_characterSize (characterSize), m_letterSpacing (0.f), +m_lineSpacing (0.f), m_style (Regular), m_fillColor (255, 255, 255), m_outlineColor (0, 0, 0), @@ -156,6 +158,17 @@ void Text::setLetterSpacing(float spacing) } +//////////////////////////////////////////////////////////// +void Text::setLineSpacing(float spacing) +{ + if (m_lineSpacing != spacing) + { + m_lineSpacing = spacing; + m_geometryNeedUpdate = true; + } +} + + //////////////////////////////////////////////////////////// void Text::setStyle(Uint32 style) { @@ -249,6 +262,13 @@ float Text::getLetterSpacing() const } +//////////////////////////////////////////////////////////// +float Text::getLineSpacing() const +{ + return m_lineSpacing; +} + + //////////////////////////////////////////////////////////// Uint32 Text::getStyle() const { @@ -296,9 +316,9 @@ Vector2f Text::findCharacterPos(std::size_t index) const index = m_string.getSize(); // Precompute the variables needed by the algorithm - bool bold = (m_style & Bold) != 0; - float hspace = static_cast<float>(m_font->getGlyph(L' ', m_characterSize, bold).advance) + m_letterSpacing; - float vspace = static_cast<float>(m_font->getLineSpacing(m_characterSize)); + bool bold = (m_style & Bold) != 0; + float hspace = static_cast<float>(m_font->getGlyph(L' ', m_characterSize, bold).advance) + m_letterSpacing; + const float lineSpacing = static_cast<float>(m_font->getLineSpacing(m_characterSize))+ m_lineSpacing; // Compute the position Vector2f position; @@ -314,9 +334,9 @@ Vector2f Text::findCharacterPos(std::size_t index) const // Handle special characters switch (curChar) { - case ' ': position.x += hspace; continue; - case '\t': position.x += hspace * 4; continue; - case '\n': position.y += vspace; position.x = 0; continue; + case ' ': position.x += hspace; continue; + case '\t': position.x += hspace * 4; continue; + case '\n': position.y += lineSpacing; position.x = 0; continue; } // For regular characters, add the advance offset of the glyph @@ -405,10 +425,10 @@ void Text::ensureGeometryUpdate() const float strikeThroughOffset = xBounds.top + xBounds.height / 2.f; // Precompute the variables needed by the algorithm - float hspace = static_cast<float>(m_font->getGlyph(L' ', m_characterSize, bold).advance) + m_letterSpacing; - float vspace = static_cast<float>(m_font->getLineSpacing(m_characterSize)); - float x = 0.f; - float y = static_cast<float>(m_characterSize); + float hspace = static_cast<float>(m_font->getGlyph(L' ', m_characterSize, bold).advance) + m_letterSpacing; + const float lineSpacing = static_cast<float>(m_font->getLineSpacing(m_characterSize)) + m_lineSpacing; + float x = 0.f; + float y = static_cast<float>(m_characterSize); // Create one quad for each character float minX = static_cast<float>(m_characterSize); @@ -451,9 +471,9 @@ void Text::ensureGeometryUpdate() const switch (curChar) { - case ' ': x += hspace; break; - case '\t': x += hspace * 4; break; - case '\n': y += vspace; x = 0; break; + case ' ': x += hspace; break; + case '\t': x += hspace * 4; break; + case '\n': y += lineSpacing; x = 0; break; } // Update the current bounds (max coordinates) From 7ef1cff5d1edac10877bb4eb9386f5869024332a Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <s52211@beuth-hochschule.de> Date: Mon, 4 Jan 2016 09:49:23 +0100 Subject: [PATCH 021/211] Code style refactoring in sf::Text implementation. --- src/SFML/Graphics/Text.cpp | 79 +++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 3c0abfb5..d5eb652c 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -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 italic, float outlineThickness = 0) + void addGlyphQuad(sf::VertexArray& vertices, sf::Vector2f position, const sf::Color& color, const sf::Glyph& glyph, float italicShear, float outlineThickness = 0) { float left = glyph.bounds.left; float top = glyph.bounds.top; @@ -60,12 +60,12 @@ namespace float u2 = static_cast<float>(glyph.textureRect.left + glyph.textureRect.width); float v2 = static_cast<float>(glyph.textureRect.top + glyph.textureRect.height); - vertices.append(sf::Vertex(sf::Vector2f(position.x + left - italic * top - outlineThickness, position.y + top - outlineThickness), color, sf::Vector2f(u1, v1))); - vertices.append(sf::Vertex(sf::Vector2f(position.x + right - italic * top - outlineThickness, position.y + top - outlineThickness), color, sf::Vector2f(u2, v1))); - vertices.append(sf::Vertex(sf::Vector2f(position.x + left - italic * bottom - outlineThickness, position.y + bottom - outlineThickness), color, sf::Vector2f(u1, v2))); - vertices.append(sf::Vertex(sf::Vector2f(position.x + left - italic * bottom - outlineThickness, position.y + bottom - outlineThickness), color, sf::Vector2f(u1, v2))); - vertices.append(sf::Vertex(sf::Vector2f(position.x + right - italic * top - outlineThickness, position.y + top - outlineThickness), color, sf::Vector2f(u2, v1))); - vertices.append(sf::Vertex(sf::Vector2f(position.x + right - italic * bottom - outlineThickness, position.y + bottom - outlineThickness), color, sf::Vector2f(u2, v2))); + 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))); } } @@ -316,9 +316,9 @@ Vector2f Text::findCharacterPos(std::size_t index) const index = m_string.getSize(); // Precompute the variables needed by the algorithm - bool bold = (m_style & Bold) != 0; - float hspace = static_cast<float>(m_font->getGlyph(L' ', m_characterSize, bold).advance) + m_letterSpacing; - const float lineSpacing = static_cast<float>(m_font->getLineSpacing(m_characterSize))+ m_lineSpacing; + bool isBold = m_style & Bold; + float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance + m_letterSpacing; + float lineSpacing = m_font->getLineSpacing(m_characterSize)+ m_lineSpacing; // Compute the position Vector2f position; @@ -328,19 +328,19 @@ Vector2f Text::findCharacterPos(std::size_t index) const Uint32 curChar = m_string[i]; // Apply the kerning offset - position.x += static_cast<float>(m_font->getKerning(prevChar, curChar, m_characterSize)); + position.x += m_font->getKerning(prevChar, curChar, m_characterSize); prevChar = curChar; // Handle special characters switch (curChar) { - case ' ': position.x += hspace; continue; - case '\t': position.x += hspace * 4; continue; + case ' ': position.x += whitespaceWidth; continue; + case '\t': position.x += whitespaceWidth * 4; continue; case '\n': position.y += lineSpacing; position.x = 0; continue; } // For regular characters, add the advance offset of the glyph - position.x += static_cast<float>(m_font->getGlyph(curChar, m_characterSize, bold).advance) + m_letterSpacing; + position.x += m_font->getGlyph(curChar, m_characterSize, isBold).advance + m_letterSpacing; } // Transform the position to global coordinates @@ -411,24 +411,24 @@ void Text::ensureGeometryUpdate() const return; // Compute values related to the text style - bool bold = (m_style & Bold) != 0; - bool underlined = (m_style & Underlined) != 0; - bool strikeThrough = (m_style & StrikeThrough) != 0; - float italic = (m_style & Italic) ? 0.208f : 0.f; // 12 degrees + bool isBold = m_style & Bold; + bool isUnderlined = m_style & Underlined; + bool isStrikeThrough = m_style & StrikeThrough; + float italicShear = (m_style & Italic) ? 0.209f : 0.f; // 12 degrees in radians float underlineOffset = m_font->getUnderlinePosition(m_characterSize); float underlineThickness = m_font->getUnderlineThickness(m_characterSize); // Compute the location of the strike through dynamically // We use the center point of the lowercase 'x' glyph as the reference // We reuse the underline thickness as the thickness of the strike through as well - FloatRect xBounds = m_font->getGlyph(L'x', m_characterSize, bold).bounds; + FloatRect xBounds = m_font->getGlyph(L'x', m_characterSize, isBold).bounds; float strikeThroughOffset = xBounds.top + xBounds.height / 2.f; // Precompute the variables needed by the algorithm - float hspace = static_cast<float>(m_font->getGlyph(L' ', m_characterSize, bold).advance) + m_letterSpacing; - const float lineSpacing = static_cast<float>(m_font->getLineSpacing(m_characterSize)) + m_lineSpacing; - float x = 0.f; - float y = static_cast<float>(m_characterSize); + float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance + m_letterSpacing; + float lineSpacing = m_font->getLineSpacing(m_characterSize) + m_lineSpacing; + float x = 0.f; + float y = static_cast<float>(m_characterSize); // Create one quad for each character float minX = static_cast<float>(m_characterSize); @@ -445,7 +445,7 @@ void Text::ensureGeometryUpdate() const prevChar = curChar; // If we're using the underlined style and there's a new line, draw a line - if (underlined && (curChar == L'\n')) + if (isUnderlined && (curChar == L'\n')) { addLine(m_vertices, x, y, m_fillColor, underlineOffset, underlineThickness); @@ -454,7 +454,7 @@ void Text::ensureGeometryUpdate() const } // If we're using the strike through style and there's a new line, draw a line across all characters - if (strikeThrough && (curChar == L'\n')) + if (isStrikeThrough && (curChar == L'\n')) { addLine(m_vertices, x, y, m_fillColor, strikeThroughOffset, underlineThickness); @@ -463,7 +463,7 @@ void Text::ensureGeometryUpdate() const } // Handle special characters - if ((curChar == ' ') || (curChar == '\t') || (curChar == '\n')) + if ((curChar == L' ') || (curChar == L'\n') || (curChar == L'\t')) { // Update the current bounds (min coordinates) minX = std::min(minX, x); @@ -471,9 +471,9 @@ void Text::ensureGeometryUpdate() const switch (curChar) { - case ' ': x += hspace; break; - case '\t': x += hspace * 4; break; - case '\n': y += lineSpacing; x = 0; break; + case L' ': x += whitespaceWidth; break; + case L'\t': x += whitespaceWidth * 4; break; + case L'\n': y += lineSpacing; x = 0; break; } // Update the current bounds (max coordinates) @@ -484,11 +484,10 @@ void Text::ensureGeometryUpdate() const continue; } - // Apply the outline if (m_outlineThickness != 0) { - const Glyph& glyph = m_font->getGlyph(curChar, m_characterSize, bold, m_outlineThickness); + const Glyph& glyph = m_font->getGlyph(curChar, m_characterSize, isBold, m_outlineThickness); float left = glyph.bounds.left; float top = glyph.bounds.top; @@ -496,20 +495,20 @@ void Text::ensureGeometryUpdate() const float bottom = glyph.bounds.top + glyph.bounds.height; // Add the outline glyph to the vertices - addGlyphQuad(m_outlineVertices, Vector2f(x, y), m_outlineColor, glyph, italic, m_outlineThickness); + 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 - italic * bottom - m_outlineThickness); - maxX = std::max(maxX, x + right - italic * top - m_outlineThickness); + 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); } // Extract the current glyph's description - const Glyph& glyph = m_font->getGlyph(curChar, m_characterSize, bold); + const Glyph& glyph = m_font->getGlyph(curChar, m_characterSize, isBold); // Add the glyph to the vertices - addGlyphQuad(m_vertices, Vector2f(x, y), m_fillColor, glyph, italic); + addGlyphQuad(m_vertices, Vector2f(x, y), m_fillColor, glyph, italicShear); // Update the current bounds with the non outlined glyph bounds if (m_outlineThickness == 0) @@ -519,8 +518,8 @@ void Text::ensureGeometryUpdate() const float right = glyph.bounds.left + glyph.bounds.width; float bottom = glyph.bounds.top + glyph.bounds.height; - minX = std::min(minX, x + left - italic * bottom); - maxX = std::max(maxX, x + right - italic * top); + 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); } @@ -530,7 +529,7 @@ void Text::ensureGeometryUpdate() const } // If we're using the underlined style, add the last line - if (underlined && (x > 0)) + if (isUnderlined && (x > 0)) { addLine(m_vertices, x, y, m_fillColor, underlineOffset, underlineThickness); @@ -539,7 +538,7 @@ void Text::ensureGeometryUpdate() const } // If we're using the strike through style, add the last line across all characters - if (strikeThrough && (x > 0)) + if (isStrikeThrough && (x > 0)) { addLine(m_vertices, x, y, m_fillColor, strikeThroughOffset, underlineThickness); From 73892dfa124c4153de64a164c164b041891079ea Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <s52211@beuth-hochschule.de> Date: Wed, 20 Jan 2016 01:07:50 +0100 Subject: [PATCH 022/211] Updated sf::Text documentation and OpenGL example. --- include/SFML/Graphics/Text.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/SFML/Graphics/Text.hpp b/include/SFML/Graphics/Text.hpp index 225f9151..9f6f22d4 100644 --- a/include/SFML/Graphics/Text.hpp +++ b/include/SFML/Graphics/Text.hpp @@ -464,8 +464,9 @@ private: /// It inherits all the functions from sf::Transformable: /// position, rotation, scale, origin. It also adds text-specific /// properties such as the font to use, the character size, -/// the font style (bold, italic, underlined, strike through), the -/// global color and the text to display of course. +/// the font style (bold, italic, underlined and strike through), the +/// text color, the outline thickness, the outline color, the character +/// spacing, the line spacing and the text to display of course. /// It also provides convenience functions to calculate the /// graphical size of the text, or to get the global position /// of a given character. From 65d26be74dc51773a1ba8dd3f625db7b5770e57a Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <maximilian.wagenbach@native-instruments.de> Date: Mon, 4 Sep 2017 14:46:49 +0200 Subject: [PATCH 023/211] Changed the implementation from offsets to factors. --- include/SFML/Graphics/Text.hpp | 62 ++++++++++++------------- src/SFML/Graphics/Text.cpp | 84 +++++++++++++++++----------------- 2 files changed, 72 insertions(+), 74 deletions(-) diff --git a/include/SFML/Graphics/Text.hpp b/include/SFML/Graphics/Text.hpp index 9f6f22d4..6aa17591 100644 --- a/include/SFML/Graphics/Text.hpp +++ b/include/SFML/Graphics/Text.hpp @@ -145,34 +145,32 @@ public: void setCharacterSize(unsigned int size); //////////////////////////////////////////////////////////// - /// \brief Set the additional line spacing offset + /// \brief Set the line spacing factor /// - /// The spacing between lines is defined by the font. - /// This method enables you to set an additional spacing - /// between lines. By default the additional line - /// spacing offset is 0. + /// The default spacing between lines is defined by the font. + /// This method enables you to set a factor for the spacing + /// between lines. By default the line spacing offset is 1. /// - /// \param spacing New additional line spacing offset, in pixel + /// \param spacing New line spacing factor /// /// \see getLineSpacing /// //////////////////////////////////////////////////////////// - void setLineSpacing(float spacing); + void setLineSpacing(float spacingFactor); //////////////////////////////////////////////////////////// - /// \brief Set the additional letter spacing offset + /// \brief Set the letter spacing factor /// - /// The spacing between letters is defined by the font. - /// This method enables you to set an additional spacing - /// between letters. By default the additional letter - /// spacing offset is 0. + /// The default spacing between letters is defined by the font. + /// This method enables you to set a factor to the spacing + /// between letters. By default the letter spacing factor is 1. /// - /// \param spacing New additional letter spacing offset, in pixel + /// \param spacing New letter spacing factor /// /// \see getLetterSpacing /// //////////////////////////////////////////////////////////// - void setLetterSpacing(float spacing); + void setLetterSpacing(float spacingFactor); //////////////////////////////////////////////////////////// /// \brief Set the text's style @@ -291,9 +289,9 @@ public: unsigned int getCharacterSize() const; //////////////////////////////////////////////////////////// - /// \brief Get the size of the additional letter spacing offset + /// \brief Get the size of the letter spacing factor /// - /// \return Size of the additional letter spacing offset, in pixel + /// \return Size of the letter spacing factor /// /// \see setLetterSpacing /// @@ -301,9 +299,9 @@ public: float getLetterSpacing() const; //////////////////////////////////////////////////////////// - /// \brief Get the size of the additional line spacing offset + /// \brief Get the size of the line spacing factor /// - /// \return Size of the additional line spacing offset, in pixel + /// \return Size of the line spacing factor /// /// \see setLineSpacing /// @@ -432,20 +430,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_letterSpacing; ///< Additional spacing offset between letters, in pixel - float m_lineSpacing; ///< Additional spacing offset between lines, in pixel - 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/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index d5eb652c..09aafe6e 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -74,20 +74,20 @@ namespace sf { //////////////////////////////////////////////////////////// Text::Text() : -m_string (), -m_font (NULL), -m_characterSize (30), -m_letterSpacing (0.f), -m_lineSpacing (0.f), -m_style (Regular), -m_fillColor (255, 255, 255), -m_outlineColor (0, 0, 0), -m_outlineThickness (0), -m_vertices (Triangles), -m_outlineVertices (Triangles), -m_bounds (), -m_geometryNeedUpdate(false), -m_fontTextureId (0) +m_string (), +m_font (NULL), +m_characterSize (30), +m_letterSpacingFactor(1.f), +m_lineSpacingFactor (1.f), +m_style (Regular), +m_fillColor (255, 255, 255), +m_outlineColor (0, 0, 0), +m_outlineThickness (0), +m_vertices (Triangles), +m_outlineVertices (Triangles), +m_bounds (), +m_geometryNeedUpdate (false), +m_fontTextureId (0) { } @@ -95,20 +95,20 @@ m_fontTextureId (0) //////////////////////////////////////////////////////////// Text::Text(const String& string, const Font& font, unsigned int characterSize) : -m_string (string), -m_font (&font), -m_characterSize (characterSize), -m_letterSpacing (0.f), -m_lineSpacing (0.f), -m_style (Regular), -m_fillColor (255, 255, 255), -m_outlineColor (0, 0, 0), -m_outlineThickness (0), -m_vertices (Triangles), -m_outlineVertices (Triangles), -m_bounds (), -m_geometryNeedUpdate(true), -m_fontTextureId (0) +m_string (string), +m_font (&font), +m_characterSize (characterSize), +m_letterSpacingFactor(1.f), +m_lineSpacingFactor (1.f), +m_style (Regular), +m_fillColor (255, 255, 255), +m_outlineColor (0, 0, 0), +m_outlineThickness (0), +m_vertices (Triangles), +m_outlineVertices (Triangles), +m_bounds (), +m_geometryNeedUpdate (true), +m_fontTextureId (0) { } @@ -148,22 +148,22 @@ void Text::setCharacterSize(unsigned int size) //////////////////////////////////////////////////////////// -void Text::setLetterSpacing(float spacing) +void Text::setLetterSpacing(float spacingFactor) { - if (m_letterSpacing != spacing) + if (m_letterSpacingFactor != spacingFactor) { - m_letterSpacing = spacing; + m_letterSpacingFactor = spacingFactor; m_geometryNeedUpdate = true; } } //////////////////////////////////////////////////////////// -void Text::setLineSpacing(float spacing) +void Text::setLineSpacing(float spacingFactor) { - if (m_lineSpacing != spacing) + if (m_lineSpacingFactor != spacingFactor) { - m_lineSpacing = spacing; + m_lineSpacingFactor = spacingFactor; m_geometryNeedUpdate = true; } } @@ -258,14 +258,14 @@ unsigned int Text::getCharacterSize() const //////////////////////////////////////////////////////////// float Text::getLetterSpacing() const { - return m_letterSpacing; + return m_letterSpacingFactor; } //////////////////////////////////////////////////////////// float Text::getLineSpacing() const { - return m_lineSpacing; + return m_lineSpacingFactor; } @@ -317,8 +317,8 @@ Vector2f Text::findCharacterPos(std::size_t index) const // Precompute the variables needed by the algorithm bool isBold = m_style & Bold; - float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance + m_letterSpacing; - float lineSpacing = m_font->getLineSpacing(m_characterSize)+ m_lineSpacing; + float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance * m_letterSpacingFactor; + float lineSpacing = m_font->getLineSpacing(m_characterSize) * m_lineSpacingFactor; // Compute the position Vector2f position; @@ -340,7 +340,7 @@ Vector2f Text::findCharacterPos(std::size_t index) const } // For regular characters, add the advance offset of the glyph - position.x += m_font->getGlyph(curChar, m_characterSize, isBold).advance + m_letterSpacing; + position.x += m_font->getGlyph(curChar, m_characterSize, isBold).advance * m_letterSpacingFactor; } // Transform the position to global coordinates @@ -425,8 +425,8 @@ void Text::ensureGeometryUpdate() const float strikeThroughOffset = xBounds.top + xBounds.height / 2.f; // Precompute the variables needed by the algorithm - float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance + m_letterSpacing; - float lineSpacing = m_font->getLineSpacing(m_characterSize) + m_lineSpacing; + float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance * m_letterSpacingFactor; + float lineSpacing = m_font->getLineSpacing(m_characterSize) * m_lineSpacingFactor; float x = 0.f; float y = static_cast<float>(m_characterSize); @@ -525,7 +525,7 @@ void Text::ensureGeometryUpdate() const } // Advance to the next character - x += glyph.advance + m_letterSpacing; + x += glyph.advance * m_letterSpacingFactor; } // If we're using the underlined style, add the last line From 341bc2a1308fee3eff27223da77fb0c512e3988b Mon Sep 17 00:00:00 2001 From: papychacal <papychacal@gmail.com> Date: Thu, 18 Jan 2018 17:39:35 +0100 Subject: [PATCH 024/211] Added Tagfile generation and finding --- cmake/Modules/FindSFML.cmake | 4 ++++ doc/doxyfile.in | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cmake/Modules/FindSFML.cmake b/cmake/Modules/FindSFML.cmake index d2ec360b..3341177e 100644 --- a/cmake/Modules/FindSFML.cmake +++ b/cmake/Modules/FindSFML.cmake @@ -78,6 +78,10 @@ find_path(SFML_INCLUDE_DIR SFML/Config.hpp PATH_SUFFIXES include PATHS ${FIND_SFML_PATHS}) +find_path(SFML_DOC_DIR SFML.tag + PATH_SUFFIXES SFML/doc share/SFML/doc + PATHS ${FIND_SFML_PATHS}) + # check the version number set(SFML_VERSION_OK TRUE) if(SFML_FIND_VERSION AND SFML_INCLUDE_DIR) diff --git a/doc/doxyfile.in b/doc/doxyfile.in index 9a44a6aa..34cff3ab 100644 --- a/doc/doxyfile.in +++ b/doc/doxyfile.in @@ -2046,7 +2046,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 = +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 listed. From 6d122e96e1367aa9159122712f23d2c8074184e7 Mon Sep 17 00:00:00 2001 From: Alec Iverson <adiverso93@gmail.com> Date: Sat, 6 Jan 2018 13:22:15 -0700 Subject: [PATCH 025/211] Restore fullscreen of a non-visible Unix window --- src/SFML/Window/Unix/WindowImplX11.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/SFML/Window/Unix/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index 83925a08..c83520fa 100644 --- a/src/SFML/Window/Unix/WindowImplX11.cpp +++ b/src/SFML/Window/Unix/WindowImplX11.cpp @@ -1034,6 +1034,9 @@ void WindowImplX11::setVisible(bool visible) { XMapWindow(m_display, m_window); + if(m_fullscreen) + switchToFullscreen(); + XFlush(m_display); // Before continuing, make sure the WM has From 6d4e870e320be743cb7699de7e964bb308dea05a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Agostinho?= <sergio.r.agostinho@gmail.com> Date: Thu, 25 Jan 2018 20:49:43 +0000 Subject: [PATCH 026/211] Correct docstring for seek --- include/SFML/Audio/InputSoundFile.hpp | 5 +++-- include/SFML/Audio/SoundFileReader.hpp | 5 +++-- src/SFML/Audio/SoundFileReaderFlac.hpp | 5 +++-- src/SFML/Audio/SoundFileReaderOgg.hpp | 5 +++-- src/SFML/Audio/SoundFileReaderWav.hpp | 5 +++-- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/include/SFML/Audio/InputSoundFile.hpp b/include/SFML/Audio/InputSoundFile.hpp index d50e76ec..8c51db85 100644 --- a/include/SFML/Audio/InputSoundFile.hpp +++ b/include/SFML/Audio/InputSoundFile.hpp @@ -159,8 +159,9 @@ public: /// other overload. /// /// The sample offset takes the channels into account. - /// Offsets can be calculated like this: - /// `sampleNumber * sampleRate * channelCount` + /// 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 jumps to the end of the sound file. /// diff --git a/include/SFML/Audio/SoundFileReader.hpp b/include/SFML/Audio/SoundFileReader.hpp index 006ce654..e0623010 100644 --- a/include/SFML/Audio/SoundFileReader.hpp +++ b/include/SFML/Audio/SoundFileReader.hpp @@ -80,8 +80,9 @@ public: /// \brief Change the current read position to the given sample offset /// /// The sample offset takes the channels into account. - /// Offsets can be calculated like this: - /// `sampleNumber * sampleRate * channelCount` + /// 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. /// diff --git a/src/SFML/Audio/SoundFileReaderFlac.hpp b/src/SFML/Audio/SoundFileReaderFlac.hpp index bde8a197..5b53a7dd 100644 --- a/src/SFML/Audio/SoundFileReaderFlac.hpp +++ b/src/SFML/Audio/SoundFileReaderFlac.hpp @@ -83,8 +83,9 @@ public: /// \brief Change the current read position to the given sample offset /// /// The sample offset takes the channels into account. - /// Offsets can be calculated like this: - /// `sampleNumber * sampleRate * channelCount` + /// 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. /// diff --git a/src/SFML/Audio/SoundFileReaderOgg.hpp b/src/SFML/Audio/SoundFileReaderOgg.hpp index b1bf2529..5da56f41 100644 --- a/src/SFML/Audio/SoundFileReaderOgg.hpp +++ b/src/SFML/Audio/SoundFileReaderOgg.hpp @@ -83,8 +83,9 @@ public: /// \brief Change the current read position to the given sample offset /// /// The sample offset takes the channels into account. - /// Offsets can be calculated like this: - /// `sampleNumber * sampleRate * channelCount` + /// 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. /// diff --git a/src/SFML/Audio/SoundFileReaderWav.hpp b/src/SFML/Audio/SoundFileReaderWav.hpp index 904408b2..89144a19 100644 --- a/src/SFML/Audio/SoundFileReaderWav.hpp +++ b/src/SFML/Audio/SoundFileReaderWav.hpp @@ -75,8 +75,9 @@ public: /// \brief Change the current read position to the given sample offset /// /// The sample offset takes the channels into account. - /// Offsets can be calculated like this: - /// `sampleNumber * sampleRate * channelCount` + /// 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. /// From d6c6345d4c4f3d9345f0a2e598cc49bdae819f06 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Wed, 24 Jan 2018 15:29:19 -0800 Subject: [PATCH 027/211] Don't need to find vorbisfile or vorbisenc on iOS --- cmake/Modules/FindVorbis.cmake | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/cmake/Modules/FindVorbis.cmake b/cmake/Modules/FindVorbis.cmake index 645bba76..e285411a 100644 --- a/cmake/Modules/FindVorbis.cmake +++ b/cmake/Modules/FindVorbis.cmake @@ -12,13 +12,18 @@ find_path(VORBIS_INCLUDE_DIR vorbis/vorbisfile.h) find_library(OGG_LIBRARY NAMES ogg) find_library(VORBIS_LIBRARY NAMES vorbis) -find_library(VORBISFILE_LIBRARY NAMES vorbisfile) -find_library(VORBISENC_LIBRARY NAMES vorbisenc) +if (NOT SFML_OS_IOS) + find_library(VORBISFILE_LIBRARY NAMES vorbisfile) + find_library(VORBISENC_LIBRARY NAMES vorbisenc) + set(VORBIS_LIBRARIES ${VORBISENC_LIBRARY} ${VORBISFILE_LIBRARY} ${VORBIS_LIBRARY} ${OGG_LIBRARY}) +else() + set(VORBIS_LIBRARIES ${VORBIS_LIBRARY} ${OGG_LIBRARY}) +endif() include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(VORBIS DEFAULT_MSG VORBIS_LIBRARY VORBISFILE_LIBRARY VORBISENC_LIBRARY OGG_LIBRARY VORBIS_INCLUDE_DIR OGG_INCLUDE_DIR) + +find_package_handle_standard_args(VORBIS DEFAULT_MSG VORBIS_LIBRARIES VORBIS_INCLUDE_DIR OGG_INCLUDE_DIR) set(VORBIS_INCLUDE_DIRS ${OGG_INCLUDE_DIR} ${VORBIS_INCLUDE_DIR}) -set(VORBIS_LIBRARIES ${VORBISENC_LIBRARY} ${VORBISFILE_LIBRARY} ${VORBIS_LIBRARY} ${OGG_LIBRARY}) mark_as_advanced(OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY VORBISENC_LIBRARY) From 1062e95e39996356dde9794ee45d392afa47d1ec Mon Sep 17 00:00:00 2001 From: hobby8 <hobby8@users.noreply.github.com> Date: Fri, 26 Jan 2018 17:49:26 +0200 Subject: [PATCH 028/211] Fixed Win32 modifier keys handling --- src/SFML/Window/Win32/WindowImplWin32.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index 78d13d31..ef049726 100755 --- a/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -173,7 +173,7 @@ m_lastSize (mode.width, mode.height), m_resizing (false), m_surrogate (0), m_mouseInside (false), -m_fullscreen (style & Style::Fullscreen), +m_fullscreen ((style & Style::Fullscreen) != 0), m_cursorGrabbed (m_fullscreen) { // Set that this process is DPI aware and can handle DPI scaling @@ -728,10 +728,10 @@ void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam) { Event event; event.type = Event::KeyPressed; - event.key.alt = HIWORD(GetAsyncKeyState(VK_MENU)) != 0; - event.key.control = HIWORD(GetAsyncKeyState(VK_CONTROL)) != 0; - event.key.shift = HIWORD(GetAsyncKeyState(VK_SHIFT)) != 0; - event.key.system = HIWORD(GetAsyncKeyState(VK_LWIN)) || HIWORD(GetAsyncKeyState(VK_RWIN)); + 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); pushEvent(event); } @@ -744,10 +744,10 @@ void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam) { Event event; event.type = Event::KeyReleased; - event.key.alt = HIWORD(GetAsyncKeyState(VK_MENU)) != 0; - event.key.control = HIWORD(GetAsyncKeyState(VK_CONTROL)) != 0; - event.key.shift = HIWORD(GetAsyncKeyState(VK_SHIFT)) != 0; - event.key.system = HIWORD(GetAsyncKeyState(VK_LWIN)) || HIWORD(GetAsyncKeyState(VK_RWIN)); + 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); pushEvent(event); break; From 14dd503c8ac04ee89f1ea6da06ef003db840049b Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <maximilian.wagenbach@native-instruments.de> Date: Fri, 26 Jan 2018 15:19:41 +0100 Subject: [PATCH 029/211] Generate shape outline vertices only if necessary. --- src/SFML/Graphics/Shape.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/SFML/Graphics/Shape.cpp b/src/SFML/Graphics/Shape.cpp index c0d4f821..24affe78 100644 --- a/src/SFML/Graphics/Shape.cpp +++ b/src/SFML/Graphics/Shape.cpp @@ -251,6 +251,14 @@ void Shape::updateTexCoords() //////////////////////////////////////////////////////////// void Shape::updateOutline() { + // Return if there is no outline + if (m_outlineThickness == 0.f) + { + m_outlineVertices.clear(); + m_bounds = m_insideBounds; + return; + } + std::size_t count = m_vertices.getVertexCount() - 2; m_outlineVertices.resize((count + 1) * 2); From 511c16329e5864c5bce3379e04b435f7e4ede1e4 Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Sun, 28 Jan 2018 18:35:00 +0100 Subject: [PATCH 030/211] Use -stdlib=libc++ on macOS --- CMakeLists.txt | 3 +++ cmake/Macros.cmake | 42 ++++++++++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b4febf68..a686a5ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -356,6 +356,9 @@ else() # create SFML.framework add_library(SFML ${SFML_SOURCES}) + # set the target flags to use the appropriate C++ standard library + sfml_set_stdlib(SFML) + # edit target properties set_target_properties(SFML PROPERTIES FRAMEWORK TRUE diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 99a99603..f9063367 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -1,5 +1,27 @@ include(CMakeParseArguments) +# set the appropriate standard library on each platform for the given target +# ex: sfml_set_stdlib(sfml-system) +function(sfml_set_stdlib target) + # for gcc >= 4.0 on Windows, apply the SFML_USE_STATIC_STD_LIBS option if it is enabled + if(SFML_OS_WINDOWS AND SFML_COMPILER_GCC AND NOT SFML_GCC_VERSION VERSION_LESS "4") + if(SFML_USE_STATIC_STD_LIBS AND NOT SFML_COMPILER_GCC_TDM) + target_link_libraries(${target} "-static-libgcc" "-static-libstdc++") + elseif(NOT SFML_USE_STATIC_STD_LIBS AND SFML_COMPILER_GCC_TDM) + target_link_libraries(${target} "-shared-libgcc" "-shared-libstdc++") + endif() + endif() + + if (SFML_OS_MACOSX) + if (${CMAKE_GENERATOR} MATCHES "Xcode") + set_property(TARGET ${target} PROPERTY XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") + else() + target_compile_options(${target} PRIVATE "-stdlib=libc++") + target_link_libraries(${target} "-stdlib=libc++") + endif() + endif() +endfunction() + # add a new target which is a SFML library # ex: sfml_add_library(sfml-graphics # SOURCES sprite.cpp image.cpp ... @@ -50,14 +72,8 @@ macro(sfml_add_library target) # set the target's folder (for IDEs that support it, e.g. Visual Studio) set_target_properties(${target} PROPERTIES FOLDER "SFML") - # for gcc >= 4.0 on Windows, apply the SFML_USE_STATIC_STD_LIBS option if it is enabled - if(SFML_OS_WINDOWS AND SFML_COMPILER_GCC AND NOT SFML_GCC_VERSION VERSION_LESS "4") - if(SFML_USE_STATIC_STD_LIBS AND NOT SFML_COMPILER_GCC_TDM) - set_target_properties(${target} PROPERTIES LINK_FLAGS "-static-libgcc -static-libstdc++") - elseif(NOT SFML_USE_STATIC_STD_LIBS AND SFML_COMPILER_GCC_TDM) - set_target_properties(${target} PROPERTIES LINK_FLAGS "-shared-libgcc -shared-libstdc++") - endif() - endif() + # set the target flags to use the appropriate C++ standard library + sfml_set_stdlib(${target}) # For Visual Studio on Windows, export debug symbols (PDB files) to lib directory if(SFML_GENERATE_PDB) @@ -182,14 +198,8 @@ macro(sfml_add_example target) # set the target's folder (for IDEs that support it, e.g. Visual Studio) set_target_properties(${target} PROPERTIES FOLDER "Examples") - # for gcc >= 4.0 on Windows, apply the SFML_USE_STATIC_STD_LIBS option if it is enabled - if(SFML_OS_WINDOWS AND SFML_COMPILER_GCC AND NOT SFML_GCC_VERSION VERSION_LESS "4") - if(SFML_USE_STATIC_STD_LIBS AND NOT SFML_COMPILER_GCC_TDM) - set_target_properties(${target} PROPERTIES LINK_FLAGS "-static-libgcc -static-libstdc++") - elseif(NOT SFML_USE_STATIC_STD_LIBS AND SFML_COMPILER_GCC_TDM) - set_target_properties(${target} PROPERTIES LINK_FLAGS "-shared-libgcc -shared-libstdc++") - endif() - endif() + # set the target flags to use the appropriate C++ standard library + sfml_set_stdlib(${target}) # link the target to its SFML dependencies if(THIS_DEPENDS) From d972216c57e2fe28fd36dad55c0772078640e971 Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <maximilian.wagenbach@native-instruments.de> Date: Mon, 29 Jan 2018 19:35:05 +0100 Subject: [PATCH 031/211] Fix memory leak in sf::Text. --- src/SFML/Graphics/Font.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Graphics/Font.cpp b/src/SFML/Graphics/Font.cpp index f148956e..d59746bb 100644 --- a/src/SFML/Graphics/Font.cpp +++ b/src/SFML/Graphics/Font.cpp @@ -558,7 +558,7 @@ Glyph Font::loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, f FT_Stroker stroker = static_cast<FT_Stroker>(m_stroker); FT_Stroker_Set(stroker, static_cast<FT_Fixed>(outlineThickness * static_cast<float>(1 << 6)), FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); - FT_Glyph_Stroke(&glyphDesc, stroker, false); + FT_Glyph_Stroke(&glyphDesc, stroker, true); } } From 22f1b85515242c44d7e5a1be1e3960bdf6648b52 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Thu, 21 Dec 2017 20:54:58 +0100 Subject: [PATCH 032/211] Added support for interfacing with joysticks via DirectInput when it is available. --- extlibs/headers/mingw/_mingw_dxhelper.h | 117 + extlibs/headers/mingw/dinput.h | 2467 +++++++++++++++++++++ src/SFML/Window/CMakeLists.txt | 7 + src/SFML/Window/Win32/JoystickImpl.cpp | 619 +++++- src/SFML/Window/Win32/JoystickImpl.hpp | 98 +- src/SFML/Window/Win32/WindowImplWin32.cpp | 21 +- 6 files changed, 3315 insertions(+), 14 deletions(-) create mode 100644 extlibs/headers/mingw/_mingw_dxhelper.h create mode 100644 extlibs/headers/mingw/dinput.h diff --git a/extlibs/headers/mingw/_mingw_dxhelper.h b/extlibs/headers/mingw/_mingw_dxhelper.h new file mode 100644 index 00000000..849e2914 --- /dev/null +++ b/extlibs/headers/mingw/_mingw_dxhelper.h @@ -0,0 +1,117 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER within this package. + */ + +#if defined(_MSC_VER) && !defined(_MSC_EXTENSIONS) +#define NONAMELESSUNION 1 +#endif +#if defined(NONAMELESSSTRUCT) && \ + !defined(NONAMELESSUNION) +#define NONAMELESSUNION 1 +#endif +#if defined(NONAMELESSUNION) && \ + !defined(NONAMELESSSTRUCT) +#define NONAMELESSSTRUCT 1 +#endif +#if !defined(__GNU_EXTENSION) +#if defined(__GNUC__) || defined(__GNUG__) +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif /* __extension__ */ + +#ifndef __ANONYMOUS_DEFINED +#define __ANONYMOUS_DEFINED +#if defined(__GNUC__) || defined(__GNUG__) +#define _ANONYMOUS_UNION __extension__ +#define _ANONYMOUS_STRUCT __extension__ +#else +#define _ANONYMOUS_UNION +#define _ANONYMOUS_STRUCT +#endif +#ifndef NONAMELESSUNION +#define _UNION_NAME(x) +#define _STRUCT_NAME(x) +#else /* NONAMELESSUNION */ +#define _UNION_NAME(x) x +#define _STRUCT_NAME(x) x +#endif +#endif /* __ANONYMOUS_DEFINED */ + +#ifndef DUMMYUNIONNAME +# ifdef NONAMELESSUNION +# define DUMMYUNIONNAME u +# define DUMMYUNIONNAME1 u1 /* Wine uses this variant */ +# define DUMMYUNIONNAME2 u2 +# define DUMMYUNIONNAME3 u3 +# define DUMMYUNIONNAME4 u4 +# define DUMMYUNIONNAME5 u5 +# define DUMMYUNIONNAME6 u6 +# define DUMMYUNIONNAME7 u7 +# define DUMMYUNIONNAME8 u8 +# define DUMMYUNIONNAME9 u9 +# else /* NONAMELESSUNION */ +# define DUMMYUNIONNAME +# define DUMMYUNIONNAME1 /* Wine uses this variant */ +# define DUMMYUNIONNAME2 +# define DUMMYUNIONNAME3 +# define DUMMYUNIONNAME4 +# define DUMMYUNIONNAME5 +# define DUMMYUNIONNAME6 +# define DUMMYUNIONNAME7 +# define DUMMYUNIONNAME8 +# define DUMMYUNIONNAME9 +# endif +#endif /* DUMMYUNIONNAME */ + +#if !defined(DUMMYUNIONNAME1) /* MinGW does not define this one */ +# ifdef NONAMELESSUNION +# define DUMMYUNIONNAME1 u1 /* Wine uses this variant */ +# else +# define DUMMYUNIONNAME1 /* Wine uses this variant */ +# endif +#endif /* DUMMYUNIONNAME1 */ + +#ifndef DUMMYSTRUCTNAME +# ifdef NONAMELESSUNION +# define DUMMYSTRUCTNAME s +# define DUMMYSTRUCTNAME1 s1 /* Wine uses this variant */ +# define DUMMYSTRUCTNAME2 s2 +# define DUMMYSTRUCTNAME3 s3 +# define DUMMYSTRUCTNAME4 s4 +# define DUMMYSTRUCTNAME5 s5 +# else +# define DUMMYSTRUCTNAME +# define DUMMYSTRUCTNAME1 /* Wine uses this variant */ +# define DUMMYSTRUCTNAME2 +# define DUMMYSTRUCTNAME3 +# define DUMMYSTRUCTNAME4 +# define DUMMYSTRUCTNAME5 +# endif +#endif /* DUMMYSTRUCTNAME */ + +/* These are for compatibility with the Wine source tree */ + +#ifndef WINELIB_NAME_AW +# ifdef __MINGW_NAME_AW +# define WINELIB_NAME_AW __MINGW_NAME_AW +# else +# ifdef UNICODE +# define WINELIB_NAME_AW(func) func##W +# else +# define WINELIB_NAME_AW(func) func##A +# endif +# endif +#endif /* WINELIB_NAME_AW */ + +#ifndef DECL_WINELIB_TYPE_AW +# ifdef __MINGW_TYPEDEF_AW +# define DECL_WINELIB_TYPE_AW __MINGW_TYPEDEF_AW +# else +# define DECL_WINELIB_TYPE_AW(type) typedef WINELIB_NAME_AW(type) type; +# endif +#endif /* DECL_WINELIB_TYPE_AW */ + diff --git a/extlibs/headers/mingw/dinput.h b/extlibs/headers/mingw/dinput.h new file mode 100644 index 00000000..b5754802 --- /dev/null +++ b/extlibs/headers/mingw/dinput.h @@ -0,0 +1,2467 @@ +/* + * Copyright (C) the Wine project + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __DINPUT_INCLUDED__ +#define __DINPUT_INCLUDED__ + +#define COM_NO_WINDOWS_H +#include <objbase.h> +#include <_mingw_dxhelper.h> + +#ifndef DIRECTINPUT_VERSION +#define DIRECTINPUT_VERSION 0x0800 +#endif + +/* Classes */ +DEFINE_GUID(CLSID_DirectInput, 0x25E609E0,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(CLSID_DirectInputDevice, 0x25E609E1,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + +DEFINE_GUID(CLSID_DirectInput8, 0x25E609E4,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(CLSID_DirectInputDevice8, 0x25E609E5,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + +/* Interfaces */ +DEFINE_GUID(IID_IDirectInputA, 0x89521360,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInputW, 0x89521361,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInput2A, 0x5944E662,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInput2W, 0x5944E663,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInput7A, 0x9A4CB684,0x236D,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); +DEFINE_GUID(IID_IDirectInput7W, 0x9A4CB685,0x236D,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); +DEFINE_GUID(IID_IDirectInput8A, 0xBF798030,0x483A,0x4DA2,0xAA,0x99,0x5D,0x64,0xED,0x36,0x97,0x00); +DEFINE_GUID(IID_IDirectInput8W, 0xBF798031,0x483A,0x4DA2,0xAA,0x99,0x5D,0x64,0xED,0x36,0x97,0x00); +DEFINE_GUID(IID_IDirectInputDeviceA, 0x5944E680,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInputDeviceW, 0x5944E681,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInputDevice2A, 0x5944E682,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInputDevice2W, 0x5944E683,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInputDevice7A, 0x57D7C6BC,0x2356,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); +DEFINE_GUID(IID_IDirectInputDevice7W, 0x57D7C6BD,0x2356,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); +DEFINE_GUID(IID_IDirectInputDevice8A, 0x54D41080,0xDC15,0x4833,0xA4,0x1B,0x74,0x8F,0x73,0xA3,0x81,0x79); +DEFINE_GUID(IID_IDirectInputDevice8W, 0x54D41081,0xDC15,0x4833,0xA4,0x1B,0x74,0x8F,0x73,0xA3,0x81,0x79); +DEFINE_GUID(IID_IDirectInputEffect, 0xE7E1F7C0,0x88D2,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); + +/* Predefined object types */ +DEFINE_GUID(GUID_XAxis, 0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_YAxis, 0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_ZAxis, 0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_RxAxis,0xA36D02F4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_RyAxis,0xA36D02F5,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_RzAxis,0xA36D02E3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_Slider,0xA36D02E4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_Button,0xA36D02F0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_Key, 0x55728220,0xD33C,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_POV, 0xA36D02F2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_Unknown,0xA36D02F3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + +/* Predefined product GUIDs */ +DEFINE_GUID(GUID_SysMouse, 0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_SysKeyboard, 0x6F1D2B61,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_Joystick, 0x6F1D2B70,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_SysMouseEm, 0x6F1D2B80,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_SysMouseEm2, 0x6F1D2B81,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_SysKeyboardEm, 0x6F1D2B82,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_SysKeyboardEm2,0x6F1D2B83,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + +/* predefined forcefeedback effects */ +DEFINE_GUID(GUID_ConstantForce, 0x13541C20,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_RampForce, 0x13541C21,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Square, 0x13541C22,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Sine, 0x13541C23,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Triangle, 0x13541C24,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_SawtoothUp, 0x13541C25,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_SawtoothDown, 0x13541C26,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Spring, 0x13541C27,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Damper, 0x13541C28,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Inertia, 0x13541C29,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Friction, 0x13541C2A,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_CustomForce, 0x13541C2B,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); + +typedef struct IDirectInputA *LPDIRECTINPUTA; +typedef struct IDirectInputW *LPDIRECTINPUTW; +typedef struct IDirectInput2A *LPDIRECTINPUT2A; +typedef struct IDirectInput2W *LPDIRECTINPUT2W; +typedef struct IDirectInput7A *LPDIRECTINPUT7A; +typedef struct IDirectInput7W *LPDIRECTINPUT7W; +#if DIRECTINPUT_VERSION >= 0x0800 +typedef struct IDirectInput8A *LPDIRECTINPUT8A; +typedef struct IDirectInput8W *LPDIRECTINPUT8W; +#endif /* DI8 */ +typedef struct IDirectInputDeviceA *LPDIRECTINPUTDEVICEA; +typedef struct IDirectInputDeviceW *LPDIRECTINPUTDEVICEW; +#if DIRECTINPUT_VERSION >= 0x0500 +typedef struct IDirectInputDevice2A *LPDIRECTINPUTDEVICE2A; +typedef struct IDirectInputDevice2W *LPDIRECTINPUTDEVICE2W; +#endif /* DI5 */ +#if DIRECTINPUT_VERSION >= 0x0700 +typedef struct IDirectInputDevice7A *LPDIRECTINPUTDEVICE7A; +typedef struct IDirectInputDevice7W *LPDIRECTINPUTDEVICE7W; +#endif /* DI7 */ +#if DIRECTINPUT_VERSION >= 0x0800 +typedef struct IDirectInputDevice8A *LPDIRECTINPUTDEVICE8A; +typedef struct IDirectInputDevice8W *LPDIRECTINPUTDEVICE8W; +#endif /* DI8 */ +#if DIRECTINPUT_VERSION >= 0x0500 +typedef struct IDirectInputEffect *LPDIRECTINPUTEFFECT; +#endif /* DI5 */ +typedef struct SysKeyboardA *LPSYSKEYBOARDA; +typedef struct SysMouseA *LPSYSMOUSEA; + +#define IID_IDirectInput WINELIB_NAME_AW(IID_IDirectInput) +#define IDirectInput WINELIB_NAME_AW(IDirectInput) +DECL_WINELIB_TYPE_AW(LPDIRECTINPUT) +#define IID_IDirectInput2 WINELIB_NAME_AW(IID_IDirectInput2) +#define IDirectInput2 WINELIB_NAME_AW(IDirectInput2) +DECL_WINELIB_TYPE_AW(LPDIRECTINPUT2) +#define IID_IDirectInput7 WINELIB_NAME_AW(IID_IDirectInput7) +#define IDirectInput7 WINELIB_NAME_AW(IDirectInput7) +DECL_WINELIB_TYPE_AW(LPDIRECTINPUT7) +#if DIRECTINPUT_VERSION >= 0x0800 +#define IID_IDirectInput8 WINELIB_NAME_AW(IID_IDirectInput8) +#define IDirectInput8 WINELIB_NAME_AW(IDirectInput8) +DECL_WINELIB_TYPE_AW(LPDIRECTINPUT8) +#endif /* DI8 */ +#define IID_IDirectInputDevice WINELIB_NAME_AW(IID_IDirectInputDevice) +#define IDirectInputDevice WINELIB_NAME_AW(IDirectInputDevice) +DECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE) +#if DIRECTINPUT_VERSION >= 0x0500 +#define IID_IDirectInputDevice2 WINELIB_NAME_AW(IID_IDirectInputDevice2) +#define IDirectInputDevice2 WINELIB_NAME_AW(IDirectInputDevice2) +DECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE2) +#endif /* DI5 */ +#if DIRECTINPUT_VERSION >= 0x0700 +#define IID_IDirectInputDevice7 WINELIB_NAME_AW(IID_IDirectInputDevice7) +#define IDirectInputDevice7 WINELIB_NAME_AW(IDirectInputDevice7) +DECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE7) +#endif /* DI7 */ +#if DIRECTINPUT_VERSION >= 0x0800 +#define IID_IDirectInputDevice8 WINELIB_NAME_AW(IID_IDirectInputDevice8) +#define IDirectInputDevice8 WINELIB_NAME_AW(IDirectInputDevice8) +DECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE8) +#endif /* DI8 */ + +#define DI_OK S_OK +#define DI_NOTATTACHED S_FALSE +#define DI_BUFFEROVERFLOW S_FALSE +#define DI_PROPNOEFFECT S_FALSE +#define DI_NOEFFECT S_FALSE +#define DI_POLLEDDEVICE ((HRESULT)0x00000002L) +#define DI_DOWNLOADSKIPPED ((HRESULT)0x00000003L) +#define DI_EFFECTRESTARTED ((HRESULT)0x00000004L) +#define DI_TRUNCATED ((HRESULT)0x00000008L) +#define DI_SETTINGSNOTSAVED ((HRESULT)0x0000000BL) +#define DI_TRUNCATEDANDRESTARTED ((HRESULT)0x0000000CL) +#define DI_WRITEPROTECT ((HRESULT)0x00000013L) + +#define DIERR_OLDDIRECTINPUTVERSION \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_OLD_WIN_VERSION) +#define DIERR_BETADIRECTINPUTVERSION \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_RMODE_APP) +#define DIERR_BADDRIVERVER \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BAD_DRIVER_LEVEL) +#define DIERR_DEVICENOTREG REGDB_E_CLASSNOTREG +#define DIERR_NOTFOUND \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND) +#define DIERR_OBJECTNOTFOUND \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND) +#define DIERR_INVALIDPARAM E_INVALIDARG +#define DIERR_NOINTERFACE E_NOINTERFACE +#define DIERR_GENERIC E_FAIL +#define DIERR_OUTOFMEMORY E_OUTOFMEMORY +#define DIERR_UNSUPPORTED E_NOTIMPL +#define DIERR_NOTINITIALIZED \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_READY) +#define DIERR_ALREADYINITIALIZED \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_INITIALIZED) +#define DIERR_NOAGGREGATION CLASS_E_NOAGGREGATION +#define DIERR_OTHERAPPHASPRIO E_ACCESSDENIED +#define DIERR_INPUTLOST \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT) +#define DIERR_ACQUIRED \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BUSY) +#define DIERR_NOTACQUIRED \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INVALID_ACCESS) +#define DIERR_READONLY E_ACCESSDENIED +#define DIERR_HANDLEEXISTS E_ACCESSDENIED +#ifndef E_PENDING +#define E_PENDING 0x8000000AL +#endif +#define DIERR_INSUFFICIENTPRIVS 0x80040200L +#define DIERR_DEVICEFULL 0x80040201L +#define DIERR_MOREDATA 0x80040202L +#define DIERR_NOTDOWNLOADED 0x80040203L +#define DIERR_HASEFFECTS 0x80040204L +#define DIERR_NOTEXCLUSIVEACQUIRED 0x80040205L +#define DIERR_INCOMPLETEEFFECT 0x80040206L +#define DIERR_NOTBUFFERED 0x80040207L +#define DIERR_EFFECTPLAYING 0x80040208L +#define DIERR_UNPLUGGED 0x80040209L +#define DIERR_REPORTFULL 0x8004020AL +#define DIERR_MAPFILEFAIL 0x8004020BL + +#define DIENUM_STOP 0 +#define DIENUM_CONTINUE 1 + +#define DIEDFL_ALLDEVICES 0x00000000 +#define DIEDFL_ATTACHEDONLY 0x00000001 +#define DIEDFL_FORCEFEEDBACK 0x00000100 +#define DIEDFL_INCLUDEALIASES 0x00010000 +#define DIEDFL_INCLUDEPHANTOMS 0x00020000 +#define DIEDFL_INCLUDEHIDDEN 0x00040000 + +#define DIDEVTYPE_DEVICE 1 +#define DIDEVTYPE_MOUSE 2 +#define DIDEVTYPE_KEYBOARD 3 +#define DIDEVTYPE_JOYSTICK 4 +#define DIDEVTYPE_HID 0x00010000 + +#define DI8DEVCLASS_ALL 0 +#define DI8DEVCLASS_DEVICE 1 +#define DI8DEVCLASS_POINTER 2 +#define DI8DEVCLASS_KEYBOARD 3 +#define DI8DEVCLASS_GAMECTRL 4 + +#define DI8DEVTYPE_DEVICE 0x11 +#define DI8DEVTYPE_MOUSE 0x12 +#define DI8DEVTYPE_KEYBOARD 0x13 +#define DI8DEVTYPE_JOYSTICK 0x14 +#define DI8DEVTYPE_GAMEPAD 0x15 +#define DI8DEVTYPE_DRIVING 0x16 +#define DI8DEVTYPE_FLIGHT 0x17 +#define DI8DEVTYPE_1STPERSON 0x18 +#define DI8DEVTYPE_DEVICECTRL 0x19 +#define DI8DEVTYPE_SCREENPOINTER 0x1A +#define DI8DEVTYPE_REMOTE 0x1B +#define DI8DEVTYPE_SUPPLEMENTAL 0x1C + +#define DIDEVTYPEMOUSE_UNKNOWN 1 +#define DIDEVTYPEMOUSE_TRADITIONAL 2 +#define DIDEVTYPEMOUSE_FINGERSTICK 3 +#define DIDEVTYPEMOUSE_TOUCHPAD 4 +#define DIDEVTYPEMOUSE_TRACKBALL 5 + +#define DIDEVTYPEKEYBOARD_UNKNOWN 0 +#define DIDEVTYPEKEYBOARD_PCXT 1 +#define DIDEVTYPEKEYBOARD_OLIVETTI 2 +#define DIDEVTYPEKEYBOARD_PCAT 3 +#define DIDEVTYPEKEYBOARD_PCENH 4 +#define DIDEVTYPEKEYBOARD_NOKIA1050 5 +#define DIDEVTYPEKEYBOARD_NOKIA9140 6 +#define DIDEVTYPEKEYBOARD_NEC98 7 +#define DIDEVTYPEKEYBOARD_NEC98LAPTOP 8 +#define DIDEVTYPEKEYBOARD_NEC98106 9 +#define DIDEVTYPEKEYBOARD_JAPAN106 10 +#define DIDEVTYPEKEYBOARD_JAPANAX 11 +#define DIDEVTYPEKEYBOARD_J3100 12 + +#define DIDEVTYPEJOYSTICK_UNKNOWN 1 +#define DIDEVTYPEJOYSTICK_TRADITIONAL 2 +#define DIDEVTYPEJOYSTICK_FLIGHTSTICK 3 +#define DIDEVTYPEJOYSTICK_GAMEPAD 4 +#define DIDEVTYPEJOYSTICK_RUDDER 5 +#define DIDEVTYPEJOYSTICK_WHEEL 6 +#define DIDEVTYPEJOYSTICK_HEADTRACKER 7 + +#define DI8DEVTYPEMOUSE_UNKNOWN 1 +#define DI8DEVTYPEMOUSE_TRADITIONAL 2 +#define DI8DEVTYPEMOUSE_FINGERSTICK 3 +#define DI8DEVTYPEMOUSE_TOUCHPAD 4 +#define DI8DEVTYPEMOUSE_TRACKBALL 5 +#define DI8DEVTYPEMOUSE_ABSOLUTE 6 + +#define DI8DEVTYPEKEYBOARD_UNKNOWN 0 +#define DI8DEVTYPEKEYBOARD_PCXT 1 +#define DI8DEVTYPEKEYBOARD_OLIVETTI 2 +#define DI8DEVTYPEKEYBOARD_PCAT 3 +#define DI8DEVTYPEKEYBOARD_PCENH 4 +#define DI8DEVTYPEKEYBOARD_NOKIA1050 5 +#define DI8DEVTYPEKEYBOARD_NOKIA9140 6 +#define DI8DEVTYPEKEYBOARD_NEC98 7 +#define DI8DEVTYPEKEYBOARD_NEC98LAPTOP 8 +#define DI8DEVTYPEKEYBOARD_NEC98106 9 +#define DI8DEVTYPEKEYBOARD_JAPAN106 10 +#define DI8DEVTYPEKEYBOARD_JAPANAX 11 +#define DI8DEVTYPEKEYBOARD_J3100 12 + +#define DI8DEVTYPE_LIMITEDGAMESUBTYPE 1 + +#define DI8DEVTYPEJOYSTICK_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEJOYSTICK_STANDARD 2 + +#define DI8DEVTYPEGAMEPAD_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEGAMEPAD_STANDARD 2 +#define DI8DEVTYPEGAMEPAD_TILT 3 + +#define DI8DEVTYPEDRIVING_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEDRIVING_COMBINEDPEDALS 2 +#define DI8DEVTYPEDRIVING_DUALPEDALS 3 +#define DI8DEVTYPEDRIVING_THREEPEDALS 4 +#define DI8DEVTYPEDRIVING_HANDHELD 5 + +#define DI8DEVTYPEFLIGHT_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEFLIGHT_STICK 2 +#define DI8DEVTYPEFLIGHT_YOKE 3 +#define DI8DEVTYPEFLIGHT_RC 4 + +#define DI8DEVTYPE1STPERSON_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPE1STPERSON_UNKNOWN 2 +#define DI8DEVTYPE1STPERSON_SIXDOF 3 +#define DI8DEVTYPE1STPERSON_SHOOTER 4 + +#define DI8DEVTYPESCREENPTR_UNKNOWN 2 +#define DI8DEVTYPESCREENPTR_LIGHTGUN 3 +#define DI8DEVTYPESCREENPTR_LIGHTPEN 4 +#define DI8DEVTYPESCREENPTR_TOUCH 5 + +#define DI8DEVTYPEREMOTE_UNKNOWN 2 + +#define DI8DEVTYPEDEVICECTRL_UNKNOWN 2 +#define DI8DEVTYPEDEVICECTRL_COMMSSELECTION 3 +#define DI8DEVTYPEDEVICECTRL_COMMSSELECTION_HARDWIRED 4 + +#define DI8DEVTYPESUPPLEMENTAL_UNKNOWN 2 +#define DI8DEVTYPESUPPLEMENTAL_2NDHANDCONTROLLER 3 +#define DI8DEVTYPESUPPLEMENTAL_HEADTRACKER 4 +#define DI8DEVTYPESUPPLEMENTAL_HANDTRACKER 5 +#define DI8DEVTYPESUPPLEMENTAL_SHIFTSTICKGATE 6 +#define DI8DEVTYPESUPPLEMENTAL_SHIFTER 7 +#define DI8DEVTYPESUPPLEMENTAL_THROTTLE 8 +#define DI8DEVTYPESUPPLEMENTAL_SPLITTHROTTLE 9 +#define DI8DEVTYPESUPPLEMENTAL_COMBINEDPEDALS 10 +#define DI8DEVTYPESUPPLEMENTAL_DUALPEDALS 11 +#define DI8DEVTYPESUPPLEMENTAL_THREEPEDALS 12 +#define DI8DEVTYPESUPPLEMENTAL_RUDDERPEDALS 13 + +#define GET_DIDEVICE_TYPE(dwDevType) LOBYTE(dwDevType) +#define GET_DIDEVICE_SUBTYPE(dwDevType) HIBYTE(dwDevType) + +typedef struct DIDEVICEOBJECTINSTANCE_DX3A { + DWORD dwSize; + GUID guidType; + DWORD dwOfs; + DWORD dwType; + DWORD dwFlags; + CHAR tszName[MAX_PATH]; +} DIDEVICEOBJECTINSTANCE_DX3A, *LPDIDEVICEOBJECTINSTANCE_DX3A; +typedef const DIDEVICEOBJECTINSTANCE_DX3A *LPCDIDEVICEOBJECTINSTANCE_DX3A; +typedef struct DIDEVICEOBJECTINSTANCE_DX3W { + DWORD dwSize; + GUID guidType; + DWORD dwOfs; + DWORD dwType; + DWORD dwFlags; + WCHAR tszName[MAX_PATH]; +} DIDEVICEOBJECTINSTANCE_DX3W, *LPDIDEVICEOBJECTINSTANCE_DX3W; +typedef const DIDEVICEOBJECTINSTANCE_DX3W *LPCDIDEVICEOBJECTINSTANCE_DX3W; + +DECL_WINELIB_TYPE_AW(DIDEVICEOBJECTINSTANCE_DX3) +DECL_WINELIB_TYPE_AW(LPDIDEVICEOBJECTINSTANCE_DX3) +DECL_WINELIB_TYPE_AW(LPCDIDEVICEOBJECTINSTANCE_DX3) + +typedef struct DIDEVICEOBJECTINSTANCEA { + DWORD dwSize; + GUID guidType; + DWORD dwOfs; + DWORD dwType; + DWORD dwFlags; + CHAR tszName[MAX_PATH]; +#if(DIRECTINPUT_VERSION >= 0x0500) + DWORD dwFFMaxForce; + DWORD dwFFForceResolution; + WORD wCollectionNumber; + WORD wDesignatorIndex; + WORD wUsagePage; + WORD wUsage; + DWORD dwDimension; + WORD wExponent; + WORD wReserved; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +} DIDEVICEOBJECTINSTANCEA, *LPDIDEVICEOBJECTINSTANCEA; +typedef const DIDEVICEOBJECTINSTANCEA *LPCDIDEVICEOBJECTINSTANCEA; + +typedef struct DIDEVICEOBJECTINSTANCEW { + DWORD dwSize; + GUID guidType; + DWORD dwOfs; + DWORD dwType; + DWORD dwFlags; + WCHAR tszName[MAX_PATH]; +#if(DIRECTINPUT_VERSION >= 0x0500) + DWORD dwFFMaxForce; + DWORD dwFFForceResolution; + WORD wCollectionNumber; + WORD wDesignatorIndex; + WORD wUsagePage; + WORD wUsage; + DWORD dwDimension; + WORD wExponent; + WORD wReserved; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +} DIDEVICEOBJECTINSTANCEW, *LPDIDEVICEOBJECTINSTANCEW; +typedef const DIDEVICEOBJECTINSTANCEW *LPCDIDEVICEOBJECTINSTANCEW; + +DECL_WINELIB_TYPE_AW(DIDEVICEOBJECTINSTANCE) +DECL_WINELIB_TYPE_AW(LPDIDEVICEOBJECTINSTANCE) +DECL_WINELIB_TYPE_AW(LPCDIDEVICEOBJECTINSTANCE) + +typedef struct DIDEVICEINSTANCE_DX3A { + DWORD dwSize; + GUID guidInstance; + GUID guidProduct; + DWORD dwDevType; + CHAR tszInstanceName[MAX_PATH]; + CHAR tszProductName[MAX_PATH]; +} DIDEVICEINSTANCE_DX3A, *LPDIDEVICEINSTANCE_DX3A; +typedef const DIDEVICEINSTANCE_DX3A *LPCDIDEVICEINSTANCE_DX3A; +typedef struct DIDEVICEINSTANCE_DX3W { + DWORD dwSize; + GUID guidInstance; + GUID guidProduct; + DWORD dwDevType; + WCHAR tszInstanceName[MAX_PATH]; + WCHAR tszProductName[MAX_PATH]; +} DIDEVICEINSTANCE_DX3W, *LPDIDEVICEINSTANCE_DX3W; +typedef const DIDEVICEINSTANCE_DX3W *LPCDIDEVICEINSTANCE_DX3W; + +DECL_WINELIB_TYPE_AW(DIDEVICEINSTANCE_DX3) +DECL_WINELIB_TYPE_AW(LPDIDEVICEINSTANCE_DX3) +DECL_WINELIB_TYPE_AW(LPCDIDEVICEINSTANCE_DX3) + +typedef struct DIDEVICEINSTANCEA { + DWORD dwSize; + GUID guidInstance; + GUID guidProduct; + DWORD dwDevType; + CHAR tszInstanceName[MAX_PATH]; + CHAR tszProductName[MAX_PATH]; +#if(DIRECTINPUT_VERSION >= 0x0500) + GUID guidFFDriver; + WORD wUsagePage; + WORD wUsage; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +} DIDEVICEINSTANCEA, *LPDIDEVICEINSTANCEA; +typedef const DIDEVICEINSTANCEA *LPCDIDEVICEINSTANCEA; + +typedef struct DIDEVICEINSTANCEW { + DWORD dwSize; + GUID guidInstance; + GUID guidProduct; + DWORD dwDevType; + WCHAR tszInstanceName[MAX_PATH]; + WCHAR tszProductName[MAX_PATH]; +#if(DIRECTINPUT_VERSION >= 0x0500) + GUID guidFFDriver; + WORD wUsagePage; + WORD wUsage; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +} DIDEVICEINSTANCEW, *LPDIDEVICEINSTANCEW; +typedef const DIDEVICEINSTANCEW *LPCDIDEVICEINSTANCEW; + +DECL_WINELIB_TYPE_AW(DIDEVICEINSTANCE) +DECL_WINELIB_TYPE_AW(LPDIDEVICEINSTANCE) +DECL_WINELIB_TYPE_AW(LPCDIDEVICEINSTANCE) + +typedef BOOL (CALLBACK *LPDIENUMDEVICESCALLBACKA)(LPCDIDEVICEINSTANCEA,LPVOID); +typedef BOOL (CALLBACK *LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW,LPVOID); +DECL_WINELIB_TYPE_AW(LPDIENUMDEVICESCALLBACK) + +#define DIEDBS_MAPPEDPRI1 0x00000001 +#define DIEDBS_MAPPEDPRI2 0x00000002 +#define DIEDBS_RECENTDEVICE 0x00000010 +#define DIEDBS_NEWDEVICE 0x00000020 + +#define DIEDBSFL_ATTACHEDONLY 0x00000000 +#define DIEDBSFL_THISUSER 0x00000010 +#define DIEDBSFL_FORCEFEEDBACK DIEDFL_FORCEFEEDBACK +#define DIEDBSFL_AVAILABLEDEVICES 0x00001000 +#define DIEDBSFL_MULTIMICEKEYBOARDS 0x00002000 +#define DIEDBSFL_NONGAMINGDEVICES 0x00004000 +#define DIEDBSFL_VALID 0x00007110 + +#if DIRECTINPUT_VERSION >= 0x0800 +typedef BOOL (CALLBACK *LPDIENUMDEVICESBYSEMANTICSCBA)(LPCDIDEVICEINSTANCEA,LPDIRECTINPUTDEVICE8A,DWORD,DWORD,LPVOID); +typedef BOOL (CALLBACK *LPDIENUMDEVICESBYSEMANTICSCBW)(LPCDIDEVICEINSTANCEW,LPDIRECTINPUTDEVICE8W,DWORD,DWORD,LPVOID); +DECL_WINELIB_TYPE_AW(LPDIENUMDEVICESBYSEMANTICSCB) +#endif + +typedef BOOL (CALLBACK *LPDICONFIGUREDEVICESCALLBACK)(LPUNKNOWN,LPVOID); + +typedef BOOL (CALLBACK *LPDIENUMDEVICEOBJECTSCALLBACKA)(LPCDIDEVICEOBJECTINSTANCEA,LPVOID); +typedef BOOL (CALLBACK *LPDIENUMDEVICEOBJECTSCALLBACKW)(LPCDIDEVICEOBJECTINSTANCEW,LPVOID); +DECL_WINELIB_TYPE_AW(LPDIENUMDEVICEOBJECTSCALLBACK) + +#if DIRECTINPUT_VERSION >= 0x0500 +typedef BOOL (CALLBACK *LPDIENUMCREATEDEFFECTOBJECTSCALLBACK)(LPDIRECTINPUTEFFECT, LPVOID); +#endif + +#define DIK_ESCAPE 0x01 +#define DIK_1 0x02 +#define DIK_2 0x03 +#define DIK_3 0x04 +#define DIK_4 0x05 +#define DIK_5 0x06 +#define DIK_6 0x07 +#define DIK_7 0x08 +#define DIK_8 0x09 +#define DIK_9 0x0A +#define DIK_0 0x0B +#define DIK_MINUS 0x0C /* - on main keyboard */ +#define DIK_EQUALS 0x0D +#define DIK_BACK 0x0E /* backspace */ +#define DIK_TAB 0x0F +#define DIK_Q 0x10 +#define DIK_W 0x11 +#define DIK_E 0x12 +#define DIK_R 0x13 +#define DIK_T 0x14 +#define DIK_Y 0x15 +#define DIK_U 0x16 +#define DIK_I 0x17 +#define DIK_O 0x18 +#define DIK_P 0x19 +#define DIK_LBRACKET 0x1A +#define DIK_RBRACKET 0x1B +#define DIK_RETURN 0x1C /* Enter on main keyboard */ +#define DIK_LCONTROL 0x1D +#define DIK_A 0x1E +#define DIK_S 0x1F +#define DIK_D 0x20 +#define DIK_F 0x21 +#define DIK_G 0x22 +#define DIK_H 0x23 +#define DIK_J 0x24 +#define DIK_K 0x25 +#define DIK_L 0x26 +#define DIK_SEMICOLON 0x27 +#define DIK_APOSTROPHE 0x28 +#define DIK_GRAVE 0x29 /* accent grave */ +#define DIK_LSHIFT 0x2A +#define DIK_BACKSLASH 0x2B +#define DIK_Z 0x2C +#define DIK_X 0x2D +#define DIK_C 0x2E +#define DIK_V 0x2F +#define DIK_B 0x30 +#define DIK_N 0x31 +#define DIK_M 0x32 +#define DIK_COMMA 0x33 +#define DIK_PERIOD 0x34 /* . on main keyboard */ +#define DIK_SLASH 0x35 /* / on main keyboard */ +#define DIK_RSHIFT 0x36 +#define DIK_MULTIPLY 0x37 /* * on numeric keypad */ +#define DIK_LMENU 0x38 /* left Alt */ +#define DIK_SPACE 0x39 +#define DIK_CAPITAL 0x3A +#define DIK_F1 0x3B +#define DIK_F2 0x3C +#define DIK_F3 0x3D +#define DIK_F4 0x3E +#define DIK_F5 0x3F +#define DIK_F6 0x40 +#define DIK_F7 0x41 +#define DIK_F8 0x42 +#define DIK_F9 0x43 +#define DIK_F10 0x44 +#define DIK_NUMLOCK 0x45 +#define DIK_SCROLL 0x46 /* Scroll Lock */ +#define DIK_NUMPAD7 0x47 +#define DIK_NUMPAD8 0x48 +#define DIK_NUMPAD9 0x49 +#define DIK_SUBTRACT 0x4A /* - on numeric keypad */ +#define DIK_NUMPAD4 0x4B +#define DIK_NUMPAD5 0x4C +#define DIK_NUMPAD6 0x4D +#define DIK_ADD 0x4E /* + on numeric keypad */ +#define DIK_NUMPAD1 0x4F +#define DIK_NUMPAD2 0x50 +#define DIK_NUMPAD3 0x51 +#define DIK_NUMPAD0 0x52 +#define DIK_DECIMAL 0x53 /* . on numeric keypad */ +#define DIK_OEM_102 0x56 /* < > | on UK/Germany keyboards */ +#define DIK_F11 0x57 +#define DIK_F12 0x58 +#define DIK_F13 0x64 /* (NEC PC98) */ +#define DIK_F14 0x65 /* (NEC PC98) */ +#define DIK_F15 0x66 /* (NEC PC98) */ +#define DIK_KANA 0x70 /* (Japanese keyboard) */ +#define DIK_ABNT_C1 0x73 /* / ? on Portugese (Brazilian) keyboards */ +#define DIK_CONVERT 0x79 /* (Japanese keyboard) */ +#define DIK_NOCONVERT 0x7B /* (Japanese keyboard) */ +#define DIK_YEN 0x7D /* (Japanese keyboard) */ +#define DIK_ABNT_C2 0x7E /* Numpad . on Portugese (Brazilian) keyboards */ +#define DIK_NUMPADEQUALS 0x8D /* = on numeric keypad (NEC PC98) */ +#define DIK_CIRCUMFLEX 0x90 /* (Japanese keyboard) */ +#define DIK_AT 0x91 /* (NEC PC98) */ +#define DIK_COLON 0x92 /* (NEC PC98) */ +#define DIK_UNDERLINE 0x93 /* (NEC PC98) */ +#define DIK_KANJI 0x94 /* (Japanese keyboard) */ +#define DIK_STOP 0x95 /* (NEC PC98) */ +#define DIK_AX 0x96 /* (Japan AX) */ +#define DIK_UNLABELED 0x97 /* (J3100) */ +#define DIK_NEXTTRACK 0x99 /* Next Track */ +#define DIK_NUMPADENTER 0x9C /* Enter on numeric keypad */ +#define DIK_RCONTROL 0x9D +#define DIK_MUTE 0xA0 /* Mute */ +#define DIK_CALCULATOR 0xA1 /* Calculator */ +#define DIK_PLAYPAUSE 0xA2 /* Play / Pause */ +#define DIK_MEDIASTOP 0xA4 /* Media Stop */ +#define DIK_VOLUMEDOWN 0xAE /* Volume - */ +#define DIK_VOLUMEUP 0xB0 /* Volume + */ +#define DIK_WEBHOME 0xB2 /* Web home */ +#define DIK_NUMPADCOMMA 0xB3 /* , on numeric keypad (NEC PC98) */ +#define DIK_DIVIDE 0xB5 /* / on numeric keypad */ +#define DIK_SYSRQ 0xB7 +#define DIK_RMENU 0xB8 /* right Alt */ +#define DIK_PAUSE 0xC5 /* Pause */ +#define DIK_HOME 0xC7 /* Home on arrow keypad */ +#define DIK_UP 0xC8 /* UpArrow on arrow keypad */ +#define DIK_PRIOR 0xC9 /* PgUp on arrow keypad */ +#define DIK_LEFT 0xCB /* LeftArrow on arrow keypad */ +#define DIK_RIGHT 0xCD /* RightArrow on arrow keypad */ +#define DIK_END 0xCF /* End on arrow keypad */ +#define DIK_DOWN 0xD0 /* DownArrow on arrow keypad */ +#define DIK_NEXT 0xD1 /* PgDn on arrow keypad */ +#define DIK_INSERT 0xD2 /* Insert on arrow keypad */ +#define DIK_DELETE 0xD3 /* Delete on arrow keypad */ +#define DIK_LWIN 0xDB /* Left Windows key */ +#define DIK_RWIN 0xDC /* Right Windows key */ +#define DIK_APPS 0xDD /* AppMenu key */ +#define DIK_POWER 0xDE +#define DIK_SLEEP 0xDF +#define DIK_WAKE 0xE3 /* System Wake */ +#define DIK_WEBSEARCH 0xE5 /* Web Search */ +#define DIK_WEBFAVORITES 0xE6 /* Web Favorites */ +#define DIK_WEBREFRESH 0xE7 /* Web Refresh */ +#define DIK_WEBSTOP 0xE8 /* Web Stop */ +#define DIK_WEBFORWARD 0xE9 /* Web Forward */ +#define DIK_WEBBACK 0xEA /* Web Back */ +#define DIK_MYCOMPUTER 0xEB /* My Computer */ +#define DIK_MAIL 0xEC /* Mail */ +#define DIK_MEDIASELECT 0xED /* Media Select */ + +#define DIK_BACKSPACE DIK_BACK /* backspace */ +#define DIK_NUMPADSTAR DIK_MULTIPLY /* * on numeric keypad */ +#define DIK_LALT DIK_LMENU /* left Alt */ +#define DIK_CAPSLOCK DIK_CAPITAL /* CapsLock */ +#define DIK_NUMPADMINUS DIK_SUBTRACT /* - on numeric keypad */ +#define DIK_NUMPADPLUS DIK_ADD /* + on numeric keypad */ +#define DIK_NUMPADPERIOD DIK_DECIMAL /* . on numeric keypad */ +#define DIK_NUMPADSLASH DIK_DIVIDE /* / on numeric keypad */ +#define DIK_RALT DIK_RMENU /* right Alt */ +#define DIK_UPARROW DIK_UP /* UpArrow on arrow keypad */ +#define DIK_PGUP DIK_PRIOR /* PgUp on arrow keypad */ +#define DIK_LEFTARROW DIK_LEFT /* LeftArrow on arrow keypad */ +#define DIK_RIGHTARROW DIK_RIGHT /* RightArrow on arrow keypad */ +#define DIK_DOWNARROW DIK_DOWN /* DownArrow on arrow keypad */ +#define DIK_PGDN DIK_NEXT /* PgDn on arrow keypad */ + +#define DIDFT_ALL 0x00000000 +#define DIDFT_RELAXIS 0x00000001 +#define DIDFT_ABSAXIS 0x00000002 +#define DIDFT_AXIS 0x00000003 +#define DIDFT_PSHBUTTON 0x00000004 +#define DIDFT_TGLBUTTON 0x00000008 +#define DIDFT_BUTTON 0x0000000C +#define DIDFT_POV 0x00000010 +#define DIDFT_COLLECTION 0x00000040 +#define DIDFT_NODATA 0x00000080 +#define DIDFT_ANYINSTANCE 0x00FFFF00 +#define DIDFT_INSTANCEMASK DIDFT_ANYINSTANCE +#define DIDFT_MAKEINSTANCE(n) ((WORD)(n) << 8) +#define DIDFT_GETTYPE(n) LOBYTE(n) +#define DIDFT_GETINSTANCE(n) LOWORD((n) >> 8) +#define DIDFT_FFACTUATOR 0x01000000 +#define DIDFT_FFEFFECTTRIGGER 0x02000000 +#if DIRECTINPUT_VERSION >= 0x050a +#define DIDFT_OUTPUT 0x10000000 +#define DIDFT_VENDORDEFINED 0x04000000 +#define DIDFT_ALIAS 0x08000000 +#endif /* DI5a */ +#ifndef DIDFT_OPTIONAL +#define DIDFT_OPTIONAL 0x80000000 +#endif +#define DIDFT_ENUMCOLLECTION(n) ((WORD)(n) << 8) +#define DIDFT_NOCOLLECTION 0x00FFFF00 + +#define DIDF_ABSAXIS 0x00000001 +#define DIDF_RELAXIS 0x00000002 + +#define DIGDD_PEEK 0x00000001 + +#define DISEQUENCE_COMPARE(dwSq1,cmp,dwSq2) ((int)((dwSq1) - (dwSq2)) cmp 0) + +typedef struct DIDEVICEOBJECTDATA_DX3 { + DWORD dwOfs; + DWORD dwData; + DWORD dwTimeStamp; + DWORD dwSequence; +} DIDEVICEOBJECTDATA_DX3,*LPDIDEVICEOBJECTDATA_DX3; +typedef const DIDEVICEOBJECTDATA_DX3 *LPCDIDEVICEOBJECTDATA_DX3; + +typedef struct DIDEVICEOBJECTDATA { + DWORD dwOfs; + DWORD dwData; + DWORD dwTimeStamp; + DWORD dwSequence; +#if(DIRECTINPUT_VERSION >= 0x0800) + UINT_PTR uAppData; +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ +} DIDEVICEOBJECTDATA, *LPDIDEVICEOBJECTDATA; +typedef const DIDEVICEOBJECTDATA *LPCDIDEVICEOBJECTDATA; + +typedef struct _DIOBJECTDATAFORMAT { + const GUID *pguid; + DWORD dwOfs; + DWORD dwType; + DWORD dwFlags; +} DIOBJECTDATAFORMAT, *LPDIOBJECTDATAFORMAT; +typedef const DIOBJECTDATAFORMAT *LPCDIOBJECTDATAFORMAT; + +typedef struct _DIDATAFORMAT { + DWORD dwSize; + DWORD dwObjSize; + DWORD dwFlags; + DWORD dwDataSize; + DWORD dwNumObjs; + LPDIOBJECTDATAFORMAT rgodf; +} DIDATAFORMAT, *LPDIDATAFORMAT; +typedef const DIDATAFORMAT *LPCDIDATAFORMAT; + +#if DIRECTINPUT_VERSION >= 0x0500 +#define DIDOI_FFACTUATOR 0x00000001 +#define DIDOI_FFEFFECTTRIGGER 0x00000002 +#define DIDOI_POLLED 0x00008000 +#define DIDOI_ASPECTPOSITION 0x00000100 +#define DIDOI_ASPECTVELOCITY 0x00000200 +#define DIDOI_ASPECTACCEL 0x00000300 +#define DIDOI_ASPECTFORCE 0x00000400 +#define DIDOI_ASPECTMASK 0x00000F00 +#endif /* DI5 */ +#if DIRECTINPUT_VERSION >= 0x050a +#define DIDOI_GUIDISUSAGE 0x00010000 +#endif /* DI5a */ + +typedef struct DIPROPHEADER { + DWORD dwSize; + DWORD dwHeaderSize; + DWORD dwObj; + DWORD dwHow; +} DIPROPHEADER,*LPDIPROPHEADER; +typedef const DIPROPHEADER *LPCDIPROPHEADER; + +#define DIPH_DEVICE 0 +#define DIPH_BYOFFSET 1 +#define DIPH_BYID 2 +#if DIRECTINPUT_VERSION >= 0x050a +#define DIPH_BYUSAGE 3 + +#define DIMAKEUSAGEDWORD(UsagePage, Usage) (DWORD)MAKELONG(Usage, UsagePage) +#endif /* DI5a */ + +typedef struct DIPROPDWORD { + DIPROPHEADER diph; + DWORD dwData; +} DIPROPDWORD, *LPDIPROPDWORD; +typedef const DIPROPDWORD *LPCDIPROPDWORD; + +typedef struct DIPROPRANGE { + DIPROPHEADER diph; + LONG lMin; + LONG lMax; +} DIPROPRANGE, *LPDIPROPRANGE; +typedef const DIPROPRANGE *LPCDIPROPRANGE; + +#define DIPROPRANGE_NOMIN ((LONG)0x80000000) +#define DIPROPRANGE_NOMAX ((LONG)0x7FFFFFFF) + +#if DIRECTINPUT_VERSION >= 0x050a +typedef struct DIPROPCAL { + DIPROPHEADER diph; + LONG lMin; + LONG lCenter; + LONG lMax; +} DIPROPCAL, *LPDIPROPCAL; +typedef const DIPROPCAL *LPCDIPROPCAL; + +typedef struct DIPROPCALPOV { + DIPROPHEADER diph; + LONG lMin[5]; + LONG lMax[5]; +} DIPROPCALPOV, *LPDIPROPCALPOV; +typedef const DIPROPCALPOV *LPCDIPROPCALPOV; + +typedef struct DIPROPGUIDANDPATH { + DIPROPHEADER diph; + GUID guidClass; + WCHAR wszPath[MAX_PATH]; +} DIPROPGUIDANDPATH, *LPDIPROPGUIDANDPATH; +typedef const DIPROPGUIDANDPATH *LPCDIPROPGUIDANDPATH; + +typedef struct DIPROPSTRING { + DIPROPHEADER diph; + WCHAR wsz[MAX_PATH]; +} DIPROPSTRING, *LPDIPROPSTRING; +typedef const DIPROPSTRING *LPCDIPROPSTRING; +#endif /* DI5a */ + +#if DIRECTINPUT_VERSION >= 0x0800 +typedef struct DIPROPPOINTER { + DIPROPHEADER diph; + UINT_PTR uData; +} DIPROPPOINTER, *LPDIPROPPOINTER; +typedef const DIPROPPOINTER *LPCDIPROPPOINTER; +#endif /* DI8 */ + +/* special property GUIDs */ +#ifdef __cplusplus +#define MAKEDIPROP(prop) (*(const GUID *)(prop)) +#else +#define MAKEDIPROP(prop) ((REFGUID)(prop)) +#endif +#define DIPROP_BUFFERSIZE MAKEDIPROP(1) +#define DIPROP_AXISMODE MAKEDIPROP(2) + +#define DIPROPAXISMODE_ABS 0 +#define DIPROPAXISMODE_REL 1 + +#define DIPROP_GRANULARITY MAKEDIPROP(3) +#define DIPROP_RANGE MAKEDIPROP(4) +#define DIPROP_DEADZONE MAKEDIPROP(5) +#define DIPROP_SATURATION MAKEDIPROP(6) +#define DIPROP_FFGAIN MAKEDIPROP(7) +#define DIPROP_FFLOAD MAKEDIPROP(8) +#define DIPROP_AUTOCENTER MAKEDIPROP(9) + +#define DIPROPAUTOCENTER_OFF 0 +#define DIPROPAUTOCENTER_ON 1 + +#define DIPROP_CALIBRATIONMODE MAKEDIPROP(10) + +#define DIPROPCALIBRATIONMODE_COOKED 0 +#define DIPROPCALIBRATIONMODE_RAW 1 + +#if DIRECTINPUT_VERSION >= 0x050a +#define DIPROP_CALIBRATION MAKEDIPROP(11) +#define DIPROP_GUIDANDPATH MAKEDIPROP(12) +#define DIPROP_INSTANCENAME MAKEDIPROP(13) +#define DIPROP_PRODUCTNAME MAKEDIPROP(14) +#endif + +#if DIRECTINPUT_VERSION >= 0x5B2 +#define DIPROP_JOYSTICKID MAKEDIPROP(15) +#define DIPROP_GETPORTDISPLAYNAME MAKEDIPROP(16) +#endif + +#if DIRECTINPUT_VERSION >= 0x0700 +#define DIPROP_PHYSICALRANGE MAKEDIPROP(18) +#define DIPROP_LOGICALRANGE MAKEDIPROP(19) +#endif + +#if(DIRECTINPUT_VERSION >= 0x0800) +#define DIPROP_KEYNAME MAKEDIPROP(20) +#define DIPROP_CPOINTS MAKEDIPROP(21) +#define DIPROP_APPDATA MAKEDIPROP(22) +#define DIPROP_SCANCODE MAKEDIPROP(23) +#define DIPROP_VIDPID MAKEDIPROP(24) +#define DIPROP_USERNAME MAKEDIPROP(25) +#define DIPROP_TYPENAME MAKEDIPROP(26) + +#define MAXCPOINTSNUM 8 + +typedef struct _CPOINT { + LONG lP; + DWORD dwLog; +} CPOINT, *PCPOINT; + +typedef struct DIPROPCPOINTS { + DIPROPHEADER diph; + DWORD dwCPointsNum; + CPOINT cp[MAXCPOINTSNUM]; +} DIPROPCPOINTS, *LPDIPROPCPOINTS; +typedef const DIPROPCPOINTS *LPCDIPROPCPOINTS; +#endif /* DI8 */ + + +typedef struct DIDEVCAPS_DX3 { + DWORD dwSize; + DWORD dwFlags; + DWORD dwDevType; + DWORD dwAxes; + DWORD dwButtons; + DWORD dwPOVs; +} DIDEVCAPS_DX3, *LPDIDEVCAPS_DX3; + +typedef struct DIDEVCAPS { + DWORD dwSize; + DWORD dwFlags; + DWORD dwDevType; + DWORD dwAxes; + DWORD dwButtons; + DWORD dwPOVs; +#if(DIRECTINPUT_VERSION >= 0x0500) + DWORD dwFFSamplePeriod; + DWORD dwFFMinTimeResolution; + DWORD dwFirmwareRevision; + DWORD dwHardwareRevision; + DWORD dwFFDriverVersion; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +} DIDEVCAPS,*LPDIDEVCAPS; + +#define DIDC_ATTACHED 0x00000001 +#define DIDC_POLLEDDEVICE 0x00000002 +#define DIDC_EMULATED 0x00000004 +#define DIDC_POLLEDDATAFORMAT 0x00000008 +#define DIDC_FORCEFEEDBACK 0x00000100 +#define DIDC_FFATTACK 0x00000200 +#define DIDC_FFFADE 0x00000400 +#define DIDC_SATURATION 0x00000800 +#define DIDC_POSNEGCOEFFICIENTS 0x00001000 +#define DIDC_POSNEGSATURATION 0x00002000 +#define DIDC_DEADBAND 0x00004000 +#define DIDC_STARTDELAY 0x00008000 +#define DIDC_ALIAS 0x00010000 +#define DIDC_PHANTOM 0x00020000 +#define DIDC_HIDDEN 0x00040000 + + +/* SetCooperativeLevel dwFlags */ +#define DISCL_EXCLUSIVE 0x00000001 +#define DISCL_NONEXCLUSIVE 0x00000002 +#define DISCL_FOREGROUND 0x00000004 +#define DISCL_BACKGROUND 0x00000008 +#define DISCL_NOWINKEY 0x00000010 + +#if (DIRECTINPUT_VERSION >= 0x0500) +/* Device FF flags */ +#define DISFFC_RESET 0x00000001 +#define DISFFC_STOPALL 0x00000002 +#define DISFFC_PAUSE 0x00000004 +#define DISFFC_CONTINUE 0x00000008 +#define DISFFC_SETACTUATORSON 0x00000010 +#define DISFFC_SETACTUATORSOFF 0x00000020 + +#define DIGFFS_EMPTY 0x00000001 +#define DIGFFS_STOPPED 0x00000002 +#define DIGFFS_PAUSED 0x00000004 +#define DIGFFS_ACTUATORSON 0x00000010 +#define DIGFFS_ACTUATORSOFF 0x00000020 +#define DIGFFS_POWERON 0x00000040 +#define DIGFFS_POWEROFF 0x00000080 +#define DIGFFS_SAFETYSWITCHON 0x00000100 +#define DIGFFS_SAFETYSWITCHOFF 0x00000200 +#define DIGFFS_USERFFSWITCHON 0x00000400 +#define DIGFFS_USERFFSWITCHOFF 0x00000800 +#define DIGFFS_DEVICELOST 0x80000000 + +/* Effect flags */ +#define DIEFT_ALL 0x00000000 + +#define DIEFT_CONSTANTFORCE 0x00000001 +#define DIEFT_RAMPFORCE 0x00000002 +#define DIEFT_PERIODIC 0x00000003 +#define DIEFT_CONDITION 0x00000004 +#define DIEFT_CUSTOMFORCE 0x00000005 +#define DIEFT_HARDWARE 0x000000FF +#define DIEFT_FFATTACK 0x00000200 +#define DIEFT_FFFADE 0x00000400 +#define DIEFT_SATURATION 0x00000800 +#define DIEFT_POSNEGCOEFFICIENTS 0x00001000 +#define DIEFT_POSNEGSATURATION 0x00002000 +#define DIEFT_DEADBAND 0x00004000 +#define DIEFT_STARTDELAY 0x00008000 +#define DIEFT_GETTYPE(n) LOBYTE(n) + +#define DIEFF_OBJECTIDS 0x00000001 +#define DIEFF_OBJECTOFFSETS 0x00000002 +#define DIEFF_CARTESIAN 0x00000010 +#define DIEFF_POLAR 0x00000020 +#define DIEFF_SPHERICAL 0x00000040 + +#define DIEP_DURATION 0x00000001 +#define DIEP_SAMPLEPERIOD 0x00000002 +#define DIEP_GAIN 0x00000004 +#define DIEP_TRIGGERBUTTON 0x00000008 +#define DIEP_TRIGGERREPEATINTERVAL 0x00000010 +#define DIEP_AXES 0x00000020 +#define DIEP_DIRECTION 0x00000040 +#define DIEP_ENVELOPE 0x00000080 +#define DIEP_TYPESPECIFICPARAMS 0x00000100 +#if(DIRECTINPUT_VERSION >= 0x0600) +#define DIEP_STARTDELAY 0x00000200 +#define DIEP_ALLPARAMS_DX5 0x000001FF +#define DIEP_ALLPARAMS 0x000003FF +#else +#define DIEP_ALLPARAMS 0x000001FF +#endif /* DIRECTINPUT_VERSION >= 0x0600 */ +#define DIEP_START 0x20000000 +#define DIEP_NORESTART 0x40000000 +#define DIEP_NODOWNLOAD 0x80000000 +#define DIEB_NOTRIGGER 0xFFFFFFFF + +#define DIES_SOLO 0x00000001 +#define DIES_NODOWNLOAD 0x80000000 + +#define DIEGES_PLAYING 0x00000001 +#define DIEGES_EMULATED 0x00000002 + +#define DI_DEGREES 100 +#define DI_FFNOMINALMAX 10000 +#define DI_SECONDS 1000000 + +typedef struct DICONSTANTFORCE { + LONG lMagnitude; +} DICONSTANTFORCE, *LPDICONSTANTFORCE; +typedef const DICONSTANTFORCE *LPCDICONSTANTFORCE; + +typedef struct DIRAMPFORCE { + LONG lStart; + LONG lEnd; +} DIRAMPFORCE, *LPDIRAMPFORCE; +typedef const DIRAMPFORCE *LPCDIRAMPFORCE; + +typedef struct DIPERIODIC { + DWORD dwMagnitude; + LONG lOffset; + DWORD dwPhase; + DWORD dwPeriod; +} DIPERIODIC, *LPDIPERIODIC; +typedef const DIPERIODIC *LPCDIPERIODIC; + +typedef struct DICONDITION { + LONG lOffset; + LONG lPositiveCoefficient; + LONG lNegativeCoefficient; + DWORD dwPositiveSaturation; + DWORD dwNegativeSaturation; + LONG lDeadBand; +} DICONDITION, *LPDICONDITION; +typedef const DICONDITION *LPCDICONDITION; + +typedef struct DICUSTOMFORCE { + DWORD cChannels; + DWORD dwSamplePeriod; + DWORD cSamples; + LPLONG rglForceData; +} DICUSTOMFORCE, *LPDICUSTOMFORCE; +typedef const DICUSTOMFORCE *LPCDICUSTOMFORCE; + +typedef struct DIENVELOPE { + DWORD dwSize; + DWORD dwAttackLevel; + DWORD dwAttackTime; + DWORD dwFadeLevel; + DWORD dwFadeTime; +} DIENVELOPE, *LPDIENVELOPE; +typedef const DIENVELOPE *LPCDIENVELOPE; + +typedef struct DIEFFECT_DX5 { + DWORD dwSize; + DWORD dwFlags; + DWORD dwDuration; + DWORD dwSamplePeriod; + DWORD dwGain; + DWORD dwTriggerButton; + DWORD dwTriggerRepeatInterval; + DWORD cAxes; + LPDWORD rgdwAxes; + LPLONG rglDirection; + LPDIENVELOPE lpEnvelope; + DWORD cbTypeSpecificParams; + LPVOID lpvTypeSpecificParams; +} DIEFFECT_DX5, *LPDIEFFECT_DX5; +typedef const DIEFFECT_DX5 *LPCDIEFFECT_DX5; + +typedef struct DIEFFECT { + DWORD dwSize; + DWORD dwFlags; + DWORD dwDuration; + DWORD dwSamplePeriod; + DWORD dwGain; + DWORD dwTriggerButton; + DWORD dwTriggerRepeatInterval; + DWORD cAxes; + LPDWORD rgdwAxes; + LPLONG rglDirection; + LPDIENVELOPE lpEnvelope; + DWORD cbTypeSpecificParams; + LPVOID lpvTypeSpecificParams; +#if(DIRECTINPUT_VERSION >= 0x0600) + DWORD dwStartDelay; +#endif /* DIRECTINPUT_VERSION >= 0x0600 */ +} DIEFFECT, *LPDIEFFECT; +typedef const DIEFFECT *LPCDIEFFECT; +typedef DIEFFECT DIEFFECT_DX6; +typedef LPDIEFFECT LPDIEFFECT_DX6; + +typedef struct DIEFFECTINFOA { + DWORD dwSize; + GUID guid; + DWORD dwEffType; + DWORD dwStaticParams; + DWORD dwDynamicParams; + CHAR tszName[MAX_PATH]; +} DIEFFECTINFOA, *LPDIEFFECTINFOA; +typedef const DIEFFECTINFOA *LPCDIEFFECTINFOA; + +typedef struct DIEFFECTINFOW { + DWORD dwSize; + GUID guid; + DWORD dwEffType; + DWORD dwStaticParams; + DWORD dwDynamicParams; + WCHAR tszName[MAX_PATH]; +} DIEFFECTINFOW, *LPDIEFFECTINFOW; +typedef const DIEFFECTINFOW *LPCDIEFFECTINFOW; + +DECL_WINELIB_TYPE_AW(DIEFFECTINFO) +DECL_WINELIB_TYPE_AW(LPDIEFFECTINFO) +DECL_WINELIB_TYPE_AW(LPCDIEFFECTINFO) + +typedef BOOL (CALLBACK *LPDIENUMEFFECTSCALLBACKA)(LPCDIEFFECTINFOA, LPVOID); +typedef BOOL (CALLBACK *LPDIENUMEFFECTSCALLBACKW)(LPCDIEFFECTINFOW, LPVOID); + +typedef struct DIEFFESCAPE { + DWORD dwSize; + DWORD dwCommand; + LPVOID lpvInBuffer; + DWORD cbInBuffer; + LPVOID lpvOutBuffer; + DWORD cbOutBuffer; +} DIEFFESCAPE, *LPDIEFFESCAPE; + +typedef struct DIJOYSTATE { + LONG lX; + LONG lY; + LONG lZ; + LONG lRx; + LONG lRy; + LONG lRz; + LONG rglSlider[2]; + DWORD rgdwPOV[4]; + BYTE rgbButtons[32]; +} DIJOYSTATE, *LPDIJOYSTATE; + +typedef struct DIJOYSTATE2 { + LONG lX; + LONG lY; + LONG lZ; + LONG lRx; + LONG lRy; + LONG lRz; + LONG rglSlider[2]; + DWORD rgdwPOV[4]; + BYTE rgbButtons[128]; + LONG lVX; /* 'v' as in velocity */ + LONG lVY; + LONG lVZ; + LONG lVRx; + LONG lVRy; + LONG lVRz; + LONG rglVSlider[2]; + LONG lAX; /* 'a' as in acceleration */ + LONG lAY; + LONG lAZ; + LONG lARx; + LONG lARy; + LONG lARz; + LONG rglASlider[2]; + LONG lFX; /* 'f' as in force */ + LONG lFY; + LONG lFZ; + LONG lFRx; /* 'fr' as in rotational force aka torque */ + LONG lFRy; + LONG lFRz; + LONG rglFSlider[2]; +} DIJOYSTATE2, *LPDIJOYSTATE2; + +#define DIJOFS_X FIELD_OFFSET(DIJOYSTATE, lX) +#define DIJOFS_Y FIELD_OFFSET(DIJOYSTATE, lY) +#define DIJOFS_Z FIELD_OFFSET(DIJOYSTATE, lZ) +#define DIJOFS_RX FIELD_OFFSET(DIJOYSTATE, lRx) +#define DIJOFS_RY FIELD_OFFSET(DIJOYSTATE, lRy) +#define DIJOFS_RZ FIELD_OFFSET(DIJOYSTATE, lRz) +#define DIJOFS_SLIDER(n) (FIELD_OFFSET(DIJOYSTATE, rglSlider) + \ + (n) * sizeof(LONG)) +#define DIJOFS_POV(n) (FIELD_OFFSET(DIJOYSTATE, rgdwPOV) + \ + (n) * sizeof(DWORD)) +#define DIJOFS_BUTTON(n) (FIELD_OFFSET(DIJOYSTATE, rgbButtons) + (n)) +#define DIJOFS_BUTTON0 DIJOFS_BUTTON(0) +#define DIJOFS_BUTTON1 DIJOFS_BUTTON(1) +#define DIJOFS_BUTTON2 DIJOFS_BUTTON(2) +#define DIJOFS_BUTTON3 DIJOFS_BUTTON(3) +#define DIJOFS_BUTTON4 DIJOFS_BUTTON(4) +#define DIJOFS_BUTTON5 DIJOFS_BUTTON(5) +#define DIJOFS_BUTTON6 DIJOFS_BUTTON(6) +#define DIJOFS_BUTTON7 DIJOFS_BUTTON(7) +#define DIJOFS_BUTTON8 DIJOFS_BUTTON(8) +#define DIJOFS_BUTTON9 DIJOFS_BUTTON(9) +#define DIJOFS_BUTTON10 DIJOFS_BUTTON(10) +#define DIJOFS_BUTTON11 DIJOFS_BUTTON(11) +#define DIJOFS_BUTTON12 DIJOFS_BUTTON(12) +#define DIJOFS_BUTTON13 DIJOFS_BUTTON(13) +#define DIJOFS_BUTTON14 DIJOFS_BUTTON(14) +#define DIJOFS_BUTTON15 DIJOFS_BUTTON(15) +#define DIJOFS_BUTTON16 DIJOFS_BUTTON(16) +#define DIJOFS_BUTTON17 DIJOFS_BUTTON(17) +#define DIJOFS_BUTTON18 DIJOFS_BUTTON(18) +#define DIJOFS_BUTTON19 DIJOFS_BUTTON(19) +#define DIJOFS_BUTTON20 DIJOFS_BUTTON(20) +#define DIJOFS_BUTTON21 DIJOFS_BUTTON(21) +#define DIJOFS_BUTTON22 DIJOFS_BUTTON(22) +#define DIJOFS_BUTTON23 DIJOFS_BUTTON(23) +#define DIJOFS_BUTTON24 DIJOFS_BUTTON(24) +#define DIJOFS_BUTTON25 DIJOFS_BUTTON(25) +#define DIJOFS_BUTTON26 DIJOFS_BUTTON(26) +#define DIJOFS_BUTTON27 DIJOFS_BUTTON(27) +#define DIJOFS_BUTTON28 DIJOFS_BUTTON(28) +#define DIJOFS_BUTTON29 DIJOFS_BUTTON(29) +#define DIJOFS_BUTTON30 DIJOFS_BUTTON(30) +#define DIJOFS_BUTTON31 DIJOFS_BUTTON(31) +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ + +/* DInput 7 structures, types */ +#if(DIRECTINPUT_VERSION >= 0x0700) +typedef struct DIFILEEFFECT { + DWORD dwSize; + GUID GuidEffect; + LPCDIEFFECT lpDiEffect; + CHAR szFriendlyName[MAX_PATH]; +} DIFILEEFFECT, *LPDIFILEEFFECT; + +typedef const DIFILEEFFECT *LPCDIFILEEFFECT; +typedef BOOL (CALLBACK *LPDIENUMEFFECTSINFILECALLBACK)(LPCDIFILEEFFECT , LPVOID); +#endif /* DIRECTINPUT_VERSION >= 0x0700 */ + +/* DInput 8 structures and types */ +#if DIRECTINPUT_VERSION >= 0x0800 +typedef struct _DIACTIONA { + UINT_PTR uAppData; + DWORD dwSemantic; + DWORD dwFlags; + __GNU_EXTENSION union { + LPCSTR lptszActionName; + UINT uResIdString; + } DUMMYUNIONNAME; + GUID guidInstance; + DWORD dwObjID; + DWORD dwHow; +} DIACTIONA, *LPDIACTIONA; +typedef const DIACTIONA *LPCDIACTIONA; + +typedef struct _DIACTIONW { + UINT_PTR uAppData; + DWORD dwSemantic; + DWORD dwFlags; + __GNU_EXTENSION union { + LPCWSTR lptszActionName; + UINT uResIdString; + } DUMMYUNIONNAME; + GUID guidInstance; + DWORD dwObjID; + DWORD dwHow; +} DIACTIONW, *LPDIACTIONW; +typedef const DIACTIONW *LPCDIACTIONW; + +DECL_WINELIB_TYPE_AW(DIACTION) +DECL_WINELIB_TYPE_AW(LPDIACTION) +DECL_WINELIB_TYPE_AW(LPCDIACTION) + +#define DIA_FORCEFEEDBACK 0x00000001 +#define DIA_APPMAPPED 0x00000002 +#define DIA_APPNOMAP 0x00000004 +#define DIA_NORANGE 0x00000008 +#define DIA_APPFIXED 0x00000010 + +#define DIAH_UNMAPPED 0x00000000 +#define DIAH_USERCONFIG 0x00000001 +#define DIAH_APPREQUESTED 0x00000002 +#define DIAH_HWAPP 0x00000004 +#define DIAH_HWDEFAULT 0x00000008 +#define DIAH_DEFAULT 0x00000020 +#define DIAH_ERROR 0x80000000 + +typedef struct _DIACTIONFORMATA { + DWORD dwSize; + DWORD dwActionSize; + DWORD dwDataSize; + DWORD dwNumActions; + LPDIACTIONA rgoAction; + GUID guidActionMap; + DWORD dwGenre; + DWORD dwBufferSize; + LONG lAxisMin; + LONG lAxisMax; + HINSTANCE hInstString; + FILETIME ftTimeStamp; + DWORD dwCRC; + CHAR tszActionMap[MAX_PATH]; +} DIACTIONFORMATA, *LPDIACTIONFORMATA; +typedef const DIACTIONFORMATA *LPCDIACTIONFORMATA; + +typedef struct _DIACTIONFORMATW { + DWORD dwSize; + DWORD dwActionSize; + DWORD dwDataSize; + DWORD dwNumActions; + LPDIACTIONW rgoAction; + GUID guidActionMap; + DWORD dwGenre; + DWORD dwBufferSize; + LONG lAxisMin; + LONG lAxisMax; + HINSTANCE hInstString; + FILETIME ftTimeStamp; + DWORD dwCRC; + WCHAR tszActionMap[MAX_PATH]; +} DIACTIONFORMATW, *LPDIACTIONFORMATW; +typedef const DIACTIONFORMATW *LPCDIACTIONFORMATW; + +DECL_WINELIB_TYPE_AW(DIACTIONFORMAT) +DECL_WINELIB_TYPE_AW(LPDIACTIONFORMAT) +DECL_WINELIB_TYPE_AW(LPCDIACTIONFORMAT) + +#define DIAFTS_NEWDEVICELOW 0xFFFFFFFF +#define DIAFTS_NEWDEVICEHIGH 0xFFFFFFFF +#define DIAFTS_UNUSEDDEVICELOW 0x00000000 +#define DIAFTS_UNUSEDDEVICEHIGH 0x00000000 + +#define DIDBAM_DEFAULT 0x00000000 +#define DIDBAM_PRESERVE 0x00000001 +#define DIDBAM_INITIALIZE 0x00000002 +#define DIDBAM_HWDEFAULTS 0x00000004 + +#define DIDSAM_DEFAULT 0x00000000 +#define DIDSAM_NOUSER 0x00000001 +#define DIDSAM_FORCESAVE 0x00000002 + +#define DICD_DEFAULT 0x00000000 +#define DICD_EDIT 0x00000001 + +#ifndef D3DCOLOR_DEFINED +typedef DWORD D3DCOLOR; +#define D3DCOLOR_DEFINED +#endif + +typedef struct _DICOLORSET { + DWORD dwSize; + D3DCOLOR cTextFore; + D3DCOLOR cTextHighlight; + D3DCOLOR cCalloutLine; + D3DCOLOR cCalloutHighlight; + D3DCOLOR cBorder; + D3DCOLOR cControlFill; + D3DCOLOR cHighlightFill; + D3DCOLOR cAreaFill; +} DICOLORSET, *LPDICOLORSET; +typedef const DICOLORSET *LPCDICOLORSET; + +typedef struct _DICONFIGUREDEVICESPARAMSA { + DWORD dwSize; + DWORD dwcUsers; + LPSTR lptszUserNames; + DWORD dwcFormats; + LPDIACTIONFORMATA lprgFormats; + HWND hwnd; + DICOLORSET dics; + LPUNKNOWN lpUnkDDSTarget; +} DICONFIGUREDEVICESPARAMSA, *LPDICONFIGUREDEVICESPARAMSA; +typedef const DICONFIGUREDEVICESPARAMSA *LPCDICONFIGUREDEVICESPARAMSA; + +typedef struct _DICONFIGUREDEVICESPARAMSW { + DWORD dwSize; + DWORD dwcUsers; + LPWSTR lptszUserNames; + DWORD dwcFormats; + LPDIACTIONFORMATW lprgFormats; + HWND hwnd; + DICOLORSET dics; + LPUNKNOWN lpUnkDDSTarget; +} DICONFIGUREDEVICESPARAMSW, *LPDICONFIGUREDEVICESPARAMSW; +typedef const DICONFIGUREDEVICESPARAMSW *LPCDICONFIGUREDEVICESPARAMSW; + +DECL_WINELIB_TYPE_AW(DICONFIGUREDEVICESPARAMS) +DECL_WINELIB_TYPE_AW(LPDICONFIGUREDEVICESPARAMS) +DECL_WINELIB_TYPE_AW(LPCDICONFIGUREDEVICESPARAMS) + +#define DIDIFT_CONFIGURATION 0x00000001 +#define DIDIFT_OVERLAY 0x00000002 + +#define DIDAL_CENTERED 0x00000000 +#define DIDAL_LEFTALIGNED 0x00000001 +#define DIDAL_RIGHTALIGNED 0x00000002 +#define DIDAL_MIDDLE 0x00000000 +#define DIDAL_TOPALIGNED 0x00000004 +#define DIDAL_BOTTOMALIGNED 0x00000008 + +typedef struct _DIDEVICEIMAGEINFOA { + CHAR tszImagePath[MAX_PATH]; + DWORD dwFlags; + DWORD dwViewID; + RECT rcOverlay; + DWORD dwObjID; + DWORD dwcValidPts; + POINT rgptCalloutLine[5]; + RECT rcCalloutRect; + DWORD dwTextAlign; +} DIDEVICEIMAGEINFOA, *LPDIDEVICEIMAGEINFOA; +typedef const DIDEVICEIMAGEINFOA *LPCDIDEVICEIMAGEINFOA; + +typedef struct _DIDEVICEIMAGEINFOW { + WCHAR tszImagePath[MAX_PATH]; + DWORD dwFlags; + DWORD dwViewID; + RECT rcOverlay; + DWORD dwObjID; + DWORD dwcValidPts; + POINT rgptCalloutLine[5]; + RECT rcCalloutRect; + DWORD dwTextAlign; +} DIDEVICEIMAGEINFOW, *LPDIDEVICEIMAGEINFOW; +typedef const DIDEVICEIMAGEINFOW *LPCDIDEVICEIMAGEINFOW; + +DECL_WINELIB_TYPE_AW(DIDEVICEIMAGEINFO) +DECL_WINELIB_TYPE_AW(LPDIDEVICEIMAGEINFO) +DECL_WINELIB_TYPE_AW(LPCDIDEVICEIMAGEINFO) + +typedef struct _DIDEVICEIMAGEINFOHEADERA { + DWORD dwSize; + DWORD dwSizeImageInfo; + DWORD dwcViews; + DWORD dwcButtons; + DWORD dwcAxes; + DWORD dwcPOVs; + DWORD dwBufferSize; + DWORD dwBufferUsed; + LPDIDEVICEIMAGEINFOA lprgImageInfoArray; +} DIDEVICEIMAGEINFOHEADERA, *LPDIDEVICEIMAGEINFOHEADERA; +typedef const DIDEVICEIMAGEINFOHEADERA *LPCDIDEVICEIMAGEINFOHEADERA; + +typedef struct _DIDEVICEIMAGEINFOHEADERW { + DWORD dwSize; + DWORD dwSizeImageInfo; + DWORD dwcViews; + DWORD dwcButtons; + DWORD dwcAxes; + DWORD dwcPOVs; + DWORD dwBufferSize; + DWORD dwBufferUsed; + LPDIDEVICEIMAGEINFOW lprgImageInfoArray; +} DIDEVICEIMAGEINFOHEADERW, *LPDIDEVICEIMAGEINFOHEADERW; +typedef const DIDEVICEIMAGEINFOHEADERW *LPCDIDEVICEIMAGEINFOHEADERW; + +DECL_WINELIB_TYPE_AW(DIDEVICEIMAGEINFOHEADER) +DECL_WINELIB_TYPE_AW(LPDIDEVICEIMAGEINFOHEADER) +DECL_WINELIB_TYPE_AW(LPCDIDEVICEIMAGEINFOHEADER) + +#endif /* DI8 */ + + +/***************************************************************************** + * IDirectInputEffect interface + */ +#if (DIRECTINPUT_VERSION >= 0x0500) +#undef INTERFACE +#define INTERFACE IDirectInputEffect +DECLARE_INTERFACE_(IDirectInputEffect,IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputEffect methods ***/ + STDMETHOD(Initialize)(THIS_ HINSTANCE, DWORD, REFGUID) PURE; + STDMETHOD(GetEffectGuid)(THIS_ LPGUID) PURE; + STDMETHOD(GetParameters)(THIS_ LPDIEFFECT, DWORD) PURE; + STDMETHOD(SetParameters)(THIS_ LPCDIEFFECT, DWORD) PURE; + STDMETHOD(Start)(THIS_ DWORD, DWORD) PURE; + STDMETHOD(Stop)(THIS) PURE; + STDMETHOD(GetEffectStatus)(THIS_ LPDWORD) PURE; + STDMETHOD(Download)(THIS) PURE; + STDMETHOD(Unload)(THIS) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDirectInputEffect_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInputEffect_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInputEffect_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectInputEffect methods ***/ +#define IDirectInputEffect_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) +#define IDirectInputEffect_GetEffectGuid(p,a) (p)->lpVtbl->GetEffectGuid(p,a) +#define IDirectInputEffect_GetParameters(p,a,b) (p)->lpVtbl->GetParameters(p,a,b) +#define IDirectInputEffect_SetParameters(p,a,b) (p)->lpVtbl->SetParameters(p,a,b) +#define IDirectInputEffect_Start(p,a,b) (p)->lpVtbl->Start(p,a,b) +#define IDirectInputEffect_Stop(p) (p)->lpVtbl->Stop(p) +#define IDirectInputEffect_GetEffectStatus(p,a) (p)->lpVtbl->GetEffectStatus(p,a) +#define IDirectInputEffect_Download(p) (p)->lpVtbl->Download(p) +#define IDirectInputEffect_Unload(p) (p)->lpVtbl->Unload(p) +#define IDirectInputEffect_Escape(p,a) (p)->lpVtbl->Escape(p,a) +#else +/*** IUnknown methods ***/ +#define IDirectInputEffect_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInputEffect_AddRef(p) (p)->AddRef() +#define IDirectInputEffect_Release(p) (p)->Release() +/*** IDirectInputEffect methods ***/ +#define IDirectInputEffect_Initialize(p,a,b,c) (p)->Initialize(a,b,c) +#define IDirectInputEffect_GetEffectGuid(p,a) (p)->GetEffectGuid(a) +#define IDirectInputEffect_GetParameters(p,a,b) (p)->GetParameters(a,b) +#define IDirectInputEffect_SetParameters(p,a,b) (p)->SetParameters(a,b) +#define IDirectInputEffect_Start(p,a,b) (p)->Start(a,b) +#define IDirectInputEffect_Stop(p) (p)->Stop() +#define IDirectInputEffect_GetEffectStatus(p,a) (p)->GetEffectStatus(a) +#define IDirectInputEffect_Download(p) (p)->Download() +#define IDirectInputEffect_Unload(p) (p)->Unload() +#define IDirectInputEffect_Escape(p,a) (p)->Escape(a) +#endif + +#endif /* DI5 */ + + +/***************************************************************************** + * IDirectInputDeviceA interface + */ +#undef INTERFACE +#define INTERFACE IDirectInputDeviceA +DECLARE_INTERFACE_(IDirectInputDeviceA,IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputDeviceA methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA pdidi) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE; +}; + +/***************************************************************************** + * IDirectInputDeviceW interface + */ +#undef INTERFACE +#define INTERFACE IDirectInputDeviceW +DECLARE_INTERFACE_(IDirectInputDeviceW,IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputDeviceW methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW pdidi) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDirectInputDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInputDevice_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInputDevice_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectInputDevice methods ***/ +#define IDirectInputDevice_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a) +#define IDirectInputDevice_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c) +#define IDirectInputDevice_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b) +#define IDirectInputDevice_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b) +#define IDirectInputDevice_Acquire(p) (p)->lpVtbl->Acquire(p) +#define IDirectInputDevice_Unacquire(p) (p)->lpVtbl->Unacquire(p) +#define IDirectInputDevice_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b) +#define IDirectInputDevice_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d) +#define IDirectInputDevice_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a) +#define IDirectInputDevice_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a) +#define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) +#define IDirectInputDevice_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c) +#define IDirectInputDevice_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a) +#define IDirectInputDevice_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInputDevice_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) +#else +/*** IUnknown methods ***/ +#define IDirectInputDevice_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInputDevice_AddRef(p) (p)->AddRef() +#define IDirectInputDevice_Release(p) (p)->Release() +/*** IDirectInputDevice methods ***/ +#define IDirectInputDevice_GetCapabilities(p,a) (p)->GetCapabilities(a) +#define IDirectInputDevice_EnumObjects(p,a,b,c) (p)->EnumObjects(a,b,c) +#define IDirectInputDevice_GetProperty(p,a,b) (p)->GetProperty(a,b) +#define IDirectInputDevice_SetProperty(p,a,b) (p)->SetProperty(a,b) +#define IDirectInputDevice_Acquire(p) (p)->Acquire() +#define IDirectInputDevice_Unacquire(p) (p)->Unacquire() +#define IDirectInputDevice_GetDeviceState(p,a,b) (p)->GetDeviceState(a,b) +#define IDirectInputDevice_GetDeviceData(p,a,b,c,d) (p)->GetDeviceData(a,b,c,d) +#define IDirectInputDevice_SetDataFormat(p,a) (p)->SetDataFormat(a) +#define IDirectInputDevice_SetEventNotification(p,a) (p)->SetEventNotification(a) +#define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) +#define IDirectInputDevice_GetObjectInfo(p,a,b,c) (p)->GetObjectInfo(a,b,c) +#define IDirectInputDevice_GetDeviceInfo(p,a) (p)->GetDeviceInfo(a) +#define IDirectInputDevice_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInputDevice_Initialize(p,a,b,c) (p)->Initialize(a,b,c) +#endif + + +#if (DIRECTINPUT_VERSION >= 0x0500) +/***************************************************************************** + * IDirectInputDevice2A interface + */ +#undef INTERFACE +#define INTERFACE IDirectInputDevice2A +DECLARE_INTERFACE_(IDirectInputDevice2A,IDirectInputDeviceA) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputDeviceA methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA pdidi) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE; + /*** IDirectInputDevice2A methods ***/ + STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwEffType) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA pdei, REFGUID rguid) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE; +}; + +/***************************************************************************** + * IDirectInputDevice2W interface + */ +#undef INTERFACE +#define INTERFACE IDirectInputDevice2W +DECLARE_INTERFACE_(IDirectInputDevice2W,IDirectInputDeviceW) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputDeviceW methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW pdidi) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE; + /*** IDirectInputDevice2W methods ***/ + STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwEffType) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOW pdei, REFGUID rguid) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDirectInputDevice2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInputDevice2_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInputDevice2_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectInputDevice methods ***/ +#define IDirectInputDevice2_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a) +#define IDirectInputDevice2_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c) +#define IDirectInputDevice2_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b) +#define IDirectInputDevice2_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b) +#define IDirectInputDevice2_Acquire(p) (p)->lpVtbl->Acquire(p) +#define IDirectInputDevice2_Unacquire(p) (p)->lpVtbl->Unacquire(p) +#define IDirectInputDevice2_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b) +#define IDirectInputDevice2_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d) +#define IDirectInputDevice2_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a) +#define IDirectInputDevice2_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a) +#define IDirectInputDevice2_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) +#define IDirectInputDevice2_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c) +#define IDirectInputDevice2_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a) +#define IDirectInputDevice2_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInputDevice2_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) +/*** IDirectInputDevice2 methods ***/ +#define IDirectInputDevice2_CreateEffect(p,a,b,c,d) (p)->lpVtbl->CreateEffect(p,a,b,c,d) +#define IDirectInputDevice2_EnumEffects(p,a,b,c) (p)->lpVtbl->EnumEffects(p,a,b,c) +#define IDirectInputDevice2_GetEffectInfo(p,a,b) (p)->lpVtbl->GetEffectInfo(p,a,b) +#define IDirectInputDevice2_GetForceFeedbackState(p,a) (p)->lpVtbl->GetForceFeedbackState(p,a) +#define IDirectInputDevice2_SendForceFeedbackCommand(p,a) (p)->lpVtbl->SendForceFeedbackCommand(p,a) +#define IDirectInputDevice2_EnumCreatedEffectObjects(p,a,b,c) (p)->lpVtbl->EnumCreatedEffectObjects(p,a,b,c) +#define IDirectInputDevice2_Escape(p,a) (p)->lpVtbl->Escape(p,a) +#define IDirectInputDevice2_Poll(p) (p)->lpVtbl->Poll(p) +#define IDirectInputDevice2_SendDeviceData(p,a,b,c,d) (p)->lpVtbl->SendDeviceData(p,a,b,c,d) +#else +/*** IUnknown methods ***/ +#define IDirectInputDevice2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInputDevice2_AddRef(p) (p)->AddRef() +#define IDirectInputDevice2_Release(p) (p)->Release() +/*** IDirectInputDevice methods ***/ +#define IDirectInputDevice2_GetCapabilities(p,a) (p)->GetCapabilities(a) +#define IDirectInputDevice2_EnumObjects(p,a,b,c) (p)->EnumObjects(a,b,c) +#define IDirectInputDevice2_GetProperty(p,a,b) (p)->GetProperty(a,b) +#define IDirectInputDevice2_SetProperty(p,a,b) (p)->SetProperty(a,b) +#define IDirectInputDevice2_Acquire(p) (p)->Acquire() +#define IDirectInputDevice2_Unacquire(p) (p)->Unacquire() +#define IDirectInputDevice2_GetDeviceState(p,a,b) (p)->GetDeviceState(a,b) +#define IDirectInputDevice2_GetDeviceData(p,a,b,c,d) (p)->GetDeviceData(a,b,c,d) +#define IDirectInputDevice2_SetDataFormat(p,a) (p)->SetDataFormat(a) +#define IDirectInputDevice2_SetEventNotification(p,a) (p)->SetEventNotification(a) +#define IDirectInputDevice2_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) +#define IDirectInputDevice2_GetObjectInfo(p,a,b,c) (p)->GetObjectInfo(a,b,c) +#define IDirectInputDevice2_GetDeviceInfo(p,a) (p)->GetDeviceInfo(a) +#define IDirectInputDevice2_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInputDevice2_Initialize(p,a,b,c) (p)->Initialize(a,b,c) +/*** IDirectInputDevice2 methods ***/ +#define IDirectInputDevice2_CreateEffect(p,a,b,c,d) (p)->CreateEffect(a,b,c,d) +#define IDirectInputDevice2_EnumEffects(p,a,b,c) (p)->EnumEffects(a,b,c) +#define IDirectInputDevice2_GetEffectInfo(p,a,b) (p)->GetEffectInfo(a,b) +#define IDirectInputDevice2_GetForceFeedbackState(p,a) (p)->GetForceFeedbackState(a) +#define IDirectInputDevice2_SendForceFeedbackCommand(p,a) (p)->SendForceFeedbackCommand(a) +#define IDirectInputDevice2_EnumCreatedEffectObjects(p,a,b,c) (p)->EnumCreatedEffectObjects(a,b,c) +#define IDirectInputDevice2_Escape(p,a) (p)->Escape(a) +#define IDirectInputDevice2_Poll(p) (p)->Poll() +#define IDirectInputDevice2_SendDeviceData(p,a,b,c,d) (p)->SendDeviceData(a,b,c,d) +#endif +#endif /* DI5 */ + +#if DIRECTINPUT_VERSION >= 0x0700 +/***************************************************************************** + * IDirectInputDevice7A interface + */ +#undef INTERFACE +#define INTERFACE IDirectInputDevice7A +DECLARE_INTERFACE_(IDirectInputDevice7A,IDirectInputDevice2A) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputDeviceA methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA pdidi) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE; + /*** IDirectInputDevice2A methods ***/ + STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwEffType) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA pdei, REFGUID rguid) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE; + /*** IDirectInputDevice7A methods ***/ + STDMETHOD(EnumEffectsInFile)(THIS_ LPCSTR lpszFileName,LPDIENUMEFFECTSINFILECALLBACK pec,LPVOID pvRef,DWORD dwFlags) PURE; + STDMETHOD(WriteEffectToFile)(THIS_ LPCSTR lpszFileName,DWORD dwEntries,LPDIFILEEFFECT rgDiFileEft,DWORD dwFlags) PURE; +}; + +/***************************************************************************** + * IDirectInputDevice7W interface + */ +#undef INTERFACE +#define INTERFACE IDirectInputDevice7W +DECLARE_INTERFACE_(IDirectInputDevice7W,IDirectInputDevice2W) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputDeviceW methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW pdidi) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE; + /*** IDirectInputDevice2W methods ***/ + STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwEffType) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOW pdei, REFGUID rguid) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE; + /*** IDirectInputDevice7W methods ***/ + STDMETHOD(EnumEffectsInFile)(THIS_ LPCWSTR lpszFileName,LPDIENUMEFFECTSINFILECALLBACK pec,LPVOID pvRef,DWORD dwFlags) PURE; + STDMETHOD(WriteEffectToFile)(THIS_ LPCWSTR lpszFileName,DWORD dwEntries,LPDIFILEEFFECT rgDiFileEft,DWORD dwFlags) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDirectInputDevice7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInputDevice7_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInputDevice7_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectInputDevice methods ***/ +#define IDirectInputDevice7_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a) +#define IDirectInputDevice7_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c) +#define IDirectInputDevice7_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b) +#define IDirectInputDevice7_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b) +#define IDirectInputDevice7_Acquire(p) (p)->lpVtbl->Acquire(p) +#define IDirectInputDevice7_Unacquire(p) (p)->lpVtbl->Unacquire(p) +#define IDirectInputDevice7_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b) +#define IDirectInputDevice7_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d) +#define IDirectInputDevice7_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a) +#define IDirectInputDevice7_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a) +#define IDirectInputDevice7_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) +#define IDirectInputDevice7_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c) +#define IDirectInputDevice7_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a) +#define IDirectInputDevice7_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInputDevice7_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) +/*** IDirectInputDevice2 methods ***/ +#define IDirectInputDevice7_CreateEffect(p,a,b,c,d) (p)->lpVtbl->CreateEffect(p,a,b,c,d) +#define IDirectInputDevice7_EnumEffects(p,a,b,c) (p)->lpVtbl->EnumEffects(p,a,b,c) +#define IDirectInputDevice7_GetEffectInfo(p,a,b) (p)->lpVtbl->GetEffectInfo(p,a,b) +#define IDirectInputDevice7_GetForceFeedbackState(p,a) (p)->lpVtbl->GetForceFeedbackState(p,a) +#define IDirectInputDevice7_SendForceFeedbackCommand(p,a) (p)->lpVtbl->SendForceFeedbackCommand(p,a) +#define IDirectInputDevice7_EnumCreatedEffectObjects(p,a,b,c) (p)->lpVtbl->EnumCreatedEffectObjects(p,a,b,c) +#define IDirectInputDevice7_Escape(p,a) (p)->lpVtbl->Escape(p,a) +#define IDirectInputDevice7_Poll(p) (p)->lpVtbl->Poll(p) +#define IDirectInputDevice7_SendDeviceData(p,a,b,c,d) (p)->lpVtbl->SendDeviceData(p,a,b,c,d) +/*** IDirectInputDevice7 methods ***/ +#define IDirectInputDevice7_EnumEffectsInFile(p,a,b,c,d) (p)->lpVtbl->EnumEffectsInFile(p,a,b,c,d) +#define IDirectInputDevice7_WriteEffectToFile(p,a,b,c,d) (p)->lpVtbl->WriteEffectToFile(p,a,b,c,d) +#else +/*** IUnknown methods ***/ +#define IDirectInputDevice7_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInputDevice7_AddRef(p) (p)->AddRef() +#define IDirectInputDevice7_Release(p) (p)->Release() +/*** IDirectInputDevice methods ***/ +#define IDirectInputDevice7_GetCapabilities(p,a) (p)->GetCapabilities(a) +#define IDirectInputDevice7_EnumObjects(p,a,b,c) (p)->EnumObjects(a,b,c) +#define IDirectInputDevice7_GetProperty(p,a,b) (p)->GetProperty(a,b) +#define IDirectInputDevice7_SetProperty(p,a,b) (p)->SetProperty(a,b) +#define IDirectInputDevice7_Acquire(p) (p)->Acquire() +#define IDirectInputDevice7_Unacquire(p) (p)->Unacquire() +#define IDirectInputDevice7_GetDeviceState(p,a,b) (p)->GetDeviceState(a,b) +#define IDirectInputDevice7_GetDeviceData(p,a,b,c,d) (p)->GetDeviceData(a,b,c,d) +#define IDirectInputDevice7_SetDataFormat(p,a) (p)->SetDataFormat(a) +#define IDirectInputDevice7_SetEventNotification(p,a) (p)->SetEventNotification(a) +#define IDirectInputDevice7_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) +#define IDirectInputDevice7_GetObjectInfo(p,a,b,c) (p)->GetObjectInfo(a,b,c) +#define IDirectInputDevice7_GetDeviceInfo(p,a) (p)->GetDeviceInfo(a) +#define IDirectInputDevice7_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInputDevice7_Initialize(p,a,b,c) (p)->Initialize(a,b,c) +/*** IDirectInputDevice2 methods ***/ +#define IDirectInputDevice7_CreateEffect(p,a,b,c,d) (p)->CreateEffect(a,b,c,d) +#define IDirectInputDevice7_EnumEffects(p,a,b,c) (p)->EnumEffects(a,b,c) +#define IDirectInputDevice7_GetEffectInfo(p,a,b) (p)->GetEffectInfo(a,b) +#define IDirectInputDevice7_GetForceFeedbackState(p,a) (p)->GetForceFeedbackState(a) +#define IDirectInputDevice7_SendForceFeedbackCommand(p,a) (p)->SendForceFeedbackCommand(a) +#define IDirectInputDevice7_EnumCreatedEffectObjects(p,a,b,c) (p)->EnumCreatedEffectObjects(a,b,c) +#define IDirectInputDevice7_Escape(p,a) (p)->Escape(a) +#define IDirectInputDevice7_Poll(p) (p)->Poll() +#define IDirectInputDevice7_SendDeviceData(p,a,b,c,d) (p)->SendDeviceData(a,b,c,d) +/*** IDirectInputDevice7 methods ***/ +#define IDirectInputDevice7_EnumEffectsInFile(p,a,b,c,d) (p)->EnumEffectsInFile(a,b,c,d) +#define IDirectInputDevice7_WriteEffectToFile(p,a,b,c,d) (p)->WriteEffectToFile(a,b,c,d) +#endif + +#endif /* DI7 */ + +#if DIRECTINPUT_VERSION >= 0x0800 +/***************************************************************************** + * IDirectInputDevice8A interface + */ +#undef INTERFACE +#define INTERFACE IDirectInputDevice8A +DECLARE_INTERFACE_(IDirectInputDevice8A,IDirectInputDevice7A) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputDeviceA methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA pdidi) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE; + /*** IDirectInputDevice2A methods ***/ + STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwEffType) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA pdei, REFGUID rguid) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE; + /*** IDirectInputDevice7A methods ***/ + STDMETHOD(EnumEffectsInFile)(THIS_ LPCSTR lpszFileName,LPDIENUMEFFECTSINFILECALLBACK pec,LPVOID pvRef,DWORD dwFlags) PURE; + STDMETHOD(WriteEffectToFile)(THIS_ LPCSTR lpszFileName,DWORD dwEntries,LPDIFILEEFFECT rgDiFileEft,DWORD dwFlags) PURE; + /*** IDirectInputDevice8A methods ***/ + STDMETHOD(BuildActionMap)(THIS_ LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags) PURE; + STDMETHOD(SetActionMap)(THIS_ LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags) PURE; + STDMETHOD(GetImageInfo)(THIS_ LPDIDEVICEIMAGEINFOHEADERA lpdiDevImageInfoHeader) PURE; +}; + +/***************************************************************************** + * IDirectInputDevice8W interface + */ +#undef INTERFACE +#define INTERFACE IDirectInputDevice8W +DECLARE_INTERFACE_(IDirectInputDevice8W,IDirectInputDevice7W) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputDeviceW methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW pdidi) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE; + /*** IDirectInputDevice2W methods ***/ + STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwEffType) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOW pdei, REFGUID rguid) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE; + /*** IDirectInputDevice7W methods ***/ + STDMETHOD(EnumEffectsInFile)(THIS_ LPCWSTR lpszFileName,LPDIENUMEFFECTSINFILECALLBACK pec,LPVOID pvRef,DWORD dwFlags) PURE; + STDMETHOD(WriteEffectToFile)(THIS_ LPCWSTR lpszFileName,DWORD dwEntries,LPDIFILEEFFECT rgDiFileEft,DWORD dwFlags) PURE; + /*** IDirectInputDevice8W methods ***/ + STDMETHOD(BuildActionMap)(THIS_ LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) PURE; + STDMETHOD(SetActionMap)(THIS_ LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) PURE; + STDMETHOD(GetImageInfo)(THIS_ LPDIDEVICEIMAGEINFOHEADERW lpdiDevImageInfoHeader) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDirectInputDevice8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInputDevice8_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInputDevice8_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectInputDevice methods ***/ +#define IDirectInputDevice8_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a) +#define IDirectInputDevice8_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c) +#define IDirectInputDevice8_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b) +#define IDirectInputDevice8_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b) +#define IDirectInputDevice8_Acquire(p) (p)->lpVtbl->Acquire(p) +#define IDirectInputDevice8_Unacquire(p) (p)->lpVtbl->Unacquire(p) +#define IDirectInputDevice8_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b) +#define IDirectInputDevice8_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d) +#define IDirectInputDevice8_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a) +#define IDirectInputDevice8_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a) +#define IDirectInputDevice8_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) +#define IDirectInputDevice8_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c) +#define IDirectInputDevice8_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a) +#define IDirectInputDevice8_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInputDevice8_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) +/*** IDirectInputDevice2 methods ***/ +#define IDirectInputDevice8_CreateEffect(p,a,b,c,d) (p)->lpVtbl->CreateEffect(p,a,b,c,d) +#define IDirectInputDevice8_EnumEffects(p,a,b,c) (p)->lpVtbl->EnumEffects(p,a,b,c) +#define IDirectInputDevice8_GetEffectInfo(p,a,b) (p)->lpVtbl->GetEffectInfo(p,a,b) +#define IDirectInputDevice8_GetForceFeedbackState(p,a) (p)->lpVtbl->GetForceFeedbackState(p,a) +#define IDirectInputDevice8_SendForceFeedbackCommand(p,a) (p)->lpVtbl->SendForceFeedbackCommand(p,a) +#define IDirectInputDevice8_EnumCreatedEffectObjects(p,a,b,c) (p)->lpVtbl->EnumCreatedEffectObjects(p,a,b,c) +#define IDirectInputDevice8_Escape(p,a) (p)->lpVtbl->Escape(p,a) +#define IDirectInputDevice8_Poll(p) (p)->lpVtbl->Poll(p) +#define IDirectInputDevice8_SendDeviceData(p,a,b,c,d) (p)->lpVtbl->SendDeviceData(p,a,b,c,d) +/*** IDirectInputDevice7 methods ***/ +#define IDirectInputDevice8_EnumEffectsInFile(p,a,b,c,d) (p)->lpVtbl->EnumEffectsInFile(p,a,b,c,d) +#define IDirectInputDevice8_WriteEffectToFile(p,a,b,c,d) (p)->lpVtbl->WriteEffectToFile(p,a,b,c,d) +/*** IDirectInputDevice8 methods ***/ +#define IDirectInputDevice8_BuildActionMap(p,a,b,c) (p)->lpVtbl->BuildActionMap(p,a,b,c) +#define IDirectInputDevice8_SetActionMap(p,a,b,c) (p)->lpVtbl->SetActionMap(p,a,b,c) +#define IDirectInputDevice8_GetImageInfo(p,a) (p)->lpVtbl->GetImageInfo(p,a) +#else +/*** IUnknown methods ***/ +#define IDirectInputDevice8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInputDevice8_AddRef(p) (p)->AddRef() +#define IDirectInputDevice8_Release(p) (p)->Release() +/*** IDirectInputDevice methods ***/ +#define IDirectInputDevice8_GetCapabilities(p,a) (p)->GetCapabilities(a) +#define IDirectInputDevice8_EnumObjects(p,a,b,c) (p)->EnumObjects(a,b,c) +#define IDirectInputDevice8_GetProperty(p,a,b) (p)->GetProperty(a,b) +#define IDirectInputDevice8_SetProperty(p,a,b) (p)->SetProperty(a,b) +#define IDirectInputDevice8_Acquire(p) (p)->Acquire() +#define IDirectInputDevice8_Unacquire(p) (p)->Unacquire() +#define IDirectInputDevice8_GetDeviceState(p,a,b) (p)->GetDeviceState(a,b) +#define IDirectInputDevice8_GetDeviceData(p,a,b,c,d) (p)->GetDeviceData(a,b,c,d) +#define IDirectInputDevice8_SetDataFormat(p,a) (p)->SetDataFormat(a) +#define IDirectInputDevice8_SetEventNotification(p,a) (p)->SetEventNotification(a) +#define IDirectInputDevice8_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) +#define IDirectInputDevice8_GetObjectInfo(p,a,b,c) (p)->GetObjectInfo(a,b,c) +#define IDirectInputDevice8_GetDeviceInfo(p,a) (p)->GetDeviceInfo(a) +#define IDirectInputDevice8_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInputDevice8_Initialize(p,a,b,c) (p)->Initialize(a,b,c) +/*** IDirectInputDevice2 methods ***/ +#define IDirectInputDevice8_CreateEffect(p,a,b,c,d) (p)->CreateEffect(a,b,c,d) +#define IDirectInputDevice8_EnumEffects(p,a,b,c) (p)->EnumEffects(a,b,c) +#define IDirectInputDevice8_GetEffectInfo(p,a,b) (p)->GetEffectInfo(a,b) +#define IDirectInputDevice8_GetForceFeedbackState(p,a) (p)->GetForceFeedbackState(a) +#define IDirectInputDevice8_SendForceFeedbackCommand(p,a) (p)->SendForceFeedbackCommand(a) +#define IDirectInputDevice8_EnumCreatedEffectObjects(p,a,b,c) (p)->EnumCreatedEffectObjects(a,b,c) +#define IDirectInputDevice8_Escape(p,a) (p)->Escape(a) +#define IDirectInputDevice8_Poll(p) (p)->Poll() +#define IDirectInputDevice8_SendDeviceData(p,a,b,c,d) (p)->SendDeviceData(a,b,c,d) +/*** IDirectInputDevice7 methods ***/ +#define IDirectInputDevice8_EnumEffectsInFile(p,a,b,c,d) (p)->EnumEffectsInFile(a,b,c,d) +#define IDirectInputDevice8_WriteEffectToFile(p,a,b,c,d) (p)->WriteEffectToFile(a,b,c,d) +/*** IDirectInputDevice8 methods ***/ +#define IDirectInputDevice8_BuildActionMap(p,a,b,c) (p)->BuildActionMap(a,b,c) +#define IDirectInputDevice8_SetActionMap(p,a,b,c) (p)->SetActionMap(a,b,c) +#define IDirectInputDevice8_GetImageInfo(p,a) (p)->GetImageInfo(a) +#endif + +#endif /* DI8 */ + +/* "Standard" Mouse report... */ +typedef struct DIMOUSESTATE { + LONG lX; + LONG lY; + LONG lZ; + BYTE rgbButtons[4]; +} DIMOUSESTATE; + +#if DIRECTINPUT_VERSION >= 0x0700 +/* "Standard" Mouse report for DInput 7... */ +typedef struct DIMOUSESTATE2 { + LONG lX; + LONG lY; + LONG lZ; + BYTE rgbButtons[8]; +} DIMOUSESTATE2; +#endif /* DI7 */ + +#define DIMOFS_X FIELD_OFFSET(DIMOUSESTATE, lX) +#define DIMOFS_Y FIELD_OFFSET(DIMOUSESTATE, lY) +#define DIMOFS_Z FIELD_OFFSET(DIMOUSESTATE, lZ) +#define DIMOFS_BUTTON0 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 0) +#define DIMOFS_BUTTON1 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 1) +#define DIMOFS_BUTTON2 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 2) +#define DIMOFS_BUTTON3 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 3) +#if DIRECTINPUT_VERSION >= 0x0700 +#define DIMOFS_BUTTON4 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 4) +#define DIMOFS_BUTTON5 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 5) +#define DIMOFS_BUTTON6 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 6) +#define DIMOFS_BUTTON7 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 7) +#endif /* DI7 */ + +#ifdef __cplusplus +extern "C" { +#endif +extern const DIDATAFORMAT c_dfDIMouse; +#if DIRECTINPUT_VERSION >= 0x0700 +extern const DIDATAFORMAT c_dfDIMouse2; /* DX 7 */ +#endif /* DI7 */ +extern const DIDATAFORMAT c_dfDIKeyboard; +#if DIRECTINPUT_VERSION >= 0x0500 +extern const DIDATAFORMAT c_dfDIJoystick; +extern const DIDATAFORMAT c_dfDIJoystick2; +#endif /* DI5 */ +#ifdef __cplusplus +}; +#endif + +/***************************************************************************** + * IDirectInputA interface + */ +#undef INTERFACE +#define INTERFACE IDirectInputA +DECLARE_INTERFACE_(IDirectInputA,IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputA methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEA *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; +}; + +/***************************************************************************** + * IDirectInputW interface + */ +#undef INTERFACE +#define INTERFACE IDirectInputW +DECLARE_INTERFACE_(IDirectInputW,IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputW methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEW *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDirectInput_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInput_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInput_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectInput methods ***/ +#define IDirectInput_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInput_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInput_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInput_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInput_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#else +/*** IUnknown methods ***/ +#define IDirectInput_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInput_AddRef(p) (p)->AddRef() +#define IDirectInput_Release(p) (p)->Release() +/*** IDirectInput methods ***/ +#define IDirectInput_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c) +#define IDirectInput_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d) +#define IDirectInput_GetDeviceStatus(p,a) (p)->GetDeviceStatus(a) +#define IDirectInput_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInput_Initialize(p,a,b) (p)->Initialize(a,b) +#endif + +/***************************************************************************** + * IDirectInput2A interface + */ +#undef INTERFACE +#define INTERFACE IDirectInput2A +DECLARE_INTERFACE_(IDirectInput2A,IDirectInputA) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputA methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEA *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; + /*** IDirectInput2A methods ***/ + STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance) PURE; +}; + +/***************************************************************************** + * IDirectInput2W interface + */ +#undef INTERFACE +#define INTERFACE IDirectInput2W +DECLARE_INTERFACE_(IDirectInput2W,IDirectInputW) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputW methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEW *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; + /*** IDirectInput2W methods ***/ + STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCWSTR pszName, LPGUID pguidInstance) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDirectInput2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInput2_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInput2_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectInput methods ***/ +#define IDirectInput2_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInput2_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInput2_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInput2_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInput2_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +/*** IDirectInput2 methods ***/ +#define IDirectInput2_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c) +#else +/*** IUnknown methods ***/ +#define IDirectInput2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInput2_AddRef(p) (p)->AddRef() +#define IDirectInput2_Release(p) (p)->Release() +/*** IDirectInput methods ***/ +#define IDirectInput2_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c) +#define IDirectInput2_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d) +#define IDirectInput2_GetDeviceStatus(p,a) (p)->GetDeviceStatus(a) +#define IDirectInput2_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInput2_Initialize(p,a,b) (p)->Initialize(a,b) +/*** IDirectInput2 methods ***/ +#define IDirectInput2_FindDevice(p,a,b,c) (p)->FindDevice(a,b,c) +#endif + +/***************************************************************************** + * IDirectInput7A interface + */ +#undef INTERFACE +#define INTERFACE IDirectInput7A +DECLARE_INTERFACE_(IDirectInput7A,IDirectInput2A) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputA methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEA *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; + /*** IDirectInput2A methods ***/ + STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance) PURE; + /*** IDirectInput7A methods ***/ + STDMETHOD(CreateDeviceEx)(THIS_ REFGUID rguid, REFIID riid, LPVOID *pvOut, LPUNKNOWN lpUnknownOuter) PURE; +}; + +/***************************************************************************** + * IDirectInput7W interface + */ +#undef INTERFACE +#define INTERFACE IDirectInput7W +DECLARE_INTERFACE_(IDirectInput7W,IDirectInput2W) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInputW methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEW *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; + /*** IDirectInput2W methods ***/ + STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCWSTR pszName, LPGUID pguidInstance) PURE; + /*** IDirectInput7W methods ***/ + STDMETHOD(CreateDeviceEx)(THIS_ REFGUID rguid, REFIID riid, LPVOID *pvOut, LPUNKNOWN lpUnknownOuter) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDirectInput7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInput7_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInput7_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectInput methods ***/ +#define IDirectInput7_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInput7_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInput7_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInput7_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInput7_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +/*** IDirectInput2 methods ***/ +#define IDirectInput7_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c) +/*** IDirectInput7 methods ***/ +#define IDirectInput7_CreateDeviceEx(p,a,b,c,d) (p)->lpVtbl->CreateDeviceEx(p,a,b,c,d) +#else +/*** IUnknown methods ***/ +#define IDirectInput7_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInput7_AddRef(p) (p)->AddRef() +#define IDirectInput7_Release(p) (p)->Release() +/*** IDirectInput methods ***/ +#define IDirectInput7_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c) +#define IDirectInput7_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d) +#define IDirectInput7_GetDeviceStatus(p,a) (p)->GetDeviceStatus(a) +#define IDirectInput7_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInput7_Initialize(p,a,b) (p)->Initialize(a,b) +/*** IDirectInput2 methods ***/ +#define IDirectInput7_FindDevice(p,a,b,c) (p)->FindDevice(a,b,c) +/*** IDirectInput7 methods ***/ +#define IDirectInput7_CreateDeviceEx(p,a,b,c,d) (p)->CreateDeviceEx(a,b,c,d) +#endif + + +#if DIRECTINPUT_VERSION >= 0x0800 +/***************************************************************************** + * IDirectInput8A interface + */ +#undef INTERFACE +#define INTERFACE IDirectInput8A +DECLARE_INTERFACE_(IDirectInput8A,IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInput8A methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICE8A *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; + STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance) PURE; + STDMETHOD(EnumDevicesBySemantics)(THIS_ LPCSTR ptszUserName, LPDIACTIONFORMATA lpdiActionFormat, LPDIENUMDEVICESBYSEMANTICSCBA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(ConfigureDevices)(THIS_ LPDICONFIGUREDEVICESCALLBACK lpdiCallback, LPDICONFIGUREDEVICESPARAMSA lpdiCDParams, DWORD dwFlags, LPVOID pvRefData) PURE; +}; + +/***************************************************************************** + * IDirectInput8W interface + */ +#undef INTERFACE +#define INTERFACE IDirectInput8W +DECLARE_INTERFACE_(IDirectInput8W,IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectInput8W methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICE8W *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; + STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCWSTR pszName, LPGUID pguidInstance) PURE; + STDMETHOD(EnumDevicesBySemantics)(THIS_ LPCWSTR ptszUserName, LPDIACTIONFORMATW lpdiActionFormat, LPDIENUMDEVICESBYSEMANTICSCBW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; + STDMETHOD(ConfigureDevices)(THIS_ LPDICONFIGUREDEVICESCALLBACK lpdiCallback, LPDICONFIGUREDEVICESPARAMSW lpdiCDParams, DWORD dwFlags, LPVOID pvRefData) PURE; +}; +#undef INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDirectInput8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInput8_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInput8_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectInput8 methods ***/ +#define IDirectInput8_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInput8_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInput8_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInput8_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInput8_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectInput8_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c) +#define IDirectInput8_EnumDevicesBySemantics(p,a,b,c,d,e) (p)->lpVtbl->EnumDevicesBySemantics(p,a,b,c,d,e) +#define IDirectInput8_ConfigureDevices(p,a,b,c,d) (p)->lpVtbl->ConfigureDevices(p,a,b,c,d) +#else +/*** IUnknown methods ***/ +#define IDirectInput8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInput8_AddRef(p) (p)->AddRef() +#define IDirectInput8_Release(p) (p)->Release() +/*** IDirectInput8 methods ***/ +#define IDirectInput8_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c) +#define IDirectInput8_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d) +#define IDirectInput8_GetDeviceStatus(p,a) (p)->GetDeviceStatus(a) +#define IDirectInput8_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInput8_Initialize(p,a,b) (p)->Initialize(a,b) +#define IDirectInput8_FindDevice(p,a,b,c) (p)->FindDevice(a,b,c) +#define IDirectInput8_EnumDevicesBySemantics(p,a,b,c,d,e) (p)->EnumDevicesBySemantics(a,b,c,d,e) +#define IDirectInput8_ConfigureDevices(p,a,b,c,d) (p)->ConfigureDevices(a,b,c,d) +#endif + +#endif /* DI8 */ + +/* Export functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if DIRECTINPUT_VERSION >= 0x0800 +HRESULT WINAPI DirectInput8Create(HINSTANCE,DWORD,REFIID,LPVOID *,LPUNKNOWN); +#else /* DI < 8 */ +HRESULT WINAPI DirectInputCreateA(HINSTANCE,DWORD,LPDIRECTINPUTA *,LPUNKNOWN); +HRESULT WINAPI DirectInputCreateW(HINSTANCE,DWORD,LPDIRECTINPUTW *,LPUNKNOWN); +#define DirectInputCreate WINELIB_NAME_AW(DirectInputCreate) + +HRESULT WINAPI DirectInputCreateEx(HINSTANCE,DWORD,REFIID,LPVOID *,LPUNKNOWN); +#endif /* DI8 */ + +#ifdef __cplusplus +}; +#endif + +#endif /* __DINPUT_INCLUDED__ */ diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index f30ce074..570d6b13 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -245,6 +245,13 @@ if(SFML_OS_LINUX) endif() include_directories(${UDEV_INCLUDE_DIR}) endif() +if(SFML_OS_WINDOWS AND NOT SFML_COMPILER_MSVC) + include(CheckIncludeFile) + check_include_file(dinput.h DINPUT_H_FOUND) + if(NOT DINPUT_H_FOUND) + include_directories("${PROJECT_SOURCE_DIR}/extlibs/headers/mingw") + endif() +endif() # build the list of external libraries to link diff --git a/src/SFML/Window/Win32/JoystickImpl.cpp b/src/SFML/Window/Win32/JoystickImpl.cpp index c6defc6f..4d9e2571 100644 --- a/src/SFML/Window/Win32/JoystickImpl.cpp +++ b/src/SFML/Window/Win32/JoystickImpl.cpp @@ -33,9 +33,59 @@ #include <regstr.h> #include <algorithm> #include <cmath> +#include <cstring> #include <sstream> #include <string> +#include <vector> + + +//////////////////////////////////////////////////////////// +// DirectInput +//////////////////////////////////////////////////////////// + + +#ifndef DIDFT_OPTIONAL +#define DIDFT_OPTIONAL 0x80000000 +#endif + + +namespace +{ + namespace guids + { + const GUID IID_IDirectInput8W = {0xbf798031, 0x483a, 0x4da2, {0xaa, 0x99, 0x5d, 0x64, 0xed, 0x36, 0x97, 0x00}}; + + const GUID GUID_XAxis = {0xa36d02e0, 0xc9f3, 0x11cf, {0xbf, 0xc7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; + const GUID GUID_YAxis = {0xa36d02e1, 0xc9f3, 0x11cf, {0xbf, 0xc7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; + const GUID GUID_ZAxis = {0xa36d02e2, 0xc9f3, 0x11cf, {0xbf, 0xc7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; + const GUID GUID_RzAxis = {0xa36d02e3, 0xc9f3, 0x11cf, {0xbf, 0xc7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; + const GUID GUID_Slider = {0xa36d02e4, 0xc9f3, 0x11cf, {0xbf, 0xc7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; + + const GUID GUID_POV = {0xa36d02f2, 0xc9f3, 0x11cf, {0xbf, 0xc7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; + + const GUID GUID_RxAxis = {0xa36d02f4, 0xc9f3, 0x11cf, {0xbf, 0xc7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; + const GUID GUID_RyAxis = {0xa36d02f5, 0xc9f3, 0x11cf, {0xbf, 0xc7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; + } + + HMODULE dinput8dll = NULL; + IDirectInput8W* directInput = NULL; + + struct JoystickRecord + { + GUID guid; + unsigned int index; + bool plugged; + }; + + typedef std::vector<JoystickRecord> JoystickList; + JoystickList joystickList; +} + + +//////////////////////////////////////////////////////////// +// Legacy joystick API +//////////////////////////////////////////////////////////// namespace { struct ConnectionCache @@ -152,6 +202,12 @@ namespace priv //////////////////////////////////////////////////////////// void JoystickImpl::initialize() { + // Try to initialize DirectInput + initializeDInput(); + + if (!directInput) + err() << "DirectInput not available, falling back to Windows joystick API" << std::endl; + // Perform the initial scan and populate the connection cache updateConnections(); } @@ -160,13 +216,17 @@ void JoystickImpl::initialize() //////////////////////////////////////////////////////////// void JoystickImpl::cleanup() { - // Nothing to do + // Clean up DirectInput + cleanupDInput(); } //////////////////////////////////////////////////////////// bool JoystickImpl::isConnected(unsigned int index) { + if (directInput) + return isConnectedDInput(index); + ConnectionCache& cache = connectionCache[index]; if (!lazyUpdates && cache.timer.getElapsedTime() > connectionRefreshDelay) { @@ -189,6 +249,9 @@ void JoystickImpl::setLazyUpdates(bool status) //////////////////////////////////////////////////////////// void JoystickImpl::updateConnections() { + if (directInput) + return updateConnectionsDInput(); + for (unsigned int i = 0; i < Joystick::Count; ++i) { JOYINFOEX joyInfo; @@ -204,6 +267,9 @@ void JoystickImpl::updateConnections() //////////////////////////////////////////////////////////// bool JoystickImpl::open(unsigned int index) { + if (directInput) + return openDInput(index); + // No explicit "open" action is required m_index = JOYSTICKID1 + index; @@ -224,12 +290,16 @@ bool JoystickImpl::open(unsigned int index) //////////////////////////////////////////////////////////// void JoystickImpl::close() { - // Nothing to do + if (directInput) + closeDInput(); } //////////////////////////////////////////////////////////// JoystickCaps JoystickImpl::getCapabilities() const { + if (directInput) + return getCapabilitiesDInput(); + JoystickCaps caps; caps.buttonCount = m_caps.wNumButtons; @@ -259,6 +329,9 @@ Joystick::Identification JoystickImpl::getIdentification() const //////////////////////////////////////////////////////////// JoystickState JoystickImpl::update() { + if (directInput) + return updateDInput(); + JoystickState state; // Get the current joystick state @@ -300,6 +373,548 @@ JoystickState JoystickImpl::update() return state; } + +//////////////////////////////////////////////////////////// +void JoystickImpl::initializeDInput() +{ + // Try to load dinput8.dll + dinput8dll = LoadLibraryA("dinput8.dll"); + + if (dinput8dll) + { + // 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")); + + 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) + { + // De-initialize everything + directInput = NULL; + FreeLibrary(dinput8dll); + dinput8dll = NULL; + + err() << "Failed to initialize DirectInput: " << result << std::endl; + } + } + else + { + // Unload dinput8.dll + FreeLibrary(dinput8dll); + dinput8dll = NULL; + } + } +} + + +//////////////////////////////////////////////////////////// +void JoystickImpl::cleanupDInput() +{ + // Release the DirectInput interface + if (directInput) + { + directInput->Release(); + directInput = NULL; + } + + // Unload dinput8.dll + if (dinput8dll) + FreeLibrary(dinput8dll); +} + + +//////////////////////////////////////////////////////////// +bool JoystickImpl::isConnectedDInput(unsigned int index) +{ + // Check if a joystick with the given index is in the connected list + for (std::vector<JoystickRecord>::iterator i = joystickList.begin(); i != joystickList.end(); ++i) + { + if (i->index == index) + return true; + } + + return false; +} + + +//////////////////////////////////////////////////////////// +void JoystickImpl::updateConnectionsDInput() +{ + // Clear plugged flags so we can determine which devices were added/removed + for (std::size_t i = 0; i < joystickList.size(); ++i) + joystickList[i].plugged = false; + + // Enumerate devices + HRESULT result = directInput->EnumDevices(DI8DEVCLASS_GAMECTRL, &JoystickImpl::deviceEnumerationCallback, NULL, DIEDFL_ALLDEVICES); + + // Remove devices that were not connected during the enumeration + for (std::vector<JoystickRecord>::iterator i = joystickList.begin(); i != joystickList.end();) + { + if (!i->plugged) + i = joystickList.erase(i); + else + ++i; + } + + if (result) + { + err() << "Failed to enumerate DirectInput devices: " << result << std::endl; + + return; + } + + // Assign unused joystick indices to devices that were newly connected + for (unsigned int i = 0; i < Joystick::Count; ++i) + { + for (std::vector<JoystickRecord>::iterator j = joystickList.begin(); j != joystickList.end(); ++j) + { + if (j->index == i) + break; + + if (j->index == Joystick::Count) + { + j->index = i; + break; + } + } + } +} + + +//////////////////////////////////////////////////////////// +bool JoystickImpl::openDInput(unsigned int index) +{ + // Initialize DirectInput members + m_device = NULL; + + for (int i = 0; i < Joystick::AxisCount; ++i) + m_axes[i] = -1; + + for (int i = 0; i < Joystick::ButtonCount; ++i) + m_buttons[i] = -1; + + std::memset(&m_deviceCaps, 0, sizeof(DIDEVCAPS)); + m_deviceCaps.dwSize = sizeof(DIDEVCAPS); + + // Search for a joystick with the given index in the connected list + for (std::vector<JoystickRecord>::iterator i = joystickList.begin(); i != joystickList.end(); ++i) + { + if (i->index == index) + { + // Create device + HRESULT result = directInput->CreateDevice(i->guid, &m_device, NULL); + + if (result) + { + err() << "Failed to create DirectInput device: " << result << std::endl; + + return false; + } + + static bool formatInitialized = false; + static DIDATAFORMAT format; + + if (!formatInitialized) + { + const DWORD axisType = DIDFT_AXIS | DIDFT_OPTIONAL | DIDFT_ANYINSTANCE; + 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; + + 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 < 8; ++i) + { + data[i].dwType = axisType; + data[i].dwFlags = DIDOI_ASPECTPOSITION; + } + + 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; + } + + 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; + } + + format.dwSize = sizeof(DIDATAFORMAT); + format.dwObjSize = sizeof(DIOBJECTDATAFORMAT); + format.dwFlags = DIDFT_ABSAXIS; + format.dwDataSize = sizeof(DIJOYSTATE); + format.dwNumObjs = 8 + 4 + sf::Joystick::ButtonCount; + format.rgodf = data; + + formatInitialized = true; + } + + // Set device data format + result = m_device->SetDataFormat(&format); + + if (result) + { + err() << "Failed to set DirectInput device data format: " << result << std::endl; + + m_device->Release(); + m_device = NULL; + + return false; + } + + // Get device capabilities + result = m_device->GetCapabilities(&m_deviceCaps); + + if (result) + { + err() << "Failed to get DirectInput device capabilities: " << result << std::endl; + + m_device->Release(); + m_device = NULL; + + 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); + + if (result) + { + err() << "Failed to set DirectInput device axis mode: " << result << std::endl; + + m_device->Release(); + m_device = NULL; + + return false; + } + + // Enumerate device objects (axes/povs/buttons) + result = m_device->EnumObjects(&JoystickImpl::deviceObjectEnumerationCallback, this, DIDFT_AXIS | DIDFT_BUTTON | DIDFT_POV); + + if (result) + { + err() << "Failed to enumerate DirectInput device objects: " << result << std::endl; + + 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 (!m_device->GetProperty(DIPROP_PRODUCTNAME, &stringProperty.diph)) + { + m_identification.name = stringProperty.wsz; + } + + // Get vendor and produce id of the device + std::memset(&property, 0, sizeof(property)); + property.diph.dwSize = sizeof(property); + property.diph.dwHeaderSize = sizeof(property.diph); + property.diph.dwHow = DIPH_DEVICE; + + if (!m_device->GetProperty(DIPROP_VIDPID, &property.diph)) + { + m_identification.productId = HIWORD(property.dwData); + m_identification.vendorId = LOWORD(property.dwData); + } + + return true; + } + } + + return false; +} + + +//////////////////////////////////////////////////////////// +void JoystickImpl::closeDInput() +{ + if (m_device) + { + // Release the device + m_device->Release(); + m_device = NULL; + } +} + + +//////////////////////////////////////////////////////////// +JoystickCaps JoystickImpl::getCapabilitiesDInput() const +{ + JoystickCaps caps; + + // Count how many buttons have valid offsets + caps.buttonCount = 0; + + for (int i = 0; i < Joystick::ButtonCount; ++i) + { + if (m_buttons[i] != -1) + ++caps.buttonCount; + } + + // Check which axes have valid offsets + for (int i = 0; i < Joystick::AxisCount; ++i) + caps.axes[i] = (m_axes[i] != -1); + + return caps; +} + + +//////////////////////////////////////////////////////////// +JoystickState JoystickImpl::updateDInput() +{ + JoystickState state; + + if (m_device) + { + // Poll the device + m_device->Poll(); + + DIJOYSTATE joystate; + + // Try to get the device state + HRESULT result = m_device->GetDeviceState(sizeof(joystate), &joystate); + + // If we have not acquired or have lost the device, attempt to (re-)acquire it and get the device state again + if ((result == DIERR_NOTACQUIRED) || (result == DIERR_INPUTLOST)) + { + m_device->Acquire(); + m_device->Poll(); + result = m_device->GetDeviceState(sizeof(joystate), &joystate); + } + + // If we still can't get the device state, assume it has been disconnected + if ((result == DIERR_NOTACQUIRED) || (result == DIERR_INPUTLOST)) + { + m_device->Release(); + m_device = NULL; + + return state; + } + + if (result) + { + err() << "Failed to get DirectInput device state: " << result << std::endl; + + return state; + } + + // Get the current state of each axis + for (int i = 0; i < Joystick::AxisCount; ++i) + { + 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) + { + 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::cos(angle) * 100.f; + } + else + { + state.axes[i] = 0.f; + } + } + else + { + state.axes[i] = (static_cast<float>(*reinterpret_cast<const LONG*>(reinterpret_cast<const char*>(&joystate) + m_axes[i])) + 0.5f) * 100.f / 32767.5f; + } + } + else + { + state.axes[i] = 0.f; + } + } + + // Get the current state of each button + for (int i = 0; i < Joystick::ButtonCount; ++i) + { + if (m_buttons[i] != -1) + { + BYTE value = *reinterpret_cast<const BYTE*>(reinterpret_cast<const char*>(&joystate) + m_buttons[i]); + + state.buttons[i] = ((value & 0x80) != 0); + } + else + { + state.buttons[i] = false; + } + } + + state.connected = true; + } + + return state; +} + + +//////////////////////////////////////////////////////////// +BOOL CALLBACK JoystickImpl::deviceEnumerationCallback(const DIDEVICEINSTANCE* deviceInstance, void*) +{ + for (std::size_t i = 0; i < joystickList.size(); ++i) + { + if (joystickList[i].guid == deviceInstance->guidInstance) + { + joystickList[i].plugged = true; + + return DIENUM_CONTINUE; + } + } + + JoystickRecord record = { deviceInstance->guidInstance, sf::Joystick::Count, true }; + joystickList.push_back(record); + + return DIENUM_CONTINUE; +} + + +//////////////////////////////////////////////////////////// +BOOL CALLBACK JoystickImpl::deviceObjectEnumerationCallback(const DIDEVICEOBJECTINSTANCE* deviceObjectInstance, void* userData) +{ + sf::priv::JoystickImpl& joystick = *reinterpret_cast<sf::priv::JoystickImpl*>(userData); + + if (DIDFT_GETTYPE(deviceObjectInstance->dwType) & DIDFT_AXIS) + { + // Axes + if (deviceObjectInstance->guidType == guids::GUID_XAxis) + joystick.m_axes[Joystick::X] = DIJOFS_X; + else if (deviceObjectInstance->guidType == guids::GUID_YAxis) + joystick.m_axes[Joystick::Y] = DIJOFS_Y; + else if (deviceObjectInstance->guidType == guids::GUID_ZAxis) + joystick.m_axes[Joystick::Z] = DIJOFS_Z; + else if (deviceObjectInstance->guidType == guids::GUID_RzAxis) + joystick.m_axes[Joystick::R] = DIJOFS_RZ; + else if (deviceObjectInstance->guidType == guids::GUID_RxAxis) + joystick.m_axes[Joystick::U] = DIJOFS_RX; + else if (deviceObjectInstance->guidType == guids::GUID_RyAxis) + joystick.m_axes[Joystick::V] = DIJOFS_RY; + else if (deviceObjectInstance->guidType == guids::GUID_Slider) + { + if(joystick.m_axes[Joystick::U] == -1) + joystick.m_axes[Joystick::U] = DIJOFS_SLIDER(0); + else + joystick.m_axes[Joystick::V] = DIJOFS_SLIDER(1); + } + else + return DIENUM_CONTINUE; + + // Set the axis' value range to that of a signed short: [-32768, 32767] + DIPROPRANGE propertyRange; + + std::memset(&propertyRange, 0, sizeof(propertyRange)); + propertyRange.diph.dwSize = sizeof(propertyRange); + propertyRange.diph.dwHeaderSize = sizeof(propertyRange.diph); + propertyRange.diph.dwObj = deviceObjectInstance->dwType; + propertyRange.diph.dwHow = DIPH_BYID; + propertyRange.lMin = -32768; + propertyRange.lMax = 32767; + + HRESULT result = joystick.m_device->SetProperty(DIPROP_RANGE, &propertyRange.diph); + + if (result) + err() << "Failed to set DirectInput device axis property range: " << result << std::endl; + + return DIENUM_CONTINUE; + } + else if (DIDFT_GETTYPE(deviceObjectInstance->dwType) & DIDFT_POV) + { + // POVs + if (deviceObjectInstance->guidType == guids::GUID_POV) + { + if (joystick.m_axes[Joystick::PovX] == -1) + { + joystick.m_axes[Joystick::PovX] = DIJOFS_POV(0); + joystick.m_axes[Joystick::PovY] = DIJOFS_POV(0); + } + } + + return DIENUM_CONTINUE; + } + else if (DIDFT_GETTYPE(deviceObjectInstance->dwType) & DIDFT_BUTTON) + { + // Buttons + for (int i = 0; i < Joystick::ButtonCount; ++i) + { + if (joystick.m_buttons[i] == -1) + { + joystick.m_buttons[i] = DIJOFS_BUTTON(i); + break; + } + } + + return DIENUM_CONTINUE; + } + + return DIENUM_CONTINUE; +} + } // namespace priv } // namespace sf diff --git a/src/SFML/Window/Win32/JoystickImpl.hpp b/src/SFML/Window/Win32/JoystickImpl.hpp index aa93fd1d..60999da9 100644 --- a/src/SFML/Window/Win32/JoystickImpl.hpp +++ b/src/SFML/Window/Win32/JoystickImpl.hpp @@ -34,13 +34,15 @@ #ifdef _WIN32_WINNT #undef _WIN32_WINNT #endif -#define _WIN32_WINDOWS 0x0501 -#define _WIN32_WINNT 0x0501 +#define _WIN32_WINDOWS 0x0501 +#define _WIN32_WINNT 0x0501 +#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> namespace sf @@ -131,14 +133,100 @@ public: //////////////////////////////////////////////////////////// JoystickState update(); + //////////////////////////////////////////////////////////// + /// \brief Perform the global initialization of the joystick module (DInput) + /// + //////////////////////////////////////////////////////////// + static void initializeDInput(); + + //////////////////////////////////////////////////////////// + /// \brief Perform the global cleanup of the joystick module (DInput) + /// + //////////////////////////////////////////////////////////// + static void cleanupDInput(); + + //////////////////////////////////////////////////////////// + /// \brief Check if a joystick is currently connected (DInput) + /// + /// \param index Index of the joystick to check + /// + /// \return True if the joystick is connected, false otherwise + /// + //////////////////////////////////////////////////////////// + static bool isConnectedDInput(unsigned int index); + + //////////////////////////////////////////////////////////// + /// \brief Update the connection status of all joysticks (DInput) + /// + //////////////////////////////////////////////////////////// + static void updateConnectionsDInput(); + + //////////////////////////////////////////////////////////// + /// \brief Open the joystick (DInput) + /// + /// \param index Index assigned to the joystick + /// + /// \return True on success, false on failure + /// + //////////////////////////////////////////////////////////// + bool openDInput(unsigned int index); + + //////////////////////////////////////////////////////////// + /// \brief Close the joystick (DInput) + /// + //////////////////////////////////////////////////////////// + void closeDInput(); + + //////////////////////////////////////////////////////////// + /// \brief Get the joystick capabilities (DInput) + /// + /// \return Joystick capabilities + /// + //////////////////////////////////////////////////////////// + JoystickCaps getCapabilitiesDInput() const; + + //////////////////////////////////////////////////////////// + /// \brief Update the joystick and get its new state (DInput) + /// + /// \return Joystick state + /// + //////////////////////////////////////////////////////////// + JoystickState updateDInput(); + private: + //////////////////////////////////////////////////////////// + /// \brief Device enumeration callback function passed to EnumDevices in updateConnections + /// + /// \param deviceInstance Device object instance + /// \param userData User data (unused) + /// + /// \return DIENUM_CONTINUE to continue enumerating devices or DIENUM_STOP to stop + /// + //////////////////////////////////////////////////////////// + static BOOL CALLBACK deviceEnumerationCallback(const DIDEVICEINSTANCE* deviceInstance, void* userData); + + //////////////////////////////////////////////////////////// + /// \brief Device object enumeration callback function passed to EnumObjects in open + /// + /// \param deviceObjectInstance Device object instance + /// \param userData User data (pointer to our JoystickImpl object) + /// + /// \return DIENUM_CONTINUE to continue enumerating objects or DIENUM_STOP to stop + /// + //////////////////////////////////////////////////////////// + static BOOL CALLBACK deviceObjectEnumerationCallback(const DIDEVICEOBJECTINSTANCE* deviceObjectInstance, void* userData); + //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - unsigned int m_index; ///< Index of the joystick - JOYCAPS m_caps; ///< Joystick capabilities - 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 }; } // namespace priv diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index ef049726..378e5125 100755 --- a/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -39,6 +39,7 @@ #include <GL/gl.h> #include <SFML/System/Err.hpp> #include <SFML/System/Utf.hpp> +#include <Dbt.h> #include <vector> #include <cstring> @@ -56,11 +57,6 @@ #define MAPVK_VK_TO_VSC (0) #endif -// Avoid including <Dbt.h> just for one define -#ifndef DBT_DEVNODES_CHANGED - #define DBT_DEVNODES_CHANGED 0x0007 -#endif - namespace { unsigned int windowCount = 0; // Windows owned by SFML @@ -216,6 +212,10 @@ m_cursorGrabbed (m_fullscreen) // Create the window 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_HDR deviceBroadcastHeader = {sizeof(DEV_BROADCAST_HDR), DBT_DEVTYP_DEVICEINTERFACE, 0}; + RegisterDeviceNotification(m_handle, &deviceBroadcastHeader, DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); + // If we're the first window handle, we only need to poll for joysticks when WM_DEVICECHANGE message is received if (m_handle) { @@ -983,8 +983,15 @@ void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam) case WM_DEVICECHANGE: { // Some sort of device change has happened, update joystick connections - if (wParam == DBT_DEVNODES_CHANGED) - JoystickImpl::updateConnections(); + if ((wParam == DBT_DEVICEARRIVAL) || (wParam == DBT_DEVICEREMOVECOMPLETE)) + { + // Some sort of device change has happened, update joystick connections if it is a device interface + DEV_BROADCAST_HDR* deviceBroadcastHeader = reinterpret_cast<DEV_BROADCAST_HDR*>(lParam); + + if (deviceBroadcastHeader && (deviceBroadcastHeader->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)) + JoystickImpl::updateConnections(); + } + break; } } From 5d7843c58a850b4941d7d9794d6fede2bbc02833 Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <maximilian.wagenbach@native-instruments.de> Date: Mon, 29 Jan 2018 19:03:53 +0100 Subject: [PATCH 033/211] Updated the copyright year to 2018. --- examples/cocoa/CocoaAppDelegate.h | 2 +- examples/cocoa/CocoaAppDelegate.mm | 2 +- examples/cocoa/NSString+stdstring.h | 2 +- examples/cocoa/NSString+stdstring.mm | 2 +- examples/cocoa/main.m | 2 +- examples/cocoa/resources/Cocoa-Info.plist | 2 +- include/SFML/Audio.hpp | 2 +- include/SFML/Audio/AlResource.hpp | 2 +- include/SFML/Audio/Export.hpp | 2 +- include/SFML/Audio/InputSoundFile.hpp | 2 +- include/SFML/Audio/Listener.hpp | 2 +- include/SFML/Audio/Music.hpp | 2 +- include/SFML/Audio/OutputSoundFile.hpp | 2 +- include/SFML/Audio/Sound.hpp | 2 +- include/SFML/Audio/SoundBuffer.hpp | 2 +- include/SFML/Audio/SoundBufferRecorder.hpp | 2 +- include/SFML/Audio/SoundFileFactory.hpp | 2 +- include/SFML/Audio/SoundFileFactory.inl | 2 +- include/SFML/Audio/SoundFileReader.hpp | 2 +- include/SFML/Audio/SoundFileWriter.hpp | 2 +- include/SFML/Audio/SoundRecorder.hpp | 2 +- include/SFML/Audio/SoundSource.hpp | 2 +- include/SFML/Audio/SoundStream.hpp | 2 +- include/SFML/Config.hpp | 2 +- include/SFML/Graphics.hpp | 2 +- include/SFML/Graphics/BlendMode.hpp | 2 +- include/SFML/Graphics/CircleShape.hpp | 2 +- include/SFML/Graphics/Color.hpp | 2 +- include/SFML/Graphics/ConvexShape.hpp | 2 +- include/SFML/Graphics/Drawable.hpp | 2 +- include/SFML/Graphics/Export.hpp | 2 +- include/SFML/Graphics/Font.hpp | 2 +- include/SFML/Graphics/Glsl.hpp | 2 +- include/SFML/Graphics/Glsl.inl | 2 +- include/SFML/Graphics/Glyph.hpp | 2 +- include/SFML/Graphics/Image.hpp | 2 +- include/SFML/Graphics/PrimitiveType.hpp | 2 +- include/SFML/Graphics/Rect.hpp | 2 +- include/SFML/Graphics/Rect.inl | 2 +- include/SFML/Graphics/RectangleShape.hpp | 2 +- include/SFML/Graphics/RenderStates.hpp | 2 +- include/SFML/Graphics/RenderTarget.hpp | 2 +- include/SFML/Graphics/RenderTexture.hpp | 2 +- include/SFML/Graphics/RenderWindow.hpp | 2 +- include/SFML/Graphics/Shader.hpp | 2 +- include/SFML/Graphics/Shape.hpp | 2 +- include/SFML/Graphics/Sprite.hpp | 2 +- include/SFML/Graphics/Text.hpp | 2 +- include/SFML/Graphics/Texture.hpp | 2 +- include/SFML/Graphics/Transform.hpp | 2 +- include/SFML/Graphics/Transformable.hpp | 2 +- include/SFML/Graphics/Vertex.hpp | 2 +- include/SFML/Graphics/VertexArray.hpp | 2 +- include/SFML/Graphics/VertexBuffer.hpp | 2 +- include/SFML/Graphics/View.hpp | 2 +- include/SFML/Main.hpp | 2 +- include/SFML/Network.hpp | 2 +- include/SFML/Network/Export.hpp | 2 +- include/SFML/Network/Ftp.hpp | 2 +- include/SFML/Network/Http.hpp | 2 +- include/SFML/Network/IpAddress.hpp | 2 +- include/SFML/Network/Packet.hpp | 2 +- include/SFML/Network/Socket.hpp | 2 +- include/SFML/Network/SocketHandle.hpp | 2 +- include/SFML/Network/SocketSelector.hpp | 2 +- include/SFML/Network/TcpListener.hpp | 2 +- include/SFML/Network/TcpSocket.hpp | 2 +- include/SFML/Network/UdpSocket.hpp | 2 +- include/SFML/OpenGL.hpp | 2 +- include/SFML/System.hpp | 2 +- include/SFML/System/Clock.hpp | 2 +- include/SFML/System/Err.hpp | 2 +- include/SFML/System/Export.hpp | 2 +- include/SFML/System/FileInputStream.hpp | 2 +- include/SFML/System/InputStream.hpp | 2 +- include/SFML/System/Lock.hpp | 2 +- include/SFML/System/MemoryInputStream.hpp | 2 +- include/SFML/System/Mutex.hpp | 2 +- include/SFML/System/NativeActivity.hpp | 2 +- include/SFML/System/NonCopyable.hpp | 2 +- include/SFML/System/Sleep.hpp | 2 +- include/SFML/System/String.hpp | 2 +- include/SFML/System/String.inl | 2 +- include/SFML/System/Thread.hpp | 2 +- include/SFML/System/Thread.inl | 2 +- include/SFML/System/ThreadLocal.hpp | 2 +- include/SFML/System/ThreadLocalPtr.hpp | 2 +- include/SFML/System/ThreadLocalPtr.inl | 2 +- include/SFML/System/Time.hpp | 2 +- include/SFML/System/Utf.hpp | 2 +- include/SFML/System/Utf.inl | 2 +- include/SFML/System/Vector2.hpp | 2 +- include/SFML/System/Vector2.inl | 2 +- include/SFML/System/Vector3.hpp | 2 +- include/SFML/System/Vector3.inl | 2 +- include/SFML/Window.hpp | 2 +- include/SFML/Window/Clipboard.hpp | 2 +- include/SFML/Window/Context.hpp | 2 +- include/SFML/Window/ContextSettings.hpp | 2 +- include/SFML/Window/Cursor.hpp | 2 +- include/SFML/Window/Event.hpp | 2 +- include/SFML/Window/Export.hpp | 2 +- include/SFML/Window/GlResource.hpp | 2 +- include/SFML/Window/Joystick.hpp | 2 +- include/SFML/Window/Keyboard.hpp | 2 +- include/SFML/Window/Mouse.hpp | 2 +- include/SFML/Window/Sensor.hpp | 2 +- include/SFML/Window/Touch.hpp | 2 +- include/SFML/Window/VideoMode.hpp | 2 +- include/SFML/Window/Window.hpp | 2 +- include/SFML/Window/WindowHandle.hpp | 2 +- include/SFML/Window/WindowStyle.hpp | 2 +- license.md | 2 +- src/SFML/Audio/ALCheck.cpp | 2 +- src/SFML/Audio/ALCheck.hpp | 2 +- src/SFML/Audio/AlResource.cpp | 2 +- src/SFML/Audio/AudioDevice.cpp | 2 +- src/SFML/Audio/AudioDevice.hpp | 2 +- src/SFML/Audio/InputSoundFile.cpp | 2 +- src/SFML/Audio/Listener.cpp | 2 +- src/SFML/Audio/Music.cpp | 2 +- src/SFML/Audio/OutputSoundFile.cpp | 2 +- src/SFML/Audio/Sound.cpp | 2 +- src/SFML/Audio/SoundBuffer.cpp | 2 +- src/SFML/Audio/SoundBufferRecorder.cpp | 2 +- src/SFML/Audio/SoundFileFactory.cpp | 2 +- src/SFML/Audio/SoundFileReaderFlac.cpp | 2 +- src/SFML/Audio/SoundFileReaderFlac.hpp | 2 +- src/SFML/Audio/SoundFileReaderOgg.cpp | 2 +- src/SFML/Audio/SoundFileReaderOgg.hpp | 2 +- src/SFML/Audio/SoundFileReaderWav.cpp | 2 +- src/SFML/Audio/SoundFileReaderWav.hpp | 2 +- src/SFML/Audio/SoundFileWriterFlac.cpp | 2 +- src/SFML/Audio/SoundFileWriterFlac.hpp | 2 +- src/SFML/Audio/SoundFileWriterOgg.cpp | 2 +- src/SFML/Audio/SoundFileWriterOgg.hpp | 2 +- src/SFML/Audio/SoundFileWriterWav.cpp | 2 +- src/SFML/Audio/SoundFileWriterWav.hpp | 2 +- src/SFML/Audio/SoundRecorder.cpp | 2 +- src/SFML/Audio/SoundSource.cpp | 2 +- src/SFML/Audio/SoundStream.cpp | 2 +- src/SFML/Graphics/BlendMode.cpp | 2 +- src/SFML/Graphics/CircleShape.cpp | 2 +- src/SFML/Graphics/Color.cpp | 2 +- src/SFML/Graphics/ConvexShape.cpp | 2 +- src/SFML/Graphics/Font.cpp | 2 +- src/SFML/Graphics/GLCheck.cpp | 2 +- src/SFML/Graphics/GLCheck.hpp | 2 +- src/SFML/Graphics/GLExtensions.cpp | 2 +- src/SFML/Graphics/GLExtensions.hpp | 2 +- src/SFML/Graphics/GLLoader.cpp | 2 +- src/SFML/Graphics/GLLoader.hpp | 2 +- src/SFML/Graphics/Glsl.cpp | 2 +- src/SFML/Graphics/Image.cpp | 2 +- src/SFML/Graphics/ImageLoader.cpp | 2 +- src/SFML/Graphics/ImageLoader.hpp | 2 +- src/SFML/Graphics/RectangleShape.cpp | 2 +- src/SFML/Graphics/RenderStates.cpp | 2 +- src/SFML/Graphics/RenderTarget.cpp | 2 +- src/SFML/Graphics/RenderTexture.cpp | 2 +- src/SFML/Graphics/RenderTextureImpl.cpp | 2 +- src/SFML/Graphics/RenderTextureImpl.hpp | 2 +- src/SFML/Graphics/RenderTextureImplDefault.cpp | 2 +- src/SFML/Graphics/RenderTextureImplDefault.hpp | 2 +- src/SFML/Graphics/RenderTextureImplFBO.cpp | 2 +- src/SFML/Graphics/RenderTextureImplFBO.hpp | 2 +- src/SFML/Graphics/RenderWindow.cpp | 2 +- src/SFML/Graphics/Shader.cpp | 2 +- src/SFML/Graphics/Shape.cpp | 2 +- src/SFML/Graphics/Sprite.cpp | 2 +- src/SFML/Graphics/Text.cpp | 2 +- src/SFML/Graphics/Texture.cpp | 2 +- src/SFML/Graphics/TextureSaver.cpp | 2 +- src/SFML/Graphics/TextureSaver.hpp | 2 +- src/SFML/Graphics/Transform.cpp | 2 +- src/SFML/Graphics/Transformable.cpp | 2 +- src/SFML/Graphics/Vertex.cpp | 2 +- src/SFML/Graphics/VertexArray.cpp | 2 +- src/SFML/Graphics/VertexBuffer.cpp | 2 +- src/SFML/Graphics/View.cpp | 2 +- src/SFML/Main/MainAndroid.cpp | 2 +- src/SFML/Main/MainWin32.cpp | 2 +- src/SFML/Main/MainiOS.mm | 2 +- src/SFML/Network/Ftp.cpp | 2 +- src/SFML/Network/Http.cpp | 2 +- src/SFML/Network/IpAddress.cpp | 2 +- src/SFML/Network/Packet.cpp | 2 +- src/SFML/Network/Socket.cpp | 2 +- src/SFML/Network/SocketImpl.hpp | 2 +- src/SFML/Network/SocketSelector.cpp | 2 +- src/SFML/Network/TcpListener.cpp | 2 +- src/SFML/Network/TcpSocket.cpp | 2 +- src/SFML/Network/UdpSocket.cpp | 2 +- src/SFML/Network/Unix/SocketImpl.cpp | 2 +- src/SFML/Network/Unix/SocketImpl.hpp | 2 +- src/SFML/Network/Win32/SocketImpl.cpp | 2 +- src/SFML/Network/Win32/SocketImpl.hpp | 2 +- src/SFML/System/Android/Activity.cpp | 2 +- src/SFML/System/Android/NativeActivity.cpp | 2 +- src/SFML/System/Clock.cpp | 2 +- src/SFML/System/Err.cpp | 2 +- src/SFML/System/FileInputStream.cpp | 2 +- src/SFML/System/Lock.cpp | 2 +- src/SFML/System/MemoryInputStream.cpp | 2 +- src/SFML/System/Mutex.cpp | 2 +- src/SFML/System/Sleep.cpp | 2 +- src/SFML/System/String.cpp | 2 +- src/SFML/System/Thread.cpp | 2 +- src/SFML/System/ThreadLocal.cpp | 2 +- src/SFML/System/Time.cpp | 2 +- src/SFML/System/Unix/ClockImpl.cpp | 2 +- src/SFML/System/Unix/ClockImpl.hpp | 2 +- src/SFML/System/Unix/MutexImpl.cpp | 2 +- src/SFML/System/Unix/MutexImpl.hpp | 2 +- src/SFML/System/Unix/SleepImpl.cpp | 2 +- src/SFML/System/Unix/SleepImpl.hpp | 2 +- src/SFML/System/Unix/ThreadImpl.cpp | 2 +- src/SFML/System/Unix/ThreadImpl.hpp | 2 +- src/SFML/System/Unix/ThreadLocalImpl.cpp | 2 +- src/SFML/System/Unix/ThreadLocalImpl.hpp | 2 +- src/SFML/System/Win32/ClockImpl.cpp | 2 +- src/SFML/System/Win32/ClockImpl.hpp | 2 +- src/SFML/System/Win32/MutexImpl.cpp | 2 +- src/SFML/System/Win32/MutexImpl.hpp | 2 +- src/SFML/System/Win32/SleepImpl.cpp | 2 +- src/SFML/System/Win32/SleepImpl.hpp | 2 +- src/SFML/System/Win32/ThreadImpl.cpp | 2 +- src/SFML/System/Win32/ThreadImpl.hpp | 2 +- src/SFML/System/Win32/ThreadLocalImpl.cpp | 2 +- src/SFML/System/Win32/ThreadLocalImpl.hpp | 2 +- src/SFML/Window/Android/ClipboardImpl.cpp | 2 +- src/SFML/Window/Android/ClipboardImpl.hpp | 2 +- src/SFML/Window/Android/CursorImpl.cpp | 2 +- src/SFML/Window/Android/CursorImpl.hpp | 2 +- src/SFML/Window/Android/SensorImpl.cpp | 2 +- src/SFML/Window/Android/SensorImpl.hpp | 2 +- src/SFML/Window/Clipboard.cpp | 2 +- src/SFML/Window/ClipboardImpl.hpp | 2 +- src/SFML/Window/Context.cpp | 2 +- src/SFML/Window/Cursor.cpp | 2 +- src/SFML/Window/CursorImpl.hpp | 2 +- src/SFML/Window/FreeBSD/JoystickImpl.cpp | 2 +- src/SFML/Window/FreeBSD/JoystickImpl.hpp | 2 +- src/SFML/Window/GlContext.cpp | 2 +- src/SFML/Window/GlContext.hpp | 2 +- src/SFML/Window/GlResource.cpp | 2 +- src/SFML/Window/InputImpl.hpp | 2 +- src/SFML/Window/Joystick.cpp | 2 +- src/SFML/Window/JoystickImpl.hpp | 2 +- src/SFML/Window/JoystickManager.cpp | 2 +- src/SFML/Window/JoystickManager.hpp | 2 +- src/SFML/Window/Keyboard.cpp | 2 +- src/SFML/Window/Mouse.cpp | 2 +- src/SFML/Window/OSX/AutoreleasePoolWrapper.h | 2 +- src/SFML/Window/OSX/AutoreleasePoolWrapper.mm | 2 +- src/SFML/Window/OSX/ClipboardImpl.hpp | 2 +- src/SFML/Window/OSX/ClipboardImpl.mm | 2 +- src/SFML/Window/OSX/CursorImpl.hpp | 2 +- src/SFML/Window/OSX/CursorImpl.mm | 2 +- src/SFML/Window/OSX/HIDInputManager.hpp | 2 +- src/SFML/Window/OSX/HIDInputManager.mm | 2 +- src/SFML/Window/OSX/HIDJoystickManager.cpp | 2 +- src/SFML/Window/OSX/HIDJoystickManager.hpp | 2 +- src/SFML/Window/OSX/InputImpl.hpp | 2 +- src/SFML/Window/OSX/InputImpl.mm | 2 +- src/SFML/Window/OSX/JoystickImpl.cpp | 2 +- src/SFML/Window/OSX/JoystickImpl.hpp | 2 +- src/SFML/Window/OSX/NSImage+raw.h | 2 +- src/SFML/Window/OSX/NSImage+raw.mm | 2 +- src/SFML/Window/OSX/SFApplication.h | 2 +- src/SFML/Window/OSX/SFApplication.m | 2 +- src/SFML/Window/OSX/SFApplicationDelegate.h | 2 +- src/SFML/Window/OSX/SFApplicationDelegate.m | 2 +- src/SFML/Window/OSX/SFContext.hpp | 2 +- src/SFML/Window/OSX/SFContext.mm | 2 +- src/SFML/Window/OSX/SFKeyboardModifiersHelper.h | 2 +- src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm | 2 +- src/SFML/Window/OSX/SFOpenGLView+keyboard.mm | 2 +- src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h | 2 +- src/SFML/Window/OSX/SFOpenGLView+mouse.mm | 2 +- src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h | 2 +- src/SFML/Window/OSX/SFOpenGLView.h | 2 +- src/SFML/Window/OSX/SFOpenGLView.mm | 2 +- src/SFML/Window/OSX/SFSilentResponder.h | 2 +- src/SFML/Window/OSX/SFSilentResponder.m | 2 +- src/SFML/Window/OSX/SFViewController.h | 2 +- src/SFML/Window/OSX/SFViewController.mm | 2 +- src/SFML/Window/OSX/SFWindow.h | 2 +- src/SFML/Window/OSX/SFWindow.m | 2 +- src/SFML/Window/OSX/SFWindowController.h | 2 +- src/SFML/Window/OSX/SFWindowController.mm | 2 +- src/SFML/Window/OSX/Scaling.h | 2 +- src/SFML/Window/OSX/SensorImpl.cpp | 2 +- src/SFML/Window/OSX/SensorImpl.hpp | 2 +- src/SFML/Window/OSX/VideoModeImpl.cpp | 2 +- src/SFML/Window/OSX/WindowImplCocoa.hpp | 2 +- src/SFML/Window/OSX/WindowImplCocoa.mm | 2 +- src/SFML/Window/OSX/WindowImplDelegateProtocol.h | 2 +- src/SFML/Window/OSX/cg_sf_conversion.hpp | 2 +- src/SFML/Window/OSX/cg_sf_conversion.mm | 2 +- src/SFML/Window/OSX/cpp_objc_conversion.h | 2 +- src/SFML/Window/OSX/cpp_objc_conversion.mm | 2 +- src/SFML/Window/Sensor.cpp | 2 +- src/SFML/Window/SensorImpl.hpp | 2 +- src/SFML/Window/SensorManager.cpp | 2 +- src/SFML/Window/SensorManager.hpp | 2 +- src/SFML/Window/Touch.cpp | 2 +- src/SFML/Window/Unix/ClipboardImpl.cpp | 2 +- src/SFML/Window/Unix/ClipboardImpl.hpp | 2 +- src/SFML/Window/Unix/CursorImpl.cpp | 2 +- src/SFML/Window/Unix/CursorImpl.hpp | 2 +- src/SFML/Window/Unix/Display.cpp | 2 +- src/SFML/Window/Unix/Display.hpp | 2 +- src/SFML/Window/Unix/GlxContext.cpp | 2 +- src/SFML/Window/Unix/GlxContext.hpp | 2 +- src/SFML/Window/Unix/GlxExtensions.cpp | 2 +- src/SFML/Window/Unix/GlxExtensions.hpp | 2 +- src/SFML/Window/Unix/InputImpl.cpp | 2 +- src/SFML/Window/Unix/InputImpl.hpp | 2 +- src/SFML/Window/Unix/JoystickImpl.cpp | 2 +- src/SFML/Window/Unix/JoystickImpl.hpp | 2 +- src/SFML/Window/Unix/SensorImpl.cpp | 2 +- src/SFML/Window/Unix/SensorImpl.hpp | 2 +- src/SFML/Window/Unix/VideoModeImpl.cpp | 2 +- src/SFML/Window/Unix/WindowImplX11.cpp | 2 +- src/SFML/Window/Unix/WindowImplX11.hpp | 2 +- src/SFML/Window/VideoMode.cpp | 2 +- src/SFML/Window/VideoModeImpl.hpp | 2 +- src/SFML/Window/Win32/ClipboardImpl.cpp | 2 +- src/SFML/Window/Win32/ClipboardImpl.hpp | 2 +- src/SFML/Window/Win32/CursorImpl.cpp | 2 +- src/SFML/Window/Win32/CursorImpl.hpp | 2 +- src/SFML/Window/Win32/InputImpl.cpp | 2 +- src/SFML/Window/Win32/InputImpl.hpp | 2 +- src/SFML/Window/Win32/JoystickImpl.cpp | 2 +- src/SFML/Window/Win32/JoystickImpl.hpp | 2 +- src/SFML/Window/Win32/SensorImpl.cpp | 2 +- src/SFML/Window/Win32/SensorImpl.hpp | 2 +- src/SFML/Window/Win32/VideoModeImpl.cpp | 2 +- src/SFML/Window/Win32/WglContext.cpp | 2 +- src/SFML/Window/Win32/WglContext.hpp | 2 +- src/SFML/Window/Win32/WglExtensions.cpp | 2 +- src/SFML/Window/Win32/WglExtensions.hpp | 2 +- src/SFML/Window/Win32/WindowImplWin32.cpp | 2 +- src/SFML/Window/Win32/WindowImplWin32.hpp | 2 +- src/SFML/Window/Window.cpp | 2 +- src/SFML/Window/WindowImpl.cpp | 2 +- src/SFML/Window/WindowImpl.hpp | 2 +- src/SFML/Window/iOS/ClipboardImpl.hpp | 2 +- src/SFML/Window/iOS/ClipboardImpl.mm | 2 +- src/SFML/Window/iOS/CursorImpl.cpp | 2 +- src/SFML/Window/iOS/CursorImpl.hpp | 2 +- src/SFML/Window/iOS/EaglContext.hpp | 2 +- src/SFML/Window/iOS/EaglContext.mm | 2 +- src/SFML/Window/iOS/InputImpl.hpp | 2 +- src/SFML/Window/iOS/InputImpl.mm | 2 +- src/SFML/Window/iOS/JoystickImpl.hpp | 2 +- src/SFML/Window/iOS/JoystickImpl.mm | 2 +- src/SFML/Window/iOS/ObjCType.hpp | 2 +- src/SFML/Window/iOS/SFAppDelegate.hpp | 2 +- src/SFML/Window/iOS/SFAppDelegate.mm | 2 +- src/SFML/Window/iOS/SFMain.hpp | 2 +- src/SFML/Window/iOS/SFMain.mm | 2 +- src/SFML/Window/iOS/SFView.hpp | 2 +- src/SFML/Window/iOS/SFView.mm | 2 +- src/SFML/Window/iOS/SFViewController.hpp | 2 +- src/SFML/Window/iOS/SFViewController.mm | 2 +- src/SFML/Window/iOS/SensorImpl.hpp | 2 +- src/SFML/Window/iOS/SensorImpl.mm | 2 +- src/SFML/Window/iOS/VideoModeImpl.mm | 2 +- src/SFML/Window/iOS/WindowImplUIKit.hpp | 2 +- src/SFML/Window/iOS/WindowImplUIKit.mm | 2 +- .../xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp | 2 +- tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm | 2 +- .../templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in | 3 +-- .../templates/SFML/SFML Base.xctemplate/TemplateInfo.plist | 2 +- .../templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist | 2 +- .../templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist | 3 +-- .../SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in | 2 +- .../templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist | 3 +-- 380 files changed, 380 insertions(+), 383 deletions(-) diff --git a/examples/cocoa/CocoaAppDelegate.h b/examples/cocoa/CocoaAppDelegate.h index fed5b528..9dab1384 100644 --- a/examples/cocoa/CocoaAppDelegate.h +++ b/examples/cocoa/CocoaAppDelegate.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 3996b3a3..a58ca878 100644 --- a/examples/cocoa/CocoaAppDelegate.mm +++ b/examples/cocoa/CocoaAppDelegate.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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.h b/examples/cocoa/NSString+stdstring.h index 0021ef95..cce9bd80 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 d2ce03bc..a7b99d54 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/main.m b/examples/cocoa/main.m index a66e33a4..b7aa9444 100644 --- a/examples/cocoa/main.m +++ b/examples/cocoa/main.m @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 3bbc6081..1348f3cc 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-2017 Marco Antognini and Laurent Gomila. Shared under zlib/libpng License.</string> + <string>Copyright © 2007-2018 Marco Antognini and Laurent Gomila. Shared under zlib/libpng License.</string> <key>NSMainNibFile</key> <string>MainMenu</string> <key>NSPrincipalClass</key> diff --git a/include/SFML/Audio.hpp b/include/SFML/Audio.hpp index 2d3e5d75..31679273 100644 --- a/include/SFML/Audio.hpp +++ b/include/SFML/Audio.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/AlResource.hpp b/include/SFML/Audio/AlResource.hpp index 2cb48d0e..dd7d44c4 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/Export.hpp b/include/SFML/Audio/Export.hpp index 31e463ea..9e5e09c2 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/InputSoundFile.hpp b/include/SFML/Audio/InputSoundFile.hpp index 8c51db85..317b9526 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/Listener.hpp b/include/SFML/Audio/Listener.hpp index af83e252..9fb7fff0 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/Music.hpp b/include/SFML/Audio/Music.hpp index d48fab6b..53519052 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/OutputSoundFile.hpp b/include/SFML/Audio/OutputSoundFile.hpp index 325b38f0..5da374b0 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/Sound.hpp b/include/SFML/Audio/Sound.hpp index 3b200240..f8e2e14c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/SoundBuffer.hpp b/include/SFML/Audio/SoundBuffer.hpp index 6303cfb3..5aaa4ca9 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/SoundBufferRecorder.hpp b/include/SFML/Audio/SoundBufferRecorder.hpp index b5b6436c..266603df 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/SoundFileFactory.hpp b/include/SFML/Audio/SoundFileFactory.hpp index b4eadf0f..e3719c81 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/SoundFileFactory.inl b/include/SFML/Audio/SoundFileFactory.inl index a552ba87..6c499f36 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/SoundFileReader.hpp b/include/SFML/Audio/SoundFileReader.hpp index e0623010..a040db93 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/SoundFileWriter.hpp b/include/SFML/Audio/SoundFileWriter.hpp index 8a35a0da..8651ddce 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/SoundRecorder.hpp b/include/SFML/Audio/SoundRecorder.hpp index 33c80b1f..d4dc74f3 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/SoundSource.hpp b/include/SFML/Audio/SoundSource.hpp index fc71859d..fcc9c793 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Audio/SoundStream.hpp b/include/SFML/Audio/SoundStream.hpp index fa1e1efd..bed83114 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Config.hpp b/include/SFML/Config.hpp index 5a8a87cf..33c4a71b 100644 --- a/include/SFML/Config.hpp +++ b/include/SFML/Config.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics.hpp b/include/SFML/Graphics.hpp index 81923520..252c6e9f 100644 --- a/include/SFML/Graphics.hpp +++ b/include/SFML/Graphics.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/BlendMode.hpp b/include/SFML/Graphics/BlendMode.hpp index 3ba0a40f..15da7d17 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/CircleShape.hpp b/include/SFML/Graphics/CircleShape.hpp index 9f689691..896c8931 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Color.hpp b/include/SFML/Graphics/Color.hpp index 1f81feb1..43357aa3 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/ConvexShape.hpp b/include/SFML/Graphics/ConvexShape.hpp index 117f843a..e770299e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Drawable.hpp b/include/SFML/Graphics/Drawable.hpp index a409cf7c..852b22d2 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Export.hpp b/include/SFML/Graphics/Export.hpp index de164a1a..0b47b391 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Font.hpp b/include/SFML/Graphics/Font.hpp index 9451f08c..e7538662 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Glsl.hpp b/include/SFML/Graphics/Glsl.hpp index 7bf16046..e3943e74 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Glsl.inl b/include/SFML/Graphics/Glsl.inl index 8e728716..9c9f0aee 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Glyph.hpp b/include/SFML/Graphics/Glyph.hpp index 8c632af2..59deb9b6 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Image.hpp b/include/SFML/Graphics/Image.hpp index a9010c0d..c950f580 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/PrimitiveType.hpp b/include/SFML/Graphics/PrimitiveType.hpp index 33f9e466..28cf58dd 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Rect.hpp b/include/SFML/Graphics/Rect.hpp index b88e9b2b..17f20a56 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Rect.inl b/include/SFML/Graphics/Rect.inl index c1bb9bbf..7a82e46c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/RectangleShape.hpp b/include/SFML/Graphics/RectangleShape.hpp index f9754f69..4f2c4d96 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/RenderStates.hpp b/include/SFML/Graphics/RenderStates.hpp index 870b275a..9bcde9b4 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/RenderTarget.hpp b/include/SFML/Graphics/RenderTarget.hpp index a6c7c836..a9a17d86 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/RenderTexture.hpp b/include/SFML/Graphics/RenderTexture.hpp index 52d53bd1..77647888 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/RenderWindow.hpp b/include/SFML/Graphics/RenderWindow.hpp index 609f912a..2b3b6bce 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Shader.hpp b/include/SFML/Graphics/Shader.hpp index 9fe9c607..fef1bec0 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Shape.hpp b/include/SFML/Graphics/Shape.hpp index b257ddc8..79ac5282 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Sprite.hpp b/include/SFML/Graphics/Sprite.hpp index 51bba30c..55cc8988 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Text.hpp b/include/SFML/Graphics/Text.hpp index 6aa17591..65f4f257 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Texture.hpp b/include/SFML/Graphics/Texture.hpp index 551dde6b..c292856d 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Transform.hpp b/include/SFML/Graphics/Transform.hpp index e4bb1af6..c77d08a9 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Transformable.hpp b/include/SFML/Graphics/Transformable.hpp index 4e46cc6f..67a56562 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/Vertex.hpp b/include/SFML/Graphics/Vertex.hpp index a9a88200..bb24448f 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/VertexArray.hpp b/include/SFML/Graphics/VertexArray.hpp index 109a7e82..52290650 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/VertexBuffer.hpp b/include/SFML/Graphics/VertexBuffer.hpp index 321e875e..a91a08f7 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Graphics/View.hpp b/include/SFML/Graphics/View.hpp index d49cb491..a3faa6e0 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Main.hpp b/include/SFML/Main.hpp index f8ac048d..c28a7e18 100644 --- a/include/SFML/Main.hpp +++ b/include/SFML/Main.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network.hpp b/include/SFML/Network.hpp index 3216c5cc..ccc9f7cd 100644 --- a/include/SFML/Network.hpp +++ b/include/SFML/Network.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network/Export.hpp b/include/SFML/Network/Export.hpp index 4a8d800a..e7ebdd47 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network/Ftp.hpp b/include/SFML/Network/Ftp.hpp index 3600a9d8..dd4fd58d 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network/Http.hpp b/include/SFML/Network/Http.hpp index d165a7c1..44fe67dc 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network/IpAddress.hpp b/include/SFML/Network/IpAddress.hpp index 4940f2b7..9ec13c43 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network/Packet.hpp b/include/SFML/Network/Packet.hpp index ac97692a..6d530246 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network/Socket.hpp b/include/SFML/Network/Socket.hpp index 0b111716..d260174e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network/SocketHandle.hpp b/include/SFML/Network/SocketHandle.hpp index d5b395de..270201b5 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network/SocketSelector.hpp b/include/SFML/Network/SocketSelector.hpp index 92dcbad9..106d708b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network/TcpListener.hpp b/include/SFML/Network/TcpListener.hpp index 720ebf1d..840a7cde 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network/TcpSocket.hpp b/include/SFML/Network/TcpSocket.hpp index da6b5493..6c0c8bc7 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Network/UdpSocket.hpp b/include/SFML/Network/UdpSocket.hpp index 6ee191c6..20e35b8b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/OpenGL.hpp b/include/SFML/OpenGL.hpp index 39e97b6d..408f0dd5 100644 --- a/include/SFML/OpenGL.hpp +++ b/include/SFML/OpenGL.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System.hpp b/include/SFML/System.hpp index 5f18f766..fa4f9c92 100644 --- a/include/SFML/System.hpp +++ b/include/SFML/System.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Clock.hpp b/include/SFML/System/Clock.hpp index 0e57d600..391e2c40 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Err.hpp b/include/SFML/System/Err.hpp index 56505a9d..a701fef2 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Export.hpp b/include/SFML/System/Export.hpp index 0387c2eb..e9c8ef83 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/FileInputStream.hpp b/include/SFML/System/FileInputStream.hpp index b1a8c62c..43618da6 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/InputStream.hpp b/include/SFML/System/InputStream.hpp index 4419a0b2..495a4b94 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Lock.hpp b/include/SFML/System/Lock.hpp index eb420a8e..906016c7 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/MemoryInputStream.hpp b/include/SFML/System/MemoryInputStream.hpp index c26f823d..4b7f9ef8 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Mutex.hpp b/include/SFML/System/Mutex.hpp index 18349e42..eda6909a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/NativeActivity.hpp b/include/SFML/System/NativeActivity.hpp index 79276205..e8a3b17b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/NonCopyable.hpp b/include/SFML/System/NonCopyable.hpp index 71476388..dbe1eebc 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Sleep.hpp b/include/SFML/System/Sleep.hpp index e943aa1a..ac3144be 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/String.hpp b/include/SFML/System/String.hpp index 8b0da3f0..5d047e20 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/String.inl b/include/SFML/System/String.inl index 1be1266a..b8893e73 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Thread.hpp b/include/SFML/System/Thread.hpp index 65c91271..15ae4a5b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Thread.inl b/include/SFML/System/Thread.inl index b707aa30..1f2e8de8 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/ThreadLocal.hpp b/include/SFML/System/ThreadLocal.hpp index 6975e524..1ace1ba1 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/ThreadLocalPtr.hpp b/include/SFML/System/ThreadLocalPtr.hpp index 751a9b53..bee944d3 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/ThreadLocalPtr.inl b/include/SFML/System/ThreadLocalPtr.inl index 5652f56e..12c76903 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Time.hpp b/include/SFML/System/Time.hpp index 4dff9283..43d7548b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Utf.hpp b/include/SFML/System/Utf.hpp index 819d8ff5..e1e78f67 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Utf.inl b/include/SFML/System/Utf.inl index 6ffceda6..2da83490 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Vector2.hpp b/include/SFML/System/Vector2.hpp index d5e17446..237f214c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Vector2.inl b/include/SFML/System/Vector2.inl index 081b211c..29ad76f6 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Vector3.hpp b/include/SFML/System/Vector3.hpp index 61d0dc78..b12b2f58 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/System/Vector3.inl b/include/SFML/System/Vector3.inl index 2f5eea8e..b532fe0e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window.hpp b/include/SFML/Window.hpp index 531b239f..836f13a5 100644 --- a/include/SFML/Window.hpp +++ b/include/SFML/Window.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/Clipboard.hpp b/include/SFML/Window/Clipboard.hpp index 696d8a0e..436da8f9 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/Context.hpp b/include/SFML/Window/Context.hpp index 9e1eedd4..2f60db8a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/ContextSettings.hpp b/include/SFML/Window/ContextSettings.hpp index e56244c4..00afbc47 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/Cursor.hpp b/include/SFML/Window/Cursor.hpp index 0a70e496..04eabca6 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-2016 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/Event.hpp b/include/SFML/Window/Event.hpp index 74b0bc1c..92617852 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/Export.hpp b/include/SFML/Window/Export.hpp index a890beec..37826a24 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/GlResource.hpp b/include/SFML/Window/GlResource.hpp index 3b3e225c..5a69b662 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/Joystick.hpp b/include/SFML/Window/Joystick.hpp index dda73699..ab49c744 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/Keyboard.hpp b/include/SFML/Window/Keyboard.hpp index b35c7a02..e8b91a55 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/Mouse.hpp b/include/SFML/Window/Mouse.hpp index 53d5281f..0d1e470b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/Sensor.hpp b/include/SFML/Window/Sensor.hpp index 9bef9703..6915fa06 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/Touch.hpp b/include/SFML/Window/Touch.hpp index 92c42df7..1c2b3fee 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/VideoMode.hpp b/include/SFML/Window/VideoMode.hpp index fee45ae0..24797f60 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/Window.hpp b/include/SFML/Window/Window.hpp index 44220360..c8a56176 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/WindowHandle.hpp b/include/SFML/Window/WindowHandle.hpp index 001842a5..b2a250b8 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/include/SFML/Window/WindowStyle.hpp b/include/SFML/Window/WindowStyle.hpp index 8623d1f0..53e2c9df 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/license.md b/license.md index b7b2ce4c..0e6d7b18 100644 --- a/license.md +++ b/license.md @@ -1,6 +1,6 @@ # SFML -SFML - Copyright (C) 2007-2017 Laurent Gomila - laurent@sfml-dev.org +SFML - 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. diff --git a/src/SFML/Audio/ALCheck.cpp b/src/SFML/Audio/ALCheck.cpp index e3b7bb6b..b6f1e2a0 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/ALCheck.hpp b/src/SFML/Audio/ALCheck.hpp index 85f4e72d..fc497a2d 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/AlResource.cpp b/src/SFML/Audio/AlResource.cpp index df50be0a..9be2e34c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/AudioDevice.cpp b/src/SFML/Audio/AudioDevice.cpp index 4a2c55f0..a9472f00 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/AudioDevice.hpp b/src/SFML/Audio/AudioDevice.hpp index 9d3f6e8d..f5007edb 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/InputSoundFile.cpp b/src/SFML/Audio/InputSoundFile.cpp index 43a3388f..9cc781ff 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/Listener.cpp b/src/SFML/Audio/Listener.cpp index 23e0aafd..dc348f94 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/Music.cpp b/src/SFML/Audio/Music.cpp index dc9a896d..141d6903 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/OutputSoundFile.cpp b/src/SFML/Audio/OutputSoundFile.cpp index 870e622e..16e41d38 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/Sound.cpp b/src/SFML/Audio/Sound.cpp index 8ebaa038..b7a0b130 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundBuffer.cpp b/src/SFML/Audio/SoundBuffer.cpp index c9842048..edcd4557 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundBufferRecorder.cpp b/src/SFML/Audio/SoundBufferRecorder.cpp index 105b45b6..3c70a651 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileFactory.cpp b/src/SFML/Audio/SoundFileFactory.cpp index 10b1c1e1..81383199 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileReaderFlac.cpp b/src/SFML/Audio/SoundFileReaderFlac.cpp index 8828af23..f42a132a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileReaderFlac.hpp b/src/SFML/Audio/SoundFileReaderFlac.hpp index 5b53a7dd..6cb0b869 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileReaderOgg.cpp b/src/SFML/Audio/SoundFileReaderOgg.cpp index df46193e..183e3b25 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileReaderOgg.hpp b/src/SFML/Audio/SoundFileReaderOgg.hpp index 5da56f41..0e84e8f6 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileReaderWav.cpp b/src/SFML/Audio/SoundFileReaderWav.cpp index 30f23e5b..dc1dc52b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileReaderWav.hpp b/src/SFML/Audio/SoundFileReaderWav.hpp index 89144a19..65adb8da 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileWriterFlac.cpp b/src/SFML/Audio/SoundFileWriterFlac.cpp index b12088b0..045d0861 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileWriterFlac.hpp b/src/SFML/Audio/SoundFileWriterFlac.hpp index 39f50dbb..b6382e04 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileWriterOgg.cpp b/src/SFML/Audio/SoundFileWriterOgg.cpp index c661b746..56e2ac7c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileWriterOgg.hpp b/src/SFML/Audio/SoundFileWriterOgg.hpp index 868464a4..4b4d19bb 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileWriterWav.cpp b/src/SFML/Audio/SoundFileWriterWav.cpp index 7d7f60ef..153e1481 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundFileWriterWav.hpp b/src/SFML/Audio/SoundFileWriterWav.hpp index 98983786..d8dcc178 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundRecorder.cpp b/src/SFML/Audio/SoundRecorder.cpp index 2a4f96be..4281b981 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundSource.cpp b/src/SFML/Audio/SoundSource.cpp index b2b4059d..785f9cc2 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Audio/SoundStream.cpp b/src/SFML/Audio/SoundStream.cpp index bbc896eb..0e405482 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/BlendMode.cpp b/src/SFML/Graphics/BlendMode.cpp index ab69dcd3..0d9cf95b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/CircleShape.cpp b/src/SFML/Graphics/CircleShape.cpp index 8e555105..0cfa3c70 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Color.cpp b/src/SFML/Graphics/Color.cpp index fdadb41a..03f99a4c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/ConvexShape.cpp b/src/SFML/Graphics/ConvexShape.cpp index 35ff1352..56aa787f 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Font.cpp b/src/SFML/Graphics/Font.cpp index d59746bb..e487e073 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/GLCheck.cpp b/src/SFML/Graphics/GLCheck.cpp index 85d9854a..580e838f 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/GLCheck.hpp b/src/SFML/Graphics/GLCheck.hpp index 2b5fa7d0..86b96de3 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/GLExtensions.cpp b/src/SFML/Graphics/GLExtensions.cpp index 57f5bcc7..fff712d7 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/GLExtensions.hpp b/src/SFML/Graphics/GLExtensions.hpp index cc5da64b..0e0c8f51 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/GLLoader.cpp b/src/SFML/Graphics/GLLoader.cpp index 2b459072..4bb1a9bb 100644 --- a/src/SFML/Graphics/GLLoader.cpp +++ b/src/SFML/Graphics/GLLoader.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/GLLoader.hpp b/src/SFML/Graphics/GLLoader.hpp index 4990d3d8..d7920f90 100644 --- a/src/SFML/Graphics/GLLoader.hpp +++ b/src/SFML/Graphics/GLLoader.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Glsl.cpp b/src/SFML/Graphics/Glsl.cpp index c5d2b78a..e8f9c1e1 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Image.cpp b/src/SFML/Graphics/Image.cpp index 8dae99b0..7670eb6c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/ImageLoader.cpp b/src/SFML/Graphics/ImageLoader.cpp index 2a87385a..023541d3 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/ImageLoader.hpp b/src/SFML/Graphics/ImageLoader.hpp index 20f05b69..0134bd8a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/RectangleShape.cpp b/src/SFML/Graphics/RectangleShape.cpp index abe11874..f7778c04 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/RenderStates.cpp b/src/SFML/Graphics/RenderStates.cpp index bc451031..4c55546a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index be2b2b6c..dae99585 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/RenderTexture.cpp b/src/SFML/Graphics/RenderTexture.cpp index 12e8edf6..b81a4091 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/RenderTextureImpl.cpp b/src/SFML/Graphics/RenderTextureImpl.cpp index 19023b37..d1e927c8 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/RenderTextureImpl.hpp b/src/SFML/Graphics/RenderTextureImpl.hpp index e2fece0e..9ad35b8d 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/RenderTextureImplDefault.cpp b/src/SFML/Graphics/RenderTextureImplDefault.cpp index c52679dc..e24978e9 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/RenderTextureImplDefault.hpp b/src/SFML/Graphics/RenderTextureImplDefault.hpp index 803b18f9..6f5d0f3e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/RenderTextureImplFBO.cpp b/src/SFML/Graphics/RenderTextureImplFBO.cpp index 58dcb464..95f94b3f 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/RenderTextureImplFBO.hpp b/src/SFML/Graphics/RenderTextureImplFBO.hpp index c987281f..a72559f3 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/RenderWindow.cpp b/src/SFML/Graphics/RenderWindow.cpp index 672c8b55..f174a3db 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Shader.cpp b/src/SFML/Graphics/Shader.cpp index b423ca68..353a72df 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Shape.cpp b/src/SFML/Graphics/Shape.cpp index 24affe78..545b6fa8 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Sprite.cpp b/src/SFML/Graphics/Sprite.cpp index 71d5c70a..feb79a4b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 09aafe6e..643197dd 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Texture.cpp b/src/SFML/Graphics/Texture.cpp index 11bcafe9..faeef7d7 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/TextureSaver.cpp b/src/SFML/Graphics/TextureSaver.cpp index 1a119b57..2b7d8af8 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/TextureSaver.hpp b/src/SFML/Graphics/TextureSaver.hpp index 467f6119..170fe463 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Transform.cpp b/src/SFML/Graphics/Transform.cpp index 260a3562..22d3e707 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Transformable.cpp b/src/SFML/Graphics/Transformable.cpp index 851ab3e7..81016702 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/Vertex.cpp b/src/SFML/Graphics/Vertex.cpp index 3d344c1e..2655f736 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/VertexArray.cpp b/src/SFML/Graphics/VertexArray.cpp index 0f9c8136..58c98f70 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/VertexBuffer.cpp b/src/SFML/Graphics/VertexBuffer.cpp index c1cc11e9..8e079806 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Graphics/View.cpp b/src/SFML/Graphics/View.cpp index 09a45bd6..0fcf6548 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Main/MainAndroid.cpp b/src/SFML/Main/MainAndroid.cpp index 595a3a26..25696fe9 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Main/MainWin32.cpp b/src/SFML/Main/MainWin32.cpp index 4658d9f3..c9144964 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2018 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. diff --git a/src/SFML/Main/MainiOS.mm b/src/SFML/Main/MainiOS.mm index c6bddccd..fa88e694 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-2017 Laurent Gomila (laurent@sfml-dev.prg) +// Copyright (C) 2007-2018 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/Network/Ftp.cpp b/src/SFML/Network/Ftp.cpp index af3be1a4..3d410439 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/Http.cpp b/src/SFML/Network/Http.cpp index ef6987fb..7fdc81a7 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/IpAddress.cpp b/src/SFML/Network/IpAddress.cpp index 91eec78e..95561389 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/Packet.cpp b/src/SFML/Network/Packet.cpp index fc33355c..0dc2bbcf 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/Socket.cpp b/src/SFML/Network/Socket.cpp index ad6d9930..d1004219 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/SocketImpl.hpp b/src/SFML/Network/SocketImpl.hpp index 6f0c7e11..d1ffebed 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/SocketSelector.cpp b/src/SFML/Network/SocketSelector.cpp index d7c9c564..fa00c63d 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/TcpListener.cpp b/src/SFML/Network/TcpListener.cpp index 713301e1..0e3561f9 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/TcpSocket.cpp b/src/SFML/Network/TcpSocket.cpp index be218cf3..bb3e65c5 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/UdpSocket.cpp b/src/SFML/Network/UdpSocket.cpp index 81e2e49c..99b52fdf 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/Unix/SocketImpl.cpp b/src/SFML/Network/Unix/SocketImpl.cpp index 0c1457f8..4029480e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/Unix/SocketImpl.hpp b/src/SFML/Network/Unix/SocketImpl.hpp index df99d3bd..b70c0773 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/Win32/SocketImpl.cpp b/src/SFML/Network/Win32/SocketImpl.cpp index 0e9f6ae2..bd536654 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Network/Win32/SocketImpl.hpp b/src/SFML/Network/Win32/SocketImpl.hpp index 254fad2a..978336fa 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Android/Activity.cpp b/src/SFML/System/Android/Activity.cpp index 4f657ee0..214b4a12 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2018 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. diff --git a/src/SFML/System/Android/NativeActivity.cpp b/src/SFML/System/Android/NativeActivity.cpp index ff97501e..ac489ae4 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Clock.cpp b/src/SFML/System/Clock.cpp index e4f347e3..9f09533e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Err.cpp b/src/SFML/System/Err.cpp index 5d2084ec..d186931c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/FileInputStream.cpp b/src/SFML/System/FileInputStream.cpp index 1684e812..852470de 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Lock.cpp b/src/SFML/System/Lock.cpp index 4a371271..ada1ca1a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/MemoryInputStream.cpp b/src/SFML/System/MemoryInputStream.cpp index e3129279..3bd02b4b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Mutex.cpp b/src/SFML/System/Mutex.cpp index 36d48ee6..139bf569 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Sleep.cpp b/src/SFML/System/Sleep.cpp index 4f2a50e4..35db5e80 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/String.cpp b/src/SFML/System/String.cpp index 94b8b822..d8831f9d 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Thread.cpp b/src/SFML/System/Thread.cpp index 3a2c0f90..098018a3 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/ThreadLocal.cpp b/src/SFML/System/ThreadLocal.cpp index 01e3a352..62d81175 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Time.cpp b/src/SFML/System/Time.cpp index 63de359a..681c9a9d 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Unix/ClockImpl.cpp b/src/SFML/System/Unix/ClockImpl.cpp index 2cd89cfc..0d4f2bd9 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Unix/ClockImpl.hpp b/src/SFML/System/Unix/ClockImpl.hpp index 26c6433a..56f550c6 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Unix/MutexImpl.cpp b/src/SFML/System/Unix/MutexImpl.cpp index 2ab46c0e..cc4e38e1 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Unix/MutexImpl.hpp b/src/SFML/System/Unix/MutexImpl.hpp index ea4c838f..cf0c0dd0 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Unix/SleepImpl.cpp b/src/SFML/System/Unix/SleepImpl.cpp index 22b6f358..f6fb6087 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Unix/SleepImpl.hpp b/src/SFML/System/Unix/SleepImpl.hpp index a4039b6b..8d146d41 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Unix/ThreadImpl.cpp b/src/SFML/System/Unix/ThreadImpl.cpp index b6dd383c..513bd55e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Unix/ThreadImpl.hpp b/src/SFML/System/Unix/ThreadImpl.hpp index 0191d5e2..2cd13d0f 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Unix/ThreadLocalImpl.cpp b/src/SFML/System/Unix/ThreadLocalImpl.cpp index a0a157e2..1fea0c9e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Unix/ThreadLocalImpl.hpp b/src/SFML/System/Unix/ThreadLocalImpl.hpp index b72ce65f..919dcd5b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Win32/ClockImpl.cpp b/src/SFML/System/Win32/ClockImpl.cpp index 79acc0c9..f69da4ba 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Win32/ClockImpl.hpp b/src/SFML/System/Win32/ClockImpl.hpp index 45e08e87..d40ec6fc 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Win32/MutexImpl.cpp b/src/SFML/System/Win32/MutexImpl.cpp index 7b47cd51..8fdd388b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Win32/MutexImpl.hpp b/src/SFML/System/Win32/MutexImpl.hpp index c7174e8b..95721141 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Win32/SleepImpl.cpp b/src/SFML/System/Win32/SleepImpl.cpp index 8a8eee1c..41c10188 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Win32/SleepImpl.hpp b/src/SFML/System/Win32/SleepImpl.hpp index 2cde5b3d..ad0138d9 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Win32/ThreadImpl.cpp b/src/SFML/System/Win32/ThreadImpl.cpp index d34950ab..f5d2e2ee 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Win32/ThreadImpl.hpp b/src/SFML/System/Win32/ThreadImpl.hpp index cfd10399..913585fc 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Win32/ThreadLocalImpl.cpp b/src/SFML/System/Win32/ThreadLocalImpl.cpp index 221fffe9..bd28da30 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/System/Win32/ThreadLocalImpl.hpp b/src/SFML/System/Win32/ThreadLocalImpl.hpp index 458b28a5..e617dfed 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Android/ClipboardImpl.cpp b/src/SFML/Window/Android/ClipboardImpl.cpp index d48ef2d9..a5d3a19c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Android/ClipboardImpl.hpp b/src/SFML/Window/Android/ClipboardImpl.hpp index f661bed5..8d33dc6e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Android/CursorImpl.cpp b/src/SFML/Window/Android/CursorImpl.cpp index 34f9b45b..da5fff5e 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-2016 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Android/CursorImpl.hpp b/src/SFML/Window/Android/CursorImpl.hpp index 805ab96f..fe5f9486 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-2016 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Android/SensorImpl.cpp b/src/SFML/Window/Android/SensorImpl.cpp index 201c3ebf..3a018b50 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Android/SensorImpl.hpp b/src/SFML/Window/Android/SensorImpl.hpp index 5cae66b4..4ce19a45 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Clipboard.cpp b/src/SFML/Window/Clipboard.cpp index ee7b8456..9148c97a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/ClipboardImpl.hpp b/src/SFML/Window/ClipboardImpl.hpp index 4d9c9196..95a8721e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Context.cpp b/src/SFML/Window/Context.cpp index 321dc2cc..46275e3e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Cursor.cpp b/src/SFML/Window/Cursor.cpp index c0585e14..c71491f2 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-2016 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/CursorImpl.hpp b/src/SFML/Window/CursorImpl.hpp index 210c61de..4418c871 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-2016 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/FreeBSD/JoystickImpl.cpp b/src/SFML/Window/FreeBSD/JoystickImpl.cpp index 7636e472..6bc646df 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2018 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. diff --git a/src/SFML/Window/FreeBSD/JoystickImpl.hpp b/src/SFML/Window/FreeBSD/JoystickImpl.hpp index 7f57f2f8..5b2c0295 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/GlContext.cpp b/src/SFML/Window/GlContext.cpp index 396d366b..b6f32903 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/GlContext.hpp b/src/SFML/Window/GlContext.hpp index 22efa626..cf28c61c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/GlResource.cpp b/src/SFML/Window/GlResource.cpp index 6924aa3a..7af4a140 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/InputImpl.hpp b/src/SFML/Window/InputImpl.hpp index 279b3c6c..d9316d1a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Joystick.cpp b/src/SFML/Window/Joystick.cpp index 9d5c69fe..62793f10 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/JoystickImpl.hpp b/src/SFML/Window/JoystickImpl.hpp index 18063967..e5d4131f 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/JoystickManager.cpp b/src/SFML/Window/JoystickManager.cpp index b89a7473..1574faa1 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/JoystickManager.hpp b/src/SFML/Window/JoystickManager.hpp index 2ccfa612..08692cdb 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Keyboard.cpp b/src/SFML/Window/Keyboard.cpp index 264d33f6..14cda196 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Mouse.cpp b/src/SFML/Window/Mouse.cpp index bbc5b79c..862dc69a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/OSX/AutoreleasePoolWrapper.h b/src/SFML/Window/OSX/AutoreleasePoolWrapper.h index 6fedaaf4..020fa22a 100644 --- a/src/SFML/Window/OSX/AutoreleasePoolWrapper.h +++ b/src/SFML/Window/OSX/AutoreleasePoolWrapper.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/AutoreleasePoolWrapper.mm b/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm index 9f832c7d..6b341b25 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/ClipboardImpl.hpp b/src/SFML/Window/OSX/ClipboardImpl.hpp index 65f55784..d3aabefa 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/OSX/ClipboardImpl.mm b/src/SFML/Window/OSX/ClipboardImpl.mm index c8d17dcc..a14d871d 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/OSX/CursorImpl.hpp b/src/SFML/Window/OSX/CursorImpl.hpp index 01b24ed3..43af7920 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-2016 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 bf2599c6..5f413763 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-2016 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/HIDInputManager.hpp b/src/SFML/Window/OSX/HIDInputManager.hpp index 819039a7..388d008a 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/HIDInputManager.mm b/src/SFML/Window/OSX/HIDInputManager.mm index d11c9092..42a14c6b 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/HIDJoystickManager.cpp b/src/SFML/Window/OSX/HIDJoystickManager.cpp index 64416809..72c165a3 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/HIDJoystickManager.hpp b/src/SFML/Window/OSX/HIDJoystickManager.hpp index 6052d38d..eb249cc3 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 8055d42d..6f874bcd 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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.mm b/src/SFML/Window/OSX/InputImpl.mm index cf41b032..361e1be8 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/JoystickImpl.cpp b/src/SFML/Window/OSX/JoystickImpl.cpp index 2f5e055b..9552b192 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/JoystickImpl.hpp b/src/SFML/Window/OSX/JoystickImpl.hpp index b0fce5e8..f4ad6807 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 6672ea87..99e04841 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 ea33a16b..56ee6c92 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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.h b/src/SFML/Window/OSX/SFApplication.h index 8b280166..5f2071f3 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 90928cbd..a9225432 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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.h b/src/SFML/Window/OSX/SFApplicationDelegate.h index 9b87b2b4..542c0a1f 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 75834113..d7e6050c 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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.hpp b/src/SFML/Window/OSX/SFContext.hpp index 8f020b33..5fa3b210 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 8c7e5a11..65375690 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/SFKeyboardModifiersHelper.h b/src/SFML/Window/OSX/SFKeyboardModifiersHelper.h index daaa72d9..ee2ef66f 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/SFKeyboardModifiersHelper.mm b/src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm index eec7e203..763f2ca5 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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+keyboard.mm b/src/SFML/Window/OSX/SFOpenGLView+keyboard.mm index aab4d9b8..907de16e 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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+keyboard_priv.h b/src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h index 0ed9aaf8..6003c00f 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 f56e1564..4b23042a 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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_priv.h b/src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h index a896e45d..6f509ad4 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 4e1fe95a..7444ff73 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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.mm b/src/SFML/Window/OSX/SFOpenGLView.mm index 3119e127..e8fca847 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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.h b/src/SFML/Window/OSX/SFSilentResponder.h index 6c6da5d4..a9f9b7c7 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 00569bfd..feb5783e 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 721d0134..69dc7a39 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 1b48fe07..54f63102 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/SFWindow.h b/src/SFML/Window/OSX/SFWindow.h index c24f3736..1d13750a 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/SFWindow.m b/src/SFML/Window/OSX/SFWindow.m index 0c32a427..087f990d 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/SFWindowController.h b/src/SFML/Window/OSX/SFWindowController.h index 7c7635f8..df0585b8 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/SFWindowController.mm b/src/SFML/Window/OSX/SFWindowController.mm index 3d952082..96f2e181 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/Scaling.h b/src/SFML/Window/OSX/Scaling.h index 733812d9..62f13aec 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/SensorImpl.cpp b/src/SFML/Window/OSX/SensorImpl.cpp index 4c00668e..3496265a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/OSX/SensorImpl.hpp b/src/SFML/Window/OSX/SensorImpl.hpp index 09bfd234..fe81b8d4 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/OSX/VideoModeImpl.cpp b/src/SFML/Window/OSX/VideoModeImpl.cpp index ae5fdfb9..efd5e46f 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/WindowImplCocoa.hpp b/src/SFML/Window/OSX/WindowImplCocoa.hpp index e47e7a73..eea318de 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/WindowImplCocoa.mm b/src/SFML/Window/OSX/WindowImplCocoa.mm index b0482501..edb69358 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/WindowImplDelegateProtocol.h b/src/SFML/Window/OSX/WindowImplDelegateProtocol.h index baac0989..d6cfa901 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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.hpp b/src/SFML/Window/OSX/cg_sf_conversion.hpp index 3d18d6fd..c928dd9c 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 df0cfc4e..5d9a53f8 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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.h b/src/SFML/Window/OSX/cpp_objc_conversion.h index dce1779c..db0d572e 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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 af7894d8..0ac4b50e 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-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/Sensor.cpp b/src/SFML/Window/Sensor.cpp index 5331bbbc..ae374129 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/SensorImpl.hpp b/src/SFML/Window/SensorImpl.hpp index aabf2774..41a6ca0f 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/SensorManager.cpp b/src/SFML/Window/SensorManager.cpp index 409eace6..82665e39 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/SensorManager.hpp b/src/SFML/Window/SensorManager.hpp index 08bcea4d..2285ad3b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Touch.cpp b/src/SFML/Window/Touch.cpp index ecc66000..aa63c728 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/ClipboardImpl.cpp b/src/SFML/Window/Unix/ClipboardImpl.cpp index 3069e07a..32ef21bc 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/ClipboardImpl.hpp b/src/SFML/Window/Unix/ClipboardImpl.hpp index 2dd27a3c..f4aca983 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/CursorImpl.cpp b/src/SFML/Window/Unix/CursorImpl.cpp index 66aca2ec..011a2b1f 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-2016 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/CursorImpl.hpp b/src/SFML/Window/Unix/CursorImpl.hpp index a2380094..9bd4052b 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-2016 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/Display.cpp b/src/SFML/Window/Unix/Display.cpp index 60f4c55a..351a1284 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/Display.hpp b/src/SFML/Window/Unix/Display.hpp index 0679369d..d2bb7364 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/GlxContext.cpp b/src/SFML/Window/Unix/GlxContext.cpp index fcba1478..d9f52fef 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/GlxContext.hpp b/src/SFML/Window/Unix/GlxContext.hpp index 3991abad..e974c448 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/GlxExtensions.cpp b/src/SFML/Window/Unix/GlxExtensions.cpp index 4d9d9781..cfc35b2c 100644 --- a/src/SFML/Window/Unix/GlxExtensions.cpp +++ b/src/SFML/Window/Unix/GlxExtensions.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/GlxExtensions.hpp b/src/SFML/Window/Unix/GlxExtensions.hpp index 929e38a7..abbb132a 100644 --- a/src/SFML/Window/Unix/GlxExtensions.hpp +++ b/src/SFML/Window/Unix/GlxExtensions.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/InputImpl.cpp b/src/SFML/Window/Unix/InputImpl.cpp index 23c114b2..bc96f38a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/InputImpl.hpp b/src/SFML/Window/Unix/InputImpl.hpp index 32ff1133..88dcc91c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/JoystickImpl.cpp b/src/SFML/Window/Unix/JoystickImpl.cpp index 2898c6ca..56c72343 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/JoystickImpl.hpp b/src/SFML/Window/Unix/JoystickImpl.hpp index c62b0df0..f81e7441 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/SensorImpl.cpp b/src/SFML/Window/Unix/SensorImpl.cpp index 4c00668e..3496265a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/SensorImpl.hpp b/src/SFML/Window/Unix/SensorImpl.hpp index a4eedde2..2667de34 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/VideoModeImpl.cpp b/src/SFML/Window/Unix/VideoModeImpl.cpp index f58d8597..288ef3e0 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index c83520fa..3606cc8f 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Unix/WindowImplX11.hpp b/src/SFML/Window/Unix/WindowImplX11.hpp index 41747145..0ff694b1 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/VideoMode.cpp b/src/SFML/Window/VideoMode.cpp index 01103892..12c3801d 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/VideoModeImpl.hpp b/src/SFML/Window/VideoModeImpl.hpp index 525e9983..73714722 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/ClipboardImpl.cpp b/src/SFML/Window/Win32/ClipboardImpl.cpp index 4f518ab9..13fd06f1 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/ClipboardImpl.hpp b/src/SFML/Window/Win32/ClipboardImpl.hpp index 0eee3418..c42ec5e0 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/CursorImpl.cpp b/src/SFML/Window/Win32/CursorImpl.cpp index 29273b0b..28f42744 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-2016 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/CursorImpl.hpp b/src/SFML/Window/Win32/CursorImpl.hpp index b65aef23..602f2231 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-2016 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/InputImpl.cpp b/src/SFML/Window/Win32/InputImpl.cpp index d5d3e566..440b7b41 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/InputImpl.hpp b/src/SFML/Window/Win32/InputImpl.hpp index 708472cb..17ac4822 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/JoystickImpl.cpp b/src/SFML/Window/Win32/JoystickImpl.cpp index 4d9e2571..a25fd6fe 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/JoystickImpl.hpp b/src/SFML/Window/Win32/JoystickImpl.hpp index 60999da9..8affc27e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/SensorImpl.cpp b/src/SFML/Window/Win32/SensorImpl.cpp index 4c00668e..3496265a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/SensorImpl.hpp b/src/SFML/Window/Win32/SensorImpl.hpp index 747220a6..e8b618eb 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/VideoModeImpl.cpp b/src/SFML/Window/Win32/VideoModeImpl.cpp index f5939b3c..71ad671c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/WglContext.cpp b/src/SFML/Window/Win32/WglContext.cpp index 3e07c48a..cd5e9ab8 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/WglContext.hpp b/src/SFML/Window/Win32/WglContext.hpp index d45de78b..d692605e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/WglExtensions.cpp b/src/SFML/Window/Win32/WglExtensions.cpp index 3c037ab7..b96271bb 100644 --- a/src/SFML/Window/Win32/WglExtensions.cpp +++ b/src/SFML/Window/Win32/WglExtensions.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/WglExtensions.hpp b/src/SFML/Window/Win32/WglExtensions.hpp index a5400cf7..3cefd99c 100644 --- a/src/SFML/Window/Win32/WglExtensions.hpp +++ b/src/SFML/Window/Win32/WglExtensions.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index 378e5125..a084e093 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Win32/WindowImplWin32.hpp b/src/SFML/Window/Win32/WindowImplWin32.hpp index 8565e88f..4114c51b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/Window.cpp b/src/SFML/Window/Window.cpp index 1aed15c4..b1ed548a 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/WindowImpl.cpp b/src/SFML/Window/WindowImpl.cpp index f258aca5..27d4ab40 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/WindowImpl.hpp b/src/SFML/Window/WindowImpl.hpp index 6a6f75e7..355ee69d 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/ClipboardImpl.hpp b/src/SFML/Window/iOS/ClipboardImpl.hpp index 1eb45145..f89d5a99 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/ClipboardImpl.mm b/src/SFML/Window/iOS/ClipboardImpl.mm index 473e17af..641e16c9 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/CursorImpl.cpp b/src/SFML/Window/iOS/CursorImpl.cpp index ea725aaf..a886f32f 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-2016 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/CursorImpl.hpp b/src/SFML/Window/iOS/CursorImpl.hpp index 6f715b7a..9d1dbfc8 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-2016 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/EaglContext.hpp b/src/SFML/Window/iOS/EaglContext.hpp index a6853ee1..7121f2e5 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/EaglContext.mm b/src/SFML/Window/iOS/EaglContext.mm index 72cec776..f04e1537 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/InputImpl.hpp b/src/SFML/Window/iOS/InputImpl.hpp index f41e072b..0d62071c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/InputImpl.mm b/src/SFML/Window/iOS/InputImpl.mm index 6ac604f0..bada27d1 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/JoystickImpl.hpp b/src/SFML/Window/iOS/JoystickImpl.hpp index 9e4f52f3..e9fc8bd9 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/JoystickImpl.mm b/src/SFML/Window/iOS/JoystickImpl.mm index 4f4de868..47fa8d3c 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/ObjCType.hpp b/src/SFML/Window/iOS/ObjCType.hpp index cf93a19f..5d06c51b 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/SFAppDelegate.hpp b/src/SFML/Window/iOS/SFAppDelegate.hpp index 984e1e13..e3896557 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/SFAppDelegate.mm b/src/SFML/Window/iOS/SFAppDelegate.mm index 5e202d38..6b173849 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/SFMain.hpp b/src/SFML/Window/iOS/SFMain.hpp index dffd107b..4d0b5b40 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/SFMain.mm b/src/SFML/Window/iOS/SFMain.mm index 7a48cdb1..4e9910a3 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/SFView.hpp b/src/SFML/Window/iOS/SFView.hpp index d858a2bd..f3f4276e 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/SFView.mm b/src/SFML/Window/iOS/SFView.mm index b4ae496d..063c61a3 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/SFViewController.hpp b/src/SFML/Window/iOS/SFViewController.hpp index 65b6eda0..b8a77aad 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/SFViewController.mm b/src/SFML/Window/iOS/SFViewController.mm index 582b3ff1..d8be0478 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/SensorImpl.hpp b/src/SFML/Window/iOS/SensorImpl.hpp index 88d995e3..05c6b934 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/SensorImpl.mm b/src/SFML/Window/iOS/SensorImpl.mm index 02f8e1ff..249c41aa 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/VideoModeImpl.mm b/src/SFML/Window/iOS/VideoModeImpl.mm index 6798afe8..7296d9d9 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/WindowImplUIKit.hpp b/src/SFML/Window/iOS/WindowImplUIKit.hpp index a3975fd8..60e0407d 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/src/SFML/Window/iOS/WindowImplUIKit.mm b/src/SFML/Window/iOS/WindowImplUIKit.mm index 72df19e7..35337dbc 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-2017 Laurent Gomila (laurent@sfml-dev.org) +// 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. diff --git a/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp index 4006fb16..cc7790ff 100644 --- a/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp +++ b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm index 079e1e45..117ee82d 100644 --- a/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm +++ b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2018 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/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in index d4533878..624afefe 100644 --- a/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in +++ b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), Laurent Gomila (laurent@sfml-dev.org) This software is provided 'as-is', without any express or implied warranty. @@ -275,4 +275,3 @@ fi </array> </dict> </plist> - diff --git a/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist index 58a5c466..910c19cf 100644 --- a/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2018 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/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist index bc904a48..2b28c72a 100644 --- a/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2018 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/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist index 2505d3d7..b2c73d0c 100644 --- a/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), Laurent Gomila (laurent@sfml-dev.org) This software is provided 'as-is', without any express or implied warranty. @@ -134,4 +134,3 @@ subject to the following restrictions: </array> </dict> </plist> - diff --git a/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in b/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in index 11551bdf..30b6a10c 100644 --- a/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in +++ b/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2018 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/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist index aa2da0bd..dc9b7f6e 100644 --- a/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2017 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), Laurent Gomila (laurent@sfml-dev.org) This software is provided 'as-is', without any express or implied warranty. @@ -360,4 +360,3 @@ subject to the following restrictions: </dict> </dict> </plist> - From 989367e34552c39c999a36d12608bd11eaacc3d7 Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <maximilian.wagenbach@native-instruments.de> Date: Thu, 8 Feb 2018 13:46:09 +0100 Subject: [PATCH 034/211] Turned the header image in readme.md into a link. Updated all links to use https (tested). --- CMakeLists.txt | 2 +- CONTRIBUTING.md | 2 +- changelog.md | 20 +++---- cmake/toolchains/android.toolchain.cmake | 2 +- doc/doxyfile.in | 55 +++++++++---------- doc/footer.html | 2 +- doc/header.html.in | 2 +- doc/mainpage.hpp | 2 +- examples/cocoa/NSString+stdstring.mm | 2 +- examples/cocoa/resources/Credits.rtf | 2 +- include/SFML/System/Utf.inl | 8 +-- readme.md | 14 ++--- src/SFML/System/Unix/ThreadImpl.cpp | 2 +- src/SFML/Window/Android/WindowImplAndroid.cpp | 2 +- src/SFML/Window/OSX/HIDInputManager.mm | 2 +- src/SFML/Window/OSX/SFViewController.mm | 2 +- src/SFML/Window/OSX/SFWindow.h | 2 +- src/SFML/Window/OSX/SFWindowController.mm | 4 +- src/SFML/Window/Win32/WglExtensions.txt | 2 +- 19 files changed, 63 insertions(+), 66 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a686a5ab..348802e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -505,7 +505,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) + # fix CMake install rules broken for iOS (see https://public.kitware.com/Bug/view.php?id=12506) if(SFML_OS_IOS) install(DIRECTORY "${CMAKE_BINARY_DIR}/lib/\$ENV{CONFIGURATION}/" DESTINATION lib${LIB_SUFFIX}) endif() diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6f71bbb4..ce2b66c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,6 +2,6 @@ You would like to see a feature implemented or a bug fixed in SFML? Great! Contributions to SFML are highly appreciated, be it in the form of general ideas, concrete suggestions or code patches. -[A few guiding rules have been set up on the SFML website](http://www.sfml-dev.org/contribute.php) that you should be aware of before opening an Issue or Pull Request. They will help you focus on the important stuff and prevent you from losing (y)our time with requests that are out of SFML's scope, known issues, and so on. +[A few guiding rules have been set up on the SFML website](https://www.sfml-dev.org/contribute.php) that you should be aware of before opening an Issue or Pull Request. They will help you focus on the important stuff and prevent you from losing (y)our time with requests that are out of SFML's scope, known issues, and so on. Those rules cover the general scope defined for this project, a coding style, and a precise procedure to report bugs or suggest new features. diff --git a/changelog.md b/changelog.md index d8103292..23191694 100644 --- a/changelog.md +++ b/changelog.md @@ -2,7 +2,7 @@ ## SFML 2.4.2 -Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.4.2 +Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.2 ### System @@ -27,7 +27,7 @@ Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.4.2 ## SFML 2.4.1 -Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.4.1 +Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.1 ### General @@ -65,7 +65,7 @@ Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.4.1 ## SFML 2.4.0 -Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.4.0 +Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.0 ### General @@ -169,7 +169,7 @@ Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.4.0 ## SFML 2.3.2 -Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.3.2 +Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.3.2 ### General @@ -197,7 +197,7 @@ Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.3.2 ## SFML 2.3.1 -Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.3.1 +Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.3.1 ### Window @@ -225,7 +225,7 @@ Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.3.1 ## SFML 2.3 -Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.3 +Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.3 ### General @@ -303,7 +303,7 @@ Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.3 ## SFML 2.2 -Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.2 +Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.2 ### General @@ -451,7 +451,7 @@ Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.2 ## SFML 2.1 -Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.1 +Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.1 ### General @@ -527,10 +527,10 @@ Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.1 ## SFML 2.0 -Also available on the website: http://www.sfml-dev.org/changelog.php#sfml-2.0 +Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.0 No changelog available. *Everything changed.* ## Older Releases -See the website for changelogs of older releases: http://www.sfml-dev.org/changelog.php +See the website for changelogs of older releases: https://www.sfml-dev.org/changelog.php diff --git a/cmake/toolchains/android.toolchain.cmake b/cmake/toolchains/android.toolchain.cmake index d0fdf005..ad5a8327 100644 --- a/cmake/toolchains/android.toolchain.cmake +++ b/cmake/toolchains/android.toolchain.cmake @@ -1715,4 +1715,4 @@ endif() # ANDROID_DEFAULT_NDK_API_LEVEL_${ARCH} # ANDROID_NDK_SEARCH_PATHS # ANDROID_SUPPORTED_ABIS_${ARCH} -# ANDROID_SUPPORTED_NDK_VERSIONS \ No newline at end of file +# ANDROID_SUPPORTED_NDK_VERSIONS diff --git a/doc/doxyfile.in b/doc/doxyfile.in index 34cff3ab..a0e03b7e 100644 --- a/doc/doxyfile.in +++ b/doc/doxyfile.in @@ -20,7 +20,7 @@ # 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 http://www.gnu.org/software/libiconv +# 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. @@ -295,7 +295,7 @@ 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. @@ -328,7 +328,7 @@ BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. @@ -687,7 +687,7 @@ LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. @@ -769,7 +769,7 @@ 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: http://www.gnu.org/software/libiconv) for the list of +# documentation (see: https://www.gnu.org/software/libiconv) for the list of # possible encodings. # The default value is: UTF-8. @@ -967,7 +967,7 @@ SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version +# (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: @@ -995,7 +995,7 @@ 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 +# clang parser (see: https://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. @@ -1137,7 +1137,7 @@ HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the stylesheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 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. # Minimum value: 0, maximum value: 359, default value: 220. @@ -1195,12 +1195,12 @@ 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: http://developer.apple.com/tools/xcode/), introduced with +# 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 # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# startup. See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1240,7 +1240,7 @@ 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 +# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output @@ -1316,7 +1316,7 @@ 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://qt-project.org/doc/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. @@ -1324,8 +1324,7 @@ 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://qt-project.org/doc/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. @@ -1333,23 +1332,21 @@ 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://qt-project.org/doc/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://qt-project.org/doc/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://qt-project.org/doc/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 = @@ -1454,7 +1451,7 @@ FORMULA_FONTSIZE = 10 FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://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 prerendered 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 @@ -1466,7 +1463,7 @@ USE_MATHJAX = NO # 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. +# https://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. @@ -1481,11 +1478,11 @@ 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 http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. +# MathJax from https://www.mathjax.org before deployment. +# The default value is: https://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest +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 @@ -1496,7 +1493,7 @@ 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: https://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1543,7 +1540,7 @@ 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: http://xapian.org/). +# Xapian (see: https://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. @@ -1556,7 +1553,7 @@ 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: http://xapian.org/). See the section "External Indexing and +# 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. @@ -1729,7 +1726,7 @@ 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 -# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. +# https://en.wikipedia.org/wiki/BibTeX and \cite for more info. # The default value is: plain. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -2111,7 +2108,7 @@ HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: -# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO # The default value is: NO. diff --git a/doc/footer.html b/doc/footer.html index 0e7569af..c9cd9375 100644 --- a/doc/footer.html +++ b/doc/footer.html @@ -1,7 +1,7 @@ </div> <div id="footer-container"> <div id="footer"> - SFML is licensed under the terms and conditions of the <a href="http://www.sfml-dev.org/license.php">zlib/png license</a>.<br> + SFML is licensed under the terms and conditions of the <a href="https://www.sfml-dev.org/license.php">zlib/png license</a>.<br> Copyright © Laurent Gomila :: Documentation generated by <a href="http://www.doxygen.org/" title="doxygen website">doxygen</a> :: </div> diff --git a/doc/header.html.in b/doc/header.html.in index 34337fd6..cc42ea28 100644 --- a/doc/header.html.in +++ b/doc/header.html.in @@ -4,7 +4,7 @@ <title>SFML - Simple and Fast Multimedia Library</title> <meta http-equiv="Content-Type" content="text/html;"/> <meta charset="utf-8"/> - <!--<link rel='stylesheet' type='text/css' href="http://fonts.googleapis.com/css?family=Ubuntu:400,700,400italic"/>--> + <!--<link rel='stylesheet' type='text/css' href="https://fonts.googleapis.com/css?family=Ubuntu:400,700,400italic"/>--> <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> diff --git a/doc/mainpage.hpp b/doc/mainpage.hpp index 7ef4b6f1..16f2c43a 100644 --- a/doc/mainpage.hpp +++ b/doc/mainpage.hpp @@ -5,7 +5,7 @@ /// 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/> /// If you are looking for tutorials, you can visit the official website -/// at <a href="http://www.sfml-dev.org/">www.sfml-dev.org</a>. +/// at <a href="https://www.sfml-dev.org/">www.sfml-dev.org</a>. /// /// \section example Short example /// Here is a short example, to show you how simple it is to use SFML: diff --git a/examples/cocoa/NSString+stdstring.mm b/examples/cocoa/NSString+stdstring.mm index a7b99d54..92b79845 100644 --- a/examples/cocoa/NSString+stdstring.mm +++ b/examples/cocoa/NSString+stdstring.mm @@ -65,7 +65,7 @@ -(std::wstring)tostdwstring { // According to Wikipedia, Mac OS X is Little Endian on x86 and x86-64 - // http://en.wikipedia.org/wiki/Endianness + // https://en.wikipedia.org/wiki/Endianness NSData* asData = [self dataUsingEncoding:NSUTF32LittleEndianStringEncoding]; return std::wstring((wchar_t*)[asData bytes], [asData length] / sizeof(wchar_t)); } diff --git a/examples/cocoa/resources/Credits.rtf b/examples/cocoa/resources/Credits.rtf index 53942fc6..ed40d674 100644 --- a/examples/cocoa/resources/Credits.rtf +++ b/examples/cocoa/resources/Credits.rtf @@ -4,4 +4,4 @@ \paperw11900\paperh16840\vieww9600\viewh8400\viewkind0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qj -\f0\fs24 \cf0 See {\field{\*\fldinst{HYPERLINK "http://sfml-dev.org"}}{\fldrslt http://sfml-dev.org}} for more information} \ No newline at end of file +\f0\fs24 \cf0 See {\field{\*\fldinst{HYPERLINK "https://sfml-dev.org"}}{\fldrslt https://sfml-dev.org}} for more information} diff --git a/include/SFML/System/Utf.inl b/include/SFML/System/Utf.inl index 2da83490..67fad8ba 100644 --- a/include/SFML/System/Utf.inl +++ b/include/SFML/System/Utf.inl @@ -26,10 +26,10 @@ //////////////////////////////////////////////////////////// // References: // -// http://www.unicode.org/ -// http://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.c -// http://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.h -// http://people.w3.org/rishida/scripts/uniview/conversion +// https://www.unicode.org/ +// https://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.c +// https://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.h +// https://people.w3.org/rishida/scripts/uniview/conversion // //////////////////////////////////////////////////////////// diff --git a/readme.md b/readme.md index baf30335..b6f9de01 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ - +[](https://www.sfml-dev.org) # SFML — Simple and Fast Multimedia Library @@ -19,21 +19,21 @@ SFML is a simple, fast, cross-platform and object-oriented multimedia API. It pr ## Download -You can get the latest official release on [SFML's website](http://www.sfml-dev.org/download.php). You can also get the current development version from the [Git repository](https://github.com/SFML/SFML). +You can get the latest official release on [SFML's website](https://www.sfml-dev.org/download.php). You can also get the current development version from the [Git repository](https://github.com/SFML/SFML). ## Install -Follow the instructions of the [tutorials](http://www.sfml-dev.org/tutorials/), there is one for each platform/compiler that SFML supports. +Follow the instructions of the [tutorials](https://www.sfml-dev.org/tutorials/), there is one for each platform/compiler that SFML supports. ## Learn There are several places to learn SFML: - * The [official tutorials](http://www.sfml-dev.org/tutorials/) - * The [online API documentation](http://www.sfml-dev.org/documentation/) + * The [official tutorials](https://www.sfml-dev.org/tutorials/) + * The [online API documentation](https://www.sfml-dev.org/documentation/) * The [community wiki](https://github.com/SFML/SFML/wiki/) - * The [community forum](http://en.sfml-dev.org/forums/) ([French](http://fr.sfml-dev.org/forums/)) + * The [community forum](https://en.sfml-dev.org/forums/) ([French](https://fr.sfml-dev.org/forums/)) ## Contribute -SFML is an open-source project, and it needs your help to go on growing and improving. If you want to get involved and suggest some additional features, file a bug report or submit a patch, please have a look at the [contribution guidelines](http://www.sfml-dev.org/contribute.php). +SFML is an open-source project, and it needs your help to go on growing and improving. If you want to get involved and suggest some additional features, file a bug report or submit a patch, please have a look at the [contribution guidelines](https://www.sfml-dev.org/contribute.php). diff --git a/src/SFML/System/Unix/ThreadImpl.cpp b/src/SFML/System/Unix/ThreadImpl.cpp index 513bd55e..e80213f9 100644 --- a/src/SFML/System/Unix/ThreadImpl.cpp +++ b/src/SFML/System/Unix/ThreadImpl.cpp @@ -65,7 +65,7 @@ void ThreadImpl::terminate() #ifndef SFML_SYSTEM_ANDROID pthread_cancel(m_thread); #else - // See http://stackoverflow.com/questions/4610086/pthread-cancel-al + // See https://stackoverflow.com/questions/4610086/pthread-cancel-al pthread_kill(m_thread, SIGUSR1); #endif } diff --git a/src/SFML/Window/Android/WindowImplAndroid.cpp b/src/SFML/Window/Android/WindowImplAndroid.cpp index 405f7c8a..c973dd73 100644 --- a/src/SFML/Window/Android/WindowImplAndroid.cpp +++ b/src/SFML/Window/Android/WindowImplAndroid.cpp @@ -418,7 +418,7 @@ int WindowImplAndroid::processKeyEvent(AInputEvent* _event, ActivityStates* stat if (key == AKEYCODE_UNKNOWN) { // This is a unique sequence, which is not yet exposed in the NDK - // http://code.google.com/p/android/issues/detail?id=33998 + // https://code.google.com/p/android/issues/detail?id=33998 return 0; } else if (int unicode = getUnicode(_event)) // This is a repeated sequence diff --git a/src/SFML/Window/OSX/HIDInputManager.mm b/src/SFML/Window/OSX/HIDInputManager.mm index 42a14c6b..70136eee 100644 --- a/src/SFML/Window/OSX/HIDInputManager.mm +++ b/src/SFML/Window/OSX/HIDInputManager.mm @@ -694,7 +694,7 @@ Keyboard::Key HIDInputManager::localizedKeys(UniChar ch) //////////////////////////////////////////////////////// Keyboard::Key HIDInputManager::nonLocalizedKeys(UniChar virtualKeycode) { - // (Some) 0x code based on http://forums.macrumors.com/showthread.php?t=780577 + // (Some) 0x code based on https://forums.macrumors.com/showthread.php?t=780577 // Some sf::Keyboard::Key are present twice. switch (virtualKeycode) { diff --git a/src/SFML/Window/OSX/SFViewController.mm b/src/SFML/Window/OSX/SFViewController.mm index 54f63102..c92283b5 100644 --- a/src/SFML/Window/OSX/SFViewController.mm +++ b/src/SFML/Window/OSX/SFViewController.mm @@ -254,7 +254,7 @@ if ([NSThread currentThread] != [NSThread mainThread]) { /* - * See http://lists.apple.com/archives/cocoa-dev/2011/Feb/msg00460.html + * See https://lists.apple.com/archives/cocoa-dev/2011/Feb/msg00460.html * for more information. */ sf::err() << "Cannot fetch event from a worker thread. (OS X restriction)" << std::endl; diff --git a/src/SFML/Window/OSX/SFWindow.h b/src/SFML/Window/OSX/SFWindow.h index 1d13750a..1d35245e 100644 --- a/src/SFML/Window/OSX/SFWindow.h +++ b/src/SFML/Window/OSX/SFWindow.h @@ -40,7 +40,7 @@ /// acceptsFirstResponder and canBecomeKeyWindow messages must /// return YES to grab fullscreen events. /// -/// See http://stackoverflow.com/questions/999464/fullscreen-key-down-actions +/// See https://stackoverflow.com/questions/999464/fullscreen-key-down-actions /// /// \return YES /// diff --git a/src/SFML/Window/OSX/SFWindowController.mm b/src/SFML/Window/OSX/SFWindowController.mm index 96f2e181..186a0fbe 100644 --- a/src/SFML/Window/OSX/SFWindowController.mm +++ b/src/SFML/Window/OSX/SFWindowController.mm @@ -136,7 +136,7 @@ if ([NSThread currentThread] != [NSThread mainThread]) { /* - * See http://lists.apple.com/archives/cocoa-dev/2011/Feb/msg00460.html + * See https://lists.apple.com/archives/cocoa-dev/2011/Feb/msg00460.html * for more information. */ sf::err() << "Cannot create a window from a worker thread. (OS X limitation)" << std::endl; @@ -566,7 +566,7 @@ if ([NSThread currentThread] != [NSThread mainThread]) { /* - * See http://lists.apple.com/archives/cocoa-dev/2011/Feb/msg00460.html + * See https://lists.apple.com/archives/cocoa-dev/2011/Feb/msg00460.html * for more information. */ sf::err() << "Cannot fetch event from a worker thread. (OS X restriction)" << std::endl; diff --git a/src/SFML/Window/Win32/WglExtensions.txt b/src/SFML/Window/Win32/WglExtensions.txt index 667c8536..fa616752 100644 --- a/src/SFML/Window/Win32/WglExtensions.txt +++ b/src/SFML/Window/Win32/WglExtensions.txt @@ -10,4 +10,4 @@ WGL_ARB_multisample WGL_ARB_pixel_format WGL_ARB_pbuffer WGL_ARB_create_context -WGL_ARB_create_context_profile \ No newline at end of file +WGL_ARB_create_context_profile From 0da25a0b87a16797d59ec56f35428b19a9166279 Mon Sep 17 00:00:00 2001 From: Alexander Weinrauch <alexander.weinrauch@gmail.com> Date: Tue, 19 Sep 2017 21:20:07 +0200 Subject: [PATCH 035/211] Added support for the newest NDK version --- CMakeLists.txt | 3 ++ cmake/Macros.cmake | 64 ++++++++++++++++-------- cmake/toolchains/android.toolchain.cmake | 45 ----------------- include/SFML/OpenGL.hpp | 3 ++ src/SFML/Main/SFMLActivity.cpp | 1 + src/SFML/System/Android/Activity.cpp | 2 +- src/SFML/Window/EglContext.cpp | 8 +-- 7 files changed, 56 insertions(+), 70 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 348802e5..08c3a4eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,6 +143,9 @@ if(SFML_OS_ANDROID) add_definitions("-DSTL_LIBRARY=${ANDROID_STL}") endif() + # let the user switch ABIs + set(ANDROID_ABI "armeabi-v7a" CACHE STRING "Look at the NDK docs for currently supported ABIs") + # this is a workaround to compile sfml-activity without the stl library as a dependency # we save the original compilation command line to restore it later in Macro.cmake set(CMAKE_CXX_CREATE_SHARED_LIBRARY_WITH_STL ${CMAKE_CXX_CREATE_SHARED_LIBRARY}) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index f9063367..1bcf308a 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -231,26 +231,50 @@ macro(sfml_add_example target) endmacro() # macro to find packages on the host OS -# this is the same as in the toolchain file, which is here for Nsight Tegra VS -# since it won't use the Android toolchain file -if(CMAKE_VS_PLATFORM_NAME STREQUAL "Tegra-Android") - macro(find_host_package) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) - if(CMAKE_HOST_WIN32) - set(WIN32 1) - set(UNIX) - elseif(CMAKE_HOST_APPLE) - set(APPLE 1) - set(UNIX) +# We do not use the custom toolchain anymore, so we need to define +# the macro here +if(SFML_OS_ANDROID) + # macro to find packages on the host OS + macro( find_host_package ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) + if( CMAKE_HOST_WIN32 ) + SET( WIN32 1 ) + SET( UNIX ) + elseif( CMAKE_HOST_APPLE ) + SET( APPLE 1 ) + SET( UNIX ) endif() - find_package(${ARGN}) - set(WIN32) - set(APPLE) - set(UNIX 1) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + find_package( ${ARGN} ) + SET( WIN32 ) + SET( APPLE ) + SET( UNIX 1 ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) + endmacro() + + + # macro to find programs on the host OS + macro( find_host_program ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) + if( CMAKE_HOST_WIN32 ) + SET( WIN32 1 ) + SET( UNIX ) + elseif( CMAKE_HOST_APPLE ) + SET( APPLE 1 ) + SET( UNIX ) + endif() + find_program( ${ARGN} ) + SET( WIN32 ) + SET( APPLE ) + SET( UNIX 1 ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) endmacro() endif() + diff --git a/cmake/toolchains/android.toolchain.cmake b/cmake/toolchains/android.toolchain.cmake index ad5a8327..56e70cba 100644 --- a/cmake/toolchains/android.toolchain.cmake +++ b/cmake/toolchains/android.toolchain.cmake @@ -1555,51 +1555,6 @@ set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) - -# macro to find packages on the host OS -macro( find_host_package ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) - if( CMAKE_HOST_WIN32 ) - SET( WIN32 1 ) - SET( UNIX ) - elseif( CMAKE_HOST_APPLE ) - SET( APPLE 1 ) - SET( UNIX ) - endif() - find_package( ${ARGN} ) - SET( WIN32 ) - SET( APPLE ) - SET( UNIX 1 ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) -endmacro() - - -# macro to find programs on the host OS -macro( find_host_program ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) - if( CMAKE_HOST_WIN32 ) - SET( WIN32 1 ) - SET( UNIX ) - elseif( CMAKE_HOST_APPLE ) - SET( APPLE 1 ) - SET( UNIX ) - endif() - find_program( ${ARGN} ) - SET( WIN32 ) - SET( APPLE ) - SET( UNIX 1 ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) -endmacro() - - # export toolchain settings for the try_compile() command if( NOT _CMAKE_IN_TRY_COMPILE ) set( __toolchain_config "") diff --git a/include/SFML/OpenGL.hpp b/include/SFML/OpenGL.hpp index 408f0dd5..f5105a6c 100644 --- a/include/SFML/OpenGL.hpp +++ b/include/SFML/OpenGL.hpp @@ -69,6 +69,9 @@ #include <GLES/glext.h> // We're not using OpenGL ES 2+ yet, but we can use the sRGB extension + // We need to import gl2platform.h, would normally be included by gl2.h + // which was included by gl2ext.h in older NDK versions + #include <GLES2/gl2platform.h> #include <GLES2/gl2ext.h> #endif diff --git a/src/SFML/Main/SFMLActivity.cpp b/src/SFML/Main/SFMLActivity.cpp index 07602fb2..e55a0492 100644 --- a/src/SFML/Main/SFMLActivity.cpp +++ b/src/SFML/Main/SFMLActivity.cpp @@ -28,6 +28,7 @@ #include <dlfcn.h> #include <errno.h> #include <stdlib.h> +#include <string.h> #include <jni.h> #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_INFO, "sfml-activity", __VA_ARGS__)) diff --git a/src/SFML/System/Android/Activity.cpp b/src/SFML/System/Android/Activity.cpp index 214b4a12..5d140265 100644 --- a/src/SFML/System/Android/Activity.cpp +++ b/src/SFML/System/Android/Activity.cpp @@ -43,7 +43,7 @@ std::streambuf::int_type LogcatStream::overflow (std::streambuf::int_type c) if (c == "\n"[0]) { m_message.push_back(c); - LOGE(m_message.c_str()); + LOGE("%s", m_message.c_str()); m_message.clear(); } diff --git a/src/SFML/Window/EglContext.cpp b/src/SFML/Window/EglContext.cpp index 03c41979..91d02f93 100644 --- a/src/SFML/Window/EglContext.cpp +++ b/src/SFML/Window/EglContext.cpp @@ -243,10 +243,10 @@ EGLConfig EglContext::getBestConfig(EGLDisplay display, unsigned int bitsPerPixe { // Set our video settings constraint const EGLint attributes[] = { - EGL_BUFFER_SIZE, bitsPerPixel, - EGL_DEPTH_SIZE, settings.depthBits, - EGL_STENCIL_SIZE, settings.stencilBits, - EGL_SAMPLE_BUFFERS, settings.antialiasingLevel, + 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_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, EGL_NONE From 806813e9374a1912f10e604300314b7ef981af70 Mon Sep 17 00:00:00 2001 From: Mario Liebisch <mario.liebisch@gmail.com> Date: Thu, 25 Jan 2018 15:06:30 +0100 Subject: [PATCH 036/211] Android: Removed custom toolchain file This commit drops the previous custom CMake toolchain file for Android in favor of CMake's new built-in toolchain for this (CMake >3.7.2). This makes building SFML for Android a lot simpler and more straight forward, working almost as smooth as other platforms. To configure your build directory, all you have to do is defining just a few variables the first time you invoke CMake. **Required Variables** * `CMAKE_SYSTEM_NAME` must be `Android`, so CMake knows we actually want to cross-compile. * `CMAKE_ANDROID_NDK` must point to the NDK's installation directory, e.g. `/usr/android/ndk` or `c:/android/ndk`. **Recommended Variables** * `CMAKE_ANDROID_STL_TYPE` defines the STL implementation to be used. You should use `c++_shared`, although others might work. **Optional Variables** * `CMAKE_SYSTEM_VERSION` can be set to pick a specific SDK version other than the latest. * `CMAKE_ANDROID_ARCH_ABI` defines the target architecture and ABI, for example `armeabi` or `armeabi-v7a`. Based on your system, you might want to enforce a specific generator to prevent issues, e.g. using `MinGW Makefiles`. --- CMakeLists.txt | 56 ++++++++++---------------------- cmake/Config.cmake | 2 +- cmake/Macros.cmake | 49 ---------------------------- include/SFML/OpenGL.hpp | 2 -- src/SFML/Audio/CMakeLists.txt | 2 +- src/SFML/CMakeLists.txt | 2 +- src/SFML/Graphics/CMakeLists.txt | 2 +- src/SFML/Main/SFMLActivity.cpp | 1 + 8 files changed, 23 insertions(+), 93 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08c3a4eb..0c49ed14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,9 @@ -cmake_minimum_required(VERSION 2.8.3) +# 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 2.8.3) +endif() # define a macro that helps defining an option macro(sfml_set_option var default type docstring) @@ -38,26 +43,6 @@ if(NOT CMAKE_OSX_SYSROOT) ERROR_QUIET) endif() -# set Android specific options - -# define the minimum API level to be used -sfml_set_option(ANDROID_API_MIN 9 STRING "Choose the Android API level to be used (minimum 9)") -# mirror the setting for the toolchain file -set(ANDROID_NATIVE_API_LEVEL ${ANDROID_API_MIN}) - -# define the path to the Android NDK -sfml_set_option(ANDROID_NDK "$ENV{ANDROID_NDK}" PATH "Path to the Android NDK") - -# define the STL implementation to be used -sfml_set_option(ANDROID_STL c++_shared STRING "Choose the STL implementation to be used (experimental)") - -# default the ABI to ARM v7a for hardware floating point -if(NOT ANDROID_ABI) - set(ANDROID_ABI armeabi-v7a) -endif() - -#end of Android specific options - # project name project(SFML) @@ -119,12 +104,8 @@ endif() # Android options if(SFML_OS_ANDROID) # make sure there's the android library available - if (${ANDROID_API_MIN} LESS 9) - message(FATAL_ERROR "Android API level must be equal or greater than 9. Please adjust the CMake variable 'ANDROID_API_MIN'.") - endif() - - if(NOT ANDROID_NDK) - message(FATAL_ERROR "The Android NDK couldn't be found. Please adjust the CMake variable 'ANDROID_NDK' to point to the NDK directory.") + if (CMAKE_ANDROID_API LESS 9) + message(FATAL_ERROR "Android API level (${CMAKE_ANDROID_API}) must be equal or greater than 9.") endif() # CMake doesn't support defining the STL to be used with Nsight Tegra, so warn the user @@ -133,14 +114,19 @@ if(SFML_OS_ANDROID) endif() # install everything in $NDK/sources/ because this path is appended by the NDK (convenient) - set(CMAKE_INSTALL_PREFIX ${ANDROID_NDK}/sources/sfml) + 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 "/${ANDROID_ABI}") + set(LIB_SUFFIX "/${CMAKE_ANDROID_ARCH_ABI}") # pass shared STL configuration (if any) - if (ANDROID_STL MATCHES "_shared") - add_definitions("-DSTL_LIBRARY=${ANDROID_STL}") + if (CMAKE_ANDROID_STL_TYPE MATCHES "_shared") + add_definitions("-DSTL_LIBRARY=${CMAKE_ANDROID_STL_TYPE}") + if(NOT CMAKE_ANDROID_STL_TYPE MATCHES "c\\+\\+_shared") + message("Android: Using ${CMAKE_ANDROID_STL_TYPE} as STL. Set CMAKE_ANDROID_STL_TYPE to c++_shared, if there are any issues.") + endif() + else() + message(WARNING "Android: You're using a static STL (${CMAKE_ANDROID_STL_TYPE}). Set CMAKE_ANDROID_STL_TYPE to c++_shared, if there are any issues.") endif() # let the user switch ABIs @@ -150,12 +136,6 @@ if(SFML_OS_ANDROID) # we save the original compilation command line to restore it later in Macro.cmake set(CMAKE_CXX_CREATE_SHARED_LIBRARY_WITH_STL ${CMAKE_CXX_CREATE_SHARED_LIBRARY}) set(CMAKE_CXX_CREATE_SHARED_LIBRARY_WITHOUT_STL "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") -else() - unset(ANDROID_ABI CACHE) - unset(ANDROID_API_MIN CACHE) - unset(ANDROID_STL CACHE) - unset(ANDROID_NATIVE_API_LEVEL CACHE) - unset(ANDROID_NDK CACHE) endif() # define SFML_STATIC if the build type is not set to 'shared' @@ -525,7 +505,7 @@ elseif(SFML_OS_ANDROID) if(NOT SFML_USE_SYSTEM_DEPS) # install extlibs - install(DIRECTORY extlibs/libs-android/${ANDROID_ABI} DESTINATION extlibs/lib) + install(DIRECTORY extlibs/libs-android/${CMAKE_ANDROID_ARCH_ABI} DESTINATION extlibs/lib) install(FILES extlibs/Android.mk DESTINATION extlibs) endif() diff --git a/cmake/Config.cmake b/cmake/Config.cmake index 594d5e67..ca841d38 100644 --- a/cmake/Config.cmake +++ b/cmake/Config.cmake @@ -124,5 +124,5 @@ if(SFML_OS_WINDOWS OR SFML_OS_IOS) elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_MACOSX) set(INSTALL_MISC_DIR share/SFML) elseif(SFML_OS_ANDROID) - set(INSTALL_MISC_DIR ${ANDROID_NDK}/sources/sfml) + set(INSTALL_MISC_DIR ${CMAKE_ANDROID_NDK}/sources/third_party/sfml) endif() diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 1bcf308a..2382ea43 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -229,52 +229,3 @@ macro(sfml_add_example target) endif() endmacro() - -# macro to find packages on the host OS -# We do not use the custom toolchain anymore, so we need to define -# the macro here -if(SFML_OS_ANDROID) - # macro to find packages on the host OS - macro( find_host_package ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) - if( CMAKE_HOST_WIN32 ) - SET( WIN32 1 ) - SET( UNIX ) - elseif( CMAKE_HOST_APPLE ) - SET( APPLE 1 ) - SET( UNIX ) - endif() - find_package( ${ARGN} ) - SET( WIN32 ) - SET( APPLE ) - SET( UNIX 1 ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) - endmacro() - - - # macro to find programs on the host OS - macro( find_host_program ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) - if( CMAKE_HOST_WIN32 ) - SET( WIN32 1 ) - SET( UNIX ) - elseif( CMAKE_HOST_APPLE ) - SET( APPLE 1 ) - SET( UNIX ) - endif() - find_program( ${ARGN} ) - SET( WIN32 ) - SET( APPLE ) - SET( UNIX 1 ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) - endmacro() -endif() - diff --git a/include/SFML/OpenGL.hpp b/include/SFML/OpenGL.hpp index f5105a6c..1a57e65f 100644 --- a/include/SFML/OpenGL.hpp +++ b/include/SFML/OpenGL.hpp @@ -69,8 +69,6 @@ #include <GLES/glext.h> // We're not using OpenGL ES 2+ yet, but we can use the sRGB extension - // We need to import gl2platform.h, would normally be included by gl2.h - // which was included by gl2ext.h in older NDK versions #include <GLES2/gl2platform.h> #include <GLES2/gl2ext.h> diff --git a/src/SFML/Audio/CMakeLists.txt b/src/SFML/Audio/CMakeLists.txt index eac6b8c8..363bf44f 100644 --- a/src/SFML/Audio/CMakeLists.txt +++ b/src/SFML/Audio/CMakeLists.txt @@ -66,7 +66,7 @@ elseif(SFML_OS_ANDROID) endif() # find external libraries -if(SFML_OS_ANDROID OR SFML_OS_IOS) +if(SFML_OS_IOS) if(NOT SFML_OS_IOS) find_host_package(OpenAL REQUIRED) endif() diff --git a/src/SFML/CMakeLists.txt b/src/SFML/CMakeLists.txt index 61be9ae6..30f674af 100644 --- a/src/SFML/CMakeLists.txt +++ b/src/SFML/CMakeLists.txt @@ -36,7 +36,7 @@ elseif(SFML_OS_IOS) set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-ios/") elseif(SFML_OS_ANDROID) set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "${PROJECT_SOURCE_DIR}/extlibs/headers") - set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-android/${ANDROID_ABI}") + set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-android/${CMAKE_ANDROID_ARCH_ABI}") endif() # add the SFML sources path diff --git a/src/SFML/Graphics/CMakeLists.txt b/src/SFML/Graphics/CMakeLists.txt index 3ad9b8d4..42d34c9c 100644 --- a/src/SFML/Graphics/CMakeLists.txt +++ b/src/SFML/Graphics/CMakeLists.txt @@ -116,7 +116,7 @@ if(SFML_OPENGL_ES AND SFML_OS_LINUX) find_package(GLES REQUIRED) include_directories(${EGL_INCLUDE_DIR} ${GLES_INCLUDE_DIR}) endif() -if(SFML_OS_ANDROID OR SFML_OS_IOS) +if(SFML_OS_IOS) find_host_package(Freetype REQUIRED) else() find_package(Freetype REQUIRED) diff --git a/src/SFML/Main/SFMLActivity.cpp b/src/SFML/Main/SFMLActivity.cpp index e55a0492..caf191b2 100644 --- a/src/SFML/Main/SFMLActivity.cpp +++ b/src/SFML/Main/SFMLActivity.cpp @@ -30,6 +30,7 @@ #include <stdlib.h> #include <string.h> #include <jni.h> +#include <string> #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_INFO, "sfml-activity", __VA_ARGS__)) From 66369645b545d5ace07b7d58b65ca97b3f43a740 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Wed, 24 Jan 2018 16:52:07 -0800 Subject: [PATCH 037/211] Install extlibs on iOS if needed --- CMakeLists.txt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c49ed14..403456bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -488,10 +488,8 @@ elseif(SFML_OS_MACOSX) elseif(SFML_OS_IOS) - # fix CMake install rules broken for iOS (see https://public.kitware.com/Bug/view.php?id=12506) - if(SFML_OS_IOS) - install(DIRECTORY "${CMAKE_BINARY_DIR}/lib/\$ENV{CONFIGURATION}/" DESTINATION lib${LIB_SUFFIX}) - endif() + # 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}) if(NOT SFML_USE_SYSTEM_DEPS) # since the iOS libraries are built as static, we must install the SFML dependencies @@ -499,6 +497,13 @@ elseif(SFML_OS_IOS) if(SFML_BUILD_GRAPHICS) install(FILES extlibs/libs-ios/libfreetype.a DESTINATION lib) endif() + + if(SFML_BUILD_AUDIO) + install(FILES extlibs/libs-ios/libflac.a + extlibs/libs-ios/libvorbis.a + extlibs/libs-ios/libogg.a + DESTINATION lib) + endif() endif() elseif(SFML_OS_ANDROID) From 186294607f32c4ec8fcb32104af8516bed63e1da Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <maximilian.wagenbach@native-instruments.de> Date: Mon, 29 Jan 2018 22:35:04 +0100 Subject: [PATCH 038/211] Return correct key code for delete/backspace on android. Also increased minimum Android API version to 14. --- CMakeLists.txt | 4 ++-- examples/android/AndroidManifest.xml | 4 ++-- examples/android/jni/Application.mk | 2 +- src/SFML/Window/Android/WindowImplAndroid.cpp | 3 ++- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 403456bc..d78bca01 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -104,8 +104,8 @@ endif() # Android options if(SFML_OS_ANDROID) # make sure there's the android library available - if (CMAKE_ANDROID_API LESS 9) - message(FATAL_ERROR "Android API level (${CMAKE_ANDROID_API}) must be equal or greater than 9.") + if (CMAKE_ANDROID_API LESS 14) + message(FATAL_ERROR "Android API level (${CMAKE_ANDROID_API}) must be equal or greater than 14.") endif() # CMake doesn't support defining the STL to be used with Nsight Tegra, so warn the user diff --git a/examples/android/AndroidManifest.xml b/examples/android/AndroidManifest.xml index edee84f4..da0ae20c 100644 --- a/examples/android/AndroidManifest.xml +++ b/examples/android/AndroidManifest.xml @@ -7,11 +7,11 @@ <uses-feature android:glEsVersion="0x00010001" /> - <uses-sdk android:minSdkVersion="9" + <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.VIBRATE" /> - + <application android:label="@string/app_name" android:icon="@drawable/sfml_logo" android:hasCode="false" diff --git a/examples/android/jni/Application.mk b/examples/android/jni/Application.mk index 71828c8d..13ca3ea4 100644 --- a/examples/android/jni/Application.mk +++ b/examples/android/jni/Application.mk @@ -1,5 +1,5 @@ NDK_TOOLCHAIN_VERSION := 4.9 -APP_PLATFORM := android-9 +APP_PLATFORM := android-14 APP_STL := c++_shared APP_ABI := armeabi-v7a APP_MODULES := sfml-activity sfml-example diff --git a/src/SFML/Window/Android/WindowImplAndroid.cpp b/src/SFML/Window/Android/WindowImplAndroid.cpp index c973dd73..4a850f3b 100644 --- a/src/SFML/Window/Android/WindowImplAndroid.cpp +++ b/src/SFML/Window/Android/WindowImplAndroid.cpp @@ -620,7 +620,8 @@ Keyboard::Key WindowImplAndroid::androidKeyToSF(int32_t key) case AKEYCODE_EXPLORER: case AKEYCODE_ENVELOPE: return Keyboard::Unknown; case AKEYCODE_ENTER: return Keyboard::Return; - case AKEYCODE_DEL: return Keyboard::Delete; + case AKEYCODE_DEL: return Keyboard::BackSpace; + case AKEYCODE_FORWARD_DEL: return Keyboard::Delete; case AKEYCODE_GRAVE: return Keyboard::Tilde; case AKEYCODE_MINUS: return Keyboard::Subtract; case AKEYCODE_EQUALS: return Keyboard::Equal; From deeb3a95f3ff46cc350cbabb08802cf6fb9ddac6 Mon Sep 17 00:00:00 2001 From: Radek Dutkiewicz <oomek@users.noreply.github.com> Date: Mon, 5 Feb 2018 15:14:08 +0000 Subject: [PATCH 039/211] Fixed letter spacing being letter width dependent --- include/SFML/Graphics/Text.hpp | 15 ++++++++++----- src/SFML/Graphics/Text.cpp | 12 ++++++++---- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/include/SFML/Graphics/Text.hpp b/include/SFML/Graphics/Text.hpp index 65f4f257..dae6ef2d 100644 --- a/include/SFML/Graphics/Text.hpp +++ b/include/SFML/Graphics/Text.hpp @@ -149,9 +149,9 @@ public: /// /// The default spacing between lines is defined by the font. /// This method enables you to set a factor for the spacing - /// between lines. By default the line spacing offset is 1. + /// between lines. By default the line spacing factor is 1. /// - /// \param spacing New line spacing factor + /// \param spacingFactor New line spacing factor /// /// \see getLineSpacing /// @@ -162,10 +162,15 @@ public: /// \brief Set the letter spacing factor /// /// The default spacing between letters is defined by the font. - /// This method enables you to set a factor to the spacing - /// between letters. By default the letter spacing factor is 1. + /// This factor doesn't directly apply to the existing + /// spacing between each character, it rather adds a fixed + /// space between them which is calculated from the font + /// metrics and the character size. + /// Note that factors below 1 (including negative numbers) bring + /// characters closer to each other. + /// By default the letter spacing factor is 1. /// - /// \param spacing New letter spacing factor + /// \param spacingFactor New letter spacing factor /// /// \see getLetterSpacing /// diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 643197dd..3773616d 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -317,7 +317,9 @@ Vector2f Text::findCharacterPos(std::size_t index) const // Precompute the variables needed by the algorithm bool isBold = m_style & Bold; - float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance * m_letterSpacingFactor; + float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance; + float letterSpacing = ( whitespaceWidth / 3.f ) * ( m_letterSpacingFactor - 1.f ); + whitespaceWidth += letterSpacing; float lineSpacing = m_font->getLineSpacing(m_characterSize) * m_lineSpacingFactor; // Compute the position @@ -340,7 +342,7 @@ Vector2f Text::findCharacterPos(std::size_t index) const } // For regular characters, add the advance offset of the glyph - position.x += m_font->getGlyph(curChar, m_characterSize, isBold).advance * m_letterSpacingFactor; + position.x += m_font->getGlyph(curChar, m_characterSize, isBold).advance + letterSpacing; } // Transform the position to global coordinates @@ -425,7 +427,9 @@ void Text::ensureGeometryUpdate() const float strikeThroughOffset = xBounds.top + xBounds.height / 2.f; // Precompute the variables needed by the algorithm - float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance * m_letterSpacingFactor; + float whitespaceWidth = m_font->getGlyph(L' ', m_characterSize, isBold).advance; + float letterSpacing = ( whitespaceWidth / 3.f ) * ( m_letterSpacingFactor - 1.f ); + whitespaceWidth += letterSpacing; float lineSpacing = m_font->getLineSpacing(m_characterSize) * m_lineSpacingFactor; float x = 0.f; float y = static_cast<float>(m_characterSize); @@ -525,7 +529,7 @@ void Text::ensureGeometryUpdate() const } // Advance to the next character - x += glyph.advance * m_letterSpacingFactor; + x += glyph.advance + letterSpacing; } // If we're using the underlined style, add the last line From 0118776b7e7ebaa3858c3e58368f9586ee73d2f9 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Sun, 25 Feb 2018 13:13:52 -0800 Subject: [PATCH 040/211] Force correct iOS architecture for cmake --- cmake/toolchains/iOS.toolchain.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/toolchains/iOS.toolchain.cmake b/cmake/toolchains/iOS.toolchain.cmake index 0dbc67df..c0712e00 100644 --- a/cmake/toolchains/iOS.toolchain.cmake +++ b/cmake/toolchains/iOS.toolchain.cmake @@ -180,7 +180,7 @@ elseif (${IOS_PLATFORM} STREQUAL SIMULATOR64) set (IOS_ARCH x86_64) endif (${IOS_PLATFORM} STREQUAL OS) -set (CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE string "Build architecture for iOS") +set (CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE string "Build architecture for iOS" FORCE) message (STATUS "iOS arches=${IOS_ARCH}") # Set the find root to the iOS developer roots and to user defined paths From b196aac5c7ee90e4a33d8d7c642b01b813f6fea0 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Fri, 23 Feb 2018 16:31:03 -0800 Subject: [PATCH 041/211] Drop 32 bit support on iOS --- cmake/toolchains/iOS.toolchain.cmake | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cmake/toolchains/iOS.toolchain.cmake b/cmake/toolchains/iOS.toolchain.cmake index c0712e00..a63673e4 100644 --- a/cmake/toolchains/iOS.toolchain.cmake +++ b/cmake/toolchains/iOS.toolchain.cmake @@ -173,15 +173,14 @@ message (STATUS "iOS sysroot=${CMAKE_OSX_SYSROOT}") # set the architecture for iOS if (${IOS_PLATFORM} STREQUAL OS) set (OSX_UNIVERSAL true) - set (IOS_ARCH armv7 armv7s arm64) -elseif (${IOS_PLATFORM} STREQUAL SIMULATOR) - set (IOS_ARCH i386) + set (IOS_ARCH arm64) elseif (${IOS_PLATFORM} STREQUAL SIMULATOR64) set (IOS_ARCH x86_64) endif (${IOS_PLATFORM} STREQUAL OS) -set (CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE string "Build architecture for iOS" FORCE) -message (STATUS "iOS arches=${IOS_ARCH}") +set (CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE string "Build architecture for iOS" FORCE) +set (CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS ${IOS_ARCH}) +message (STATUS "iOS architecture=${IOS_ARCH}") # Set the find root to the iOS developer roots and to user defined paths set (CMAKE_FIND_ROOT_PATH ${CMAKE_IOS_DEVELOPER_ROOT} ${CMAKE_IOS_SDK_ROOT} ${CMAKE_PREFIX_PATH} CACHE string "iOS find search path root") From 910458cfb366b4584269efb9d7f84b05f606f536 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Sun, 25 Feb 2018 12:56:17 -0800 Subject: [PATCH 042/211] Remove references to SIMULATOR64, as 32 bit is no longer available --- cmake/toolchains/iOS.toolchain.cmake | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/cmake/toolchains/iOS.toolchain.cmake b/cmake/toolchains/iOS.toolchain.cmake index a63673e4..abbff038 100644 --- a/cmake/toolchains/iOS.toolchain.cmake +++ b/cmake/toolchains/iOS.toolchain.cmake @@ -17,10 +17,10 @@ # Options: # -# IOS_PLATFORM = OS (default) or SIMULATOR or SIMULATOR64 +# IOS_PLATFORM = OS (default) or SIMULATOR # This decides if SDKS will be selected from the iPhoneOS.platform or iPhoneSimulator.platform folders # OS - the default, used to build for iPhone and iPad physical devices, which have an arm arch. -# SIMULATOR - used to build for the Simulator platforms, which have an x86 arch. +# SIMULATOR - used to build for the Simulator platforms, which have an x86_64 arch. # # CMAKE_IOS_DEVELOPER_ROOT = automatic(default) or /path/to/platform/Developer folder # By default this location is automatcially chosen based on the IOS_PLATFORM value above. @@ -127,15 +127,9 @@ elseif (${IOS_PLATFORM} STREQUAL SIMULATOR) # This causes the installers to properly locate the output libraries set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphonesimulator") -elseif (${IOS_PLATFORM} STREQUAL SIMULATOR64) - message (STATUS "Targeting iPhoneSimulator64 platform") - set (SIMULATOR true) - set (IOS_PLATFORM_LOCATION "iPhoneSimulator.platform") - # This causes the installers to properly locate the output libraries - set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphonesimulator") else (${IOS_PLATFORM} STREQUAL OS) - message (FATAL_ERROR "Unsupported IOS_PLATFORM value '${IOS_PLATFORM}' selected. Please choose OS, SIMULATOR, or SIMULATOR64") + message (FATAL_ERROR "Unsupported IOS_PLATFORM value '${IOS_PLATFORM}' selected. Please choose OS or SIMULATOR") endif (${IOS_PLATFORM} STREQUAL OS) # Setup iOS developer location unless specified manually with CMAKE_IOS_DEVELOPER_ROOT @@ -174,7 +168,7 @@ message (STATUS "iOS sysroot=${CMAKE_OSX_SYSROOT}") if (${IOS_PLATFORM} STREQUAL OS) set (OSX_UNIVERSAL true) set (IOS_ARCH arm64) -elseif (${IOS_PLATFORM} STREQUAL SIMULATOR64) +elseif (${IOS_PLATFORM} STREQUAL SIMULATOR) set (IOS_ARCH x86_64) endif (${IOS_PLATFORM} STREQUAL OS) From f963faa694ad4a640e7a6bc6852bb0604b4fa9dc Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Fri, 23 Feb 2018 17:04:29 -0800 Subject: [PATCH 043/211] Find OpenAL correctly on iOS --- src/SFML/Audio/ALCheck.hpp | 9 ++------- src/SFML/Audio/CMakeLists.txt | 8 ++------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/SFML/Audio/ALCheck.hpp b/src/SFML/Audio/ALCheck.hpp index fc497a2d..c67d117d 100644 --- a/src/SFML/Audio/ALCheck.hpp +++ b/src/SFML/Audio/ALCheck.hpp @@ -29,14 +29,9 @@ // Headers //////////////////////////////////////////////////////////// #include <SFML/Config.hpp> -#ifdef SFML_SYSTEM_IOS - #include <OpenAl/al.h> - #include <OpenAl/alc.h> -#else - #include <al.h> - #include <alc.h> -#endif +#include <al.h> +#include <alc.h> namespace sf { diff --git a/src/SFML/Audio/CMakeLists.txt b/src/SFML/Audio/CMakeLists.txt index 363bf44f..65c0fc8f 100644 --- a/src/SFML/Audio/CMakeLists.txt +++ b/src/SFML/Audio/CMakeLists.txt @@ -67,9 +67,7 @@ endif() # find external libraries if(SFML_OS_IOS) - if(NOT SFML_OS_IOS) - find_host_package(OpenAL REQUIRED) - endif() + find_host_package(OpenAL REQUIRED) find_host_package(Vorbis REQUIRED) find_host_package(FLAC REQUIRED) else() @@ -78,9 +76,7 @@ else() find_package(FLAC REQUIRED) endif() -if(NOT SFML_OS_IOS) - include_directories(${OPENAL_INCLUDE_DIR}) -endif() +include_directories(${OPENAL_INCLUDE_DIR}) include_directories(${VORBIS_INCLUDE_DIRS}) include_directories(${FLAC_INCLUDE_DIR}) add_definitions(-DOV_EXCLUDE_STATIC_CALLBACKS) # avoids warnings in vorbisfile.h From 8b7a50a914d4986477081e6f94b676e6089180dd Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Sat, 10 Feb 2018 18:07:21 +0100 Subject: [PATCH 044/211] Fix CMake warning on macOS since CMake 3.9 --- CMakeLists.txt | 14 +++++++++++--- cmake/Macros.cmake | 14 +++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d78bca01..47afd9e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,9 @@ set(CMAKE_LEGACY_CYGWIN_WIN32 0) if(NOT CMAKE_VERSION VERSION_LESS 3.0) cmake_policy(SET CMP0042 NEW) endif() +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 @@ -394,9 +397,14 @@ else() # adapt install directory to allow distributing dylibs/frameworks in user's frameworks/application bundle # NOTE: it's not required to link against SFML.framework - set_target_properties(SFML PROPERTIES - BUILD_WITH_INSTALL_RPATH 1 - INSTALL_NAME_DIR "@rpath") + set_target_properties(SFML PROPERTIES INSTALL_NAME_DIR "@rpath") + if(NOT CMAKE_SKIP_BUILD_RPATH) + if (CMAKE_VERSION VERSION_LESS 3.9) + set_target_properties(${target} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE) + else() + set_target_properties(${target} PROPERTIES BUILD_WITH_INSTALL_NAME_DIR TRUE) + endif() + endif() # install rule install(TARGETS SFML diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 2382ea43..fa2b78b3 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -123,13 +123,13 @@ macro(sfml_add_library target) # adapt install directory to allow distributing dylibs/frameworks in user's frameworks/application bundle # but only if cmake rpath options aren't set if(NOT CMAKE_SKIP_RPATH AND NOT CMAKE_SKIP_INSTALL_RPATH AND NOT CMAKE_INSTALL_RPATH AND NOT CMAKE_INSTALL_RPATH_USE_LINK_PATH AND NOT CMAKE_INSTALL_NAME_DIR) - if(CMAKE_SKIP_BUILD_RPATH) - set_target_properties(${target} PROPERTIES - INSTALL_NAME_DIR "@rpath") - else() - set_target_properties(${target} PROPERTIES - BUILD_WITH_INSTALL_RPATH 1 - INSTALL_NAME_DIR "@rpath") + set_target_properties(${target} PROPERTIES INSTALL_NAME_DIR "@rpath") + if(NOT CMAKE_SKIP_BUILD_RPATH) + if (CMAKE_VERSION VERSION_LESS 3.9) + set_target_properties(${target} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE) + else() + set_target_properties(${target} PROPERTIES BUILD_WITH_INSTALL_NAME_DIR TRUE) + endif() endif() endif() endif() From 49d611ee695f98390e38bf65436844086e3afefd Mon Sep 17 00:00:00 2001 From: Mario Liebisch <mario.liebisch@gmail.com> Date: Thu, 28 Dec 2017 09:55:57 +0100 Subject: [PATCH 045/211] Fixed small joystick movement getting lost due to the set axes threshold. This fixes issue #1329. --- src/SFML/Window/WindowImpl.cpp | 11 ++++++++++- src/SFML/Window/WindowImpl.hpp | 9 +++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/SFML/Window/WindowImpl.cpp b/src/SFML/Window/WindowImpl.cpp index 27d4ab40..bd87474b 100644 --- a/src/SFML/Window/WindowImpl.cpp +++ b/src/SFML/Window/WindowImpl.cpp @@ -86,7 +86,10 @@ m_joystickThreshold(0.1f) // Get the initial joystick states JoystickManager::getInstance().update(); for (unsigned int i = 0; i < Joystick::Count; ++i) + { m_joystickStates[i] = JoystickManager::getInstance().getState(i); + std::fill_n(m_previousAxes[i], static_cast<std::size_t>(Joystick::AxisCount), 0.f); + } // Get the initial sensor states for (unsigned int i = 0; i < Sensor::Count; ++i) @@ -176,6 +179,10 @@ void WindowImpl::processJoystickEvents() event.type = connected ? Event::JoystickConnected : Event::JoystickDisconnected; event.joystickButton.joystickId = i; pushEvent(event); + + // Clear previous axes positions + if (connected) + std::fill_n(m_previousAxes[i], static_cast<std::size_t>(Joystick::AxisCount), 0.f); } if (connected) @@ -186,7 +193,7 @@ void WindowImpl::processJoystickEvents() if (caps.axes[j]) { Joystick::Axis axis = static_cast<Joystick::Axis>(j); - float prevPos = previousState.axes[axis]; + float prevPos = m_previousAxes[i][axis]; float currPos = m_joystickStates[i].axes[axis]; if (fabs(currPos - prevPos) >= m_joystickThreshold) { @@ -196,6 +203,8 @@ void WindowImpl::processJoystickEvents() event.joystickMove.axis = axis; event.joystickMove.position = currPos; pushEvent(event); + + m_previousAxes[i][axis] = currPos; } } } diff --git a/src/SFML/Window/WindowImpl.hpp b/src/SFML/Window/WindowImpl.hpp index 355ee69d..a360a018 100644 --- a/src/SFML/Window/WindowImpl.hpp +++ b/src/SFML/Window/WindowImpl.hpp @@ -270,10 +270,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) + 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 From 5c20c67469e2be17a727bf6cfe3f5672bf50df83 Mon Sep 17 00:00:00 2001 From: "Marty E. Plummer" <hanetzer@startmail.com> Date: Thu, 15 Mar 2018 03:44:43 -0500 Subject: [PATCH 046/211] window: change case of Dbt.h inclusion Windows should have no issue with this change, as it addresses files in a case-insensitve manner. Said header is installed in lowercase on mingw-w64, and won't build since commit 22f1b85515242c44d7e5a1be1e3960bdf6648b52 Signed-off-by: Marty E. Plummer <hanetzer@startmail.com> --- src/SFML/Window/Win32/WindowImplWin32.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index a084e093..84ff58ff 100755 --- a/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -39,7 +39,10 @@ #include <GL/gl.h> #include <SFML/System/Err.hpp> #include <SFML/System/Utf.hpp> -#include <Dbt.h> +// dbt.h is lowercase here, as a cross-compile on linux with mingw-w64 +// expects lowercase, and a native compile on windows, whether via msvc +// or mingw-w64 addresses files in a case insensitive manner. +#include <dbt.h> #include <vector> #include <cstring> From b0f3611ab92ed1ae78fe462ac3f3edacdedc9405 Mon Sep 17 00:00:00 2001 From: Marco Antognini <antognini.marco@gmail.com> Date: Wed, 21 Mar 2018 07:16:13 +0100 Subject: [PATCH 047/211] Renamed a few key codes Deprecated BackSlash, BackSpace, SemiColon, Dash and introduced Backslash, Backspace, Semicolon, Hyphen in a retrocompatible way. --- examples/opengl/OpenGL.cpp | 2 +- include/SFML/Window/Keyboard.hpp | 22 +++++++++++++------ src/SFML/Window/Android/WindowImplAndroid.cpp | 8 +++---- src/SFML/Window/OSX/HIDInputManager.mm | 12 +++++----- src/SFML/Window/Unix/InputImpl.cpp | 10 ++++----- src/SFML/Window/Unix/WindowImplX11.cpp | 12 +++++----- src/SFML/Window/Win32/InputImpl.cpp | 10 ++++----- src/SFML/Window/Win32/WindowImplWin32.cpp | 10 ++++----- 8 files changed, 47 insertions(+), 39 deletions(-) diff --git a/examples/opengl/OpenGL.cpp b/examples/opengl/OpenGL.cpp index fb3f77c6..f2260d6b 100644 --- a/examples/opengl/OpenGL.cpp +++ b/examples/opengl/OpenGL.cpp @@ -175,7 +175,7 @@ int main() } // Return key: toggle mipmapping - if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Return)) + if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Enter)) { if (mipmapEnabled) { diff --git a/include/SFML/Window/Keyboard.hpp b/include/SFML/Window/Keyboard.hpp index e8b91a55..7c59c571 100644 --- a/include/SFML/Window/Keyboard.hpp +++ b/include/SFML/Window/Keyboard.hpp @@ -96,18 +96,18 @@ public: Menu, ///< The Menu key LBracket, ///< The [ key RBracket, ///< The ] key - SemiColon, ///< The ; key + Semicolon, ///< The ; key Comma, ///< The , key Period, ///< The . key Quote, ///< The ' key Slash, ///< The / key - BackSlash, ///< The \ key + Backslash, ///< The \ key Tilde, ///< The ~ key Equal, ///< The = key - Dash, ///< The - key + Hyphen, ///< The - key (hyphen) Space, ///< The Space key - Return, ///< The Return key - BackSpace, ///< The Backspace key + Enter, ///< The Enter/Return keys + Backspace, ///< The Backspace key Tab, ///< The Tabulation key PageUp, ///< The Page up key PageDown, ///< The Page down key @@ -116,7 +116,7 @@ public: Insert, ///< The Insert key Delete, ///< The Delete key Add, ///< The + key - Subtract, ///< The - key + Subtract, ///< The - key (minus, usually from numpad) Multiply, ///< The * key Divide, ///< The / key Left, ///< Left arrow @@ -150,7 +150,15 @@ public: F15, ///< The F15 key Pause, ///< The Pause key - KeyCount ///< Keep last -- the total number of keyboard keys + 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 }; //////////////////////////////////////////////////////////// diff --git a/src/SFML/Window/Android/WindowImplAndroid.cpp b/src/SFML/Window/Android/WindowImplAndroid.cpp index 4a850f3b..40992a05 100644 --- a/src/SFML/Window/Android/WindowImplAndroid.cpp +++ b/src/SFML/Window/Android/WindowImplAndroid.cpp @@ -619,16 +619,16 @@ Keyboard::Key WindowImplAndroid::androidKeyToSF(int32_t key) case AKEYCODE_SYM: case AKEYCODE_EXPLORER: case AKEYCODE_ENVELOPE: return Keyboard::Unknown; - case AKEYCODE_ENTER: return Keyboard::Return; - case AKEYCODE_DEL: return Keyboard::BackSpace; + 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_MINUS: return Keyboard::Subtract; case AKEYCODE_EQUALS: return Keyboard::Equal; case AKEYCODE_LEFT_BRACKET: return Keyboard::LBracket; case AKEYCODE_RIGHT_BRACKET: return Keyboard::RBracket; - case AKEYCODE_BACKSLASH: return Keyboard::BackSlash; - case AKEYCODE_SEMICOLON: return Keyboard::SemiColon; + case AKEYCODE_BACKSLASH: return Keyboard::Backslash; + case AKEYCODE_SEMICOLON: return Keyboard::Semicolon; case AKEYCODE_APOSTROPHE: return Keyboard::Quote; case AKEYCODE_SLASH: return Keyboard::Slash; case AKEYCODE_AT: diff --git a/src/SFML/Window/OSX/HIDInputManager.mm b/src/SFML/Window/OSX/HIDInputManager.mm index 70136eee..a332932f 100644 --- a/src/SFML/Window/OSX/HIDInputManager.mm +++ b/src/SFML/Window/OSX/HIDInputManager.mm @@ -755,13 +755,13 @@ Keyboard::Key HIDInputManager::nonLocalizedKeys(UniChar virtualKeycode) case 0x21: return sf::Keyboard::LBracket; case 0x1e: return sf::Keyboard::RBracket; - case 0x29: return sf::Keyboard::SemiColon; + 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; + 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, @@ -770,11 +770,11 @@ Keyboard::Key HIDInputManager::nonLocalizedKeys(UniChar virtualKeycode) case 0x51: /* keypad */ return sf::Keyboard::Equal; case 0x18: /* keyboard */ return sf::Keyboard::Equal; - case 0x32: return sf::Keyboard::Dash; + case 0x32: return sf::Keyboard::Hyphen; case 0x31: return sf::Keyboard::Space; - case 0x4c: /* keypad */ return sf::Keyboard::Return; - case 0x24: /* keyboard */ return sf::Keyboard::Return; - case 0x33: return sf::Keyboard::BackSpace; + 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). diff --git a/src/SFML/Window/Unix/InputImpl.cpp b/src/SFML/Window/Unix/InputImpl.cpp index bc96f38a..b404dd51 100644 --- a/src/SFML/Window/Unix/InputImpl.cpp +++ b/src/SFML/Window/Unix/InputImpl.cpp @@ -54,20 +54,20 @@ bool InputImpl::isKeyPressed(Keyboard::Key key) 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::Semicolon: keysym = XK_semicolon; break; case Keyboard::Slash: keysym = XK_slash; break; case Keyboard::Equal: keysym = XK_equal; break; - case Keyboard::Dash: keysym = XK_minus; 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::Backslash: keysym = XK_backslash; break; case Keyboard::Tilde: keysym = XK_grave; break; case Keyboard::Space: keysym = XK_space; break; - case Keyboard::Return: keysym = XK_Return; break; - case Keyboard::BackSpace: keysym = XK_BackSpace; 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; diff --git a/src/SFML/Window/Unix/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index 3606cc8f..e2c8d290 100644 --- a/src/SFML/Window/Unix/WindowImplX11.cpp +++ b/src/SFML/Window/Unix/WindowImplX11.cpp @@ -375,21 +375,21 @@ namespace 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_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::Dash; + 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_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::Return; - case XK_KP_Enter: return sf::Keyboard::Return; - case XK_BackSpace: return sf::Keyboard::BackSpace; + 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; diff --git a/src/SFML/Window/Win32/InputImpl.cpp b/src/SFML/Window/Win32/InputImpl.cpp index 440b7b41..04827400 100644 --- a/src/SFML/Window/Win32/InputImpl.cpp +++ b/src/SFML/Window/Win32/InputImpl.cpp @@ -97,18 +97,18 @@ bool InputImpl::isKeyPressed(Keyboard::Key key) 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::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::Backslash: vkey = VK_OEM_5; break; case Keyboard::Tilde: vkey = VK_OEM_3; break; case Keyboard::Equal: vkey = VK_OEM_PLUS; break; - case Keyboard::Dash: vkey = VK_OEM_MINUS; break; + case Keyboard::Hyphen: vkey = VK_OEM_MINUS; break; case Keyboard::Space: vkey = VK_SPACE; break; - case Keyboard::Return: vkey = VK_RETURN; break; - case Keyboard::BackSpace: vkey = VK_BACK; 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; diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index 84ff58ff..707e4187 100755 --- a/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -1024,21 +1024,21 @@ Keyboard::Key WindowImplWin32::virtualKeyCodeToSF(WPARAM key, LPARAM flags) case VK_LWIN: return Keyboard::LSystem; case VK_RWIN: return Keyboard::RSystem; case VK_APPS: return Keyboard::Menu; - case VK_OEM_1: return Keyboard::SemiColon; + case VK_OEM_1: return Keyboard::Semicolon; case VK_OEM_2: return Keyboard::Slash; case VK_OEM_PLUS: return Keyboard::Equal; - case VK_OEM_MINUS: return Keyboard::Dash; + case VK_OEM_MINUS: return Keyboard::Hyphen; case VK_OEM_4: return Keyboard::LBracket; 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_5: return Keyboard::BackSlash; + case VK_OEM_5: return Keyboard::Backslash; case VK_OEM_3: return Keyboard::Tilde; case VK_ESCAPE: return Keyboard::Escape; case VK_SPACE: return Keyboard::Space; - case VK_RETURN: return Keyboard::Return; - case VK_BACK: return Keyboard::BackSpace; + 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; From 421e8bb8125a380c745a7c8d1efc51caeb4a7a3d Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sun, 17 Sep 2017 17:08:49 +0200 Subject: [PATCH 048/211] Added support for creation of a stencil attachment and multisampling to sf::RenderTexture. --- include/SFML/Graphics/RenderTexture.hpp | 33 +- src/SFML/Graphics/GLExtensions.hpp | 16 + src/SFML/Graphics/GLExtensions.txt | 2 + src/SFML/Graphics/GLLoader.cpp | 23 +- src/SFML/Graphics/GLLoader.hpp | 18 ++ src/SFML/Graphics/RenderTexture.cpp | 23 +- src/SFML/Graphics/RenderTextureImpl.hpp | 13 +- .../Graphics/RenderTextureImplDefault.cpp | 14 +- .../Graphics/RenderTextureImplDefault.hpp | 18 +- src/SFML/Graphics/RenderTextureImplFBO.cpp | 289 +++++++++++++++--- src/SFML/Graphics/RenderTextureImplFBO.hpp | 28 +- 11 files changed, 414 insertions(+), 63 deletions(-) diff --git a/include/SFML/Graphics/RenderTexture.hpp b/include/SFML/Graphics/RenderTexture.hpp index 77647888..a26d94b6 100644 --- a/include/SFML/Graphics/RenderTexture.hpp +++ b/include/SFML/Graphics/RenderTexture.hpp @@ -31,6 +31,7 @@ #include <SFML/Graphics/Export.hpp> #include <SFML/Graphics/Texture.hpp> #include <SFML/Graphics/RenderTarget.hpp> +#include <SFML/Window/ContextSettings.hpp> namespace sf @@ -82,8 +83,38 @@ public: /// /// \return True if creation has been successful /// + /// \deprecated Use create(unsigned int, unsigned int, const ContextSettings&) instead. + /// //////////////////////////////////////////////////////////// - bool create(unsigned int width, unsigned int height, bool depthBuffer = false); + SFML_DEPRECATED bool create(unsigned int width, unsigned int height, bool depthBuffer); + + //////////////////////////////////////////////////////////// + /// \brief Create the render-texture + /// + /// Before calling this function, the render-texture is in + /// an invalid state, thus it is mandatory to call it before + /// doing anything with the render-texture. + /// The last parameter, \a settings, is useful if you want to enable + /// multi-sampling or use the render-texture for OpenGL rendering that + /// requires a depth or stencil buffer. Otherwise it is unnecessary, and + /// you should leave this parameter at its default value. + /// + /// \param width Width of the render-texture + /// \param height Height of the render-texture + /// \param settings Additional settings for the underlying OpenGL texture and context + /// + /// \return True if creation has been successful + /// + //////////////////////////////////////////////////////////// + bool create(unsigned int width, unsigned int height, const ContextSettings& settings = ContextSettings()); + + //////////////////////////////////////////////////////////// + /// \brief Get the maximum anti-aliasing level supported by the system + /// + /// \return The maximum anti-aliasing level supported by the system + /// + //////////////////////////////////////////////////////////// + static unsigned int getMaximumAntialiasingLevel(); //////////////////////////////////////////////////////////// /// \brief Enable or disable texture smoothing diff --git a/src/SFML/Graphics/GLExtensions.hpp b/src/SFML/Graphics/GLExtensions.hpp index 0e0c8f51..687cf376 100644 --- a/src/SFML/Graphics/GLExtensions.hpp +++ b/src/SFML/Graphics/GLExtensions.hpp @@ -124,9 +124,15 @@ #define GLEXT_GL_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING_OES #define GLEXT_GL_INVALID_FRAMEBUFFER_OPERATION GL_INVALID_FRAMEBUFFER_OPERATION_OES + // Core since 3.0 + #define GLEXT_packed_depth_stencil false + // Core since 3.0 #define GLEXT_framebuffer_blit false + // Core since 3.0 + #define GLEXT_framebuffer_multisample false + // Core since 3.0 - NV_copy_buffer #define GLEXT_copy_buffer false @@ -277,6 +283,11 @@ #define GLEXT_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT #define GLEXT_GL_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING_EXT #define GLEXT_GL_INVALID_FRAMEBUFFER_OPERATION GL_INVALID_FRAMEBUFFER_OPERATION_EXT + #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_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_EXT // Core since 3.0 - EXT_framebuffer_blit #define GLEXT_framebuffer_blit sfogl_ext_EXT_framebuffer_blit @@ -286,6 +297,11 @@ #define GLEXT_GL_DRAW_FRAMEBUFFER_BINDING GL_DRAW_FRAMEBUFFER_BINDING_EXT #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_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_GL_COPY_READ_BUFFER GL_COPY_READ_BUFFER diff --git a/src/SFML/Graphics/GLExtensions.txt b/src/SFML/Graphics/GLExtensions.txt index fe65158c..e12e8093 100644 --- a/src/SFML/Graphics/GLExtensions.txt +++ b/src/SFML/Graphics/GLExtensions.txt @@ -16,6 +16,8 @@ ARB_texture_non_power_of_two EXT_blend_equation_separate EXT_texture_sRGB EXT_framebuffer_object +EXT_packed_depth_stencil EXT_framebuffer_blit +EXT_framebuffer_multisample ARB_copy_buffer ARB_geometry_shader4 diff --git a/src/SFML/Graphics/GLLoader.cpp b/src/SFML/Graphics/GLLoader.cpp index 4bb1a9bb..85f6d7e5 100644 --- a/src/SFML/Graphics/GLLoader.cpp +++ b/src/SFML/Graphics/GLLoader.cpp @@ -48,7 +48,9 @@ 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; @@ -879,6 +881,19 @@ static int Load_EXT_framebuffer_blit() 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() @@ -928,7 +943,7 @@ typedef struct sfogl_StrToExtMap_s PFN_LOADFUNCPOINTERS LoadExtension; } sfogl_StrToExtMap; -static sfogl_StrToExtMap ExtensionMap[18] = { +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}, @@ -944,12 +959,14 @@ static sfogl_StrToExtMap ExtensionMap[18] = { {"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 = 18; +static int g_extensionMapSize = 20; static void ClearExtensionVars() @@ -969,7 +986,9 @@ static void ClearExtensionVars() 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; } diff --git a/src/SFML/Graphics/GLLoader.hpp b/src/SFML/Graphics/GLLoader.hpp index d7920f90..9fe4adb1 100644 --- a/src/SFML/Graphics/GLLoader.hpp +++ b/src/SFML/Graphics/GLLoader.hpp @@ -185,7 +185,9 @@ 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; @@ -414,11 +416,20 @@ extern int sfogl_ext_ARB_geometry_shader4; #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 @@ -1311,12 +1322,19 @@ extern void (GL_FUNCPTR *sf_ptrc_glRenderbufferStorageEXT)(GLenum, GLenum, GLsiz #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); diff --git a/src/SFML/Graphics/RenderTexture.cpp b/src/SFML/Graphics/RenderTexture.cpp index b81a4091..a52e5063 100644 --- a/src/SFML/Graphics/RenderTexture.cpp +++ b/src/SFML/Graphics/RenderTexture.cpp @@ -50,6 +50,13 @@ RenderTexture::~RenderTexture() //////////////////////////////////////////////////////////// bool RenderTexture::create(unsigned int width, unsigned int height, bool depthBuffer) +{ + return create(width, height, ContextSettings(depthBuffer ? 32 : 0)); +} + + +//////////////////////////////////////////////////////////// +bool RenderTexture::create(unsigned int width, unsigned int height, const ContextSettings& settings) { // Create the texture if (!m_texture.create(width, height)) @@ -78,7 +85,7 @@ bool RenderTexture::create(unsigned int width, unsigned int height, bool depthBu } // Initialize the render texture - if (!m_impl->create(width, height, m_texture.m_texture, depthBuffer)) + if (!m_impl->create(width, height, m_texture.m_texture, settings)) return false; // We can now initialize the render target part @@ -88,6 +95,20 @@ bool RenderTexture::create(unsigned int width, unsigned int height, bool depthBu } +//////////////////////////////////////////////////////////// +unsigned int RenderTexture::getMaximumAntialiasingLevel() +{ + if (priv::RenderTextureImplFBO::isAvailable()) + { + return priv::RenderTextureImplFBO::getMaximumAntialiasingLevel(); + } + else + { + return priv::RenderTextureImplDefault::getMaximumAntialiasingLevel(); + } +} + + //////////////////////////////////////////////////////////// void RenderTexture::setSmooth(bool smooth) { diff --git a/src/SFML/Graphics/RenderTextureImpl.hpp b/src/SFML/Graphics/RenderTextureImpl.hpp index 9ad35b8d..5a357c72 100644 --- a/src/SFML/Graphics/RenderTextureImpl.hpp +++ b/src/SFML/Graphics/RenderTextureImpl.hpp @@ -33,6 +33,9 @@ namespace sf { + +struct ContextSettings; + namespace priv { //////////////////////////////////////////////////////////// @@ -52,15 +55,15 @@ public: //////////////////////////////////////////////////////////// /// \brief Create the render texture implementation /// - /// \param width Width of the texture to render to - /// \param height Height of the texture to render to - /// \param textureId OpenGL identifier of the target texture - /// \param depthBuffer Is a depth buffer requested? + /// \param width Width of the texture to render to + /// \param height Height of the texture to render to + /// \param textureId OpenGL identifier of the target texture + /// \param settings Context settings to create render-texture with /// /// \return True if creation has been successful /// //////////////////////////////////////////////////////////// - virtual bool create(unsigned int width, unsigned int height, unsigned int textureId, bool depthBuffer) = 0; + virtual bool create(unsigned int width, unsigned int height, unsigned int textureId, const ContextSettings& settings) = 0; //////////////////////////////////////////////////////////// /// \brief Activate or deactivate the render texture for rendering diff --git a/src/SFML/Graphics/RenderTextureImplDefault.cpp b/src/SFML/Graphics/RenderTextureImplDefault.cpp index e24978e9..29399d50 100644 --- a/src/SFML/Graphics/RenderTextureImplDefault.cpp +++ b/src/SFML/Graphics/RenderTextureImplDefault.cpp @@ -55,14 +55,24 @@ RenderTextureImplDefault::~RenderTextureImplDefault() //////////////////////////////////////////////////////////// -bool RenderTextureImplDefault::create(unsigned int width, unsigned int height, unsigned int, bool depthBuffer) +unsigned int RenderTextureImplDefault::getMaximumAntialiasingLevel() +{ + // If the system is so old that it doesn't support FBOs, chances are it is + // also using either a software renderer or some CPU emulated support for AA + // In order to not cripple performance in this rare case, we just return 0 here + return 0; +} + + +//////////////////////////////////////////////////////////// +bool RenderTextureImplDefault::create(unsigned int width, unsigned int height, unsigned int, const ContextSettings& settings) { // Store the dimensions m_width = width; m_height = height; // Create the in-memory OpenGL context - m_context = new Context(ContextSettings(depthBuffer ? 32 : 0), width, height); + m_context = new Context(settings, width, height); return true; } diff --git a/src/SFML/Graphics/RenderTextureImplDefault.hpp b/src/SFML/Graphics/RenderTextureImplDefault.hpp index 6f5d0f3e..c3b59aea 100644 --- a/src/SFML/Graphics/RenderTextureImplDefault.hpp +++ b/src/SFML/Graphics/RenderTextureImplDefault.hpp @@ -58,20 +58,28 @@ public: //////////////////////////////////////////////////////////// ~RenderTextureImplDefault(); + //////////////////////////////////////////////////////////// + /// \brief Get the maximum anti-aliasing level supported by the system + /// + /// \return The maximum anti-aliasing level supported by the system + /// + //////////////////////////////////////////////////////////// + static unsigned int getMaximumAntialiasingLevel(); + private: //////////////////////////////////////////////////////////// /// \brief Create the render texture implementation /// - /// \param width Width of the texture to render to - /// \param height Height of the texture to render to - /// \param textureId OpenGL identifier of the target texture - /// \param depthBuffer Is a depth buffer requested? + /// \param width Width of the texture to render to + /// \param height Height of the texture to render to + /// \param textureId OpenGL identifier of the target texture + /// \param settings Context settings to create render-texture with /// /// \return True if creation has been successful /// //////////////////////////////////////////////////////////// - virtual bool create(unsigned int width, unsigned int height, unsigned int textureId, bool depthBuffer); + virtual bool create(unsigned int width, unsigned int height, unsigned int textureId, const ContextSettings& settings); //////////////////////////////////////////////////////////// /// \brief Activate or deactivate the render texture for rendering diff --git a/src/SFML/Graphics/RenderTextureImplFBO.cpp b/src/SFML/Graphics/RenderTextureImplFBO.cpp index 95f94b3f..c424d33f 100644 --- a/src/SFML/Graphics/RenderTextureImplFBO.cpp +++ b/src/SFML/Graphics/RenderTextureImplFBO.cpp @@ -37,9 +37,13 @@ namespace priv { //////////////////////////////////////////////////////////// RenderTextureImplFBO::RenderTextureImplFBO() : -m_context (NULL), -m_frameBuffer(0), -m_depthBuffer(0) +m_context (NULL), +m_frameBuffer (0), +m_multisampleFrameBuffer(0), +m_depthStencilBuffer (0), +m_colorBuffer (0), +m_width (0), +m_height (0) { } @@ -50,11 +54,25 @@ RenderTextureImplFBO::~RenderTextureImplFBO() { m_context->setActive(true); - // Destroy the depth buffer - if (m_depthBuffer) + // Destroy the color buffer + if (m_colorBuffer) { - GLuint depthBuffer = static_cast<GLuint>(m_depthBuffer); - glCheck(GLEXT_glDeleteRenderbuffers(1, &depthBuffer)); + GLuint colorBuffer = static_cast<GLuint>(m_colorBuffer); + glCheck(GLEXT_glDeleteRenderbuffers(1, &colorBuffer)); + } + + // Destroy the depth/stencil buffer + if (m_depthStencilBuffer) + { + GLuint depthStencilBuffer = static_cast<GLuint>(m_depthStencilBuffer); + glCheck(GLEXT_glDeleteRenderbuffers(1, &depthStencilBuffer)); + } + + // Destroy the multisample frame buffer + if (m_multisampleFrameBuffer) + { + GLuint multisampleFrameBuffer = static_cast<GLuint>(m_multisampleFrameBuffer); + glCheck(GLEXT_glDeleteFramebuffers(1, &multisampleFrameBuffer)); } // Destroy the frame buffer @@ -82,52 +100,233 @@ bool RenderTextureImplFBO::isAvailable() //////////////////////////////////////////////////////////// -bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, unsigned int textureId, bool depthBuffer) +unsigned int RenderTextureImplFBO::getMaximumAntialiasingLevel() { + GLint samples = 0; + +#ifndef SFML_OPENGL_ES + + glCheck(glGetIntegerv(GLEXT_GL_MAX_SAMPLES, &samples)); + +#endif + + return static_cast<unsigned int>(samples); +} + + +//////////////////////////////////////////////////////////// +bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, unsigned int textureId, const ContextSettings& settings) +{ + // Store the dimensions + m_width = width; + m_height = height; + + // Disable creation of depth/stencil surfaces in the context + ContextSettings contextSettings(settings); + contextSettings.depthBits = 0; + contextSettings.stencilBits = 0; + contextSettings.antialiasingLevel = 0; + contextSettings.sRgbCapable = false; + // Create the context - m_context = new Context; + m_context = new Context(contextSettings, 1, 1); - // Create the framebuffer object - GLuint frameBuffer = 0; - glCheck(GLEXT_glGenFramebuffers(1, &frameBuffer)); - m_frameBuffer = static_cast<unsigned int>(frameBuffer); - if (!m_frameBuffer) - { - err() << "Impossible to create render texture (failed to create the frame buffer object)" << std::endl; + if (settings.antialiasingLevel && !(GLEXT_framebuffer_multisample && GLEXT_framebuffer_blit)) return false; - } - glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, m_frameBuffer)); - // Create the depth buffer if requested - if (depthBuffer) + if (settings.stencilBits && !GLEXT_packed_depth_stencil) + return false; + +#ifndef SFML_OPENGL_ES + + // Check if the requested anti-aliasing level is supported + if (settings.antialiasingLevel) { - GLuint depth = 0; - glCheck(GLEXT_glGenRenderbuffers(1, &depth)); - m_depthBuffer = static_cast<unsigned int>(depth); - if (!m_depthBuffer) + GLint samples = 0; + glCheck(glGetIntegerv(GLEXT_GL_MAX_SAMPLES, &samples)); + + if (settings.antialiasingLevel > static_cast<unsigned int>(samples)) { - err() << "Impossible to create render texture (failed to create the attached depth buffer)" << std::endl; + err() << "Impossible to create render texture (unsupported anti-aliasing level)"; + err() << " Requested: " << settings.antialiasingLevel << " Maximum supported: " << samples << std::endl; return false; } - glCheck(GLEXT_glBindRenderbuffer(GLEXT_GL_RENDERBUFFER, m_depthBuffer)); - glCheck(GLEXT_glRenderbufferStorage(GLEXT_GL_RENDERBUFFER, GLEXT_GL_DEPTH_COMPONENT, width, height)); - glCheck(GLEXT_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_DEPTH_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthBuffer)); } - // Link the texture to the frame buffer - glCheck(GLEXT_glFramebufferTexture2D(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0)); +#endif - // A final check, just to be sure... - GLenum status; - glCheck(status = GLEXT_glCheckFramebufferStatus(GLEXT_GL_FRAMEBUFFER)); - if (status != GLEXT_GL_FRAMEBUFFER_COMPLETE) + if (!settings.antialiasingLevel) { - glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, 0)); - err() << "Impossible to create render texture (failed to link the target texture to the frame buffer)" << std::endl; - return false; - } + // Create the framebuffer object + GLuint frameBuffer = 0; + glCheck(GLEXT_glGenFramebuffers(1, &frameBuffer)); + m_frameBuffer = static_cast<unsigned int>(frameBuffer); + if (!m_frameBuffer) + { + err() << "Impossible to create render texture (failed to create the frame buffer object)" << std::endl; + return false; + } + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, m_frameBuffer)); - return true; + // Create the depth/stencil buffer if requested + if (settings.stencilBits) + { + +#ifndef SFML_OPENGL_ES + + GLuint depthStencil = 0; + glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil)); + m_depthStencilBuffer = static_cast<unsigned int>(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_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_DEPTH_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); + glCheck(GLEXT_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_STENCIL_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); +#else + + err() << "Impossible to create render texture (failed to create the attached depth/stencil buffer)" << std::endl; + return false; + +#endif // SFML_OPENGL_ES + + } + else if (settings.depthBits) + { + GLuint depthStencil = 0; + glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil)); + m_depthStencilBuffer = static_cast<unsigned int>(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_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_DEPTH_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); + } + + // Link the texture to the frame buffer + glCheck(GLEXT_glFramebufferTexture2D(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0)); + + // A final check, just to be sure... + GLenum status; + glCheck(status = GLEXT_glCheckFramebufferStatus(GLEXT_GL_FRAMEBUFFER)); + if (status != GLEXT_GL_FRAMEBUFFER_COMPLETE) + { + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, 0)); + err() << "Impossible to create render texture (frame buffer incomplete)" << std::endl; + return false; + } + + return true; + } + else + { + +#ifndef SFML_OPENGL_ES + + // Create the framebuffer object + GLuint frameBuffer = 0; + glCheck(GLEXT_glGenFramebuffers(1, &frameBuffer)); + m_frameBuffer = static_cast<unsigned int>(frameBuffer); + if (!m_frameBuffer) + { + err() << "Impossible to create render texture (failed to create the frame buffer object)" << std::endl; + return false; + } + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, m_frameBuffer)); + + // Link the texture to the frame buffer + glCheck(GLEXT_glFramebufferTexture2D(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0)); + + // A final check, just to be sure... + GLenum status; + glCheck(status = GLEXT_glCheckFramebufferStatus(GLEXT_GL_FRAMEBUFFER)); + if (status != GLEXT_GL_FRAMEBUFFER_COMPLETE) + { + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, 0)); + err() << "Impossible to create render texture (frame buffer incomplete)" << std::endl; + return false; + } + + // Create the multisample framebuffer object + frameBuffer = 0; + glCheck(GLEXT_glGenFramebuffers(1, &frameBuffer)); + m_multisampleFrameBuffer = static_cast<unsigned int>(frameBuffer); + if (!m_multisampleFrameBuffer) + { + err() << "Impossible to create render texture (failed to create the multisample frame buffer object)" << std::endl; + return false; + } + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, m_multisampleFrameBuffer)); + + // Create the multisample color buffer + GLuint color = 0; + glCheck(GLEXT_glGenRenderbuffers(1, &color)); + m_colorBuffer = static_cast<unsigned int>(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_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_COLOR_ATTACHMENT0, GLEXT_GL_RENDERBUFFER, m_colorBuffer)); + + // 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); + 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_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_DEPTH_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); + glCheck(GLEXT_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_STENCIL_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); + } + else if (settings.depthBits) + { + GLuint depthStencil = 0; + glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil)); + m_depthStencilBuffer = static_cast<unsigned int>(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_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_DEPTH_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); + } + + // A final check, just to be sure... + glCheck(status = GLEXT_glCheckFramebufferStatus(GLEXT_GL_FRAMEBUFFER)); + if (status != GLEXT_GL_FRAMEBUFFER_COMPLETE) + { + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, 0)); + err() << "Impossible to create render texture (multisample frame buffer incomplete)" << std::endl; + return false; + } + + return true; + +#else + + err() << "Impossible to create render texture (failed to create the multisample frame buffer object)" << std::endl; + return false; + +#endif // SFML_OPENGL_ES + + } } @@ -141,6 +340,18 @@ bool RenderTextureImplFBO::activate(bool active) //////////////////////////////////////////////////////////// void RenderTextureImplFBO::updateTexture(unsigned int) { + +#ifndef SFML_OPENGL_ES + + if (m_multisampleFrameBuffer) + { + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, m_frameBuffer)); + glCheck(GLEXT_glBlitFramebuffer(0, 0, m_width, m_height, 0, 0, m_width, m_height, GL_COLOR_BUFFER_BIT, GL_NEAREST)); + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, m_multisampleFrameBuffer)); + } + +#endif // SFML_OPENGL_ES + glCheck(glFlush()); } diff --git a/src/SFML/Graphics/RenderTextureImplFBO.hpp b/src/SFML/Graphics/RenderTextureImplFBO.hpp index a72559f3..d2bb71c1 100644 --- a/src/SFML/Graphics/RenderTextureImplFBO.hpp +++ b/src/SFML/Graphics/RenderTextureImplFBO.hpp @@ -66,20 +66,28 @@ public: //////////////////////////////////////////////////////////// static bool isAvailable(); + //////////////////////////////////////////////////////////// + /// \brief Get the maximum anti-aliasing level supported by the system + /// + /// \return The maximum anti-aliasing level supported by the system + /// + //////////////////////////////////////////////////////////// + static unsigned int getMaximumAntialiasingLevel(); + private: //////////////////////////////////////////////////////////// /// \brief Create the render texture implementation /// - /// \param width Width of the texture to render to - /// \param height Height of the texture to render to - /// \param textureId OpenGL identifier of the target texture - /// \param depthBuffer Is a depth buffer requested? + /// \param width Width of the texture to render to + /// \param height Height of the texture to render to + /// \param textureId OpenGL identifier of the target texture + /// \param settings Context settings to create render-texture with /// /// \return True if creation has been successful /// //////////////////////////////////////////////////////////// - virtual bool create(unsigned int width, unsigned int height, unsigned int textureId, bool depthBuffer); + virtual bool create(unsigned int width, unsigned int height, unsigned int textureId, const ContextSettings& settings); //////////////////////////////////////////////////////////// /// \brief Activate or deactivate the render texture for rendering @@ -102,9 +110,13 @@ private: //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - Context* m_context; ///< Needs a separate OpenGL context for not messing up the other ones - unsigned int m_frameBuffer; ///< OpenGL frame buffer object - unsigned int m_depthBuffer; ///< Optional depth buffer attached to the frame buffer + Context* m_context; ///< Needs a separate OpenGL context for not messing up the other ones + unsigned int m_frameBuffer; ///< OpenGL frame buffer object + unsigned int m_multisampleFrameBuffer; ///< Optional OpenGL frame buffer object 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 }; } // namespace priv From 949e7aecae1101348308433ab3758f85ca5e2b9e Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Wed, 21 Mar 2018 22:14:06 +0100 Subject: [PATCH 049/211] Fixed strict aliasing punning warning when generating the key of a glyph in Font.cpp. Fixes #1187 --- src/SFML/Graphics/Font.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/SFML/Graphics/Font.cpp b/src/SFML/Graphics/Font.cpp index e487e073..45f6baf8 100644 --- a/src/SFML/Graphics/Font.cpp +++ b/src/SFML/Graphics/Font.cpp @@ -61,6 +61,21 @@ namespace void close(FT_Stream) { } + + // Helper to intepret memory as a specific type + template <typename T, typename U> + inline T reinterpret(const U& input) + { + T output; + std::memcpy(&output, &input, sizeof(U)); + return output; + } + + // Combine outline thickness, boldness and codepoint into a single 64-bit key + sf::Uint64 combine(float outlineThickness, bool bold, sf::Uint32 codePoint) + { + return (static_cast<sf::Uint64>(reinterpret<sf::Uint32>(outlineThickness)) << 32) | (static_cast<sf::Uint64>(bold) << 31) | codePoint; + } } @@ -332,9 +347,7 @@ const Glyph& Font::getGlyph(Uint32 codePoint, unsigned int characterSize, bool b GlyphTable& glyphs = m_pages[characterSize].glyphs; // Build the key by combining the code point, bold flag, and outline thickness - Uint64 key = (static_cast<Uint64>(*reinterpret_cast<Uint32*>(&outlineThickness)) << 32) - | (static_cast<Uint64>(bold ? 1 : 0) << 31) - | static_cast<Uint64>(codePoint); + Uint64 key = combine(outlineThickness, bold, codePoint); // Search the glyph into the cache GlyphTable::const_iterator it = glyphs.find(key); From fc02cf004a979f1222499a0ccc88ae49e074281d Mon Sep 17 00:00:00 2001 From: Marco Antognini <antognini.marco@gmail.com> Date: Mon, 12 Mar 2018 07:32:51 +0100 Subject: [PATCH 050/211] Remove C++ dialect & std lib selection from Xcode templates --- .../TemplateInfo.plist.in | 78 +++---------------- tools/xcode/templates/readme.txt | 20 ++--- 2 files changed, 18 insertions(+), 80 deletions(-) diff --git a/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in b/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in index 30b6a10c..b0e9acff 100644 --- a/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in +++ b/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in @@ -44,74 +44,6 @@ subject to the following restrictions: <key>Kind</key> <string>Xcode.Xcode3.ProjectTemplateUnitKind</string> - <!-- - OPTIONS - --> - <key>Options</key> - <array> - <dict> - <key>Identifier</key> - <string>compilerSettingsType</string> - - <key>Name</key> - <string>[ADVANCED] C++ Compiler and Standard Library</string> - - <key>Description</key> - <string>If you don't know what is it about, use the default value. Note that you'll need a version of SFML compiled with Clang and libc++ to use C++11!</string> - - <key>Default</key> - <string>C++11 with Clang and libc++</string> - - <key>NotPersisted</key> - <true /> - - <key>Type</key> - <string>popup</string> - - <key>Units</key> - <dict> - <!-- Use Clang and libstdc++ --> - <key>C++98 with Clang and libstdc++</key> - <dict> - <key>Project</key> - <dict> - <key>SharedSettings</key> - <dict> - <key>GCC_VERSION</key> - <string>com.apple.compilers.llvm.clang.1_0</string> - - <key>CLANG_CXX_LANGUAGE_STANDARD</key> - <string>c++98</string> - - <key>CLANG_CXX_LIBRARY</key> - <string>libstdc++</string> - </dict> - </dict> - </dict> - - <!-- Use Clang and libc++ --> - <key>C++11 with Clang and libc++</key> - <dict> - <key>Project</key> - <dict> - <key>SharedSettings</key> - <dict> - <key>GCC_VERSION</key> - <string>com.apple.compilers.llvm.clang.1_0</string> - - <key>CLANG_CXX_LANGUAGE_STANDARD</key> - <string>c++0x</string> - - <key>CLANG_CXX_LIBRARY</key> - <string>libc++</string> - </dict> - </dict> - </dict> - </dict> - </dict> - - </array> - <!-- SETTINGS --> @@ -123,6 +55,16 @@ subject to the following restrictions: <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> diff --git a/tools/xcode/templates/readme.txt b/tools/xcode/templates/readme.txt index 1770cf65..40f55ddb 100644 --- a/tools/xcode/templates/readme.txt +++ b/tools/xcode/templates/readme.txt @@ -27,7 +27,6 @@ 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 your compiler and C++ standard library / dialect. * You can choose with SFML module you want to use into your project. * You automatically get a basic example to test SFML right away. @@ -38,13 +37,10 @@ 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 + - Xcode 4 or greater, up to date; + - the Command Line Tools; + - SFML 2, either as frameworks or dylibs, as described in the official tutorials. -There is one constraint on the installation of SFML: the frameworks needs to be installed in -/Library/Frameworks and the dylibs into /usr/local/lib. You don't need both but make sure they are -in the correct folder. 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 @@ -144,10 +140,10 @@ FAQ * 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 SFML. When you created the project, you might have chosen the wrong C++ compiler & standard - library. You can update your project's build settings; more specifically the Compiler for - C/C++/Objective-C, the C++ language Dialect and the C++ Standard Library. You can find more - information in the getting started tutorial for Mac OS X on the official web site. + 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. From ee08e18726788e4855218fa27319b2313b185d0f Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Tue, 20 Mar 2018 19:46:57 +0100 Subject: [PATCH 051/211] Modernize CMake files --- CMakeLists.txt | 72 ++++++----- cmake/Config.cmake | 11 +- cmake/Macros.cmake | 118 +++++++++++++----- cmake/Modules/FindUDev.cmake | 1 + cmake/toolchains/android.toolchain.cmake | 17 +-- doc/CMakeLists.txt | 4 +- examples/X11/CMakeLists.txt | 10 +- examples/cocoa/CMakeLists.txt | 2 +- examples/ftp/CMakeLists.txt | 2 +- examples/opengl/CMakeLists.txt | 7 +- examples/pong/CMakeLists.txt | 2 +- examples/shader/CMakeLists.txt | 2 +- examples/sockets/CMakeLists.txt | 2 +- examples/sound/CMakeLists.txt | 2 +- examples/sound_capture/CMakeLists.txt | 2 +- examples/voip/CMakeLists.txt | 2 +- examples/win32/CMakeLists.txt | 2 +- examples/window/CMakeLists.txt | 7 +- src/SFML/Audio/CMakeLists.txt | 46 +++---- src/SFML/CMakeLists.txt | 3 - src/SFML/Graphics/CMakeLists.txt | 61 ++++----- src/SFML/Main/CMakeLists.txt | 22 ++-- src/SFML/Network/CMakeLists.txt | 16 ++- src/SFML/System/CMakeLists.txt | 29 ++--- src/SFML/Window/CMakeLists.txt | 85 +++++-------- .../SFML App.xctemplate/TemplateInfo.plist.in | 7 +- 26 files changed, 259 insertions(+), 275 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 47afd9e2..8fc120fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "Android") cmake_minimum_required(VERSION 3.7.2) else() - cmake_minimum_required(VERSION 2.8.3) + cmake_minimum_required(VERSION 3.0.2) endif() # define a macro that helps defining an option @@ -22,9 +22,7 @@ sfml_set_option(CMAKE_BUILD_TYPE Release STRING "Choose the type of build (Debug set(CMAKE_LEGACY_CYGWIN_WIN32 0) # Suppress Mac OS X RPATH warnings and adopt new related behaviors -if(NOT CMAKE_VERSION VERSION_LESS 3.0) - cmake_policy(SET CMP0042 NEW) -endif() +cmake_policy(SET CMP0042 NEW) if (NOT CMAKE_VERSION VERSION_LESS 3.9) cmake_policy(SET CMP0068 NEW) endif() @@ -57,9 +55,6 @@ set(VERSION_MAJOR 2) set(VERSION_MINOR 4) set(VERSION_PATCH 2) -# add the SFML header path -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) - # add an option for choosing the build type (shared or static) if(NOT (SFML_OS_IOS OR SFML_OS_ANDROID)) sfml_set_option(BUILD_SHARED_LIBS TRUE BOOL "TRUE to build SFML as shared libraries, FALSE to build it as static libraries") @@ -97,11 +92,14 @@ 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 frameworks installation (SFML, FLAC, ...) - sfml_set_option(CMAKE_INSTALL_FRAMEWORK_PREFIX "/Library/Frameworks" STRING "Frameworks installation directory") + # 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 "${CMAKE_INSTALL_PREFIX}" PATH "External libraries (FLAC, Freetype, Vorbis, ...) installation directory") endif() # Android options @@ -141,10 +139,20 @@ if(SFML_OS_ANDROID) set(CMAKE_CXX_CREATE_SHARED_LIBRARY_WITHOUT_STL "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") endif() -# define SFML_STATIC if the build type is not set to 'shared' -if(NOT BUILD_SHARED_LIBS) - add_definitions(-DSFML_STATIC) +# Install directories +# For miscellaneous files +if(SFML_OS_WINDOWS OR SFML_OS_IOS) + set(DEFAULT_INSTALL_MISC_DIR .) +elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD) + 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) @@ -408,15 +416,12 @@ else() # install rule install(TARGETS SFML - FRAMEWORK DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX} + FRAMEWORK DESTINATION "." COMPONENT devel) endif() -install(FILES license.md DESTINATION ${INSTALL_MISC_DIR}) -install(FILES readme.md DESTINATION ${INSTALL_MISC_DIR}) -if(NOT SFML_OS_ANDROID) - install(FILES cmake/Modules/FindSFML.cmake DESTINATION ${INSTALL_MISC_DIR}/cmake/Modules) -endif() +install(FILES license.md DESTINATION ${SFML_MISC_INSTALL_PREFIX}) +install(FILES readme.md DESTINATION ${SFML_MISC_INSTALL_PREFIX}) # install 3rd-party libraries and tools if(SFML_OS_WINDOWS) @@ -424,58 +429,57 @@ 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 bin) + install(DIRECTORY extlibs/bin/x86/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/bin) if(SFML_COMPILER_MSVC AND SFML_MSVC_VERSION LESS 14) - install(DIRECTORY extlibs/libs-msvc/x86/ DESTINATION lib) + install(DIRECTORY extlibs/libs-msvc/x86/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib) elseif(SFML_COMPILER_MSVC) - install(DIRECTORY extlibs/libs-msvc-universal/x86/ DESTINATION lib) + install(DIRECTORY extlibs/libs-msvc-universal/x86/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib) else() - install(DIRECTORY extlibs/libs-mingw/x86/ DESTINATION lib) + install(DIRECTORY extlibs/libs-mingw/x86/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib) endif() elseif(ARCH_64BITS) - install(DIRECTORY extlibs/bin/x64/ DESTINATION bin) + install(DIRECTORY extlibs/bin/x64/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/bin) if(SFML_COMPILER_MSVC AND SFML_MSVC_VERSION LESS 14) - install(DIRECTORY extlibs/libs-msvc/x64/ DESTINATION lib) + install(DIRECTORY extlibs/libs-msvc/x64/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib) elseif(SFML_COMPILER_MSVC) - install(DIRECTORY extlibs/libs-msvc-universal/x64/ DESTINATION lib) + install(DIRECTORY extlibs/libs-msvc-universal/x64/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib) else() - install(DIRECTORY extlibs/libs-mingw/x64/ DESTINATION lib) + install(DIRECTORY extlibs/libs-mingw/x64/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib) endif() endif() endif() 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 ${CMAKE_INSTALL_FRAMEWORK_PREFIX}) + install(DIRECTORY extlibs/libs-osx/Frameworks/freetype.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}) 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 ${CMAKE_INSTALL_FRAMEWORK_PREFIX}) + install(DIRECTORY extlibs/libs-osx/Frameworks/FLAC.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}) endif() if(OGG_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/ogg.framework") - install(DIRECTORY extlibs/libs-osx/Frameworks/ogg.framework DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX}) + install(DIRECTORY extlibs/libs-osx/Frameworks/ogg.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}) endif() if(VORBIS_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/vorbis.framework") - install(DIRECTORY extlibs/libs-osx/Frameworks/vorbis.framework DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX}) + install(DIRECTORY extlibs/libs-osx/Frameworks/vorbis.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}) endif() if(VORBISENC_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/vorbisenc.framework") - install(DIRECTORY extlibs/libs-osx/Frameworks/vorbisenc.framework DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX}) + install(DIRECTORY extlibs/libs-osx/Frameworks/vorbisenc.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}) endif() if(VORBISFILE_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/vorbisfile.framework") - install(DIRECTORY extlibs/libs-osx/Frameworks/vorbisfile.framework DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX}) + install(DIRECTORY extlibs/libs-osx/Frameworks/vorbisfile.framework DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}) endif() if(OPENAL_LIBRARY STREQUAL "${SFML_SOURCE_DIR}/extlibs/libs-osx/Frameworks/OpenAL.framework") - install(DIRECTORY "${OPENAL_LIBRARY}" DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX}) + install(DIRECTORY "${OPENAL_LIBRARY}" DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}) endif() endif() diff --git a/cmake/Config.cmake b/cmake/Config.cmake index ca841d38..cebf3deb 100644 --- a/cmake/Config.cmake +++ b/cmake/Config.cmake @@ -81,7 +81,7 @@ 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 STREQUAL "Clang") +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) @@ -117,12 +117,3 @@ else() message(FATAL_ERROR "Unsupported compiler") return() endif() - -# define the install directory for miscellaneous files -if(SFML_OS_WINDOWS OR SFML_OS_IOS) - set(INSTALL_MISC_DIR .) -elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_MACOSX) - set(INSTALL_MISC_DIR share/SFML) -elseif(SFML_OS_ANDROID) - set(INSTALL_MISC_DIR ${CMAKE_ANDROID_NDK}/sources/third_party/sfml) -endif() diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index fa2b78b3..62f439e8 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -6,9 +6,9 @@ function(sfml_set_stdlib target) # for gcc >= 4.0 on Windows, apply the SFML_USE_STATIC_STD_LIBS option if it is enabled if(SFML_OS_WINDOWS AND SFML_COMPILER_GCC AND NOT SFML_GCC_VERSION VERSION_LESS "4") if(SFML_USE_STATIC_STD_LIBS AND NOT SFML_COMPILER_GCC_TDM) - target_link_libraries(${target} "-static-libgcc" "-static-libstdc++") + target_link_libraries(${target} PRIVATE "-static-libgcc" "-static-libstdc++") elseif(NOT SFML_USE_STATIC_STD_LIBS AND SFML_COMPILER_GCC_TDM) - target_link_libraries(${target} "-shared-libgcc" "-shared-libstdc++") + target_link_libraries(${target} PRIVATE "-shared-libgcc" "-shared-libstdc++") endif() endif() @@ -17,7 +17,7 @@ function(sfml_set_stdlib target) set_property(TARGET ${target} PROPERTY XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") else() target_compile_options(${target} PRIVATE "-stdlib=libc++") - target_link_libraries(${target} "-stdlib=libc++") + target_link_libraries(${target} PRIVATE "-stdlib=libc++") endif() endif() endfunction() @@ -25,15 +25,21 @@ endfunction() # add a new target which is a SFML library # ex: sfml_add_library(sfml-graphics # SOURCES sprite.cpp image.cpp ... -# DEPENDS sfml-window sfml-system -# EXTERNAL_LIBS opengl freetype ...) +# [STATIC]) # Always create a static library and ignore BUILD_SHARED_LIBS macro(sfml_add_library target) # parse the arguments - cmake_parse_arguments(THIS "" "" "SOURCES;DEPENDS;EXTERNAL_LIBS" ${ARGN}) + cmake_parse_arguments(THIS "STATIC" "" "SOURCES" ${ARGN}) + if (NOT "${THIS_UNPARSED_ARGUMENTS}" STREQUAL "") + message(FATAL_ERROR "Extra unparsed arguments when calling sfml_add_library: ${THIS_UNPARSED_ARGUMENTS}") + endif() # create the target - add_library(${target} ${THIS_SOURCES}) + if (THIS_STATIC) + add_library(${target} STATIC ${THIS_SOURCES}) + else() + add_library(${target} ${THIS_SOURCES}) + endif() # define the export symbol of the module string(REPLACE "-" "_" NAME_UPPER "${target}") @@ -41,7 +47,7 @@ macro(sfml_add_library target) set_target_properties(${target} PROPERTIES DEFINE_SYMBOL ${NAME_UPPER}_EXPORTS) # adjust the output file prefix/suffix to match our conventions - if(BUILD_SHARED_LIBS) + if(BUILD_SHARED_LIBS AND NOT THIS_STATIC) if(SFML_OS_WINDOWS) # include the major version number in Windows shared library names (but not import library names) set_target_properties(${target} PROPERTIES DEBUG_POSTFIX -d) @@ -84,7 +90,7 @@ macro(sfml_add_library target) set(SFML_PDB_POSTFIX "") endif() - if(BUILD_SHARED_LIBS) + if(BUILD_SHARED_LIBS AND NOT THIS_STATIC) # DLLs export debug symbols in the linker PDB (the compiler PDB is an intermediate file) set_target_properties(${target} PROPERTIES PDB_NAME "${target}${SFML_PDB_POSTFIX}" @@ -103,13 +109,8 @@ macro(sfml_add_library target) set_target_properties(${target} PROPERTIES COMPILE_FLAGS -fvisibility=hidden) endif() - # link the target to its SFML dependencies - if(THIS_DEPENDS) - target_link_libraries(${target} ${THIS_DEPENDS}) - endif() - # build frameworks or dylibs - if(SFML_OS_MACOSX AND BUILD_SHARED_LIBS) + if(SFML_OS_MACOSX AND BUILD_SHARED_LIBS AND NOT THIS_STATIC) if(SFML_BUILD_FRAMEWORKS) # adapt target to build frameworks instead of dylibs set_target_properties(${target} PROPERTIES @@ -151,24 +152,36 @@ macro(sfml_add_library target) endif() endif() - # link the target to its external dependencies - if(THIS_EXTERNAL_LIBS) - target_link_libraries(${target} ${THIS_EXTERNAL_LIBS}) - endif() - # add the install rule - install(TARGETS ${target} + install(TARGETS ${target} EXPORT SFMLConfigExport RUNTIME DESTINATION bin COMPONENT bin LIBRARY DESTINATION lib${LIB_SUFFIX} COMPONENT bin ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT devel - FRAMEWORK DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX} COMPONENT bin) + FRAMEWORK DESTINATION "." COMPONENT bin) + + # add <project>/include as public include directory + target_include_directories(${target} + PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> + PRIVATE ${PROJECT_SOURCE_DIR}/src) + + if (SFML_BUILD_FRAMEWORKS) + target_include_directories(${target} INTERFACE $<INSTALL_INTERFACE:SFML.framework>) + else() + target_include_directories(${target} INTERFACE $<INSTALL_INTERFACE:include>) + endif() + + # define SFML_STATIC if the build type is not set to 'shared' + if(NOT BUILD_SHARED_LIBS) + target_compile_definitions(${target} PUBLIC "SFML_STATIC") + endif() + endmacro() # add a new target which is a SFML example # ex: sfml_add_example(ftp # SOURCES ftp.cpp ... # BUNDLE_RESOURCES MainMenu.nib ... # Files to be added in target but not installed next to the executable -# DEPENDS sfml-network sfml-system +# DEPENDS sfml-network # RESOURCES_DIR resources) # A directory to install next to the executable and sources macro(sfml_add_example target) @@ -187,7 +200,7 @@ macro(sfml_add_example target) # create the target if(THIS_GUI_APP AND SFML_OS_WINDOWS AND NOT DEFINED CMAKE_CONFIGURATION_TYPES AND ${CMAKE_BUILD_TYPE} STREQUAL "Release") add_executable(${target} WIN32 ${target_input}) - target_link_libraries(${target} sfml-main) + target_link_libraries(${target} PRIVATE sfml-main) else() add_executable(${target} ${target_input}) endif() @@ -203,17 +216,17 @@ macro(sfml_add_example target) # link the target to its SFML dependencies if(THIS_DEPENDS) - target_link_libraries(${target} ${THIS_DEPENDS}) + target_link_libraries(${target} PRIVATE ${THIS_DEPENDS}) endif() # add the install rule install(TARGETS ${target} - RUNTIME DESTINATION ${INSTALL_MISC_DIR}/examples/${target} COMPONENT examples - BUNDLE DESTINATION ${INSTALL_MISC_DIR}/examples/${target} COMPONENT examples) + RUNTIME DESTINATION ${SFML_MISC_INSTALL_PREFIX}/examples/${target} COMPONENT examples + BUNDLE DESTINATION ${SFML_MISC_INSTALL_PREFIX}/examples/${target} COMPONENT examples) # install the example's source code install(FILES ${THIS_SOURCES} - DESTINATION ${INSTALL_MISC_DIR}/examples/${target} + DESTINATION ${SFML_MISC_INSTALL_PREFIX}/examples/${target} COMPONENT examples) if (THIS_RESOURCES_DIR) @@ -224,8 +237,55 @@ macro(sfml_add_example target) message(FATAL_ERROR "Given resources directory to install does not exist: ${THIS_RESOURCES_DIR}") endif() install(DIRECTORY ${THIS_RESOURCES_DIR} - DESTINATION ${INSTALL_MISC_DIR}/examples/${target} + DESTINATION ${SFML_MISC_INSTALL_PREFIX}/examples/${target} COMPONENT examples) endif() endmacro() + + +# 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/") + 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() + + 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}") + 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}>") + endforeach() + endif() + + if (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() +endfunction() + diff --git a/cmake/Modules/FindUDev.cmake b/cmake/Modules/FindUDev.cmake index 9ae3cf80..467bd693 100644 --- a/cmake/Modules/FindUDev.cmake +++ b/cmake/Modules/FindUDev.cmake @@ -50,3 +50,4 @@ ELSE (UDEV_FOUND) ENDIF (UDev_FIND_REQUIRED) ENDIF (UDEV_FOUND) +mark_as_advanced(UDEV_INCLUDE_DIR UDEV_LIBRARIES) diff --git a/cmake/toolchains/android.toolchain.cmake b/cmake/toolchains/android.toolchain.cmake index 56e70cba..ee28e51e 100644 --- a/cmake/toolchains/android.toolchain.cmake +++ b/cmake/toolchains/android.toolchain.cmake @@ -810,20 +810,16 @@ else() 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} ) - if( CMAKE_VERSION VERSION_GREATER "2.8" ) - list( SORT ANDROID_SUPPORTED_NATIVE_API_LEVELS ) - set_property( CACHE ANDROID_NATIVE_API_LEVEL PROPERTY STRINGS ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} ) - endif() + 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 ) -if( CMAKE_VERSION VERSION_GREATER "2.8" ) - list( SORT ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME} ) - set_property( CACHE ANDROID_ABI PROPERTY STRINGS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME}} ) -endif() +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) @@ -1137,9 +1133,6 @@ if( NOT CMAKE_C_COMPILER ) endif() set( _CMAKE_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_MACHINE_NAME}-" ) -if( CMAKE_VERSION VERSION_LESS 2.8.5 ) - set( CMAKE_ASM_COMPILER_ARG1 "-c" ) -endif() if( APPLE ) find_program( CMAKE_INSTALL_NAME_TOOL NAMES install_name_tool ) if( NOT CMAKE_INSTALL_NAME_TOOL ) @@ -1443,7 +1436,7 @@ if( MIPS AND BUILD_WITH_ANDROID_NDK AND ANDROID_NDK_RELEASE STREQUAL "r8" ) endif() # pie/pic -if( NOT (ANDROID_NATIVE_API_LEVEL LESS 16) AND (NOT DEFINED ANDROID_APP_PIE OR ANDROID_APP_PIE) AND (CMAKE_VERSION VERSION_GREATER 2.8.8) ) +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() diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index df02266d..123b44cf 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -53,10 +53,10 @@ add_custom_target(doc ALL # setup install rules install(DIRECTORY ${DOXYGEN_OUTPUT_DIR}/html - DESTINATION ${INSTALL_MISC_DIR}/doc + DESTINATION ${SFML_MISC_INSTALL_PREFIX}/doc COMPONENT doc) if(DOXYGEN_HHC_PROGRAM) install(FILES ${DOXYGEN_OUTPUT_DIR}/sfml.chm - DESTINATION ${INSTALL_MISC_DIR}/doc + DESTINATION ${SFML_MISC_INSTALL_PREFIX}/doc COMPONENT doc) endif() diff --git a/examples/X11/CMakeLists.txt b/examples/X11/CMakeLists.txt index cc62f48b..27509a62 100644 --- a/examples/X11/CMakeLists.txt +++ b/examples/X11/CMakeLists.txt @@ -4,13 +4,7 @@ set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/X11) # all source files set(SRC ${SRCROOT}/X11.cpp) -# find OpenGL and X11 -find_package(OpenGL REQUIRED) -include_directories(${OPENGL_INCLUDE_DIR}) -find_package(X11 REQUIRED) -include_directories(${X11_INCLUDE_DIR}) - # define the X11 target -sfml_add_example(X11 GUI_APP +sfml_add_example(X11Example GUI_APP SOURCES ${SRC} - DEPENDS sfml-window sfml-system ${OPENGL_LIBRARIES} ${X11_LIBRARIES}) + DEPENDS sfml-window OpenGL X11) diff --git a/examples/cocoa/CMakeLists.txt b/examples/cocoa/CMakeLists.txt index 22b9f94a..ff63cc07 100644 --- a/examples/cocoa/CMakeLists.txt +++ b/examples/cocoa/CMakeLists.txt @@ -58,4 +58,4 @@ sfml_add_example(cocoa set_target_properties(cocoa PROPERTIES MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST ${SRCROOT}/resources/Cocoa-Info.plist) -target_link_libraries(cocoa "-framework Cocoa -framework Foundation") +target_link_libraries(cocoa PRIVATE "-framework Cocoa" "-framework Foundation" sfml-graphics) diff --git a/examples/ftp/CMakeLists.txt b/examples/ftp/CMakeLists.txt index b154e5e0..a65cb67e 100644 --- a/examples/ftp/CMakeLists.txt +++ b/examples/ftp/CMakeLists.txt @@ -7,4 +7,4 @@ set(SRC ${SRCROOT}/Ftp.cpp) # define the ftp target sfml_add_example(ftp SOURCES ${SRC} - DEPENDS sfml-network sfml-system) + DEPENDS sfml-network) diff --git a/examples/opengl/CMakeLists.txt b/examples/opengl/CMakeLists.txt index 14fad5de..9b8ad49c 100644 --- a/examples/opengl/CMakeLists.txt +++ b/examples/opengl/CMakeLists.txt @@ -4,13 +4,8 @@ set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/opengl) # all source files set(SRC ${SRCROOT}/OpenGL.cpp) -# find OpenGL -find_package(OpenGL REQUIRED) -include_directories(${OPENGL_INCLUDE_DIR}) -set(ADDITIONAL_LIBRARIES ${OPENGL_LIBRARIES}) - # define the opengl target sfml_add_example(opengl GUI_APP SOURCES ${SRC} - DEPENDS sfml-graphics sfml-window sfml-system ${ADDITIONAL_LIBRARIES} + DEPENDS sfml-graphics OpenGL RESOURCES_DIR resources) diff --git a/examples/pong/CMakeLists.txt b/examples/pong/CMakeLists.txt index 31334fa1..a20f3b19 100644 --- a/examples/pong/CMakeLists.txt +++ b/examples/pong/CMakeLists.txt @@ -7,5 +7,5 @@ set(SRC ${SRCROOT}/Pong.cpp) # define the pong target sfml_add_example(pong GUI_APP SOURCES ${SRC} - DEPENDS sfml-audio sfml-graphics sfml-window sfml-system + DEPENDS sfml-audio sfml-graphics RESOURCES_DIR resources) diff --git a/examples/shader/CMakeLists.txt b/examples/shader/CMakeLists.txt index a90b2c95..600cb4d1 100644 --- a/examples/shader/CMakeLists.txt +++ b/examples/shader/CMakeLists.txt @@ -9,5 +9,5 @@ set(SRC # define the shader target sfml_add_example(shader GUI_APP SOURCES ${SRC} - DEPENDS sfml-graphics sfml-window sfml-system + DEPENDS sfml-graphics RESOURCES_DIR resources) diff --git a/examples/sockets/CMakeLists.txt b/examples/sockets/CMakeLists.txt index b9f4b648..eebc91db 100644 --- a/examples/sockets/CMakeLists.txt +++ b/examples/sockets/CMakeLists.txt @@ -9,4 +9,4 @@ set(SRC ${SRCROOT}/Sockets.cpp # define the sockets target sfml_add_example(sockets SOURCES ${SRC} - DEPENDS sfml-network sfml-system) + DEPENDS sfml-network) diff --git a/examples/sound/CMakeLists.txt b/examples/sound/CMakeLists.txt index 99c11ca1..d3875a6f 100644 --- a/examples/sound/CMakeLists.txt +++ b/examples/sound/CMakeLists.txt @@ -7,5 +7,5 @@ set(SRC ${SRCROOT}/Sound.cpp) # define the sound target sfml_add_example(sound SOURCES ${SRC} - DEPENDS sfml-audio sfml-system + DEPENDS sfml-audio RESOURCES_DIR resources) diff --git a/examples/sound_capture/CMakeLists.txt b/examples/sound_capture/CMakeLists.txt index e62b3b3b..e2c457f8 100644 --- a/examples/sound_capture/CMakeLists.txt +++ b/examples/sound_capture/CMakeLists.txt @@ -7,4 +7,4 @@ set(SRC ${SRCROOT}/SoundCapture.cpp) # define the sound-capture target sfml_add_example(sound-capture SOURCES ${SRC} - DEPENDS sfml-audio sfml-system) + DEPENDS sfml-audio) diff --git a/examples/voip/CMakeLists.txt b/examples/voip/CMakeLists.txt index 0e4e710c..66bc0747 100644 --- a/examples/voip/CMakeLists.txt +++ b/examples/voip/CMakeLists.txt @@ -9,4 +9,4 @@ set(SRC ${SRCROOT}/VoIP.cpp # define the voip target sfml_add_example(voip SOURCES ${SRC} - DEPENDS sfml-audio sfml-network sfml-system) + DEPENDS sfml-audio sfml-network) diff --git a/examples/win32/CMakeLists.txt b/examples/win32/CMakeLists.txt index 1f970600..bd952c5e 100644 --- a/examples/win32/CMakeLists.txt +++ b/examples/win32/CMakeLists.txt @@ -7,5 +7,5 @@ set(SRC ${SRCROOT}/Win32.cpp) # define the win32 target sfml_add_example(win32 GUI_APP SOURCES ${SRC} - DEPENDS sfml-graphics sfml-window sfml-system + DEPENDS sfml-graphics RESOURCES_DIR resources) diff --git a/examples/window/CMakeLists.txt b/examples/window/CMakeLists.txt index 2ce61a07..b106c043 100644 --- a/examples/window/CMakeLists.txt +++ b/examples/window/CMakeLists.txt @@ -4,12 +4,7 @@ set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/window) # all source files set(SRC ${SRCROOT}/Window.cpp) -# find OpenGL -find_package(OpenGL REQUIRED) -include_directories(${OPENGL_INCLUDE_DIR}) -set(ADDITIONAL_LIBRARIES ${OPENGL_LIBRARIES}) - # define the window target sfml_add_example(window GUI_APP SOURCES ${SRC} - DEPENDS sfml-window sfml-system ${ADDITIONAL_LIBRARIES}) + DEPENDS sfml-window OpenGL) diff --git a/src/SFML/Audio/CMakeLists.txt b/src/SFML/Audio/CMakeLists.txt index 65c0fc8f..420e13b5 100644 --- a/src/SFML/Audio/CMakeLists.txt +++ b/src/SFML/Audio/CMakeLists.txt @@ -66,35 +66,25 @@ elseif(SFML_OS_ANDROID) endif() # find external libraries -if(SFML_OS_IOS) - find_host_package(OpenAL REQUIRED) - find_host_package(Vorbis REQUIRED) - find_host_package(FLAC REQUIRED) -else() - find_package(OpenAL REQUIRED) - find_package(Vorbis REQUIRED) - find_package(FLAC REQUIRED) -endif() +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(FLAC INCLUDE "FLAC_INCLUDE_DIR" LINK "FLAC_LIBRARY") -include_directories(${OPENAL_INCLUDE_DIR}) -include_directories(${VORBIS_INCLUDE_DIRS}) -include_directories(${FLAC_INCLUDE_DIR}) -add_definitions(-DOV_EXCLUDE_STATIC_CALLBACKS) # avoids warnings in vorbisfile.h -add_definitions(-DFLAC__NO_DLL) - -# build the list of external libraries to link -if(SFML_OS_IOS) - list(APPEND AUDIO_EXT_LIBS "-framework OpenAL") -else() - list(APPEND AUDIO_EXT_LIBS ${OPENAL_LIBRARY}) -endif() -if(SFML_OS_ANDROID) - list(APPEND AUDIO_EXT_LIBS android OpenSLES) -endif() -list(APPEND AUDIO_EXT_LIBS ${VORBIS_LIBRARIES} ${FLAC_LIBRARY}) +# avoids warnings in vorbisfile.h +target_compile_definitions(Vorbis INTERFACE "OV_EXCLUDE_STATIC_CALLBACKS") +target_compile_definitions(FLAC INTERFACE "FLAC__NO_DLL") # define the sfml-audio target sfml_add_library(sfml-audio - SOURCES ${SRC} ${CODECS_SRC} - DEPENDS sfml-system - EXTERNAL_LIBS ${AUDIO_EXT_LIBS}) + SOURCES ${SRC} ${CODECS_SRC}) + +# setup dependencies +target_link_libraries(sfml-audio PRIVATE OpenAL) + +if(SFML_OS_ANDROID) + target_link_libraries(sfml-audio PRIVATE android OpenSLES) +endif() + +target_link_libraries(sfml-audio + PUBLIC sfml-system + PRIVATE Vorbis FLAC) diff --git a/src/SFML/CMakeLists.txt b/src/SFML/CMakeLists.txt index 30f674af..25a5bb1c 100644 --- a/src/SFML/CMakeLists.txt +++ b/src/SFML/CMakeLists.txt @@ -39,9 +39,6 @@ elseif(SFML_OS_ANDROID) set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-android/${CMAKE_ANDROID_ARCH_ABI}") endif() -# add the SFML sources path -include_directories(${PROJECT_SOURCE_DIR}/src) - # define the path of our additional CMake modules set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules/") diff --git a/src/SFML/Graphics/CMakeLists.txt b/src/SFML/Graphics/CMakeLists.txt index 42d34c9c..883c7581 100644 --- a/src/SFML/Graphics/CMakeLists.txt +++ b/src/SFML/Graphics/CMakeLists.txt @@ -88,8 +88,16 @@ set(RENDER_TEXTURE_SRC ) source_group("render texture" FILES ${RENDER_TEXTURE_SRC}) + +# define the sfml-graphics target +sfml_add_library(sfml-graphics + SOURCES ${SRC} ${DRAWABLES_SRC} ${RENDER_TEXTURE_SRC} ${STB_SRC}) + +# setup dependencies +target_link_libraries(sfml-graphics PUBLIC sfml-window) + # stb_image sources -include_directories("${PROJECT_SOURCE_DIR}/extlibs/headers/stb_image") +target_include_directories(sfml-graphics PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/stb_image") # let CMake know about our additional graphics libraries paths if(SFML_OS_WINDOWS) @@ -104,53 +112,36 @@ elseif(SFML_OS_ANDROID) endif() # find external libraries -if(NOT SFML_OPENGL_ES) - find_package(OpenGL REQUIRED) +if(SFML_OPENGL_ES) if(SFML_OS_LINUX) - find_package(X11 REQUIRED) + 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() - include_directories(${FREETYPE_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIR}) -endif() -if(SFML_OPENGL_ES AND SFML_OS_LINUX) - find_package(EGL REQUIRED) - find_package(GLES REQUIRED) - include_directories(${EGL_INCLUDE_DIR} ${GLES_INCLUDE_DIR}) -endif() -if(SFML_OS_IOS) - find_host_package(Freetype REQUIRED) else() - find_package(Freetype REQUIRED) -endif() -include_directories(${FREETYPE_INCLUDE_DIRS}) + # Target OpenGL already defined for Window component so no sfml_find_package() here + target_link_libraries(sfml-graphics PRIVATE OpenGL) -# build the list of external libraries to link -if(NOT SFML_OPENGL_ES) - list(APPEND GRAPHICS_EXT_LIBS ${OPENGL_gl_LIBRARY}) if(SFML_OS_LINUX) - list(APPEND GRAPHICS_EXT_LIBS ${X11_LIBRARIES}) + # Target X11 already defined for Window component so no sfml_find_package() here + target_link_libraries(sfml-graphics PRIVATE X11) endif() endif() -if(SFML_OPENGL_ES AND SFML_OS_LINUX) - list(APPEND GRAPHICS_EXT_LIBS ${EGL_LIBRARY} ${GLES_LIBRARY}) + +if(SFML_OS_ANDROID) + target_link_libraries(sfml-graphics PRIVATE z EGL GLESv1_CM) endif() -if(SFML_OS_IOS) - list(APPEND GRAPHICS_EXT_LIBS "-framework OpenGLES") -elseif(SFML_OS_ANDROID) - list(APPEND GRAPHICS_EXT_LIBS z) -endif() -list(APPEND GRAPHICS_EXT_LIBS ${FREETYPE_LIBRARY}) + +sfml_find_package(Freetype INCLUDE "FREETYPE_INCLUDE_DIRS" LINK "FREETYPE_LIBRARY") +target_link_libraries(sfml-graphics PRIVATE Freetype) # add preprocessor symbols -add_definitions(-DSTBI_FAILURE_USERMSG) +target_compile_definitions(sfml-graphics PRIVATE "STBI_FAILURE_USERMSG") # ImageLoader.cpp must be compiled with the -fno-strict-aliasing # when gcc is used; otherwise saving PNGs may crash in stb_image_write if(SFML_COMPILER_GCC) set_source_files_properties(${SRCROOT}/ImageLoader.cpp PROPERTIES COMPILE_FLAGS -fno-strict-aliasing) endif() - -# define the sfml-graphics target -sfml_add_library(sfml-graphics - SOURCES ${SRC} ${DRAWABLES_SRC} ${RENDER_TEXTURE_SRC} ${STB_SRC} - DEPENDS sfml-window sfml-system - EXTERNAL_LIBS ${GRAPHICS_EXT_LIBS}) diff --git a/src/SFML/Main/CMakeLists.txt b/src/SFML/Main/CMakeLists.txt index d18ee409..6542e591 100644 --- a/src/SFML/Main/CMakeLists.txt +++ b/src/SFML/Main/CMakeLists.txt @@ -12,26 +12,20 @@ elseif(SFML_OS_ANDROID) else() return() endif() -source_group("" FILES ${SRC}) # define the sfml-main target -add_library(sfml-main STATIC ${SRC}) +sfml_add_library(sfml-main STATIC SOURCES ${SRC}) -# set the debug suffix -set_target_properties(sfml-main PROPERTIES DEBUG_POSTFIX -d) - -# insert the major version number in the output filename -set_target_properties(sfml-main PROPERTIES OUTPUT_NAME "sfml-main") - -# set the target's folder (for IDEs that support it, e.g. Visual Studio) -set_target_properties(sfml-main PROPERTIES FOLDER "SFML") - -# setup the install rule -install(TARGETS sfml-main ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT devel) +# overwrite sfml-main suffix for backward compatibility with FindSFML.cmake +set_target_properties(sfml-main PROPERTIES + DEBUG_POSTFIX -d + RELEASE_POSTFIX "" + MINSIZEREL_POSTFIX "" + RELWITHDEBINFO_POSTFIX "") # because of a current limitation on Android (which prevents one library # from depending on shared libraries), we need a boostrap activity which # will load our shared libraries manually if(SFML_OS_ANDROID) - sfml_add_library(sfml-activity SOURCES ${PROJECT_SOURCE_DIR}/src/SFML/Main/SFMLActivity.cpp) + sfml_add_library(sfml-activity SOURCES ${SRCROOT}/SFMLActivity.cpp) endif() diff --git a/src/SFML/Network/CMakeLists.txt b/src/SFML/Network/CMakeLists.txt index d1ff7572..6626d734 100644 --- a/src/SFML/Network/CMakeLists.txt +++ b/src/SFML/Network/CMakeLists.txt @@ -44,14 +44,12 @@ endif() source_group("" FILES ${SRC}) -# build the list of external libraries to link -set(NETWORK_EXT_LIBS) -if(SFML_OS_WINDOWS) - set(NETWORK_EXT_LIBS ${NETWORK_EXT_LIBS} ws2_32) -endif() - # define the sfml-network target sfml_add_library(sfml-network - SOURCES ${SRC} - DEPENDS sfml-system - EXTERNAL_LIBS ${NETWORK_EXT_LIBS}) + SOURCES ${SRC}) + +# setup dependencies +target_link_libraries(sfml-network PUBLIC sfml-system) +if(SFML_OS_WINDOWS) + target_link_libraries(sfml-network PRIVATE ws2_32) +endif() diff --git a/src/SFML/System/CMakeLists.txt b/src/SFML/System/CMakeLists.txt index 54da9a07..d1b712d8 100644 --- a/src/SFML/System/CMakeLists.txt +++ b/src/SFML/System/CMakeLists.txt @@ -85,21 +85,18 @@ else() source_group("unix" FILES ${PLATFORM_SRC}) endif() -# build the list of external libraries to link -if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_MACOSX) - list(APPEND SYSTEM_EXT_LIBS pthread) -endif() -if(SFML_OS_LINUX) - list(APPEND SYSTEM_EXT_LIBS rt) -endif() -if(SFML_OS_WINDOWS) - list(APPEND SYSTEM_EXT_LIBS winmm) -endif() -if(SFML_OS_ANDROID) - list(APPEND SYSTEM_EXT_LIBS android log) -endif() - # define the sfml-system target sfml_add_library(sfml-system - SOURCES ${SRC} ${PLATFORM_SRC} - EXTERNAL_LIBS ${SYSTEM_EXT_LIBS}) + SOURCES ${SRC} ${PLATFORM_SRC}) + +# setup dependencies +if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_MACOSX) + target_link_libraries(sfml-system PRIVATE pthread) +endif() +if(SFML_OS_LINUX) + target_link_libraries(sfml-system PRIVATE rt) +elseif(SFML_OS_WINDOWS) + target_link_libraries(sfml-system PRIVATE winmm) +elseif(SFML_OS_ANDROID) + target_link_libraries(sfml-system PRIVATE android log) +endif() diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index 570d6b13..55083dbd 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -218,70 +218,53 @@ elseif(SFML_OS_ANDROID) source_group("android" FILES ${PLATFORM_SRC}) endif() -# find external libraries +# define the sfml-window target +sfml_add_library(sfml-window + SOURCES ${SRC} ${PLATFORM_SRC}) +target_link_libraries(sfml-window PUBLIC sfml-system) + +# find and setup usage for external libraries if(SFML_OS_LINUX OR SFML_OS_FREEBSD) - find_package(X11 REQUIRED) - if(NOT X11_FOUND) - message(FATAL_ERROR "X11 library not found") + sfml_find_package(X11 INCLUDE "X11_INCLUDE_DIR" LINK "X11_X11_LIB" "X11_Xrandr_LIB") + target_link_libraries(sfml-window PRIVATE X11) +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(NOT X11_Xrandr_FOUND) - message(FATAL_ERROR "Xrandr library not found") - endif() - include_directories(${X11_INCLUDE_DIR}) -endif() -if(NOT SFML_OPENGL_ES) - find_package(OpenGL REQUIRED) - include_directories(${OPENGL_INCLUDE_DIR}) -endif() -if(SFML_OPENGL_ES AND SFML_OS_LINUX) - find_package(EGL REQUIRED) - find_package(GLES REQUIRED) - include_directories(${EGL_INCLUDE_DIR} ${GLES_INCLUDE_DIR}) -endif() -if(SFML_OS_LINUX) - find_package(UDev REQUIRED) - if(NOT UDEV_FOUND) - message(FATAL_ERROR "udev library not found") - endif() - include_directories(${UDEV_INCLUDE_DIR}) +else() + sfml_find_package(OpenGL INCLUDE "OPENGL_INCLUDE_DIR" LINK "OPENGL_gl_LIBRARY") + target_link_libraries(sfml-window PRIVATE OpenGL) endif() + if(SFML_OS_WINDOWS AND NOT SFML_COMPILER_MSVC) include(CheckIncludeFile) check_include_file(dinput.h DINPUT_H_FOUND) if(NOT DINPUT_H_FOUND) - include_directories("${PROJECT_SOURCE_DIR}/extlibs/headers/mingw") + target_include_directories(sfml-window PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/mingw") 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() -# build the list of external libraries to link -if(SFML_OS_WINDOWS) - list(APPEND WINDOW_EXT_LIBS winmm gdi32) -elseif(SFML_OS_LINUX) - list(APPEND WINDOW_EXT_LIBS ${X11_X11_LIB} ${X11_Xrandr_LIB} ${UDEV_LIBRARIES}) +if(SFML_OS_LINUX) + sfml_find_package(UDev INCLUDE "UDEV_INCLUDE_DIR" LINK "UDEV_LIBRARIES") + target_link_libraries(sfml-window PRIVATE UDev) +elseif(SFML_OS_WINDOWS) + target_link_libraries(sfml-window PRIVATE winmm gdi32) elseif(SFML_OS_FREEBSD) - list(APPEND WINDOW_EXT_LIBS ${X11_X11_LIB} ${X11_Xrandr_LIB} usbhid) + target_link_libraries(sfml-window PRIVATE usbhid) elseif(SFML_OS_MACOSX) - list(APPEND WINDOW_EXT_LIBS "-framework Foundation -framework AppKit -framework IOKit -framework Carbon") + target_link_libraries(sfml-window PRIVATE "-framework Foundation" "-framework AppKit" "-framework IOKit" "-framework Carbon") elseif(SFML_OS_IOS) - list(APPEND WINDOW_EXT_LIBS "-framework Foundation -framework UIKit -framework CoreGraphics -framework QuartzCore -framework CoreMotion") + target_link_libraries(sfml-window PRIVATE "-framework Foundation" "-framework UIKit" "-framework CoreGraphics" "-framework QuartzCore" "-framework CoreMotion") elseif(SFML_OS_ANDROID) - list(APPEND WINDOW_EXT_LIBS android) + target_link_libraries(sfml-window PRIVATE android) endif() -if(SFML_OPENGL_ES) - if(SFML_OS_LINUX) - list(APPEND WINDOW_EXT_LIBS ${EGL_LIBRARY} ${GLES_LIBRARY}) - elseif(SFML_OS_IOS) - list(APPEND WINDOW_EXT_LIBS "-framework OpenGLES") - elseif(SFML_OS_ANDROID) - list(APPEND WINDOW_EXT_LIBS EGL GLESv1_CM) - endif() -else() - list(APPEND WINDOW_EXT_LIBS ${OPENGL_gl_LIBRARY}) -endif() - -# define the sfml-window target -sfml_add_library(sfml-window - SOURCES ${SRC} ${PLATFORM_SRC} - DEPENDS sfml-system - EXTERNAL_LIBS ${WINDOW_EXT_LIBS}) diff --git a/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in index 624afefe..3a7cfd0e 100644 --- a/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in +++ b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in @@ -146,7 +146,8 @@ subject to the following restrictions: # If you're using static libraries (which is not recommended) you should remove this script from your project. # SETTINGS -CMAKE_INSTALL_FRAMEWORK_PREFIX="@CMAKE_INSTALL_FRAMEWORK_PREFIX@" +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/" @@ -231,11 +232,11 @@ require () # $1 is a SFML module like 'system' or 'audio' # copy "FLAC" "ogg" "vorbis" "vorbisenc" "vorbisfile" "OpenAL" frameworks too for f in "FLAC" "ogg" "vorbis" "vorbisenc" "vorbisfile" "OpenAL" do - copy "$CMAKE_INSTALL_FRAMEWORK_PREFIX/$f.framework" "$dest/$f.framework" + copy "$SFML_DEPENDENCIES_INSTALL_PREFIX/$f.framework" "$dest/$f.framework" done elif [ "$1" = "graphics" ] then - copy "$CMAKE_INSTALL_FRAMEWORK_PREFIX/freetype.framework" "$dest/freetype.framework" + copy "$SFML_DEPENDENCIES_INSTALL_PREFIX/freetype.framework" "$dest/freetype.framework" fi fi } From a94b3e9e24fc0f23f6e21cffa730d1cadc7e80f3 Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Tue, 20 Mar 2018 19:47:29 +0100 Subject: [PATCH 052/211] Add support for SFMLConfig.cmake --- CMakeLists.txt | 2 + cmake/Macros.cmake | 44 ++++++++ cmake/SFMLConfig.cmake.in | 148 ++++++++++++++++++++++++++ cmake/SFMLConfigDependencies.cmake.in | 80 ++++++++++++++ 4 files changed, 274 insertions(+) create mode 100644 cmake/SFMLConfig.cmake.in create mode 100644 cmake/SFMLConfigDependencies.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 8fc120fb..a2f4d2f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -530,3 +530,5 @@ elseif(SFML_OS_ANDROID) install(FILES src/SFML/Android.mk DESTINATION .) endif() + +sfml_export_targets() diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 62f439e8..0221b4d1 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -287,5 +287,49 @@ function(sfml_find_package) target_link_libraries(${target} INTERFACE "$<BUILD_INTERFACE:${link_item}>") endforeach() endif() + install(TARGETS ${target} EXPORT SFMLConfigExport) +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) + # CMAKE_CURRENT_LIST_DIR or CMAKE_CURRENT_SOURCE_DIR not usable for files that are to be included like this one + set(CURRENT_DIR "${PROJECT_SOURCE_DIR}/cmake") + + include(CMakePackageConfigHelpers) + write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/SFMLConfigVersion.cmake" + VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} + COMPATIBILITY SameMajorVersion) + + if (BUILD_SHARED_LIBS) + set(config_name "Shared") + else() + set(config_name "Static") + endif() + set(targets_config_filename "SFML${config_name}Targets.cmake") + + export(EXPORT SFMLConfigExport + FILE "${CMAKE_CURRENT_BINARY_DIR}/${targets_config_filename}") + + if (SFML_BUILD_FRAMEWORKS) + set(config_package_location "SFML.framework/Resources/CMake") + else() + set(config_package_location lib/cmake/SFML) + endif() + configure_package_config_file("${CURRENT_DIR}/SFMLConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/SFMLConfig.cmake" + INSTALL_DESTINATION "${config_package_location}") + configure_package_config_file("${CURRENT_DIR}/SFMLConfigDependencies.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/SFMLConfigDependencies.cmake" + INSTALL_DESTINATION "${config_package_location}") + + + install(EXPORT SFMLConfigExport + FILE ${targets_config_filename} + DESTINATION ${config_package_location}) + + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/SFMLConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/SFMLConfigDependencies.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/SFMLConfigVersion.cmake" + DESTINATION ${config_package_location} + COMPONENT devel) endfunction() diff --git a/cmake/SFMLConfig.cmake.in b/cmake/SFMLConfig.cmake.in new file mode 100644 index 00000000..ce819534 --- /dev/null +++ b/cmake/SFMLConfig.cmake.in @@ -0,0 +1,148 @@ +# This script provides the SFML libraries as imported targets +# ------------------------------------ +# +# Usage +# ----- +# +# When you try to locate the SFML libraries, you must specify which modules you want to use (system, window, graphics, network, audio, main). +# If none is given, no imported target will be created and you won't be able to link to SFML libraries. +# example: +# find_package(SFML COMPONENTS graphics window system) # find the graphics, window and system modules +# +# You can enforce a specific version, either MAJOR.MINOR or only MAJOR. +# If nothing is specified, the version won't be checked (i.e. any version will be accepted). +# 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 +# +# 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 ...). +# You don't need to deal with SFML's dependencies when linking your targets against SFML libraries, +# they will all be configured automatically, even if you use SFML static libraries. +# example: +# set(SFML_STATIC_LIBRARIES TRUE) +# find_package(SFML 2 COMPONENTS network system) +# +# On macOS by default CMake will search for frameworks. If you want to use static libraries and have installed +# both SFML frameworks and SFML static libraries, your must set CMAKE_FIND_FRAMEWORK to "NEVER" or "LAST" +# in addition to setting SFML_STATIC_LIBRARIES to TRUE. Otherwise CMake will check the frameworks bundle config and +# fail after finding out that it does not provide static libraries. Please refer to CMake documentation for more details. +# +# Additionally, keep in mind that SFML frameworks are only available as release libraries unlike dylibs which +# are available for both release and debug modes. +# +# If SFML is not installed in a standard path, you can use the SFML_DIR CMake variable +# to tell CMake where SFML's config file is located (PREFIX/lib/cmake/SFML for a library-based installation, +# and PREFIX/SFML.framework/Resources/CMake on macOS for a framework-based installation). +# +# Output +# ------ +# +# This script defines the following variables: +# - For each specified module XXX (system, window, graphics, network, audio, main): +# - SFML_XXX_FOUND: true if either the debug or release library of the xxx module is found +# - SFML_FOUND: true if all the required modules are found +# +# And the following targets: +# - For each specified module XXX (system, window, graphics, network, audio, main): +# - sfml-XXX +# The SFML targets are the same for both Debug and Release build configurations and will automatically provide +# correct settings based on your currently active build configuration. The SFML targets name also do not change +# when using dynamic or static SFML libraries. +# +# When linking against a SFML target, you do not need to specify indirect dependencies. For example, linking +# against sfml-graphics will also automatically link against sfml-window and sfml-system. +# +# example: +# find_package(SFML 2 COMPONENTS graphics audio REQUIRED) +# add_executable(myapp ...) +# target_link_libraries(myapp sfml-graphics sfml-audio) + +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}) + + +# Update requested components (eg. request window component if graphics component was requested) +set(FIND_SFML_SYSTEM_DEPENDENCIES "") +set(FIND_SFML_MAIN_DEPENDENCIES "") +set(FIND_SFML_AUDIO_DEPENDENCIES system) +set(FIND_SFML_NETWORK_DEPENDENCIES system) +set(FIND_SFML_WINDOW_DEPENDENCIES system) +set(FIND_SFML_GRAPHICS_DEPENDENCIES window system) +set(FIND_SFML_ADDITIONAL_COMPONENTS "") +foreach(component ${SFML_FIND_COMPONENTS}) + string(TOUPPER "${component}" UPPER_COMPONENT) + list(APPEND FIND_SFML_ADDITIONAL_COMPONENTS ${FIND_SFML_${UPPER_COMPONENT}_DEPENDENCIES}) +endforeach() +list(APPEND SFML_FIND_COMPONENTS ${FIND_SFML_ADDITIONAL_COMPONENTS}) +list(REMOVE_DUPLICATES SFML_FIND_COMPONENTS) + +# Choose which target definitions must be imported +if (SFML_STATIC_LIBRARIES) + set(SFML_IS_FRAMEWORK_INSTALL "@SFML_BUILD_FRAMEWORKS@") + if (SFML_IS_FRAMEWORK_INSTALL) + message(WARNING "Static frameworks are not supported by SFML. Clear SFML_DIR cache entry, \ +and either change SFML_STATIC_LIBRARIES or CMAKE_FIND_FRAMEWORK before calling find_package(SFML)") + endif() + set(config_name "Static") +else() + set(config_name "Shared") +endif() +set(targets_config_file "${CMAKE_CURRENT_LIST_DIR}/SFML${config_name}Targets.cmake") + +# Generate imported targets for SFML and its dependencies +if (EXISTS "${targets_config_file}") + # Set SFML_FOUND to TRUE by default, may be overwritten by one of the includes below + set(SFML_FOUND TRUE) + include("${targets_config_file}") + include("${CMAKE_CURRENT_LIST_DIR}/SFMLConfigDependencies.cmake") + + if (SFML_FOUND) + foreach (component ${SFML_FIND_COMPONENTS}) + string(TOUPPER "${component}" UPPER_COMPONENT) + if (TARGET sfml-${component}) + set(SFML_${UPPER_COMPONENT}_FOUND TRUE) + else() + set(FIND_SFML_ERROR "Found SFML but requested component '${component}' is missing in the config defined in ${SFML_DIR}.") + set(SFML_${UPPER_COMPONENT}_FOUND FALSE) + set(SFML_FOUND FALSE) + endif() + endforeach() + endif() +else() + set(FIND_SFML_ERROR "Requested SFML configuration (${config_name}) was not found") + set(SFML_FOUND FALSE) +endif() + +if (NOT SFML_FOUND) + if(SFML_FIND_REQUIRED) + # fatal error + message(FATAL_ERROR "${FIND_SFML_ERROR}") + elseif(NOT SFML_FIND_QUIETLY) + # error but continue + message(STATUS "${FIND_SFML_ERROR}") + endif() +endif() + +if (SFML_FOUND AND NOT SFML_FIND_QUIETLY) + message(STATUS "Found SFML @VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@ in ${CMAKE_CURRENT_LIST_DIR}") +endif() diff --git a/cmake/SFMLConfigDependencies.cmake.in b/cmake/SFMLConfigDependencies.cmake.in new file mode 100644 index 00000000..2f85b388 --- /dev/null +++ b/cmake/SFMLConfigDependencies.cmake.in @@ -0,0 +1,80 @@ + +if (CMAKE_VERSION VERSION_LESS 3.5.2) + include(CMakeParseArguments) +endif() + +# in case of static linking, we must also define the list of all the dependencies of SFML libraries +if(SFML_STATIC_LIBRARIES) + # detect the OS + if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") + set(FIND_SFML_OS_WINDOWS 1) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(FIND_SFML_OS_LINUX 1) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + set(FIND_SFML_OS_FREEBSD 1) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(FIND_SFML_OS_MACOSX 1) + endif() + + # start with an empty list + set(FIND_SFML_DEPENDENCIES_NOTFOUND) + + # macro that searches for a 3rd-party library + function(sfml_bind_dependency) + cmake_parse_arguments(THIS "" "TARGET;FRIENDLY_NAME" "SEARCH_NAMES" ${ARGN}) + if (THIS_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown arguments when calling sfml_bind_dependency: ${THIS_UNPARSED_ARGUMENTS}") + endif() + + # No lookup in environment variables (PATH on Windows), as they may contain wrong library versions + find_library(${THIS_FRIENDLY_NAME}_LIB NAMES ${THIS_SEARCH_NAMES} + PATHS ${FIND_SFML_PATHS} PATH_SUFFIXES lib NO_SYSTEM_ENVIRONMENT_PATH) + mark_as_advanced(${THIS_FRIENDLY_NAME}_LIB) + if(${THIS_FRIENDLY_NAME}_LIB) + set_property(TARGET ${THIS_TARGET} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${${THIS_FRIENDLY_NAME}_LIB}") + else() + set(FIND_SFML_DEPENDENCIES_NOTFOUND "${FIND_SFML_DEPENDENCIES_NOTFOUND} ${THIS_FRIENDLY_NAME}" PARENT_SCOPE) + endif() + endfunction() + + # 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) + sfml_bind_dependency(TARGET X11 FRIENDLY_NAME "X11" SEARCH_NAMES "X11") + sfml_bind_dependency(TARGET X11 FRIENDLY_NAME "Xrandr" SEARCH_NAMES "Xrandr") + endif() + + if(FIND_SFML_OS_LINUX) + sfml_bind_dependency(TARGET UDev FRIENDLY_NAME "UDev" SEARCH_NAMES "udev" "libudev") + endif() + + if (FIND_SFML_OS_WINDOWS) + set_property(TARGET OpenGL APPEND PROPERTY INTERFACE_LINK_LIBRARIES "OpenGL32") + else() + sfml_bind_dependency(TARGET OpenGL FRIENDLY_NAME "OpenGL" SEARCH_NAMES "OpenGL" "GL") + endif() + endif() + + # sfml-graphics + list(FIND SFML_FIND_COMPONENTS "graphics" FIND_SFML_GRAPHICS_COMPONENT_INDEX) + if(FIND_SFML_GRAPHICS_COMPONENT_INDEX GREATER -1) + sfml_bind_dependency(TARGET Freetype FRIENDLY_NAME "FreeType" SEARCH_NAMES "freetype") + endif() + + # sfml-audio + list(FIND SFML_FIND_COMPONENTS "audio" FIND_SFML_AUDIO_COMPONENT_INDEX) + if(FIND_SFML_AUDIO_COMPONENT_INDEX GREATER -1) + sfml_bind_dependency(TARGET OpenAL FRIENDLY_NAME "OpenAL" SEARCH_NAMES "OpenAL" "openal" "openal32") + 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 "VorbisFile" SEARCH_NAMES "vorbisfile") + sfml_bind_dependency(TARGET Vorbis FRIENDLY_NAME "VorbisEnc" SEARCH_NAMES "vorbisenc") + sfml_bind_dependency(TARGET FLAC FRIENDLY_NAME "FLAC" SEARCH_NAMES "FLAC") + endif() + + if (FIND_SFML_DEPENDENCIES_NOTFOUND) + set(FIND_SFML_ERROR "SFML found but some of its dependencies are missing (${FIND_SFML_DEPENDENCIES_NOTFOUND})") + set(SFML_FOUND FALSE) + endif() +endif() From 09e24adf2e91a59be8a02093bacdcbc6c3febe59 Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Tue, 20 Mar 2018 19:47:45 +0100 Subject: [PATCH 053/211] Remove FindSFML.cmake --- cmake/Modules/FindSFML.cmake | 368 ----------------------------------- 1 file changed, 368 deletions(-) delete mode 100644 cmake/Modules/FindSFML.cmake diff --git a/cmake/Modules/FindSFML.cmake b/cmake/Modules/FindSFML.cmake deleted file mode 100644 index 3341177e..00000000 --- a/cmake/Modules/FindSFML.cmake +++ /dev/null @@ -1,368 +0,0 @@ -# This script locates the SFML library -# ------------------------------------ -# -# Usage -# ----- -# -# When you try to locate the SFML libraries, you must specify which modules you want to use (system, window, graphics, network, audio, main). -# If none is given, the SFML_LIBRARIES variable will be empty and you'll end up linking to nothing. -# example: -# find_package(SFML COMPONENTS graphics window system) # find the graphics, window and system modules -# -# You can enforce a specific version, either MAJOR.MINOR or only MAJOR. -# If nothing is specified, the version won't be checked (i.e. any version will be accepted). -# 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 -# -# 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 ...). -# Since you have to link yourself all the SFML dependencies when you link it statically, the following -# additional variables are defined: SFML_XXX_DEPENDENCIES and SFML_DEPENDENCIES (see their detailed -# description below). -# In case of static linking, the SFML_STATIC macro will also be defined by this script. -# example: -# set(SFML_STATIC_LIBRARIES TRUE) -# find_package(SFML 2 COMPONENTS network system) -# -# On Mac OS X if SFML_STATIC_LIBRARIES is not set to TRUE then by default CMake will search for frameworks unless -# CMAKE_FIND_FRAMEWORK is set to "NEVER" for example. Please refer to CMake documentation for more details. -# Moreover, keep in mind that SFML frameworks are only available as release libraries unlike dylibs which -# are available for both release and debug modes. -# -# If SFML is not installed in a standard path, you can use the SFML_ROOT CMake (or environment) variable -# to tell CMake where SFML is. -# -# Output -# ------ -# -# This script defines the following variables: -# - For each specified module XXX (system, window, graphics, network, audio, main): -# - SFML_XXX_LIBRARY_DEBUG: the name of the debug library of the xxx module (set to SFML_XXX_LIBRARY_RELEASE is no debug version is found) -# - SFML_XXX_LIBRARY_RELEASE: the name of the release library of the xxx module (set to SFML_XXX_LIBRARY_DEBUG is no release version is found) -# - SFML_XXX_LIBRARY: the name of the library to link to for the xxx module (includes both debug and optimized names if necessary) -# - SFML_XXX_FOUND: true if either the debug or release library of the xxx module is found -# - SFML_XXX_DEPENDENCIES: the list of libraries the module depends on, in case of static linking -# - SFML_LIBRARIES: the list of all libraries corresponding to the required modules -# - SFML_FOUND: true if all the required modules are found -# - SFML_INCLUDE_DIR: the path where SFML headers are located (the directory containing the SFML/Config.hpp file) -# - SFML_DEPENDENCIES: the list of libraries SFML depends on, in case of static linking -# -# example: -# find_package(SFML 2 COMPONENTS system window graphics audio REQUIRED) -# include_directories(${SFML_INCLUDE_DIR}) -# add_executable(myapp ...) -# target_link_libraries(myapp ${SFML_LIBRARIES}) - -# define the SFML_STATIC macro if static build was chosen -if(SFML_STATIC_LIBRARIES) - add_definitions(-DSFML_STATIC) -endif() - -# define the list of search paths for headers and libraries -set(FIND_SFML_PATHS - ${SFML_ROOT} - $ENV{SFML_ROOT} - ~/Library/Frameworks - /Library/Frameworks - /usr/local - /usr - /sw - /opt/local - /opt/csw - /opt) - -# find the SFML include directory -find_path(SFML_INCLUDE_DIR SFML/Config.hpp - PATH_SUFFIXES include - PATHS ${FIND_SFML_PATHS}) - -find_path(SFML_DOC_DIR SFML.tag - PATH_SUFFIXES SFML/doc share/SFML/doc - PATHS ${FIND_SFML_PATHS}) - -# check the version number -set(SFML_VERSION_OK TRUE) -if(SFML_FIND_VERSION AND SFML_INCLUDE_DIR) - # extract the major and minor version numbers from SFML/Config.hpp - # we have to handle framework a little bit differently: - if("${SFML_INCLUDE_DIR}" MATCHES "SFML.framework") - set(SFML_CONFIG_HPP_INPUT "${SFML_INCLUDE_DIR}/Headers/Config.hpp") - else() - set(SFML_CONFIG_HPP_INPUT "${SFML_INCLUDE_DIR}/SFML/Config.hpp") - endif() - FILE(READ "${SFML_CONFIG_HPP_INPUT}" SFML_CONFIG_HPP_CONTENTS) - STRING(REGEX REPLACE ".*#define SFML_VERSION_MAJOR ([0-9]+).*" "\\1" SFML_VERSION_MAJOR "${SFML_CONFIG_HPP_CONTENTS}") - STRING(REGEX REPLACE ".*#define SFML_VERSION_MINOR ([0-9]+).*" "\\1" SFML_VERSION_MINOR "${SFML_CONFIG_HPP_CONTENTS}") - STRING(REGEX REPLACE ".*#define SFML_VERSION_PATCH ([0-9]+).*" "\\1" SFML_VERSION_PATCH "${SFML_CONFIG_HPP_CONTENTS}") - if (NOT "${SFML_VERSION_PATCH}" MATCHES "^[0-9]+$") - set(SFML_VERSION_PATCH 0) - endif() - math(EXPR SFML_REQUESTED_VERSION "${SFML_FIND_VERSION_MAJOR} * 10000 + ${SFML_FIND_VERSION_MINOR} * 100 + ${SFML_FIND_VERSION_PATCH}") - - # if we could extract them, compare with the requested version number - if (SFML_VERSION_MAJOR) - # transform version numbers to an integer - math(EXPR SFML_VERSION "${SFML_VERSION_MAJOR} * 10000 + ${SFML_VERSION_MINOR} * 100 + ${SFML_VERSION_PATCH}") - - # compare them - if(SFML_VERSION LESS SFML_REQUESTED_VERSION) - set(SFML_VERSION_OK FALSE) - endif() - else() - # SFML version is < 2.0 - if (SFML_REQUESTED_VERSION GREATER 10900) - set(SFML_VERSION_OK FALSE) - set(SFML_VERSION_MAJOR 1) - set(SFML_VERSION_MINOR x) - set(SFML_VERSION_PATCH x) - endif() - endif() -endif() - -# find the requested modules -set(SFML_FOUND TRUE) # will be set to false if one of the required modules is not found -foreach(FIND_SFML_COMPONENT ${SFML_FIND_COMPONENTS}) - string(TOLOWER ${FIND_SFML_COMPONENT} FIND_SFML_COMPONENT_LOWER) - string(TOUPPER ${FIND_SFML_COMPONENT} FIND_SFML_COMPONENT_UPPER) - set(FIND_SFML_COMPONENT_NAME sfml-${FIND_SFML_COMPONENT_LOWER}) - - # no suffix for sfml-main, it is always a static library - if(FIND_SFML_COMPONENT_LOWER STREQUAL "main") - # release library - find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE - NAMES ${FIND_SFML_COMPONENT_NAME} - PATH_SUFFIXES lib64 lib - PATHS ${FIND_SFML_PATHS}) - - # debug library - find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG - NAMES ${FIND_SFML_COMPONENT_NAME}-d - PATH_SUFFIXES lib64 lib - PATHS ${FIND_SFML_PATHS}) - else() - # static release library - find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_RELEASE - NAMES ${FIND_SFML_COMPONENT_NAME}-s - PATH_SUFFIXES lib64 lib - PATHS ${FIND_SFML_PATHS}) - - # static debug library - find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_DEBUG - NAMES ${FIND_SFML_COMPONENT_NAME}-s-d - PATH_SUFFIXES lib64 lib - PATHS ${FIND_SFML_PATHS}) - - # dynamic release library - find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_RELEASE - NAMES ${FIND_SFML_COMPONENT_NAME} - PATH_SUFFIXES lib64 lib - PATHS ${FIND_SFML_PATHS}) - - # dynamic debug library - find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_DEBUG - NAMES ${FIND_SFML_COMPONENT_NAME}-d - PATH_SUFFIXES lib64 lib - PATHS ${FIND_SFML_PATHS}) - - # choose the entries that fit the requested link type - if(SFML_STATIC_LIBRARIES) - if(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_RELEASE) - set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_RELEASE}) - endif() - if(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_DEBUG) - set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_DEBUG}) - endif() - else() - if(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_RELEASE) - set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_RELEASE}) - endif() - if(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_DEBUG) - set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_DEBUG}) - endif() - endif() - endif() - - if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG OR SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE) - # library found - set(SFML_${FIND_SFML_COMPONENT_UPPER}_FOUND TRUE) - - # if both are found, set SFML_XXX_LIBRARY to contain both - if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG AND SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE) - set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY debug ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG} - optimized ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE}) - endif() - - # if only one debug/release variant is found, set the other to be equal to the found one - if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG AND NOT SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE) - # debug and not release - set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG}) - set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG}) - endif() - if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE AND NOT SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG) - # release and not debug - set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE}) - set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE}) - endif() - else() - # library not found - set(SFML_FOUND FALSE) - set(SFML_${FIND_SFML_COMPONENT_UPPER}_FOUND FALSE) - set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY "") - set(FIND_SFML_MISSING "${FIND_SFML_MISSING} SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY") - endif() - - # mark as advanced - MARK_AS_ADVANCED(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY - SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE - SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG - SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_RELEASE - SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_STATIC_DEBUG - SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_RELEASE - SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DYNAMIC_DEBUG) - - # add to the global list of libraries - set(SFML_LIBRARIES ${SFML_LIBRARIES} "${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY}") -endforeach() - -# in case of static linking, we must also define the list of all the dependencies of SFML libraries -if(SFML_STATIC_LIBRARIES) - - # detect the OS - if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") - set(FIND_SFML_OS_WINDOWS 1) - elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set(FIND_SFML_OS_LINUX 1) - elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") - set(FIND_SFML_OS_FREEBSD 1) - elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set(FIND_SFML_OS_MACOSX 1) - endif() - - # start with an empty list - set(SFML_DEPENDENCIES) - set(FIND_SFML_DEPENDENCIES_NOTFOUND) - - # macro that searches for a 3rd-party library - macro(find_sfml_dependency output friendlyname) - # No lookup in environment variables (PATH on Windows), as they may contain wrong library versions - find_library(${output} NAMES ${ARGN} PATHS ${FIND_SFML_PATHS} PATH_SUFFIXES lib NO_SYSTEM_ENVIRONMENT_PATH) - if(${${output}} STREQUAL "${output}-NOTFOUND") - unset(output) - set(FIND_SFML_DEPENDENCIES_NOTFOUND "${FIND_SFML_DEPENDENCIES_NOTFOUND} ${friendlyname}") - endif() - endmacro() - - # sfml-system - list(FIND SFML_FIND_COMPONENTS "system" FIND_SFML_SYSTEM_COMPONENT) - if(NOT ${FIND_SFML_SYSTEM_COMPONENT} EQUAL -1) - - # update the list -- these are only system libraries, no need to find them - if(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD OR FIND_SFML_OS_MACOSX) - set(SFML_SYSTEM_DEPENDENCIES "pthread") - endif() - if(FIND_SFML_OS_LINUX) - set(SFML_SYSTEM_DEPENDENCIES ${SFML_SYSTEM_DEPENDENCIES} "rt") - endif() - if(FIND_SFML_OS_WINDOWS) - set(SFML_SYSTEM_DEPENDENCIES "winmm") - endif() - set(SFML_DEPENDENCIES ${SFML_SYSTEM_DEPENDENCIES} ${SFML_DEPENDENCIES}) - endif() - - # sfml-network - list(FIND SFML_FIND_COMPONENTS "network" FIND_SFML_NETWORK_COMPONENT) - if(NOT ${FIND_SFML_NETWORK_COMPONENT} EQUAL -1) - - # update the list -- these are only system libraries, no need to find them - if(FIND_SFML_OS_WINDOWS) - set(SFML_NETWORK_DEPENDENCIES "ws2_32") - endif() - set(SFML_DEPENDENCIES ${SFML_NETWORK_DEPENDENCIES} ${SFML_DEPENDENCIES}) - endif() - - # sfml-window - list(FIND SFML_FIND_COMPONENTS "window" FIND_SFML_WINDOW_COMPONENT) - if(NOT ${FIND_SFML_WINDOW_COMPONENT} EQUAL -1) - - # find libraries - if(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD) - find_sfml_dependency(X11_LIBRARY "X11" X11) - find_sfml_dependency(XRANDR_LIBRARY "Xrandr" Xrandr) - endif() - - if(FIND_SFML_OS_LINUX) - find_sfml_dependency(UDEV_LIBRARIES "UDev" udev libudev) - endif() - - # update the list - if(FIND_SFML_OS_WINDOWS) - set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "opengl32" "winmm" "gdi32") - elseif(FIND_SFML_OS_LINUX) - set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "GL" ${X11_LIBRARY} ${XRANDR_LIBRARY} ${UDEV_LIBRARIES}) - elseif(FIND_SFML_OS_FREEBSD) - set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "GL" ${X11_LIBRARY} ${XRANDR_LIBRARY} "usbhid") - elseif(FIND_SFML_OS_MACOSX) - set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "-framework OpenGL -framework Foundation -framework AppKit -framework IOKit -framework Carbon") - endif() - set(SFML_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} ${SFML_DEPENDENCIES}) - endif() - - # sfml-graphics - list(FIND SFML_FIND_COMPONENTS "graphics" FIND_SFML_GRAPHICS_COMPONENT) - if(NOT ${FIND_SFML_GRAPHICS_COMPONENT} EQUAL -1) - - # find libraries - find_sfml_dependency(FREETYPE_LIBRARY "FreeType" freetype) - - # update the list - set(SFML_GRAPHICS_DEPENDENCIES ${FREETYPE_LIBRARY}) - set(SFML_DEPENDENCIES ${SFML_GRAPHICS_DEPENDENCIES} ${SFML_DEPENDENCIES}) - endif() - - # sfml-audio - list(FIND SFML_FIND_COMPONENTS "audio" FIND_SFML_AUDIO_COMPONENT) - if(NOT ${FIND_SFML_AUDIO_COMPONENT} EQUAL -1) - - # find libraries - find_sfml_dependency(OPENAL_LIBRARY "OpenAL" openal openal32) - find_sfml_dependency(OGG_LIBRARY "Ogg" ogg) - find_sfml_dependency(VORBIS_LIBRARY "Vorbis" vorbis) - find_sfml_dependency(VORBISFILE_LIBRARY "VorbisFile" vorbisfile) - find_sfml_dependency(VORBISENC_LIBRARY "VorbisEnc" vorbisenc) - find_sfml_dependency(FLAC_LIBRARY "FLAC" FLAC) - - # update the list - set(SFML_AUDIO_DEPENDENCIES ${OPENAL_LIBRARY} ${FLAC_LIBRARY} ${VORBISENC_LIBRARY} ${VORBISFILE_LIBRARY} ${VORBIS_LIBRARY} ${OGG_LIBRARY}) - set(SFML_DEPENDENCIES ${SFML_DEPENDENCIES} ${SFML_AUDIO_DEPENDENCIES}) - endif() - -endif() - -# handle errors -if(NOT SFML_VERSION_OK) - # SFML version not ok - set(FIND_SFML_ERROR "SFML found but version too low (requested: ${SFML_FIND_VERSION}, found: ${SFML_VERSION_MAJOR}.${SFML_VERSION_MINOR}.${SFML_VERSION_PATCH})") - set(SFML_FOUND FALSE) -elseif(SFML_STATIC_LIBRARIES AND FIND_SFML_DEPENDENCIES_NOTFOUND) - set(FIND_SFML_ERROR "SFML found but some of its dependencies are missing (${FIND_SFML_DEPENDENCIES_NOTFOUND})") - set(SFML_FOUND FALSE) -elseif(NOT SFML_FOUND) - # include directory or library not found - set(FIND_SFML_ERROR "Could NOT find SFML (missing: ${FIND_SFML_MISSING})") -endif() -if (NOT SFML_FOUND) - if(SFML_FIND_REQUIRED) - # fatal error - message(FATAL_ERROR ${FIND_SFML_ERROR}) - elseif(NOT SFML_FIND_QUIETLY) - # error but continue - message("${FIND_SFML_ERROR}") - endif() -endif() - -# handle success -if(SFML_FOUND AND NOT SFML_FIND_QUIETLY) - message(STATUS "Found SFML ${SFML_VERSION_MAJOR}.${SFML_VERSION_MINOR}.${SFML_VERSION_PATCH} in ${SFML_INCLUDE_DIR}") -endif() From fc655f52b91d3e70ee43426dc872723418f2bbee Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Sat, 24 Mar 2018 11:38:41 +0100 Subject: [PATCH 054/211] Make dependencies install directory relative to CMAKE_INSTALL_PREFIX --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a2f4d2f8..a26a9c9e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,7 +99,7 @@ if(SFML_OS_MACOSX) 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 "${CMAKE_INSTALL_PREFIX}" PATH "External libraries (FLAC, Freetype, Vorbis, ...) installation directory") + sfml_set_option(SFML_DEPENDENCIES_INSTALL_PREFIX "." PATH "External libraries (FLAC, Freetype, Vorbis, ...) installation directory") endif() # Android options From 7be2111d61e0557c4a913e563a5b23631e6a167f Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Tue, 27 Feb 2018 12:17:08 -0800 Subject: [PATCH 055/211] Add iOS demo --- CMakeLists.txt | 2 +- cmake/Macros.cmake | 3 ++ examples/CMakeLists.txt | 62 +++++++++++++++++++---------------- examples/iOS/CMakeLists.txt | 26 +++++++++++++++ examples/iOS/main.cpp | 65 +++++++++++++++++++++++++++++++++++++ 5 files changed, 129 insertions(+), 29 deletions(-) create mode 100644 examples/iOS/CMakeLists.txt create mode 100644 examples/iOS/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a26a9c9e..8daaac8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,7 +67,7 @@ else() endif() # add an option for building the examples -if(NOT (SFML_OS_IOS OR SFML_OS_ANDROID)) +if(NOT SFML_OS_ANDROID) sfml_set_option(SFML_BUILD_EXAMPLES FALSE BOOL "TRUE to build the SFML examples, FALSE to ignore them") else() set(SFML_BUILD_EXAMPLES FALSE) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 0221b4d1..02dc145e 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -201,6 +201,9 @@ macro(sfml_add_example target) if(THIS_GUI_APP AND SFML_OS_WINDOWS AND NOT DEFINED CMAKE_CONFIGURATION_TYPES AND ${CMAKE_BUILD_TYPE} STREQUAL "Release") 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}) + target_link_libraries(${target} PRIVATE sfml-main) else() add_executable(${target} ${target_input}) endif() diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 872c77d9..cc23fbaa 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,30 +1,36 @@ -# add the examples subdirectories -if(SFML_BUILD_NETWORK) - add_subdirectory(ftp) - add_subdirectory(sockets) -endif() -if(SFML_BUILD_NETWORK AND SFML_BUILD_AUDIO) - add_subdirectory(voip) -endif() -if(SFML_BUILD_AUDIO) - add_subdirectory(sound) - add_subdirectory(sound_capture) -endif() -if(SFML_BUILD_WINDOW) - add_subdirectory(window) -endif() -if(SFML_BUILD_GRAPHICS) - add_subdirectory(opengl) - add_subdirectory(shader) - if(SFML_OS_WINDOWS) - add_subdirectory(win32) - elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD) - add_subdirectory(X11) - elseif(SFML_OS_MACOSX) - add_subdirectory(cocoa) +# iOS Demo +if(SFML_OS_IOS) + add_subdirectory(iOS) +else(SFML_OS_IOS) + + # add the examples subdirectories + if(SFML_BUILD_NETWORK) + add_subdirectory(ftp) + add_subdirectory(sockets) endif() -endif() -if(SFML_BUILD_GRAPHICS AND SFML_BUILD_AUDIO) - add_subdirectory(pong) -endif() + if(SFML_BUILD_NETWORK AND SFML_BUILD_AUDIO) + add_subdirectory(voip) + endif() + if(SFML_BUILD_AUDIO) + add_subdirectory(sound) + add_subdirectory(sound_capture) + endif() + if(SFML_BUILD_WINDOW) + add_subdirectory(window) + endif() + if(SFML_BUILD_GRAPHICS) + add_subdirectory(opengl) + add_subdirectory(shader) + if(SFML_OS_WINDOWS) + add_subdirectory(win32) + elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD) + add_subdirectory(X11) + elseif(SFML_OS_MACOSX) + add_subdirectory(cocoa) + endif() + endif() + if(SFML_BUILD_GRAPHICS AND SFML_BUILD_AUDIO) + add_subdirectory(pong) + endif() +endif(SFML_OS_IOS) \ No newline at end of file diff --git a/examples/iOS/CMakeLists.txt b/examples/iOS/CMakeLists.txt new file mode 100644 index 00000000..3aaea884 --- /dev/null +++ b/examples/iOS/CMakeLists.txt @@ -0,0 +1,26 @@ + +set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/ios) +set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules) + +# All source files +set(SRC ${SRCROOT}/main.cpp) + +# Use the resources from the android example +set(RESOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/../android/assets/canary.wav + ${CMAKE_CURRENT_SOURCE_DIR}/../android/assets/image.png + ${CMAKE_CURRENT_SOURCE_DIR}/../android/assets/orchestral.ogg + ${CMAKE_CURRENT_SOURCE_DIR}/../android/assets/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 +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 new file mode 100644 index 00000000..473b2b91 --- /dev/null +++ b/examples/iOS/main.cpp @@ -0,0 +1,65 @@ +//////////////////////////////////////////////////////////// +// 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(); + } +} + From 15d0f789c7cc7d3f52a51554cad8943212b9d90f Mon Sep 17 00:00:00 2001 From: irrmich <mathon.michael@gmail.com> Date: Fri, 18 Mar 2016 16:12:03 +0100 Subject: [PATCH 056/211] Add append/overwrite parameter to Ftp::upload. --- include/SFML/Network/Ftp.hpp | 6 +++++- src/SFML/Network/Ftp.cpp | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/SFML/Network/Ftp.hpp b/include/SFML/Network/Ftp.hpp index dd4fd58d..ee779ccb 100644 --- a/include/SFML/Network/Ftp.hpp +++ b/include/SFML/Network/Ftp.hpp @@ -475,16 +475,20 @@ public: /// remote path is relative to the current directory of the /// FTP server. /// + /// The append parameter controls whether the remote file is + /// appended to or overwritten if it already exists. + /// /// \param localFile Path of the local file to upload /// \param remotePath The directory in which to put the file on the server /// \param mode Transfer mode + /// \param append Pass true to append to or false to overwrite the remote file if it already exists /// /// \return Server response to the request /// /// \see download /// //////////////////////////////////////////////////////////// - Response upload(const std::string& localFile, const std::string& remotePath, TransferMode mode = Binary); + Response upload(const std::string& localFile, const std::string& remotePath, TransferMode mode = Binary, bool append = false); //////////////////////////////////////////////////////////// /// \brief Send a command to the FTP server diff --git a/src/SFML/Network/Ftp.cpp b/src/SFML/Network/Ftp.cpp index 3d410439..41a630f4 100644 --- a/src/SFML/Network/Ftp.cpp +++ b/src/SFML/Network/Ftp.cpp @@ -322,7 +322,7 @@ Ftp::Response Ftp::download(const std::string& remoteFile, const std::string& lo //////////////////////////////////////////////////////////// -Ftp::Response Ftp::upload(const std::string& localFile, const std::string& remotePath, TransferMode mode) +Ftp::Response Ftp::upload(const std::string& localFile, const std::string& remotePath, TransferMode mode, bool append) { // Get the contents of the file to send std::ifstream file(localFile.c_str(), std::ios_base::binary); @@ -346,7 +346,7 @@ Ftp::Response Ftp::upload(const std::string& localFile, const std::string& remot if (response.isOk()) { // Tell the server to start the transfer - response = sendCommand("STOR", path + filename); + response = sendCommand(append ? "APPE" : "STOR", path + filename); if (response.isOk()) { // Send the file data From a1065737db1990efc43a9481cb7ac5e6fccab6a8 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sun, 18 Mar 2018 10:57:49 +0100 Subject: [PATCH 057/211] Fixed OpenGL version string being parsed incorrectly on some platforms. Fixes #1249 --- src/SFML/Window/GlContext.cpp | 47 +++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/SFML/Window/GlContext.cpp b/src/SFML/Window/GlContext.cpp index b6f32903..07a90ad7 100644 --- a/src/SFML/Window/GlContext.cpp +++ b/src/SFML/Window/GlContext.cpp @@ -38,6 +38,7 @@ #include <set> #include <cstdlib> #include <cstring> +#include <cctype> #include <cassert> #if !defined(SFML_OPENGL_ES) @@ -199,6 +200,26 @@ namespace // Supported OpenGL extensions std::vector<std::string> extensions; + + // 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 = version[prefixLength] - '0'; + minor = version[prefixLength + 2] - '0'; + + return true; + } + + return false; + } } @@ -582,18 +603,30 @@ void GlContext::initialize(const ContextSettings& requestedSettings) else { // Try the old way - const GLubyte* version = glGetString(GL_VERSION); + + // If we can't get the version number, assume 1.1 + m_settings.majorVersion = 1; + m_settings.minorVersion = 1; + + const char* version = reinterpret_cast<const char*>(glGetString(GL_VERSION)); if (version) { - // The beginning of the returned string is "major.minor" (this is standard) - m_settings.majorVersion = version[0] - '0'; - m_settings.minorVersion = version[2] - '0'; + // OpenGL ES Common Lite profile: The beginning of the returned string is "OpenGL ES-CL major.minor" + // OpenGL ES Common profile: The beginning of the returned string is "OpenGL ES-CM major.minor" + // 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" + + 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) && + !parseVersionString(version, "", m_settings.majorVersion, m_settings.minorVersion)) + { + err() << "Unable to parse OpenGL version string: \"" << version << "\", defaulting to 1.1" << std::endl; + } } else { - // Can't get the version number, assume 1.1 - m_settings.majorVersion = 1; - m_settings.minorVersion = 1; + err() << "Unable to retrieve OpenGL version string, defaulting to 1.1" << std::endl; } } From fe1407b6b5e9d24ff03d8860283fbfdb18c8e8db Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sat, 3 Feb 2018 13:08:44 +0100 Subject: [PATCH 058/211] Added joystick example. --- examples/CMakeLists.txt | 1 + examples/joystick/CMakeLists.txt | 11 + examples/joystick/Joystick.cpp | 238 ++++++++++++++++++++++ examples/joystick/resources/sansation.ttf | Bin 0 -> 28912 bytes 4 files changed, 250 insertions(+) create mode 100644 examples/joystick/CMakeLists.txt create mode 100644 examples/joystick/Joystick.cpp create mode 100644 examples/joystick/resources/sansation.ttf diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index cc23fbaa..13542862 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -20,6 +20,7 @@ else(SFML_OS_IOS) add_subdirectory(window) endif() if(SFML_BUILD_GRAPHICS) + add_subdirectory(joystick) add_subdirectory(opengl) add_subdirectory(shader) if(SFML_OS_WINDOWS) diff --git a/examples/joystick/CMakeLists.txt b/examples/joystick/CMakeLists.txt new file mode 100644 index 00000000..f04dc7fc --- /dev/null +++ b/examples/joystick/CMakeLists.txt @@ -0,0 +1,11 @@ + +set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/joystick) + +# all source files +set(SRC ${SRCROOT}/Joystick.cpp) + +# define the joystick target +sfml_add_example(joystick GUI_APP + SOURCES ${SRC} + DEPENDS sfml-graphics sfml-window sfml-system + RESOURCES_DIR resources) diff --git a/examples/joystick/Joystick.cpp b/examples/joystick/Joystick.cpp new file mode 100644 index 00000000..0ff7cf91 --- /dev/null +++ b/examples/joystick/Joystick.cpp @@ -0,0 +1,238 @@ + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include <SFML/Graphics.hpp> +#include <algorithm> +#include <sstream> +#include <iomanip> +#include <string> +#include <map> + + +namespace +{ + struct JoystickObject + { + sf::Text label; + sf::Text value; + }; + + typedef std::map<std::string, JoystickObject> Texts; + Texts texts; + std::ostringstream sstr; + float threshold = 0.1f; + + // Axes labels in as C strings + const char* axislabels[] = {"X", "Y", "Z", "R", "U", "V", "PovX", "PovY"}; + + // Helper to set text entries to a specified value + template<typename T> + void set(const char* label, const T& value) + { + sstr.str(""); + sstr << value; + texts[label].value.setString(sstr.str()); + } + + // Update joystick identification + void updateIdentification(unsigned int index) + { + sstr.str(""); + sstr << "Joystick " << index << ":"; + texts["ID"].label.setString(sstr.str()); + texts["ID"].value.setString(sf::Joystick::getIdentification(index).name); + } + + // Update joystick axes + void updateAxes(unsigned int index) + { + for (unsigned int j = 0; j < sf::Joystick::AxisCount; ++j) + { + if (sf::Joystick::hasAxis(index, static_cast<sf::Joystick::Axis>(j))) + set(axislabels[j], sf::Joystick::getAxisPosition(index, static_cast<sf::Joystick::Axis>(j))); + } + } + + // Update joystick buttons + void updateButtons(unsigned int index) + { + for (unsigned int j = 0; j < sf::Joystick::getButtonCount(index); ++j) + { + sstr.str(""); + sstr << "Button " << j; + + set(sstr.str().c_str(), sf::Joystick::isButtonPressed(index, j)); + } + } + + // Helper to update displayed joystick values + void updateValues(unsigned int index) + { + if (sf::Joystick::isConnected(index)) { + // Update the label-value sf::Text objects based on the current joystick state + updateIdentification(index); + updateAxes(index); + updateButtons(index); + } + } +} + + +//////////////////////////////////////////////////////////// +/// Entry point of application +/// +/// \return Application exit code +/// +//////////////////////////////////////////////////////////// +int main() +{ + // Create the window of the application + sf::RenderWindow window(sf::VideoMode(400, 680), "Joystick", sf::Style::Close); + window.setVerticalSyncEnabled(true); + + // Load the text font + sf::Font font; + if (!font.loadFromFile("resources/sansation.ttf")) + return EXIT_FAILURE; + + // Set up our string conversion parameters + sstr.precision(2); + sstr.setf(std::ios::fixed | std::ios::boolalpha); + + // Set up our joystick identification sf::Text objects + texts["ID"].label.setPosition(5.f, 5.f); + texts["ID"].value.setPosition(80.f, 5.f); + + texts["ID"].label.setString("<Not Connected>"); + texts["ID"].value.setString(""); + + // Set up our threshold sf::Text objects + sstr.str(""); + sstr << threshold << " (Change with up/down arrow keys)"; + + texts["Threshold"].label.setPosition(5.f, 5.f + 2 * font.getLineSpacing(14)); + texts["Threshold"].value.setPosition(80.f, 5.f + 2 * font.getLineSpacing(14)); + + texts["Threshold"].label.setString("Threshold:"); + texts["Threshold"].value.setString(sstr.str()); + + // Set up our label-value sf::Text objects + for (unsigned int i = 0; i < sf::Joystick::AxisCount; ++i) + { + JoystickObject& object = texts[axislabels[i]]; + + object.label.setPosition(5.f, 5.f + ((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.setString("N/A"); + } + + for (unsigned int i = 0; i < sf::Joystick::ButtonCount; ++i) + { + sstr.str(""); + 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.setString(sstr.str() + ":"); + + object.value.setPosition(80.f, 5.f + ((sf::Joystick::AxisCount + i + 4) * font.getLineSpacing(14))); + object.value.setString("N/A"); + } + + for (Texts::iterator it = texts.begin(); it != texts.end(); ++it) + { + it->second.label.setFont(font); + it->second.label.setCharacterSize(14); + it->second.label.setFillColor(sf::Color::White); + + it->second.value.setFont(font); + it->second.value.setCharacterSize(14); + it->second.value.setFillColor(sf::Color::White); + } + + // Update initially displayed joystick values if a joystick is already connected on startup + for (unsigned int i = 0; i < sf::Joystick::Count; ++i) + { + if (sf::Joystick::isConnected(i)) + { + updateValues(i); + break; + } + } + + while (window.isOpen()) + { + // Handle events + sf::Event event; + while (window.pollEvent(event)) + { + // Window closed or escape key pressed: exit + if ((event.type == sf::Event::Closed) || + ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))) + { + window.close(); + break; + } + else if ((event.type == sf::Event::JoystickButtonPressed) || + (event.type == sf::Event::JoystickButtonReleased) || + (event.type == sf::Event::JoystickMoved) || + (event.type == sf::Event::JoystickConnected)) + { + // Update displayed joystick values + updateValues(event.joystickConnect.joystickId); + } + else if (event.type == sf::Event::JoystickDisconnected) + { + // Reset displayed joystick values to empty + for (Texts::iterator it = texts.begin(); it != texts.end(); ++it) + it->second.value.setString("N/A"); + + texts["ID"].label.setString("<Not Connected>"); + texts["ID"].value.setString(""); + + sstr.str(""); + sstr << threshold << " (Change with up/down arrow keys)"; + + texts["Threshold"].value.setString(sstr.str()); + } + } + + // Update threshold if the user wants to change it + float newThreshold = threshold; + + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) + newThreshold += 0.1f; + + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) + newThreshold -= 0.1f; + + newThreshold = std::min(std::max(newThreshold, 0.1f), 100.0f); + + if (newThreshold != threshold) + { + threshold = newThreshold; + window.setJoystickThreshold(threshold); + + sstr.str(""); + sstr << threshold << " (Change with up/down arrow keys)"; + + texts["Threshold"].value.setString(sstr.str()); + } + + // Clear the window + window.clear(); + + // Draw the label-value sf::Text objects + for (Texts::const_iterator it = texts.begin(); it != texts.end(); ++it) + { + window.draw(it->second.label); + window.draw(it->second.value); + } + + // Display things on screen + window.display(); + } +} diff --git a/examples/joystick/resources/sansation.ttf b/examples/joystick/resources/sansation.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d85fbc81d91e22c647a3338a37f24a9d684dcf8a GIT binary patch literal 28912 zcmeHw3v?94)^1gI&rAX&Wbz~=gqef@hIc|hG$<;90?JD<0Yn1{5C|baz=(i|hzKeX zVMIg?-~&(|Dk6i3Ac*JzABdtHL_kG+97IJ$GF@}OUDY$0B;;4`{qMT#uJtFY_f&ei zt9I?$d)HUH9$}m@<^(ZVRPO=(2ODd?c!jazwz%<D|G^zHpX<@<CC2zNJazk!o;T!{ z44wKFWA<3aY{y4U$S+;jY2z`*8lJ<wlcT1UxmX6CWU&K4w9%zwCfM^<bY(31GvqO4 zO#YNozn|&IzXiSz8&iDe=)P$)R^j=Z80!-@wlKfo#Qw$m@oX}_?=luQ8b>+a#ozdz zwHQ00to(;zeWv5@^WZOeeBtDhW)Uerfwf|kZ!exWDt~JE1Cfl47>?qjCghiw>WO>} zo-fDyu9Ex-h0U8KhA}p}j4{1Q>BK2z8FxSb4P!+Q;`ybelM73?GS&wC^uzN8BiZ2k z?)7V?-qtwhH`WlZ;^&p0zyf~uZh61A{|j+rScan;{tRcDye;3ceJlp@tgz?(U-;h* z%aA!)U(yG6&>hgu%pq@6NsKiB7m$-o>-r&H!E7wdw%nG5XOq;Y{t+9kMbmRO$PpjL zY{oW5vD^FLFZpv_KbMR3V6L;8;=yqRf7!+OqdoAg(bVR_hl^=O0n4Pv`8-^Z04|UA zD=TmmvI3(iE3iF`&ni~H?_mX6M|t(tGuSA73(^U=wyW>-LoCsD8|$mxh38k`8iuQo z^)(*D=VvmlK9QDr;a#I2E1-Pnlb#P7%{;c9$R`D#MJW3y^BC{q+GhRjXCBGl5<KI< z{im775r*$@-=2p&{;fW3Hrz|W-`$~|2a!gej?3`Q99*$1(KyLwY73Z$c*bWY>Pc53 z<jjnTc<&kH&GGphu42^jBmBJ@=~q?x;33g?Ql%Xc_zw4tP56GbdQPKH$d1aO@AT8) z<1A}x+>ZB9j(!Z^AwOA{)hv@_AnQ$aN4=@efjSZYk|*M;_C-8`zt9VLwo{k?Jpac3 zMUXe*FZ3dwL$8J`Q#*@iz_+nWeQMLtK3>S=bv(OJUG`q6H{_(jIvj&pBFSBwfoD!a zhRBaEh7RF!w6V%VyHY)E&}OX%tnFvy`7`R=1ke2fxlo;PQ9fbML+_w3+KYH@7On^I zEH0^M&=>u4<n;jZfn^(0aDSw{GC8~qe~T5c@6|hDmn(TnIU;YVLy&2xTqsRt1}>>5 zq${|zme32*>#@ieUPqgN&mk}pN<W75SBeM83+lwl%RmNn@wU~M9u0o13%V-pOM4lg z?_1A5i8S(+7xJ`C!}BTXqO@%_(y)1%Zwbo(6&LELMc|#|_$2Ryzll%w8vbsL^dVf3 z58acx1YIY6Bb}#Dk~Qg({0{m<dPeOg?S<N&><u~v`Ntzy&N%(BM(li;pM|k7zkq)W z2W`L__)XSO(nhQy(h;l?Xe5gOZOkJ5J{H9qgF0ChXf$(z#;|CA6^mstpm8h~G+xpK z7Kd~b7Vp2n5?KOhQ`Q7Di6w$2v!<ZUSd#xwmco)jo3m!1E=k=i1?g1Q+<%^>F&AhH z<_1k?sh}-cn*R^hinRc3&C)?HVJ$&3SS!#rpue-WtTkvmb_r;EmI2y<wE^wO+WLQE zome~2Ox7MWi**3)%sTqdv201Zuue#KWtpItvMkVUth4`Db{WeCy_|Ic&0$?ZyR%C{ zuVCH$zpyLWWuQGIy^39q^wlf}^cvRP|1;~!t^mE3T?yKY^#JY7uJWH{*RiWXuV>eQ z_K~zN>xpzfcCG&>b_44LdL!!%+MitqI)GgdI*|48pJ9VoU(ms<ALvc&2GE;9|HFo` z8$oYj{Xuit0MI-(5OgRT<o}TkV}n75vztI~WjBM4U_(G}W4HK!V7E(}&vKC-$?`x) zv7w*^Y?%LhR>+2fj%K%lj$tD}$Fke}-?1WgJLot`$FqE-i`huf32c=AG%H~Rpc7dk zXek>FI*E+|oy^AizhzTc5oj432Rc>KX>7dz6uW~JgO;-ipm(wo(CKU<=v}PT{|%eL zCV|dmlR;;(DWG>tI-8aGzh?Kasi1S%G|+q59iVerIp}@tPXAYI9-9t&Kf4QbKAQph z0GsJQ$rebukj+B+L3TIjLu@wa!|Wda3ATvM0j*&7f<D6Lf-YwFfj-LS`H!<Dk}hTU zBkf`HK_6oefG%ST{9m%i*+S6e>_N~c*h8Qz*u(x~>`Ar=^eI*W`n05#>=C3_vc>){ z*edoY=xVkE^cl7k^jYQseU3fmKgynG%Rtw#$3fRhx{fXP|C_zQo&bH3tpHumo&?>% zo&w#-p7tMMn^-02OKc_R%WM_sD{M9BX3)>stLz!jE$ms)*VuEQTiNrVUbe>n8QaFz zg1*kyfo^9nfWE<A^dDwB*m}@6CEdw3Aiaxi1bvHb@_)*9vzI{ku$MvKX0L$mWt&0Y zVXyi>Vf)w?(03($kG+QUzt~p)A-11+K@YHPpzpKSK|f&IK|f?~_&;VJu^pfX*_)sr zvz?%aB>jZ#@*iZMvbR7Fv)!Pdu|1%lv$sKyu)Y3|*uU93phww0&@b4#pvOQzWM8uP zK##M3fu3OdK~J&+pkJ}~{U5Ne*$1HCun$2`v5!E%Wd}h|vyc7nv+pGRo*hE^2lff* zkL*+b0rnqu81xML4D=`VIp|q-1oUV2Z~uPw3p)z>tEA`H7fAocj)DHpzV!c#{lSid zo@XaO|70gYFR-sbtJv56_n41;18TBUph8kV`__-%j4(J|K!FN*CgU%p_$g-R@8LTa z>Zk(&+n5~)H4MJL0epTV`1(lr_$c`HX!!J4`0{v`0RNo`znuhs-3)%ZIo@`|FQ>sD zr^64og8#h)ezy($Z9Dkc4)Cv?;8(NYPqSGU_|Qw?J1>LJ%z>}G0zR?_y9$2s8u-I& z;Rk!e|6LEi*BAco2Kc%D@NWa**9OC%-3&i=3;b6e{MIn|t6SlxZi9cyM;%7OD;2;S zjfNK*3-2?IjfcmX08cX!9%d3e%M^H&scag&NIAU6ba;&!@D{V+C1%4r%z;;!3vVzF zUSK|~e*s$vi+>1~ehhYA0bO_mQX&g~6k6~VTK^lg`VzJjt?q$kFM~xdN83Mvmj52M z{3LAnX;ullT?Ko626p-!>~jt5avkjP2Uz2JXv7BC;3ja-V1F;e?l!~Tw!qG|!oIe_ zuC~LTcEFBy;)z|bp53sTv#^=Hu$7;oEx*EA&Ot|hXNCqW1)20fD<-2>e(vCjyc55g z_vC~5FrLq6@x|IZ+Pm5p`VxJuzFptxigLxenz~Y4sjil;j;_mGJzX!lQ{637wN!g* z<J9QXrl~2ZZBnmGy*;%s^_TSbS{9zwFrp)UspJN4g50m-*YH7nD8HSTBlo??{j-qV zV_Z#K$u5`7y<4r^ovDez+zYJSncol3%lzm4Kl<PFKkk3SKhVF%UxYj1jF|%05c3M( zVKe<WJH8lv;OBVx@%xTXJHF<4-!I2~x$D^RV_zTpgzg{Pb?o(HE04`OHsgyw{_Q@p z61O<6q4Zto4-dl^KyP$a|L`at%bQgHU7g}#yg~I}R?3IZr_uhTKO3MS|AH1h4E<RG zJy;H(v;eJjFZAaV_@RfOKl9Pn`{19JLQ6h_SNa^<Q;9a;0&O8ZUIb0v23>v)TCl^? zg8k6!T~ZTPLBl_WM(&aNFc!Y>L+I-`==^x-doeWL1D&4)ttXwI3auxdKLD+t4!yq% zIzIy%_!#tlmel+Y;5$hhFTjtShhI4gANV#jO6k{c(6w_?YhRK2yBU`95^Urv)azyF z`%my_XZ}a~{zv=%A8H>=hqdjym4y$;eTnmj^R{yTeOp=2W?uAU`fVfHZN-4i<+`@0 z=O%tT{?OXuMur<Hy{)U)COy5^pxm@P*8<mq>kAgRdb!5t7i==p<tM%<T#(nnwTTVR zEdsqM*S)DnUQ#ewn3s1M@-ZkMyn@FU<ROP~Ru1@-w>p@3$kw*6Ym?q`K<>cYO|yF@ zZR*i8FUjq8UAt-LfZR<xdnUQ_^6->B$SF9US=7Yh*#VyI8TdX-<uW*TQ;(!gEN{UA z%5!jTntRji1q+fEpdQxWTiMQ9H#n<(qla|^l0Y7i#I;-b>;cFOA8GC+x{>BibA!*k zo+vxKZQsGU*Md`bUOSR`8yWx8(7Q7u(?%G>0o(xLcEFb%I(Eu(x}E86r#sVNK9|1J z*TV)E<1%()5DOp0cz?uq0`D-qW5YY#ndXd%OUvf{y<V@)Q+3p6QI+OJd;;$j=wE4z ztaoCF0lZ`2qVnXsdYb&z7NyKg@#3<1#0~rvy43srDhHSEHwT{C$|CTd)5;@>%GTX6 zJjUJCEw3#6h0EcVS6Yl)*VBgbJBRxI$P?u$d~u$bn8H^SY%bu_M{h3V^HW4g9)Bc7 z6b#)wRLmQy7mIm(x^EG`bvd8DoG%npd4(ulF6J#4tNE>BHTt6hh-?e^aRWsuZc;jI z!~GN%;f(IK4X8_{I(F)s9iNq%-MI~SIiu3Ev*O|t;##J;;$knS8#aimrDx+CRnL0F zDn4SPXXeH=;;7fdM~K%qZaiC=<9U#G;YRBnI~ug6Kg4^&M}I&jHjKl5w`JHW(GCqE zlO*7{R^Ua0R3dSagi|F?sVq|Rqyy_ws$(a28qeZjDlIiGwpElHjJREO{_b=@|MP%v zKt;upIXs?6i!<VTeRJqvXrif)R#ZIt2seaJn7$7}{*Z0%H;pRDs40#8!5Ou80ytto zqK4$iVWrT1EwiKCnU-j>+}T+PS#fD`#9HTc2n(OtJbf1z-i;ey6dU|}?v<mrtTHbM zC*LOgyd58+9lrTHeov++^VEfhANEv=82->7;Z=X~Ay1(^w3q%BZzlDJw47warPieB zyjf7&=s7W$e}m`3r8N-8WDQ(%M#ZEN;ot1r=iRptRnHNZ<2Q%z;cw%258myIclXzQ zH`*DcrxD>s{qK&_`)hmgZX^)3;?IGy!yzpVmdT{FY{67mFx4=ainLPTHp|g9!I9u- z<!IHlRo4XGdqv7e9lw71u1S+-tUT56W1Hu6;iGNV4L`6y?}ZG{7>I}JjVS0KeJ*Mp z@B$8L(eMLtZrHUun^$;vTXD!E4r#eog104C06nzBO1)AKt361%o)*Jj@pwI6WyE-n zzoq4BxwW3-aqes_S2WUcJ;+V*!g#Y_eu1`1C(qIho&^qtV;sZu*K4$=27a@k*QX9> zpB%t98saIx+hT2%kV|7(s|Jv0B%Vr_`i=&%G+%p_uMh<yZ?`s1yUko_dLGoS(JnXN zHs8>?YlqEC%y!j$y@H%=HFP7(nU<aIyx`&ejnDH6E{qF4Yg~%5qon3j$qa3YmShcN zTOtA|Q{Xw9!TeGk*<G^07k9@M=t<(mqq}z>)gsJn?Oz@(4M;t*q_RK^7Y~a@BqWmg z@A@CeKN%x7W%CV?za67LP39jFOeI^Xj-6ttgjh#B%qq1Nyb^3H&7JLrA3*U1`}S%2 z_U)#*4?nz*Pi*Da`o$KgdO?nu{$t+FXT|88%3j>K;JI+Nm*k-@`VN|>h{Whp>8#DF zqYXTemm#&u;%;Y_Ga)WbpXW7a@r7H(EWXRTWC?%9qYw8zqeYo#`}GOb$>@jt;$)qu z-KkCn_*eQ*byBG~D}_2iJ#{I$K%GdI9({;;UFy_@+GXaEQ~UOv;uFN(KkT-7Jfb9C zTqiQ9B0YF2IzQ#7emBZ&yD(~wmo*^|+7KmEJCig~N)%5p9I6<XRG(CbJua$%`(}v? zrNf@p8kvVhB0tN=i^{i3lC@}lkbg1$_g@plAmQ@xKD<eC$<<<<v@<0$dr)S&ED2+L zRgyc7r*Su?UCccnYXi)1FkJ;ssE0<IgU@H6%?Z#d@~C#H(c~i{nO(Mf11kldJ9j0Y z8fbAB@9dV2G=@HLzu?e|{5U`U(&y%R^Ss_cd?Zfrwmh}9SS!5zCh)xG%aKK2^AfT6 z>!OigiW`l#r%#^|B|e|{p89kD=aQFz%o>6dP1ZzX4P{L*5Np+<t36E`n~i8@*Dl#n zMwu{XaeL`~t3|RF$E!@ASj#W{z9d<nFWQSV2<=M#DL?KJTf}?)^RDL7C!jnieKX8` z)WIC^3KDaWXE2(2y}qa6Ac#NsB<uN5?W9PFk~F6`rH}H$M`1pQ-nH-s`NK^8H0Fg= zJCR1%r7qe78j;Q8!Z~bpu9>KP%iqGBi$}aB-Xy<Mz}xDBv@=0o3F8>#P2uV2(g&H* z+8Hw%Z^5OK*Q;F~>Ar#TG_*VQl!PL}IbJT%zBLo|xtSge->>(GQoJi=17ARREH3E1 z?I^EnTvj$$N}EP5+$9bDf>*qBaEGRg#)G{)oL?@s>^MlWdm&Ry$M0#r;p|y54B$L5 z*YTmP5~!l1)V8MJicn5Cdh`^jZ7r-6>PEe{%%A*NB9G0=M2l0a$4Lc1A~hSzz=1fj zGP`EC)F$zDPfiuztXj8j6+cvPz|1fswe`N``U?Fiar4i2djY!E{d{oeq!QknUlTj( z1$6CVllgG2mQ1qq36H)^pX-}p-gvwZKeul4p!2a-zhHYFvS@$^R-i8eL<ZM()QL;3 z5jU_>h)u{8yfFM!nhyLJ&J(rU4rn8H?+~e3yilAMfSnh{p{=x8RT+3*;$LHxECaJ5 z!BVPAKyDDWGuCFH)~(=W-D%k^0Jhvtk2aDo6TkChaaBXk#M%LT`PX7Bz{D%(in7I7 zk>}xtd1u$3_f>h6k2g-*DiOmYTMy_U&0Z^8cUmd*Xv)kKenO#{U5%68!=z=0z24pC zYufd@y_q@MciJv^KJycEJsh~Khpim-up?SXy?z+lmwJ72aF=kWgDMf_)?P+G^s9K% ztM$~LGDmu};aX&s$7A!D!%gbNIE@FS-&WWm9Jxr$1l$1UEH9%wc=;E4Gt<|Hys*oI zehek6ce^8{@D^d7(09|Efj2Rppx4Z4c$Uf}Ur4fv33_a@&wy+$CJ|?radQ1W-ycDl z^cY_1z4Yo3p)^5M)vAxJ2;~r}4vbJ#|3=cuLT^Sr8Vt(m@#^{HHXw`z+O!Mfv<2og zWTEP1jgbO)O4bW+VRS?aWz_>Xh6|+C=t~dOA9Bxz6>%Ywcw3vtXBPz?Zr3j$Z`E!y z@s18H4{%65f$|z1<v0v_?1sZYVaB88-P$MO2lIYyfGXH5G;P|pQmxpM|K-R_VVdgl zspWWo?ML4*4CFBTXtkAnGE$8Y4OVhd_*nHrgjLat)v>XL);%e?a880l59jp!phal< ziD!ke*z}={Ta2|A#u@ii-Axx>QM}1^2$$m;<waF3sjcglB}?GcG|1kokKgF^Ek(`? z477|ft!e?uj>b&C+5Q?6>X{lM@#b&4wfD8%W_L5Q9!yBOUjdmY3kn%M!*pz|Lag3= zr)9v{*NU0LS6p>rZxvO6coGj;JVi@wCbSrZ8b$&=5?WLiNyexUt1ZUCT{RdKNvA8s zdv%#yS1f)h=0#RJ{|G*#fSjxSq64J_{G#QxqHJiL8t!Tm|KXhIR?Yl(^UM+2y>|vG zplop)WSS)XR3mWT6!~)W4UMF~ZEU6FSQyoSKP1Oud8=4A;a<0E-3e~vlf>Em;!5qx z3x^M15Yu_se*Uicsi?|aH-JZ;;`8|OoOJ_)?-cqeOzD%3;Kv~UQOka;F^kb%T;Ua0 zSQtv`Fxo#ywpU|I4&?P3!LDPVIA9|Y8j25(moMkbz2<szz1CVU@huhwd<A`)@5^#w zx3ZtH*N~^ea^Om~S~w(`70zwXn=22PPwmzkalbOastn^(@QyqjZt$Y)iL96Gk1UyZ zA_S^oMn@rDtS_=s4XhM6&Wb^=6@!ioB_+P{E??s1FMaib_|+$h#hrgb^;;N6>4N%i zs2T*mH7e6~8_FacMZSZ2m1--dJUPNfJS*{pQFy{PgQ(@LB)@VzA13Qu%`fo@Es}MP zL4~s@5R`a;ui&c=o5$eo%sA}_-w4r&pOdnii8d<)58+Z@ROyt5Vb#!Kr8)vJVLSxT z<jyt<;kkeFwbfhr&Qf!FJRV~lbp@o`Vy>2p{FDyZP@~X31Y^rTc(_!83r#(aX!Q={ zaFOvN)jm;;ALT%fvrLTX&js@i*f+<(20dFgKPRq0-T+_c&v<O7EPgVz?fPlFqjZDh zL{g@)k%3xT=u@>?2yld$T57}0XD$Bx<FLYsP=9FuLBcS&uZhBp%y^Yo*iM8zqeG8* zTsp?;qSV$GGC~dtAASxj9E({$vVOAA#<*g@Q8-2uWTj~NS_m$!RVZ952t{in`aDn% zJnPaY2*wmn>H#@~S-mtN11HLC2t*Su%S?}#wx8<Ivz!X3rnch!hs{CwYj;J7*L%l& z{)_qB$v0kW#uxE{U9>@BP^Jhok6~>S+Fi!rP%o#Hk-|q8>-qI9b3Eo=?K01tIdjB# zzI4u<loZX)|4i|uh$qEVEa;IkGNM9wrSVKOc%{6fC9k}t@>*RJ>~7`0oLTxUr4?c~ z?_N>reN&tkZTK(q@AT?DyNHcqQmZ*vYN`BuCf^XqzdLx1Kx8n0waDvmH=(sSh2LD< z9qo4M$Ib5CvvA?Ucg+9rKln-Cajj`2aOf}mGqD3aYl#{cxg2npbl+d4huPjkD-se_ z{kQVzy5u?m&P+Pm)MjK#P7j}dPtmCP?*sS0Z8HY(nXNso*H7^H?jjk8xkdzd46{5r z$siFjhy=%p$ZZ?iQKi6lP#S??LU*nzk(r?1blZdCB}iq0S2TOe^Y|{_dfI#usYQJ9 zjy|@DSSl8F`BY#GlX)sLQ;X5C5>4U2=8%75siDfw$PZTc^9p&%!9^MZ7pV^P@z3ny z<GtTKjli;qo-FP(CupAU?=x+v3pD@YF=`t1DHKLAYJkeQRi{vA=^Mr5AZDXBBFmLg zF!@fDqg9t|LT}zDo&fryH+@~iTa`ukpV8k_Z2`YF9Ce6AB(}Pbr5HvvRtXt#puZuV zj}3OXvP!G>@mb;!AMm|+nGZX<9%C7iIY@kT^d@mFe`9d-H<pd?9Z~WM@){@$tx^YH zLJsyjP`{>_;aAU*e^eM<c>?kR0sf?n6S`z&;zCbo$vGhInay8)dGFwNH}QVny-V)# z?pbk{(RA+IiV88woT@GTVZIrrEj|M(^%AmZj&d8r=Tw(V60OswHOlhLbiZjes?l`b zyc%taH4sKW<oTEJyj;?5@wS(rgM)4)B0c;rK1Dnv?&EjRSjMDoh;#({ekJk?_@`={ zhmF?sPptyp3D~m#gn7KTc>Td5??+$qKM~EC=KZt_e}Lc8<o-4y!u&i_P*+>Sp42F% z+W&<!XHB0HljgjL^>}NWjk$quuuMkjfHoWahX-v&^?h~QGmcbirhCC#+ozILmy?ZD z`_I3H+k$f#!6?0)z;LI^*^6~z3x9R{#*N#>g(ud*d-r=I)0(?zD-)QvI0TtUJJ(to zdn~+6`p|%|mkjqiF((oSC+jI|eeUqxx%0(&W6wH|`Rt<}p7eKgDuBCS1=M#DlA~CI z(`bIT>&;!l<30U!h0(O?)Vz88e(h0n-1qlsRg^D&^wW@Ib$?BMl=^Ed-nRN{r^GdB z`!LneW}mqEMWd<jUA=1+28@Jrne8y%|8K!@O<&)`9nbToFYgg&-Voo4-*=&?kM(wR zRh`nEKCGe#U%)R0N11<#;|}Z2!{%P1RCT-o94BTN8d43U-cTD*eQ7KZm}{UGAsnZ{ z=XFhdmtVrO_K1FEr+aT20B-i{ovYpvCwt#}1G+ZkNB!`0<frf)<wvs9E!k~@eFdb5 zXsre4%5}|rS4;B=?Mm|#qp8OXd+<T+JT(RK1D=}%KdMGUgoP<~ZXh2EJK3F4j(BHO zLRw2_R9ZFyO<lD~a}FMy<0WGAY!U}WW#7J{QXJg0iMQvsd$7o*{U(_=Z2rIUo9E9+ zfGBaFc4d$U<u9oxg#VV78-wz*;!?p#S{IZLMq2$)n*~ob2YvenSfKjxv4{`83_r$r zoV^7i|As!O$UHx@NDI@7Jtdn<a6x{A)t|SUXs1ZXq7(cmc_>0|s?AhCPo9cojLjV~ zMLmr2Uez%z4Lw*It~#MDy$M2p1n{l+mfb|hMxz5+wxcb|j)s2ADPxpNdJ>1WpfO`y zuw0d*aw&yABp6H6YRxg$DPPlTPACQ$u{{<#nMl}Vs1*xK#X2)JN^*gdaOMg|!vd-3 z;Jw6PDk+#swo(^Eirkv2jmdIk#>J+kwyGOOGYgB0iwD1U@BITm{kgcfW>8JE%)F`x zH<rD)9syK^fBQMwLz)Vm1uUc5tME8mc3><);|aZ|C>19W``2Z(?2My5;S6zMoQI$D zASezIt9)%m*vW!kL}E$Gm*TyMOj*&7fLaBjAll1C;+L64JTf#Kf-Ye|`2bvSB`Pig zU8BA=2J;IvI*vlVvA8ZaXGYO;(x@6?2#S;Fr=U@Ff+Y@zrB@yrf1{iT@E#{ip}Fd4 zTy@9bfignI;`%t`UVA`pWe(Y3js)a$jEQKh<CZuq1$l>#c2wlrg|aF2SL2=-v{3zH zA2e5u=ydh)NB@tqqq_XKYw_cjcGMjFQ0lMwN&nyD=avwD?1q$23#{l2$R-fkS5nyq z8wsRRgQ*sOQ)YTrOj;{PTK!_%=h^5fKtMAzuwN}YBTD!xD@iA1TN0k8woI2uQne&; zt5!GA`1S9#qte&<nOXtOs)r+emDJv9{rX7qlrF7LarD>irW}3!<xjFqv_2kQ4O*+T zSCWmxVe!#U_T;T=X;$mMp-*}(4_!ZhGebRfeN4^@_1X#p57oB-8#u8BBrC*k|2O*R zy2E?(vrr#hbFeRZl8@FOlRjGd3&amk$Z@%v{f&VXX^av_;{qwci;U69ao0ai{|IiO z=2%@DM&_sdQ?2sit@2_~UVQ!KrT?Sy_}ii7!QLtEkSOQX2~W|OFHpa2@b;>v+wjDH zQD=l3$*k+G_72OcYt?*~v}Q|ZWvrHXi3h5nK1Ojv>w+#C3kh@q^%kl%C$p_pWRzvD z=qs^wgTEnTWDXf2p=cwQ2!>lTt8&at{cwLTZzW0<O6KoK`PF@&W~k_W8b3KyYtfjS zVs16w@1)+x{wBtMg#2l)hE{4&WP@gQ?Ra0UfeH(z8dxbcj<>{(Y@JH57H8jE^3<_+ zglS>GsA^6;5YMI>hLJQSU&`wdZ<8S?D~lP`@_|ws&21l{EfRuQg5Cy}s4*@NB8uwq zxn{RKR?UIBZEdxqBKyLa9r9PWf?`zE-_z_yG|g{F3D#bZL&k+QMm5Lq+RK>ju04*o z9hYL3c6G6GNY9-pN7-@Ra?&qS&bo`0)2Bu`Xiut7ylhcINs%G-*#@7iYPJne)LTbo zOm(WspHPimr>b^6#Ez)06z~3LSglTBx*a-ErzG1_sUCs0`$(3P09qdsR6Sdr+_lq| ze$*{tO|^<xIJr4=gla>PGm<FTi5f+6sU@T@DkU|$#`s=`zJ!kPuTWMTI?NB+v(oqK zvdG(qmPMLEI>Q6Lzg8?kho%2jS(fd~dGY4Z719(!TB;nS{km0~>Uxph1nL@JZ(X_4 zn@|?S+G_t$qt41x=!y^Mi_(_Rc$`A`G*+)qwzRf}aDHfkQI;pEQCQHYVC-z+Hnkog zI3E*SN$7TJWB6q8uoq+T8HjHVuk>xu2UYTCpbG{1BJDv-w<!i2ShH7Wb?Wp`IAZXc zxWkHVAs^+{XxvJ1CajY{U0SGxxFM@003rHr6dC-}jW?GE<_M0a?AXzn|A+7HvV)@T z)=YtnPxv<)x7sSP!k27<BE(qO)LEm&R#?D_$${7egxcfdVjW!!g!WrF3brlR+VjXK zpAtWcr`qvyvAt7|;e7S(?dJOLr}zDADj&X-KUuJOj;N}**)y-;fx_s?3)bDcbR@|G z>-@H$tTgmwgrBIz0;_t-du~J2Db=!&m|!Z!O34}5K;%xX2UE3H%a5(KfHCR`tjwWU z-tH2yZ2ENm?wXCX6nS?EpHW_pc;5XbyLXrDrbWnec-sY+4XEHUvNuN@o^xG~C$T8> z>iJJrEX5d%;u}JX)?b8ls09P_GBKUA<e0kPFn+X8K<HT}ZqyNg06wAqOX&*5r^(7O z%W??-0QxcXu&*Qj{W=$(f=axxpYP<`hyEFDKl7(GpGS6mi|tXYhopR{y=hb&A$u~k zi!;uMi#4$9EiIcWi+TC<&J-c^@DKS0@gbtaxpU`zC026R@8YcfCO;&m+&1R^-uJyJ z4tkaiyzk`?Xa6DI^z}sbU@IQ&cKtWoI?Sav!8nQ5<|Lu4=CW6B&XQ!SIB=g*R1d1R zBO$F-HngM-cP7Z`?!aWe+r^iB^SEd0uospOd3-z{E0&2TuIC&0OQOFRp`Fv3%r43_ ze{PpJqK|M7=S7$yUnCymWB3c=W|3c$AL<X(dURzq+rVL@wcfOel>$Gtiib_4W}|Hq zvIA2(TF=^S4C~$Z<jKChdk+?0a`)ig+Opb=983D<lcXyW#LwbH0+>SVL;KCPN!oEN z>kbJ~Yfu!8<{qha2=@^ZQ1gM9e~?m(f^=0X#!7)-r2&YOWF;Y@o94tm0jIX~&@EVp zTyp-GaX0>S?XNaZZ}T~AXm9g2ZKe5v)(M}@%@cG<9jh@<N}SMIVHta&dD0WAZ^z6m zCXU*G=Riy~;IHWowSG_eLahxPAk6^D`BgbDZvPbTMKfBvO>fZ~G=FbE7PZ%$;cNiw zo?Ja;)mz=8*cn_0Eo!9;Yj_geI)Y|KAK$iv+CcN%NuDnv&2v~nHsUgo{T7%|YpIM+ z%{d-%h0=%6H7+r7)J#&R-4Y~qg}uV8SzoN%lll<Qigd*8cq^@;TK%FmG&5-d%!OBs z%lB68(LTVEXe^Ds@T2yzS{U7cVuvJS_<V!fJHAG&Fak2rVB4xqZNXH$mBOf5#+gx9 z`bFbnUY&k35Abok^swm9yNUU5nDf1A=LN?cq4|(D#q8;s=n=d4mG~fe%DEhxZ*ocm zLG`3IP;+mAl@qi-Rz+{s3_)ru6o}Ox!8wBUbFT4LPZA6eol)2d@wJ>LfL0(LVK-4m z7`SgI*Cdfl<8U>{m4>=T!s=;ehh|Du3VIe;@t97NyEa-Lnb5`U(gPE}sf1;mfys9* zQmuJxZO!@mK3ek}Z<9Zj$M9n#FfUxO<blPz{fj<1A<Fm*%cqM|>#W6(vv_pJN3s_$ zHg|{}&6cLjoy)K1SH+K6tN1qZz_-GSwCba#K7hxd7Fa8cNDG?r%M}I(jnrr^&DTnI z?e%@BIWd!l88zQbt&y5f!%PHCg;0Mb=IVc-tkAWnF|f86?0i9V6-!XDvJis{s&Q&7 zwHB54!ED_h-ogB5)7){8R@7Dfka_kj9P?>flB!~<6t|c8s$PX!m-Y?OsvRA9dtj27 z&TD~9M_<S-N5l*EG`xvD4Yan6YE70&<2M>15gNb@2NupK%75kBdqRMi69XwNg5Mz? z5D)M>)F;(16L~%qk|*&&D|X1IQLojN^5Zd*`rhN35Fif)5}rU->J#~?ID31H4kIN- zr2Hr^8c|S`UG3bV=)Ou(lwGA7S*aTFcA(R`G4?%hav>r9WdVPu%I=1;)tUrVcFp`0 zwy%??t_K6k!H|7OJQ=n^>+BGtCY}51u|wS`@@^~tx{>6h8e<38WLSpmXPU^Kn0mf= z$Swk&NbR(UwNjz0=m0C+@#JAO2T15zI^#RvpSx2u-855n>+w}#W~N8$h7RQe^BpZq zJK$L&HhaVqi{NymKX8nfc10MB_Fe^|lg+?|8(cWyeH%-Efb&pfs+tSA)`JYMhBt7v z!s-(3CS`bfhkzGo0P{<}a~jrkew%Mz#TP$1_klfP-#t^r7b2p1cy*M=V(Khv?OJjI z$%|c^XwHi;^;dd&NWVtytl}WbhB#KiWA|N*o=&@U@C!^{WAEKxy^puuxOg+XtF@_> z0q`L9UeUf8wU&uWmwT@QZ>Z7;H(va?z&;}DIg-0ap9&jPaSy_ngc~Vp5krf`fbeP5 zQlLA<A$SGaSA=a#p1}Sh@(bOK#`;mYV~+d+Aym~flI|cEY?`7q5ZFXTARZg30Fh`j zRm<$o37Ao)eRH3cO_*6cZ${zll4+OqoLw@zc;<{d$|jU`Tm2h;v~%U9clPXgXKDH1 zB@1sYFTE=#=dRN7G50)h-|xT6wFfjl@n{__KcYMnAq=eNgGVZ;?SN$e>fs{ze85tb zw+Z?g%e_#4Simdz2%K+K4+fu!A1wkz>WAO1r_23TYE58m+(SFLYUqdD(PeFwKnbvQ z$6;HgY+tnxu?@y5Z7j)F??v3oGGP-OwxT@PKiiL(UMo_~FS0+;o*z0Y6h)zbL4E4o ztvI>n@G<C@GvFJYIL|_%3G&N?>c}tGH|t8CC-80KV9IHwYWP+)lCR@h`BpWY4{_O! z3@i2%m{ZIE57EJ0QWUMOUMU)wCnr9Gct@3m75#GAB26`F8LF6XLS`FfF%==RjrI3W ze_swY>WoNDoeFC;`zJZ)33;iwML*0HDm+f(x`5}B<3rfEoPi9flztZsep_{o)O5CZ zJfupH6pa-_=Vhr~Db~b+6x6CY8P5&Px7NI@o%&EQHZ)u0D`U-azE{PX$&Nx}y$Y?+ zjH1U|qWWZ;hg;n-(^Rb3k%9XDlUT7tK&pK`-Zj;_gRGZWYQwBpu_eofa*V9v#L5>_ z9)U;?At|*c06C0NgPe=kjaH0Q$H7$|={4%6DX4)ODLl~L!k~XY4qO)*Oc$kfLBXY} zpg=hpvK$qktsQUvNAcM@#cR`*gzK`<IS`kxr>=h;i>_0cezCgRX)+S_0X?R<bm*I! zOIN6#aAOo=LgZnUz5!uaYuahV8#<SsB1-E_r7J-O^3FisvC_}bh#@p@id(8uNS^hS z7tqS!QhNS}l3tx+E#U>qtyw3E5nz?FwPud=EVNFfalr!gi`2;y7{=*_&?4-#R-INs zlP{^eF58-Qv1X|4nrc+)Pv>Fp@)GD(aLtaEYhhHZ*|8Q<aKy8Q;zYteXakz<QBjU< zXst*Vh8Ce6z=0GYe!ADOle6}!lhD~qaXw_e5-|$+F124rt+pcHrFIqvA}8Unw!kQt z#?(3%(W{+29&NE%f)yaNoyWI_f4x~GOFaUSd)~><QZ!3NFqCbpk-IzvRq{%+N-9T8 z9DE~^sF#wtjomDkK_{6lU2BbXLxlSYnbjM=jjz!+*I4Z%@r$*;OQCudL!{L{fxT}{ ztW>R4JUVJjztOd}z=_CPber#6J<(Tn1NVh&h7-?tN<5;x7ul2CmjE9b4y`9S5btUi zCiWm(t*273tT;CZ*rYvH=!YKBqkKp8LuNxgTueQTsEoBgfsfg-gPM#mC)UUT0|)XZ z#HykbHY;yhC8u`#U|?dclB2w9td!&59SAO#)1qbO7T@p#ls9Re8s8EosLeM;i!W9K zTa6mLLw!@Q3c>!#s>6w3IV7LJN<Sr^Kpm)@i`B+fvo_jbnyInY{%N-c{92+IVtXC3 zYJm9aKuaHE;RA5ouN67dgDHD36&6f|2U87$DW{bRMI+p8mzz<s`W_L`u62Nk@&0=^ z-`u%-?zhi|V6j=Fd&bU*U4QR%YFG3(Vu*eQV?bJ?La0}H;a1?5cCD%XPtIT}C75bq zrJzZH(2qO;0E@0`Y?I|RSgf%+V@>ELjMf&bZ`QLiLo^Cy9QsK11)ZT)Sfn#Fa;5za z40cQV9cV>iAQfw+LToJ<E2cgLi{z|5rhz@DVy`GY*h?F%wdqxvV_s<{<k)@Gy2=i= zV6KnKB@{p_zZ#?5|Edg{-@^=zwRa=1mt%`4-JHS~@=-K7<1oKWvF(-$B=H^A$0>UV ztX!lRO<*N{Kvx52F;FB$SzcDi3Oed5b-9O7yPpiAdLN-esInZ)ombB#(%cO7DuEU5 zYJP?$DAYVRa<4U~jxws})A@d~hR`+dfzUL`4ehlJb<*LPsJ*Bh+Ka7W7Ag>34WweM zdx+~nay&cUUEiKNJqPOzvG2d$jd!xDe=fh+_Pgq~{O3IBA!p*$UQe#=6Q!%@M4Y;7 z%B4Imd|P*AIod)DvGyP*O5aWLp_QtQpk+!vw3^uJ7tt%CkC0bQ`wHwfrhUr#mSf8L z*9W8Q<OV{`NZG#;*w>@xf(R)kqvROOMJfAFv{Gn~K+spk+$kVjlY#ozxh%K1*;Q+? zi*MNq%OfqLelwnr(Z?D?(Erlhq@1<rVraG&S_}SWIq!58rk9po#XITSR*Vr-O_MJy zgnHtKc8Jh#XPnizf*r%E=`uc_KgaiIhL);z(fVN9cZufFUeu22DS9t`j=oj@)JQgN zGK!4{jdjKztj>+Jjm6pL@7shu)!xHC+`hp6qJ5|R2v~`C+~_EGR65>roC`}0yFIKt zY(?0Pu=C;Z;g^Mv44)BR5xy>bfB3QRUmCP;FrvZS2AdlkZ)k7Wvte<=c@3Xyc(mc! zMr|7nX*8?RhDOI4iHJ)hhD6MXSQT+J;zDF<WS_|L$Oj|0MZVv-QRAB$Z)kiZ%80r& zYHZY|sPoPnoy(j@qdP{=j@}x5Hl|BVX-q}TrkG=~EVg58LF}^FBXN;&SI3pdZHW6N zJ|q6R_~Q8G@gF8+B=krqNLZe5vPs(}lbg(IvZ~4Vi7oJ3km!-Wzcg*#^rogI@^@L& zo$^;CwN1J`>8Ye&=r=h!IWxIe^3dez@^^dkq2wQve{81VH?`S=%|1(sO1Uv*ddhPt zdsEIek8R$$`Pk;`njdpDa$V<|=33%fgWu2o`q!<wTmQq~es1+U&%N1wGBrN6PikeV zFYVH_acNJb9cq!%qM$`(i___H)(UeS8uUp3Oggl4h~YN%j{|O2G}&JXT}i+loR$ts z=Ra5C6w$8!dqKPT2ZH8+UV>Ad$AONNbd;ovB(0QmrKDRV-72XMv^~y$CYm8>rlg%E zEs%7Kq!p5`l61ACZ%VpT(p{h(WIi2aJ{@rWGu@$lI<T(TjnaX2lQc&hN1Af(fOCwA zQqCQ4nl4ewxdTq7B}zGWz?rn;(9cu7vShuoa4IsTsa{z)kC!ObD+{OK5~X@&F{)P= zoHbp^x^NA&D{{COv?uO&#ktT#drNwqq<thE;4j1dfigWv(!rA6B<anP4w3X0NpmI5 zlXR%0!z3Lp>8+BEl;w_+v`F3=C+T=eizS^PX^Es0B`uY7lBAO*og(R-l1`WOE=gxd zI#beFlHM)pY)S8tbdfCGBh!ybS}E_Wl=K;SXNyd4mGn<}r%F<vykp9=pD5>&>XO<( zyFs=CL3{dFfcC=k-5^_{*Gbw((gA3NZjdd}LGsREnZ8M;Z<gsHGJUH|kCb_ilC((X zJWkT_k`_xkLDCXQC(3tAC7mScWJ#w;S}yavQ>Ld&dY7a#B%LYgB3YJ4=JuGpQz`GP zl=K;SXNyd4mGn=UXO*NrdB>!8As^I{>-0Rgf#yj0<VfAik-C>7buS0<8HaC4_i}L3 zcqJ&wCkOJOJ0zbRoHR~pl1~m!8mDxwOb?TkWR(NE7zj$T%E5Wy^bF}(4o(6mN;;N< zlfa3Rj^*GaaH6DRIXDTNDCt-Z&HyJ$vdY0(-;^dz%fVUSL`l<faLPB)S@M~?C7mtl zJ(7|Pa}X(^XGqg>V4-w}WSE2VvFQ%UFb8%@lw_F0NQODES-L}-mV@JML8T;fAW2G- zrj3*yZ>02iBc;b1CGU)qcSgxOuyx2BEr8sRE9gpjXQjNeQr_7j?`)BGw#YkM<(;ka z&Q^Kni1cPhq&GVvz1b1z&5lTKc0_u!BaFP+5$Vm2NN;vTdb1<an;ntf?1=PcN2E79 zBE6YUmgSRW`KT<eNl!(%AQGqIBB~*O=76d+$LMB`m8Lyo3#~LE!NpeEz%wsdX_|qh z_$vL_asO=~CvIRalN;=PE6o{B&9c%s&x(I-rFC`%{ttzE-eA#MM=Nb(@!Hi^8qshq zcdaY4W5-KfSL2_}6u54fSW=ch#?{U>y0Ea=HF|Pkp{s17tDtB~+2o>;Q_Bi#e=~JT zp{ulT@|1}s`Ngh$WH4&tgb9U{M-}1EcCN|zhc~YLva<Y9V+#vhWrgKsql=0QU85&X z##fZ(sIsDoB~u3HmrTj0)S$vKQ;YK_2meME7vV1W^$-+{w_KgtX9n-#++G)En>*t7 zQlzfNnZlFl?0uwfz!||MI2$-0rwO|db#~!=;X?ct%hY6<cH#Sp_`3jS3)AV@lkquH zo+w=Sm+wr)8}w8uD4j!0rRB@q^DPcW;ob!N()Xi~v-*}eq0;jum-#4_cpQZ@z45<l z@Ld@`%RxuujbfyU?}>Ory%pec6rL!OWlq7#;Z))j(7?SxcyA2qQH*<&FY>*T$KR7( z-Q0&DcdD@}--SJQ?a>BxpObMooNYav<`U}uaEcOY7@Ph7eKI?pXZ?TYT=oi_sQoBp z_n16uz51l}=j3VCFUT{k)%ohR&sL|C)z!J`>O^&Qp87ug&w=-FcK3dqmHj^cx4?%u z7n}Zz0G-<X8T%X_@ff31-%raE-haU9?R4_>PdJZVos_N4VW+d<PvK1XMet!uaKg7b z7yb#1hn~h6@N@#a7pJ=K#97|-{|NpqPuu>I;beJ^qdhT(w&UFPFdmL``~`2o8}ddx zf=BYkJj&L-WNLA-aqZN}6OEw-6U&V0Aoij8qu_|_)8&Wbs)=JJmK2V6<f~8njq2MH z^)Xm|Oi|BXYdu@2K5h8-Ta(L_8giWSPPiQr4MYLjGG3ftR)Sa#VS038@*7V7kBjC8 z)nE9I^qJ!hH-^e5<AGIy3~+w`5NN;x)cOK<@eD0i`&8eozombuAJc!-FBoA)FXJY> zNuvTyQW_a(a%7N*d-M&>3sVnB{U7yy;SxL3h=6c2p=QF&gqXMBBD73cxsmMcGLXu| zMX0?17vXb4=Y-8y<04#6sC*Z$#&zBxlusC+`ozC_`|oij`$dW0FO&GaC(0%4PRO0G z6Co$U?1b0}GZ9)RyhKQyuo9tk!svOp2%i%=Cv1KzF2d!6$_XzKS|Y4ONQrO~p(Mgc zgpddy5jrAlM3{&W5#b?1LxhD0a}(kwyiI7Eur}czLO+DE31buPA$(2f`cI?@Sre`% ztOKM&h?-E2#5f%#S|lt@NSbgop=iR;gb)cI5_%?VNXVIRA)#i%frJ7H0}@&$tV~Fm za5AA}!pMY>2_F+WCTvW|n6Mt9V#36PhzSo98YUb^NSJUiAvnTsgn$XV5ppBkMyQQ2 z8&EGHHA1`+@6uRnphUZM+bU24YAdP%wH4KX+Nl!lQ(3Dff4^;1O)l0xm1v(zv`;14 zr_!ofpnU>0qxQL2%>wO1wNvd=)4Kk9{`x<&rJ6i&i6s%4LJWca`$#fk1DDAEE|LW= Y(-osHj2F<;P%p3rF{>lYhrW~jFV!_TuK)l5 literal 0 HcmV?d00001 From d032050ccfce1becef0b0e13e3f7b71b2d6de4e7 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Tue, 24 Oct 2017 18:58:55 +0200 Subject: [PATCH 059/211] Added example demonstrating sf::VertexBuffer, sf::Shader and sf::Thread usage. --- examples/CMakeLists.txt | 1 + examples/island/CMakeLists.txt | 11 + examples/island/Island.cpp | 590 ++++++++++++++++++++++++ examples/island/resources/sansation.ttf | Bin 0 -> 28912 bytes examples/island/resources/terrain.frag | 11 + examples/island/resources/terrain.vert | 8 + examples/island/stb_perlin.h | 316 +++++++++++++ 7 files changed, 937 insertions(+) create mode 100644 examples/island/CMakeLists.txt create mode 100644 examples/island/Island.cpp create mode 100644 examples/island/resources/sansation.ttf create mode 100644 examples/island/resources/terrain.frag create mode 100644 examples/island/resources/terrain.vert create mode 100644 examples/island/stb_perlin.h diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 13542862..a13f585a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -23,6 +23,7 @@ else(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) diff --git a/examples/island/CMakeLists.txt b/examples/island/CMakeLists.txt new file mode 100644 index 00000000..38428e31 --- /dev/null +++ b/examples/island/CMakeLists.txt @@ -0,0 +1,11 @@ + +set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/island) + +# all source files +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 diff --git a/examples/island/Island.cpp b/examples/island/Island.cpp new file mode 100644 index 00000000..50a8f1ea --- /dev/null +++ b/examples/island/Island.cpp @@ -0,0 +1,590 @@ + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#define STB_PERLIN_IMPLEMENTATION +#include "stb_perlin.h" +#include <SFML/Graphics.hpp> +#include <vector> +#include <deque> +#include <sstream> +#include <algorithm> +#include <cstring> +#include <cmath> + + +namespace +{ + // Width and height of the application window + const unsigned int windowWidth = 800; + const unsigned int windowHeight = 600; + + // Resolution of the generated terrain + const unsigned int resolutionX = 800; + const unsigned int resolutionY = 600; + + // Thread pool parameters + const unsigned int threadCount = 4; + const unsigned int blockCount = 32; + + struct WorkItem + { + sf::Vertex* targetBuffer; + unsigned int index; + }; + + std::deque<WorkItem> workQueue; + std::vector<sf::Thread*> threads; + int pendingWorkCount = 0; + bool workPending = true; + bool bufferUploadPending = false; + sf::Mutex workQueueMutex; + + struct Setting + { + const char* name; + float* value; + }; + + // Terrain noise parameters + const int perlinOctaves = 3; + + float perlinFrequency = 7.0f; + float perlinFrequencyBase = 4.0f; + + // Terrain generation parameters + float heightBase = 0.0f; + float edgeFactor = 0.9f; + float edgeDropoffExponent = 1.5f; + + float snowcapHeight = 0.6f; + + // Terrain lighting parameters + float heightFactor = windowHeight / 2.0f; + float heightFlatten = 3.0f; + float lightFactor = 0.7f; +} + + +// Forward declarations of the functions we define further down +void threadFunction(); +void generateTerrain(sf::Vertex* vertexBuffer); + + +//////////////////////////////////////////////////////////// +/// Entry point of application +/// +/// \return Application exit code +/// +//////////////////////////////////////////////////////////// +int main() +{ + // Create the window of the application + sf::RenderWindow window(sf::VideoMode(windowWidth, windowHeight), "SFML Island", + sf::Style::Titlebar | sf::Style::Close); + window.setVerticalSyncEnabled(true); + + sf::Font font; + if (!font.loadFromFile("resources/sansation.ttf")) + return EXIT_FAILURE; + + // Create all of our graphics resources + sf::Text hudText; + sf::Text statusText; + sf::Shader terrainShader; + sf::RenderStates terrainStates(&terrainShader); + sf::VertexBuffer terrain(sf::Triangles, sf::VertexBuffer::Static); + + // Set up our text drawables + statusText.setFont(font); + statusText.setCharacterSize(28); + statusText.setFillColor(sf::Color::White); + statusText.setOutlineColor(sf::Color::Black); + statusText.setOutlineThickness(2.0f); + + hudText.setFont(font); + hudText.setCharacterSize(14); + hudText.setFillColor(sf::Color::White); + hudText.setOutlineColor(sf::Color::Black); + hudText.setOutlineThickness(2.0f); + hudText.setPosition(5.0f, 5.0f); + + // Staging buffer for our terrain data that we will upload to our VertexBuffer + std::vector<sf::Vertex> terrainStagingBuffer; + + // Check whether the prerequisites are suppprted + bool prerequisitesSupported = sf::VertexBuffer::isAvailable() && sf::Shader::isAvailable(); + + // Set up our graphics resources and set the status text accordingly + if (!prerequisitesSupported) + { + statusText.setString("Shaders and/or Vertex Buffers Unsupported"); + } + else if (!terrainShader.loadFromFile("resources/terrain.vert", "resources/terrain.frag")) + { + prerequisitesSupported = false; + + statusText.setString("Failed to load shader program"); + } + else + { + // Start up our thread pool + for (unsigned int i = 0; i < threadCount; i++) + { + threads.push_back(new sf::Thread(threadFunction)); + threads.back()->launch(); + } + + // Create our VertexBuffer with enough space to hold all the terrain geometry + terrain.create(resolutionX * resolutionY * 6); + + // Resize the staging buffer to be able to hold all the terrain geometry + terrainStagingBuffer.resize(resolutionX * resolutionY * 6); + + // Generate the initial terrain + generateTerrain(&terrainStagingBuffer[0]); + + statusText.setString("Generating Terrain..."); + } + + // Center the status text + statusText.setPosition((windowWidth - statusText.getLocalBounds().width) / 2.f, (windowHeight - statusText.getLocalBounds().height) / 2.f); + + // Set up an array of pointers to our settings for arrow navigation + Setting settings[] = + { + {"perlinFrequency", &perlinFrequency}, + {"perlinFrequencyBase", &perlinFrequencyBase}, + {"heightBase", &heightBase}, + {"edgeFactor", &edgeFactor}, + {"edgeDropoffExponent", &edgeDropoffExponent}, + {"snowcapHeight", &snowcapHeight}, + {"heightFactor", &heightFactor}, + {"heightFlatten", &heightFlatten}, + {"lightFactor", &lightFactor} + }; + + const int settingCount = 9; + int currentSetting = 0; + + std::ostringstream osstr; + sf::Clock clock; + + while (window.isOpen()) + { + // Handle events + sf::Event event; + while (window.pollEvent(event)) + { + // Window closed or escape key pressed: exit + if ((event.type == sf::Event::Closed) || + ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))) + { + window.close(); + break; + } + + // Arrow key pressed: + if (prerequisitesSupported && (event.type == sf::Event::KeyPressed)) + { + switch (event.key.code) + { + case sf::Keyboard::Return: generateTerrain(&terrainStagingBuffer[0]); break; + case sf::Keyboard::Down: currentSetting = (currentSetting + 1) % settingCount; break; + case sf::Keyboard::Up: currentSetting = (currentSetting + settingCount - 1) % settingCount; break; + case sf::Keyboard::Left: *(settings[currentSetting].value) -= 0.1f; break; + case sf::Keyboard::Right: *(settings[currentSetting].value) += 0.1f; break; + default: break; + } + } + } + + // Clear, draw graphics objects and display + window.clear(); + + window.draw(statusText); + + if (prerequisitesSupported) + { + { + sf::Lock lock(workQueueMutex); + + // Don't bother updating/drawing the VertexBuffer while terrain is being regenerated + if (!pendingWorkCount) + { + // If there is new data pending to be uploaded to the VertexBuffer, do it now + if (bufferUploadPending) + { + terrain.update(&terrainStagingBuffer[0]); + bufferUploadPending = false; + } + + terrainShader.setUniform("lightFactor", lightFactor); + window.draw(terrain, terrainStates); + } + } + + // Update and draw the HUD text + osstr.str(""); + osstr << "Frame: " << clock.restart().asMilliseconds() << "ms\n" + << "perlinOctaves: " << perlinOctaves << "\n\n" + << "Use the arrow keys to change the values.\nUse the return key to regenerate the terrain.\n\n"; + + for (int i = 0; i < settingCount; ++i) + osstr << ((i == currentSetting) ? ">> " : " ") << settings[i].name << ": " << *(settings[i].value) << "\n"; + + hudText.setString(osstr.str()); + + window.draw(hudText); + } + + // Display things on screen + window.display(); + } + + // Shut down our thread pool + { + sf::Lock lock(workQueueMutex); + workPending = false; + } + + while (!threads.empty()) + { + threads.back()->wait(); + delete threads.back(); + threads.pop_back(); + } + + return EXIT_SUCCESS; +} + + +//////////////////////////////////////////////////////////// +/// Get the terrain elevation at the given coordinates. +/// +//////////////////////////////////////////////////////////// +float getElevation(float x, float y) +{ + x = x / resolutionX - 0.5f; + y = y / resolutionY - 0.5f; + + float elevation = 0.0f; + + for (int i = 0; i < perlinOctaves; i++) + { + elevation += stb_perlin_noise3( + x * perlinFrequency * std::pow(perlinFrequencyBase, i), + y * perlinFrequency * std::pow(perlinFrequencyBase, i), + 0, 0, 0, 0 + ) * std::pow(perlinFrequencyBase, -i); + } + + elevation = (elevation + 1.f) / 2.f; + + float distance = 2.0f * std::sqrt(x * x + y * y); + elevation = (elevation + heightBase) * (1.0f - edgeFactor * std::pow(distance, edgeDropoffExponent)); + elevation = std::min(std::max(elevation, 0.0f), 1.0f); + + return elevation; +} + + +//////////////////////////////////////////////////////////// +/// Get the terrain moisture at the given coordinates. +/// +//////////////////////////////////////////////////////////// +float getMoisture(float x, float y) +{ + x = x / resolutionX - 0.5f; + y = y / resolutionY - 0.5f; + + float moisture = stb_perlin_noise3( + x * 4.f + 0.5f, + y * 4.f + 0.5f, + 0, 0, 0, 0 + ); + + return (moisture + 1.f) / 2.f; +} + + +//////////////////////////////////////////////////////////// +/// Get the lowlands terrain color for the given moisture. +/// +//////////////////////////////////////////////////////////// +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); + + return color; +} + + +//////////////////////////////////////////////////////////// +/// Get the highlands terrain color for the given elevation +/// and moisture. +/// +//////////////////////////////////////////////////////////// +sf::Color getHighlandsTerrainColor(float elevation, float moisture) +{ + sf::Color lowlandsColor = getLowlandsTerrainColor(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); + + 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; + + return color; +} + + +//////////////////////////////////////////////////////////// +/// Get the snowcap terrain color for the given elevation +/// and moisture. +/// +//////////////////////////////////////////////////////////// +sf::Color getSnowcapTerrainColor(float elevation, float moisture) +{ + sf::Color highlandsColor = getHighlandsTerrainColor(elevation, moisture); + + sf::Color color = sf::Color::White; + + 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; + + return color; +} + + +//////////////////////////////////////////////////////////// +/// Get the terrain color for the given elevation and +/// 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.17f ? sf::Color(240, 230, 140) : + elevation < 0.4f ? getLowlandsTerrainColor(moisture) : + elevation < snowcapHeight ? getHighlandsTerrainColor(elevation, moisture) : + getSnowcapTerrainColor(elevation, moisture); + + return color; +} + + +//////////////////////////////////////////////////////////// +/// Compute a compressed representation of the surface +/// normal based on the given coordinates, and the elevation +/// of the 4 adjacent neighbours. +/// +//////////////////////////////////////////////////////////// +sf::Vector2f computeNormal(int x, int y, 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); + + sf::Vector3f crossProduct( + deltaX.y * deltaY.z - deltaX.z * deltaY.y, + deltaX.z * deltaY.x - deltaX.x * deltaY.z, + deltaX.x * deltaY.y - deltaX.y * deltaY.x + ); + + // Scale cross product to make z component 1.0f so we can drop it + crossProduct /= crossProduct.z; + + // Return "compressed" normal + return sf::Vector2f(crossProduct.x, crossProduct.y); +} + + +//////////////////////////////////////////////////////////// +/// Process a terrain generation work item. Use the vector +/// of vertices as scratch memory and upload the data to +/// the vertex buffer when done. +/// +//////////////////////////////////////////////////////////// +void processWorkItem(std::vector<sf::Vertex>& vertices, const WorkItem& workItem) +{ + unsigned int rowBlockSize = (resolutionY / blockCount) + 1; + unsigned int rowStart = rowBlockSize * workItem.index; + + if (rowStart >= resolutionY) + return; + + unsigned int rowEnd = std::min(rowStart + rowBlockSize, resolutionY); + unsigned int rowCount = rowEnd - rowStart; + + const float scalingFactorX = static_cast<float>(windowWidth) / static_cast<float>(resolutionX); + const float scalingFactorY = static_cast<float>(windowHeight) / static_cast<float>(resolutionY); + + for (unsigned int y = rowStart; y < rowEnd; y++) + { + for (int x = 0; x < resolutionX; x++) + { + int arrayIndexBase = ((y - rowStart) * resolutionX + x) * 6; + + // Top left corner (first triangle) + if (x > 0) + { + vertices[arrayIndexBase + 0] = vertices[arrayIndexBase - 6 + 5]; + } + else if (y > rowStart) + { + vertices[arrayIndexBase + 0] = vertices[arrayIndexBase - resolutionX * 6 + 1]; + } + else + { + vertices[arrayIndexBase + 0].position = sf::Vector2f(x * scalingFactorX, 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)); + } + + // Bottom left corner (first triangle) + if (x > 0) + { + vertices[arrayIndexBase + 1] = vertices[arrayIndexBase - 6 + 2]; + } + else + { + vertices[arrayIndexBase + 1].position = sf::Vector2f(x * scalingFactorX, (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)); + } + + // Bottom right corner (first triangle) + vertices[arrayIndexBase + 2].position = sf::Vector2f((x + 1) * scalingFactorX, (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)); + + // Top left corner (second triangle) + vertices[arrayIndexBase + 3] = vertices[arrayIndexBase + 0]; + + // Bottom right corner (second triangle) + vertices[arrayIndexBase + 4] = vertices[arrayIndexBase + 2]; + + // Top right corner (second triangle) + if (y > rowStart) + { + vertices[arrayIndexBase + 5] = vertices[arrayIndexBase - resolutionX * 6 + 2]; + } + else + { + vertices[arrayIndexBase + 5].position = sf::Vector2f((x + 1) * scalingFactorX, 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)); + } + } + } + + // Copy the resulting geometry from our thread-local buffer into the target buffer + std::memcpy(workItem.targetBuffer + (resolutionX * rowStart * 6), &vertices[0], sizeof(sf::Vertex) * resolutionX * rowCount * 6); +} + + +//////////////////////////////////////////////////////////// +/// Worker thread entry point. We use a thread pool to avoid +/// the heavy cost of constantly recreating and starting +/// new threads whenever we need to regenerate the terrain. +/// +//////////////////////////////////////////////////////////// +void threadFunction() +{ + unsigned int rowBlockSize = (resolutionY / blockCount) + 1; + + std::vector<sf::Vertex> vertices(resolutionX * rowBlockSize * 6); + + WorkItem workItem = {0, 0}; + + // Loop until the application exits + for (;;) + { + workItem.targetBuffer = 0; + + // Check if there are new work items in the queue + { + sf::Lock lock(workQueueMutex); + + if (!workPending) + return; + + if (!workQueue.empty()) + { + workItem = workQueue.front(); + workQueue.pop_front(); + } + } + + // If we didn't receive a new work item, keep looping + if (!workItem.targetBuffer) + { + sf::sleep(sf::milliseconds(10)); + + continue; + } + + processWorkItem(vertices, workItem); + + { + sf::Lock lock(workQueueMutex); + + --pendingWorkCount; + } + } +} + + +//////////////////////////////////////////////////////////// +/// Terrain generation entry point. This queues up the +/// generation work items which the worker threads dequeue +/// and process. +/// +//////////////////////////////////////////////////////////// +void generateTerrain(sf::Vertex* buffer) +{ + bufferUploadPending = true; + + // Make sure the work queue is empty before queuing new work + for (;;) + { + { + sf::Lock lock(workQueueMutex); + + if (workQueue.empty()) + break; + } + + sf::sleep(sf::milliseconds(10)); + } + + // Queue all the new work items + { + sf::Lock lock(workQueueMutex); + + for (unsigned int i = 0; i < blockCount; i++) + { + WorkItem workItem = {buffer, i}; + workQueue.push_back(workItem); + } + + pendingWorkCount = blockCount; + } +} diff --git a/examples/island/resources/sansation.ttf b/examples/island/resources/sansation.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d85fbc81d91e22c647a3338a37f24a9d684dcf8a GIT binary patch literal 28912 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 Y(-osHj2F<;P%p3rF{>lYhrW~jFV!_TuK)l5 literal 0 HcmV?d00001 diff --git a/examples/island/resources/terrain.frag b/examples/island/resources/terrain.frag new file mode 100644 index 00000000..ae181871 --- /dev/null +++ b/examples/island/resources/terrain.frag @@ -0,0 +1,11 @@ +varying vec3 normal; +uniform float lightFactor; + +void main() +{ + vec3 lightPosition = vec3(-1.0, 1.0, 1.0); + vec3 eyePosition = vec3(0.0, 0.0, 1.0); + vec3 halfVector = normalize(lightPosition + eyePosition); + float intensity = lightFactor + (1.0 - lightFactor) * dot(normalize(normal), normalize(halfVector)); + gl_FragColor = gl_Color * vec4(intensity, intensity, intensity, 1.0); +} diff --git a/examples/island/resources/terrain.vert b/examples/island/resources/terrain.vert new file mode 100644 index 00000000..a06996df --- /dev/null +++ b/examples/island/resources/terrain.vert @@ -0,0 +1,8 @@ +varying vec3 normal; + +void main() +{ + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + gl_FrontColor = gl_Color; + normal = vec3(gl_MultiTexCoord0.xy, 1.0); +} diff --git a/examples/island/stb_perlin.h b/examples/island/stb_perlin.h new file mode 100644 index 00000000..5d762220 --- /dev/null +++ b/examples/island/stb_perlin.h @@ -0,0 +1,316 @@ +// stb_perlin.h - v0.3 - perlin noise +// public domain single-file C implementation by Sean Barrett +// +// LICENSE +// +// See end of file. +// +// +// to create the implementation, +// #define STB_PERLIN_IMPLEMENTATION +// in *one* C/CPP file that includes this file. +// +// +// Documentation: +// +// float stb_perlin_noise3( float x, +// float y, +// float z, +// int x_wrap=0, +// int y_wrap=0, +// int z_wrap=0) +// +// This function computes a random value at the coordinate (x,y,z). +// Adjacent random values are continuous but the noise fluctuates +// its randomness with period 1, i.e. takes on wholly unrelated values +// at integer points. Specifically, this implements Ken Perlin's +// revised noise function from 2002. +// +// The "wrap" parameters can be used to create wraparound noise that +// wraps at powers of two. The numbers MUST be powers of two. Specify +// 0 to mean "don't care". (The noise always wraps every 256 due +// details of the implementation, even if you ask for larger or no +// wrapping.) +// +// Fractal Noise: +// +// Three common fractal noise functions are included, which produce +// a wide variety of nice effects depending on the parameters +// provided. Note that each function will call stb_perlin_noise3 +// 'octaves' times, so this parameter will affect runtime. +// +// float stb_perlin_ridge_noise3(float x, float y, float z, +// float lacunarity, float gain, float offset, int octaves, +// int x_wrap, int y_wrap, int z_wrap); +// +// float stb_perlin_fbm_noise3(float x, float y, float z, +// float lacunarity, float gain, int octaves, +// int x_wrap, int y_wrap, int z_wrap); +// +// float stb_perlin_turbulence_noise3(float x, float y, float z, +// float lacunarity, float gain,int octaves, +// int x_wrap, int y_wrap, int z_wrap); +// +// Typical values to start playing with: +// octaves = 6 -- number of "octaves" of noise3() to sum +// lacunarity = ~ 2.0 -- spacing between successive octaves (use exactly 2.0 for wrapping output) +// gain = 0.5 -- relative weighting applied to each successive octave +// offset = 1.0? -- used to invert the ridges, may need to be larger, not sure +// +// +// Contributors: +// Jack Mott - additional noise functions +// + + +#ifdef __cplusplus +extern "C" { +#endif +extern float stb_perlin_noise3(float x, float y, float z, int x_wrap, int y_wrap, int z_wrap); +extern float stb_perlin_ridge_noise3(float x, float y, float z,float lacunarity, float gain, float offset, int octaves,int x_wrap, int y_wrap, int z_wrap); +extern float stb_perlin_fbm_noise3(float x, float y, float z,float lacunarity, float gain, int octaves,int x_wrap, int y_wrap, int z_wrap); +extern float stb_perlin_turbulence_noise3(float x, float y, float z, float lacunarity, float gain, int octaves,int x_wrap, int y_wrap, int z_wrap); +#ifdef __cplusplus +} +#endif + +#ifdef STB_PERLIN_IMPLEMENTATION + +// not same permutation table as Perlin's reference to avoid copyright issues; +// Perlin's table can be found at http://mrl.nyu.edu/~perlin/noise/ +// @OPTIMIZE: should this be unsigned char instead of int for cache? +static unsigned char stb__perlin_randtab[512] = +{ + 23, 125, 161, 52, 103, 117, 70, 37, 247, 101, 203, 169, 124, 126, 44, 123, + 152, 238, 145, 45, 171, 114, 253, 10, 192, 136, 4, 157, 249, 30, 35, 72, + 175, 63, 77, 90, 181, 16, 96, 111, 133, 104, 75, 162, 93, 56, 66, 240, + 8, 50, 84, 229, 49, 210, 173, 239, 141, 1, 87, 18, 2, 198, 143, 57, + 225, 160, 58, 217, 168, 206, 245, 204, 199, 6, 73, 60, 20, 230, 211, 233, + 94, 200, 88, 9, 74, 155, 33, 15, 219, 130, 226, 202, 83, 236, 42, 172, + 165, 218, 55, 222, 46, 107, 98, 154, 109, 67, 196, 178, 127, 158, 13, 243, + 65, 79, 166, 248, 25, 224, 115, 80, 68, 51, 184, 128, 232, 208, 151, 122, + 26, 212, 105, 43, 179, 213, 235, 148, 146, 89, 14, 195, 28, 78, 112, 76, + 250, 47, 24, 251, 140, 108, 186, 190, 228, 170, 183, 139, 39, 188, 244, 246, + 132, 48, 119, 144, 180, 138, 134, 193, 82, 182, 120, 121, 86, 220, 209, 3, + 91, 241, 149, 85, 205, 150, 113, 216, 31, 100, 41, 164, 177, 214, 153, 231, + 38, 71, 185, 174, 97, 201, 29, 95, 7, 92, 54, 254, 191, 118, 34, 221, + 131, 11, 163, 99, 234, 81, 227, 147, 156, 176, 17, 142, 69, 12, 110, 62, + 27, 255, 0, 194, 59, 116, 242, 252, 19, 21, 187, 53, 207, 129, 64, 135, + 61, 40, 167, 237, 102, 223, 106, 159, 197, 189, 215, 137, 36, 32, 22, 5, + + // and a second copy so we don't need an extra mask or static initializer + 23, 125, 161, 52, 103, 117, 70, 37, 247, 101, 203, 169, 124, 126, 44, 123, + 152, 238, 145, 45, 171, 114, 253, 10, 192, 136, 4, 157, 249, 30, 35, 72, + 175, 63, 77, 90, 181, 16, 96, 111, 133, 104, 75, 162, 93, 56, 66, 240, + 8, 50, 84, 229, 49, 210, 173, 239, 141, 1, 87, 18, 2, 198, 143, 57, + 225, 160, 58, 217, 168, 206, 245, 204, 199, 6, 73, 60, 20, 230, 211, 233, + 94, 200, 88, 9, 74, 155, 33, 15, 219, 130, 226, 202, 83, 236, 42, 172, + 165, 218, 55, 222, 46, 107, 98, 154, 109, 67, 196, 178, 127, 158, 13, 243, + 65, 79, 166, 248, 25, 224, 115, 80, 68, 51, 184, 128, 232, 208, 151, 122, + 26, 212, 105, 43, 179, 213, 235, 148, 146, 89, 14, 195, 28, 78, 112, 76, + 250, 47, 24, 251, 140, 108, 186, 190, 228, 170, 183, 139, 39, 188, 244, 246, + 132, 48, 119, 144, 180, 138, 134, 193, 82, 182, 120, 121, 86, 220, 209, 3, + 91, 241, 149, 85, 205, 150, 113, 216, 31, 100, 41, 164, 177, 214, 153, 231, + 38, 71, 185, 174, 97, 201, 29, 95, 7, 92, 54, 254, 191, 118, 34, 221, + 131, 11, 163, 99, 234, 81, 227, 147, 156, 176, 17, 142, 69, 12, 110, 62, + 27, 255, 0, 194, 59, 116, 242, 252, 19, 21, 187, 53, 207, 129, 64, 135, + 61, 40, 167, 237, 102, 223, 106, 159, 197, 189, 215, 137, 36, 32, 22, 5, +}; + +static float stb__perlin_lerp(float a, float b, float t) +{ + return a + (b-a) * t; +} + +static int stb__perlin_fastfloor(float a) +{ + int ai = (int) a; + return (a < ai) ? ai-1 : ai; +} + +// different grad function from Perlin's, but easy to modify to match reference +static float stb__perlin_grad(int hash, float x, float y, float z) +{ + static float basis[12][4] = + { + { 1, 1, 0 }, + { -1, 1, 0 }, + { 1,-1, 0 }, + { -1,-1, 0 }, + { 1, 0, 1 }, + { -1, 0, 1 }, + { 1, 0,-1 }, + { -1, 0,-1 }, + { 0, 1, 1 }, + { 0,-1, 1 }, + { 0, 1,-1 }, + { 0,-1,-1 }, + }; + + // perlin's gradient has 12 cases so some get used 1/16th of the time + // and some 2/16ths. We reduce bias by changing those fractions + // to 5/64ths and 6/64ths, and the same 4 cases get the extra weight. + static unsigned char indices[64] = + { + 0,1,2,3,4,5,6,7,8,9,10,11, + 0,9,1,11, + 0,1,2,3,4,5,6,7,8,9,10,11, + 0,1,2,3,4,5,6,7,8,9,10,11, + 0,1,2,3,4,5,6,7,8,9,10,11, + 0,1,2,3,4,5,6,7,8,9,10,11, + }; + + // if you use reference permutation table, change 63 below to 15 to match reference + // (this is why the ordering of the table above is funky) + float *grad = basis[indices[hash & 63]]; + return grad[0]*x + grad[1]*y + grad[2]*z; +} + +float stb_perlin_noise3(float x, float y, float z, int x_wrap, int y_wrap, int z_wrap) +{ + float u,v,w; + float n000,n001,n010,n011,n100,n101,n110,n111; + float n00,n01,n10,n11; + float n0,n1; + + unsigned int x_mask = (x_wrap-1) & 255; + unsigned int y_mask = (y_wrap-1) & 255; + unsigned int z_mask = (z_wrap-1) & 255; + int px = stb__perlin_fastfloor(x); + int py = stb__perlin_fastfloor(y); + int pz = stb__perlin_fastfloor(z); + int x0 = px & x_mask, x1 = (px+1) & x_mask; + int y0 = py & y_mask, y1 = (py+1) & y_mask; + int z0 = pz & z_mask, z1 = (pz+1) & z_mask; + int r0,r1, r00,r01,r10,r11; + + #define stb__perlin_ease(a) (((a*6-15)*a + 10) * a * a * a) + + x -= px; u = stb__perlin_ease(x); + y -= py; v = stb__perlin_ease(y); + z -= pz; w = stb__perlin_ease(z); + + r0 = stb__perlin_randtab[x0]; + r1 = stb__perlin_randtab[x1]; + + r00 = stb__perlin_randtab[r0+y0]; + r01 = stb__perlin_randtab[r0+y1]; + r10 = stb__perlin_randtab[r1+y0]; + r11 = stb__perlin_randtab[r1+y1]; + + n000 = stb__perlin_grad(stb__perlin_randtab[r00+z0], x , y , z ); + n001 = stb__perlin_grad(stb__perlin_randtab[r00+z1], x , y , z-1 ); + n010 = stb__perlin_grad(stb__perlin_randtab[r01+z0], x , y-1, z ); + n011 = stb__perlin_grad(stb__perlin_randtab[r01+z1], x , y-1, z-1 ); + n100 = stb__perlin_grad(stb__perlin_randtab[r10+z0], x-1, y , z ); + n101 = stb__perlin_grad(stb__perlin_randtab[r10+z1], x-1, y , z-1 ); + n110 = stb__perlin_grad(stb__perlin_randtab[r11+z0], x-1, y-1, z ); + n111 = stb__perlin_grad(stb__perlin_randtab[r11+z1], x-1, y-1, z-1 ); + + n00 = stb__perlin_lerp(n000,n001,w); + n01 = stb__perlin_lerp(n010,n011,w); + n10 = stb__perlin_lerp(n100,n101,w); + n11 = stb__perlin_lerp(n110,n111,w); + + n0 = stb__perlin_lerp(n00,n01,v); + n1 = stb__perlin_lerp(n10,n11,v); + + return stb__perlin_lerp(n0,n1,u); +} + +float stb_perlin_ridge_noise3(float x, float y, float z,float lacunarity, float gain, float offset, int octaves,int x_wrap, int y_wrap, int z_wrap) +{ + int i; + float frequency = 1.0f; + float prev = 1.0f; + float amplitude = 0.5f; + float sum = 0.0f; + + for (i = 0; i < octaves; i++) { + float r = (float)(stb_perlin_noise3(x*frequency,y*frequency,z*frequency,x_wrap,y_wrap,z_wrap)); + r = r<0 ? -r : r; // fabs() + r = offset - r; + r = r*r; + sum += r*amplitude*prev; + prev = r; + frequency *= lacunarity; + amplitude *= gain; + } + return sum; +} + +float stb_perlin_fbm_noise3(float x, float y, float z,float lacunarity, float gain, int octaves,int x_wrap, int y_wrap, int z_wrap) +{ + int i; + float frequency = 1.0f; + float amplitude = 1.0f; + float sum = 0.0f; + + for (i = 0; i < octaves; i++) { + sum += stb_perlin_noise3(x*frequency,y*frequency,z*frequency,x_wrap,y_wrap,z_wrap)*amplitude; + frequency *= lacunarity; + amplitude *= gain; + } + return sum; +} + +float stb_perlin_turbulence_noise3(float x, float y, float z, float lacunarity, float gain, int octaves,int x_wrap, int y_wrap, int z_wrap) +{ + int i; + float frequency = 1.0f; + float amplitude = 1.0f; + float sum = 0.0f; + + for (i = 0; i < octaves; i++) { + float r = stb_perlin_noise3(x*frequency,y*frequency,z*frequency,x_wrap,y_wrap,z_wrap)*amplitude; + r = r<0 ? -r : r; // fabs() + sum += r; + frequency *= lacunarity; + amplitude *= gain; + } + return sum; +} + +#endif // STB_PERLIN_IMPLEMENTATION + +/* +------------------------------------------------------------------------------ +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. +------------------------------------------------------------------------------ +*/ From c706f11f29f97999d06c2569f62780c3c3c7891e Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sat, 7 Apr 2018 15:20:11 +0200 Subject: [PATCH 060/211] Fix specifying a TCP listen backlog of 0 causing some systems to not accept any incoming connections. Fixes #1369. --- src/SFML/Network/TcpListener.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Network/TcpListener.cpp b/src/SFML/Network/TcpListener.cpp index 0e3561f9..ce62fe76 100644 --- a/src/SFML/Network/TcpListener.cpp +++ b/src/SFML/Network/TcpListener.cpp @@ -80,7 +80,7 @@ Socket::Status TcpListener::listen(unsigned short port, const IpAddress& address } // Listen to the bound port - if (::listen(getHandle(), 0) == -1) + if (::listen(getHandle(), SOMAXCONN) == -1) { // Oops, socket is deaf err() << "Failed to listen to port " << port << std::endl; From 0adde249ec9fd2012c53b5f57f71989ffd88d16f Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Wed, 28 Feb 2018 19:54:02 +0100 Subject: [PATCH 061/211] Optimized RenderTexture performance when using the FBO implementation by removing unnecessary context switches and flushing. --- include/SFML/Graphics/RenderTarget.hpp | 4 +- include/SFML/Window/Context.hpp | 15 + include/SFML/Window/GlResource.hpp | 15 + src/SFML/Graphics/RenderTarget.cpp | 122 +++- src/SFML/Graphics/RenderTexture.cpp | 10 +- src/SFML/Graphics/RenderTextureImplFBO.cpp | 669 ++++++++++++++------- src/SFML/Graphics/RenderTextureImplFBO.hpp | 32 +- src/SFML/Graphics/RenderWindow.cpp | 19 +- src/SFML/Window/Context.cpp | 7 + src/SFML/Window/EglContext.cpp | 3 + src/SFML/Window/GlContext.cpp | 51 +- src/SFML/Window/GlContext.hpp | 36 ++ src/SFML/Window/GlResource.cpp | 7 + src/SFML/Window/OSX/SFContext.mm | 3 + src/SFML/Window/Unix/GlxContext.cpp | 3 + src/SFML/Window/Win32/WglContext.cpp | 3 + src/SFML/Window/iOS/EaglContext.mm | 3 + 17 files changed, 755 insertions(+), 247 deletions(-) diff --git a/include/SFML/Graphics/RenderTarget.hpp b/include/SFML/Graphics/RenderTarget.hpp index a9a17d86..0d167460 100644 --- a/include/SFML/Graphics/RenderTarget.hpp +++ b/include/SFML/Graphics/RenderTarget.hpp @@ -296,7 +296,7 @@ public: /// \return True if operation was successful, false otherwise /// //////////////////////////////////////////////////////////// - virtual bool setActive(bool active = true) = 0; + virtual bool setActive(bool active = true); //////////////////////////////////////////////////////////// /// \brief Save the current OpenGL render states and matrices @@ -458,6 +458,7 @@ 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 @@ -473,6 +474,7 @@ private: 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/Window/Context.hpp b/include/SFML/Window/Context.hpp index 2f60db8a..71e2c0a6 100644 --- a/include/SFML/Window/Context.hpp +++ b/include/SFML/Window/Context.hpp @@ -112,11 +112,26 @@ public: //////////////////////////////////////////////////////////// /// \brief Get the currently active context /// + /// This function will only return sf::Context objects. + /// Contexts created e.g. by RenderTargets or for internal + /// use will not be returned by this function. + /// /// \return The currently active context or NULL if none is active /// //////////////////////////////////////////////////////////// static const Context* getActiveContext(); + //////////////////////////////////////////////////////////// + /// \brief Get the currently active context's ID + /// + /// The context ID is used to identify contexts when + /// managing unshareable OpenGL resources. + /// + /// \return The active context's ID or 0 if no context is currently active + /// + //////////////////////////////////////////////////////////// + static Uint64 getActiveContextId(); + //////////////////////////////////////////////////////////// /// \brief Construct a in-memory context /// diff --git a/include/SFML/Window/GlResource.hpp b/include/SFML/Window/GlResource.hpp index 5a69b662..f7012426 100644 --- a/include/SFML/Window/GlResource.hpp +++ b/include/SFML/Window/GlResource.hpp @@ -37,6 +37,8 @@ namespace sf class Context; +typedef void(*ContextDestroyCallback)(void*); + //////////////////////////////////////////////////////////// /// \brief Base class for classes that require an OpenGL context /// @@ -57,6 +59,19 @@ protected: //////////////////////////////////////////////////////////// ~GlResource(); + //////////////////////////////////////////////////////////// + /// \brief Register a function to be called when a context is destroyed + /// + /// This is used for internal purposes in order to properly + /// clean up OpenGL resources that cannot be shared between + /// contexts. + /// + /// \param callback Function to be called when a context is destroyed + /// \param arg Argument to pass when calling the function + /// + //////////////////////////////////////////////////////////// + static void registerContextDestroyCallback(ContextDestroyCallback callback, void* arg); + //////////////////////////////////////////////////////////// /// \brief RAII helper class to temporarily lock an available context for use /// diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index dae99585..7eccf829 100644 --- a/src/SFML/Graphics/RenderTarget.cpp +++ b/src/SFML/Graphics/RenderTarget.cpp @@ -32,10 +32,14 @@ #include <SFML/Graphics/VertexArray.hpp> #include <SFML/Graphics/VertexBuffer.hpp> #include <SFML/Graphics/GLCheck.hpp> +#include <SFML/Window/Context.hpp> +#include <SFML/System/Mutex.hpp> +#include <SFML/System/Lock.hpp> #include <SFML/System/Err.hpp> #include <cassert> #include <iostream> #include <algorithm> +#include <map> // GL_QUADS is unavailable on OpenGL ES, thus we need to define GL_QUADS ourselves @@ -48,6 +52,36 @@ 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() + { + sf::Lock lock(mutex); + + static sf::Uint64 id = 1; // start at 1, zero is "no RenderTarget" + + return id++; + } + + // 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; + + // 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()); + + if ((iter == contextRenderTargetMap.end()) || (iter->second != id)) + return false; + + return true; + } + // Convert an sf::BlendMode::Factor constant to the corresponding OpenGL constant. sf::Uint32 factorToGlConstant(sf::BlendMode::Factor blendFactor) { @@ -94,7 +128,8 @@ namespace sf RenderTarget::RenderTarget() : m_defaultView(), m_view (), -m_cache () +m_cache (), +m_id (getUniqueId()) { m_cache.glStatesSet = false; } @@ -109,7 +144,7 @@ RenderTarget::~RenderTarget() //////////////////////////////////////////////////////////// void RenderTarget::clear(const Color& color) { - if (setActive(true)) + if (isActive(m_id) || setActive(true)) { // Unbind texture to fix RenderTexture preventing clear applyTexture(NULL); @@ -224,7 +259,7 @@ void RenderTarget::draw(const Vertex* vertices, std::size_t vertexCount, } #endif - if (setActive(true)) + if (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); @@ -245,7 +280,7 @@ void RenderTarget::draw(const Vertex* vertices, std::size_t vertexCount, // Check if texture coordinates array is needed, and update client state accordingly bool enableTexCoordsArray = (states.texture || states.shader); - if (enableTexCoordsArray != m_cache.texCoordsArrayEnabled) + if (!m_cache.enable || (enableTexCoordsArray != m_cache.texCoordsArrayEnabled)) { if (enableTexCoordsArray) glCheck(glEnableClientState(GL_TEXTURE_COORD_ARRAY)); @@ -255,7 +290,7 @@ void RenderTarget::draw(const Vertex* vertices, std::size_t vertexCount, // If we switch between non-cache and cache mode or enable texture // coordinates we need to set up the pointers to the vertices' components - if (!useVertexCache || !m_cache.useVertexCache) + if (!m_cache.enable || !useVertexCache || !m_cache.useVertexCache) { const char* data = reinterpret_cast<const char*>(vertices); @@ -324,7 +359,7 @@ void RenderTarget::draw(const VertexBuffer& vertexBuffer, std::size_t firstVerte } #endif - if (setActive(true)) + if (isActive(m_id) || setActive(true)) { setupDraw(false, states); @@ -332,7 +367,7 @@ void RenderTarget::draw(const VertexBuffer& vertexBuffer, std::size_t firstVerte VertexBuffer::bind(&vertexBuffer); // Always enable texture coordinates - if (!m_cache.texCoordsArrayEnabled) + if (!m_cache.enable || !m_cache.texCoordsArrayEnabled) glCheck(glEnableClientState(GL_TEXTURE_COORD_ARRAY)); glCheck(glVertexPointer(2, GL_FLOAT, sizeof(Vertex), reinterpret_cast<const void*>(0))); @@ -353,10 +388,49 @@ void RenderTarget::draw(const VertexBuffer& vertexBuffer, std::size_t firstVerte } +//////////////////////////////////////////////////////////// +bool RenderTarget::setActive(bool active) +{ + // Mark this RenderTarget as active or no longer active in the tracking map + { + sf::Lock lock(mutex); + + Uint64 contextId = Context::getActiveContextId(); + + ContextRenderTargetMap::iterator iter = contextRenderTargetMap.find(contextId); + + if (active) + { + if (iter == contextRenderTargetMap.end()) + { + contextRenderTargetMap[contextId] = m_id; + + m_cache.enable = false; + } + else if (iter->second != m_id) + { + iter->second = m_id; + + m_cache.enable = false; + } + } + else + { + if (iter != contextRenderTargetMap.end()) + contextRenderTargetMap.erase(iter); + + m_cache.enable = false; + } + } + + return true; +} + + //////////////////////////////////////////////////////////// void RenderTarget::pushGLStates() { - if (setActive(true)) + if (isActive(m_id) || setActive(true)) { #ifdef SFML_DEBUG // make sure that the user didn't leave an unchecked OpenGL error @@ -388,7 +462,7 @@ void RenderTarget::pushGLStates() //////////////////////////////////////////////////////////// void RenderTarget::popGLStates() { - if (setActive(true)) + if (isActive(m_id) || setActive(true)) { glCheck(glMatrixMode(GL_PROJECTION)); glCheck(glPopMatrix()); @@ -417,7 +491,7 @@ void RenderTarget::resetGLStates() setActive(false); #endif - if (setActive(true)) + if (isActive(m_id) || setActive(true)) { // Make sure that extensions are initialized priv::ensureExtensionsInit(); @@ -458,6 +532,8 @@ void RenderTarget::resetGLStates() // Set the default view setView(getView()); + + m_cache.enable = true; } } @@ -579,7 +655,7 @@ void RenderTarget::setupDraw(bool useVertexCache, const RenderStates& states) if (useVertexCache) { // Since vertices are transformed, we must use an identity transform to render them - if (!m_cache.useVertexCache) + if (!m_cache.enable || !m_cache.useVertexCache) glCheck(glLoadIdentity()); } else @@ -588,17 +664,30 @@ void RenderTarget::setupDraw(bool useVertexCache, const RenderStates& states) } // Apply the view - if (m_cache.viewChanged) + if (!m_cache.enable || m_cache.viewChanged) applyCurrentView(); // Apply the blend mode - if (states.blendMode != m_cache.lastBlendMode) + if (!m_cache.enable || (states.blendMode != m_cache.lastBlendMode)) applyBlendMode(states.blendMode); // Apply the texture - Uint64 textureId = states.texture ? states.texture->m_cacheId : 0; - if (textureId != m_cache.lastTextureId) + if (!m_cache.enable || (states.texture && states.texture->m_fboAttachment)) + { + // If the texture is an FBO attachment, always rebind it + // in order to inform the OpenGL driver that we want changes + // made to it in other contexts to be visible here as well + // This saves us from having to call glFlush() in + // RenderTextureImplFBO which can be quite costly + // See: https://www.khronos.org/opengl/wiki/Memory_Model applyTexture(states.texture); + } + else + { + Uint64 textureId = states.texture ? states.texture->m_cacheId : 0; + if (textureId != m_cache.lastTextureId) + applyTexture(states.texture); + } // Apply the shader if (states.shader) @@ -630,6 +719,9 @@ void RenderTarget::cleanupDraw(const RenderStates& states) // This prevents a bug where some drivers do not clear RenderTextures properly. if (states.texture && states.texture->m_fboAttachment) applyTexture(NULL); + + // Re-enable the cache at the end of the draw if it was disabled + m_cache.enable = true; } } // namespace sf diff --git a/src/SFML/Graphics/RenderTexture.cpp b/src/SFML/Graphics/RenderTexture.cpp index a52e5063..0805627b 100644 --- a/src/SFML/Graphics/RenderTexture.cpp +++ b/src/SFML/Graphics/RenderTexture.cpp @@ -147,7 +147,13 @@ bool RenderTexture::generateMipmap() //////////////////////////////////////////////////////////// bool RenderTexture::setActive(bool active) { - return m_impl && m_impl->activate(active); + bool result = m_impl && m_impl->activate(active); + + // Update RenderTarget tracking + if (result) + RenderTarget::setActive(active); + + return result; } @@ -155,7 +161,7 @@ bool RenderTexture::setActive(bool active) void RenderTexture::display() { // Update the target texture - if (setActive(true)) + if (priv::RenderTextureImplFBO::isAvailable() || setActive(true)) { m_impl->updateTexture(m_texture.m_texture); m_texture.m_pixelsFlipped = true; diff --git a/src/SFML/Graphics/RenderTextureImplFBO.cpp b/src/SFML/Graphics/RenderTextureImplFBO.cpp index c424d33f..301aa043 100644 --- a/src/SFML/Graphics/RenderTextureImplFBO.cpp +++ b/src/SFML/Graphics/RenderTextureImplFBO.cpp @@ -28,7 +28,67 @@ #include <SFML/Graphics/RenderTextureImplFBO.hpp> #include <SFML/Graphics/Texture.hpp> #include <SFML/Graphics/GLCheck.hpp> +#include <SFML/System/Mutex.hpp> +#include <SFML/System/Lock.hpp> #include <SFML/System/Err.hpp> +#include <utility> +#include <set> + + +namespace +{ + // Set to track all active FBO mappings + // This is used to free active FBOs while their owning + // RenderTextureImplFBO is still alive + std::set<std::map<sf::Uint64, unsigned int>*> frameBuffers; + + // Set to track all stale FBOs + // This is used to free stale FBOs after their owning + // RenderTextureImplFBO has already been destroyed + // An FBO cannot be destroyed until it's containing context + // becomes active, so the destruction of the RenderTextureImplFBO + // has to be decoupled from the destruction of the FBOs themselves + std::set<std::pair<sf::Uint64, unsigned int> > staleFrameBuffers; + + // Mutex to protect both active and stale frame buffer sets + sf::Mutex mutex; + + // Callback that is called every time a context is destroyed + void contextDestroyCallback(void* arg) + { + sf::Lock lock(mutex); + + sf::Uint64 contextId = sf::Context::getActiveContextId(); + + // Destroy active frame buffer objects + for (std::set<std::map<sf::Uint64, unsigned int>*>::iterator frameBuffersIter = frameBuffers.begin(); frameBuffersIter != frameBuffers.end(); ++frameBuffersIter) + { + for (std::map<sf::Uint64, unsigned int>::iterator iter = (*frameBuffersIter)->begin(); iter != (*frameBuffersIter)->end(); ++iter) + { + if (iter->first == contextId) + { + GLuint frameBuffer = static_cast<GLuint>(iter->second); + glCheck(GLEXT_glDeleteFramebuffers(1, &frameBuffer)); + + // Erase the entry from the RenderTextureImplFBO's map + (*frameBuffersIter)->erase(iter); + + break; + } + } + } + + // Destroy stale frame buffer objects + for (std::set<std::pair<sf::Uint64, unsigned int> >::iterator iter = staleFrameBuffers.begin(); iter != staleFrameBuffers.end(); ++iter) + { + if (iter->first == contextId) + { + GLuint frameBuffer = static_cast<GLuint>(iter->second); + glCheck(GLEXT_glDeleteFramebuffers(1, &frameBuffer)); + } + } + } +} namespace sf @@ -37,22 +97,36 @@ namespace priv { //////////////////////////////////////////////////////////// RenderTextureImplFBO::RenderTextureImplFBO() : -m_context (NULL), -m_frameBuffer (0), -m_multisampleFrameBuffer(0), -m_depthStencilBuffer (0), -m_colorBuffer (0), -m_width (0), -m_height (0) +m_depthStencilBuffer(0), +m_colorBuffer (0), +m_width (0), +m_height (0), +m_context (NULL), +m_textureId (0), +m_multisample (false), +m_stencil (false) { + Lock lock(mutex); + // Register the context destruction callback + registerContextDestroyCallback(contextDestroyCallback, 0); + + // Insert the new frame buffer mapping into the set of all active mappings + frameBuffers.insert(&m_frameBuffers); + frameBuffers.insert(&m_multisampleFrameBuffers); } //////////////////////////////////////////////////////////// RenderTextureImplFBO::~RenderTextureImplFBO() { - m_context->setActive(true); + TransientContextLock contextLock; + + Lock lock(mutex); + + // Remove the frame buffer mapping from the set of all active mappings + frameBuffers.erase(&m_frameBuffers); + frameBuffers.erase(&m_multisampleFrameBuffers); // Destroy the color buffer if (m_colorBuffer) @@ -68,21 +142,17 @@ RenderTextureImplFBO::~RenderTextureImplFBO() glCheck(GLEXT_glDeleteRenderbuffers(1, &depthStencilBuffer)); } - // Destroy the multisample frame buffer - if (m_multisampleFrameBuffer) - { - GLuint multisampleFrameBuffer = static_cast<GLuint>(m_multisampleFrameBuffer); - glCheck(GLEXT_glDeleteFramebuffers(1, &multisampleFrameBuffer)); - } + // Move all frame buffer objects to stale set + for (std::map<Uint64, unsigned int>::iterator iter = m_frameBuffers.begin(); iter != m_frameBuffers.end(); ++iter) + staleFrameBuffers.insert(std::make_pair(iter->first, iter->second)); - // Destroy the frame buffer - if (m_frameBuffer) - { - GLuint frameBuffer = static_cast<GLuint>(m_frameBuffer); - glCheck(GLEXT_glDeleteFramebuffers(1, &frameBuffer)); - } + for (std::map<Uint64, unsigned int>::iterator iter = m_multisampleFrameBuffers.begin(); iter != m_multisampleFrameBuffers.end(); ++iter) + staleFrameBuffers.insert(std::make_pair(iter->first, iter->second)); - // Delete the context + // Clean up FBOs + contextDestroyCallback(0); + + // Delete the backup context if we had to create one delete m_context; } @@ -102,6 +172,8 @@ bool RenderTextureImplFBO::isAvailable() //////////////////////////////////////////////////////////// unsigned int RenderTextureImplFBO::getMaximumAntialiasingLevel() { + TransientContextLock lock; + GLint samples = 0; #ifndef SFML_OPENGL_ES @@ -114,6 +186,13 @@ unsigned int RenderTextureImplFBO::getMaximumAntialiasingLevel() } +//////////////////////////////////////////////////////////// +void RenderTextureImplFBO::unbind() +{ + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, 0)); +} + + //////////////////////////////////////////////////////////// bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, unsigned int textureId, const ContextSettings& settings) { @@ -121,238 +200,388 @@ bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, unsig m_width = width; m_height = height; - // Disable creation of depth/stencil surfaces in the context - ContextSettings contextSettings(settings); - contextSettings.depthBits = 0; - contextSettings.stencilBits = 0; - contextSettings.antialiasingLevel = 0; - contextSettings.sRgbCapable = false; + { + TransientContextLock lock; - // Create the context - m_context = new Context(contextSettings, 1, 1); + // Make sure that extensions are initialized + priv::ensureExtensionsInit(); - if (settings.antialiasingLevel && !(GLEXT_framebuffer_multisample && GLEXT_framebuffer_blit)) - return false; + if (settings.antialiasingLevel && !(GLEXT_framebuffer_multisample && GLEXT_framebuffer_blit)) + return false; - if (settings.stencilBits && !GLEXT_packed_depth_stencil) - return false; + if (settings.stencilBits && !GLEXT_packed_depth_stencil) + return false; #ifndef SFML_OPENGL_ES - // Check if the requested anti-aliasing level is supported - if (settings.antialiasingLevel) - { - GLint samples = 0; - glCheck(glGetIntegerv(GLEXT_GL_MAX_SAMPLES, &samples)); - - if (settings.antialiasingLevel > static_cast<unsigned int>(samples)) + // Check if the requested anti-aliasing level is supported + if (settings.antialiasingLevel) { - err() << "Impossible to create render texture (unsupported anti-aliasing level)"; - err() << " Requested: " << settings.antialiasingLevel << " Maximum supported: " << samples << std::endl; + GLint samples = 0; + glCheck(glGetIntegerv(GLEXT_GL_MAX_SAMPLES, &samples)); + + if (settings.antialiasingLevel > static_cast<unsigned int>(samples)) + { + err() << "Impossible to create render texture (unsupported anti-aliasing level)"; + err() << " Requested: " << settings.antialiasingLevel << " Maximum supported: " << samples << std::endl; + return false; + } + } + +#endif + + + if (!settings.antialiasingLevel) + { + // Create the depth/stencil buffer if requested + if (settings.stencilBits) + { + +#ifndef SFML_OPENGL_ES + + GLuint depthStencil = 0; + glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil)); + m_depthStencilBuffer = static_cast<unsigned int>(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)); + +#else + + err() << "Impossible to create render texture (failed to create the attached depth/stencil buffer)" << std::endl; + return false; + +#endif // SFML_OPENGL_ES + + m_stencil = true; + + } + else if (settings.depthBits) + { + GLuint depthStencil = 0; + glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil)); + m_depthStencilBuffer = static_cast<unsigned int>(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)); + } + } + else + { + +#ifndef SFML_OPENGL_ES + + // Create the multisample color buffer + GLuint color = 0; + glCheck(GLEXT_glGenRenderbuffers(1, &color)); + m_colorBuffer = static_cast<unsigned int>(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)); + + // 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); + 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)); + + m_stencil = true; + } + else if (settings.depthBits) + { + GLuint depthStencil = 0; + glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil)); + m_depthStencilBuffer = static_cast<unsigned int>(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)); + } + +#else + + err() << "Impossible to create render texture (failed to create the multisample render buffers)" << std::endl; return false; + +#endif // SFML_OPENGL_ES + + m_multisample = true; + + } + } + + // Save our texture ID in order to be able to attach it to an FBO at any time + m_textureId = textureId; + + // We can't create an FBO now if there is no active context + if (!Context::getActiveContextId()) + return true; + +#ifndef SFML_OPENGL_ES + + // Save the current bindings so we can restore them after we are done + GLint readFramebuffer = 0; + GLint drawFramebuffer = 0; + + glCheck(glGetIntegerv(GLEXT_GL_READ_FRAMEBUFFER_BINDING, &readFramebuffer)); + glCheck(glGetIntegerv(GLEXT_GL_DRAW_FRAMEBUFFER_BINDING, &drawFramebuffer)); + + if (createFrameBuffer()) + { + // Restore previously bound framebuffers + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_READ_FRAMEBUFFER, readFramebuffer)); + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, drawFramebuffer)); + + return true; + } + +#else + + // Save the current binding so we can restore them after we are done + GLint frameBuffer = 0; + + glCheck(glGetIntegerv(GLEXT_GL_FRAMEBUFFER_BINDING, &frameBuffer)); + + if (createFrameBuffer()) + { + // Restore previously bound framebuffer + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, frameBuffer)); + + return true; + } + +#endif + + return false; +} + + +//////////////////////////////////////////////////////////// +bool RenderTextureImplFBO::createFrameBuffer() +{ + // Create the framebuffer object + GLuint frameBuffer = 0; + glCheck(GLEXT_glGenFramebuffers(1, &frameBuffer)); + + if (!frameBuffer) + { + err() << "Impossible to create render texture (failed to create the frame buffer object)" << std::endl; + return false; + } + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, frameBuffer)); + + // Link the depth/stencil renderbuffer to the frame buffer + if (!m_multisample && m_depthStencilBuffer) + { + glCheck(GLEXT_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_DEPTH_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); + +#ifndef SFML_OPENGL_ES + + if (m_stencil) + { + glCheck(GLEXT_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_STENCIL_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); + } + +#endif + + } + + // Link the texture to the frame buffer + glCheck(GLEXT_glFramebufferTexture2D(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textureId, 0)); + + // A final check, just to be sure... + GLenum status; + glCheck(status = GLEXT_glCheckFramebufferStatus(GLEXT_GL_FRAMEBUFFER)); + if (status != GLEXT_GL_FRAMEBUFFER_COMPLETE) + { + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, 0)); + glCheck(GLEXT_glDeleteFramebuffers(1, &frameBuffer)); + err() << "Impossible to create render texture (failed to link the target texture to the frame buffer)" << std::endl; + return false; + } + + { + Lock lock(mutex); + + // Insert the FBO into our map + m_frameBuffers.insert(std::make_pair(Context::getActiveContextId(), static_cast<unsigned int>(frameBuffer))); + } + +#ifndef SFML_OPENGL_ES + + if (m_multisample) + { + // Create the multisample framebuffer object + GLuint multisampleFrameBuffer = 0; + glCheck(GLEXT_glGenFramebuffers(1, &multisampleFrameBuffer)); + + if (!multisampleFrameBuffer) + { + err() << "Impossible to create render texture (failed to create the multisample frame buffer object)" << std::endl; + return false; + } + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, multisampleFrameBuffer)); + + // Link the multisample color buffer to the frame buffer + glCheck(GLEXT_glBindRenderbuffer(GLEXT_GL_RENDERBUFFER, m_colorBuffer)); + glCheck(GLEXT_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_COLOR_ATTACHMENT0, GLEXT_GL_RENDERBUFFER, m_colorBuffer)); + + // Link the depth/stencil renderbuffer to the frame buffer + if (m_depthStencilBuffer) + { + glCheck(GLEXT_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_DEPTH_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); + + if (m_stencil) + { + glCheck(GLEXT_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_STENCIL_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); + } + } + + // A final check, just to be sure... + glCheck(status = GLEXT_glCheckFramebufferStatus(GLEXT_GL_FRAMEBUFFER)); + if (status != GLEXT_GL_FRAMEBUFFER_COMPLETE) + { + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, 0)); + glCheck(GLEXT_glDeleteFramebuffers(1, &multisampleFrameBuffer)); + err() << "Impossible to create render texture (failed to link the render buffers to the multisample frame buffer)" << std::endl; + return false; + } + + { + Lock lock(mutex); + + // Insert the FBO into our map + m_multisampleFrameBuffers.insert(std::make_pair(Context::getActiveContextId(), static_cast<unsigned int>(multisampleFrameBuffer))); } } #endif - if (!settings.antialiasingLevel) - { - // Create the framebuffer object - GLuint frameBuffer = 0; - glCheck(GLEXT_glGenFramebuffers(1, &frameBuffer)); - m_frameBuffer = static_cast<unsigned int>(frameBuffer); - if (!m_frameBuffer) - { - err() << "Impossible to create render texture (failed to create the frame buffer object)" << std::endl; - return false; - } - glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, m_frameBuffer)); - - // Create the depth/stencil buffer if requested - if (settings.stencilBits) - { - -#ifndef SFML_OPENGL_ES - - GLuint depthStencil = 0; - glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil)); - m_depthStencilBuffer = static_cast<unsigned int>(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_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_DEPTH_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); - glCheck(GLEXT_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_STENCIL_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); -#else - - err() << "Impossible to create render texture (failed to create the attached depth/stencil buffer)" << std::endl; - return false; - -#endif // SFML_OPENGL_ES - - } - else if (settings.depthBits) - { - GLuint depthStencil = 0; - glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil)); - m_depthStencilBuffer = static_cast<unsigned int>(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_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_DEPTH_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); - } - - // Link the texture to the frame buffer - glCheck(GLEXT_glFramebufferTexture2D(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0)); - - // A final check, just to be sure... - GLenum status; - glCheck(status = GLEXT_glCheckFramebufferStatus(GLEXT_GL_FRAMEBUFFER)); - if (status != GLEXT_GL_FRAMEBUFFER_COMPLETE) - { - glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, 0)); - err() << "Impossible to create render texture (frame buffer incomplete)" << std::endl; - return false; - } - - return true; - } - else - { - -#ifndef SFML_OPENGL_ES - - // Create the framebuffer object - GLuint frameBuffer = 0; - glCheck(GLEXT_glGenFramebuffers(1, &frameBuffer)); - m_frameBuffer = static_cast<unsigned int>(frameBuffer); - if (!m_frameBuffer) - { - err() << "Impossible to create render texture (failed to create the frame buffer object)" << std::endl; - return false; - } - glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, m_frameBuffer)); - - // Link the texture to the frame buffer - glCheck(GLEXT_glFramebufferTexture2D(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0)); - - // A final check, just to be sure... - GLenum status; - glCheck(status = GLEXT_glCheckFramebufferStatus(GLEXT_GL_FRAMEBUFFER)); - if (status != GLEXT_GL_FRAMEBUFFER_COMPLETE) - { - glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, 0)); - err() << "Impossible to create render texture (frame buffer incomplete)" << std::endl; - return false; - } - - // Create the multisample framebuffer object - frameBuffer = 0; - glCheck(GLEXT_glGenFramebuffers(1, &frameBuffer)); - m_multisampleFrameBuffer = static_cast<unsigned int>(frameBuffer); - if (!m_multisampleFrameBuffer) - { - err() << "Impossible to create render texture (failed to create the multisample frame buffer object)" << std::endl; - return false; - } - glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, m_multisampleFrameBuffer)); - - // Create the multisample color buffer - GLuint color = 0; - glCheck(GLEXT_glGenRenderbuffers(1, &color)); - m_colorBuffer = static_cast<unsigned int>(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_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_COLOR_ATTACHMENT0, GLEXT_GL_RENDERBUFFER, m_colorBuffer)); - - // 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); - 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_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_DEPTH_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); - glCheck(GLEXT_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_STENCIL_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); - } - else if (settings.depthBits) - { - GLuint depthStencil = 0; - glCheck(GLEXT_glGenRenderbuffers(1, &depthStencil)); - m_depthStencilBuffer = static_cast<unsigned int>(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_glFramebufferRenderbuffer(GLEXT_GL_FRAMEBUFFER, GLEXT_GL_DEPTH_ATTACHMENT, GLEXT_GL_RENDERBUFFER, m_depthStencilBuffer)); - } - - // A final check, just to be sure... - glCheck(status = GLEXT_glCheckFramebufferStatus(GLEXT_GL_FRAMEBUFFER)); - if (status != GLEXT_GL_FRAMEBUFFER_COMPLETE) - { - glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, 0)); - err() << "Impossible to create render texture (multisample frame buffer incomplete)" << std::endl; - return false; - } - - return true; - -#else - - err() << "Impossible to create render texture (failed to create the multisample frame buffer object)" << std::endl; - return false; - -#endif // SFML_OPENGL_ES - - } + return true; } //////////////////////////////////////////////////////////// bool RenderTextureImplFBO::activate(bool active) { - return m_context->setActive(active); + // Unbind the FBO if requested + if (!active) + { + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, 0)); + return true; + } + + Uint64 contextId = Context::getActiveContextId(); + + // In the odd case we have to activate and there is no active + // context yet, we have to create one + if (!contextId) + { + if (!m_context) + m_context = new Context; + + m_context->setActive(true); + + contextId = Context::getActiveContextId(); + + if (!contextId) + { + err() << "Impossible to activate render texture (failed to create backup context)" << std::endl; + + return false; + } + } + + // Lookup the FBO corresponding to the currently active context + // If none is found, there is no FBO corresponding to the + // currently active context so we will have to create a new FBO + { + Lock lock(mutex); + + std::map<Uint64, unsigned int>::iterator iter; + + if (m_multisample) + { + iter = m_multisampleFrameBuffers.find(contextId); + + if (iter != m_multisampleFrameBuffers.end()) + { + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, iter->second)); + + return true; + } + } + else + { + iter = m_frameBuffers.find(contextId); + + if (iter != m_frameBuffers.end()) + { + glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, iter->second)); + + return true; + } + } + } + + return createFrameBuffer(); } //////////////////////////////////////////////////////////// void RenderTextureImplFBO::updateTexture(unsigned int) { + // If multisampling is enabled, we need to resolve by blitting + // from our FBO with multisample renderbuffer attachments + // to our FBO to which our target texture is attached #ifndef SFML_OPENGL_ES - if (m_multisampleFrameBuffer) + // In case of multisampling, make sure both FBOs + // are already available within the current context + if (m_multisample && m_width && m_height && activate(true)) { - glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, m_frameBuffer)); - glCheck(GLEXT_glBlitFramebuffer(0, 0, m_width, m_height, 0, 0, m_width, m_height, GL_COLOR_BUFFER_BIT, GL_NEAREST)); - glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, m_multisampleFrameBuffer)); + Uint64 contextId = Context::getActiveContextId(); + + Lock lock(mutex); + + std::map<Uint64, unsigned int>::iterator iter = m_frameBuffers.find(contextId); + std::map<Uint64, unsigned int>::iterator multisampleIter = m_multisampleFrameBuffers.find(contextId); + + if ((iter != m_frameBuffers.end()) && (multisampleIter != m_multisampleFrameBuffers.end())) + { + // 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_glBindFramebuffer(GLEXT_GL_DRAW_FRAMEBUFFER, multisampleIter->second)); + } } #endif // SFML_OPENGL_ES - glCheck(glFlush()); } } // namespace priv diff --git a/src/SFML/Graphics/RenderTextureImplFBO.hpp b/src/SFML/Graphics/RenderTextureImplFBO.hpp index d2bb71c1..f83074ef 100644 --- a/src/SFML/Graphics/RenderTextureImplFBO.hpp +++ b/src/SFML/Graphics/RenderTextureImplFBO.hpp @@ -31,6 +31,7 @@ #include <SFML/Graphics/RenderTextureImpl.hpp> #include <SFML/Window/Context.hpp> #include <SFML/Window/GlResource.hpp> +#include <map> namespace sf @@ -74,6 +75,12 @@ public: //////////////////////////////////////////////////////////// static unsigned int getMaximumAntialiasingLevel(); + //////////////////////////////////////////////////////////// + /// \brief Unbind the currently bound FBO + /// + //////////////////////////////////////////////////////////// + static void unbind(); + private: //////////////////////////////////////////////////////////// @@ -89,6 +96,14 @@ private: //////////////////////////////////////////////////////////// virtual bool create(unsigned int width, unsigned int height, unsigned int textureId, const ContextSettings& settings); + //////////////////////////////////////////////////////////// + /// \brief Create an FBO in the current context + /// + /// \return True if creation has been successful + /// + //////////////////////////////////////////////////////////// + bool createFrameBuffer(); + //////////////////////////////////////////////////////////// /// \brief Activate or deactivate the render texture for rendering /// @@ -110,13 +125,16 @@ private: //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - Context* m_context; ///< Needs a separate OpenGL context for not messing up the other ones - unsigned int m_frameBuffer; ///< OpenGL frame buffer object - unsigned int m_multisampleFrameBuffer; ///< Optional OpenGL frame buffer object 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 + 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 }; } // namespace priv diff --git a/src/SFML/Graphics/RenderWindow.cpp b/src/SFML/Graphics/RenderWindow.cpp index f174a3db..906363b3 100644 --- a/src/SFML/Graphics/RenderWindow.cpp +++ b/src/SFML/Graphics/RenderWindow.cpp @@ -27,6 +27,8 @@ //////////////////////////////////////////////////////////// #include <SFML/Graphics/RenderWindow.hpp> #include <SFML/Graphics/Texture.hpp> +#include <SFML/Graphics/GLCheck.hpp> +#include <SFML/Graphics/RenderTextureImplFBO.hpp> namespace sf @@ -71,7 +73,22 @@ Vector2u RenderWindow::getSize() const //////////////////////////////////////////////////////////// bool RenderWindow::setActive(bool active) { - return Window::setActive(active); + bool result = Window::setActive(active); + + // Update RenderTarget tracking + if (result) + RenderTarget::setActive(active); + + // If FBOs are available, make sure none are bound when we + // try to draw to the default framebuffer of the RenderWindow + if (result && priv::RenderTextureImplFBO::isAvailable()) + { + priv::RenderTextureImplFBO::unbind(); + + return true; + } + + return result; } diff --git a/src/SFML/Window/Context.cpp b/src/SFML/Window/Context.cpp index 46275e3e..4e0a4b8a 100644 --- a/src/SFML/Window/Context.cpp +++ b/src/SFML/Window/Context.cpp @@ -80,6 +80,13 @@ const Context* Context::getActiveContext() } +//////////////////////////////////////////////////////////// +Uint64 Context::getActiveContextId() +{ + return priv::GlContext::getActiveContextId(); +} + + //////////////////////////////////////////////////////////// bool Context::isExtensionAvailable(const char* name) { diff --git a/src/SFML/Window/EglContext.cpp b/src/SFML/Window/EglContext.cpp index 91d02f93..fb91cdac 100644 --- a/src/SFML/Window/EglContext.cpp +++ b/src/SFML/Window/EglContext.cpp @@ -150,6 +150,9 @@ m_config (NULL) //////////////////////////////////////////////////////////// EglContext::~EglContext() { + // Notify unshared OpenGL resources of context destruction + cleanupUnsharedResources(); + // Deactivate the current context EGLContext currentContext = eglCheck(eglGetCurrentContext()); diff --git a/src/SFML/Window/GlContext.cpp b/src/SFML/Window/GlContext.cpp index 07a90ad7..9b6c1f70 100644 --- a/src/SFML/Window/GlContext.cpp +++ b/src/SFML/Window/GlContext.cpp @@ -36,6 +36,7 @@ #include <vector> #include <string> #include <set> +#include <utility> #include <cstdlib> #include <cstring> #include <cctype> @@ -146,6 +147,16 @@ namespace // 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 @@ -325,6 +336,13 @@ void GlContext::cleanupResource() } +//////////////////////////////////////////////////////////// +void GlContext::registerContextDestroyCallback(ContextDestroyCallback callback, void* arg) +{ + contextDestroyCallbacks.insert(std::make_pair(callback, arg)); +} + + //////////////////////////////////////////////////////////// void GlContext::acquireTransientContext() { @@ -473,6 +491,13 @@ GlFunctionPointer GlContext::getFunction(const char* name) } +//////////////////////////////////////////////////////////// +Uint64 GlContext::getActiveContextId() +{ + return currentContext ? currentContext->m_id : 0; +} + + //////////////////////////////////////////////////////////// GlContext::~GlContext() { @@ -546,7 +571,8 @@ bool GlContext::setActive(bool active) //////////////////////////////////////////////////////////// -GlContext::GlContext() +GlContext::GlContext() : +m_id(id++) { // Nothing to do } @@ -581,6 +607,29 @@ int GlContext::evaluateFormat(unsigned int bitsPerPixel, const ContextSettings& } +//////////////////////////////////////////////////////////// +void GlContext::cleanupUnsharedResources() +{ + // Save the current context so we can restore it later + GlContext* contextToRestore = currentContext; + + // If this context is already active there is no need to save it + if (contextToRestore == this) + contextToRestore = NULL; + + // Make this context active so resources can be freed + setActive(true); + + // Call the registered destruction callbacks + for (ContextDestroyCallbacks::iterator iter = contextDestroyCallbacks.begin(); iter != contextDestroyCallbacks.end(); ++iter) + iter->first(iter->second); + + // Make the originally active context active again + if (contextToRestore) + contextToRestore->setActive(true); +} + + //////////////////////////////////////////////////////////// void GlContext::initialize(const ContextSettings& requestedSettings) { diff --git a/src/SFML/Window/GlContext.hpp b/src/SFML/Window/GlContext.hpp index cf28c61c..0b66965e 100644 --- a/src/SFML/Window/GlContext.hpp +++ b/src/SFML/Window/GlContext.hpp @@ -31,6 +31,7 @@ #include <SFML/Config.hpp> #include <SFML/Window/Context.hpp> #include <SFML/Window/ContextSettings.hpp> +#include <SFML/Window/GlResource.hpp> #include <SFML/System/NonCopyable.hpp> @@ -69,6 +70,19 @@ public: //////////////////////////////////////////////////////////// static void cleanupResource(); + //////////////////////////////////////////////////////////// + /// \brief Register a function to be called when a context is destroyed + /// + /// This is used for internal purposes in order to properly + /// clean up OpenGL resources that cannot be shared bwteen + /// contexts. + /// + /// \param callback Function to be called when a context is destroyed + /// \param arg Argument to pass when calling the function + /// + //////////////////////////////////////////////////////////// + static void registerContextDestroyCallback(ContextDestroyCallback callback, void* arg); + //////////////////////////////////////////////////////////// /// \brief Acquires a context for short-term use on the current thread /// @@ -143,6 +157,17 @@ public: //////////////////////////////////////////////////////////// static GlFunctionPointer getFunction(const char* name); + //////////////////////////////////////////////////////////// + /// \brief Get the currently active context's ID + /// + /// The context ID is used to identify contexts when + /// managing unshareable OpenGL resources. + /// + /// \return The active context's ID or 0 if no context is currently active + /// + //////////////////////////////////////////////////////////// + static Uint64 getActiveContextId(); + //////////////////////////////////////////////////////////// /// \brief Destructor /// @@ -217,6 +242,12 @@ protected: //////////////////////////////////////////////////////////// virtual bool makeCurrent(bool current) = 0; + //////////////////////////////////////////////////////////// + /// \brief Notify unshared GlResources of context destruction + /// + //////////////////////////////////////////////////////////// + void cleanupUnsharedResources(); + //////////////////////////////////////////////////////////// /// \brief Evaluate a pixel format configuration /// @@ -259,6 +290,11 @@ private: /// //////////////////////////////////////////////////////////// void checkSettings(const ContextSettings& requestedSettings); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + 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 7af4a140..64fc88c5 100644 --- a/src/SFML/Window/GlResource.cpp +++ b/src/SFML/Window/GlResource.cpp @@ -45,6 +45,13 @@ GlResource::~GlResource() } +//////////////////////////////////////////////////////////// +void GlResource::registerContextDestroyCallback(ContextDestroyCallback callback, void* arg) +{ + priv::GlContext::registerContextDestroyCallback(callback, arg); +} + + //////////////////////////////////////////////////////////// GlResource::TransientContextLock::TransientContextLock() { diff --git a/src/SFML/Window/OSX/SFContext.mm b/src/SFML/Window/OSX/SFContext.mm index 65375690..cf74de91 100644 --- a/src/SFML/Window/OSX/SFContext.mm +++ b/src/SFML/Window/OSX/SFContext.mm @@ -103,6 +103,9 @@ m_window(0) //////////////////////////////////////////////////////////// SFContext::~SFContext() { + // Notify unshared OpenGL resources of context destruction + cleanupUnsharedResources(); + [m_context clearDrawable]; if (m_context == [NSOpenGLContext currentContext]) diff --git a/src/SFML/Window/Unix/GlxContext.cpp b/src/SFML/Window/Unix/GlxContext.cpp index d9f52fef..cd022364 100644 --- a/src/SFML/Window/Unix/GlxContext.cpp +++ b/src/SFML/Window/Unix/GlxContext.cpp @@ -172,6 +172,9 @@ m_ownsWindow(false) //////////////////////////////////////////////////////////// GlxContext::~GlxContext() { + // Notify unshared OpenGL resources of context destruction + cleanupUnsharedResources(); + // Destroy the context if (m_context) { diff --git a/src/SFML/Window/Win32/WglContext.cpp b/src/SFML/Window/Win32/WglContext.cpp index cd5e9ab8..fd9f89e4 100644 --- a/src/SFML/Window/Win32/WglContext.cpp +++ b/src/SFML/Window/Win32/WglContext.cpp @@ -154,6 +154,9 @@ m_ownsWindow (false) //////////////////////////////////////////////////////////// WglContext::~WglContext() { + // Notify unshared OpenGL resources of context destruction + cleanupUnsharedResources(); + // Destroy the OpenGL context if (m_context) { diff --git a/src/SFML/Window/iOS/EaglContext.mm b/src/SFML/Window/iOS/EaglContext.mm index f04e1537..9fd6b836 100644 --- a/src/SFML/Window/iOS/EaglContext.mm +++ b/src/SFML/Window/iOS/EaglContext.mm @@ -91,6 +91,9 @@ m_clock () //////////////////////////////////////////////////////////// EaglContext::~EaglContext() { + // Notify unshared OpenGL resources of context destruction + cleanupUnsharedResources(); + if (m_context) { // Activate the context, so that we can destroy the buffers From 3a96024f6bc35feab75e74856db9489ee0210593 Mon Sep 17 00:00:00 2001 From: pjmlp <pjmlp@progtools.org> Date: Tue, 31 Oct 2017 11:26:03 +0100 Subject: [PATCH 062/211] Android: Upgraded the example to work with Gradle --- examples/android/.gitignore | 7 + examples/android/app/app.iml | 123 ++++++++++++++ examples/android/app/build.gradle | 39 +++++ examples/android/app/proguard-rules.pro | 21 +++ .../{ => app/src/main}/AndroidManifest.xml | 0 .../{ => app/src/main}/assets/canary.wav | Bin .../{ => app/src/main}/assets/image.png | Bin .../{ => app/src/main}/assets/orchestral.ogg | Bin .../{ => app/src/main}/assets/sansation.ttf | Bin .../{jni => app/src/main/cpp}/Android.mk | 2 + .../{jni => app/src/main/cpp}/Application.mk | 2 +- .../{jni => app/src/main/cpp}/main.cpp | 0 .../src/main}/res/drawable-hdpi/sfml_logo.png | Bin .../src/main}/res/drawable-ldpi/sfml_logo.png | Bin .../src/main}/res/drawable-mdpi/sfml_logo.png | Bin .../main}/res/drawable-xhdpi/sfml_logo.png | Bin .../main}/res/drawable-xxhdpi/sfml_logo.png | Bin .../{ => app/src/main}/res/values/strings.xml | 0 examples/android/build.gradle | 23 +++ examples/android/gradle.properties | 17 ++ .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + examples/android/gradlew | 160 ++++++++++++++++++ examples/android/gradlew.bat | 90 ++++++++++ examples/android/settings.gradle | 1 + 25 files changed, 490 insertions(+), 1 deletion(-) create mode 100644 examples/android/.gitignore create mode 100644 examples/android/app/app.iml create mode 100644 examples/android/app/build.gradle create mode 100644 examples/android/app/proguard-rules.pro rename examples/android/{ => app/src/main}/AndroidManifest.xml (100%) rename examples/android/{ => app/src/main}/assets/canary.wav (100%) rename examples/android/{ => app/src/main}/assets/image.png (100%) rename examples/android/{ => app/src/main}/assets/orchestral.ogg (100%) rename examples/android/{ => app/src/main}/assets/sansation.ttf (100%) rename examples/android/{jni => app/src/main/cpp}/Android.mk (84%) rename examples/android/{jni => app/src/main/cpp}/Application.mk (82%) rename examples/android/{jni => app/src/main/cpp}/main.cpp (100%) rename examples/android/{ => app/src/main}/res/drawable-hdpi/sfml_logo.png (100%) rename examples/android/{ => app/src/main}/res/drawable-ldpi/sfml_logo.png (100%) rename examples/android/{ => app/src/main}/res/drawable-mdpi/sfml_logo.png (100%) rename examples/android/{ => app/src/main}/res/drawable-xhdpi/sfml_logo.png (100%) rename examples/android/{ => app/src/main}/res/drawable-xxhdpi/sfml_logo.png (100%) rename examples/android/{ => app/src/main}/res/values/strings.xml (100%) create mode 100644 examples/android/build.gradle create mode 100644 examples/android/gradle.properties create mode 100644 examples/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 examples/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 examples/android/gradlew create mode 100644 examples/android/gradlew.bat create mode 100644 examples/android/settings.gradle diff --git a/examples/android/.gitignore b/examples/android/.gitignore new file mode 100644 index 00000000..ba72b9d7 --- /dev/null +++ b/examples/android/.gitignore @@ -0,0 +1,7 @@ +local.properties +.idea +.gradle +build +android.iml +app/build +app/.externalNativeBuild diff --git a/examples/android/app/app.iml b/examples/android/app/app.iml new file mode 100644 index 00000000..232000a7 --- /dev/null +++ b/examples/android/app/app.iml @@ -0,0 +1,123 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" type="JAVA_MODULE" version="4"> + <component name="FacetManager"> + <facet type="android-gradle" name="Android-Gradle"> + <configuration> + <option name="GRADLE_PROJECT_PATH" value=":app" /> + </configuration> + </facet> + <facet type="native-android-gradle" name="Native-Android-Gradle"> + <configuration> + <option name="SELECTED_BUILD_VARIANT" value="debug" /> + </configuration> + </facet> + <facet type="android" name="Android"> + <configuration> + <option name="SELECTED_BUILD_VARIANT" value="debug" /> + <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" /> + <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" /> + <afterSyncTasks> + <task>generateDebugSources</task> + </afterSyncTasks> + <option name="ALLOW_USER_CONFIGURATION" value="false" /> + <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" /> + <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" /> + <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" /> + <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" /> + </configuration> + </facet> + </component> + <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7"> + <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" /> + <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" /> + <exclude-output /> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/src/main/cpp" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/test/debug" isTestSource="true" generated="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/jni" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/jni" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/check-manifest" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes-jar" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaPrecompile" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndkBuild" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/splits-support" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/tmp" /> + <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" /> + <excludeFolder url="file://$MODULE_DIR$/build/outputs" /> + <excludeFolder url="file://$MODULE_DIR$/build/tmp" /> + </content> + <orderEntry type="jdk" jdkName="Android API 27 Platform" jdkType="Android SDK" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module> \ No newline at end of file diff --git a/examples/android/app/build.gradle b/examples/android/app/build.gradle new file mode 100644 index 00000000..f1d3c4ae --- /dev/null +++ b/examples/android/app/build.gradle @@ -0,0 +1,39 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 27 + defaultConfig { + applicationId "org.sfmldev.android" + minSdkVersion 19 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + externalNativeBuild { + ndkBuild { + cppFlags "-std=c++14 -frtti -fexceptions" + } + + } + ndk { + abiFilters 'armeabi-v7a' + } + + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + externalNativeBuild { + ndkBuild { + path "src/main/cpp/Android.mk" + + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) +} diff --git a/examples/android/app/proguard-rules.pro b/examples/android/app/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/examples/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/examples/android/AndroidManifest.xml b/examples/android/app/src/main/AndroidManifest.xml similarity index 100% rename from examples/android/AndroidManifest.xml rename to examples/android/app/src/main/AndroidManifest.xml diff --git a/examples/android/assets/canary.wav b/examples/android/app/src/main/assets/canary.wav similarity index 100% rename from examples/android/assets/canary.wav rename to examples/android/app/src/main/assets/canary.wav diff --git a/examples/android/assets/image.png b/examples/android/app/src/main/assets/image.png similarity index 100% rename from examples/android/assets/image.png rename to examples/android/app/src/main/assets/image.png diff --git a/examples/android/assets/orchestral.ogg b/examples/android/app/src/main/assets/orchestral.ogg similarity index 100% rename from examples/android/assets/orchestral.ogg rename to examples/android/app/src/main/assets/orchestral.ogg diff --git a/examples/android/assets/sansation.ttf b/examples/android/app/src/main/assets/sansation.ttf similarity index 100% rename from examples/android/assets/sansation.ttf rename to examples/android/app/src/main/assets/sansation.ttf diff --git a/examples/android/jni/Android.mk b/examples/android/app/src/main/cpp/Android.mk similarity index 84% rename from examples/android/jni/Android.mk rename to examples/android/app/src/main/cpp/Android.mk index 8c42b78f..ae84f65f 100644 --- a/examples/android/jni/Android.mk +++ b/examples/android/app/src/main/cpp/Android.mk @@ -11,6 +11,8 @@ LOCAL_SHARED_LIBRARIES += sfml-window LOCAL_SHARED_LIBRARIES += sfml-graphics LOCAL_SHARED_LIBRARIES += sfml-audio LOCAL_SHARED_LIBRARIES += sfml-network +LOCAL_SHARED_LIBRARIES += sfml-activity +LOCAL_SHARED_LIBRARIES += openal LOCAL_WHOLE_STATIC_LIBRARIES := sfml-main include $(BUILD_SHARED_LIBRARY) diff --git a/examples/android/jni/Application.mk b/examples/android/app/src/main/cpp/Application.mk similarity index 82% rename from examples/android/jni/Application.mk rename to examples/android/app/src/main/cpp/Application.mk index 13ca3ea4..e1e4b821 100644 --- a/examples/android/jni/Application.mk +++ b/examples/android/app/src/main/cpp/Application.mk @@ -1,5 +1,5 @@ NDK_TOOLCHAIN_VERSION := 4.9 APP_PLATFORM := android-14 -APP_STL := c++_shared +APP_STL := stlport_shared APP_ABI := armeabi-v7a APP_MODULES := sfml-activity sfml-example diff --git a/examples/android/jni/main.cpp b/examples/android/app/src/main/cpp/main.cpp similarity index 100% rename from examples/android/jni/main.cpp rename to examples/android/app/src/main/cpp/main.cpp diff --git a/examples/android/res/drawable-hdpi/sfml_logo.png b/examples/android/app/src/main/res/drawable-hdpi/sfml_logo.png similarity index 100% rename from examples/android/res/drawable-hdpi/sfml_logo.png rename to examples/android/app/src/main/res/drawable-hdpi/sfml_logo.png diff --git a/examples/android/res/drawable-ldpi/sfml_logo.png b/examples/android/app/src/main/res/drawable-ldpi/sfml_logo.png similarity index 100% rename from examples/android/res/drawable-ldpi/sfml_logo.png rename to examples/android/app/src/main/res/drawable-ldpi/sfml_logo.png diff --git a/examples/android/res/drawable-mdpi/sfml_logo.png b/examples/android/app/src/main/res/drawable-mdpi/sfml_logo.png similarity index 100% rename from examples/android/res/drawable-mdpi/sfml_logo.png rename to examples/android/app/src/main/res/drawable-mdpi/sfml_logo.png diff --git a/examples/android/res/drawable-xhdpi/sfml_logo.png b/examples/android/app/src/main/res/drawable-xhdpi/sfml_logo.png similarity index 100% rename from examples/android/res/drawable-xhdpi/sfml_logo.png rename to examples/android/app/src/main/res/drawable-xhdpi/sfml_logo.png diff --git a/examples/android/res/drawable-xxhdpi/sfml_logo.png b/examples/android/app/src/main/res/drawable-xxhdpi/sfml_logo.png similarity index 100% rename from examples/android/res/drawable-xxhdpi/sfml_logo.png rename to examples/android/app/src/main/res/drawable-xxhdpi/sfml_logo.png diff --git a/examples/android/res/values/strings.xml b/examples/android/app/src/main/res/values/strings.xml similarity index 100% rename from examples/android/res/values/strings.xml rename to examples/android/app/src/main/res/values/strings.xml diff --git a/examples/android/build.gradle b/examples/android/build.gradle new file mode 100644 index 00000000..56292ed4 --- /dev/null +++ b/examples/android/build.gradle @@ -0,0 +1,23 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.0.0' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/examples/android/gradle.properties b/examples/android/gradle.properties new file mode 100644 index 00000000..aac7c9b4 --- /dev/null +++ b/examples/android/gradle.properties @@ -0,0 +1,17 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/examples/android/gradle/wrapper/gradle-wrapper.jar b/examples/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 GIT binary patch literal 53636 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ⅅ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 H-+%o-(+5aQ literal 0 HcmV?d00001 diff --git a/examples/android/gradle/wrapper/gradle-wrapper.properties b/examples/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..74e4fed5 --- /dev/null +++ b/examples/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Oct 26 23:14:02 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/examples/android/gradlew b/examples/android/gradlew new file mode 100755 index 00000000..9d82f789 --- /dev/null +++ b/examples/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/examples/android/gradlew.bat b/examples/android/gradlew.bat new file mode 100644 index 00000000..8a0b282a --- /dev/null +++ b/examples/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/examples/android/settings.gradle b/examples/android/settings.gradle new file mode 100644 index 00000000..e7b4def4 --- /dev/null +++ b/examples/android/settings.gradle @@ -0,0 +1 @@ +include ':app' From 1e800d9551e889ce38d4fb0997d0c6673d5e6821 Mon Sep 17 00:00:00 2001 From: Mario Liebisch <mario.liebisch@gmail.com> Date: Tue, 20 Mar 2018 09:33:06 +0100 Subject: [PATCH 063/211] Android: No longer keep an active input stream longer than needed. --- include/SFML/Graphics/Image.hpp | 3 --- src/SFML/Graphics/Image.cpp | 16 ++-------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/include/SFML/Graphics/Image.hpp b/include/SFML/Graphics/Image.hpp index c950f580..c1d672a6 100644 --- a/include/SFML/Graphics/Image.hpp +++ b/include/SFML/Graphics/Image.hpp @@ -265,9 +265,6 @@ private: //////////////////////////////////////////////////////////// Vector2u m_size; ///< Image size std::vector<Uint8> m_pixels; ///< Pixels of the image - #ifdef SFML_SYSTEM_ANDROID - void* m_stream; ///< Asset file streamer (if loaded from file) - #endif }; } // namespace sf diff --git a/src/SFML/Graphics/Image.cpp b/src/SFML/Graphics/Image.cpp index 7670eb6c..67c2840d 100644 --- a/src/SFML/Graphics/Image.cpp +++ b/src/SFML/Graphics/Image.cpp @@ -41,23 +41,14 @@ namespace sf Image::Image() : m_size(0, 0) { - #ifdef SFML_SYSTEM_ANDROID - m_stream = NULL; - - #endif } //////////////////////////////////////////////////////////// Image::~Image() { - #ifdef SFML_SYSTEM_ANDROID - if (m_stream) - delete (priv::ResourceStream*)m_stream; - - #endif } @@ -135,11 +126,8 @@ bool Image::loadFromFile(const std::string& filename) #else - if (m_stream) - delete (priv::ResourceStream*)m_stream; - - m_stream = new priv::ResourceStream(filename); - return loadFromStream(*(priv::ResourceStream*)m_stream); + priv::ResourceStream stream(filename); + return loadFromStream(stream); #endif } From f4c25ac3fa44315733073ece57ca1ddc61b0b879 Mon Sep 17 00:00:00 2001 From: Mario Liebisch <mario.liebisch@gmail.com> Date: Sun, 4 Feb 2018 09:43:50 +0100 Subject: [PATCH 064/211] Android work in progress changes --- CMakeLists.txt | 8 +- examples/android/.gitignore | 1 + examples/android/app/build.gradle | 8 +- .../android/app/src/main/AndroidManifest.xml | 4 +- examples/android/app/src/main/cpp/Android.mk | 20 --- .../android/app/src/main/cpp/Application.mk | 5 - examples/android/app/src/main/jni/Android.mk | 20 +++ .../android/app/src/main/jni/Application.mk | 8 + .../app/src/main/{cpp => jni}/main.cpp | 62 ++++++- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - examples/android/gradlew | 160 ------------------ examples/android/gradlew.bat | 90 ---------- src/SFML/Android.mk | 2 +- 14 files changed, 94 insertions(+), 300 deletions(-) delete mode 100644 examples/android/app/src/main/cpp/Android.mk delete mode 100644 examples/android/app/src/main/cpp/Application.mk create mode 100644 examples/android/app/src/main/jni/Android.mk create mode 100644 examples/android/app/src/main/jni/Application.mk rename examples/android/app/src/main/{cpp => jni}/main.cpp (66%) delete mode 100644 examples/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 examples/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 examples/android/gradlew delete mode 100644 examples/android/gradlew.bat diff --git a/CMakeLists.txt b/CMakeLists.txt index 8daaac8b..20557980 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -123,11 +123,11 @@ if(SFML_OS_ANDROID) # pass shared STL configuration (if any) if (CMAKE_ANDROID_STL_TYPE MATCHES "_shared") add_definitions("-DSTL_LIBRARY=${CMAKE_ANDROID_STL_TYPE}") - if(NOT CMAKE_ANDROID_STL_TYPE MATCHES "c\\+\\+_shared") - message("Android: Using ${CMAKE_ANDROID_STL_TYPE} as STL. Set CMAKE_ANDROID_STL_TYPE to c++_shared, if there are any issues.") - endif() + # if(NOT CMAKE_ANDROID_STL_TYPE MATCHES "c\\+\\+_shared") + # message("Android: Using ${CMAKE_ANDROID_STL_TYPE} as STL. Set CMAKE_ANDROID_STL_TYPE to c++_shared, if there are any issues.") + # endif() else() - message(WARNING "Android: You're using a static STL (${CMAKE_ANDROID_STL_TYPE}). Set CMAKE_ANDROID_STL_TYPE to c++_shared, if there are any issues.") + # message(WARNING "Android: You're using a static STL (${CMAKE_ANDROID_STL_TYPE}). Set CMAKE_ANDROID_STL_TYPE to c++_shared, if there are any issues.") endif() # let the user switch ABIs diff --git a/examples/android/.gitignore b/examples/android/.gitignore index ba72b9d7..a76e9658 100644 --- a/examples/android/.gitignore +++ b/examples/android/.gitignore @@ -5,3 +5,4 @@ build android.iml app/build app/.externalNativeBuild +app/src/main/obj diff --git a/examples/android/app/build.gradle b/examples/android/app/build.gradle index f1d3c4ae..b1fb031b 100644 --- a/examples/android/app/build.gradle +++ b/examples/android/app/build.gradle @@ -4,14 +4,14 @@ android { compileSdkVersion 27 defaultConfig { applicationId "org.sfmldev.android" - minSdkVersion 19 - targetSdkVersion 23 + minSdkVersion 14 + targetSdkVersion 19 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" externalNativeBuild { ndkBuild { - cppFlags "-std=c++14 -frtti -fexceptions" + // cppFlags "-std=c++14 -frtti -fexceptions" } } @@ -28,7 +28,7 @@ android { } externalNativeBuild { ndkBuild { - path "src/main/cpp/Android.mk" + path "src/main/jni/Android.mk" } } diff --git a/examples/android/app/src/main/AndroidManifest.xml b/examples/android/app/src/main/AndroidManifest.xml index da0ae20c..20fbbe50 100644 --- a/examples/android/app/src/main/AndroidManifest.xml +++ b/examples/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.example.sfml" + package="org.sfmldev.android" android:versionCode="1" android:versionName="1.0" > @@ -22,7 +22,7 @@ android:icon="@drawable/sfml_logo" android:configChanges="keyboardHidden|orientation|screenSize"> - <meta-data android:name="android.app.lib_name" android:value="sfml-activity" /> + <meta-data android:name="android.app.lib_name" android:value="sfml-activity-d" /> <meta-data android:name="sfml.app.lib_name" android:value="sfml-example" /> <intent-filter> diff --git a/examples/android/app/src/main/cpp/Android.mk b/examples/android/app/src/main/cpp/Android.mk deleted file mode 100644 index ae84f65f..00000000 --- a/examples/android/app/src/main/cpp/Android.mk +++ /dev/null @@ -1,20 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := sfml-example - -LOCAL_SRC_FILES := main.cpp - -LOCAL_SHARED_LIBRARIES := sfml-system -LOCAL_SHARED_LIBRARIES += sfml-window -LOCAL_SHARED_LIBRARIES += sfml-graphics -LOCAL_SHARED_LIBRARIES += sfml-audio -LOCAL_SHARED_LIBRARIES += sfml-network -LOCAL_SHARED_LIBRARIES += sfml-activity -LOCAL_SHARED_LIBRARIES += openal -LOCAL_WHOLE_STATIC_LIBRARIES := sfml-main - -include $(BUILD_SHARED_LIBRARY) - -$(call import-module,sfml) diff --git a/examples/android/app/src/main/cpp/Application.mk b/examples/android/app/src/main/cpp/Application.mk deleted file mode 100644 index e1e4b821..00000000 --- a/examples/android/app/src/main/cpp/Application.mk +++ /dev/null @@ -1,5 +0,0 @@ -NDK_TOOLCHAIN_VERSION := 4.9 -APP_PLATFORM := android-14 -APP_STL := stlport_shared -APP_ABI := armeabi-v7a -APP_MODULES := sfml-activity sfml-example diff --git a/examples/android/app/src/main/jni/Android.mk b/examples/android/app/src/main/jni/Android.mk new file mode 100644 index 00000000..e848c117 --- /dev/null +++ b/examples/android/app/src/main/jni/Android.mk @@ -0,0 +1,20 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := sfml-example + +LOCAL_SRC_FILES := main.cpp + +LOCAL_SHARED_LIBRARIES := sfml-system-d +LOCAL_SHARED_LIBRARIES += sfml-window-d +LOCAL_SHARED_LIBRARIES += sfml-graphics-d +LOCAL_SHARED_LIBRARIES += sfml-audio-d +LOCAL_SHARED_LIBRARIES += sfml-network-d +LOCAL_SHARED_LIBRARIES += sfml-activity-d +LOCAL_SHARED_LIBRARIES += openal +LOCAL_WHOLE_STATIC_LIBRARIES := sfml-main-d + +include $(BUILD_SHARED_LIBRARY) + +$(call import-module,third_party/sfml) diff --git a/examples/android/app/src/main/jni/Application.mk b/examples/android/app/src/main/jni/Application.mk new file mode 100644 index 00000000..df10f28a --- /dev/null +++ b/examples/android/app/src/main/jni/Application.mk @@ -0,0 +1,8 @@ +NDK_TOOLCHAIN_VERSION := 4.9 +APP_PLATFORM := android-14 +# APP_STL has to match CMAKE_ANDROID_STL_TYPE +APP_STL := c++_static +APP_ABI := armeabi-v7a +APP_MODULES := sfml-activity-d sfml-example +APP_OPTIM := debug +APP_CFLAG := -g -ggdb -O0 \ No newline at end of file diff --git a/examples/android/app/src/main/cpp/main.cpp b/examples/android/app/src/main/jni/main.cpp similarity index 66% rename from examples/android/app/src/main/cpp/main.cpp rename to examples/android/app/src/main/jni/main.cpp index 56b6741f..e5445b5b 100644 --- a/examples/android/app/src/main/cpp/main.cpp +++ b/examples/android/app/src/main/jni/main.cpp @@ -76,40 +76,79 @@ int vibrate(sf::Time duration) // ('vibrate()' in this example; undefine 'USE_JNI' above to disable it) int main(int argc, char *argv[]) { - sf::RenderWindow window(sf::VideoMode::getDesktopMode(), ""); + sf::VideoMode screen(sf::VideoMode::getDesktopMode()); + + sf::RenderWindow window(screen, ""); + window.setFramerateLimit(30); sf::Texture texture; if(!texture.loadFromFile("image.png")) return EXIT_FAILURE; sf::Sprite image(texture); - image.setPosition(0, 0); + image.setPosition(screen.width / 2, screen.height / 2); image.setOrigin(texture.getSize().x/2, texture.getSize().y/2); - sf::Music music; + sf::Font font; + if (!font.loadFromFile("sansation.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(); + music.play();*/ sf::View view = window.getDefaultView(); + sf::Color background = sf::Color::White; + + // We shouldn't try drawing to the screen while in background + // so we'll have to track that. You can do minor background + // work, but keep battery life in mind. + bool active = true; + while (window.isOpen()) { sf::Event event; - while (window.pollEvent(event)) + while (active ? window.pollEvent(event) : window.waitEvent(event)) { switch (event.type) { case sf::Event::Closed: window.close(); break; + case sf::Event::KeyPressed: + if (event.key.code == sf::Keyboard::Escape) + 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::LostFocus: + background = sf::Color::Black; + break; + case sf::Event::GainedFocus: + background = sf::Color::White; + break; + + // On Android MouseLeft/MouseEntered are (for now) triggered, + // whenever the app loses or gains focus. + case sf::Event::MouseLeft: + active = false; + break; + case sf::Event::MouseEntered: + active = true; + break; case sf::Event::TouchBegan: if (event.touch.finger == 0) { @@ -122,8 +161,15 @@ int main(int argc, char *argv[]) } } - window.clear(sf::Color::White); - window.draw(image); - window.display(); + if (active) + { + window.clear(background); + window.draw(image); + window.draw(text); + window.display(); + } + else { + sf::sleep(sf::milliseconds(100)); + } } } diff --git a/examples/android/gradle/wrapper/gradle-wrapper.jar b/examples/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 13372aef5e24af05341d49695ee84e5f9b594659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53636 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ⅅ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 H-+%o-(+5aQ diff --git a/examples/android/gradle/wrapper/gradle-wrapper.properties b/examples/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 74e4fed5..00000000 --- a/examples/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Thu Oct 26 23:14:02 CEST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/examples/android/gradlew b/examples/android/gradlew deleted file mode 100755 index 9d82f789..00000000 --- a/examples/android/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/examples/android/gradlew.bat b/examples/android/gradlew.bat deleted file mode 100644 index 8a0b282a..00000000 --- a/examples/android/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/src/SFML/Android.mk b/src/SFML/Android.mk index f4f586d4..2c3a6267 100644 --- a/src/SFML/Android.mk +++ b/src/SFML/Android.mk @@ -179,5 +179,5 @@ ifdef prebuilt include $(PREBUILT_SHARED_LIBRARY) endif -$(call import-module,sfml/extlibs) +$(call import-module,third_party/sfml/extlibs) From 4d0d3312724ce180a3554e1fcdca951ff685632e Mon Sep 17 00:00:00 2001 From: David Carlier <devnexen@gmail.com> Date: Tue, 26 Dec 2017 21:34:33 +0000 Subject: [PATCH 065/211] pushing upstream openbsd support from package. --- CMakeLists.txt | 4 ++-- cmake/Config.cmake | 13 +++++++++++++ include/SFML/Config.hpp | 4 ++++ include/SFML/OpenGL.hpp | 2 +- include/SFML/Window/WindowHandle.hpp | 2 +- src/SFML/Window/CMakeLists.txt | 12 +++++++++--- src/SFML/Window/ClipboardImpl.hpp | 2 +- src/SFML/Window/CursorImpl.hpp | 2 +- src/SFML/Window/GlContext.cpp | 2 +- src/SFML/Window/InputImpl.hpp | 2 +- src/SFML/Window/JoystickImpl.hpp | 2 +- src/SFML/Window/SensorImpl.hpp | 2 +- src/SFML/Window/WindowImpl.cpp | 2 +- 13 files changed, 37 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 20557980..26c5f981 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -269,9 +269,9 @@ if(SFML_OS_MACOSX) set(XCODE_TEMPLATES_ARCH "\$(NATIVE_ARCH_ACTUAL)") endif() -if(SFML_OS_LINUX OR SFML_OS_FREEBSD) +if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD) set(PKGCONFIG_DIR lib${LIB_SUFFIX}/pkgconfig) - if(SFML_OS_FREEBSD) + if(SFML_OS_FREEBSD OR SFML_OS_OPENBSD) set(PKGCONFIG_DIR libdata/pkgconfig) endif() if(BUILD_SHARED_LIBS) diff --git a/cmake/Config.cmake b/cmake/Config.cmake index cebf3deb..78445043 100644 --- a/cmake/Config.cmake +++ b/cmake/Config.cmake @@ -31,6 +31,10 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "^k?FreeBSD$") set(SFML_OS_FREEBSD 1) # don't use the OpenGL ES implementation on FreeBSD set(OPENGL_ES 0) +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} STREQUAL "Darwin") if(IOS) set(SFML_OS_IOS 1) @@ -117,3 +121,12 @@ else() message(FATAL_ERROR "Unsupported compiler") return() endif() + +# define the install directory for miscellaneous files +if(SFML_OS_WINDOWS OR SFML_OS_IOS) + set(INSTALL_MISC_DIR .) +elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_MACOSX OR SFML_OS_OPENBSD) + set(INSTALL_MISC_DIR share/SFML) +elseif(SFML_OS_ANDROID) + set(INSTALL_MISC_DIR ${ANDROID_NDK}/sources/sfml) +endif() diff --git a/include/SFML/Config.hpp b/include/SFML/Config.hpp index 33c4a71b..659f4a76 100644 --- a/include/SFML/Config.hpp +++ b/include/SFML/Config.hpp @@ -85,6 +85,10 @@ // FreeBSD #define SFML_SYSTEM_FREEBSD + #elif defined(__OpenBSD__) + + // OpenBSD + #define SFML_SYSTEM_OPENBSD #else diff --git a/include/SFML/OpenGL.hpp b/include/SFML/OpenGL.hpp index 1a57e65f..6db5d01a 100644 --- a/include/SFML/OpenGL.hpp +++ b/include/SFML/OpenGL.hpp @@ -45,7 +45,7 @@ #include <GL/gl.h> -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) #if defined(SFML_OPENGL_ES) #include <GLES/gl.h> diff --git a/include/SFML/Window/WindowHandle.hpp b/include/SFML/Window/WindowHandle.hpp index b2a250b8..daad0471 100644 --- a/include/SFML/Window/WindowHandle.hpp +++ b/include/SFML/Window/WindowHandle.hpp @@ -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) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) // Window handle is Window (unsigned long) on Unix - X11 typedef unsigned long WindowHandle; diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index 55083dbd..7d61bdd1 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -79,7 +79,7 @@ if(SFML_OS_WINDOWS) # 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) +elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD) set(PLATFORM_SRC ${SRCROOT}/Unix/CursorImpl.hpp ${SRCROOT}/Unix/CursorImpl.cpp @@ -116,6 +116,12 @@ elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD) ${SRCROOT}/FreeBSD/JoystickImpl.cpp ${SRCROOT}/FreeBSD/JoystickImpl.hpp ) + elseif(SFML_OS_OPENBSD) + set(PLATFORM_SRC + ${PLATFORM_SRC} + ${SRCROOT}/Android/JoystickImpl.cpp + ${SRCROOT}/Android/JoystickImpl.hpp + ) endif() source_group("unix" FILES ${PLATFORM_SRC}) elseif(SFML_OS_MACOSX) @@ -224,7 +230,7 @@ sfml_add_library(sfml-window target_link_libraries(sfml-window PUBLIC sfml-system) # find and setup usage for external libraries -if(SFML_OS_LINUX OR SFML_OS_FREEBSD) +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() @@ -259,7 +265,7 @@ if(SFML_OS_LINUX) target_link_libraries(sfml-window PRIVATE UDev) elseif(SFML_OS_WINDOWS) target_link_libraries(sfml-window PRIVATE winmm gdi32) -elseif(SFML_OS_FREEBSD) +elseif(SFML_OS_FREEBSD OR SFML_OS_OPENBSD) target_link_libraries(sfml-window PRIVATE usbhid) elseif(SFML_OS_MACOSX) target_link_libraries(sfml-window PRIVATE "-framework Foundation" "-framework AppKit" "-framework IOKit" "-framework Carbon") diff --git a/src/SFML/Window/ClipboardImpl.hpp b/src/SFML/Window/ClipboardImpl.hpp index 95a8721e..8e60d4e2 100644 --- a/src/SFML/Window/ClipboardImpl.hpp +++ b/src/SFML/Window/ClipboardImpl.hpp @@ -32,7 +32,7 @@ #if defined(SFML_SYSTEM_WINDOWS) #include <SFML/Window/Win32/ClipboardImpl.hpp> -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) #include <SFML/Window/Unix/ClipboardImpl.hpp> #elif defined(SFML_SYSTEM_MACOS) #include <SFML/Window/OSX/ClipboardImpl.hpp> diff --git a/src/SFML/Window/CursorImpl.hpp b/src/SFML/Window/CursorImpl.hpp index 4418c871..d48220cf 100644 --- a/src/SFML/Window/CursorImpl.hpp +++ b/src/SFML/Window/CursorImpl.hpp @@ -34,7 +34,7 @@ #include <SFML/Window/Win32/CursorImpl.hpp> -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) #include <SFML/Window/Unix/CursorImpl.hpp> diff --git a/src/SFML/Window/GlContext.cpp b/src/SFML/Window/GlContext.cpp index 9b6c1f70..3cbb7016 100644 --- a/src/SFML/Window/GlContext.cpp +++ b/src/SFML/Window/GlContext.cpp @@ -49,7 +49,7 @@ #include <SFML/Window/Win32/WglContext.hpp> typedef sf::priv::WglContext ContextType; - #elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) + #elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) #include <SFML/Window/Unix/GlxContext.hpp> typedef sf::priv::GlxContext ContextType; diff --git a/src/SFML/Window/InputImpl.hpp b/src/SFML/Window/InputImpl.hpp index d9316d1a..305fc09d 100644 --- a/src/SFML/Window/InputImpl.hpp +++ b/src/SFML/Window/InputImpl.hpp @@ -32,7 +32,7 @@ #if defined(SFML_SYSTEM_WINDOWS) #include <SFML/Window/Win32/InputImpl.hpp> -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) #include <SFML/Window/Unix/InputImpl.hpp> #elif defined(SFML_SYSTEM_MACOS) #include <SFML/Window/OSX/InputImpl.hpp> diff --git a/src/SFML/Window/JoystickImpl.hpp b/src/SFML/Window/JoystickImpl.hpp index e5d4131f..b47d5aa8 100644 --- a/src/SFML/Window/JoystickImpl.hpp +++ b/src/SFML/Window/JoystickImpl.hpp @@ -98,7 +98,7 @@ struct JoystickState #include <SFML/Window/iOS/JoystickImpl.hpp> -#elif defined(SFML_SYSTEM_ANDROID) +#elif defined(SFML_SYSTEM_ANDROID) || defined(SFML_SYSTEM_OPENBSD) #include <SFML/Window/Android/JoystickImpl.hpp> diff --git a/src/SFML/Window/SensorImpl.hpp b/src/SFML/Window/SensorImpl.hpp index 41a6ca0f..a5434729 100644 --- a/src/SFML/Window/SensorImpl.hpp +++ b/src/SFML/Window/SensorImpl.hpp @@ -35,7 +35,7 @@ #include <SFML/Window/Win32/SensorImpl.hpp> -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) #include <SFML/Window/Unix/SensorImpl.hpp> diff --git a/src/SFML/Window/WindowImpl.cpp b/src/SFML/Window/WindowImpl.cpp index bd87474b..3de404a0 100644 --- a/src/SFML/Window/WindowImpl.cpp +++ b/src/SFML/Window/WindowImpl.cpp @@ -38,7 +38,7 @@ #include <SFML/Window/Win32/WindowImplWin32.hpp> typedef sf::priv::WindowImplWin32 WindowImplType; -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) #include <SFML/Window/Unix/WindowImplX11.hpp> typedef sf::priv::WindowImplX11 WindowImplType; From 763a9fb44e590593854029a6f5d6355d48006868 Mon Sep 17 00:00:00 2001 From: David Carlier <devnexen@gmail.com> Date: Tue, 2 Jan 2018 19:02:44 +0000 Subject: [PATCH 066/211] Adding empty joystick implementation handling for OpenBSD --- src/SFML/Window/CMakeLists.txt | 4 +- src/SFML/Window/OpenBSD/JoystickImpl.cpp | 97 +++++++++++++++++++ src/SFML/Window/OpenBSD/JoystickImpl.hpp | 117 +++++++++++++++++++++++ 3 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 src/SFML/Window/OpenBSD/JoystickImpl.cpp create mode 100644 src/SFML/Window/OpenBSD/JoystickImpl.hpp diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index 7d61bdd1..6e4e542c 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -119,8 +119,8 @@ elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD) elseif(SFML_OS_OPENBSD) set(PLATFORM_SRC ${PLATFORM_SRC} - ${SRCROOT}/Android/JoystickImpl.cpp - ${SRCROOT}/Android/JoystickImpl.hpp + ${SRCROOT}/OpenBSD/JoystickImpl.cpp + ${SRCROOT}/OpenBSD/JoystickImpl.hpp ) endif() source_group("unix" FILES ${PLATFORM_SRC}) diff --git a/src/SFML/Window/OpenBSD/JoystickImpl.cpp b/src/SFML/Window/OpenBSD/JoystickImpl.cpp new file mode 100644 index 00000000..58dfc829 --- /dev/null +++ b/src/SFML/Window/OpenBSD/JoystickImpl.cpp @@ -0,0 +1,97 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 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/JoystickImpl.hpp> + + +namespace sf +{ +namespace priv +{ +//////////////////////////////////////////////////////////// +void JoystickImpl::initialize() +{ + // To implement +} + + + +//////////////////////////////////////////////////////////// +void JoystickImpl::cleanup() +{ + // To implement +} + + +//////////////////////////////////////////////////////////// +bool JoystickImpl::isConnected(unsigned int index) +{ + // To implement + return false; +} + + +//////////////////////////////////////////////////////////// +bool JoystickImpl::open(unsigned int index) +{ + // To implement + return false; +} + + +//////////////////////////////////////////////////////////// +void JoystickImpl::close() +{ + // To implement +} + + +//////////////////////////////////////////////////////////// +JoystickCaps JoystickImpl::getCapabilities() const +{ + // To implement + return JoystickCaps(); +} + + +//////////////////////////////////////////////////////////// +Joystick::Identification JoystickImpl::getIdentification() const +{ + return m_identification; +} + + +//////////////////////////////////////////////////////////// +JoystickState JoystickImpl::update() +{ + // To implement + return JoystickState(); +} + +} // namespace priv + +} // namespace sf diff --git a/src/SFML/Window/OpenBSD/JoystickImpl.hpp b/src/SFML/Window/OpenBSD/JoystickImpl.hpp new file mode 100644 index 00000000..8e67d7a3 --- /dev/null +++ b/src/SFML/Window/OpenBSD/JoystickImpl.hpp @@ -0,0 +1,117 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 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_JOYSTICKIMPLOPENBSD_HPP +#define SFML_JOYSTICKIMPLOPENBSD_HPP + + +namespace sf +{ +namespace priv +{ +//////////////////////////////////////////////////////////// +/// \brief Android implementation of joysticks +/// +//////////////////////////////////////////////////////////// +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_index; ///< Index of the joystick + Joystick::Identification m_identification; ///< Joystick identification +}; + +} // namespace priv + +} // namespace sf + + +#endif // SFML_JOYSTICKIMPLOPENBSD_HPP From 9da895da8baae8d82bf2c870a50f987a03fd8f18 Mon Sep 17 00:00:00 2001 From: David Carlier <devnexen@gmail.com> Date: Sat, 7 Apr 2018 21:27:04 +0100 Subject: [PATCH 067/211] further changes --- CMakeLists.txt | 2 +- cmake/Config.cmake | 9 --------- include/SFML/Config.hpp | 1 + src/SFML/Window/CMakeLists.txt | 2 +- src/SFML/Window/JoystickImpl.hpp | 6 +++++- src/SFML/Window/OpenBSD/JoystickImpl.hpp | 2 +- 6 files changed, 9 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 26c5f981..aca57ad6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,7 +143,7 @@ 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) +elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD) set(DEFAULT_INSTALL_MISC_DIR share/SFML) elseif(SFML_OS_MACOSX) set(DEFAULT_INSTALL_MISC_DIR /usr/local/share/SFML) diff --git a/cmake/Config.cmake b/cmake/Config.cmake index 78445043..82a094cd 100644 --- a/cmake/Config.cmake +++ b/cmake/Config.cmake @@ -121,12 +121,3 @@ else() message(FATAL_ERROR "Unsupported compiler") return() endif() - -# define the install directory for miscellaneous files -if(SFML_OS_WINDOWS OR SFML_OS_IOS) - set(INSTALL_MISC_DIR .) -elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_MACOSX OR SFML_OS_OPENBSD) - set(INSTALL_MISC_DIR share/SFML) -elseif(SFML_OS_ANDROID) - set(INSTALL_MISC_DIR ${ANDROID_NDK}/sources/sfml) -endif() diff --git a/include/SFML/Config.hpp b/include/SFML/Config.hpp index 659f4a76..70a6929b 100644 --- a/include/SFML/Config.hpp +++ b/include/SFML/Config.hpp @@ -85,6 +85,7 @@ // FreeBSD #define SFML_SYSTEM_FREEBSD + #elif defined(__OpenBSD__) // OpenBSD diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index 6e4e542c..916c1dcd 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -265,7 +265,7 @@ if(SFML_OS_LINUX) target_link_libraries(sfml-window PRIVATE UDev) elseif(SFML_OS_WINDOWS) target_link_libraries(sfml-window PRIVATE winmm gdi32) -elseif(SFML_OS_FREEBSD OR SFML_OS_OPENBSD) +elseif(SFML_OS_FREEBSD) target_link_libraries(sfml-window PRIVATE usbhid) elseif(SFML_OS_MACOSX) target_link_libraries(sfml-window PRIVATE "-framework Foundation" "-framework AppKit" "-framework IOKit" "-framework Carbon") diff --git a/src/SFML/Window/JoystickImpl.hpp b/src/SFML/Window/JoystickImpl.hpp index b47d5aa8..e4fd7e2d 100644 --- a/src/SFML/Window/JoystickImpl.hpp +++ b/src/SFML/Window/JoystickImpl.hpp @@ -90,6 +90,10 @@ struct JoystickState #include <SFML/Window/FreeBSD/JoystickImpl.hpp> +#elif defined(SFML_SYSTEM_OPENBSD) + + #include <SFML/Window/OpenBSD/JoystickImpl.hpp> + #elif defined(SFML_SYSTEM_MACOS) #include <SFML/Window/OSX/JoystickImpl.hpp> @@ -98,7 +102,7 @@ struct JoystickState #include <SFML/Window/iOS/JoystickImpl.hpp> -#elif defined(SFML_SYSTEM_ANDROID) || defined(SFML_SYSTEM_OPENBSD) +#elif defined(SFML_SYSTEM_ANDROID) #include <SFML/Window/Android/JoystickImpl.hpp> diff --git a/src/SFML/Window/OpenBSD/JoystickImpl.hpp b/src/SFML/Window/OpenBSD/JoystickImpl.hpp index 8e67d7a3..af7ef5c7 100644 --- a/src/SFML/Window/OpenBSD/JoystickImpl.hpp +++ b/src/SFML/Window/OpenBSD/JoystickImpl.hpp @@ -31,7 +31,7 @@ namespace sf namespace priv { //////////////////////////////////////////////////////////// -/// \brief Android implementation of joysticks +/// \brief OpenBSD implementation of joysticks /// //////////////////////////////////////////////////////////// class JoystickImpl From 9bdd6d46ddda34bd3dce72cd839dbc4bfff211ee Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sun, 8 Apr 2018 04:42:56 +0200 Subject: [PATCH 068/211] Fixed TcpListener and TcpSocket not behaving as documented when calling listen or connect while the underlying socket object already exists, also adjusted UdpSocket to be consistent with connect and listen behaviour when calling bind while the underlying socket object already exists. Fixes #1346 --- include/SFML/Network/TcpListener.hpp | 14 ++++++++------ include/SFML/Network/TcpSocket.hpp | 3 ++- include/SFML/Network/UdpSocket.hpp | 5 +++++ src/SFML/Network/TcpListener.cpp | 3 +++ src/SFML/Network/TcpSocket.cpp | 3 +++ src/SFML/Network/UdpSocket.cpp | 3 +++ 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/include/SFML/Network/TcpListener.hpp b/include/SFML/Network/TcpListener.hpp index 840a7cde..e0e05d64 100644 --- a/include/SFML/Network/TcpListener.hpp +++ b/include/SFML/Network/TcpListener.hpp @@ -65,14 +65,16 @@ public: unsigned short getLocalPort() const; //////////////////////////////////////////////////////////// - /// \brief Start listening for connections + /// \brief Start listening for incoming connection attempts /// - /// This functions makes the socket listen to the specified - /// port, waiting for new connections. - /// If the socket was previously listening to another port, - /// it will be stopped first and bound to the new port. + /// This function makes the socket start listening on the + /// specified port, waiting for incoming connection attempts. /// - /// \param port Port to listen for new connections + /// If the socket is already listening on a port when this + /// function is called, it will stop listening on the old + /// port before starting to listen on the new port. + /// + /// \param port Port to listen on for incoming connection attempts /// \param address Address of the interface to listen on /// /// \return Status code diff --git a/include/SFML/Network/TcpSocket.hpp b/include/SFML/Network/TcpSocket.hpp index 6c0c8bc7..6c0ab98a 100644 --- a/include/SFML/Network/TcpSocket.hpp +++ b/include/SFML/Network/TcpSocket.hpp @@ -97,7 +97,8 @@ public: /// In blocking mode, this function may take a while, especially /// if the remote peer is not reachable. The last parameter allows /// you to stop trying to connect after a given timeout. - /// If the socket was previously connected, it is first disconnected. + /// If the socket is already connected, the connection is + /// forcibly disconnected before attempting to connect again. /// /// \param remoteAddress Address of the remote peer /// \param remotePort Port of the remote peer diff --git a/include/SFML/Network/UdpSocket.hpp b/include/SFML/Network/UdpSocket.hpp index 20e35b8b..7ce3fe55 100644 --- a/include/SFML/Network/UdpSocket.hpp +++ b/include/SFML/Network/UdpSocket.hpp @@ -82,6 +82,11 @@ public: /// system to automatically pick an available port, and then /// call getLocalPort to retrieve the chosen port. /// + /// Since the socket can only be bound to a single port at + /// any given moment, if it is already bound when this + /// function is called, it will be unbound from the previous + /// port before being bound to the new one. + /// /// \param port Port to bind the socket to /// \param address Address of the interface to bind to /// diff --git a/src/SFML/Network/TcpListener.cpp b/src/SFML/Network/TcpListener.cpp index ce62fe76..399f87d6 100644 --- a/src/SFML/Network/TcpListener.cpp +++ b/src/SFML/Network/TcpListener.cpp @@ -63,6 +63,9 @@ unsigned short TcpListener::getLocalPort() const //////////////////////////////////////////////////////////// Socket::Status TcpListener::listen(unsigned short port, const IpAddress& address) { + // Close the socket if it is already bound + close(); + // Create the internal socket if it doesn't exist create(); diff --git a/src/SFML/Network/TcpSocket.cpp b/src/SFML/Network/TcpSocket.cpp index bb3e65c5..e11f76b2 100644 --- a/src/SFML/Network/TcpSocket.cpp +++ b/src/SFML/Network/TcpSocket.cpp @@ -118,6 +118,9 @@ unsigned short TcpSocket::getRemotePort() const //////////////////////////////////////////////////////////// Socket::Status TcpSocket::connect(const IpAddress& remoteAddress, unsigned short remotePort, Time timeout) { + // Disconnect the socket if it is already connected + disconnect(); + // Create the internal socket if it doesn't exist create(); diff --git a/src/SFML/Network/UdpSocket.cpp b/src/SFML/Network/UdpSocket.cpp index 99b52fdf..0ff03b04 100644 --- a/src/SFML/Network/UdpSocket.cpp +++ b/src/SFML/Network/UdpSocket.cpp @@ -66,6 +66,9 @@ unsigned short UdpSocket::getLocalPort() const //////////////////////////////////////////////////////////// Socket::Status UdpSocket::bind(unsigned short port, const IpAddress& address) { + // Close the socket if it is already bound + close(); + // Create the internal socket if it doesn't exist create(); From 2cd479755732fc048322f9759aa4af0c7ea76e7a Mon Sep 17 00:00:00 2001 From: Mario Liebisch <mario.liebisch@gmail.com> Date: Mon, 5 Feb 2018 21:56:32 +0100 Subject: [PATCH 069/211] Examples: Set startup folder for debugging in Visual Studio --- cmake/Macros.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 02dc145e..be523459 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -217,6 +217,9 @@ macro(sfml_add_example target) # set the target flags to use the appropriate C++ standard library sfml_set_stdlib(${target}) + # set the Visual Studio startup path for debugging + set_target_properties(${target} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + # link the target to its SFML dependencies if(THIS_DEPENDS) target_link_libraries(${target} PRIVATE ${THIS_DEPENDS}) From f25589e3091cf1103c73f55b7235928408bc8c36 Mon Sep 17 00:00:00 2001 From: Bruno Van de Velde <bruno@texus.me> Date: Mon, 9 Apr 2018 08:12:38 +0200 Subject: [PATCH 070/211] iOS example did not build on case-sensitive filesystem because path contained 'ios' instead of 'iOS' in CMakeLists.txt --- examples/iOS/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/iOS/CMakeLists.txt b/examples/iOS/CMakeLists.txt index 3aaea884..95868153 100644 --- a/examples/iOS/CMakeLists.txt +++ b/examples/iOS/CMakeLists.txt @@ -1,5 +1,5 @@ -set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/ios) +set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/iOS) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules) # All source files From 5ebfef4803a6b0f9b36972ce081f5674d62157ec Mon Sep 17 00:00:00 2001 From: Bruno Van de Velde <bruno@texus.me> Date: Mon, 9 Apr 2018 08:16:55 +0200 Subject: [PATCH 071/211] Copied resources to iOS example --- examples/iOS/CMakeLists.txt | 9 ++++----- examples/iOS/resources/canary.wav | Bin 0 -> 63504 bytes examples/iOS/resources/image.png | Bin 0 -> 8849 bytes examples/iOS/resources/orchestral.ogg | Bin 0 -> 153776 bytes examples/iOS/resources/sansation.ttf | Bin 0 -> 28912 bytes 5 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 examples/iOS/resources/canary.wav create mode 100644 examples/iOS/resources/image.png create mode 100644 examples/iOS/resources/orchestral.ogg create mode 100644 examples/iOS/resources/sansation.ttf diff --git a/examples/iOS/CMakeLists.txt b/examples/iOS/CMakeLists.txt index 95868153..96450f42 100644 --- a/examples/iOS/CMakeLists.txt +++ b/examples/iOS/CMakeLists.txt @@ -5,12 +5,11 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules) # All source files set(SRC ${SRCROOT}/main.cpp) -# Use the resources from the android example set(RESOURCES - ${CMAKE_CURRENT_SOURCE_DIR}/../android/assets/canary.wav - ${CMAKE_CURRENT_SOURCE_DIR}/../android/assets/image.png - ${CMAKE_CURRENT_SOURCE_DIR}/../android/assets/orchestral.ogg - ${CMAKE_CURRENT_SOURCE_DIR}/../android/assets/sansation.ttf) + ${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 ) diff --git a/examples/iOS/resources/canary.wav b/examples/iOS/resources/canary.wav new file mode 100644 index 0000000000000000000000000000000000000000..a0f3aecc5db38e9357edce96c8139ec04d1fcee5 GIT binary patch literal 63504 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 Z*HQ{lAvEEW>X<D9Hd1L@VyI|t{y$RfYghmP literal 0 HcmV?d00001 diff --git a/examples/iOS/resources/image.png b/examples/iOS/resources/image.png new file mode 100644 index 0000000000000000000000000000000000000000..29ba0102e52e1b094f1a31ecb321470e4e5ca725 GIT binary patch literal 8849 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 Ao&W#< literal 0 HcmV?d00001 diff --git a/examples/iOS/resources/orchestral.ogg b/examples/iOS/resources/orchestral.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f764d61db05f2f2516f491e615f0afb2d51ef2af GIT binary patch literal 153776 zcmeFYby%EFvmiRS1q~iFNPq+g?(PsExJz(%cZcBa4DRmk!5xBI2r@Xq8T1bMec#zV z_u0MA-re)(_S4f--Bn%HU0q#WZ_hjOrlv{&Xu!Wxmh?Zs8=6Q-C=w_aTL%Mk$JZw4 z_p1M3a2TNe0;N#$uRZ@Gz4m;?bd5QoV9>w(r}PfyA4bFwyt=ua8H2ooDVdeIf$CrO zWKv|zpFgvHW@qMl<pu@!5Al0p5mhLFAOL_bj6nxiX&B8tj6)ttke4GoN;^a>JWZZY zDH6s#$Toy;DA8&ZE<EBt9jgL(?NC6Z_SHd(9+c^rkFPdvzfT5%cF9b~?UAS;P&5}P z-XWUlA1s;!?JJ!>wnVsnF+Kz;Ac8<8uaGrUbG*YO7X;cP3srQeVtd8no1!_OymA?Q z<#+VTIg+jU=Rb6RiT@Unuk8OqHcTK~$EsH@kSftXZDg!QIDl9HASah5{5K6624NjC zU>E?v5VXgZh{KktB^sNdL`6i^fP2*_B7{ydq(CyfP(9kj97yevN0XjMS6*j6TK8$J z?x>C7Z+A%m;Hv`mfE_l%-+o2_0HQukcs^(Jj(U8d1`r`Aqyie?2LQlA=-x=wV#}UW zPF?U$UH-rGKVr!M06+kZ5kAbnmjIERkU%6$5lb5xSC|M>gjje|q_i;b7i}<=;jB`H z5F)wP8Q<-O=h;6?fB^t}!{!Y0AEHDg4>G|1AZlMk27z`d)kod;DG}ELF@#$(J;z!h zJ^rc!GRGdWAPiv$4WytgNK}-hElM>AryU}49A_FL3w*=8pOYZRJyH-a$304!AFXIf z+la07rFIwBu(EL>)3I8J)-aN35dXgw6o1tKnJ@-Cfl(}EfI--QnL0rD5&bhQ2=dkJ ziNq8sB^)Rv;weYsKS?F<j@7?r*`K1aI4bih){8gRdN<aa^TwMu#;fzjI?2ZCjn+B~ zIy#Ha|2hAix*sgSFM0=}bx4+sE|5h2yEw5>01SX%K4<v0BxF6JsWjrL&67>tlZ)Nc zOTLr*C4npqL~D@bm-lzsC^eFc%z?$Pi(OV0UQ}9EW|3ZG{{Nk!bIHpA03-l_c*vee z!k%cz{&iM=HB1HrAOiqI6o|weJ`KgQ%0T8gCpvYdt-$WAq-Oo^MSzgJrXfdONFITx z0s<uPO3ks#{x9ZN#X<uh#up1cB}_{%4owu6n!n_E)(Kf@W8U~MsS~EFpG*j~rh^nF ziTO*kQ$)gV4EA}Qq?y8KuN9dG$p)7U-;gKbLl%!55M%<tr$mZnMTO*l1_q#%hhbHK zWtE3m@!uqM36Q-4$YTHFk^a^Azxfr*i~2_tb6OPhU;QD1L>1sf=l?AWB1IktYDW3L zL>4PLL=Z&We<y1mmRA9?;r}LxEQlZloc{`0|6=)nzy7ZV{%0D1m^dsa<fD!l98!S@ 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
#w=ggR_hkb&* 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 Tx%Yr^KOg32zryX%d+6l?8x!SD literal 0 HcmV?d00001 diff --git a/examples/iOS/resources/sansation.ttf b/examples/iOS/resources/sansation.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d85fbc81d91e22c647a3338a37f24a9d684dcf8a GIT binary patch literal 28912 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 Y(-osHj2F<;P%p3rF{>lYhrW~jFV!_TuK)l5 literal 0 HcmV?d00001 From b922b04b5e5725894601989a39efccde49dea1b1 Mon Sep 17 00:00:00 2001 From: Mario Liebisch <mario.liebisch@gmail.com> Date: Sat, 14 Apr 2018 12:03:57 +0200 Subject: [PATCH 072/211] Android: Removed libsndfile from extlib build scripts --- tools/android/compile_libs.sh | 3 --- tools/android/download_sources.sh | 6 ------ 2 files changed, 9 deletions(-) diff --git a/tools/android/compile_libs.sh b/tools/android/compile_libs.sh index 6b3526fe..deadac5d 100755 --- a/tools/android/compile_libs.sh +++ b/tools/android/compile_libs.sh @@ -48,9 +48,6 @@ rm $DESTDIR/$1/usr/lib/libFLAC*.so* cd $LOCALDIR/build/libvorbis-* && sed -i 's/-version-info/-avoid-version/g' lib/Makefile.in lib/Makefile.am && ./configure $HOST $PREFIX --enable-shared=no && make && make install rm $DESTDIR/$1/usr/lib/libvorbis*.so* -# Compile libsndfile (important: --disable-sqlite) -cd $LOCALDIR/build/libsndfile-* && sed -i 's/-version-info/-avoid-version/g' src/Makefile.in src/Makefile.am && ./configure $HOST $PREFIX --disable-sqlite && make && make install - # Compile freetype cd $LOCALDIR/build/freetype-* && sed -i 's/-version-info/-avoid-version/g' builds/unix/unix-cc.in && ./configure $HOST $PREFIX && make && make install diff --git a/tools/android/download_sources.sh b/tools/android/download_sources.sh index 82f5bd06..27c75eb4 100755 --- a/tools/android/download_sources.sh +++ b/tools/android/download_sources.sh @@ -34,12 +34,6 @@ then tar -C build -xf src/$OGG.tar.gz fi -wget -nc -P src http://www.mega-nerd.com/libsndfile/files/$SNDFILE.tar.gz -if [ ! -d "$PWD/tmp/$SNDFILE" ] -then - tar -C build -xf src/$SNDFILE.tar.gz -fi - wget -nc -P src http://download.savannah.gnu.org/releases/freetype/$FREETYPE.tar.gz if [ ! -d "$PWD/tmp/$FREETYPE" ] then From ee957f342051f509634355755049ad0486dafd43 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sun, 15 Apr 2018 04:22:16 +0200 Subject: [PATCH 073/211] Restrict WM_DEVICECHANGE messages to only be sent when HID devices are affected, restrict DirectInput EnumDevices to only enumerate over attached devices. Fixes #1415 --- src/SFML/Window/Win32/JoystickImpl.cpp | 2 +- src/SFML/Window/Win32/WindowImplWin32.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/SFML/Window/Win32/JoystickImpl.cpp b/src/SFML/Window/Win32/JoystickImpl.cpp index a25fd6fe..1b98d9d3 100644 --- a/src/SFML/Window/Win32/JoystickImpl.cpp +++ b/src/SFML/Window/Win32/JoystickImpl.cpp @@ -449,7 +449,7 @@ void JoystickImpl::updateConnectionsDInput() joystickList[i].plugged = false; // Enumerate devices - HRESULT result = directInput->EnumDevices(DI8DEVCLASS_GAMECTRL, &JoystickImpl::deviceEnumerationCallback, NULL, DIEDFL_ALLDEVICES); + HRESULT result = directInput->EnumDevices(DI8DEVCLASS_GAMECTRL, &JoystickImpl::deviceEnumerationCallback, NULL, DIEDFL_ATTACHEDONLY); // Remove devices that were not connected during the enumeration for (std::vector<JoystickRecord>::iterator i = joystickList.begin(); i != joystickList.end();) diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index 707e4187..e8e17fe5 100755 --- a/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -67,6 +67,8 @@ namespace const wchar_t* className = L"SFML_Window"; sf::priv::WindowImplWin32* fullscreenWindow = NULL; + const GUID GUID_DEVINTERFACE_HID = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30}}; + void setProcessDpiAware() { // Try SetProcessDpiAwareness first @@ -216,8 +218,8 @@ 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_HDR deviceBroadcastHeader = {sizeof(DEV_BROADCAST_HDR), DBT_DEVTYP_DEVICEINTERFACE, 0}; - RegisterDeviceNotification(m_handle, &deviceBroadcastHeader, DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); + 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 if (m_handle) From cd1387479eb6f4ba61123ddc11a5fa82e7d3fa35 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sat, 7 Apr 2018 02:17:05 +0200 Subject: [PATCH 074/211] Moved NvOptimusEnablement and AmdPowerXpressRequestHighPerformance out of sfml-main and into a macro the user can place in their own translation unit when they need it. Fixes #1192 --- CMakeLists.txt | 1 + include/SFML/GpuPreference.hpp | 74 ++++++++++++++++++++++++++++++++++ include/SFML/Window/Window.hpp | 8 ++++ src/SFML/Main/MainWin32.cpp | 8 ---- 4 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 include/SFML/GpuPreference.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index aca57ad6..e97f064c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -366,6 +366,7 @@ else() add_custom_command(TARGET SFML POST_BUILD COMMAND cp -r ${PROJECT_SOURCE_DIR}/include/SFML/Config.hpp ${PROJECT_SOURCE_DIR}/include/SFML/OpenGL.hpp + ${PROJECT_SOURCE_DIR}/include/SFML/GpuPreference.hpp ${PROJECT_SOURCE_DIR}/include/SFML/System.hpp ${PROJECT_SOURCE_DIR}/include/SFML/Main.hpp ${PROJECT_SOURCE_DIR}/include/SFML/System diff --git a/include/SFML/GpuPreference.hpp b/include/SFML/GpuPreference.hpp new file mode 100644 index 00000000..cde4f9f1 --- /dev/null +++ b/include/SFML/GpuPreference.hpp @@ -0,0 +1,74 @@ +//////////////////////////////////////////////////////////// +// +// 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_GPUPREFERENCE_HPP +#define SFML_GPUPREFERENCE_HPP + + +//////////////////////////////////////////////////////////// +/// Headers +//////////////////////////////////////////////////////////// +#include <SFML/Config.hpp> + + +//////////////////////////////////////////////////////////// +/// \file +/// +/// \brief File containing SFML_DEFINE_DISCRETE_GPU_PREFERENCE +/// +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// \def SFML_DEFINE_DISCRETE_GPU_PREFERENCE +/// +/// \brief A macro to encourage usage of the discrete GPU +/// +/// In order to inform the Nvidia/AMD driver that an SFML +/// application could benefit from using the more powerful +/// discrete GPU, special symbols have to be publicly +/// exported from the final executable. +/// +/// SFML defines a helper macro to easily do this. +/// +/// Place SFML_DEFINE_DISCRETE_GPU_PREFERENCE in the +/// global scope of a source file that will be linked into +/// the final executable. Typically it is best to place it +/// where the main function is also defined. +/// +//////////////////////////////////////////////////////////// +#if defined(SFML_SYSTEM_WINDOWS) + + #define SFML_DEFINE_DISCRETE_GPU_PREFERENCE \ + extern "C" __declspec(dllexport) unsigned long NvOptimusEnablement = 1; \ + extern "C" __declspec(dllexport) unsigned long AmdPowerXpressRequestHighPerformance = 1; + +#else + + #define SFML_DEFINE_DISCRETE_GPU_PREFERENCE + +#endif + + +#endif // SFML_GPUPREFERENCE_HPP diff --git a/include/SFML/Window/Window.hpp b/include/SFML/Window/Window.hpp index c8a56176..7ff81e29 100644 --- a/include/SFML/Window/Window.hpp +++ b/include/SFML/Window/Window.hpp @@ -581,6 +581,14 @@ private: /// structure which is passed as an optional argument when creating the /// window. /// +/// On dual-graphics systems consisting of a low-power integrated GPU +/// and a powerful discrete GPU, the driver picks which GPU will run an +/// SFML application. In order to inform the driver that an SFML application +/// can benefit from being run on the more powerful discrete GPU, +/// #SFML_DEFINE_DISCRETE_GPU_PREFERENCE can be placed in a source file +/// that is compiled and linked into the final application. The macro +/// should be placed outside of any scopes in the global namespace. +/// /// Usage example: /// \code /// // Declare and create a new window diff --git a/src/SFML/Main/MainWin32.cpp b/src/SFML/Main/MainWin32.cpp index c9144964..fefc1b7c 100644 --- a/src/SFML/Main/MainWin32.cpp +++ b/src/SFML/Main/MainWin32.cpp @@ -41,14 +41,6 @@ #include <windows.h> -// Inform the Nvidia/AMD driver that this SFML application could -// benefit from using the more powerful discrete GPU -extern "C" -{ -__declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; -__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; -} - extern int main(int argc, char* argv[]); //////////////////////////////////////////////////////////// From 4c4e961f391439a97d159f00ff6aa01397ffd961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Fri, 6 Apr 2018 00:50:01 +0200 Subject: [PATCH 075/211] Added GitHub issue and PR templates GitHub will use these templates to pre-fill created issues and pull requests. This should help to get people to provide better information on issues or direct them to the forum when needed and hint people to provide example/test code for pull requests. --- .github/ISSUE_TEMPLATE.md | 54 ++++++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 51 ++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..0fbd9e45 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,54 @@ +Thanks for raising your issue here! 🙂 + +Before you submit the issue however, we'd like you to consider the follow points. + +* We like to use the issue tracker for confirmed issues. +* If you're stuck with SFML, please use [the forum](https://en.sfml-dev.org/forums/index.php#c3) to get help. + +---- + +## Subject of the issue + +Describe your issue here. + +## Your environment + +* Your OS / distro / window manager used +* Your version of SFML (2.5.0, git master, etc) +* Your compiler and compiler version used +* Special compiler flags used + +## Steps to reproduce + +Tell us how to reproduce this issue. Please provide a [minimal, complete and verifiable example](https://stackoverflow.com/help/mcve), you can use the follow template as a start: + +```cpp +#include <SFML/Graphics.hpp> + +int main() +{ + sf::RenderWindow window(sf::VideoMode(1280, 720), "Minimal, complete and verifiable example"); + window.setFramerateLimit(60); + + while (window.isOpen()) + { + sf::Event event; + while (window.pollEvent(event)) + { + if (event.type == sf::Event::Closed) + window.close(); + } + + window.clear(); + window.display(); + } +} +``` + +## Expected behavior + +Tell us what should happen + +## Actual behavior + +Tell us what happens instead diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..92a926d5 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,51 @@ +Thanks a lot for making a contribution to SFML! 🙂 + +Before you create the pull request, we ask you to check the follow boxes. (For small changes not everything needs to ticked, but the more the better!) + +* [ ] Has this change been discussed on [the forum](https://en.sfml-dev.org/forums/index.php#c3) or in an issue before? +* [ ] Does the code follow the SFML [Code Style Guide](https://www.sfml-dev.org/style.php)? +* [ ] Have you provided some example/test code for your changes? +* [ ] If you have additional steps which need to be performed list them as tasks! + +---- + +## Description + +Please describe your pull request. + +This PR is related to the issue # + +## Tasks + +* [ ] Tested on Linux +* [ ] Tested on Windows +* [ ] Tested on macOS +* [ ] Tested on iOS +* [ ] Tested on Android + +## How to test this PR? + +Describe how to best test these changes. Please provide a [minimal, complete and verifiable example](https://stackoverflow.com/help/mcve) if possible, you can use the follow template as a start: + +```cpp +#include <SFML/Graphics.hpp> + +int main() +{ + sf::RenderWindow window(sf::VideoMode(1280, 720), "Minimal, complete and verifiable example"); + window.setFramerateLimit(60); + + while (window.isOpen()) + { + sf::Event event; + while (window.pollEvent(event)) + { + if (event.type == sf::Event::Closed) + window.close(); + } + + window.clear(); + window.display(); + } +} +``` \ No newline at end of file From 3da81aeecb2f635b3da45043381cbde0fd0041b2 Mon Sep 17 00:00:00 2001 From: Alexander Weinrauch <alexander.weinrauch@gmail.com> Date: Thu, 3 May 2018 22:04:11 +0200 Subject: [PATCH 076/211] Added missing import for memcpy and switched to std::memcpy --- src/SFML/Main/MainAndroid.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SFML/Main/MainAndroid.cpp b/src/SFML/Main/MainAndroid.cpp index 25696fe9..fcb85001 100644 --- a/src/SFML/Main/MainAndroid.cpp +++ b/src/SFML/Main/MainAndroid.cpp @@ -45,6 +45,7 @@ #include <SFML/System/Err.hpp> #include <android/window.h> #include <android/native_activity.h> +#include <cstring> extern int main(int argc, char *argv[]); @@ -485,7 +486,7 @@ void ANativeActivity_onCreate(ANativeActivity* activity, void* savedState, size_ { states->savedState = malloc(savedStateSize); states->savedStateSize = savedStateSize; - memcpy(states->savedState, savedState, savedStateSize); + std::memcpy(states->savedState, savedState, savedStateSize); } states->mainOver = false; From d7fffae7277b013825e12e69bd4219dcfd6854d8 Mon Sep 17 00:00:00 2001 From: Gravechapa <Gravechapa@protonmail.com> Date: Sat, 7 Apr 2018 01:01:19 +0300 Subject: [PATCH 077/211] Updated doxygen file --- doc/doxyfile.in | 434 ++++++++++++++++++++++++++++-------------------- doc/doxygen.css | 6 +- 2 files changed, 260 insertions(+), 180 deletions(-) diff --git a/doc/doxyfile.in b/doc/doxyfile.in index a0e03b7e..98bd2b85 100644 --- a/doc/doxyfile.in +++ b/doc/doxyfile.in @@ -1,4 +1,4 @@ -# Doxyfile 1.8.8 +# Doxyfile 1.8.14 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -20,8 +20,8 @@ # 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 https://www.gnu.org/software/libiconv -# for the list of possible encodings. +# 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. DOXYFILE_ENCODING = UTF-8 @@ -46,10 +46,10 @@ PROJECT_NUMBER = @VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@ PROJECT_BRIEF = -# With the PROJECT_LOGO tag one can specify an logo or icon that is included in -# the documentation. The maximum height of the logo should not exceed 55 pixels -# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo -# to the output directory. +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. PROJECT_LOGO = @@ -60,7 +60,7 @@ PROJECT_LOGO = OUTPUT_DIRECTORY = "@DOXYGEN_OUTPUT_DIR@" -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# 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 # option can be useful when feeding doxygen a huge amount of source files, where @@ -93,14 +93,14 @@ ALLOW_UNICODE_NAMES = NO OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the @@ -145,7 +145,7 @@ ALWAYS_DETAILED_SEC = YES INLINE_INHERITED_MEMB = YES -# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. @@ -215,9 +215,9 @@ MULTILINE_CPP_IS_BRIEF = NO INHERIT_DOCS = YES -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a -# new page for each member. If set to NO, the documentation of a member will be -# part of the file/class/namespace that contains it. +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO @@ -236,9 +236,27 @@ TAB_SIZE = 4 # 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. +# 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. -ALIASES = +#--------------------------------------------------------------------------- +# SFML specific aliases +#--------------------------------------------------------------------------- + +# sfplatform{platform(s)} +# sfplatform{platform(s), header} +# +# Warns the user that some specific class or function is only available on +# specific platforms. +# +# This shouldn't be used for incomplete implementations. It's meant for things +# that will never appear on another platform, e.g. Android's native activity. +# +# If a header is given, the user is informed, that this header must be included +# for the mentioned element to be defined. + +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" @@ -286,7 +304,7 @@ OPTIMIZE_OUTPUT_VHDL = NO # 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: 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. @@ -295,7 +313,7 @@ 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 https://daringfireball.net/projects/markdown/ for details. +# documentation. See http://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. @@ -303,10 +321,19 @@ EXTENSION_MAPPING = MARKDOWN_SUPPORT = YES +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# 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. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by by putting a % sign in front of the word -# or globally by setting AUTOLINK_SUPPORT to NO. +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES @@ -346,13 +373,20 @@ SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first +# tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent @@ -411,7 +445,7 @@ LOOKUP_CACHE_SIZE = 0 # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. @@ -421,35 +455,35 @@ LOOKUP_CACHE_SIZE = 0 EXTRACT_ALL = NO -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# 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. EXTRACT_PACKAGE = NO -# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = YES -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES -# This flag is only useful for Objective-C code. When set to YES local methods, +# This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO only methods in the interface are +# included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. @@ -474,21 +508,21 @@ 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. +# to NO, these classes will be included in the various overviews. 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 +# (class|struct|union) declarations. If set to NO, these declarations will be # included in the documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO these +# documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. @@ -502,7 +536,7 @@ 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 +# 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. @@ -511,12 +545,19 @@ INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES the +# their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + # 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. @@ -544,14 +585,14 @@ INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. +# name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. Note that +# name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. @@ -596,27 +637,25 @@ SORT_BY_SCOPE_NAME = NO STRICT_PROTO_MATCHING = NO -# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the -# todo list. This list is created by putting \todo commands in the -# documentation. +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = YES -# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the -# test list. This list is created by putting \test commands in the -# documentation. +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = YES -# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES -# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. @@ -641,8 +680,8 @@ ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES the list -# will mention the files that were used to generate the documentation. +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES @@ -695,7 +734,7 @@ LAYOUT_FILE = CITE_BIB_FILES = #--------------------------------------------------------------------------- -# configuration options related to warning and progress messages +# Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to @@ -706,7 +745,7 @@ CITE_BIB_FILES = QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. @@ -714,7 +753,7 @@ QUIET = NO WARNINGS = YES -# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. @@ -731,12 +770,18 @@ WARN_IF_DOC_ERROR = 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 or incomplete +# parameter documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = YES +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated @@ -760,7 +805,7 @@ WARN_LOGFILE = # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with -# spaces. +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = "@DOXYGEN_INPUT_DIR@/include/SFML" \ @@ -769,7 +814,7 @@ 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 +# documentation (see: https://www.gnu.org/software/libiconv/) for the list of # possible encodings. # The default value is: UTF-8. @@ -777,12 +822,17 @@ INPUT_ENCODING = UTF-8 # 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. 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, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, -# *.qsf, *.as and *.js. +# *.h) to filter out the source-files in the directories. +# +# 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 +# read by doxygen. +# +# 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. FILE_PATTERNS = *.hpp @@ -801,9 +851,10 @@ RECURSIVE = YES EXCLUDE = -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded # from the input. +# The default value is: NO. EXCLUDE_SYMLINKS = NO @@ -874,6 +925,10 @@ IMAGE_PATH = # Note that the filter must not add or remove lines; it is applied before the # 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 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. INPUT_FILTER = @@ -883,11 +938,15 @@ INPUT_FILTER = # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. +# +# 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. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER ) will also be used to filter the input files that are used for +# INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. @@ -947,7 +1006,7 @@ REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. @@ -994,27 +1053,6 @@ USE_HTAGS = NO VERBATIM_HEADERS = YES -# If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the -# clang parser (see: https://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 -# compiled with the --with-libclang option. -# The default value is: NO. - -# Generates warnings with Clang -#CLANG_ASSISTED_PARSING = NO - -# 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. - -# Generates warnings with Clang -#CLANG_OPTIONS = - #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- @@ -1045,7 +1083,7 @@ IGNORE_PREFIX = # Configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES @@ -1107,18 +1145,14 @@ HTML_FOOTER = "@DOXYGEN_INPUT_DIR@/doc/footer.html" HTML_STYLESHEET = "@DOXYGEN_INPUT_DIR@/doc/doxygen.css" -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefor more robust against future updates. +# standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra stylesheet files is of importance (e.g. the last -# stylesheet in the list overrules the setting of the previous ones in the +# 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. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1135,7 +1169,7 @@ HTML_EXTRA_STYLESHEET = HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the stylesheet and background images according to +# 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 # 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 @@ -1166,12 +1200,24 @@ HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: YES. +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. 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 +# 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, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = NO + # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. @@ -1240,7 +1286,7 @@ 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: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output @@ -1263,28 +1309,28 @@ GENERATE_HTMLHELP = @DOXYGEN_GENERATE_HTMLHELP@ CHM_FILE = ../SFML.chm # The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler ( hhc.exe). If non-empty +# including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. 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). +# 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). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = -# The BINARY_TOC flag controls whether a binary table of contents is generated ( -# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1316,7 +1362,7 @@ 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: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# (see: http://doc.qt.io/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. @@ -1324,7 +1370,7 @@ 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: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# Folders (see: http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1332,21 +1378,21 @@ 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: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# Filters (see: http://doc.qt.io/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: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# Filters (see: http://doc.qt.io/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: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = @@ -1395,7 +1441,7 @@ DISABLE_INDEX = NO # index structure (just like the one that is generated for HTML Help). For this # 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 stylesheets (see HTML_EXTRA_STYLESHEET) one can +# 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 @@ -1423,7 +1469,7 @@ ENUM_VALUES_PER_LINE = 4 TREEVIEW_WIDTH = 250 -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1439,7 +1485,7 @@ EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# 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. # @@ -1452,7 +1498,7 @@ FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# 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 # to it using the MATHJAX_RELPATH option. @@ -1463,7 +1509,7 @@ USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: -# https://docs.mathjax.org/en/latest/output.html) for more details. +# http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. @@ -1479,7 +1525,7 @@ MATHJAX_FORMAT = HTML-CSS # 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://cdn.mathjax.org/mathjax/latest. +# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = https://cdn.mathjax.org/mathjax/latest @@ -1493,7 +1539,7 @@ 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: https://docs.mathjax.org/en/latest/output.html) for more details. For an +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1538,7 +1584,7 @@ SERVER_BASED_SEARCH = NO # external search engine pointed to by the SEARCHENGINE_URL option to obtain the # search results. # -# Doxygen ships with an example indexer ( doxyindexer) and search engine +# 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/). # @@ -1551,7 +1597,7 @@ EXTERNAL_SEARCH = NO # The SEARCHENGINE_URL should point to a search engine hosted by a web server # which will return the search results when EXTERNAL_SEARCH is enabled. # -# Doxygen ships with an example indexer ( doxyindexer) and search engine +# 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. @@ -1589,7 +1635,7 @@ EXTRA_SEARCH_MAPPINGS = # Configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output. +# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. # The default value is: YES. GENERATE_LATEX = NO @@ -1620,7 +1666,7 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex -# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX +# 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. # The default value is: NO. @@ -1638,9 +1684,12 @@ COMPACT_LATEX = NO PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names -# that should be included in the LaTeX output. To get the times font for -# instance you can specify -# EXTRA_PACKAGES=times +# that should be included in the LaTeX output. The package can be specified just +# by its name or with the correct syntax as to be used with the LaTeX +# \usepackage command. To get the times font for instance you can specify : +# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} +# To use the option intlimits with the amsmath package you can specify: +# EXTRA_PACKAGES=[intlimits]{amsmath} # If left blank no extra packages will be included. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1655,9 +1704,9 @@ EXTRA_PACKAGES = # 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 empy string, -# for the replacement values of the other commands the user is refered to -# HTML_HEADER. +# $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. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = @@ -1673,6 +1722,17 @@ LATEX_HEADER = LATEX_FOOTER = +# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# LaTeX style sheets that are included after the standard style sheets created +# by doxygen. Using this option one can overrule certain style aspects. 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). +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_STYLESHEET = + # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the LATEX_OUTPUT output # directory. Note that the files will be copied as-is; there are no commands or @@ -1691,7 +1751,7 @@ 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 +# the PDF file directly from the LaTeX files. Set this option to YES, to get a # higher quality PDF documentation. # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1732,11 +1792,19 @@ LATEX_SOURCE_CODE = NO LATEX_BIB_STYLE = plain +# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_TIMESTAMP = NO + #--------------------------------------------------------------------------- # Configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The +# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The # RTF output is optimized for Word 97 and may not look too pretty with other RTF # readers/editors. # The default value is: NO. @@ -1751,7 +1819,7 @@ GENERATE_RTF = NO RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF +# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -1788,11 +1856,21 @@ RTF_STYLESHEET_FILE = 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 #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for # classes and files. # The default value is: NO. @@ -1836,7 +1914,7 @@ MAN_LINKS = NO # Configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that +# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that # captures the structure of the code including all documentation. # The default value is: NO. @@ -1850,7 +1928,7 @@ GENERATE_XML = NO XML_OUTPUT = xml -# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program +# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program # listings (including syntax highlighting and cross-referencing information) to # the XML output. Note that enabling this will significantly increase the size # of the XML output. @@ -1863,7 +1941,7 @@ XML_PROGRAMLISTING = YES # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- -# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files +# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files # that can be used to generate PDF. # The default value is: NO. @@ -1877,7 +1955,7 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook -# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the +# 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. @@ -1890,10 +1968,10 @@ DOCBOOK_PROGRAMLISTING = NO # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen -# Definitions (see http://autogen.sf.net) file that captures the structure of -# the code including all documentation. Note that this feature is still -# experimental and incomplete at the moment. +# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an +# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures +# the structure of the code including all documentation. Note that this feature +# is still experimental and incomplete at the moment. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO @@ -1902,7 +1980,7 @@ GENERATE_AUTOGEN_DEF = NO # Configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module +# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module # file that captures the structure of the code including all documentation. # # Note that this feature is still experimental and incomplete at the moment. @@ -1910,7 +1988,7 @@ GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary +# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI # output from the Perl module output. # The default value is: NO. @@ -1918,9 +1996,9 @@ GENERATE_PERLMOD = NO PERLMOD_LATEX = NO -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely +# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely # formatted so it can be parsed by a human reader. This is useful if you want to -# understand what is going on. On the other hand, if this tag is set to NO the +# understand what is going on. On the other hand, if this tag is set to NO, the # size of the Perl module output will be much smaller and Perl will parse it # just the same. # The default value is: YES. @@ -1940,14 +2018,14 @@ PERLMOD_MAKEVAR_PREFIX = # Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all +# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all # C-preprocessor directives found in the sources and include files. # The default value is: YES. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names -# in the source code. If set to NO only conditional compilation will be +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# in the source code. If set to NO, only conditional compilation will be # performed. Macro expansion can be done in a controlled way by setting # EXPAND_ONLY_PREDEF to YES. # The default value is: NO. @@ -1963,7 +2041,7 @@ MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES -# If the SEARCH_INCLUDES tag is set to YES the includes files in the +# If the SEARCH_INCLUDES tag is set to YES, the include files in the # INCLUDE_PATH will be searched if a #include is found. # The default value is: YES. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. @@ -2045,20 +2123,21 @@ TAGFILES = 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 listed. +# 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 +# listed. # The default value is: NO. ALLEXTERNALS = NO -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in -# the modules index. If set to NO, only the current project's groups will be +# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. EXTERNAL_GROUPS = YES -# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in +# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in # the related pages index. If set to NO, only the current project's pages will # be listed. # The default value is: YES. @@ -2075,7 +2154,7 @@ 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 +# 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 @@ -2100,7 +2179,7 @@ MSCGEN_PATH = DIA_PATH = -# If set to YES, the inheritance and collaboration graphs will hide inheritance +# If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. @@ -2108,7 +2187,7 @@ HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: -# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO # The default value is: NO. @@ -2173,7 +2252,7 @@ COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. # The default value is: NO. @@ -2225,7 +2304,8 @@ INCLUDED_BY_GRAPH = YES # # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. +# functions only using the \callgraph command. Disabling a call graph can be +# accomplished by means of the command \hidecallgraph. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2236,7 +2316,8 @@ CALL_GRAPH = NO # # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. +# functions only using the \callergraph command. Disabling a caller graph can be +# accomplished by means of the command \hidecallergraph. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2259,11 +2340,15 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. +# generated by dot. For an explanation of the image formats see the section +# output formats in the documentation of the dot tool (Graphviz (see: +# http://www.graphviz.org/)). # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). -# Possible values are: png, jpg, gif and svg. +# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. # The default value is: png. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2311,10 +2396,19 @@ DIAFILE_DIRS = # 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. -# This tag requires that the tag HAVE_DOT is set to YES. PLANTUML_JAR_PATH = +# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for plantuml. + +PLANTUML_CFG_FILE = + +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes # larger than this value, doxygen will truncate the graph, which is visualized @@ -2351,7 +2445,7 @@ MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# 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 # this, this feature is disabled by default. @@ -2368,27 +2462,9 @@ DOT_MULTI_TARGETS = NO 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 dot # files that are used to generate the various graphs. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# SFML specific aliases -#--------------------------------------------------------------------------- - -# sfplatform{platform(s)} -# sfplatform{platform(s), header} -# -# Warns the user that some specific class or function is only available on -# specific platforms. -# -# This shouldn't be used for incomplete implementations. It's meant for things -# that will never appear on another platform, e.g. Android's native activity. -# -# If a header is given, the user is informed, that this header must be included -# for the mentioned element to be defined. -ALIASES += sfplatform{1}="<dl class=\"attention\"><dt>Platform Limitation</dt><dd><b>This is only available on \1.</b></dd></dl>" -ALIASES += 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>" diff --git a/doc/doxygen.css b/doc/doxygen.css index ed4e6e40..f29d3715 100644 --- a/doc/doxygen.css +++ b/doc/doxygen.css @@ -415,6 +415,10 @@ table.memberdecls { margin-left: 9px; } +.memtitle { + display: none; +} + .memnav { background-color: #EBEFF6; border: 1px solid #A3B4D7; @@ -1440,4 +1444,4 @@ div.contents ul li { border-width: 11px; top: 50%; margin-top: -11px; -} \ No newline at end of file +} From ceee41eaf4592d5beec885eb67fd98a0517ec774 Mon Sep 17 00:00:00 2001 From: Leonid Olevskiy <Stuv7CB@users.noreply.github.com> Date: Sat, 7 Apr 2018 00:34:02 +0300 Subject: [PATCH 078/211] Update doxygen.css Set pointer cursor on arrows --- doc/doxygen.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/doxygen.css b/doc/doxygen.css index f29d3715..9c2fc6a2 100644 --- a/doc/doxygen.css +++ b/doc/doxygen.css @@ -1445,3 +1445,6 @@ div.contents ul li { top: 50%; margin-top: -11px; } +.arrow { + cursor: pointer; +} From 35725cd2dfbb14ebe198c21c233c589d74d4b019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Sat, 28 Apr 2018 23:51:45 +0200 Subject: [PATCH 079/211] Only use 3 columns in the index --- doc/doxyfile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doxyfile.in b/doc/doxyfile.in index 98bd2b85..104ff75b 100644 --- a/doc/doxyfile.in +++ b/doc/doxyfile.in @@ -1069,7 +1069,7 @@ ALPHABETICAL_INDEX = YES # 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 = 5 +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 From f2ccc64536ba8a012ac21d5c88ab5fd24cfe5b41 Mon Sep 17 00:00:00 2001 From: Marco Antognini <antognini.marco@gmail.com> Date: Sun, 29 Apr 2018 17:54:40 +0200 Subject: [PATCH 080/211] Fixed doxygen rendering of markdown table --- include/SFML/Window/Cursor.hpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/include/SFML/Window/Cursor.hpp b/include/SFML/Window/Cursor.hpp index 04eabca6..30aebd40 100644 --- a/include/SFML/Window/Cursor.hpp +++ b/include/SFML/Window/Cursor.hpp @@ -53,21 +53,21 @@ public: /// Refer to the following table to determine which cursor /// is available on which platform. /// - /// Type | Linux | Mac OS X | Windows - /// ------------------------------------|:-----:|:--------:|:--------: - /// sf::Cursor::Arrow | yes | yes | yes - /// sf::Cursor::ArrowWait | no | no | yes - /// sf::Cursor::Wait | yes | no | yes - /// sf::Cursor::Text | yes | yes | yes - /// sf::Cursor::Hand | yes | yes | yes - /// sf::Cursor::SizeHorizontal | yes | yes | yes - /// sf::Cursor::SizeVertical | yes | yes | yes - /// sf::Cursor::SizeTopLeftBottomRight | no | no | yes - /// sf::Cursor::SizeBottomLeftTopRight | no | no | yes - /// sf::Cursor::SizeAll | yes | no | yes - /// sf::Cursor::Cross | yes | yes | yes - /// sf::Cursor::Help | yes | no | yes - /// sf::Cursor::NotAllowed | yes | yes | yes + /// Type | Linux | Mac OS X | Windows | + /// ------------------------------------|:-----:|:--------:|:--------:| + /// sf::Cursor::Arrow | yes | yes | yes | + /// sf::Cursor::ArrowWait | no | no | yes | + /// sf::Cursor::Wait | yes | no | yes | + /// sf::Cursor::Text | yes | yes | yes | + /// sf::Cursor::Hand | yes | yes | yes | + /// sf::Cursor::SizeHorizontal | yes | yes | yes | + /// sf::Cursor::SizeVertical | yes | yes | yes | + /// sf::Cursor::SizeTopLeftBottomRight | no | no | yes | + /// sf::Cursor::SizeBottomLeftTopRight | no | no | yes | + /// sf::Cursor::SizeAll | yes | no | yes | + /// sf::Cursor::Cross | yes | yes | yes | + /// sf::Cursor::Help | yes | no | yes | + /// sf::Cursor::NotAllowed | yes | yes | yes | /// //////////////////////////////////////////////////////////// enum Type From b21039452e8d33db9470c6742ff5f7cdc4e7b097 Mon Sep 17 00:00:00 2001 From: Marco Antognini <antognini.marco@gmail.com> Date: Sun, 29 Apr 2018 18:40:39 +0200 Subject: [PATCH 081/211] Fixed a reference in the documentation of Shader --- include/SFML/Graphics/Shader.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/SFML/Graphics/Shader.hpp b/include/SFML/Graphics/Shader.hpp index fef1bec0..664dd865 100644 --- a/include/SFML/Graphics/Shader.hpp +++ b/include/SFML/Graphics/Shader.hpp @@ -822,7 +822,7 @@ private: /// object being drawn (which cannot be known in advance). /// /// To apply a shader to a drawable, you must pass it as an -/// additional parameter to the \ref Window::draw() draw() function: +/// additional parameter to the \ref RenderWindow::draw function: /// \code /// window.draw(sprite, &shader); /// \endcode From de2d49e3af34a96fafc0a367a9dcbb5d5dfded5b Mon Sep 17 00:00:00 2001 From: Marco Antognini <antognini.marco@gmail.com> Date: Sun, 29 Apr 2018 18:41:08 +0200 Subject: [PATCH 082/211] Added doxygen documentation for Packet >> & << operators --- include/SFML/Network/Packet.hpp | 124 +++++++++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 2 deletions(-) diff --git a/include/SFML/Network/Packet.hpp b/include/SFML/Network/Packet.hpp index 6d530246..9f0edab4 100644 --- a/include/SFML/Network/Packet.hpp +++ b/include/SFML/Network/Packet.hpp @@ -171,45 +171,165 @@ public: operator BoolType() const; //////////////////////////////////////////////////////////// - /// Overloads of operator >> to read data from the packet + /// Overload of operator >> to read data from the packet /// //////////////////////////////////////////////////////////// Packet& operator >>(bool& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(Int8& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(Uint8& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(Int16& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(Uint16& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(Int32& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(Uint32& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(Int64& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(Uint64& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(float& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(double& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(char* data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(std::string& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(wchar_t* data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(std::wstring& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator >>(String& data); //////////////////////////////////////////////////////////// - /// Overloads of operator << to write data into the packet + /// Overload of operator << to write data into the packet /// //////////////////////////////////////////////////////////// Packet& operator <<(bool data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(Int8 data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(Uint8 data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(Int16 data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(Uint16 data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(Int32 data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(Uint32 data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(Int64 data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(Uint64 data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(float data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(double data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(const char* data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(const std::string& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(const wchar_t* data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(const std::wstring& data); + + //////////////////////////////////////////////////////////// + /// \overload + //////////////////////////////////////////////////////////// Packet& operator <<(const String& data); protected: From 8a0d9b414f52662920adc436d5d4d42192024ac7 Mon Sep 17 00:00:00 2001 From: Maximilian Wagenbach <maximilian.wagenbach@native-instruments.de> Date: Fri, 16 Mar 2018 14:21:01 +0100 Subject: [PATCH 083/211] Updated the changelog for 2.5 --- changelog.md | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/changelog.md b/changelog.md index 23191694..7419d925 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,111 @@ # Changelog +## SFML 2.5 + +Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.5 + +### General + + * Markdown'd and updated readme, changelog, contributing and license files (#1196, #1368, #1317) + * Improve packaging support (#1173) + * Added Tagfile generation and search (#1327) + * Set policy CMP0042 if cmake version > 3.0 (#1206) + * Added CMake variables to select the modules to be built (#800) + * Updated the binary libs from exlibs/libs-ios in order to work with Xcode 8 and iOS 10 (#1209) + * Do not install extlibs if `SFML_USE_SYSTEM_DEPS` is true (#1237) + * Updated stb_image to v2.16 and stb_image_write to v1.07 (#1270) + * Fixed various type conversion/comparison warnings (#1325) + * [macOS] Fixed launch of cocoa examples (#1334) + * [macOS] Improved application signing process (#1194) + * [macOS] Improve cmake script (#1215) + * [macOS] Use `-stdlib=libc++` (#1361) + * [macOS] Fix CMake warning since CMake 3.9 (#1371) + * [iOS] Use a CMake toolchain file for iOS build (#1269) + * [iOS] Install extlibs if needed (#1348) + * [iOS] Drop 32 bit support (#1374) + * [iOS] Force correct iOS architecture for cmake (#1377) + * [iOS] Find OpenAL correctly (#1376) + * [Android] Increased minimum API version to 14 (#1362) + * [Android] Removed custom toolchain and added support for the newest NDK version (#1350) + +### System + +**Bugfixes** + + * Fixed crash when `sf::Clock` is constructed in a global scope (#1258) + +### Window + +**Features** + + * Implemented Cursor API (#827) + * Implemented Clipboard API (#1221) + * [Windows] Added support for interfacing with joysticks via DirectInput when it is available (#1326) + +**Bugfixes** + + * Updated documentation (#1255, #1310) + * [macOS] Fixed window menu not working (#1193) + * [macOS] Removed unused variable (#1276) + * [macOS] Fixed crash with application messing hardware detection e.g. TeamViewer (#1323) + * [macOS] Added support for (some) Hat/POV axis (#1248) + * [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 (#1291, #1223, #1230) + * [Linux] Restore fullscreen of a non-visible window (#1339) + * [iOS] Fix build error when using @import (#1272) + * [iOS] Don't need to find vorbisfile or vorbisenc (#1347) + * [Windows] Prevent uninitialized read by zeroing memory (#1264) + * [Windows] Fixed modifier keys handling (#1357) + * [Android] Return correct key code for delete/backspace (#1362) + +### 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, #1320) + * Optimize performance by skipping `glTexCoordPointer()` call if not needed (#1015) + * Generate shape outline vertices only if necessary (#1356) + * Removed dependency to libjpeg, stb_image_write now supports writing JPEG files (#1279) + * Enable comparing `sf::Transform` and optimize resetting OpenGL back to the identity matrix (#1298) + +**Bugfixes** + + * Fixed typo in assert in `sf::Texture::update()` (#1210) + * 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` (#1360) + * Refactoring of `sf::Text` (#928) + * Updated documentation (#1197) + * [Windows] Replaced time-based joystick poll with a hardware event handler (#1195, #1179) + * [macOS] Worked around render target bug (#1342) + +### Audio + +**Features** + + * Added loop point support to `sf::Music` (#629) + * Added support for extensible format PCM wave files (#1296) + * [iOS] Enable audio module (#1338) + +**Bugfixes** + + * Allow polymorphism with `sf::SoundSource` (#1185) + * Fixed WAV file writer writing wrong header values (#1281) + * Small bugfix to argument of `alcCaptureOpenDevice()` (#1305) + * Removed dead code (#1261) + * Updated documentation (#1321, #1353) + * [Windows] Updated OpenAL Soft to 1.18.1 (#1260) + +### Network + +**Bugfixes** + + * Fixed wrong condition for building network support (#1253) + ## SFML 2.4.2 Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.2 From 859db83af7062785a07dd5ba258a5e4afeac40b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Sat, 28 Apr 2018 13:49:33 +0200 Subject: [PATCH 084/211] Adjusted the changelog for SFML 2.5 --- changelog.md | 184 +++++++++++++++++++++++++++------------------------ 1 file changed, 98 insertions(+), 86 deletions(-) diff --git a/changelog.md b/changelog.md index 7419d925..c51ee3ab 100644 --- a/changelog.md +++ b/changelog.md @@ -1,62 +1,62 @@ # Changelog -## SFML 2.5 +## SFML 2.5.0 -Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.5 +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) - * Set policy CMP0042 if cmake version > 3.0 (#1206) - * Added CMake variables to select the modules to be built (#800) - * Updated the binary libs from exlibs/libs-ios in order to work with Xcode 8 and iOS 10 (#1209) - * Do not install extlibs if `SFML_USE_SYSTEM_DEPS` is true (#1237) - * Updated stb_image to v2.16 and stb_image_write to v1.07 (#1270) + * 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) - * [macOS] Fixed launch of cocoa examples (#1334) - * [macOS] Improved application signing process (#1194) - * [macOS] Improve cmake script (#1215) - * [macOS] Use `-stdlib=libc++` (#1361) - * [macOS] Fix CMake warning since CMake 3.9 (#1371) - * [iOS] Use a CMake toolchain file for iOS build (#1269) + * [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 (#1377) - * [iOS] Find OpenAL correctly (#1376) - * [Android] Increased minimum API version to 14 (#1362) - * [Android] Removed custom toolchain and added support for the newest NDK version (#1350) + * [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) ### Window **Features** - * Implemented Cursor API (#827) - * Implemented Clipboard API (#1221) - * [Windows] Added support for interfacing with joysticks via DirectInput when it is available (#1326) + * 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** - * Updated documentation (#1255, #1310) - * [macOS] Fixed window menu not working (#1193) - * [macOS] Removed unused variable (#1276) + * [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) - * [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 (#1291, #1223, #1230) - * [Linux] Restore fullscreen of a non-visible window (#1339) - * [iOS] Fix build error when using @import (#1272) - * [iOS] Don't need to find vorbisfile or vorbisenc (#1347) * [Windows] Prevent uninitialized read by zeroing memory (#1264) * [Windows] Fixed modifier keys handling (#1357) - * [Android] Return correct key code for delete/backspace (#1362) ### Graphics @@ -64,47 +64,59 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.5 * 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, #1320) + * 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 (#1356) - * Removed dependency to libjpeg, stb_image_write now supports writing JPEG files (#1279) + * 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** - * Fixed typo in assert in `sf::Texture::update()` (#1210) * 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` (#1360) - * Refactoring of `sf::Text` (#928) - * Updated documentation (#1197) - * [Windows] Replaced time-based joystick poll with a hardware event handler (#1195, #1179) - * [macOS] Worked around render target bug (#1342) + * 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` (#629) - * Added support for extensible format PCM wave files (#1296) + * 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 (#1281) - * Small bugfix to argument of `alcCaptureOpenDevice()` (#1305) - * Removed dead code (#1261) - * Updated documentation (#1321, #1353) - * [Windows] Updated OpenAL Soft to 1.18.1 (#1260) + * 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) + **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) ## SFML 2.4.2 @@ -122,7 +134,7 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.2 * 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) + * [Linux] Fix wrong types passed to XChangeProperty (#1168, #1171) * [Windows] Make context disabling via wglMakeCurrent more tolerant of broken drivers (#1186) ### Graphics @@ -153,7 +165,7 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.1 * [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) - * [OS X] Fixed inconsistency between doc and impl on OS X for the grab feature (#1133, #1148, #1150) + * [macOS] Fixed inconsistency between doc and impl on macOS for the grab feature (#1133, #1148, #1150) * [Windows] Fixed context memory leaks (#1143, #1002) ### Graphics @@ -183,7 +195,7 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.0 * 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) - * [OS X] Update Xcode template material (#976, #968) + * [macOS] Update Xcode template material (#976, #968) * [Windows] Added support for VS 2015 (#972) * [Windows] Create and install PDB debug symbols alongside binaries (#1037) @@ -225,10 +237,10 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.0 * [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) - * [OS X] Improved memory management on OS X (#962, #790) - * [OS X] Fixed crash when resizing a window to a zero-height/width size (#986, #984) - * [OS X] Use the mouse button constant instead of 0 to avoid a compiler error on OSX (#1035) - * [OS X] OS X improvement: warnings + bugfix + refactoring, the lot! (#1042) + * [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 @@ -256,7 +268,7 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.4.0 **Bugfixes** * Added an assignment operator to SoundSource (#864) - * [OS X] Updates OpenAL-soft for OS X to version 1.17.2 (#1057, #900, #1000) + * [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) @@ -347,7 +359,7 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.3 * Added missing includes in the general headers (#851) * [Android] Updated toolchain file and dependencies (#791) * [Linux] Fixed missing pthread dependency (#794) - * [OS X] Relaxed CMake installation rules regarding framework dependencies (#767) + * [macOS] Relaxed CMake installation rules regarding framework dependencies (#767) ### Deprecated API @@ -370,8 +382,8 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.3 * [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) - * [OS X] Fixed typo in JoystickImpl.cpp to prevent a crash (#762, #765) - * [OS X] Fixed an issue in InputImpl::getSFOpenGLViewFromSFMLWindow (#782, #792) + * [macOS] Fixed typo in JoystickImpl.cpp to prevent a crash (#762, #765) + * [macOS] Fixed an issue in InputImpl::getSFOpenGLViewFromSFMLWindow (#782, #792) ### Graphics @@ -399,7 +411,7 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.3 **Bugfixes** * Fixed access violation error in the destructor of sf::AudioDevice (#30, #602) - * [OS X] Fixed threading issue with sf::SoundStream and OpenAL (#541, #831) + * [macOS] Fixed threading issue with sf::SoundStream and OpenAL (#541, #831) ### Network @@ -425,15 +437,15 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.2 * 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) - * [OS X] Fixed incorrect symlink in freetype.framework (#519) - * [OS X] CMake module for correct dependencies (#548) - * [OS X] Fixed SFML target for Xcode (#595, #596) - * [OS X] Updated implementation, mainly reverting to non-ARC (#601) - * [OS X] Fixed memory leaks and dead store (#615) - * [OS X] Improved event handling and performance (#617) - * [OS X] Reduced memory usage (#672, #698) - * [OS X] OS X 10.10 support (#691, #699) - * [OS X] Improve flexibility of dependencies' locations (#713) + * [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 @@ -458,10 +470,10 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.2 * 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) - * [OS X] Improved integration with menus and dock actions (#11) - * [OS X] Support for OpenGL 3.2 (#84) - * [OS X] Improved fullscreen support (#343) - * [OS X] Added support for retina displays (#353, #388) + * [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) @@ -474,14 +486,14 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.2 * [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) - * [OS X] Fixed KeyReleased not being fired in fullscreen mode (#465) - * [OS X] Fixed an issue where disconnecting the keyboard would cause a crash (#467) - * [OS X] Fixed unexpected resizing behavior (#468) - * [OS X] Improved resizing windows (#474) - * [OS X] Fixed memory leak with sf::Window::create() (#484) - * [OS X] Fixed menu shortcuts in fullscreen on OS X (#527) - * [OS X] Improved cursor hiding (#703) - * [OS X] Fixed right click not detected with trackpads (#716, #730) + * [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) @@ -568,12 +580,12 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.1 **Features** * Now using inotify on Linux to avoid constantly polling joystick connections (#96) - * Add keypad return, equal and period keys support for OS X - * Improved mouse events on OS X regarding fullscreen mode - * Improved mouse events on OS X (#213, #277) - * Improved reactivity of setMousePosition on OS X (#290) - * Added support for right control key on OS X - * Improved TextEntered for OS X (#377) + * 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 @@ -586,7 +598,7 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.1 * 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 OS X when dragging the cursor (#277) + * 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) @@ -615,7 +627,7 @@ Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.1 **Bugfixes** - * Added a workaround for a bug in the OS X implementation of OpenAL (unsupported channel count no properly detected) (#201) + * 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 From 192eb968a4e938f36948e97f97ddc354a8a470fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <lukas.duerrenberger@zuehlke.com> Date: Sun, 6 May 2018 08:53:30 +0200 Subject: [PATCH 085/211] Updated version number to SFML 2.5.0 --- CMakeLists.txt | 4 ++-- include/SFML/Config.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e97f064c..bb30b46c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,8 +52,8 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake) # setup version numbers set(VERSION_MAJOR 2) -set(VERSION_MINOR 4) -set(VERSION_PATCH 2) +set(VERSION_MINOR 5) +set(VERSION_PATCH 0) # add an option for choosing the build type (shared or static) if(NOT (SFML_OS_IOS OR SFML_OS_ANDROID)) diff --git a/include/SFML/Config.hpp b/include/SFML/Config.hpp index 70a6929b..aae5f548 100644 --- a/include/SFML/Config.hpp +++ b/include/SFML/Config.hpp @@ -30,8 +30,8 @@ // Define the SFML version //////////////////////////////////////////////////////////// #define SFML_VERSION_MAJOR 2 -#define SFML_VERSION_MINOR 4 -#define SFML_VERSION_PATCH 2 +#define SFML_VERSION_MINOR 5 +#define SFML_VERSION_PATCH 0 //////////////////////////////////////////////////////////// From c828314d12ddca2744bdac11f4018aeefcf39a90 Mon Sep 17 00:00:00 2001 From: "Marty E. Plummer" <hanetzer@startmail.com> Date: Wed, 11 Apr 2018 04:26:44 -0500 Subject: [PATCH 086/211] cmake/Macros.cmake: ex:->examples: vim interprets the # ex: comments as a modeline, which causes editing this file with vim to throw an error. Signed-off-by: Marty E. Plummer <hanetzer@startmail.com> --- cmake/Macros.cmake | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index be523459..91a1631b 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -1,7 +1,7 @@ include(CMakeParseArguments) # set the appropriate standard library on each platform for the given target -# ex: sfml_set_stdlib(sfml-system) +# example: sfml_set_stdlib(sfml-system) function(sfml_set_stdlib target) # for gcc >= 4.0 on Windows, apply the SFML_USE_STATIC_STD_LIBS option if it is enabled if(SFML_OS_WINDOWS AND SFML_COMPILER_GCC AND NOT SFML_GCC_VERSION VERSION_LESS "4") @@ -23,9 +23,9 @@ function(sfml_set_stdlib target) endfunction() # add a new target which is a SFML library -# ex: sfml_add_library(sfml-graphics -# SOURCES sprite.cpp image.cpp ... -# [STATIC]) # Always create a static library and ignore BUILD_SHARED_LIBS +# example: sfml_add_library(sfml-graphics +# SOURCES sprite.cpp image.cpp ... +# [STATIC]) # Always create a static library and ignore BUILD_SHARED_LIBS macro(sfml_add_library target) # parse the arguments @@ -178,11 +178,11 @@ macro(sfml_add_library target) endmacro() # add a new target which is a SFML example -# ex: sfml_add_example(ftp -# SOURCES ftp.cpp ... -# BUNDLE_RESOURCES MainMenu.nib ... # Files to be added in target but not installed next to the executable -# DEPENDS sfml-network -# RESOURCES_DIR resources) # A directory to install next to the executable and sources +# example: sfml_add_example(ftp +# SOURCES ftp.cpp ... +# BUNDLE_RESOURCES MainMenu.nib ... # Files to be added in target but not installed next to the executable +# DEPENDS sfml-network +# RESOURCES_DIR resources) # A directory to install next to the executable and sources macro(sfml_add_example target) # parse the arguments From 88bb3f89a5782cd95a781277c4f665239fc914cc Mon Sep 17 00:00:00 2001 From: James Cowgill <jcowgill@jcowgill.uk> Date: Tue, 15 May 2018 15:48:46 +0100 Subject: [PATCH 087/211] Install CMake config files into lib${LIB_SIFFIX} --- cmake/Macros.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 91a1631b..63490245 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -320,7 +320,7 @@ function(sfml_export_targets) if (SFML_BUILD_FRAMEWORKS) set(config_package_location "SFML.framework/Resources/CMake") else() - set(config_package_location lib/cmake/SFML) + set(config_package_location lib${LIB_SUFFIX}/cmake/SFML) endif() configure_package_config_file("${CURRENT_DIR}/SFMLConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/SFMLConfig.cmake" INSTALL_DESTINATION "${config_package_location}") From bb3bd05823e60785c2620482cc5ecaa2dc66798e Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Wed, 16 May 2018 01:26:17 +0200 Subject: [PATCH 088/211] Postpone generation of the RenderTarget ID to RenderTarget::initialize() so that a new ID is generated whenever the RenderTarget is re-create()ed. --- src/SFML/Graphics/RenderTarget.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index 7eccf829..59e9e202 100644 --- a/src/SFML/Graphics/RenderTarget.cpp +++ b/src/SFML/Graphics/RenderTarget.cpp @@ -129,7 +129,7 @@ RenderTarget::RenderTarget() : m_defaultView(), m_view (), m_cache (), -m_id (getUniqueId()) +m_id (0) { m_cache.glStatesSet = false; } @@ -547,6 +547,10 @@ void RenderTarget::initialize() // Set GL states only on first draw, so that we don't pollute user's states m_cache.glStatesSet = false; + + // Generate a unique ID for this RenderTarget to track + // whether it is active within a specific context + m_id = getUniqueId(); } From b01226625882d5e2696c9bc6dbe595bef3b67223 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Fri, 18 May 2018 01:29:53 +0200 Subject: [PATCH 089/211] Fixed RenderTextureImplFBO's destructor incorrectly triggering deletion of other RenderTextureImplFBOs' active FBOs even when the context they reside in isn't being destroyed. --- src/SFML/Graphics/RenderTextureImplFBO.cpp | 28 +++++++++++++++------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/SFML/Graphics/RenderTextureImplFBO.cpp b/src/SFML/Graphics/RenderTextureImplFBO.cpp index 301aa043..4a4f1f62 100644 --- a/src/SFML/Graphics/RenderTextureImplFBO.cpp +++ b/src/SFML/Graphics/RenderTextureImplFBO.cpp @@ -53,6 +53,23 @@ namespace // Mutex to protect both active and stale frame buffer sets sf::Mutex mutex; + // This function is called either when a RenderTextureImplFBO is + // destroyed or via contextDestroyCallback when context destruction + // might trigger deletion of its contained stale FBOs + void destroyStaleFBOs() + { + sf::Uint64 contextId = sf::Context::getActiveContextId(); + + for (std::set<std::pair<sf::Uint64, unsigned int> >::iterator iter = staleFrameBuffers.begin(); iter != staleFrameBuffers.end(); ++iter) + { + if (iter->first == contextId) + { + GLuint frameBuffer = static_cast<GLuint>(iter->second); + glCheck(GLEXT_glDeleteFramebuffers(1, &frameBuffer)); + } + } + } + // Callback that is called every time a context is destroyed void contextDestroyCallback(void* arg) { @@ -79,14 +96,7 @@ namespace } // Destroy stale frame buffer objects - for (std::set<std::pair<sf::Uint64, unsigned int> >::iterator iter = staleFrameBuffers.begin(); iter != staleFrameBuffers.end(); ++iter) - { - if (iter->first == contextId) - { - GLuint frameBuffer = static_cast<GLuint>(iter->second); - glCheck(GLEXT_glDeleteFramebuffers(1, &frameBuffer)); - } - } + destroyStaleFBOs(); } } @@ -150,7 +160,7 @@ RenderTextureImplFBO::~RenderTextureImplFBO() staleFrameBuffers.insert(std::make_pair(iter->first, iter->second)); // Clean up FBOs - contextDestroyCallback(0); + destroyStaleFBOs(); // Delete the backup context if we had to create one delete m_context; From 1dcad6087812a08d41c349511f48fbbf379763f6 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sun, 20 May 2018 23:42:20 +0200 Subject: [PATCH 090/211] Fixed RenderWindow::setActive incorrectly trying to unbind an FBO during deactivation. --- src/SFML/Graphics/RenderWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Graphics/RenderWindow.cpp b/src/SFML/Graphics/RenderWindow.cpp index 906363b3..446e9060 100644 --- a/src/SFML/Graphics/RenderWindow.cpp +++ b/src/SFML/Graphics/RenderWindow.cpp @@ -81,7 +81,7 @@ bool RenderWindow::setActive(bool active) // If FBOs are available, make sure none are bound when we // try to draw to the default framebuffer of the RenderWindow - if (result && priv::RenderTextureImplFBO::isAvailable()) + if (active && result && priv::RenderTextureImplFBO::isAvailable()) { priv::RenderTextureImplFBO::unbind(); From d2ececed05a3c46238a2340d41b42abaa5e604d9 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sun, 3 Jun 2018 19:40:30 +0200 Subject: [PATCH 091/211] Fixed RenderTexture::display() dereferencing a NULL pointer when being called before RenderTexture::create(). --- src/SFML/Graphics/RenderTexture.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Graphics/RenderTexture.cpp b/src/SFML/Graphics/RenderTexture.cpp index 0805627b..51abee92 100644 --- a/src/SFML/Graphics/RenderTexture.cpp +++ b/src/SFML/Graphics/RenderTexture.cpp @@ -161,7 +161,7 @@ bool RenderTexture::setActive(bool active) void RenderTexture::display() { // Update the target texture - if (priv::RenderTextureImplFBO::isAvailable() || setActive(true)) + if (m_impl && (priv::RenderTextureImplFBO::isAvailable() || setActive(true))) { m_impl->updateTexture(m_texture.m_texture); m_texture.m_pixelsFlipped = true; From 93ad872f9ebe1fd59b694467960610851263f7d9 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sun, 3 Jun 2018 18:55:23 +0200 Subject: [PATCH 092/211] Fixed stale FBOs not being erased from the staleFramebuffers set after they have been deleted. --- src/SFML/Graphics/RenderTextureImplFBO.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/SFML/Graphics/RenderTextureImplFBO.cpp b/src/SFML/Graphics/RenderTextureImplFBO.cpp index 4a4f1f62..c0debd79 100644 --- a/src/SFML/Graphics/RenderTextureImplFBO.cpp +++ b/src/SFML/Graphics/RenderTextureImplFBO.cpp @@ -60,12 +60,18 @@ namespace { sf::Uint64 contextId = sf::Context::getActiveContextId(); - for (std::set<std::pair<sf::Uint64, unsigned int> >::iterator iter = staleFrameBuffers.begin(); iter != staleFrameBuffers.end(); ++iter) + for (std::set<std::pair<sf::Uint64, unsigned int> >::iterator iter = staleFrameBuffers.begin(); iter != staleFrameBuffers.end();) { if (iter->first == contextId) { GLuint frameBuffer = static_cast<GLuint>(iter->second); glCheck(GLEXT_glDeleteFramebuffers(1, &frameBuffer)); + + staleFrameBuffers.erase(iter++); + } + else + { + ++iter; } } } From ff011dc51dc47373b0d49b087f8ac9d3d2bc8b06 Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Sun, 8 Apr 2018 23:21:54 +0200 Subject: [PATCH 093/211] Modernize iOS toolchain: remove BUILD_ARM64, drop support for Xcode <4.3 and don't pretend defining official CMake variables --- cmake/Macros.cmake | 7 +- cmake/toolchains/iOS.toolchain.cmake | 97 ++++++++++------------------ examples/iOS/CMakeLists.txt | 2 +- 3 files changed, 41 insertions(+), 65 deletions(-) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 63490245..ecb37c8b 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -1,5 +1,10 @@ include(CMakeParseArguments) +# 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}) +endmacro () + # set the appropriate standard library on each platform for the given target # example: sfml_set_stdlib(sfml-system) function(sfml_set_stdlib target) @@ -14,7 +19,7 @@ function(sfml_set_stdlib target) if (SFML_OS_MACOSX) if (${CMAKE_GENERATOR} MATCHES "Xcode") - set_property(TARGET ${target} PROPERTY XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") + sfml_set_xcode_property(${target} CLANG_CXX_LIBRARY "libc++") else() target_compile_options(${target} PRIVATE "-stdlib=libc++") target_link_libraries(${target} PRIVATE "-stdlib=libc++") diff --git a/cmake/toolchains/iOS.toolchain.cmake b/cmake/toolchains/iOS.toolchain.cmake index abbff038..c697857f 100644 --- a/cmake/toolchains/iOS.toolchain.cmake +++ b/cmake/toolchains/iOS.toolchain.cmake @@ -22,13 +22,13 @@ # OS - the default, used to build for iPhone and iPad physical devices, which have an arm arch. # SIMULATOR - used to build for the Simulator platforms, which have an x86_64 arch. # -# CMAKE_IOS_DEVELOPER_ROOT = automatic(default) or /path/to/platform/Developer folder +# IOS_DEVELOPER_ROOT = automatic(default) or /path/to/platform/Developer folder # By default this location is automatcially chosen based on the IOS_PLATFORM value above. # If set manually, it will override the default location and force the user of a particular Developer Platform # -# CMAKE_IOS_SDK_ROOT = automatic(default) or /path/to/platform/Developer/SDKs/SDK folder -# By default this location is automatcially chosen based on the CMAKE_IOS_DEVELOPER_ROOT value. -# In this case it will always be the most up-to-date SDK found in the CMAKE_IOS_DEVELOPER_ROOT path. +# IOS_SDK_ROOT = automatic(default) or /path/to/platform/Developer/SDKs/SDK folder +# By default this location is automatcially chosen based on the IOS_DEVELOPER_ROOT value. +# In this case it will always be the most up-to-date SDK found in the IOS_DEVELOPER_ROOT path. # If set manually, this will force the use of a specific SDK version # Macros: @@ -58,8 +58,8 @@ if (CMAKE_UNAME) string (REGEX REPLACE "^([0-9]+)\\.([0-9]+).*$" "\\1" DARWIN_MAJOR_VERSION "${CMAKE_HOST_SYSTEM_VERSION}") endif (CMAKE_UNAME) -set(CMAKE_C_COMPILER /usr/bin/gcc CACHE FILEPATH "" FORCE) -set(CMAKE_CXX_COMPILER /usr/bin/g++ CACHE FILEPATH "" FORCE) +set(CMAKE_C_COMPILER /usr/bin/clang CACHE FILEPATH "" FORCE) +set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE FILEPATH "" FORCE) set(CMAKE_AR ar CACHE FILEPATH "" FORCE) # Skip the platform compiler checks for cross compiling @@ -105,64 +105,43 @@ endif (NOT DEFINED CMAKE_INSTALL_NAME_TOOL) if (NOT DEFINED IOS_PLATFORM) set (IOS_PLATFORM "OS") endif (NOT DEFINED IOS_PLATFORM) -set (IOS_PLATFORM ${IOS_PLATFORM} CACHE STRING "Type of iOS Platform") - -# Setup building for arm64 or not -if (NOT DEFINED BUILD_ARM64) - set (BUILD_ARM64 true) -endif (NOT DEFINED BUILD_ARM64) -set (BUILD_ARM64 ${BUILD_ARM64} CACHE STRING "Build arm64 arch or not") +set (IOS_PLATFORM ${IOS_PLATFORM} CACHE STRING "Type of iOS Platform: OS or SIMULATOR") # Check the platform selection and setup for developer root -if (${IOS_PLATFORM} STREQUAL OS) - message (STATUS "Targeting iPhone platform") +if (IOS_PLATFORM STREQUAL OS) set (IOS_PLATFORM_LOCATION "iPhoneOS.platform") # This causes the installers to properly locate the output libraries set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphoneos") -elseif (${IOS_PLATFORM} STREQUAL SIMULATOR) - message (STATUS "Targeting iPhoneSimulator platform") - set (SIMULATOR true) +elseif (IOS_PLATFORM STREQUAL SIMULATOR) set (IOS_PLATFORM_LOCATION "iPhoneSimulator.platform") # This causes the installers to properly locate the output libraries set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphonesimulator") +else () + message (FATAL_ERROR "Unsupported IOS_PLATFORM value '${IOS_PLATFORM}' selected. Please choose OS or SIMULATOR") +endif () -else (${IOS_PLATFORM} STREQUAL OS) - message (FATAL_ERROR "Unsupported IOS_PLATFORM value '${IOS_PLATFORM}' selected. Please choose OS or SIMULATOR") -endif (${IOS_PLATFORM} STREQUAL OS) +# Setup iOS developer location unless specified manually with IOS_DEVELOPER_ROOT +exec_program(/usr/bin/xcode-select ARGS -print-path OUTPUT_VARIABLE XCODE_DEVELOPER_DIR) +set (IOS_DEVELOPER_ROOT "${XCODE_DEVELOPER_DIR}/Platforms/${IOS_PLATFORM_LOCATION}/Developer" CACHE PATH "Location of iOS Platform") -# Setup iOS developer location unless specified manually with CMAKE_IOS_DEVELOPER_ROOT -# Note Xcode 4.3 changed the installation location, choose the most recent one available -exec_program(/usr/bin/xcode-select ARGS -print-path OUTPUT_VARIABLE CMAKE_XCODE_DEVELOPER_DIR) -set (XCODE_POST_43_ROOT "${CMAKE_XCODE_DEVELOPER_DIR}/Platforms/${IOS_PLATFORM_LOCATION}/Developer") -set (XCODE_PRE_43_ROOT "/Developer/Platforms/${IOS_PLATFORM_LOCATION}/Developer") -if (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT) - if (EXISTS ${XCODE_POST_43_ROOT}) - set (CMAKE_IOS_DEVELOPER_ROOT ${XCODE_POST_43_ROOT}) - elseif(EXISTS ${XCODE_PRE_43_ROOT}) - set (CMAKE_IOS_DEVELOPER_ROOT ${XCODE_PRE_43_ROOT}) - endif (EXISTS ${XCODE_POST_43_ROOT}) -endif (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT) -set (CMAKE_IOS_DEVELOPER_ROOT ${CMAKE_IOS_DEVELOPER_ROOT} CACHE PATH "Location of iOS Platform") - -# Find and use the most recent iOS sdk unless specified manually with CMAKE_IOS_SDK_ROOT -if (NOT DEFINED CMAKE_IOS_SDK_ROOT) - file (GLOB _CMAKE_IOS_SDKS "${CMAKE_IOS_DEVELOPER_ROOT}/SDKs/*") - if (_CMAKE_IOS_SDKS) - list (SORT _CMAKE_IOS_SDKS) - list (REVERSE _CMAKE_IOS_SDKS) - list (GET _CMAKE_IOS_SDKS 0 CMAKE_IOS_SDK_ROOT) - else (_CMAKE_IOS_SDKS) - message (FATAL_ERROR "No iOS SDK's found in default search path ${CMAKE_IOS_DEVELOPER_ROOT}. Manually set CMAKE_IOS_SDK_ROOT or install the iOS SDK.") - endif (_CMAKE_IOS_SDKS) - message (STATUS "Toolchain using default iOS SDK: ${CMAKE_IOS_SDK_ROOT}") -endif (NOT DEFINED CMAKE_IOS_SDK_ROOT) -set (CMAKE_IOS_SDK_ROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Location of the selected iOS SDK") +# Find and use the most recent iOS sdk unless specified manually with IOS_SDK_ROOT +if (NOT DEFINED IOS_SDK_ROOT) + file (GLOB _IOS_SDKS "${IOS_DEVELOPER_ROOT}/SDKs/*") + if (_IOS_SDKS) + list (SORT _IOS_SDKS) + list (REVERSE _IOS_SDKS) + list (GET _IOS_SDKS 0 IOS_SDK_ROOT) + else (_IOS_SDKS) + message (FATAL_ERROR "No iOS SDK's found in default search path ${IOS_DEVELOPER_ROOT}. Manually set IOS_SDK_ROOT or install the iOS SDK.") + endif (_IOS_SDKS) + message (STATUS "Toolchain using default iOS SDK: ${IOS_SDK_ROOT}") +endif (NOT DEFINED IOS_SDK_ROOT) +set (IOS_SDK_ROOT ${IOS_SDK_ROOT} CACHE PATH "Location of the selected iOS SDK") # Set the sysroot default to the most recent SDK -set (CMAKE_OSX_SYSROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Sysroot used for iOS support") -message (STATUS "iOS sysroot=${CMAKE_OSX_SYSROOT}") +set (CMAKE_OSX_SYSROOT ${IOS_SDK_ROOT} CACHE PATH "Sysroot used for iOS support") # set the architecture for iOS if (${IOS_PLATFORM} STREQUAL OS) @@ -172,21 +151,19 @@ elseif (${IOS_PLATFORM} STREQUAL SIMULATOR) set (IOS_ARCH x86_64) endif (${IOS_PLATFORM} STREQUAL OS) -set (CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE string "Build architecture for iOS" FORCE) -set (CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS ${IOS_ARCH}) -message (STATUS "iOS architecture=${IOS_ARCH}") +set (CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE STRING "Build architecture for iOS" FORCE) # Set the find root to the iOS developer roots and to user defined paths -set (CMAKE_FIND_ROOT_PATH ${CMAKE_IOS_DEVELOPER_ROOT} ${CMAKE_IOS_SDK_ROOT} ${CMAKE_PREFIX_PATH} CACHE string "iOS find search path root") +set (CMAKE_FIND_ROOT_PATH ${IOS_DEVELOPER_ROOT} ${IOS_SDK_ROOT} ${CMAKE_PREFIX_PATH} CACHE STRING "iOS find search path root") # default to searching for frameworks first set (CMAKE_FIND_FRAMEWORK FIRST) # set up the default search directories for frameworks set (CMAKE_SYSTEM_FRAMEWORK_PATH - ${CMAKE_IOS_SDK_ROOT}/System/Library/Frameworks - ${CMAKE_IOS_SDK_ROOT}/System/Library/PrivateFrameworks - ${CMAKE_IOS_SDK_ROOT}/Developer/Library/Frameworks + ${IOS_SDK_ROOT}/System/Library/Frameworks + ${IOS_SDK_ROOT}/System/Library/PrivateFrameworks + ${IOS_SDK_ROOT}/Developer/Library/Frameworks ) # only search the iOS sdks, not the remainder of the host filesystem @@ -195,12 +172,6 @@ set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -# This little macro lets you set any XCode specific property -macro (set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE) - set_property (TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} ${XCODE_VALUE}) -endmacro (set_xcode_property) - - # This macro lets you find executable programs on the host system macro (find_host_package) set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) diff --git a/examples/iOS/CMakeLists.txt b/examples/iOS/CMakeLists.txt index 96450f42..24aca5f4 100644 --- a/examples/iOS/CMakeLists.txt +++ b/examples/iOS/CMakeLists.txt @@ -21,5 +21,5 @@ sfml_add_example(ios_demo GUI_APP "-framework OpenGLES") # The app needs an identifier and signing to work correctly -SET_XCODE_PROPERTY(ios_demo CODE_SIGN_IDENTITY "iPhone Developer") +sfml_set_xcode_property(ios_demo CODE_SIGN_IDENTITY "iPhone Developer") set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.sfml.ios_demo") From b97a5be61585271fd44a923f3dc07b4ebb64131e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <lukas.duerrenberger@zuehlke.com> Date: Sat, 9 Jun 2018 11:45:16 +0200 Subject: [PATCH 094/211] Fixed performance issue with reading WAV files Calling tell() and thus std::ftell() for every reading iteration ate up 80-90% of the whole read call. By manually tracking the current position the calls to tell() can be safely removed. --- src/SFML/Audio/SoundFileReaderWav.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/SFML/Audio/SoundFileReaderWav.cpp b/src/SFML/Audio/SoundFileReaderWav.cpp index dc1dc52b..84d92c1e 100644 --- a/src/SFML/Audio/SoundFileReaderWav.cpp +++ b/src/SFML/Audio/SoundFileReaderWav.cpp @@ -155,7 +155,11 @@ Uint64 SoundFileReaderWav::read(Int16* samples, Uint64 maxCount) assert(m_stream); Uint64 count = 0; - while ((count < maxCount) && (static_cast<Uint64>(m_stream->tell()) < m_dataEnd)) + Uint64 startPos = 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. + while ((count < maxCount) && (startPos + count * m_bytesPerSample < m_dataEnd)) { switch (m_bytesPerSample) { From 235abae13406e6d406cc47c1ee7c500bc5e36f7e Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Tue, 15 May 2018 23:28:32 +0200 Subject: [PATCH 095/211] Fixed the Unix clipboard implementation causing an abort due to internal data races in Xlib. --- include/SFML/Window/Clipboard.hpp | 19 +- src/SFML/Window/Unix/ClipboardImpl.cpp | 523 +++++++++++++++---------- src/SFML/Window/Unix/ClipboardImpl.hpp | 78 ++++ src/SFML/Window/Unix/WindowImplX11.cpp | 4 + 4 files changed, 420 insertions(+), 204 deletions(-) diff --git a/include/SFML/Window/Clipboard.hpp b/include/SFML/Window/Clipboard.hpp index 436da8f9..50ea8042 100644 --- a/include/SFML/Window/Clipboard.hpp +++ b/include/SFML/Window/Clipboard.hpp @@ -60,7 +60,12 @@ public: /// This function sets the content of the clipboard as a /// string. /// - /// \param text sf::String containing the data to be sent + /// \warning Due to limitations on some operating systems, + /// setting the clipboard contents is only + /// guaranteed to work if there is currently an + /// open window for which events are being handled. + /// + /// \param text sf::String containing the data to be sent /// to the clipboard /// //////////////////////////////////////////////////////////// @@ -80,6 +85,11 @@ public: /// sf::Clipboard provides an interface for getting and /// setting the contents of the system clipboard. /// +/// It is important to note that due to limitations on some +/// operating systems, setting the clipboard contents is +/// only guaranteed to work if there is currently an open +/// window for which events are being handled. +/// /// Usage example: /// \code /// // get the clipboard content as a string @@ -96,11 +106,12 @@ public: /// // Using Ctrl + V to paste a string into SFML /// if(event.key.control && event.key.code == sf::Keyboard::V) /// string = sf::Clipboard::getString(); +/// +/// // Using Ctrl + C to copy a string out of SFML +/// if(event.key.control && event.key.code == sf::Keyboard::C) +/// sf::Clipboard::setString("Hello World!"); /// } /// } -/// -/// // set the clipboard to a string -/// sf::Clipboard::setString("Hello World!"); /// \endcode /// /// \see sf::String, sf::Event diff --git a/src/SFML/Window/Unix/ClipboardImpl.cpp b/src/SFML/Window/Unix/ClipboardImpl.cpp index 32ef21bc..df2fd954 100644 --- a/src/SFML/Window/Unix/ClipboardImpl.cpp +++ b/src/SFML/Window/Unix/ClipboardImpl.cpp @@ -27,143 +27,20 @@ //////////////////////////////////////////////////////////// #include <SFML/Window/Unix/ClipboardImpl.hpp> #include <SFML/Window/Unix/Display.hpp> -#include <SFML/System/String.hpp> -#include <SFML/System/Sleep.hpp> -#include <iostream> -#include <string> -#include <X11/Xlib.h> +#include <SFML/System/Clock.hpp> +#include <SFML/System/Err.hpp> +#include <X11/Xatom.h> +#include <vector> namespace { -//////////////////////////////////////////////////////////// -void initClipboard(); -void* hostSelection(void*); - -sf::String string; - -pthread_mutex_t mutex; -pthread_t host_thread; - -bool is_fail = false; -bool is_init = false; -bool is_host = false; - -Display* display = NULL; -Window window = 0; - -Atom selection = 0; -Atom atom_targ = 0; -Atom atom_text = 0; -Atom utf8_text = 0; -int xa_string = 31; -int xa_atom = 4; - -//////////////////////////////////////////////////////////// -void initClipboard() -{ - is_init = true; - - display = XOpenDisplay(NULL); - int screen = DefaultScreen(display); - window = XCreateSimpleWindow(display, RootWindow(display, screen), - 0, 0, 1, 1, 0, BlackPixel(display, screen), WhitePixel(display, screen)); - - selection = XInternAtom(display, "CLIPBOARD", false); - atom_targ = XInternAtom(display, "TARGETS", false); - atom_text = XInternAtom(display, "TEXT", false); - utf8_text = XInternAtom(display, "UTF8_STRING", true); - - if(utf8_text == None) + // Filter the events received by windows (only allow those matching a specific window) + Bool checkEvent(::Display*, XEvent* event, XPointer userData) { - std::cerr << "UTF-8 format unavailable on clipboard." << std::endl; - utf8_text = xa_string; + // Just check if the event matches the window + return event->xany.window == reinterpret_cast< ::Window >(userData); } - - if(pthread_mutex_init(&mutex, NULL)) - { - is_fail = true; - std::cerr << "Unable to initialize mutex. Failed to initialize clipboard." << std::endl; - return; - } - - if(pthread_create(&host_thread, NULL, hostSelection, NULL)) - { - is_fail = true; - std::cerr << "Unable to create host thread. Failed to initialize clipboard." << std::endl; - return; - } -} - -//////////////////////////////////////////////////////////// -void* hostSelection(void*) -{ - while(true) - { - if(XPending(display) && is_host) - { - XEvent event; - - pthread_mutex_lock(&mutex); - XNextEvent(display, &event); - pthread_mutex_unlock(&mutex); - - switch(event.type) - { - case SelectionClear: - { - pthread_mutex_lock(&mutex); - is_host = false; - pthread_mutex_unlock(&mutex); - - break; - } - case SelectionRequest: - { - if(event.xselectionrequest.selection == selection) - { - XSelectionRequestEvent* sel_req_event = &event.xselectionrequest; - XSelectionEvent sel_event = {0}; - - int result = 0; - sel_event.type = SelectionNotify, - sel_event.display = sel_req_event->display, - sel_event.requestor = sel_req_event->requestor, - sel_event.selection = sel_req_event->selection, - sel_event.time = sel_req_event->time, - sel_event.target = sel_req_event->target, - sel_event.property = sel_req_event->property; - - std::basic_string<unsigned char> str = string.toUtf8(); - - if(sel_event.target == atom_targ) - result = XChangeProperty(sel_event.display, sel_event.requestor, - sel_event.property, xa_atom, 32, PropModeReplace, - reinterpret_cast<unsigned char*>(&utf8_text), 1); - else if(sel_event.target == xa_string || sel_event.target == atom_text) - result = XChangeProperty(sel_event.display, sel_event.requestor, - sel_event.property, xa_string, 8, PropModeReplace, - reinterpret_cast<unsigned char*>(&str[0]), str.size()); - else if(sel_event.target == utf8_text) - result = XChangeProperty(sel_event.display, sel_event.requestor, - sel_event.property, utf8_text, 8, PropModeReplace, - reinterpret_cast<unsigned char*>(&str[0]), str.size()); - else - sel_event.property = None; - - if((result & 2) == 0) - XSendEvent(display, sel_event.requestor, 0, 0, - reinterpret_cast<XEvent*>(&sel_event)); - } - break; - } - default: break; - } - } - else - sf::sleep(sf::milliseconds(20)); - } -} } namespace sf @@ -174,86 +51,332 @@ namespace priv //////////////////////////////////////////////////////////// String ClipboardImpl::getString() { - if(!is_init) - initClipboard(); - - if(is_fail || is_host) - return string; - - // Dangerous! Wipes all previous events! - XSync(display, true); - XConvertSelection(display, selection, utf8_text, atom_text, window, CurrentTime); - - XEvent event; - - pthread_mutex_lock(&mutex); - XNextEvent(display, &event); - pthread_mutex_unlock(&mutex); - - if(event.type == SelectionNotify) - { - if(event.xselection.selection != selection || event.xselection.target != utf8_text) - { - std::cerr << "Failed to convert selection." << std::endl; - return string; - } - - if(event.xselection.property) - { - Atom target; - int format; - unsigned long size; - unsigned long byte_left; - unsigned char* data; - - XGetWindowProperty(event.xselection.display, - event.xselection.requestor, event.xselection.property, - 0L, (~0L), false, AnyPropertyType, - &target, &format, &size, &byte_left, &data); - - if(target == utf8_text) - { - std::basic_string<unsigned char> str(data, size); - string = sf::String::fromUtf8(str.begin(), str.end()); - - XFree(data); - } - - XDeleteProperty(event.xselection.display, event.xselection.requestor, event.xselection.property); - } - } - - return string; + return getInstance().getStringImpl(); } //////////////////////////////////////////////////////////// void ClipboardImpl::setString(const String& text) { - if(!is_init) - initClipboard(); + getInstance().setStringImpl(text); +} - if(is_fail) - return; - if(!is_host) +//////////////////////////////////////////////////////////// +void ClipboardImpl::processEvents() +{ + getInstance().processEventsImpl(); +} + + +//////////////////////////////////////////////////////////// +ClipboardImpl::ClipboardImpl() : +m_window (0), +m_requestResponded(false) +{ + // Open a connection with the X server + m_display = OpenDisplay(); + + // Get the atoms we need to make use of the clipboard + m_clipboard = getAtom("CLIPBOARD", false); + m_targets = getAtom("TARGETS", false); + m_text = getAtom("TEXT", false); + m_utf8String = getAtom("UTF8_STRING", true ); + m_targetProperty = getAtom("SFML_CLIPBOARD_TARGET_PROPERTY", false); + + // Create a hidden window that will broker our clipboard interactions with X + m_window = XCreateSimpleWindow(m_display, DefaultRootWindow(m_display), 0, 0, 1, 1, 0, 0, 0); + + // Register the events we are interested in + XSelectInput(m_display, m_window, SelectionNotify | SelectionClear | SelectionRequest); +} + + +//////////////////////////////////////////////////////////// +ClipboardImpl::~ClipboardImpl() +{ + // Destroy the window + if (m_window) { - XSetSelectionOwner(display, selection, window, CurrentTime); - - if(XGetSelectionOwner(display, selection) != window) - { - std::cerr << "Unable to get ownership of selection." << std::endl; - return; - } - - pthread_mutex_lock(&mutex); - is_host = true; - pthread_mutex_unlock(&mutex); + XDestroyWindow(m_display, m_window); + XFlush(m_display); } - pthread_mutex_lock(&mutex); - string = text; - pthread_mutex_unlock(&mutex); + // Close the connection with the X server + CloseDisplay(m_display); +} + + +//////////////////////////////////////////////////////////// +ClipboardImpl& ClipboardImpl::getInstance() +{ + static ClipboardImpl instance; + + return instance; +} + + +//////////////////////////////////////////////////////////// +String ClipboardImpl::getStringImpl() +{ + // Check if anybody owns the current selection + if (XGetSelectionOwner(m_display, m_clipboard) == None) + { + m_clipboardContents.clear(); + + return m_clipboardContents; + } + + // Process any already pending events + processEvents(); + + m_requestResponded = false; + + // Request the current selection to be converted to UTF-8 (or STRING + // if UTF-8 is not available) and written to our window property + XConvertSelection( + m_display, + m_clipboard, + (m_utf8String != None) ? m_utf8String : XA_STRING, + m_targetProperty, + m_window, + CurrentTime + ); + + Clock clock; + + // Wait for a response for up to 1000ms + while (!m_requestResponded && (clock.getElapsedTime().asMilliseconds() < 1000)) + processEvents(); + + // If no response was received within the time period, clear our clipboard contents + if (!m_requestResponded) + m_clipboardContents.clear(); + + return m_clipboardContents; +} + + +//////////////////////////////////////////////////////////// +void ClipboardImpl::setStringImpl(const String& text) +{ + m_clipboardContents = text; + + // Set our window as the current owner of the selection + XSetSelectionOwner(m_display, m_clipboard, m_window, CurrentTime); + + // Check if setting the selection owner was successful + if (XGetSelectionOwner(m_display, m_clipboard) != m_window) + err() << "Cannot set clipboard string: Unable to get ownership of X selection" << std::endl; +} + + +//////////////////////////////////////////////////////////// +void ClipboardImpl::processEventsImpl() +{ + 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); + } +} + + +//////////////////////////////////////////////////////////// +void ClipboardImpl::processEvent(XEvent& windowEvent) +{ + switch (windowEvent.type) + { + case SelectionClear: + { + // We don't have any resources we need to clean up + // when losing selection ownership so we don't do + // anything when we receive SelectionClear + // We will still respond to any future SelectionRequest + // events since doing so doesn't really do any harm + break; + } + case SelectionNotify: + { + // Notification that the current selection owner + // has responded to our request + + XSelectionEvent& selectionEvent = *reinterpret_cast<XSelectionEvent*>(&windowEvent.xselection); + + m_clipboardContents.clear(); + + // If retrieving the selection fails or conversion is unsuccessful + // we leave the contents of the clipboard empty since we don't + // own it and we don't know what it could currently be + if ((selectionEvent.property == None) || (selectionEvent.selection != m_clipboard)) + break; + + Atom type; + int format; + unsigned long items; + unsigned long remainingBytes; + unsigned char* data = 0; + + // The selection owner should have wrote the selection + // data to the specified window property + int result = XGetWindowProperty( + m_display, + m_window, + m_targetProperty, + 0, + 0x7fffffff, + False, + AnyPropertyType, + &type, + &format, + &items, + &remainingBytes, + &data + ); + + if (result == Success) + { + // We don't support INCR for now + // It is very unlikely that this will be returned + // for purely text data transfer anyway + if (type != getAtom("INCR", false)) + { + // Only copy the data if the format is what we expect + if ((type == m_utf8String) && (format == 8)) + { + m_clipboardContents = String::fromUtf8(data, data + items); + } + else if ((type == XA_STRING) && (format == 8)) + { + // Convert from ANSI std::string to sf::String + m_clipboardContents = std::string(data, data + items); + } + } + + XFree(data); + + // The selection requestor must always delete the property themselves + XDeleteProperty(m_display, m_window, m_targetProperty); + } + + m_requestResponded = true; + + break; + } + case SelectionRequest: + { + // Respond to a request for our clipboard contents + XSelectionRequestEvent& selectionRequestEvent = *reinterpret_cast<XSelectionRequestEvent*>(&windowEvent.xselectionrequest); + + // Our reply + XSelectionEvent selectionEvent; + + selectionEvent.type = SelectionNotify; + selectionEvent.requestor = selectionRequestEvent.requestor; + selectionEvent.selection = selectionRequestEvent.selection; + selectionEvent.property = selectionRequestEvent.property; + selectionEvent.time = selectionRequestEvent.time; + + if (selectionRequestEvent.selection == m_clipboard) + { + if (selectionRequestEvent.target == m_targets) + { + // Respond to a request for our valid conversion targets + std::vector<Atom> targets; + + targets.push_back(m_targets); + targets.push_back(m_text); + targets.push_back(XA_STRING); + + if (m_utf8String != None) + targets.push_back(m_utf8String); + + XChangeProperty( + m_display, + selectionRequestEvent.requestor, + selectionRequestEvent.property, + XA_ATOM, + 32, + PropModeReplace, + reinterpret_cast<unsigned char*>(&targets[0]), + targets.size() + ); + + // Notify the requestor that they can read the targets from their window property + selectionEvent.target = m_targets; + + XSendEvent(m_display, selectionRequestEvent.requestor, True, NoEventMask, reinterpret_cast<XEvent*>(&selectionEvent)); + + break; + } + else if ((selectionRequestEvent.target == XA_STRING) || ((m_utf8String == None) && (selectionRequestEvent.target == m_text))) + { + // Respond to a request for conversion to a Latin-1 string + std::string data = m_clipboardContents.toAnsiString(); + + XChangeProperty( + m_display, + selectionRequestEvent.requestor, + selectionRequestEvent.property, + XA_STRING, + 8, + PropModeReplace, + reinterpret_cast<const unsigned char*>(data.c_str()), + data.size() + ); + + // Notify the requestor that they can read the data from their window property + selectionEvent.target = XA_STRING; + + XSendEvent(m_display, selectionRequestEvent.requestor, True, NoEventMask, reinterpret_cast<XEvent*>(&selectionEvent)); + + break; + } + else if ((m_utf8String != None) && ((selectionRequestEvent.target == m_utf8String) || (selectionRequestEvent.target == m_text))) + { + // Respond to a request for conversion to a UTF-8 string + // or an encoding of our choosing (we always choose UTF-8) + std::basic_string<Uint8> data = m_clipboardContents.toUtf8(); + + XChangeProperty( + m_display, + selectionRequestEvent.requestor, + selectionRequestEvent.property, + m_utf8String, + 8, + PropModeReplace, + reinterpret_cast<const unsigned char*>(data.c_str()), + data.size() + ); + + // Notify the requestor that they can read the data from their window property + selectionEvent.target = m_utf8String; + + XSendEvent(m_display, selectionRequestEvent.requestor, True, NoEventMask, reinterpret_cast<XEvent*>(&selectionEvent)); + + break; + } + } + + // Notify the requestor that we could not respond to their request + selectionEvent.target = selectionRequestEvent.target; + selectionEvent.property = None; + + XSendEvent(m_display, selectionRequestEvent.requestor, True, NoEventMask, reinterpret_cast<XEvent*>(&selectionEvent)); + + break; + } + default: + break; + } } } // namespace priv diff --git a/src/SFML/Window/Unix/ClipboardImpl.hpp b/src/SFML/Window/Unix/ClipboardImpl.hpp index f4aca983..48ec7876 100644 --- a/src/SFML/Window/Unix/ClipboardImpl.hpp +++ b/src/SFML/Window/Unix/ClipboardImpl.hpp @@ -29,6 +29,8 @@ // Headers //////////////////////////////////////////////////////////// #include <SFML/System/String.hpp> +#include <X11/Xlib.h> +#include <deque> namespace sf @@ -67,6 +69,82 @@ public: /// //////////////////////////////////////////////////////////// static void setString(const String& text); + + //////////////////////////////////////////////////////////// + /// \brief Process pending events for the hidden clipboard window + /// + /// This function has to be called as part of normal window + /// event processing in order for our application to respond + /// to selection requests from other applications. + /// + //////////////////////////////////////////////////////////// + static void processEvents(); + +private: + + //////////////////////////////////////////////////////////// + /// \brief Constructor + /// + //////////////////////////////////////////////////////////// + ClipboardImpl(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~ClipboardImpl(); + + //////////////////////////////////////////////////////////// + /// \brief Get singleton instance + /// + /// \return Singleton instance + /// + //////////////////////////////////////////////////////////// + static ClipboardImpl& getInstance(); + + //////////////////////////////////////////////////////////// + /// \brief getString implementation + /// + /// \return Current content of the clipboard + /// + //////////////////////////////////////////////////////////// + String getStringImpl(); + + //////////////////////////////////////////////////////////// + /// \brief setString implementation + /// + /// \param text sf::String object containing the data to be sent to the clipboard + /// + //////////////////////////////////////////////////////////// + void setStringImpl(const String& text); + + //////////////////////////////////////////////////////////// + /// \brief processEvents implementation + /// + //////////////////////////////////////////////////////////// + void processEventsImpl(); + + //////////////////////////////////////////////////////////// + /// \brief Process an incoming event from the window + /// + /// \param windowEvent Event which has been received + /// + //////////////////////////////////////////////////////////// + void processEvent(XEvent& windowEvent); + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + ::Window m_window; ///< X identifier defining our window + ::Display* m_display; ///< Pointer to the display + Atom m_clipboard; ///< X Atom identifying the CLIPBOARD selection + Atom m_targets; ///< X Atom identifying TARGETS + Atom m_text; ///< X Atom identifying TEXT + Atom m_utf8String; ///< X Atom identifying UTF8_STRING + Atom m_targetProperty; ///< X Atom identifying our destination window property + String m_clipboardContents; ///< Our clipboard contents + std::deque<XEvent> m_events; ///< Queue we use to store pending events for this window + bool m_requestResponded; ///< Holds whether our selection request has been responded to or not }; } // namespace priv diff --git a/src/SFML/Window/Unix/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index e2c8d290..ee5bf356 100644 --- a/src/SFML/Window/Unix/WindowImplX11.cpp +++ b/src/SFML/Window/Unix/WindowImplX11.cpp @@ -26,6 +26,7 @@ // Headers //////////////////////////////////////////////////////////// #include <SFML/Window/Unix/WindowImplX11.hpp> +#include <SFML/Window/Unix/ClipboardImpl.hpp> #include <SFML/Window/Unix/Display.hpp> #include <SFML/Window/Unix/InputImpl.hpp> #include <SFML/System/Utf.hpp> @@ -779,6 +780,9 @@ void WindowImplX11::processEvents() m_events.pop_front(); processEvent(event); } + + // Process clipboard window events + priv::ClipboardImpl::processEvents(); } From f22b9b7b71f1c643680a1f61d328d7b04ed60eea Mon Sep 17 00:00:00 2001 From: Bruno Van de Velde <bruno@texus.me> Date: Fri, 27 Jul 2018 20:13:07 +0200 Subject: [PATCH 096/211] ANativeActivity_onCreate is not exported in sfml-main (fixes #1457) --- src/SFML/Main/MainAndroid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Main/MainAndroid.cpp b/src/SFML/Main/MainAndroid.cpp index fcb85001..fe67bbad 100644 --- a/src/SFML/Main/MainAndroid.cpp +++ b/src/SFML/Main/MainAndroid.cpp @@ -464,7 +464,7 @@ static void onLowMemory(ANativeActivity* activity) //////////////////////////////////////////////////////////// -void ANativeActivity_onCreate(ANativeActivity* activity, void* savedState, size_t savedStateSize) +JNIEXPORT void ANativeActivity_onCreate(ANativeActivity* activity, void* savedState, size_t savedStateSize) { // Create an activity states (will keep us in the know, about events we care) sf::priv::ActivityStates* states = NULL; From 2853b6b629c46c9e609f737d6e2e9dcd69947aa6 Mon Sep 17 00:00:00 2001 From: "Lionel Aimerie (Pixium Digital)" <lionel.aimerie@pixiumdigital.com> Date: Sun, 22 Jul 2018 11:33:20 +0800 Subject: [PATCH 097/211] ANDROID flag fix to SFML_SYSTEM_ANDROID --- include/SFML/System/FileInputStream.hpp | 4 ++-- src/SFML/System/FileInputStream.cpp | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/include/SFML/System/FileInputStream.hpp b/include/SFML/System/FileInputStream.hpp index 43618da6..ca267972 100644 --- a/include/SFML/System/FileInputStream.hpp +++ b/include/SFML/System/FileInputStream.hpp @@ -35,7 +35,7 @@ #include <cstdio> #include <string> -#ifdef ANDROID +#ifdef SFML_SYSTEM_ANDROID namespace sf { namespace priv @@ -122,7 +122,7 @@ private: //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// -#ifdef ANDROID +#ifdef SFML_SYSTEM_ANDROID priv::ResourceStream* m_file; #else std::FILE* m_file; ///< stdio file stream diff --git a/src/SFML/System/FileInputStream.cpp b/src/SFML/System/FileInputStream.cpp index 852470de..89e77c47 100644 --- a/src/SFML/System/FileInputStream.cpp +++ b/src/SFML/System/FileInputStream.cpp @@ -26,7 +26,7 @@ // Headers //////////////////////////////////////////////////////////// #include <SFML/System/FileInputStream.hpp> -#ifdef ANDROID +#ifdef SFML_SYSTEM_ANDROID #include <SFML/System/Android/ResourceStream.hpp> #endif @@ -44,7 +44,7 @@ FileInputStream::FileInputStream() //////////////////////////////////////////////////////////// FileInputStream::~FileInputStream() { -#ifdef ANDROID +#ifdef SFML_SYSTEM_ANDROID if (m_file) delete m_file; #else @@ -57,7 +57,7 @@ FileInputStream::~FileInputStream() //////////////////////////////////////////////////////////// bool FileInputStream::open(const std::string& filename) { -#ifdef ANDROID +#ifdef SFML_SYSTEM_ANDROID if (m_file) delete m_file; m_file = new priv::ResourceStream(filename); @@ -76,7 +76,7 @@ bool FileInputStream::open(const std::string& filename) //////////////////////////////////////////////////////////// Int64 FileInputStream::read(void* data, Int64 size) { -#ifdef ANDROID +#ifdef SFML_SYSTEM_ANDROID return m_file->read(data, size); #else if (m_file) @@ -90,7 +90,7 @@ Int64 FileInputStream::read(void* data, Int64 size) //////////////////////////////////////////////////////////// Int64 FileInputStream::seek(Int64 position) { -#ifdef ANDROID +#ifdef SFML_SYSTEM_ANDROID return m_file->seek(position); #else if (m_file) @@ -111,7 +111,7 @@ Int64 FileInputStream::seek(Int64 position) //////////////////////////////////////////////////////////// Int64 FileInputStream::tell() { -#ifdef ANDROID +#ifdef SFML_SYSTEM_ANDROID return m_file->tell(); #else if (m_file) @@ -125,7 +125,7 @@ Int64 FileInputStream::tell() //////////////////////////////////////////////////////////// Int64 FileInputStream::getSize() { -#ifdef ANDROID +#ifdef SFML_SYSTEM_ANDROID return m_file->getSize(); #else if (m_file) From bc570b22bfd463cf8008f43de5f29e7e79f5e69b Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Thu, 12 Apr 2018 11:58:46 -0700 Subject: [PATCH 098/211] Use default supported rotations when none are specified --- src/SFML/Window/iOS/SFAppDelegate.mm | 2 +- src/SFML/Window/iOS/SFViewController.hpp | 8 -------- src/SFML/Window/iOS/SFViewController.mm | 8 -------- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/SFML/Window/iOS/SFAppDelegate.mm b/src/SFML/Window/iOS/SFAppDelegate.mm index 6b173849..4177eb3d 100644 --- a/src/SFML/Window/iOS/SFAppDelegate.mm +++ b/src/SFML/Window/iOS/SFAppDelegate.mm @@ -173,7 +173,7 @@ namespace NSArray *supportedOrientations = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UISupportedInterfaceOrientations"]; if (!supportedOrientations) - return false; + return (1 << orientation) & [rootViewController supportedInterfaceOrientations]; int appFlags = 0; if ([supportedOrientations containsObject:@"UIInterfaceOrientationPortrait"]) diff --git a/src/SFML/Window/iOS/SFViewController.hpp b/src/SFML/Window/iOS/SFViewController.hpp index b8a77aad..2b65d358 100644 --- a/src/SFML/Window/iOS/SFViewController.hpp +++ b/src/SFML/Window/iOS/SFViewController.hpp @@ -55,14 +55,6 @@ //////////////////////////////////////////////////////////// - (BOOL)shouldAutorotate; -//////////////////////////////////////////////////////////// -/// \brief Returns the supported orientations (iOS >= 6) -/// -/// \return A combination of all the supported orientations -/// -//////////////////////////////////////////////////////////// -- (NSUInteger)supportedInterfaceOrientations; - //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// diff --git a/src/SFML/Window/iOS/SFViewController.mm b/src/SFML/Window/iOS/SFViewController.mm index d8be0478..8c23cdcf 100644 --- a/src/SFML/Window/iOS/SFViewController.mm +++ b/src/SFML/Window/iOS/SFViewController.mm @@ -46,12 +46,4 @@ return self.orientationCanChange; } - -//////////////////////////////////////////////////////////// -- (NSUInteger)supportedInterfaceOrientations -{ - return UIInterfaceOrientationMaskAll; -} - - @end From 8d96976e4b3ce71ed63e629b8abf4d9da1d89aa2 Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Mon, 9 Apr 2018 00:19:55 +0200 Subject: [PATCH 099/211] On iOS, make sure to be notified if you forgot to include <SFML/Main.hpp> --- src/SFML/Window/iOS/SFAppDelegate.mm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/SFML/Window/iOS/SFAppDelegate.mm b/src/SFML/Window/iOS/SFAppDelegate.mm index 4177eb3d..ea69f41e 100644 --- a/src/SFML/Window/iOS/SFAppDelegate.mm +++ b/src/SFML/Window/iOS/SFAppDelegate.mm @@ -56,6 +56,10 @@ namespace //////////////////////////////////////////////////////////// + (SFAppDelegate*)getInstance { + NSAssert(delegateInstance, + @"SFAppDelegate instance is nil, this means SFML was not properly initialized. " + "Make sure that the file defining your main() function includes <SFML/Main.hpp>"); + return delegateInstance; } From ac38b17827b8e3324a7842590687bb7c7c23968c Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Thu, 12 Apr 2018 11:48:33 -0700 Subject: [PATCH 100/211] Fix config for finding dependencies on iOS --- cmake/SFMLConfigDependencies.cmake.in | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cmake/SFMLConfigDependencies.cmake.in b/cmake/SFMLConfigDependencies.cmake.in index 2f85b388..97f33c01 100644 --- a/cmake/SFMLConfigDependencies.cmake.in +++ b/cmake/SFMLConfigDependencies.cmake.in @@ -13,7 +13,11 @@ if(SFML_STATIC_LIBRARIES) elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") set(FIND_SFML_OS_FREEBSD 1) elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set(FIND_SFML_OS_MACOSX 1) + if (DEFINED IOS) + set(FIND_SFML_OS_IOS 1) + else() + set(FIND_SFML_OS_MACOSX 1) + endif() endif() # start with an empty list @@ -51,7 +55,7 @@ if(SFML_STATIC_LIBRARIES) if (FIND_SFML_OS_WINDOWS) set_property(TARGET OpenGL APPEND PROPERTY INTERFACE_LINK_LIBRARIES "OpenGL32") - else() + elseif(NOT FIND_SFML_OS_IOS) sfml_bind_dependency(TARGET OpenGL FRIENDLY_NAME "OpenGL" SEARCH_NAMES "OpenGL" "GL") endif() endif() @@ -68,8 +72,10 @@ if(SFML_STATIC_LIBRARIES) sfml_bind_dependency(TARGET OpenAL FRIENDLY_NAME "OpenAL" SEARCH_NAMES "OpenAL" "openal" "openal32") 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 "VorbisFile" SEARCH_NAMES "vorbisfile") - sfml_bind_dependency(TARGET Vorbis FRIENDLY_NAME "VorbisEnc" SEARCH_NAMES "vorbisenc") + 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") + endif() sfml_bind_dependency(TARGET FLAC FRIENDLY_NAME "FLAC" SEARCH_NAMES "FLAC") endif() From 44d3e267663d573fc7ec1079cae6ca78007a9b37 Mon Sep 17 00:00:00 2001 From: Ironbell <isabelleroesch@msn.com> Date: Wed, 13 Jun 2018 21:09:48 +0200 Subject: [PATCH 101/211] Fixed two conversion warnings (C4267) --- src/SFML/Graphics/RenderTarget.cpp | 2 +- src/SFML/Network/TcpSocket.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index 59e9e202..9a6e3018 100644 --- a/src/SFML/Graphics/RenderTarget.cpp +++ b/src/SFML/Graphics/RenderTarget.cpp @@ -708,7 +708,7 @@ void RenderTarget::drawPrimitives(PrimitiveType type, std::size_t firstVertex, s GLenum mode = modes[type]; // Draw the primitives - glCheck(glDrawArrays(mode, firstVertex, static_cast<GLsizei>(vertexCount))); + glCheck(glDrawArrays(mode, static_cast<GLint>(firstVertex), static_cast<GLsizei>(vertexCount))); } diff --git a/src/SFML/Network/TcpSocket.cpp b/src/SFML/Network/TcpSocket.cpp index e11f76b2..d8effa1c 100644 --- a/src/SFML/Network/TcpSocket.cpp +++ b/src/SFML/Network/TcpSocket.cpp @@ -246,7 +246,7 @@ Socket::Status TcpSocket::send(const void* data, std::size_t size, std::size_t& for (sent = 0; sent < size; sent += result) { // Send a chunk of data - result = ::send(getHandle(), static_cast<const char*>(data) + sent, size - sent, flags); + result = ::send(getHandle(), static_cast<const char*>(data) + sent, static_cast<int>(size - sent), flags); // Check for errors if (result < 0) From bcb013b45b89528608809bdd68b6a86cd0949b8c Mon Sep 17 00:00:00 2001 From: assematt <assenza.matteo@gmail.com> Date: Fri, 16 Dec 2016 10:52:19 -0500 Subject: [PATCH 102/211] Fixed bug in sf::Text when applying an outline color/thickness When applying an outline thickness to sf::Text in combination with a strikethrough and/or an underlined style, the ensureGeometryUpdate function adds unwanted vertices if the string contains two consecutive '\n' charecter. To fix this we need to add an additional check in the if statements to check if both the current and previous character it's a new line character. --- src/SFML/Graphics/Text.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 3773616d..fae7d9ac 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -444,12 +444,15 @@ void Text::ensureGeometryUpdate() const { Uint32 curChar = m_string[i]; + // Skip the \r char to avoid weird graphical issues + if (curChar == '\r') + continue; + // Apply the kerning offset x += m_font->getKerning(prevChar, curChar, m_characterSize); - prevChar = curChar; // If we're using the underlined style and there's a new line, draw a line - if (isUnderlined && (curChar == L'\n')) + if (isUnderlined && (curChar == L'\n' && prevChar != L'\n')) { addLine(m_vertices, x, y, m_fillColor, underlineOffset, underlineThickness); @@ -458,7 +461,7 @@ void Text::ensureGeometryUpdate() const } // If we're using the strike through style and there's a new line, draw a line across all characters - if (isStrikeThrough && (curChar == L'\n')) + if (isStrikeThrough && (curChar == L'\n' && prevChar != L'\n')) { addLine(m_vertices, x, y, m_fillColor, strikeThroughOffset, underlineThickness); @@ -466,6 +469,8 @@ void Text::ensureGeometryUpdate() const addLine(m_outlineVertices, x, y, m_outlineColor, strikeThroughOffset, underlineThickness, m_outlineThickness); } + prevChar = curChar; + // Handle special characters if ((curChar == L' ') || (curChar == L'\n') || (curChar == L'\t')) { From dc0dfd601ad33dbabeea427903417daef061c1d3 Mon Sep 17 00:00:00 2001 From: Mario Liebisch <mario.liebisch@gmail.com> Date: Sun, 29 Jul 2018 09:25:48 +0200 Subject: [PATCH 103/211] Squash duplicated sf::Font glyphs to single chars Before this change, `sf::Font` always rendered/provided one character per Unicode codepoint, even if that character wasn't represented by the current font file or duplicated. This caused more texture space to be used than necessary, which is especially apparent, when trying to render a large amount of unhandled glyphs (the texture would literally fill up with empty squares representing missing characters). --- src/SFML/Graphics/Font.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/SFML/Graphics/Font.cpp b/src/SFML/Graphics/Font.cpp index 45f6baf8..b6f5c604 100644 --- a/src/SFML/Graphics/Font.cpp +++ b/src/SFML/Graphics/Font.cpp @@ -71,10 +71,10 @@ namespace return output; } - // Combine outline thickness, boldness and codepoint into a single 64-bit key - sf::Uint64 combine(float outlineThickness, bool bold, sf::Uint32 codePoint) + // Combine outline thickness, boldness and font glyph index into a single 64-bit key + sf::Uint64 combine(float outlineThickness, bool bold, sf::Uint32 index) { - return (static_cast<sf::Uint64>(reinterpret<sf::Uint32>(outlineThickness)) << 32) | (static_cast<sf::Uint64>(bold) << 31) | codePoint; + return (static_cast<sf::Uint64>(reinterpret<sf::Uint32>(outlineThickness)) << 32) | (static_cast<sf::Uint64>(bold) << 31) | index; } } @@ -346,8 +346,8 @@ const Glyph& Font::getGlyph(Uint32 codePoint, unsigned int characterSize, bool b // Get the page corresponding to the character size GlyphTable& glyphs = m_pages[characterSize].glyphs; - // Build the key by combining the code point, bold flag, and outline thickness - Uint64 key = combine(outlineThickness, bold, codePoint); + // 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)); // Search the glyph into the cache GlyphTable::const_iterator it = glyphs.find(key); From f4f7ef0d705ba3eb4f1711cc5b556ae3ed7df748 Mon Sep 17 00:00:00 2001 From: Radek Dutkiewicz <radicdotkey@gmail.com> Date: Mon, 11 Jun 2018 13:00:21 +0100 Subject: [PATCH 104/211] Fixed glyph cropping on sub-pixel positioning of text Added 1 pixel padding for glyph uv's and increased glyph quads boundaries by 1 pixel so the glyphs aren't cropped when text is being scrolled with sub-pixel increments --- src/SFML/Graphics/Font.cpp | 1 + src/SFML/Graphics/Text.cpp | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/SFML/Graphics/Font.cpp b/src/SFML/Graphics/Font.cpp index b6f5c604..cafba5ba 100644 --- a/src/SFML/Graphics/Font.cpp +++ b/src/SFML/Graphics/Font.cpp @@ -727,6 +727,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.update(page.texture); page.texture.swap(newTexture); } diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index fae7d9ac..66875513 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -50,15 +50,17 @@ 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) { - 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; + float padding = 1.0; - float u1 = static_cast<float>(glyph.textureRect.left); - float v1 = static_cast<float>(glyph.textureRect.top); - float u2 = static_cast<float>(glyph.textureRect.left + glyph.textureRect.width); - float v2 = static_cast<float>(glyph.textureRect.top + glyph.textureRect.height); + float left = glyph.bounds.left - padding; + float top = glyph.bounds.top - padding; + float right = glyph.bounds.left + glyph.bounds.width + padding; + float bottom = glyph.bounds.top + glyph.bounds.height + padding; + + float u1 = static_cast<float>(glyph.textureRect.left) - padding; + float v1 = static_cast<float>(glyph.textureRect.top) - padding; + 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))); From ff87e1c92265574f5c9785117b00907b7a61cf7d Mon Sep 17 00:00:00 2001 From: PKEuS <kloke@uni-bonn.de> Date: Thu, 5 Jul 2018 12:10:39 +0200 Subject: [PATCH 105/211] Reduced context locking&unlocking while creating textures --- src/SFML/Graphics/Texture.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/SFML/Graphics/Texture.cpp b/src/SFML/Graphics/Texture.cpp index faeef7d7..fd94acf1 100644 --- a/src/SFML/Graphics/Texture.cpp +++ b/src/SFML/Graphics/Texture.cpp @@ -129,6 +129,11 @@ bool Texture::create(unsigned int width, unsigned int height) return false; } + TransientContextLock lock; + + // Make sure that extensions are initialized + priv::ensureExtensionsInit(); + // Compute the internal texture dimensions depending on NPOT textures support Vector2u actualSize(getValidSize(width), getValidSize(height)); @@ -150,8 +155,6 @@ bool Texture::create(unsigned int width, unsigned int height) m_pixelsFlipped = false; m_fboAttachment = false; - TransientContextLock lock; - // Create the OpenGL texture if it doesn't exist yet if (!m_texture) { @@ -160,9 +163,6 @@ bool Texture::create(unsigned int width, unsigned int height) m_texture = static_cast<unsigned int>(texture); } - // Make sure that extensions are initialized - priv::ensureExtensionsInit(); - // Make sure that the current texture binding will be preserved priv::TextureSaver save; @@ -851,11 +851,6 @@ unsigned int Texture::getNativeHandle() const //////////////////////////////////////////////////////////// unsigned int Texture::getValidSize(unsigned int size) { - TransientContextLock lock; - - // Make sure that extensions are initialized - priv::ensureExtensionsInit(); - if (GLEXT_texture_non_power_of_two) { // If hardware supports NPOT textures, then just return the unmodified size From 9712bb1ec8379cc29fd7417f64bc5e6b11cc4728 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Thu, 9 Aug 2018 22:20:35 +0200 Subject: [PATCH 106/211] Fixed the installation of pkg-config files * Removed duplicated CMake code * Made it possible to manually specify the pkg-config path * Install pkg-config files by default on Linux and BSD systems --- CMakeLists.txt | 39 ++++++++++++--------------------------- cmake/Config.cmake | 15 +++++---------- 2 files changed, 17 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb30b46c..8de83b3a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -269,30 +269,6 @@ if(SFML_OS_MACOSX) set(XCODE_TEMPLATES_ARCH "\$(NATIVE_ARCH_ACTUAL)") endif() -if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD) - set(PKGCONFIG_DIR lib${LIB_SUFFIX}/pkgconfig) - if(SFML_OS_FREEBSD OR SFML_OS_OPENBSD) - set(PKGCONFIG_DIR libdata/pkgconfig) - endif() - if(BUILD_SHARED_LIBS) - sfml_set_option(SFML_INSTALL_PKGCONFIG_FILES FALSE BOOL "TRUE to automatically install pkg-config files so other projects can find SFML") - if(SFML_INSTALL_PKGCONFIG_FILES) - foreach(sfml_module IN ITEMS all system window graphics audio network) - CONFIGURE_FILE( - "tools/pkg-config/sfml-${sfml_module}.pc.in" - "tools/pkg-config/sfml-${sfml_module}.pc" - @ONLY) - INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/tools/pkg-config/sfml-${sfml_module}.pc" - DESTINATION "${CMAKE_INSTALL_PREFIX}/${PKGCONFIG_DIR}") - endforeach() - endif() - else() - if(SFML_INSTALL_PKGCONFIG_FILES) - message(WARNING "No pkg-config files are provided for the static SFML libraries (SFML_INSTALL_PKGCONFIG_FILES will be ignored).") - endif() - endif() -endif() - # enable project folders set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake") @@ -306,16 +282,25 @@ if(SFML_BUILD_DOC) add_subdirectory(doc) endif() -sfml_set_option(SFML_INSTALL_PKGCONFIG_FILES FALSE BOOL "TRUE to automatically install pkg-config files so other projects can find SFML") +# 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) + set(SFML_INSTALL_PKGCONFIG_DEFAULT TRUE) +endif() + +sfml_set_option(SFML_INSTALL_PKGCONFIG_FILES ${SFML_INSTALL_PKGCONFIG_DEFAULT} BOOL "TRUE to automatically install pkg-config files so other projects can find SFML") + +if(SFML_INSTALL_PKGCONFIG_FILES) + sfml_set_option(SFML_PKGCONFIG_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/${SFML_PKGCONFIG_DIR}" PATH "Install directory for SFML's pkg-config .pc files") -if(SFML_OS_SUPPORTS_PKGCONFIG OR SFML_INSTALL_PKGCONFIG_FILES) foreach(sfml_module IN ITEMS all system window graphics audio network) CONFIGURE_FILE( "tools/pkg-config/sfml-${sfml_module}.pc.in" "tools/pkg-config/sfml-${sfml_module}.pc" @ONLY) INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/tools/pkg-config/sfml-${sfml_module}.pc" - DESTINATION "${CMAKE_INSTALL_PREFIX}/${SFML_OS_PKGCONFIG_DIR}") + DESTINATION "${SFML_PKGCONFIG_INSTALL_PREFIX}") endforeach() endif() diff --git a/cmake/Config.cmake b/cmake/Config.cmake index 82a094cd..0a286602 100644 --- a/cmake/Config.cmake +++ b/cmake/Config.cmake @@ -69,17 +69,12 @@ else() return() endif() -# check if OS or package system supports pkg-config +# set pkgconfig install directory # this could be e.g. macports on mac or msys2 on windows etc. -find_package(PkgConfig QUIET) -if(PKG_CONFIG_EXECUTABLE) - if(EXISTS "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/pkgconfig") - set(SFML_OS_SUPPORTS_PKGCONFIG ON) - set(SFML_OS_PKGCONFIG_DIR "/lib${LIB_SUFFIX}/pkgconfig") - elseif(EXISTS "${CMAKE_INSTALL_PREFIX}/libdata/pkgconfig") - set(SFML_OS_SUPPORTS_PKGCONFIG ON) - set(SFML_OS_PKGCONFIG_DIR "/libdata/pkgconfig") - endif() +set(SFML_PKGCONFIG_DIR "/lib${LIB_SUFFIX}/pkgconfig") + +if(SFML_OS_FREEBSD OR SFML_OS_OPENBSD) + set(SFML_PKGCONFIG_DIR "/libdata/pkgconfig") endif() # detect the compiler and its version From e3c65090ea8ecd8a54e85ded8d9a50a315c13d15 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Thu, 9 Aug 2018 15:32:26 -0700 Subject: [PATCH 107/211] Removed unnecessary cmake osx deployment target value --- CMakeLists.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8de83b3a..9eb250ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,9 +32,6 @@ endif() 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_DEPLOYMENT_TARGET) - set(CMAKE_OSX_DEPLOYMENT_TARGET "10.7" CACHE STRING "macOS deployement target; 10.7+ 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 @@ -260,11 +257,6 @@ if(SFML_OS_MACOSX) message(FATAL_ERROR "Only 64-bit architecture is supported") endif() - # Ensure macOS 10.7+ is used - if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS "10.7") - message(FATAL_ERROR "macOS 10.7 or greater is required for the deployment target.") - endif() - # configure Xcode templates set(XCODE_TEMPLATES_ARCH "\$(NATIVE_ARCH_ACTUAL)") endif() From 43f0292cb81da0858a4462530848df528e575337 Mon Sep 17 00:00:00 2001 From: Kwasior <kamilkw@op.pl> Date: Tue, 14 Aug 2018 14:59:57 +0200 Subject: [PATCH 108/211] Fix audio components linking order --- cmake/SFMLConfigDependencies.cmake.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/SFMLConfigDependencies.cmake.in b/cmake/SFMLConfigDependencies.cmake.in index 97f33c01..1028110f 100644 --- a/cmake/SFMLConfigDependencies.cmake.in +++ b/cmake/SFMLConfigDependencies.cmake.in @@ -70,12 +70,12 @@ if(SFML_STATIC_LIBRARIES) list(FIND SFML_FIND_COMPONENTS "audio" FIND_SFML_AUDIO_COMPONENT_INDEX) if(FIND_SFML_AUDIO_COMPONENT_INDEX GREATER -1) sfml_bind_dependency(TARGET OpenAL FRIENDLY_NAME "OpenAL" SEARCH_NAMES "OpenAL" "openal" "openal32") - sfml_bind_dependency(TARGET Vorbis FRIENDLY_NAME "Ogg" SEARCH_NAMES "ogg") - sfml_bind_dependency(TARGET Vorbis FRIENDLY_NAME "Vorbis" SEARCH_NAMES "vorbis") 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") 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 FLAC FRIENDLY_NAME "FLAC" SEARCH_NAMES "FLAC") endif() From 83d05ea8228790d2a44ba8393393fb7a57ee498b Mon Sep 17 00:00:00 2001 From: Elias Daler <eliasdaler@yandex.ru> Date: Tue, 14 Aug 2018 00:06:31 +0300 Subject: [PATCH 109/211] Fix CMP0072 CMake warning - also allow user to set OpenGL_GL_PREFERENCE --- src/SFML/Window/CMakeLists.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index 916c1dcd..1fe8b5a4 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -235,6 +235,13 @@ if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OPENBSD) target_link_libraries(sfml-window PRIVATE X11) endif() +# 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) +# See CMP0072 for more details (cmake --help-policy CMP0072) +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") @@ -242,7 +249,7 @@ if(SFML_OPENGL_ES) target_link_libraries(sfml-window PRIVATE EGL GLESv1_CM) endif() else() - sfml_find_package(OpenGL INCLUDE "OPENGL_INCLUDE_DIR" LINK "OPENGL_gl_LIBRARY") + sfml_find_package(OpenGL INCLUDE "OPENGL_INCLUDE_DIR" LINK "OPENGL_LIBRARIES") target_link_libraries(sfml-window PRIVATE OpenGL) endif() From 1cd7ad6a240ee404928be96b87c2f47163f39422 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Mon, 27 Aug 2018 13:36:57 +0100 Subject: [PATCH 110/211] Remove reference to unused CMAKE_OSX_DEPLOYMENT_TARGET in cocoa example --- examples/cocoa/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cocoa/CMakeLists.txt b/examples/cocoa/CMakeLists.txt index ff63cc07..dfa46be5 100644 --- a/examples/cocoa/CMakeLists.txt +++ b/examples/cocoa/CMakeLists.txt @@ -20,7 +20,7 @@ function(compile_xib) endif() # Default args taken from Xcode 9 when it generates a nib from a xib - set(DEFAULT_ARGS --errors --warnings --notices --module cocoa --auto-activate-custom-fonts --target-device mac --minimum-deployment-target ${CMAKE_OSX_DEPLOYMENT_TARGET} --output-format human-readable-text) + set(DEFAULT_ARGS --errors --warnings --notices --module cocoa --auto-activate-custom-fonts --target-device mac --output-format human-readable-text) add_custom_command(OUTPUT "${THIS_OUTPUT}" COMMAND "${IBTOOL}" ${DEFAULT_ARGS} "${THIS_INPUT}" --compile "${THIS_OUTPUT}" From 0bcb2992a799a10054c76add2745b72d5b130070 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Tue, 10 Apr 2018 20:52:38 -0700 Subject: [PATCH 111/211] Implemented extra cursors on macOS --- include/SFML/Window/Cursor.hpp | 33 +++++++++++++++++-------------- src/SFML/Window/OSX/CursorImpl.mm | 22 +++++++++++++++++++++ 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/include/SFML/Window/Cursor.hpp b/include/SFML/Window/Cursor.hpp index 30aebd40..bf7bb0b6 100644 --- a/include/SFML/Window/Cursor.hpp +++ b/include/SFML/Window/Cursor.hpp @@ -53,21 +53,24 @@ public: /// Refer to the following table to determine which cursor /// is available on which platform. /// - /// Type | Linux | Mac OS X | Windows | - /// ------------------------------------|:-----:|:--------:|:--------:| - /// sf::Cursor::Arrow | yes | yes | yes | - /// sf::Cursor::ArrowWait | no | no | yes | - /// sf::Cursor::Wait | yes | no | yes | - /// sf::Cursor::Text | yes | yes | yes | - /// sf::Cursor::Hand | yes | yes | yes | - /// sf::Cursor::SizeHorizontal | yes | yes | yes | - /// sf::Cursor::SizeVertical | yes | yes | yes | - /// sf::Cursor::SizeTopLeftBottomRight | no | no | yes | - /// sf::Cursor::SizeBottomLeftTopRight | no | no | yes | - /// sf::Cursor::SizeAll | yes | no | yes | - /// sf::Cursor::Cross | yes | yes | yes | - /// sf::Cursor::Help | yes | no | yes | - /// sf::Cursor::NotAllowed | yes | yes | yes | + /// Type | Linux | Mac OS X | Windows + /// ------------------------------------|:-----:|:--------:|:--------: + /// sf::Cursor::Arrow | yes | yes | yes + /// sf::Cursor::ArrowWait | no | no | yes + /// sf::Cursor::Wait | yes | no | yes + /// sf::Cursor::Text | yes | yes | yes + /// sf::Cursor::Hand | yes | yes | yes + /// sf::Cursor::SizeHorizontal | yes | yes | yes + /// sf::Cursor::SizeVertical | yes | yes | yes + /// sf::Cursor::SizeTopLeftBottomRight | no | yes* | yes + /// sf::Cursor::SizeBottomLeftTopRight | no | yes* | yes + /// sf::Cursor::SizeAll | yes | no | yes + /// sf::Cursor::Cross | yes | yes | yes + /// sf::Cursor::Help | yes | yes* | yes + /// sf::Cursor::NotAllowed | yes | yes | yes + /// + /// * These cursor types are undocumented so may not + /// be available on all versions, but have been tested on 10.13 /// //////////////////////////////////////////////////////////// enum Type diff --git a/src/SFML/Window/OSX/CursorImpl.mm b/src/SFML/Window/OSX/CursorImpl.mm index 5f413763..c5242505 100644 --- a/src/SFML/Window/OSX/CursorImpl.mm +++ b/src/SFML/Window/OSX/CursorImpl.mm @@ -65,6 +65,16 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot return m_cursor != nil; } +//////////////////////////////////////////////////////////// +bool loadFromSelector(SEL selector, NSCursorRef& cursor) +{ + if ([NSCursor respondsToSelector:selector]) + { + cursor = [NSCursor performSelector:selector]; + return true; + } + return false; +} //////////////////////////////////////////////////////////// bool CursorImpl::loadFromSystem(Cursor::Type type) @@ -80,6 +90,18 @@ bool CursorImpl::loadFromSystem(Cursor::Type type) case Cursor::SizeVertical: m_cursor = [NSCursor resizeUpDownCursor]; break; case Cursor::Cross: m_cursor = [NSCursor crosshairCursor]; break; case Cursor::NotAllowed: m_cursor = [NSCursor operationNotAllowedCursor]; break; + + // These cursor types are undocumented, may not be available on some platforms + case Cursor::SizeBottomLeftTopRight: + return loadFromSelector(@selector(_windowResizeNorthEastSouthWestCursor), m_cursor); + case Cursor::SizeTopLeftBottomRight: + return loadFromSelector(@selector(_windowResizeNorthWestSouthEastCursor), m_cursor); + case Cursor::SizeAll: + return loadFromSelector(@selector(_moveCursor), m_cursor); + case Cursor::Wait: + return loadFromSelector(@selector(_waitCursor), m_cursor); + case Cursor::Help: + return loadFromSelector(@selector(_helpCursor), m_cursor); } // Since we didn't allocate the cursor ourself, we have to retain it From aeca3dce4119b8998607c6d246c6212aff6f75f7 Mon Sep 17 00:00:00 2001 From: Marco Antognini <antognini.marco@gmail.com> Date: Fri, 20 Apr 2018 07:50:14 +0200 Subject: [PATCH 112/211] Improved macOS implementation for Cursor - remove Wait and SizeAll cursors as they don't look nice (Wait is not spining and produces a broken rendering, SizeAll is a simple white cursor.) - fix memory management for NSCursor. - ignore selector warnings. --- include/SFML/Window/Cursor.hpp | 30 ++++++++--------- src/SFML/Window/OSX/CursorImpl.mm | 56 ++++++++++++++++++------------- 2 files changed, 48 insertions(+), 38 deletions(-) diff --git a/include/SFML/Window/Cursor.hpp b/include/SFML/Window/Cursor.hpp index bf7bb0b6..9daa13bd 100644 --- a/include/SFML/Window/Cursor.hpp +++ b/include/SFML/Window/Cursor.hpp @@ -53,21 +53,21 @@ public: /// Refer to the following table to determine which cursor /// is available on which platform. /// - /// Type | Linux | Mac OS X | Windows - /// ------------------------------------|:-----:|:--------:|:--------: - /// sf::Cursor::Arrow | yes | yes | yes - /// sf::Cursor::ArrowWait | no | no | yes - /// sf::Cursor::Wait | yes | no | yes - /// sf::Cursor::Text | yes | yes | yes - /// sf::Cursor::Hand | yes | yes | yes - /// sf::Cursor::SizeHorizontal | yes | yes | yes - /// sf::Cursor::SizeVertical | yes | yes | yes - /// sf::Cursor::SizeTopLeftBottomRight | no | yes* | yes - /// sf::Cursor::SizeBottomLeftTopRight | no | yes* | yes - /// sf::Cursor::SizeAll | yes | no | yes - /// sf::Cursor::Cross | yes | yes | yes - /// sf::Cursor::Help | yes | yes* | yes - /// sf::Cursor::NotAllowed | yes | yes | yes + /// Type | Linux | Mac OS X | Windows | + /// ------------------------------------|:-----:|:--------:|:--------:| + /// sf::Cursor::Arrow | yes | yes | yes | + /// sf::Cursor::ArrowWait | no | no | yes | + /// sf::Cursor::Wait | yes | no | yes | + /// sf::Cursor::Text | yes | yes | yes | + /// sf::Cursor::Hand | yes | yes | yes | + /// sf::Cursor::SizeHorizontal | yes | yes | yes | + /// sf::Cursor::SizeVertical | yes | yes | yes | + /// sf::Cursor::SizeTopLeftBottomRight | no | yes* | yes | + /// sf::Cursor::SizeBottomLeftTopRight | no | yes* | yes | + /// sf::Cursor::SizeAll | yes | no | yes | + /// sf::Cursor::Cross | yes | yes | yes | + /// sf::Cursor::Help | yes | yes* | yes | + /// sf::Cursor::NotAllowed | yes | yes | yes | /// /// * These cursor types are undocumented so may not /// be available on all versions, but have been tested on 10.13 diff --git a/src/SFML/Window/OSX/CursorImpl.mm b/src/SFML/Window/OSX/CursorImpl.mm index c5242505..ed905ef5 100644 --- a/src/SFML/Window/OSX/CursorImpl.mm +++ b/src/SFML/Window/OSX/CursorImpl.mm @@ -32,6 +32,21 @@ #import <SFML/Window/OSX/NSImage+raw.h> #import <AppKit/AppKit.h> +namespace +{ + +//////////////////////////////////////////////////////////// +NSCursor* loadFromSelector(SEL selector) +{ + // The caller is responsible for retaining the cursor. + if ([NSCursor respondsToSelector:selector]) + return [NSCursor performSelector:selector]; + else + return nil; +} + +} + namespace sf { namespace priv @@ -56,6 +71,8 @@ CursorImpl::~CursorImpl() //////////////////////////////////////////////////////////// bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot) { + [m_cursor release]; + NSSize nssize = NSMakeSize(size.x, size.y); NSImage* image = [NSImage imageWithRawData:pixels andSize:nssize]; NSPoint nshotspot = NSMakePoint(hotspot.x, hotspot.y); @@ -65,20 +82,11 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot return m_cursor != nil; } -//////////////////////////////////////////////////////////// -bool loadFromSelector(SEL selector, NSCursorRef& cursor) -{ - if ([NSCursor respondsToSelector:selector]) - { - cursor = [NSCursor performSelector:selector]; - return true; - } - return false; -} - //////////////////////////////////////////////////////////// bool CursorImpl::loadFromSystem(Cursor::Type type) { + [m_cursor release]; + switch (type) { default: return false; @@ -92,24 +100,26 @@ bool CursorImpl::loadFromSystem(Cursor::Type type) case Cursor::NotAllowed: m_cursor = [NSCursor operationNotAllowedCursor]; 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::SizeBottomLeftTopRight: - return loadFromSelector(@selector(_windowResizeNorthEastSouthWestCursor), m_cursor); + m_cursor = loadFromSelector(@selector(_windowResizeNorthEastSouthWestCursor)); + break; + case Cursor::SizeTopLeftBottomRight: - return loadFromSelector(@selector(_windowResizeNorthWestSouthEastCursor), m_cursor); - case Cursor::SizeAll: - return loadFromSelector(@selector(_moveCursor), m_cursor); - case Cursor::Wait: - return loadFromSelector(@selector(_waitCursor), m_cursor); + m_cursor = loadFromSelector(@selector(_windowResizeNorthWestSouthEastCursor)); + break; + case Cursor::Help: - return loadFromSelector(@selector(_helpCursor), m_cursor); + m_cursor = loadFromSelector(@selector(_helpCursor)); + break; +#pragma clang diagnostic pop } - // Since we didn't allocate the cursor ourself, we have to retain it - // in order to not break the retain count. - [m_cursor retain]; + if (m_cursor) + [m_cursor retain]; - // For all non-default cases, it was a success. - return true; + return m_cursor != nil; } From 2bba983f1d90b26fac4560600a226156e6721b2a Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Thu, 23 Aug 2018 20:00:44 +0100 Subject: [PATCH 113/211] Disable autocorrect on iOS for issue #1473 --- src/SFML/Window/iOS/SFView.mm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/SFML/Window/iOS/SFView.mm b/src/SFML/Window/iOS/SFView.mm index 063c61a3..940d0a8e 100644 --- a/src/SFML/Window/iOS/SFView.mm +++ b/src/SFML/Window/iOS/SFView.mm @@ -202,5 +202,11 @@ return self; } +//////////////////////////////////////////////////////////// +- (UITextAutocorrectionType) autocorrectionType +{ + return UITextAutocorrectionTypeNo; +} + @end From be3556d76ab956bab63d96b1d117546e6bf9897e Mon Sep 17 00:00:00 2001 From: Jeff <jeffswenson@betterthannull.com> Date: Fri, 11 Aug 2017 11:36:16 -0700 Subject: [PATCH 114/211] Fix Deadlock in Android Main Cleanup --- src/SFML/Main/MainAndroid.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/SFML/Main/MainAndroid.cpp b/src/SFML/Main/MainAndroid.cpp index fe67bbad..5e621339 100644 --- a/src/SFML/Main/MainAndroid.cpp +++ b/src/SFML/Main/MainAndroid.cpp @@ -93,6 +93,13 @@ static void initializeMain(ActivityStates* states) ALooper* looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); 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 + * input queue. + */ + ALooper_acquire(states->looper); + // Get the default configuration states->config = AConfiguration_new(); AConfiguration_fromAssetManager(states->config, states->activity->assetManager); @@ -338,7 +345,7 @@ static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* wind // Wait for the event to be taken into account by SFML states->updated = false; - while(!states->updated) + while(!(states->updated | states->terminated)) { states->mutex.unlock(); sf::sleep(sf::milliseconds(10)); @@ -363,7 +370,7 @@ static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* wi // Wait for the event to be taken into account by SFML states->updated = false; - while(!states->updated) + while(!(states->updated | states->terminated)) { states->mutex.unlock(); sf::sleep(sf::milliseconds(10)); @@ -410,8 +417,10 @@ static void onInputQueueDestroyed(ANativeActivity* activity, AInputQueue* queue) { sf::Lock lock(states->mutex); - states->inputQueue = NULL; AInputQueue_detachLooper(queue); + states->inputQueue = NULL; + + ALooper_release(states->looper); } } @@ -542,7 +551,7 @@ JNIEXPORT void ANativeActivity_onCreate(ANativeActivity* activity, void* savedSt // Wait for the main thread to be initialized states->mutex.lock(); - while (!states->initialized) + while (!(states->initialized | states->terminated)) { states->mutex.unlock(); sf::sleep(sf::milliseconds(20)); From 87aaa9e145659d6a8fc193ab8540cf847d4d0def Mon Sep 17 00:00:00 2001 From: Christian Widmer <cwidmer@umbrox.de> Date: Thu, 16 Aug 2018 02:04:12 +0200 Subject: [PATCH 115/211] Window/Unix: Fix compilation with glxext header versions >=20180525 When mesa updated their headers, they changed the include guard from __glxext_h_ to __glx_glxext_h_, which breaks compilation due to conflicting declarations. This commit modifies the preprocessor directives to allow for compilation with older and newer mesa header versions. Fixes: #1472 --- src/SFML/Window/Unix/GlxExtensions.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SFML/Window/Unix/GlxExtensions.hpp b/src/SFML/Window/Unix/GlxExtensions.hpp index abbb132a..fb2c7da8 100644 --- a/src/SFML/Window/Unix/GlxExtensions.hpp +++ b/src/SFML/Window/Unix/GlxExtensions.hpp @@ -25,11 +25,12 @@ #ifndef SF_POINTER_C_GENERATED_HEADER_GLXWIN_HPP #define SF_POINTER_C_GENERATED_HEADER_GLXWIN_HPP -#ifdef __glxext_h_ +#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> From 46ce05cd9c336020e911a1f6a3486132dc31b679 Mon Sep 17 00:00:00 2001 From: Bloodsword <bloodsword@seleniteforge.com> Date: Wed, 1 Nov 2017 19:34:45 +0100 Subject: [PATCH 116/211] Use XRRSetCrtcConfig instead of XRRSetScreenConfig, in order to fix issue #1226. It should also fix issue #1224. --- src/SFML/Window/Unix/WindowImplX11.cpp | 313 ++++++++++++++++++++----- src/SFML/Window/Unix/WindowImplX11.hpp | 34 +++ 2 files changed, 292 insertions(+), 55 deletions(-) diff --git a/src/SFML/Window/Unix/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index ee5bf356..da697505 100644 --- a/src/SFML/Window/Unix/WindowImplX11.cpp +++ b/src/SFML/Window/Unix/WindowImplX11.cpp @@ -174,7 +174,7 @@ namespace if (result != Success || actualType != XA_WINDOW || numItems != 1) { - if(result == Success) + if (result == Success) XFree(data); sf::priv::CloseDisplay(display); @@ -206,7 +206,7 @@ namespace if (result != Success || actualType != XA_WINDOW || numItems != 1) { - if(result == Success) + if (result == Success) XFree(data); sf::priv::CloseDisplay(display); @@ -270,7 +270,7 @@ namespace windowManagerName = sf::String::fromUtf8(begin, end); } - if(result == Success) + if (result == Success) XFree(data); sf::priv::CloseDisplay(display); @@ -487,6 +487,7 @@ m_inputMethod (NULL), m_inputContext (NULL), m_isExternal (true), m_oldVideoMode (0), +m_oldRRCrtc (0), m_hiddenCursor (0), m_lastCursor (None), m_keyRepeat (true), @@ -535,6 +536,7 @@ m_inputMethod (NULL), m_inputContext (NULL), m_isExternal (false), m_oldVideoMode (0), +m_oldRRCrtc (0), m_hiddenCursor (0), m_lastCursor (None), m_keyRepeat (true), @@ -556,8 +558,17 @@ m_lastInputTime (0) m_screen = DefaultScreen(m_display); // Compute position and size - int left = m_fullscreen ? 0 : (DisplayWidth(m_display, m_screen) - mode.width) / 2; - int top = m_fullscreen ? 0 : (DisplayHeight(m_display, m_screen) - mode.height) / 2; + Vector2i windowPosition; + if(m_fullscreen) + { + windowPosition = getPrimaryMonitorPosition(); + } + else + { + windowPosition.x = (DisplayWidth(m_display, m_screen) - mode.width) / 2; + windowPosition.y = (DisplayWidth(m_display, m_screen) - mode.height) / 2; + } + int width = mode.width; int height = mode.height; @@ -572,7 +583,7 @@ m_lastInputTime (0) m_window = XCreateWindow(m_display, DefaultRootWindow(m_display), - left, top, + windowPosition.x, windowPosition.y, width, height, 0, visualInfo.depth, @@ -669,9 +680,11 @@ m_lastInputTime (0) { m_useSizeHints = true; XSizeHints* sizeHints = XAllocSizeHints(); - sizeHints->flags = PMinSize | PMaxSize; + sizeHints->flags = PMinSize | PMaxSize | USPosition; sizeHints->min_width = sizeHints->max_width = width; sizeHints->min_height = sizeHints->max_height = height; + sizeHints->x = windowPosition.x; + sizeHints->y = windowPosition.y; XSetWMNormalHints(m_display, m_window, sizeHints); XFree(sizeHints); } @@ -708,7 +721,15 @@ m_lastInputTime (0) // Set fullscreen video mode and switch to fullscreen if necessary if (m_fullscreen) { - setPosition(Vector2i(0, 0)); + // Disable hint for min and max size, + // otherwise some windows managers will not remove window decorations + XSizeHints *sizeHints = XAllocSizeHints(); + long flags = 0; + XGetWMNormalHints(m_display, m_window, sizeHints, &flags); + sizeHints->flags &= ~(PMinSize | PMaxSize); + XSetWMNormalHints(m_display, m_window, sizeHints); + XFree(sizeHints); + setVideoMode(mode); switchToFullscreen(); } @@ -722,11 +743,11 @@ WindowImplX11::~WindowImplX11() cleanup(); // Destroy icon pixmap - if(m_iconPixmap) + if (m_iconPixmap) XFreePixmap(m_display, m_iconPixmap); // Destroy icon mask pixmap - if(m_iconMaskPixmap) + if (m_iconMaskPixmap) XFreePixmap(m_display, m_iconMaskPixmap); // Destroy the cursor @@ -960,10 +981,10 @@ void WindowImplX11::setIcon(unsigned int width, unsigned int height, const Uint8 return; } - if(m_iconPixmap) + if (m_iconPixmap) XFreePixmap(m_display, m_iconPixmap); - if(m_iconMaskPixmap) + if (m_iconMaskPixmap) XFreePixmap(m_display, m_iconMaskPixmap); m_iconPixmap = XCreatePixmap(m_display, RootWindow(m_display, m_screen), width, height, defDepth); @@ -1240,53 +1261,99 @@ void WindowImplX11::setVideoMode(const VideoMode& mode) return; // Check if the XRandR extension is present - int version; - if (!XQueryExtension(m_display, "RANDR", &version, &version, &version)) + int xRandRMajor, xRandRMinor; + if (!checkXRandR(xRandRMajor, xRandRMinor)) { // XRandR extension is not supported: we cannot use fullscreen mode err() << "Fullscreen is not supported, switching to window mode" << std::endl; return; } - // Get the current configuration - XRRScreenConfiguration* config = XRRGetScreenInfo(m_display, RootWindow(m_display, m_screen)); + // Get root window + ::Window rootWindow = RootWindow(m_display, m_screen); - if (!config) + // Get the screen resources + XRRScreenResources* res = XRRGetScreenResources(m_display, rootWindow); + if (!res) { - // Failed to get the screen configuration - err() << "Failed to get the current screen configuration for fullscreen mode, switching to window mode" << std::endl; + err() << "Failed to get the current screen resources for fullscreen mode, switching to window mode" << std::endl; + return; + } + + RROutput output = getOutputPrimary(rootWindow, res, xRandRMajor, xRandRMinor); + + // Get output info from output + XRROutputInfo* outputInfo = XRRGetOutputInfo(m_display, res, output); + if (!outputInfo || outputInfo->connection == RR_Disconnected) + { + XRRFreeScreenResources(res); + + // If outputInfo->connection == RR_Disconnected, free output info + if (outputInfo) + XRRFreeOutputInfo(outputInfo); + + err() << "Failed to get output info for fullscreen mode, switching to window mode" << std::endl; + return; + } + + // Retreive current RRMode, screen position and rotation + XRRCrtcInfo* crtcInfo = XRRGetCrtcInfo(m_display, res, outputInfo->crtc); + if (!crtcInfo) + { + XRRFreeScreenResources(res); + XRRFreeOutputInfo(outputInfo); + err() << "Failed to get crtc info for fullscreen mode, switching to window mode" << std::endl; + return; + } + + // Find RRMode to set + bool modeFound = false; + RRMode xRandMode; + + for (int i = 0; (i < res->nmode) && !modeFound; i++) + { + if (crtcInfo->rotation == RR_Rotate_90 || crtcInfo->rotation == RR_Rotate_270) + 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)) + { + xRandMode = res->modes[i].id; + modeFound = true; + } + } + + if (!modeFound) + { + XRRFreeScreenResources(res); + XRRFreeOutputInfo(outputInfo); + err() << "Failed to find a matching RRMode for fullscreen mode, switching to window mode" << std::endl; return; } // Save the current video mode before we switch to fullscreen - Rotation currentRotation; - m_oldVideoMode = XRRConfigCurrentConfiguration(config, ¤tRotation); + m_oldVideoMode = crtcInfo->mode; + m_oldRRCrtc = outputInfo->crtc; - // Get the available screen sizes - int nbSizes; - XRRScreenSize* sizes = XRRConfigSizes(config, &nbSizes); + // Switch to fullscreen mode + XRRSetCrtcConfig(m_display, + res, + outputInfo->crtc, + CurrentTime, + crtcInfo->x, + crtcInfo->y, + xRandMode, + crtcInfo->rotation, + &output, + 1); - // Search for a matching size - for (int i = 0; (sizes && i < nbSizes); ++i) - { - XRRConfigRotations(config, ¤tRotation); + // Set "this" as the current fullscreen window + fullscreenWindow = this; - if (currentRotation == RR_Rotate_90 || currentRotation == RR_Rotate_270) - std::swap(sizes[i].height, sizes[i].width); - - if ((sizes[i].width == static_cast<int>(mode.width)) && (sizes[i].height == static_cast<int>(mode.height))) - { - // Switch to fullscreen mode - XRRSetScreenConfig(m_display, config, RootWindow(m_display, m_screen), i, currentRotation, CurrentTime); - - // Set "this" as the current fullscreen window - fullscreenWindow = this; - break; - } - } - - // Free the configuration instance - XRRFreeScreenConfigInfo(config); + XRRFreeScreenResources(res); + XRRFreeOutputInfo(outputInfo); + XRRFreeCrtcInfo(crtcInfo); } @@ -1295,19 +1362,55 @@ void WindowImplX11::resetVideoMode() { if (fullscreenWindow == this) { - // Get current screen info - XRRScreenConfiguration* config = XRRGetScreenInfo(m_display, RootWindow(m_display, m_screen)); - if (config) + // Try to set old configuration + // Check if the XRandR extension + int xRandRMajor, xRandRMinor; + if (checkXRandR(xRandRMajor, xRandRMinor)) { - // Get the current rotation - Rotation currentRotation; - XRRConfigCurrentConfiguration(config, ¤tRotation); + XRRScreenResources* res = XRRGetScreenResources(m_display, DefaultRootWindow(m_display)); + if (!res) + { + err() << "Failed to get the current screen resources to reset the video mode" << std::endl; + return; + } - // Reset the video mode - XRRSetScreenConfig(m_display, config, RootWindow(m_display, m_screen), m_oldVideoMode, currentRotation, CurrentTime); + // Retreive current screen position and rotation + XRRCrtcInfo* crtcInfo = XRRGetCrtcInfo(m_display, res, m_oldRRCrtc); + if (!crtcInfo) + { + XRRFreeScreenResources(res); + err() << "Failed to get crtc info to reset the video mode" << std::endl; + return; + } - // Free the configuration instance - XRRFreeScreenConfigInfo(config); + RROutput output; + + // if version >= 1.3 get the primary screen else take the first screen + if ((xRandRMajor == 1 && xRandRMinor >= 3) || xRandRMajor > 1) + { + output = XRRGetOutputPrimary(m_display, DefaultRootWindow(m_display)); + + // Check if returned output is valid, otherwise use the first screen + if (output == None) + output = res->outputs[0]; + } + else{ + output = res->outputs[0]; + } + + XRRSetCrtcConfig(m_display, + res, + m_oldRRCrtc, + CurrentTime, + crtcInfo->x, + crtcInfo->y, + m_oldVideoMode, + crtcInfo->rotation, + &output, + 1); + + XRRFreeCrtcInfo(crtcInfo); + XRRFreeScreenResources(res); } // Reset the fullscreen window @@ -1503,7 +1606,7 @@ void WindowImplX11::updateLastInputTime(::Time time) { Atom netWmUserTime = getAtom("_NET_WM_USER_TIME", true); - if(netWmUserTime) + if (netWmUserTime) { XChangeProperty(m_display, m_window, @@ -1973,6 +2076,106 @@ bool WindowImplX11::processEvent(XEvent& windowEvent) return true; } + +//////////////////////////////////////////////////////////// +bool WindowImplX11::checkXRandR(int& xRandRMajor, int& xRandRMinor) +{ + // Check if the XRandR extension is present + int version; + if (!XQueryExtension(m_display, "RANDR", &version, &version, &version)) + { + err() << "XRandR extension is not supported" << std::endl; + return false; + } + + // Check XRandR version, 1.2 required + if (!XRRQueryVersion(m_display, &xRandRMajor, &xRandRMinor) || xRandRMajor < 1 || (xRandRMajor == 1 && xRandRMinor < 2 )) + { + err() << "XRandR is too old" << std::endl; + return false; + } + + return true; +} + + +//////////////////////////////////////////////////////////// +RROutput WindowImplX11::getOutputPrimary(::Window& rootWindow, XRRScreenResources* res, int xRandRMajor, int xRandRMinor) +{ + // if xRandR version >= 1.3 get the primary screen else take the first screen + if ((xRandRMajor == 1 && xRandRMinor >= 3) || xRandRMajor > 1) + { + RROutput output = XRRGetOutputPrimary(m_display, rootWindow); + + // Check if returned output is valid, otherwise use the first screen + if (output == None) + return res->outputs[0]; + else + return output; + } + + // xRandr version can't get the primary screen, use the first screen + return res->outputs[0]; +} + + +//////////////////////////////////////////////////////////// +Vector2i WindowImplX11::getPrimaryMonitorPosition() +{ + Vector2i monitorPosition; + + // Get root window + ::Window rootWindow = RootWindow(m_display, m_screen); + + // Get the screen resources + XRRScreenResources* res = XRRGetScreenResources(m_display, rootWindow); + if (!res) + { + err() << "Failed to get the current screen resources for.primary monitor position" << std::endl; + return monitorPosition; + } + + // Get xRandr version + int xRandRMajor, xRandRMinor; + if (!checkXRandR(xRandRMajor, xRandRMinor)) + xRandRMajor = xRandRMinor = 0; + + RROutput output = getOutputPrimary(rootWindow, res, xRandRMajor, xRandRMinor); + + // Get output info from output + XRROutputInfo* outputInfo = XRRGetOutputInfo(m_display, res, output); + if (!outputInfo || outputInfo->connection == RR_Disconnected) + { + XRRFreeScreenResources(res); + + // If outputInfo->connection == RR_Disconnected, free output info + if (outputInfo) + XRRFreeOutputInfo(outputInfo); + + err() << "Failed to get output info for.primary monitor position" << std::endl; + return monitorPosition; + } + + // Retreive current RRMode, screen position and rotation + XRRCrtcInfo* crtcInfo = XRRGetCrtcInfo(m_display, res, outputInfo->crtc); + if (!crtcInfo) + { + XRRFreeScreenResources(res); + XRRFreeOutputInfo(outputInfo); + err() << "Failed to get crtc info for.primary monitor position" << std::endl; + return monitorPosition; + } + + monitorPosition.x = crtcInfo->x; + monitorPosition.y = crtcInfo->y; + + XRRFreeCrtcInfo(crtcInfo); + XRRFreeOutputInfo(outputInfo); + XRRFreeScreenResources(res); + + return monitorPosition; +} + } // namespace priv } // namespace sf diff --git a/src/SFML/Window/Unix/WindowImplX11.hpp b/src/SFML/Window/Unix/WindowImplX11.hpp index 0ff694b1..a025a1ae 100644 --- a/src/SFML/Window/Unix/WindowImplX11.hpp +++ b/src/SFML/Window/Unix/WindowImplX11.hpp @@ -34,6 +34,7 @@ #include <SFML/Window/WindowStyle.hpp> // Prevent conflict with macro None from Xlib #include <X11/Xlib.h> #include <deque> +#include <X11/extensions/Xrandr.h> namespace sf @@ -264,6 +265,38 @@ private: //////////////////////////////////////////////////////////// bool processEvent(XEvent& windowEvent); + //////////////////////////////////////////////////////////// + /// \brief Check if a valid version of XRandR extension is present + /// + /// \param xRandRMajor XRandR major version + /// \param xRandRMinor XRandR minor version + /// + /// \return True if a valid XRandR version found, false otherwise + /// + //////////////////////////////////////////////////////////// + bool checkXRandR(int& xRandRMajor, int& xRandRMinor); + + //////////////////////////////////////////////////////////// + /// \brief Get the RROutput of the primary monitor + /// + /// \param rootWindow the root window + /// \param res screen resources + /// \param xRandRMajor XRandR major version + /// \param xRandRMinor XRandR minor version + /// + /// \return RROutput of the primary monitor + /// + //////////////////////////////////////////////////////////// + RROutput getOutputPrimary(::Window& rootWindow, XRRScreenResources* res, int xRandRMajor, int xRandRMinor); + + //////////////////////////////////////////////////////////// + /// \brief Get coordinates of the primary monitor + /// + /// \return Position of the primary monitor + /// + //////////////////////////////////////////////////////////// + Vector2i getPrimaryMonitorPosition(); + //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// @@ -275,6 +308,7 @@ private: 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? From 5e10e1f0c9b0a5c095df0f8e9be96914f75297d0 Mon Sep 17 00:00:00 2001 From: Mario Liebisch <mario.liebisch@gmail.com> Date: Thu, 9 Aug 2018 13:03:14 +0200 Subject: [PATCH 117/211] Windows: Fixed swapped colors for custom cursors Previously the red and blue color channels were swapped, since Windows expects a different channel order for DIBs. This fixes issue #1464. --- src/SFML/Window/Win32/CursorImpl.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/SFML/Window/Win32/CursorImpl.cpp b/src/SFML/Window/Win32/CursorImpl.cpp index 28f42744..2bbaab5f 100755 --- a/src/SFML/Window/Win32/CursorImpl.cpp +++ b/src/SFML/Window/Win32/CursorImpl.cpp @@ -89,7 +89,15 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot } // Fill our bitmap with the cursor color data - std::memcpy(bitmapData, pixels, size.x * size.y * 4); + // We'll have to swap the red and blue channels here + Uint8* bitmapOffset = bitmapData; + for (std::size_t remaining = size.x * size.y; remaining; --remaining, pixels += 4) + { + *bitmapOffset++ = pixels[2]; // Blue + *bitmapOffset++ = pixels[1]; // Green + *bitmapOffset++ = pixels[0]; // Red + *bitmapOffset++ = pixels[3]; // Alpha + } // Create a dummy mask bitmap (it won't be used) HBITMAP mask = CreateBitmap(size.x, size.y, 1, 1, NULL); From 8554d210dfb7d5e385305aef61903286407965be Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sat, 15 Sep 2018 21:36:53 +0200 Subject: [PATCH 118/211] Ensure the proper default framebuffer is bound when activating a RenderWindow. Fixes #1471. --- include/SFML/Graphics/RenderWindow.hpp | 7 +++++++ src/SFML/Graphics/RenderWindow.cpp | 18 ++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/include/SFML/Graphics/RenderWindow.hpp b/include/SFML/Graphics/RenderWindow.hpp index 2b3b6bce..01f07828 100644 --- a/include/SFML/Graphics/RenderWindow.hpp +++ b/include/SFML/Graphics/RenderWindow.hpp @@ -177,6 +177,13 @@ protected: /// //////////////////////////////////////////////////////////// virtual void onResize(); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + unsigned int m_defaultFrameBuffer; ///< Framebuffer to bind when targeting this window }; } // namespace sf diff --git a/src/SFML/Graphics/RenderWindow.cpp b/src/SFML/Graphics/RenderWindow.cpp index 446e9060..42f4ffea 100644 --- a/src/SFML/Graphics/RenderWindow.cpp +++ b/src/SFML/Graphics/RenderWindow.cpp @@ -34,14 +34,16 @@ 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); @@ -49,7 +51,8 @@ RenderWindow::RenderWindow(VideoMode mode, const String& title, Uint32 style, co //////////////////////////////////////////////////////////// -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); @@ -83,7 +86,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 +111,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(); } From 3aa156c27837ee9c1131c6f603fdc31eac5ab565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Mon, 1 Oct 2018 19:49:28 +0200 Subject: [PATCH 119/211] Fixed Windows cursor color conversion to be endian safe --- src/SFML/Window/Win32/CursorImpl.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/SFML/Window/Win32/CursorImpl.cpp b/src/SFML/Window/Win32/CursorImpl.cpp index 2bbaab5f..d1913d66 100755 --- a/src/SFML/Window/Win32/CursorImpl.cpp +++ b/src/SFML/Window/Win32/CursorImpl.cpp @@ -69,7 +69,7 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot bitmapHeader.bV5BlueMask = 0x000000ff; bitmapHeader.bV5AlphaMask = 0xff000000; - Uint8* bitmapData = NULL; + Uint32* bitmapData = NULL; HDC screenDC = GetDC(NULL); HBITMAP color = CreateDIBSection( @@ -90,13 +90,10 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot // Fill our bitmap with the cursor color data // We'll have to swap the red and blue channels here - Uint8* bitmapOffset = bitmapData; - for (std::size_t remaining = size.x * size.y; remaining; --remaining, pixels += 4) + Uint32* bitmapOffset = bitmapData; + for (std::size_t remaining = size.x * size.y; remaining > 0; --remaining, pixels += 4) { - *bitmapOffset++ = pixels[2]; // Blue - *bitmapOffset++ = pixels[1]; // Green - *bitmapOffset++ = pixels[0]; // Red - *bitmapOffset++ = pixels[3]; // Alpha + *bitmapOffset++ = (pixels[3] << 24) | (pixels[0] << 16) | (pixels[1] << 8) | pixels[2]; } // Create a dummy mask bitmap (it won't be used) From a5d45b910f380560a928a5670d41e427a951260e Mon Sep 17 00:00:00 2001 From: Maxime Alvarez <maxime.alvarez@etu.univ-tours.fr> Date: Fri, 10 Aug 2018 15:00:43 +0200 Subject: [PATCH 120/211] Fixed the error message when the wrong bitmap font size is selected --- src/SFML/Graphics/Font.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/SFML/Graphics/Font.cpp b/src/SFML/Graphics/Font.cpp index cafba5ba..308070a0 100644 --- a/src/SFML/Graphics/Font.cpp +++ b/src/SFML/Graphics/Font.cpp @@ -777,17 +777,22 @@ bool Font::setCurrentSize(unsigned int characterSize) const err() << "Failed to set bitmap font size to " << characterSize << std::endl; err() << "Available sizes are: "; for (int i = 0; i < face->num_fixed_sizes; ++i) - err() << face->available_sizes[i].height << " "; + { + const unsigned int size = (face->available_sizes[i].y_ppem + 32) >> 6; + err() << size << " "; + } err() << std::endl; } + else + { + err() << "Failed to set font size to " << characterSize << std::endl; + } } return result == FT_Err_Ok; } - else - { - return true; - } + + return true; } From ae0ec9d552bcea229f25d92666707790fc7a2e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Thu, 11 Oct 2018 21:50:38 +0200 Subject: [PATCH 121/211] Disabled the JNI part due to compatibility issues --- examples/android/app/src/main/jni/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/android/app/src/main/jni/main.cpp b/examples/android/app/src/main/jni/main.cpp index e5445b5b..edf67b45 100644 --- a/examples/android/app/src/main/jni/main.cpp +++ b/examples/android/app/src/main/jni/main.cpp @@ -6,7 +6,8 @@ // Do we want to showcase direct JNI/NDK interaction? // Undefine this to get real cross-platform code. -#define USE_JNI +// Uncomment this to try JNI access; this seems to be broken in latest NDKs +//#define USE_JNI #if defined(USE_JNI) // These headers are only needed for direct NDK/JDK interaction From d1d788fcb373826a7f8a20cbe9d507ea735cd578 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Mon, 27 Aug 2018 11:49:42 +0100 Subject: [PATCH 122/211] Add -ObjC flag to fix static linking on macOS --- src/SFML/Window/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index 1fe8b5a4..98ea4394 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -229,6 +229,11 @@ sfml_add_library(sfml-window SOURCES ${SRC} ${PLATFORM_SRC}) target_link_libraries(sfml-window PUBLIC sfml-system) +# 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") From 3f4bc3683b804155aaa04a8422a9ad6c1fb5b14d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Tue, 2 Oct 2018 23:17:54 +0200 Subject: [PATCH 123/211] Updated the changelog and version number for 2.5.1 --- CMakeLists.txt | 2 +- changelog.md | 48 +++++++++++++++++++++++++++++++++++++++++ include/SFML/Config.hpp | 2 +- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9eb250ef..e821a49b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,7 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake) # setup version numbers set(VERSION_MAJOR 2) set(VERSION_MINOR 5) -set(VERSION_PATCH 0) +set(VERSION_PATCH 1) # add an option for choosing the build type (shared or static) if(NOT (SFML_OS_IOS OR SFML_OS_ANDROID)) diff --git a/changelog.md b/changelog.md index c51ee3ab..6174a84f 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,53 @@ # Changelog +## 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) + +### 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) + +### 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) + +### Audio + +**Bugfixes** + + * Fixed performance issue with reading WAV files (#1450) + ## SFML 2.5.0 Also available on the website: https://www.sfml-dev.org/changelog.php#sfml-2.5.0 diff --git a/include/SFML/Config.hpp b/include/SFML/Config.hpp index aae5f548..40b677eb 100644 --- a/include/SFML/Config.hpp +++ b/include/SFML/Config.hpp @@ -31,7 +31,7 @@ //////////////////////////////////////////////////////////// #define SFML_VERSION_MAJOR 2 #define SFML_VERSION_MINOR 5 -#define SFML_VERSION_PATCH 0 +#define SFML_VERSION_PATCH 1 //////////////////////////////////////////////////////////// From ac98be760b8b1401fd7a3b141883cbf04feba7b7 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Mon, 21 May 2018 17:30:47 +0200 Subject: [PATCH 124/211] Allow re-creation of the shared context as a core context if the user indicates they want a core profile context. Sharing of compatibility and core profile contexts is not possible on macOS which is why we need to have a way to re-create the shared context as a core context if required in this case. --- src/SFML/Window/GlContext.cpp | 132 ++++++++++++++++++--------- src/SFML/Window/Win32/WglContext.cpp | 39 ++++---- 2 files changed, 106 insertions(+), 65 deletions(-) diff --git a/src/SFML/Window/GlContext.cpp b/src/SFML/Window/GlContext.cpp index 3cbb7016..2e1a4824 100644 --- a/src/SFML/Window/GlContext.cpp +++ b/src/SFML/Window/GlContext.cpp @@ -212,6 +212,55 @@ namespace // Supported OpenGL extensions std::vector<std::string> extensions; + // Load our extensions vector with the supported extensions + void loadExtensions() + { + 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>(sf::priv::GlContext::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); + } + } + } + } + } + // Helper to parse OpenGL version strings bool parseVersionString(const char* version, const char* prefix, unsigned int &major, unsigned int &minor) { @@ -260,50 +309,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); @@ -417,6 +423,25 @@ GlContext* GlContext::create(const ContextSettings& settings, const WindowImpl* 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 @@ -446,6 +471,25 @@ GlContext* GlContext::create(const ContextSettings& settings, unsigned int width 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 diff --git a/src/SFML/Window/Win32/WglContext.cpp b/src/SFML/Window/Win32/WglContext.cpp index fd9f89e4..1bd8e9be 100644 --- a/src/SFML/Window/Win32/WglContext.cpp +++ b/src/SFML/Window/Win32/WglContext.cpp @@ -84,20 +84,16 @@ m_deviceContext(NULL), m_context (NULL), m_ownsWindow (false) { + // 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); } @@ -112,17 +108,11 @@ m_ownsWindow (false) // 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); } @@ -137,17 +127,11 @@ m_ownsWindow (false) // 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); } @@ -594,6 +578,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; @@ -730,6 +718,15 @@ void WglContext::createContext(WglContext* shared) 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); + ensureExtensionsInit(m_deviceContext); + makeCurrent(false); + } } } // namespace priv From de0ba77d3b27a26e971290eafd5f08877477cf2f Mon Sep 17 00:00:00 2001 From: Sven Hesse <drmccoy@drmccoy.de> Date: Fri, 26 Oct 2018 21:11:03 +0200 Subject: [PATCH 125/211] Unix: Filter X visual by X screen On an X set-up with multiple monitors running separate X screens (as opposed to merging them into one large X screen using Xinerama), the selected X visual needs to be one for the screen where the colormap, window, and other X resources are created. In fact, all these need to match, and the GL context as well. Most of the SFML windowing and graphics code uses (X)DefaultScreen() for that, which is fine. Combined with XOpenDisplay(NULL), this will create the window on the screen (and monitor) selected by the DISPLAY enviroment variable. :0.0 will be the first monitor, :0.1 the second, etc. However, XGetVisualInfo() will return visuals for *all* screens, not just the default one. They seem to be ordered by screen number, but I don't think the standard makes any guarantees there. If the visual doesn't match up with the screen, this will abort with an X error. BadMatch, in many cases. This means that in addition to other filtering, GlxContext::selectBestVisual() needs to filter the visuals by screen number, otherwise SFML won't work at all on any screens but the first. This fixes issue #724. --- src/SFML/Window/Unix/GlxContext.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/SFML/Window/Unix/GlxContext.cpp b/src/SFML/Window/Unix/GlxContext.cpp index cd022364..507cfcb0 100644 --- a/src/SFML/Window/Unix/GlxContext.cpp +++ b/src/SFML/Window/Unix/GlxContext.cpp @@ -316,6 +316,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 +328,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); From 1159ac5c522a4819263ef7fd8628e0ea8d624862 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Tue, 9 Oct 2018 21:30:20 +0100 Subject: [PATCH 126/211] Initial travis and Appveyor configs --- .travis.yml | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ appveyor.yml | 12 +++++++++++ 2 files changed, 68 insertions(+) create mode 100644 .travis.yml create mode 100644 appveyor.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..8b6c384e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,56 @@ +sudo: false +dist: trusty +language: c++ + +addons: + apt: + packages: + - cmake + - libxrandr-dev + - libudev-dev + - libopenal-dev + - libflac-dev + - libvorbis-dev + - g++ + - clang + +before_script: +- mkdir build && cd build +- cmake .. -G"$GENERATOR" $CMAKE_FLAGS + +script: +- sudo cmake --build . --target install + +matrix: + include: + + # Linux - gcc + - os: linux + compiler: gcc + env: + - GENERATOR="Unix Makefiles" + - CMAKE_FLAGS="-DSFML_BUILD_EXAMPLES=TRUE" + + # Linux - clang + - os: linux + compiler: clang + env: + - GENERATOR="Unix Makefiles" + - CMAKE_FLAGS="-DSFML_BUILD_EXAMPLES=TRUE" + + # macOS - Xcode 10 + - os: osx + osx_image: xcode10 + env: + - GENERATOR="Xcode" + - CMAKE_FLAGS="-DSFML_BUILD_FRAMEWORKS=TRUE -DSFML_BUILD_EXAMPLES=TRUE" + + # iOS - Xcode 9 + - os: osx + osx_image: xcode10 + env: + - GENERATOR="Xcode" + - CMAKE_FLAGS="-DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/iOS.toolchain.cmake -DSFML_BUILD_EXAMPLES=TRUE -DIOS_PLATFORM=SIMULATOR" + +notifications: + email: false diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..add07837 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,12 @@ +image: +- Visual Studio 2017 +build_script: +- ps: >- + + md -Name build + + cd build + + cmake .. -DSFML_BUILD_EXAMPLES=TRUE + + cmake --build . --target install From 2be4e54d4abca6f17b8a575bb5e60cd78341cbee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Sun, 25 Nov 2018 17:23:25 +0100 Subject: [PATCH 127/211] Fixed example documentation to match the code --- include/SFML/Audio/SoundStream.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/SFML/Audio/SoundStream.hpp b/include/SFML/Audio/SoundStream.hpp index bed83114..1d5f3422 100644 --- a/include/SFML/Audio/SoundStream.hpp +++ b/include/SFML/Audio/SoundStream.hpp @@ -387,7 +387,7 @@ private: /// return true; /// } /// -/// virtual void onSeek(Uint32 timeOffset) +/// virtual void onSeek(sf::Time timeOffset) /// { /// // Change the current position in the stream source /// ... From 119195ac20866fcecc93e33cda457b3fe54b1b0c Mon Sep 17 00:00:00 2001 From: Dmitry Marakasov <amdmi3@amdmi3.ru> Date: Tue, 16 Oct 2018 18:08:13 +0300 Subject: [PATCH 128/211] Remove unneeded cast --- src/SFML/Window/Unix/WindowImplX11.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Window/Unix/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index da697505..5f538f46 100644 --- a/src/SFML/Window/Unix/WindowImplX11.cpp +++ b/src/SFML/Window/Unix/WindowImplX11.cpp @@ -1556,7 +1556,7 @@ void WindowImplX11::initialize() m_window, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - reinterpret_cast<void*>(NULL)); + NULL); } else { From 077af21f376db00f873c360919513fb117b3d9cf Mon Sep 17 00:00:00 2001 From: cosiek <vfjpl1@gmail.com> Date: Sat, 24 Nov 2018 01:39:32 +0100 Subject: [PATCH 129/211] allow for closing sound files --- include/SFML/Audio/InputSoundFile.hpp | 4 ++-- include/SFML/Audio/OutputSoundFile.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/SFML/Audio/InputSoundFile.hpp b/include/SFML/Audio/InputSoundFile.hpp index 317b9526..2c9f897a 100644 --- a/include/SFML/Audio/InputSoundFile.hpp +++ b/include/SFML/Audio/InputSoundFile.hpp @@ -195,14 +195,14 @@ public: //////////////////////////////////////////////////////////// Uint64 read(Int16* samples, Uint64 maxCount); -private: - //////////////////////////////////////////////////////////// /// \brief Close the current file /// //////////////////////////////////////////////////////////// void close(); +private: + //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// diff --git a/include/SFML/Audio/OutputSoundFile.hpp b/include/SFML/Audio/OutputSoundFile.hpp index 5da374b0..efa7c4b7 100644 --- a/include/SFML/Audio/OutputSoundFile.hpp +++ b/include/SFML/Audio/OutputSoundFile.hpp @@ -82,14 +82,14 @@ public: //////////////////////////////////////////////////////////// void write(const Int16* samples, Uint64 count); -private: - //////////////////////////////////////////////////////////// /// \brief Close the current file /// //////////////////////////////////////////////////////////// void close(); +private: + //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// From fbc0f1719803d06b925bb69590e092c3d2fac12f Mon Sep 17 00:00:00 2001 From: Elias Daler <eliasdaler@yandex.ru> Date: Sun, 19 Aug 2018 01:06:32 +0300 Subject: [PATCH 130/211] Fix RPATH for installed examples on Linux --- cmake/Macros.cmake | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index ecb37c8b..65aa1aba 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -230,14 +230,25 @@ macro(sfml_add_example target) target_link_libraries(${target} PRIVATE ${THIS_DEPENDS}) endif() + set(target_install_dir ${SFML_MISC_INSTALL_PREFIX}/examples/${target}) + + if(SFML_OS_LINUX OR SFML_OS_FREEBSD) + file(RELATIVE_PATH rel_lib_dir + ${CMAKE_INSTALL_PREFIX}/${target_install_dir} + ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) + + set_target_properties(${target} PROPERTIES + INSTALL_RPATH "$ORIGIN/${rel_lib_dir}") + 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) + RUNTIME DESTINATION ${target_install_dir} COMPONENT examples + BUNDLE DESTINATION ${target_install_dir} COMPONENT examples) # install the example's source code install(FILES ${THIS_SOURCES} - DESTINATION ${SFML_MISC_INSTALL_PREFIX}/examples/${target} + DESTINATION ${target_install_dir} COMPONENT examples) if (THIS_RESOURCES_DIR) @@ -248,7 +259,7 @@ macro(sfml_add_example target) 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} + DESTINATION ${target_install_dir} COMPONENT examples) endif() From b81de898bf49d919354899d14ecf2b81753f9f42 Mon Sep 17 00:00:00 2001 From: Elias Daler <eliasdaler@yandex.ru> Date: Sun, 19 Aug 2018 12:30:22 +0300 Subject: [PATCH 131/211] Modify install rpath only if BUILD_SHARED_LIBS is ON --- cmake/Macros.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 65aa1aba..21ffb545 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -232,7 +232,7 @@ macro(sfml_add_example target) set(target_install_dir ${SFML_MISC_INSTALL_PREFIX}/examples/${target}) - if(SFML_OS_LINUX OR SFML_OS_FREEBSD) + if(BUILD_SHARED_LIBS AND (SFML_OS_LINUX OR SFML_OS_FREEBSD)) file(RELATIVE_PATH rel_lib_dir ${CMAKE_INSTALL_PREFIX}/${target_install_dir} ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) From 1bf3ae77b953d809fca43c84122448dc8ff128e6 Mon Sep 17 00:00:00 2001 From: = <jonathan.r.paton@googlemail.com> Date: Tue, 4 Dec 2018 10:10:21 +0000 Subject: [PATCH 132/211] Use Travis for windows builds --- .travis.yml | 31 +++++++++++++------------------ appveyor.yml | 12 ------------ 2 files changed, 13 insertions(+), 30 deletions(-) delete mode 100644 appveyor.yml diff --git a/.travis.yml b/.travis.yml index 8b6c384e..fefba3f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,7 @@ -sudo: false -dist: trusty -language: c++ +language: cpp addons: - apt: - packages: + apt_packages: - cmake - libxrandr-dev - libudev-dev @@ -13,44 +10,42 @@ addons: - libvorbis-dev - g++ - clang + - libgl1-mesa-dev before_script: - mkdir build && cd build -- cmake .. -G"$GENERATOR" $CMAKE_FLAGS +- cmake .. $CMAKE_FLAGS -DCMAKE_INSTALL_PREFIX=../install -DSFML_BUILD_EXAMPLES=TRUE script: -- sudo cmake --build . --target install +- cmake --build . --target install matrix: include: # Linux - gcc - os: linux + dist: xenial compiler: gcc - env: - - GENERATOR="Unix Makefiles" - - CMAKE_FLAGS="-DSFML_BUILD_EXAMPLES=TRUE" # Linux - clang - os: linux + dist: xenial compiler: clang - env: - - GENERATOR="Unix Makefiles" - - CMAKE_FLAGS="-DSFML_BUILD_EXAMPLES=TRUE" # macOS - Xcode 10 - os: osx osx_image: xcode10 env: - - GENERATOR="Xcode" - - CMAKE_FLAGS="-DSFML_BUILD_FRAMEWORKS=TRUE -DSFML_BUILD_EXAMPLES=TRUE" + - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install" - # iOS - Xcode 9 + # iOS - Xcode 10 - os: osx osx_image: xcode10 env: - - GENERATOR="Xcode" - - CMAKE_FLAGS="-DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/iOS.toolchain.cmake -DSFML_BUILD_EXAMPLES=TRUE -DIOS_PLATFORM=SIMULATOR" + - CMAKE_FLAGS="-GXcode -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/iOS.toolchain.cmake -DIOS_PLATFORM=SIMULATOR" + + # Windows - vs2017 + - os: windows notifications: email: false diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index add07837..00000000 --- a/appveyor.yml +++ /dev/null @@ -1,12 +0,0 @@ -image: -- Visual Studio 2017 -build_script: -- ps: >- - - md -Name build - - cd build - - cmake .. -DSFML_BUILD_EXAMPLES=TRUE - - cmake --build . --target install From b9fdaf487f878fac17c3d4c1182acd8c4182eecc Mon Sep 17 00:00:00 2001 From: Jonny <jonathan.r.paton@googlemail.com> Date: Sat, 8 Dec 2018 10:14:49 +0000 Subject: [PATCH 133/211] Add static builds to travis build matrix and give all jobs names --- .travis.yml | 51 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index fefba3f9..671bed6f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,30 +22,61 @@ script: matrix: include: - # Linux - gcc - - os: linux + - name: "Linux gcc Dynamic" + os: linux dist: xenial compiler: gcc + + - name: "Linux gcc Static" + os: linux + dist: xenial + compiler: gcc + env: + - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE" - # Linux - clang - - os: linux + - name: "Linux clang Dynamic" + os: linux dist: xenial compiler: clang - # macOS - Xcode 10 - - os: osx + - name: "Linux clang Static" + os: linux + dist: xenial + compiler: clang + env: + - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE" + + - name: "macOS Xcode 10 Dynamic" + os: osx osx_image: xcode10 env: - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install" - # iOS - Xcode 10 - - os: osx + - name: "macOS Xcode 10 Frameworks" + os: osx + osx_image: xcode10 + env: + - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install -DSFML_BUILD_FRAMEWORKS=TRUE" + + - name: "macOS Xcode 10 Static" + os: osx + osx_image: xcode10 + env: + - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install -DBUILD_SHARED_LIBS=FALSE" + + - name: "iOS Xcode 10" + os: osx osx_image: xcode10 env: - CMAKE_FLAGS="-GXcode -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/iOS.toolchain.cmake -DIOS_PLATFORM=SIMULATOR" - # Windows - vs2017 - - os: windows + - name: "Visual studio 15 2017 Dynamic" + os: windows + + - name: "Visual studio 15 2017 Static" + os: windows + env: + - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE" notifications: email: false From db80f6a60fcb24b349e6a9765e49ee385adee89e Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sat, 29 Dec 2018 13:36:01 +0100 Subject: [PATCH 134/211] Make sure setActive(false) is called before the surface is destroyed in EglContext. Fixes #1530. --- src/SFML/Window/EglContext.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SFML/Window/EglContext.cpp b/src/SFML/Window/EglContext.cpp index fb91cdac..5c71f479 100644 --- a/src/SFML/Window/EglContext.cpp +++ b/src/SFML/Window/EglContext.cpp @@ -233,11 +233,11 @@ void EglContext::createSurface(EGLNativeWindowType window) //////////////////////////////////////////////////////////// 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); } From 04131e1607f37a452eda4b8d7dc7a76c14ad4623 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Mon, 31 Dec 2018 02:33:10 +0100 Subject: [PATCH 135/211] Fixed EGL incorrectly being passed the anti-aliasing level as EGL_SAMPLE_BUFFERS instead of EGL_SAMPLES. Fixes #1533. --- src/SFML/Window/EglContext.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SFML/Window/EglContext.cpp b/src/SFML/Window/EglContext.cpp index 5c71f479..90b58522 100644 --- a/src/SFML/Window/EglContext.cpp +++ b/src/SFML/Window/EglContext.cpp @@ -249,7 +249,8 @@ EGLConfig EglContext::getBestConfig(EGLDisplay display, unsigned int bitsPerPixe 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, static_cast<EGLint>(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 From ae337952a98bfb71d228221015c947df94bdd6b4 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sat, 15 Sep 2018 13:08:28 +0200 Subject: [PATCH 136/211] Allow creation of a window without an OpenGL context in order to support use cases where the user wants to render using other graphics APIs. --- examples/X11/X11.cpp | 7 + examples/win32/Win32.cpp | 4 + include/SFML/Window/Cursor.hpp | 2 +- include/SFML/Window/Mouse.hpp | 6 +- include/SFML/Window/Touch.hpp | 4 +- include/SFML/Window/Window.hpp | 330 ++-------------- include/SFML/Window/WindowBase.hpp | 505 +++++++++++++++++++++++++ src/SFML/Graphics/RenderWindow.cpp | 4 +- src/SFML/Window/Android/InputImpl.cpp | 6 +- src/SFML/Window/Android/InputImpl.hpp | 6 +- src/SFML/Window/CMakeLists.txt | 2 + src/SFML/Window/Mouse.cpp | 4 +- src/SFML/Window/OSX/InputImpl.hpp | 6 +- src/SFML/Window/OSX/InputImpl.mm | 8 +- src/SFML/Window/Touch.cpp | 2 +- src/SFML/Window/Unix/InputImpl.cpp | 6 +- src/SFML/Window/Unix/InputImpl.hpp | 6 +- src/SFML/Window/Unix/WindowImplX11.cpp | 26 +- src/SFML/Window/Win32/InputImpl.cpp | 6 +- src/SFML/Window/Win32/InputImpl.hpp | 6 +- src/SFML/Window/Window.cpp | 253 ++----------- src/SFML/Window/WindowBase.cpp | 372 ++++++++++++++++++ src/SFML/Window/iOS/InputImpl.hpp | 6 +- src/SFML/Window/iOS/InputImpl.mm | 6 +- 24 files changed, 1009 insertions(+), 574 deletions(-) create mode 100644 include/SFML/Window/WindowBase.hpp create mode 100644 src/SFML/Window/WindowBase.cpp diff --git a/examples/X11/X11.cpp b/examples/X11/X11.cpp index 746bf075..fd919600 100644 --- a/examples/X11/X11.cpp +++ b/examples/X11/X11.cpp @@ -210,6 +210,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/win32/Win32.cpp b/examples/win32/Win32.cpp index aedfc76e..9b696c2c 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/include/SFML/Window/Cursor.hpp b/include/SFML/Window/Cursor.hpp index 9daa13bd..d85bca63 100644 --- a/include/SFML/Window/Cursor.hpp +++ b/include/SFML/Window/Cursor.hpp @@ -161,7 +161,7 @@ public: private: - friend class Window; + friend class WindowBase; //////////////////////////////////////////////////////////// /// \brief Get access to the underlying implementation diff --git a/include/SFML/Window/Mouse.hpp b/include/SFML/Window/Mouse.hpp index 0d1e470b..4b5ba07a 100644 --- a/include/SFML/Window/Mouse.hpp +++ b/include/SFML/Window/Mouse.hpp @@ -34,7 +34,7 @@ namespace sf { -class Window; +class WindowBase; //////////////////////////////////////////////////////////// /// \brief Give access to the real-time state of the mouse @@ -101,7 +101,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 +124,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/Touch.hpp b/include/SFML/Window/Touch.hpp index 1c2b3fee..f97edddd 100644 --- a/include/SFML/Window/Touch.hpp +++ b/include/SFML/Window/Touch.hpp @@ -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/Window.hpp b/include/SFML/Window/Window.hpp index 7ff81e29..21f6239b 100644 --- a/include/SFML/Window/Window.hpp +++ b/include/SFML/Window/Window.hpp @@ -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: @@ -113,6 +104,20 @@ public: //////////////////////////////////////////////////////////// virtual ~Window(); + //////////////////////////////////////////////////////////// + /// \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 /// @@ -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 @@ -186,144 +191,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 /// @@ -339,62 +206,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 /// @@ -412,19 +223,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 @@ -443,35 +241,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 /// @@ -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 }; } // namespace sf diff --git a/include/SFML/Window/WindowBase.hpp b/include/SFML/Window/WindowBase.hpp new file mode 100644 index 00000000..e157f5a5 --- /dev/null +++ b/include/SFML/Window/WindowBase.hpp @@ -0,0 +1,505 @@ +//////////////////////////////////////////////////////////// +// +// 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_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/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; + +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/src/SFML/Graphics/RenderWindow.cpp b/src/SFML/Graphics/RenderWindow.cpp index 42f4ffea..9926fb45 100644 --- a/src/SFML/Graphics/RenderWindow.cpp +++ b/src/SFML/Graphics/RenderWindow.cpp @@ -46,7 +46,7 @@ RenderWindow::RenderWindow(VideoMode mode, const String& title, Uint32 style, co 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); } @@ -55,7 +55,7 @@ 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); } diff --git a/src/SFML/Window/Android/InputImpl.cpp b/src/SFML/Window/Android/InputImpl.cpp index 9da3a131..238c15bc 100644 --- a/src/SFML/Window/Android/InputImpl.cpp +++ b/src/SFML/Window/Android/InputImpl.cpp @@ -158,7 +158,7 @@ Vector2i InputImpl::getMousePosition() //////////////////////////////////////////////////////////// -Vector2i InputImpl::getMousePosition(const Window& relativeTo) +Vector2i InputImpl::getMousePosition(const WindowBase& relativeTo) { return getMousePosition(); } @@ -172,7 +172,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) { setMousePosition(position); } @@ -203,7 +203,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) { return getTouchPosition(finger); } diff --git a/src/SFML/Window/Android/InputImpl.hpp b/src/SFML/Window/Android/InputImpl.hpp index 37167b50..d2783e15 100644 --- a/src/SFML/Window/Android/InputImpl.hpp +++ b/src/SFML/Window/Android/InputImpl.hpp @@ -95,7 +95,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 +120,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 +157,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/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index 98ea4394..f25ebb83 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -41,6 +41,8 @@ set(SRC ${SRCROOT}/VideoModeImpl.hpp ${SRCROOT}/Window.cpp ${INCROOT}/Window.hpp + ${SRCROOT}/WindowBase.cpp + ${INCROOT}/WindowBase.hpp ${INCROOT}/WindowHandle.hpp ${SRCROOT}/WindowImpl.cpp ${SRCROOT}/WindowImpl.hpp diff --git a/src/SFML/Window/Mouse.cpp b/src/SFML/Window/Mouse.cpp index 862dc69a..e1d4bb8d 100644 --- a/src/SFML/Window/Mouse.cpp +++ b/src/SFML/Window/Mouse.cpp @@ -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/OSX/InputImpl.hpp b/src/SFML/Window/OSX/InputImpl.hpp index 6f874bcd..d6322655 100644 --- a/src/SFML/Window/OSX/InputImpl.hpp +++ b/src/SFML/Window/OSX/InputImpl.hpp @@ -96,7 +96,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 +121,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 +158,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 361e1be8..6783a845 100644 --- a/src/SFML/Window/OSX/InputImpl.mm +++ b/src/SFML/Window/OSX/InputImpl.mm @@ -55,7 +55,7 @@ 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(); @@ -158,7 +158,7 @@ Vector2i InputImpl::getMousePosition() //////////////////////////////////////////////////////////// -Vector2i InputImpl::getMousePosition(const Window& relativeTo) +Vector2i InputImpl::getMousePosition(const WindowBase& relativeTo) { SFOpenGLView* view = getSFOpenGLViewFromSFMLWindow(relativeTo); @@ -193,7 +193,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) { SFOpenGLView* view = getSFOpenGLViewFromSFMLWindow(relativeTo); @@ -226,7 +226,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/Touch.cpp b/src/SFML/Window/Touch.cpp index aa63c728..90c36fb4 100644 --- a/src/SFML/Window/Touch.cpp +++ b/src/SFML/Window/Touch.cpp @@ -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/InputImpl.cpp b/src/SFML/Window/Unix/InputImpl.cpp index b404dd51..c9f2a2cc 100644 --- a/src/SFML/Window/Unix/InputImpl.cpp +++ b/src/SFML/Window/Unix/InputImpl.cpp @@ -240,7 +240,7 @@ Vector2i InputImpl::getMousePosition() //////////////////////////////////////////////////////////// -Vector2i InputImpl::getMousePosition(const Window& relativeTo) +Vector2i InputImpl::getMousePosition(const WindowBase& relativeTo) { WindowHandle handle = relativeTo.getSystemHandle(); if (handle) @@ -284,7 +284,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 +318,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 88dcc91c..1b1d6374 100644 --- a/src/SFML/Window/Unix/InputImpl.hpp +++ b/src/SFML/Window/Unix/InputImpl.hpp @@ -95,7 +95,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 +120,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 +157,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/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index 5f538f46..fc1324ca 100644 --- a/src/SFML/Window/Unix/WindowImplX11.cpp +++ b/src/SFML/Window/Unix/WindowImplX11.cpp @@ -572,12 +572,28 @@ m_lastInputTime (0) int width = mode.width; int height = mode.height; - // Choose the visual according to the context settings - XVisualInfo visualInfo = ContextType::selectBestVisual(m_display, mode.bitsPerPixel, settings); + 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); + + 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 +602,9 @@ m_lastInputTime (0) windowPosition.x, windowPosition.y, width, height, 0, - visualInfo.depth, + depth, InputOutput, - visualInfo.visual, + visual, CWEventMask | CWOverrideRedirect | CWColormap, &attributes); diff --git a/src/SFML/Window/Win32/InputImpl.cpp b/src/SFML/Window/Win32/InputImpl.cpp index 04827400..52e57a1d 100644 --- a/src/SFML/Window/Win32/InputImpl.cpp +++ b/src/SFML/Window/Win32/InputImpl.cpp @@ -191,7 +191,7 @@ Vector2i InputImpl::getMousePosition() //////////////////////////////////////////////////////////// -Vector2i InputImpl::getMousePosition(const Window& relativeTo) +Vector2i InputImpl::getMousePosition(const WindowBase& relativeTo) { WindowHandle handle = relativeTo.getSystemHandle(); if (handle) @@ -216,7 +216,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 +245,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 17ac4822..5098bbad 100644 --- a/src/SFML/Window/Win32/InputImpl.hpp +++ b/src/SFML/Window/Win32/InputImpl.hpp @@ -95,7 +95,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 +120,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 +157,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/Window.cpp b/src/SFML/Window/Window.cpp index b1ed548a..34d1b439 100644 --- a/src/SFML/Window/Window.cpp +++ b/src/SFML/Window/Window.cpp @@ -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); } @@ -80,6 +68,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) { @@ -90,7 +85,7 @@ 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; @@ -105,7 +100,7 @@ void Window::create(VideoMode mode, const String& title, Uint32 style, const Con } // Update the fullscreen window - fullscreenWindow = this; + setFullscreenWindow(this); } } @@ -131,6 +126,13 @@ 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) { @@ -138,7 +140,7 @@ void Window::create(WindowHandle handle, const ContextSettings& settings) 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(); } @@ -181,97 +171,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) { @@ -280,38 +179,6 @@ 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) { @@ -322,14 +189,6 @@ void Window::setFramerateLimit(unsigned int limit) } -//////////////////////////////////////////////////////////// -void Window::setJoystickThreshold(float threshold) -{ - if (m_impl) - m_impl->setJoystickThreshold(threshold); -} - - //////////////////////////////////////////////////////////// bool Window::setActive(bool active) const { @@ -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 @@ -384,66 +227,20 @@ 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 00000000..cece16b3 --- /dev/null +++ b/src/SFML/Window/WindowBase.cpp @@ -0,0 +1,372 @@ +//////////////////////////////////////////////////////////// +// +// 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/WindowBase.hpp> +#include <SFML/Window/ContextSettings.hpp> +#include <SFML/Window/WindowImpl.hpp> +#include <SFML/System/Err.hpp> + + +namespace +{ + 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 &= ~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 &= ~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; +} + + +//////////////////////////////////////////////////////////// +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 fullscreenWindow; +} + + +//////////////////////////////////////////////////////////// +void WindowBase::setFullscreenWindow(const WindowBase* window) +{ + fullscreenWindow = window; +} + +} // namespace sf diff --git a/src/SFML/Window/iOS/InputImpl.hpp b/src/SFML/Window/iOS/InputImpl.hpp index 0d62071c..75b02b06 100644 --- a/src/SFML/Window/iOS/InputImpl.hpp +++ b/src/SFML/Window/iOS/InputImpl.hpp @@ -95,7 +95,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 +120,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 +157,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 bada27d1..92a2fd16 100644 --- a/src/SFML/Window/iOS/InputImpl.mm +++ b/src/SFML/Window/iOS/InputImpl.mm @@ -67,7 +67,7 @@ Vector2i InputImpl::getMousePosition() //////////////////////////////////////////////////////////// -Vector2i InputImpl::getMousePosition(const Window& relativeTo) +Vector2i InputImpl::getMousePosition(const WindowBase& relativeTo) { (void)relativeTo; @@ -83,7 +83,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) { // Not applicable } @@ -104,7 +104,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) { (void)relativeTo; From 489482a630c5286e488ffc270c10562809056d8e Mon Sep 17 00:00:00 2001 From: EpicCoder <EpicCoder@users.noreply.github.com> Date: Sun, 6 Jan 2019 13:03:34 +0100 Subject: [PATCH 137/211] Updated the copyright year to 2019 --- examples/cocoa/CocoaAppDelegate.h | 2 +- examples/cocoa/CocoaAppDelegate.mm | 2 +- examples/cocoa/NSString+stdstring.h | 2 +- examples/cocoa/NSString+stdstring.mm | 2 +- examples/cocoa/main.m | 2 +- examples/cocoa/resources/Cocoa-Info.plist | 2 +- include/SFML/Audio.hpp | 2 +- include/SFML/Audio/AlResource.hpp | 2 +- include/SFML/Audio/Export.hpp | 2 +- include/SFML/Audio/InputSoundFile.hpp | 2 +- include/SFML/Audio/Listener.hpp | 2 +- include/SFML/Audio/Music.hpp | 2 +- include/SFML/Audio/OutputSoundFile.hpp | 2 +- include/SFML/Audio/Sound.hpp | 2 +- include/SFML/Audio/SoundBuffer.hpp | 2 +- include/SFML/Audio/SoundBufferRecorder.hpp | 2 +- include/SFML/Audio/SoundFileFactory.hpp | 2 +- include/SFML/Audio/SoundFileFactory.inl | 2 +- include/SFML/Audio/SoundFileReader.hpp | 2 +- include/SFML/Audio/SoundFileWriter.hpp | 2 +- include/SFML/Audio/SoundRecorder.hpp | 2 +- include/SFML/Audio/SoundSource.hpp | 2 +- include/SFML/Audio/SoundStream.hpp | 2 +- include/SFML/Config.hpp | 2 +- include/SFML/GpuPreference.hpp | 2 +- include/SFML/Graphics.hpp | 2 +- include/SFML/Graphics/BlendMode.hpp | 2 +- include/SFML/Graphics/CircleShape.hpp | 2 +- include/SFML/Graphics/Color.hpp | 2 +- include/SFML/Graphics/ConvexShape.hpp | 2 +- include/SFML/Graphics/Drawable.hpp | 2 +- include/SFML/Graphics/Export.hpp | 2 +- include/SFML/Graphics/Font.hpp | 2 +- include/SFML/Graphics/Glsl.hpp | 2 +- include/SFML/Graphics/Glsl.inl | 2 +- include/SFML/Graphics/Glyph.hpp | 2 +- include/SFML/Graphics/Image.hpp | 2 +- include/SFML/Graphics/PrimitiveType.hpp | 2 +- include/SFML/Graphics/Rect.hpp | 2 +- include/SFML/Graphics/Rect.inl | 2 +- include/SFML/Graphics/RectangleShape.hpp | 2 +- include/SFML/Graphics/RenderStates.hpp | 2 +- include/SFML/Graphics/RenderTarget.hpp | 2 +- include/SFML/Graphics/RenderTexture.hpp | 2 +- include/SFML/Graphics/RenderWindow.hpp | 2 +- include/SFML/Graphics/Shader.hpp | 2 +- include/SFML/Graphics/Shape.hpp | 2 +- include/SFML/Graphics/Sprite.hpp | 2 +- include/SFML/Graphics/Text.hpp | 2 +- include/SFML/Graphics/Texture.hpp | 2 +- include/SFML/Graphics/Transform.hpp | 2 +- include/SFML/Graphics/Transformable.hpp | 2 +- include/SFML/Graphics/Vertex.hpp | 2 +- include/SFML/Graphics/VertexArray.hpp | 2 +- include/SFML/Graphics/VertexBuffer.hpp | 2 +- include/SFML/Graphics/View.hpp | 2 +- include/SFML/Main.hpp | 2 +- include/SFML/Network.hpp | 2 +- include/SFML/Network/Export.hpp | 2 +- include/SFML/Network/Ftp.hpp | 2 +- include/SFML/Network/Http.hpp | 2 +- include/SFML/Network/IpAddress.hpp | 2 +- include/SFML/Network/Packet.hpp | 2 +- include/SFML/Network/Socket.hpp | 2 +- include/SFML/Network/SocketHandle.hpp | 2 +- include/SFML/Network/SocketSelector.hpp | 2 +- include/SFML/Network/TcpListener.hpp | 2 +- include/SFML/Network/TcpSocket.hpp | 2 +- include/SFML/Network/UdpSocket.hpp | 2 +- include/SFML/OpenGL.hpp | 2 +- include/SFML/System.hpp | 2 +- include/SFML/System/Clock.hpp | 2 +- include/SFML/System/Err.hpp | 2 +- include/SFML/System/Export.hpp | 2 +- include/SFML/System/FileInputStream.hpp | 2 +- include/SFML/System/InputStream.hpp | 2 +- include/SFML/System/Lock.hpp | 2 +- include/SFML/System/MemoryInputStream.hpp | 2 +- include/SFML/System/Mutex.hpp | 2 +- include/SFML/System/NativeActivity.hpp | 2 +- include/SFML/System/NonCopyable.hpp | 2 +- include/SFML/System/Sleep.hpp | 2 +- include/SFML/System/String.hpp | 2 +- include/SFML/System/String.inl | 2 +- include/SFML/System/Thread.hpp | 2 +- include/SFML/System/Thread.inl | 2 +- include/SFML/System/ThreadLocal.hpp | 2 +- include/SFML/System/ThreadLocalPtr.hpp | 2 +- include/SFML/System/ThreadLocalPtr.inl | 2 +- include/SFML/System/Time.hpp | 2 +- include/SFML/System/Utf.hpp | 2 +- include/SFML/System/Utf.inl | 2 +- include/SFML/System/Vector2.hpp | 2 +- include/SFML/System/Vector2.inl | 2 +- include/SFML/System/Vector3.hpp | 2 +- include/SFML/System/Vector3.inl | 2 +- include/SFML/Window.hpp | 2 +- include/SFML/Window/Clipboard.hpp | 2 +- include/SFML/Window/Context.hpp | 2 +- include/SFML/Window/ContextSettings.hpp | 2 +- include/SFML/Window/Cursor.hpp | 2 +- include/SFML/Window/Event.hpp | 2 +- include/SFML/Window/Export.hpp | 2 +- include/SFML/Window/GlResource.hpp | 2 +- include/SFML/Window/Joystick.hpp | 2 +- include/SFML/Window/Keyboard.hpp | 2 +- include/SFML/Window/Mouse.hpp | 2 +- include/SFML/Window/Sensor.hpp | 2 +- include/SFML/Window/Touch.hpp | 2 +- include/SFML/Window/VideoMode.hpp | 2 +- include/SFML/Window/Window.hpp | 2 +- include/SFML/Window/WindowBase.hpp | 2 +- include/SFML/Window/WindowHandle.hpp | 2 +- include/SFML/Window/WindowStyle.hpp | 2 +- license.md | 2 +- src/SFML/Audio/ALCheck.cpp | 2 +- src/SFML/Audio/ALCheck.hpp | 2 +- src/SFML/Audio/AlResource.cpp | 2 +- src/SFML/Audio/AudioDevice.cpp | 2 +- src/SFML/Audio/AudioDevice.hpp | 2 +- src/SFML/Audio/InputSoundFile.cpp | 2 +- src/SFML/Audio/Listener.cpp | 2 +- src/SFML/Audio/Music.cpp | 2 +- src/SFML/Audio/OutputSoundFile.cpp | 2 +- src/SFML/Audio/Sound.cpp | 2 +- src/SFML/Audio/SoundBuffer.cpp | 2 +- src/SFML/Audio/SoundBufferRecorder.cpp | 2 +- src/SFML/Audio/SoundFileFactory.cpp | 2 +- src/SFML/Audio/SoundFileReaderFlac.cpp | 2 +- src/SFML/Audio/SoundFileReaderFlac.hpp | 2 +- src/SFML/Audio/SoundFileReaderOgg.cpp | 2 +- src/SFML/Audio/SoundFileReaderOgg.hpp | 2 +- src/SFML/Audio/SoundFileReaderWav.cpp | 2 +- src/SFML/Audio/SoundFileReaderWav.hpp | 2 +- src/SFML/Audio/SoundFileWriterFlac.cpp | 2 +- src/SFML/Audio/SoundFileWriterFlac.hpp | 2 +- src/SFML/Audio/SoundFileWriterOgg.cpp | 2 +- src/SFML/Audio/SoundFileWriterOgg.hpp | 2 +- src/SFML/Audio/SoundFileWriterWav.cpp | 2 +- src/SFML/Audio/SoundFileWriterWav.hpp | 2 +- src/SFML/Audio/SoundRecorder.cpp | 2 +- src/SFML/Audio/SoundSource.cpp | 2 +- src/SFML/Audio/SoundStream.cpp | 2 +- src/SFML/Graphics/BlendMode.cpp | 2 +- src/SFML/Graphics/CircleShape.cpp | 2 +- src/SFML/Graphics/Color.cpp | 2 +- src/SFML/Graphics/ConvexShape.cpp | 2 +- src/SFML/Graphics/Font.cpp | 2 +- src/SFML/Graphics/GLCheck.cpp | 2 +- src/SFML/Graphics/GLCheck.hpp | 2 +- src/SFML/Graphics/GLExtensions.cpp | 2 +- src/SFML/Graphics/GLExtensions.hpp | 2 +- src/SFML/Graphics/GLLoader.cpp | 2 +- src/SFML/Graphics/GLLoader.hpp | 2 +- src/SFML/Graphics/Glsl.cpp | 2 +- src/SFML/Graphics/Image.cpp | 2 +- src/SFML/Graphics/ImageLoader.cpp | 2 +- src/SFML/Graphics/ImageLoader.hpp | 2 +- src/SFML/Graphics/RectangleShape.cpp | 2 +- src/SFML/Graphics/RenderStates.cpp | 2 +- src/SFML/Graphics/RenderTarget.cpp | 2 +- src/SFML/Graphics/RenderTexture.cpp | 2 +- src/SFML/Graphics/RenderTextureImpl.cpp | 2 +- src/SFML/Graphics/RenderTextureImpl.hpp | 2 +- src/SFML/Graphics/RenderTextureImplDefault.cpp | 2 +- src/SFML/Graphics/RenderTextureImplDefault.hpp | 2 +- src/SFML/Graphics/RenderTextureImplFBO.cpp | 2 +- src/SFML/Graphics/RenderTextureImplFBO.hpp | 2 +- src/SFML/Graphics/RenderWindow.cpp | 2 +- src/SFML/Graphics/Shader.cpp | 2 +- src/SFML/Graphics/Shape.cpp | 2 +- src/SFML/Graphics/Sprite.cpp | 2 +- src/SFML/Graphics/Text.cpp | 2 +- src/SFML/Graphics/Texture.cpp | 2 +- src/SFML/Graphics/TextureSaver.cpp | 2 +- src/SFML/Graphics/TextureSaver.hpp | 2 +- src/SFML/Graphics/Transform.cpp | 2 +- src/SFML/Graphics/Transformable.cpp | 2 +- src/SFML/Graphics/Vertex.cpp | 2 +- src/SFML/Graphics/VertexArray.cpp | 2 +- src/SFML/Graphics/VertexBuffer.cpp | 2 +- src/SFML/Graphics/View.cpp | 2 +- src/SFML/Main/MainAndroid.cpp | 2 +- src/SFML/Main/MainWin32.cpp | 2 +- src/SFML/Main/MainiOS.mm | 2 +- src/SFML/Network/Ftp.cpp | 2 +- src/SFML/Network/Http.cpp | 2 +- src/SFML/Network/IpAddress.cpp | 2 +- src/SFML/Network/Packet.cpp | 2 +- src/SFML/Network/Socket.cpp | 2 +- src/SFML/Network/SocketImpl.hpp | 2 +- src/SFML/Network/SocketSelector.cpp | 2 +- src/SFML/Network/TcpListener.cpp | 2 +- src/SFML/Network/TcpSocket.cpp | 2 +- src/SFML/Network/UdpSocket.cpp | 2 +- src/SFML/Network/Unix/SocketImpl.cpp | 2 +- src/SFML/Network/Unix/SocketImpl.hpp | 2 +- src/SFML/Network/Win32/SocketImpl.cpp | 2 +- src/SFML/Network/Win32/SocketImpl.hpp | 2 +- src/SFML/System/Android/Activity.cpp | 2 +- src/SFML/System/Android/NativeActivity.cpp | 2 +- src/SFML/System/Clock.cpp | 2 +- src/SFML/System/Err.cpp | 2 +- src/SFML/System/FileInputStream.cpp | 2 +- src/SFML/System/Lock.cpp | 2 +- src/SFML/System/MemoryInputStream.cpp | 2 +- src/SFML/System/Mutex.cpp | 2 +- src/SFML/System/Sleep.cpp | 2 +- src/SFML/System/String.cpp | 2 +- src/SFML/System/Thread.cpp | 2 +- src/SFML/System/ThreadLocal.cpp | 2 +- src/SFML/System/Time.cpp | 2 +- src/SFML/System/Unix/ClockImpl.cpp | 2 +- src/SFML/System/Unix/ClockImpl.hpp | 2 +- src/SFML/System/Unix/MutexImpl.cpp | 2 +- src/SFML/System/Unix/MutexImpl.hpp | 2 +- src/SFML/System/Unix/SleepImpl.cpp | 2 +- src/SFML/System/Unix/SleepImpl.hpp | 2 +- src/SFML/System/Unix/ThreadImpl.cpp | 2 +- src/SFML/System/Unix/ThreadImpl.hpp | 2 +- src/SFML/System/Unix/ThreadLocalImpl.cpp | 2 +- src/SFML/System/Unix/ThreadLocalImpl.hpp | 2 +- src/SFML/System/Win32/ClockImpl.cpp | 2 +- src/SFML/System/Win32/ClockImpl.hpp | 2 +- src/SFML/System/Win32/MutexImpl.cpp | 2 +- src/SFML/System/Win32/MutexImpl.hpp | 2 +- src/SFML/System/Win32/SleepImpl.cpp | 2 +- src/SFML/System/Win32/SleepImpl.hpp | 2 +- src/SFML/System/Win32/ThreadImpl.cpp | 2 +- src/SFML/System/Win32/ThreadImpl.hpp | 2 +- src/SFML/System/Win32/ThreadLocalImpl.cpp | 2 +- src/SFML/System/Win32/ThreadLocalImpl.hpp | 2 +- src/SFML/Window/Android/ClipboardImpl.cpp | 2 +- src/SFML/Window/Android/ClipboardImpl.hpp | 2 +- src/SFML/Window/Android/CursorImpl.cpp | 2 +- src/SFML/Window/Android/CursorImpl.hpp | 2 +- src/SFML/Window/Android/SensorImpl.cpp | 2 +- src/SFML/Window/Android/SensorImpl.hpp | 2 +- src/SFML/Window/Clipboard.cpp | 2 +- src/SFML/Window/ClipboardImpl.hpp | 2 +- src/SFML/Window/Context.cpp | 2 +- src/SFML/Window/Cursor.cpp | 2 +- src/SFML/Window/CursorImpl.hpp | 2 +- src/SFML/Window/FreeBSD/JoystickImpl.cpp | 2 +- src/SFML/Window/FreeBSD/JoystickImpl.hpp | 2 +- src/SFML/Window/GlContext.cpp | 2 +- src/SFML/Window/GlContext.hpp | 2 +- src/SFML/Window/GlResource.cpp | 2 +- src/SFML/Window/InputImpl.hpp | 2 +- src/SFML/Window/Joystick.cpp | 2 +- src/SFML/Window/JoystickImpl.hpp | 2 +- src/SFML/Window/JoystickManager.cpp | 2 +- src/SFML/Window/JoystickManager.hpp | 2 +- src/SFML/Window/Keyboard.cpp | 2 +- src/SFML/Window/Mouse.cpp | 2 +- src/SFML/Window/OSX/AutoreleasePoolWrapper.h | 2 +- src/SFML/Window/OSX/AutoreleasePoolWrapper.mm | 2 +- src/SFML/Window/OSX/ClipboardImpl.hpp | 2 +- src/SFML/Window/OSX/ClipboardImpl.mm | 2 +- src/SFML/Window/OSX/CursorImpl.hpp | 2 +- src/SFML/Window/OSX/CursorImpl.mm | 2 +- src/SFML/Window/OSX/HIDInputManager.hpp | 2 +- src/SFML/Window/OSX/HIDInputManager.mm | 2 +- src/SFML/Window/OSX/HIDJoystickManager.cpp | 2 +- src/SFML/Window/OSX/HIDJoystickManager.hpp | 2 +- src/SFML/Window/OSX/InputImpl.hpp | 2 +- src/SFML/Window/OSX/InputImpl.mm | 2 +- src/SFML/Window/OSX/JoystickImpl.cpp | 2 +- src/SFML/Window/OSX/JoystickImpl.hpp | 2 +- src/SFML/Window/OSX/NSImage+raw.h | 2 +- src/SFML/Window/OSX/NSImage+raw.mm | 2 +- src/SFML/Window/OSX/SFApplication.h | 2 +- src/SFML/Window/OSX/SFApplication.m | 2 +- src/SFML/Window/OSX/SFApplicationDelegate.h | 2 +- src/SFML/Window/OSX/SFApplicationDelegate.m | 2 +- src/SFML/Window/OSX/SFContext.hpp | 2 +- src/SFML/Window/OSX/SFContext.mm | 2 +- src/SFML/Window/OSX/SFKeyboardModifiersHelper.h | 2 +- src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm | 2 +- src/SFML/Window/OSX/SFOpenGLView+keyboard.mm | 2 +- src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h | 2 +- src/SFML/Window/OSX/SFOpenGLView+mouse.mm | 2 +- src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h | 2 +- src/SFML/Window/OSX/SFOpenGLView.h | 2 +- src/SFML/Window/OSX/SFOpenGLView.mm | 2 +- src/SFML/Window/OSX/SFSilentResponder.h | 2 +- src/SFML/Window/OSX/SFSilentResponder.m | 2 +- src/SFML/Window/OSX/SFViewController.h | 2 +- src/SFML/Window/OSX/SFViewController.mm | 2 +- src/SFML/Window/OSX/SFWindow.h | 2 +- src/SFML/Window/OSX/SFWindow.m | 2 +- src/SFML/Window/OSX/SFWindowController.h | 2 +- src/SFML/Window/OSX/SFWindowController.mm | 2 +- src/SFML/Window/OSX/Scaling.h | 2 +- src/SFML/Window/OSX/SensorImpl.cpp | 2 +- src/SFML/Window/OSX/SensorImpl.hpp | 2 +- src/SFML/Window/OSX/VideoModeImpl.cpp | 2 +- src/SFML/Window/OSX/WindowImplCocoa.hpp | 2 +- src/SFML/Window/OSX/WindowImplCocoa.mm | 2 +- src/SFML/Window/OSX/WindowImplDelegateProtocol.h | 2 +- src/SFML/Window/OSX/cg_sf_conversion.hpp | 2 +- src/SFML/Window/OSX/cg_sf_conversion.mm | 2 +- src/SFML/Window/OSX/cpp_objc_conversion.h | 2 +- src/SFML/Window/OSX/cpp_objc_conversion.mm | 2 +- src/SFML/Window/Sensor.cpp | 2 +- src/SFML/Window/SensorImpl.hpp | 2 +- src/SFML/Window/SensorManager.cpp | 2 +- src/SFML/Window/SensorManager.hpp | 2 +- src/SFML/Window/Touch.cpp | 2 +- src/SFML/Window/Unix/ClipboardImpl.cpp | 2 +- src/SFML/Window/Unix/ClipboardImpl.hpp | 2 +- src/SFML/Window/Unix/CursorImpl.cpp | 2 +- src/SFML/Window/Unix/CursorImpl.hpp | 2 +- src/SFML/Window/Unix/Display.cpp | 2 +- src/SFML/Window/Unix/Display.hpp | 2 +- src/SFML/Window/Unix/GlxContext.cpp | 2 +- src/SFML/Window/Unix/GlxContext.hpp | 2 +- src/SFML/Window/Unix/GlxExtensions.cpp | 2 +- src/SFML/Window/Unix/GlxExtensions.hpp | 2 +- src/SFML/Window/Unix/InputImpl.cpp | 2 +- src/SFML/Window/Unix/InputImpl.hpp | 2 +- src/SFML/Window/Unix/JoystickImpl.cpp | 2 +- src/SFML/Window/Unix/JoystickImpl.hpp | 2 +- src/SFML/Window/Unix/SensorImpl.cpp | 2 +- src/SFML/Window/Unix/SensorImpl.hpp | 2 +- src/SFML/Window/Unix/VideoModeImpl.cpp | 2 +- src/SFML/Window/Unix/WindowImplX11.cpp | 2 +- src/SFML/Window/Unix/WindowImplX11.hpp | 2 +- src/SFML/Window/VideoMode.cpp | 2 +- src/SFML/Window/VideoModeImpl.hpp | 2 +- src/SFML/Window/Win32/ClipboardImpl.cpp | 2 +- src/SFML/Window/Win32/ClipboardImpl.hpp | 2 +- src/SFML/Window/Win32/CursorImpl.cpp | 2 +- src/SFML/Window/Win32/CursorImpl.hpp | 2 +- src/SFML/Window/Win32/InputImpl.cpp | 2 +- src/SFML/Window/Win32/InputImpl.hpp | 2 +- src/SFML/Window/Win32/JoystickImpl.cpp | 2 +- src/SFML/Window/Win32/JoystickImpl.hpp | 2 +- src/SFML/Window/Win32/SensorImpl.cpp | 2 +- src/SFML/Window/Win32/SensorImpl.hpp | 2 +- src/SFML/Window/Win32/VideoModeImpl.cpp | 2 +- src/SFML/Window/Win32/WglContext.cpp | 2 +- src/SFML/Window/Win32/WglContext.hpp | 2 +- src/SFML/Window/Win32/WglExtensions.cpp | 2 +- src/SFML/Window/Win32/WglExtensions.hpp | 2 +- src/SFML/Window/Win32/WindowImplWin32.cpp | 2 +- src/SFML/Window/Win32/WindowImplWin32.hpp | 2 +- src/SFML/Window/Window.cpp | 2 +- src/SFML/Window/WindowBase.cpp | 2 +- src/SFML/Window/WindowImpl.cpp | 2 +- src/SFML/Window/WindowImpl.hpp | 2 +- src/SFML/Window/iOS/ClipboardImpl.hpp | 2 +- src/SFML/Window/iOS/ClipboardImpl.mm | 2 +- src/SFML/Window/iOS/CursorImpl.cpp | 2 +- src/SFML/Window/iOS/CursorImpl.hpp | 2 +- src/SFML/Window/iOS/EaglContext.hpp | 2 +- src/SFML/Window/iOS/EaglContext.mm | 2 +- src/SFML/Window/iOS/InputImpl.hpp | 2 +- src/SFML/Window/iOS/InputImpl.mm | 2 +- src/SFML/Window/iOS/JoystickImpl.hpp | 2 +- src/SFML/Window/iOS/JoystickImpl.mm | 2 +- src/SFML/Window/iOS/ObjCType.hpp | 2 +- src/SFML/Window/iOS/SFAppDelegate.hpp | 2 +- src/SFML/Window/iOS/SFAppDelegate.mm | 2 +- src/SFML/Window/iOS/SFMain.hpp | 2 +- src/SFML/Window/iOS/SFMain.mm | 2 +- src/SFML/Window/iOS/SFView.hpp | 2 +- src/SFML/Window/iOS/SFView.mm | 2 +- src/SFML/Window/iOS/SFViewController.hpp | 2 +- src/SFML/Window/iOS/SFViewController.mm | 2 +- src/SFML/Window/iOS/SensorImpl.hpp | 2 +- src/SFML/Window/iOS/SensorImpl.mm | 2 +- src/SFML/Window/iOS/VideoModeImpl.mm | 2 +- src/SFML/Window/iOS/WindowImplUIKit.hpp | 2 +- src/SFML/Window/iOS/WindowImplUIKit.mm | 2 +- tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp | 2 +- tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm | 2 +- .../templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in | 2 +- .../templates/SFML/SFML Base.xctemplate/TemplateInfo.plist | 2 +- .../templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist | 2 +- .../xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist | 2 +- .../SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in | 2 +- .../templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist | 2 +- 383 files changed, 383 insertions(+), 383 deletions(-) diff --git a/examples/cocoa/CocoaAppDelegate.h b/examples/cocoa/CocoaAppDelegate.h index 9dab1384..1a21572f 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-2019 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 a58ca878..d264000c 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-2019 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.h b/examples/cocoa/NSString+stdstring.h index cce9bd80..fa3df095 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-2019 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 92b79845..4958ae7d 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-2019 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/main.m b/examples/cocoa/main.m index b7aa9444..209a86bf 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-2019 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 1348f3cc..7a7da9b9 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-2019 Marco Antognini and Laurent Gomila. Shared under zlib/libpng License.</string> <key>NSMainNibFile</key> <string>MainMenu</string> <key>NSPrincipalClass</key> diff --git a/include/SFML/Audio.hpp b/include/SFML/Audio.hpp index 31679273..f0b5b30a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 dd7d44c4..9f0f4dcd 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 9e5e09c2..bba990d9 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 2c9f897a..30354bde 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Listener.hpp b/include/SFML/Audio/Listener.hpp index 9fb7fff0..f14beda2 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 53519052..44428acd 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/OutputSoundFile.hpp b/include/SFML/Audio/OutputSoundFile.hpp index efa7c4b7..25c9ccd1 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Sound.hpp b/include/SFML/Audio/Sound.hpp index f8e2e14c..5a001045 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundBuffer.hpp b/include/SFML/Audio/SoundBuffer.hpp index 5aaa4ca9..ca506ef4 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundBufferRecorder.hpp b/include/SFML/Audio/SoundBufferRecorder.hpp index 266603df..f7d147e4 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileFactory.hpp b/include/SFML/Audio/SoundFileFactory.hpp index e3719c81..a00d6dcd 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileFactory.inl b/include/SFML/Audio/SoundFileFactory.inl index 6c499f36..e9794153 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 a040db93..e6ef7a41 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileWriter.hpp b/include/SFML/Audio/SoundFileWriter.hpp index 8651ddce..5e7ae016 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d4dc74f3..4a6fec25 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundSource.hpp b/include/SFML/Audio/SoundSource.hpp index fcc9c793..ac9d17a1 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundStream.hpp b/include/SFML/Audio/SoundStream.hpp index 1d5f3422..1659d7d2 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Config.hpp b/include/SFML/Config.hpp index 40b677eb..70b4a92d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GpuPreference.hpp b/include/SFML/GpuPreference.hpp index cde4f9f1..a05c5a1d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 252c6e9f..d0e0c8ff 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 15da7d17..f3ec906f 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/CircleShape.hpp b/include/SFML/Graphics/CircleShape.hpp index 896c8931..aa139c8e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Color.hpp b/include/SFML/Graphics/Color.hpp index 43357aa3..92931f11 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ConvexShape.hpp b/include/SFML/Graphics/ConvexShape.hpp index e770299e..7b1bfd0c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Drawable.hpp b/include/SFML/Graphics/Drawable.hpp index 852b22d2..f03e5e0e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 0b47b391..1d9d6083 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e7538662..7316d430 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/include/SFML/Graphics/Glsl.hpp index e3943e74..c395344e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 9c9f0aee..1fd2816a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Glyph.hpp b/include/SFML/Graphics/Glyph.hpp index 59deb9b6..ce2fb158 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Image.hpp b/include/SFML/Graphics/Image.hpp index c1d672a6..a58b3bc8 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/PrimitiveType.hpp b/include/SFML/Graphics/PrimitiveType.hpp index 28cf58dd..6e4a3949 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Rect.hpp b/include/SFML/Graphics/Rect.hpp index 17f20a56..f3c6d3b6 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Rect.inl b/include/SFML/Graphics/Rect.inl index 7a82e46c..ef3fc345 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RectangleShape.hpp b/include/SFML/Graphics/RectangleShape.hpp index 4f2c4d96..b4f2ff07 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderStates.hpp b/include/SFML/Graphics/RenderStates.hpp index 9bcde9b4..a04e977a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTarget.hpp b/include/SFML/Graphics/RenderTarget.hpp index 0d167460..c35a99ea 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTexture.hpp b/include/SFML/Graphics/RenderTexture.hpp index a26d94b6..ebb39127 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderWindow.hpp b/include/SFML/Graphics/RenderWindow.hpp index 01f07828..b8478197 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Shader.hpp b/include/SFML/Graphics/Shader.hpp index 664dd865..6b0026e8 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Shape.hpp b/include/SFML/Graphics/Shape.hpp index 79ac5282..94990f29 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Sprite.hpp b/include/SFML/Graphics/Sprite.hpp index 55cc8988..b44584be 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Text.hpp b/include/SFML/Graphics/Text.hpp index dae6ef2d..158e149a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Texture.hpp b/include/SFML/Graphics/Texture.hpp index c292856d..a07b5d70 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Transform.hpp b/include/SFML/Graphics/Transform.hpp index c77d08a9..1ee2c86a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Transformable.hpp b/include/SFML/Graphics/Transformable.hpp index 67a56562..b5fe42f3 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Vertex.hpp b/include/SFML/Graphics/Vertex.hpp index bb24448f..f3284492 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VertexArray.hpp b/include/SFML/Graphics/VertexArray.hpp index 52290650..0f121be3 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VertexBuffer.hpp b/include/SFML/Graphics/VertexBuffer.hpp index a91a08f7..cffbd09d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/View.hpp b/include/SFML/Graphics/View.hpp index a3faa6e0..b85d8817 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Main.hpp b/include/SFML/Main.hpp index c28a7e18..9cc93623 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 ccc9f7cd..fc2c626b 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e7ebdd47..b3c52218 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 ee779ccb..ebdf27bb 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Http.hpp b/include/SFML/Network/Http.hpp index 44fe67dc..c2008153 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/IpAddress.hpp b/include/SFML/Network/IpAddress.hpp index 9ec13c43..5065cd7c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Packet.hpp b/include/SFML/Network/Packet.hpp index 9f0edab4..c3cf945e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Socket.hpp b/include/SFML/Network/Socket.hpp index d260174e..9f09c0d5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SocketHandle.hpp b/include/SFML/Network/SocketHandle.hpp index 270201b5..1dd13095 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 106d708b..3017d08a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/TcpListener.hpp b/include/SFML/Network/TcpListener.hpp index e0e05d64..1f99f6d1 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/TcpSocket.hpp b/include/SFML/Network/TcpSocket.hpp index 6c0ab98a..7ab0bff1 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/UdpSocket.hpp b/include/SFML/Network/UdpSocket.hpp index 7ce3fe55..8e395886 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/OpenGL.hpp b/include/SFML/OpenGL.hpp index 6db5d01a..cc48a483 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/include/SFML/System.hpp index fa4f9c92..37dff6bb 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 391e2c40..5475123e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Err.hpp b/include/SFML/System/Err.hpp index a701fef2..37bf1388 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e9c8ef83..39dfd20b 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 ca267972..2c816b8f 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputStream.hpp b/include/SFML/System/InputStream.hpp index 495a4b94..a4cb52ee 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 906016c7..9dc643ee 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/MemoryInputStream.hpp b/include/SFML/System/MemoryInputStream.hpp index 4b7f9ef8..195d13a5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Mutex.hpp b/include/SFML/System/Mutex.hpp index eda6909a..ceeea82d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/NativeActivity.hpp b/include/SFML/System/NativeActivity.hpp index e8a3b17b..6f5437eb 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 dbe1eebc..1115ce2c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 ac3144be..aa3bc3a7 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 5d047e20..0ecf9399 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.inl b/include/SFML/System/String.inl index b8893e73..85915d82 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 15ae4a5b..59e3c662 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.inl b/include/SFML/System/Thread.inl index 1f2e8de8..1d40c54d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1ace1ba1..d79a0575 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/include/SFML/System/ThreadLocalPtr.hpp index bee944d3..549ffb0d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 12c76903..14e453e9 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 43d7548b..98968a91 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/include/SFML/System/Utf.hpp index e1e78f67..1452d3d5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 67fad8ba..d48d8b51 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Vector2.hpp b/include/SFML/System/Vector2.hpp index 237f214c..1eca0270 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Vector2.inl b/include/SFML/System/Vector2.inl index 29ad76f6..2faee862 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 b12b2f58..cac24c24 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.inl b/include/SFML/System/Vector3.inl index b532fe0e..f139dcde 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 836f13a5..da70c3ce 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 50ea8042..b7c1cd06 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 71e2c0a6..00418e5e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ContextSettings.hpp b/include/SFML/Window/ContextSettings.hpp index 00afbc47..91c0f7cd 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Cursor.hpp b/include/SFML/Window/Cursor.hpp index d85bca63..da6b15b3 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Event.hpp b/include/SFML/Window/Event.hpp index 92617852..955b1073 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Export.hpp b/include/SFML/Window/Export.hpp index 37826a24..5b198410 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 f7012426..3d007fc5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 ab49c744..25ac8b6a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Keyboard.hpp b/include/SFML/Window/Keyboard.hpp index 7c59c571..3d882542 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Mouse.hpp b/include/SFML/Window/Mouse.hpp index 4b5ba07a..e5df9fbd 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Sensor.hpp b/include/SFML/Window/Sensor.hpp index 6915fa06..4f40e627 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Touch.hpp b/include/SFML/Window/Touch.hpp index f97edddd..fa64f390 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VideoMode.hpp b/include/SFML/Window/VideoMode.hpp index 24797f60..03b1ee6a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Window.hpp b/include/SFML/Window/Window.hpp index 21f6239b..77728696 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowBase.hpp b/include/SFML/Window/WindowBase.hpp index e157f5a5..f1856f73 100644 --- a/include/SFML/Window/WindowBase.hpp +++ b/include/SFML/Window/WindowBase.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowHandle.hpp b/include/SFML/Window/WindowHandle.hpp index daad0471..c05d50be 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowStyle.hpp b/include/SFML/Window/WindowStyle.hpp index 53e2c9df..5a0b7e85 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/license.md b/license.md index 0e6d7b18..9f6db1a9 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-2019 Laurent Gomila - laurent@sfml-dev.org This software is provided 'as-is', without 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/ALCheck.cpp b/src/SFML/Audio/ALCheck.cpp index b6f1e2a0..8514cc98 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ALCheck.hpp b/src/SFML/Audio/ALCheck.hpp index c67d117d..963d271a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/AlResource.cpp b/src/SFML/Audio/AlResource.cpp index 9be2e34c..f59d36b4 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 a9472f00..ab6cb90d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Audio/AudioDevice.hpp index f5007edb..af940217 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputSoundFile.cpp b/src/SFML/Audio/InputSoundFile.cpp index 9cc781ff..6d9da57c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Listener.cpp b/src/SFML/Audio/Listener.cpp index dc348f94..bbbece5e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 141d6903..b8829d02 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/OutputSoundFile.cpp b/src/SFML/Audio/OutputSoundFile.cpp index 16e41d38..c6584352 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 b7a0b130..36e65849 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundBuffer.cpp b/src/SFML/Audio/SoundBuffer.cpp index edcd4557..dfd137ff 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundBufferRecorder.cpp b/src/SFML/Audio/SoundBufferRecorder.cpp index 3c70a651..12694354 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 81383199..a0caf7a1 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileReaderFlac.cpp b/src/SFML/Audio/SoundFileReaderFlac.cpp index f42a132a..c9a8cb97 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileReaderFlac.hpp b/src/SFML/Audio/SoundFileReaderFlac.hpp index 6cb0b869..ac974ea1 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileReaderOgg.cpp b/src/SFML/Audio/SoundFileReaderOgg.cpp index 183e3b25..0621cad0 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileReaderOgg.hpp b/src/SFML/Audio/SoundFileReaderOgg.hpp index 0e84e8f6..67b03f47 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 84d92c1e..e498dd55 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Audio/SoundFileReaderWav.hpp index 65adb8da..cc92aa9a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileWriterFlac.cpp b/src/SFML/Audio/SoundFileWriterFlac.cpp index 045d0861..f30c2fec 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileWriterFlac.hpp b/src/SFML/Audio/SoundFileWriterFlac.hpp index b6382e04..40b710f1 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileWriterOgg.cpp b/src/SFML/Audio/SoundFileWriterOgg.cpp index 56e2ac7c..9791ef36 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileWriterOgg.hpp b/src/SFML/Audio/SoundFileWriterOgg.hpp index 4b4d19bb..19bb6cca 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 153e1481..3353d236 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Audio/SoundFileWriterWav.hpp index d8dcc178..0de16787 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundRecorder.cpp b/src/SFML/Audio/SoundRecorder.cpp index 4281b981..8b0b6901 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundSource.cpp b/src/SFML/Audio/SoundSource.cpp index 785f9cc2..f4bc4b20 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundStream.cpp b/src/SFML/Audio/SoundStream.cpp index 0e405482..5b6fff02 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/BlendMode.cpp b/src/SFML/Graphics/BlendMode.cpp index 0d9cf95b..7f0901af 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/CircleShape.cpp b/src/SFML/Graphics/CircleShape.cpp index 0cfa3c70..730353fc 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Color.cpp b/src/SFML/Graphics/Color.cpp index 03f99a4c..02b8581f 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ConvexShape.cpp b/src/SFML/Graphics/ConvexShape.cpp index 56aa787f..9346e3d9 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 308070a0..dbe4de9f 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Graphics/GLCheck.cpp index 580e838f..5bb140c1 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 86b96de3..19ab3b1e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 fff712d7..898515bf 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Graphics/GLExtensions.hpp index 687cf376..f96ceb62 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GLLoader.cpp b/src/SFML/Graphics/GLLoader.cpp index 85f6d7e5..e0a9e80c 100644 --- a/src/SFML/Graphics/GLLoader.cpp +++ b/src/SFML/Graphics/GLLoader.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GLLoader.hpp b/src/SFML/Graphics/GLLoader.hpp index 9fe4adb1..45b80da8 100644 --- a/src/SFML/Graphics/GLLoader.hpp +++ b/src/SFML/Graphics/GLLoader.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Glsl.cpp b/src/SFML/Graphics/Glsl.cpp index e8f9c1e1..3a1e5593 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 67c2840d..1ef43269 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ImageLoader.cpp b/src/SFML/Graphics/ImageLoader.cpp index 023541d3..3c26e49c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ImageLoader.hpp b/src/SFML/Graphics/ImageLoader.hpp index 0134bd8a..ce437b43 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RectangleShape.cpp b/src/SFML/Graphics/RectangleShape.cpp index f7778c04..58777fd5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 4c55546a..adaceb34 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 9a6e3018..7f4ccb46 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTexture.cpp b/src/SFML/Graphics/RenderTexture.cpp index 51abee92..bd0566a0 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Graphics/RenderTextureImpl.cpp index d1e927c8..63d55f0b 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 5a357c72..5ed3733c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTextureImplDefault.cpp b/src/SFML/Graphics/RenderTextureImplDefault.cpp index 29399d50..dabc938e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTextureImplDefault.hpp b/src/SFML/Graphics/RenderTextureImplDefault.hpp index c3b59aea..d3e9ef5e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTextureImplFBO.cpp b/src/SFML/Graphics/RenderTextureImplFBO.cpp index c0debd79..c2afc8b0 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTextureImplFBO.hpp b/src/SFML/Graphics/RenderTextureImplFBO.hpp index f83074ef..4a783965 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderWindow.cpp b/src/SFML/Graphics/RenderWindow.cpp index 9926fb45..38ec2a7c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Shader.cpp b/src/SFML/Graphics/Shader.cpp index 353a72df..b7aed77a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Shape.cpp b/src/SFML/Graphics/Shape.cpp index 545b6fa8..d0245d5d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Sprite.cpp b/src/SFML/Graphics/Sprite.cpp index feb79a4b..1fdfc5d5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Text.cpp b/src/SFML/Graphics/Text.cpp index 66875513..7cb4f889 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Texture.cpp b/src/SFML/Graphics/Texture.cpp index fd94acf1..9cf7b19c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/TextureSaver.cpp b/src/SFML/Graphics/TextureSaver.cpp index 2b7d8af8..1a71c089 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/TextureSaver.hpp b/src/SFML/Graphics/TextureSaver.hpp index 170fe463..5ee9f000 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Transform.cpp b/src/SFML/Graphics/Transform.cpp index 22d3e707..68d3e3be 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 81016702..a47b2ee0 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Vertex.cpp b/src/SFML/Graphics/Vertex.cpp index 2655f736..e389b68a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 58c98f70..accf7e79 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 8e079806..4d5497c8 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/View.cpp b/src/SFML/Graphics/View.cpp index 0fcf6548..4d1fb2f3 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Main/MainAndroid.cpp b/src/SFML/Main/MainAndroid.cpp index 5e621339..7f4d8e2e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Main/MainWin32.cpp b/src/SFML/Main/MainWin32.cpp index fefc1b7c..a8aa19d4 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-2019 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. diff --git a/src/SFML/Main/MainiOS.mm b/src/SFML/Main/MainiOS.mm index fa88e694..901248a1 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-2019 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/Network/Ftp.cpp b/src/SFML/Network/Ftp.cpp index 41a630f4..a4cd12e7 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Http.cpp b/src/SFML/Network/Http.cpp index 7fdc81a7..251b8125 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/IpAddress.cpp b/src/SFML/Network/IpAddress.cpp index 95561389..8cc145f6 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Packet.cpp b/src/SFML/Network/Packet.cpp index 0dc2bbcf..ac039412 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Socket.cpp b/src/SFML/Network/Socket.cpp index d1004219..7a92a473 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d1ffebed..1f6803da 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 fa00c63d..37dda021 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/TcpListener.cpp b/src/SFML/Network/TcpListener.cpp index 399f87d6..8a79b99b 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d8effa1c..7a8e9183 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/UdpSocket.cpp b/src/SFML/Network/UdpSocket.cpp index 0ff03b04..373b6842 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Network/Unix/SocketImpl.cpp index 4029480e..e565a482 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 b70c0773..9b816baa 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Win32/SocketImpl.cpp b/src/SFML/Network/Win32/SocketImpl.cpp index bd536654..9bff3d7a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Win32/SocketImpl.hpp b/src/SFML/Network/Win32/SocketImpl.hpp index 978336fa..7fdfa52e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Android/Activity.cpp b/src/SFML/System/Android/Activity.cpp index 5d140265..b52921aa 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-2019 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. diff --git a/src/SFML/System/Android/NativeActivity.cpp b/src/SFML/System/Android/NativeActivity.cpp index ac489ae4..39a2fbce 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Clock.cpp b/src/SFML/System/Clock.cpp index 9f09533e..dc3a2544 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d186931c..0a593e3a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/FileInputStream.cpp b/src/SFML/System/FileInputStream.cpp index 89e77c47..41c91176 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Lock.cpp b/src/SFML/System/Lock.cpp index ada1ca1a..0fbb404d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 3bd02b4b..d6334acd 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Mutex.cpp b/src/SFML/System/Mutex.cpp index 139bf569..2f6726f3 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 35db5e80..fc036c48 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d8831f9d..c33cb948 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 098018a3..bd250a90 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 62d81175..812a99b7 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 681c9a9d..09abf45f 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClockImpl.cpp b/src/SFML/System/Unix/ClockImpl.cpp index 0d4f2bd9..2a70fbd7 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClockImpl.hpp b/src/SFML/System/Unix/ClockImpl.hpp index 56f550c6..942ee9c4 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 cc4e38e1..b9c46749 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 cf0c0dd0..dead79d0 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 f6fb6087..1da9b8db 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/System/Unix/SleepImpl.hpp index 8d146d41..0fb634e9 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e80213f9..d8d4d9ad 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 2cd13d0f..e538514d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1fea0c9e..45d08fb4 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 919dcd5b..db71e0b9 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 f69da4ba..603426d8 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/System/Win32/ClockImpl.hpp index d40ec6fc..cbca5c24 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 8fdd388b..7d562a38 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 95721141..2af0d91e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SleepImpl.cpp b/src/SFML/System/Win32/SleepImpl.cpp index 41c10188..172a8a88 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SleepImpl.hpp b/src/SFML/System/Win32/SleepImpl.hpp index ad0138d9..37005ab7 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 f5d2e2ee..e1c84993 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 913585fc..d0c87b5d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/System/Win32/ThreadLocalImpl.cpp index bd28da30..eef6106a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e617dfed..ef29b683 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClipboardImpl.cpp b/src/SFML/Window/Android/ClipboardImpl.cpp index a5d3a19c..c7d3728e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClipboardImpl.hpp b/src/SFML/Window/Android/ClipboardImpl.hpp index 8d33dc6e..c243999c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 da5fff5e..faf0b631 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/Android/CursorImpl.hpp index fe5f9486..096902d5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SensorImpl.cpp b/src/SFML/Window/Android/SensorImpl.cpp index 3a018b50..9497d9d6 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SensorImpl.hpp b/src/SFML/Window/Android/SensorImpl.hpp index 4ce19a45..ce6865ee 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Clipboard.cpp b/src/SFML/Window/Clipboard.cpp index 9148c97a..230789e3 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 8e60d4e2..7efd448f 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Context.cpp b/src/SFML/Window/Context.cpp index 4e0a4b8a..2b174aa0 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Cursor.cpp b/src/SFML/Window/Cursor.cpp index c71491f2..91b08686 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d48220cf..afb22ddb 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/FreeBSD/JoystickImpl.cpp b/src/SFML/Window/FreeBSD/JoystickImpl.cpp index 6bc646df..9e5677b6 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-2019 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. diff --git a/src/SFML/Window/FreeBSD/JoystickImpl.hpp b/src/SFML/Window/FreeBSD/JoystickImpl.hpp index 5b2c0295..f16672cd 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 2e1a4824..39dc9339 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/GlContext.hpp index 0b66965e..182eb733 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GlResource.cpp b/src/SFML/Window/GlResource.cpp index 64fc88c5..64c7f602 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 305fc09d..61982965 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Joystick.cpp b/src/SFML/Window/Joystick.cpp index 62793f10..13faa2cd 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e4fd7e2d..6323fd70 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickManager.cpp b/src/SFML/Window/JoystickManager.cpp index 1574faa1..0741fdf7 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickManager.hpp b/src/SFML/Window/JoystickManager.hpp index 08692cdb..f6425172 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Keyboard.cpp b/src/SFML/Window/Keyboard.cpp index 14cda196..d37e3f87 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Mouse.cpp b/src/SFML/Window/Mouse.cpp index e1d4bb8d..a64bb9a7 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/AutoreleasePoolWrapper.h b/src/SFML/Window/OSX/AutoreleasePoolWrapper.h index 020fa22a..bf3125eb 100644 --- a/src/SFML/Window/OSX/AutoreleasePoolWrapper.h +++ b/src/SFML/Window/OSX/AutoreleasePoolWrapper.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2019 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/AutoreleasePoolWrapper.mm b/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm index 6b341b25..b8f5c1a4 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-2019 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/ClipboardImpl.hpp b/src/SFML/Window/OSX/ClipboardImpl.hpp index d3aabefa..a59de40d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 a14d871d..6f051b5b 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/CursorImpl.hpp b/src/SFML/Window/OSX/CursorImpl.hpp index 43af7920..f12b94b0 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-2019 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 ed905ef5..1ca93607 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-2019 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/HIDInputManager.hpp b/src/SFML/Window/OSX/HIDInputManager.hpp index 388d008a..3e143c8a 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-2019 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/HIDInputManager.mm b/src/SFML/Window/OSX/HIDInputManager.mm index a332932f..7fd40ecb 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-2019 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/HIDJoystickManager.cpp b/src/SFML/Window/OSX/HIDJoystickManager.cpp index 72c165a3..0a7cb7c8 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-2019 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/HIDJoystickManager.hpp b/src/SFML/Window/OSX/HIDJoystickManager.hpp index eb249cc3..32e79c80 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-2019 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 d6322655..30943407 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-2019 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.mm b/src/SFML/Window/OSX/InputImpl.mm index 6783a845..0397237a 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-2019 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/JoystickImpl.cpp b/src/SFML/Window/OSX/JoystickImpl.cpp index 9552b192..333cf462 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-2019 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/JoystickImpl.hpp b/src/SFML/Window/OSX/JoystickImpl.hpp index f4ad6807..cdcd741d 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-2019 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 99e04841..4530c136 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-2019 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 56ee6c92..03bd6d9e 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-2019 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.h b/src/SFML/Window/OSX/SFApplication.h index 5f2071f3..b2a97531 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-2019 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 a9225432..a438c7a1 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-2019 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.h b/src/SFML/Window/OSX/SFApplicationDelegate.h index 542c0a1f..9f39e923 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-2019 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 d7e6050c..a6fff904 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-2019 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.hpp b/src/SFML/Window/OSX/SFContext.hpp index 5fa3b210..87473a58 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-2019 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 cf74de91..ab1e04ce 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-2019 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/SFKeyboardModifiersHelper.h b/src/SFML/Window/OSX/SFKeyboardModifiersHelper.h index ee2ef66f..ea2d5a17 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-2019 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/SFKeyboardModifiersHelper.mm b/src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm index 763f2ca5..105e9110 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-2019 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+keyboard.mm b/src/SFML/Window/OSX/SFOpenGLView+keyboard.mm index 907de16e..eb3e1231 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-2019 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+keyboard_priv.h b/src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h index 6003c00f..8496affa 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-2019 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 4b23042a..99acef0b 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-2019 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_priv.h b/src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h index 6f509ad4..fb64368a 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-2019 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 7444ff73..b2a66896 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-2019 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.mm b/src/SFML/Window/OSX/SFOpenGLView.mm index e8fca847..85d5cd8d 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-2019 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.h b/src/SFML/Window/OSX/SFSilentResponder.h index a9f9b7c7..de0471c7 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-2019 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 feb5783e..55c0fb84 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-2019 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 69dc7a39..f0e59f47 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-2019 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 c92283b5..c8266be0 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-2019 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/SFWindow.h b/src/SFML/Window/OSX/SFWindow.h index 1d35245e..9e9a9e38 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-2019 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/SFWindow.m b/src/SFML/Window/OSX/SFWindow.m index 087f990d..77bc637f 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-2019 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/SFWindowController.h b/src/SFML/Window/OSX/SFWindowController.h index df0585b8..62e346a4 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-2019 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/SFWindowController.mm b/src/SFML/Window/OSX/SFWindowController.mm index 186a0fbe..190af4df 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-2019 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/Scaling.h b/src/SFML/Window/OSX/Scaling.h index 62f13aec..a71f62d9 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-2019 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/SensorImpl.cpp b/src/SFML/Window/OSX/SensorImpl.cpp index 3496265a..a0c83977 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 fe81b8d4..3da61189 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 efd5e46f..4370926e 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-2019 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/WindowImplCocoa.hpp b/src/SFML/Window/OSX/WindowImplCocoa.hpp index eea318de..0035fe94 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-2019 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/WindowImplCocoa.mm b/src/SFML/Window/OSX/WindowImplCocoa.mm index edb69358..eaa67bfe 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-2019 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/WindowImplDelegateProtocol.h b/src/SFML/Window/OSX/WindowImplDelegateProtocol.h index d6cfa901..29d8410c 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-2019 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.hpp b/src/SFML/Window/OSX/cg_sf_conversion.hpp index c928dd9c..099e0c5a 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-2019 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 5d9a53f8..dfc8f394 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-2019 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.h b/src/SFML/Window/OSX/cpp_objc_conversion.h index db0d572e..572829f6 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-2019 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 0ac4b50e..d3534069 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-2019 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/Sensor.cpp b/src/SFML/Window/Sensor.cpp index ae374129..3caf78fc 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 a5434729..bc42532a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Window/SensorManager.cpp index 82665e39..1c14e0e7 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 2285ad3b..e7bba30f 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Touch.cpp b/src/SFML/Window/Touch.cpp index 90c36fb4..bac6a93e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClipboardImpl.cpp b/src/SFML/Window/Unix/ClipboardImpl.cpp index df2fd954..a01ca932 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClipboardImpl.hpp b/src/SFML/Window/Unix/ClipboardImpl.hpp index 48ec7876..ab9e1548 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 011a2b1f..2b566b7f 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/Unix/CursorImpl.hpp index 9bd4052b..6740f220 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Display.cpp b/src/SFML/Window/Unix/Display.cpp index 351a1284..f9157e97 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Display.hpp b/src/SFML/Window/Unix/Display.hpp index d2bb7364..c8a6687c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GlxContext.cpp b/src/SFML/Window/Unix/GlxContext.cpp index 507cfcb0..73f42397 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GlxContext.hpp b/src/SFML/Window/Unix/GlxContext.hpp index e974c448..c7628b7b 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GlxExtensions.cpp b/src/SFML/Window/Unix/GlxExtensions.cpp index cfc35b2c..7e8450c1 100644 --- a/src/SFML/Window/Unix/GlxExtensions.cpp +++ b/src/SFML/Window/Unix/GlxExtensions.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GlxExtensions.hpp b/src/SFML/Window/Unix/GlxExtensions.hpp index fb2c7da8..153e96f1 100644 --- a/src/SFML/Window/Unix/GlxExtensions.hpp +++ b/src/SFML/Window/Unix/GlxExtensions.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.cpp b/src/SFML/Window/Unix/InputImpl.cpp index c9f2a2cc..3818805e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.hpp b/src/SFML/Window/Unix/InputImpl.hpp index 1b1d6374..741a92e5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickImpl.cpp b/src/SFML/Window/Unix/JoystickImpl.cpp index 56c72343..a6fe1afc 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickImpl.hpp b/src/SFML/Window/Unix/JoystickImpl.hpp index f81e7441..946b9fd3 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Window/Unix/SensorImpl.cpp index 3496265a..a0c83977 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 2667de34..67a9277b 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 288ef3e0..9107e9c5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index fc1324ca..fa0cfc43 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImplX11.hpp b/src/SFML/Window/Unix/WindowImplX11.hpp index a025a1ae..2a107ab7 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VideoMode.cpp b/src/SFML/Window/VideoMode.cpp index 12c3801d..d1f9e46e 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 73714722..d5dbed2a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Window/Win32/ClipboardImpl.cpp index 13fd06f1..17c02f13 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 c42ec5e0..6d627509 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d1913d66..9d275b7a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/Win32/CursorImpl.hpp index 602f2231..18dd3952 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.cpp b/src/SFML/Window/Win32/InputImpl.cpp index 52e57a1d..5f4e993c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.hpp b/src/SFML/Window/Win32/InputImpl.hpp index 5098bbad..87e21209 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickImpl.cpp b/src/SFML/Window/Win32/JoystickImpl.cpp index 1b98d9d3..2e925a57 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickImpl.hpp b/src/SFML/Window/Win32/JoystickImpl.hpp index 8affc27e..c259df15 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Window/Win32/SensorImpl.cpp index 3496265a..a0c83977 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e8b618eb..1c50fa63 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 71ad671c..1f77be3f 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WglContext.cpp b/src/SFML/Window/Win32/WglContext.cpp index 1bd8e9be..09496082 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WglContext.hpp b/src/SFML/Window/Win32/WglContext.hpp index d692605e..c0e353a5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WglExtensions.cpp b/src/SFML/Window/Win32/WglExtensions.cpp index b96271bb..d5042ded 100644 --- a/src/SFML/Window/Win32/WglExtensions.cpp +++ b/src/SFML/Window/Win32/WglExtensions.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WglExtensions.hpp b/src/SFML/Window/Win32/WglExtensions.hpp index 3cefd99c..7a863112 100644 --- a/src/SFML/Window/Win32/WglExtensions.hpp +++ b/src/SFML/Window/Win32/WglExtensions.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index e8e17fe5..e4e0dba5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImplWin32.hpp b/src/SFML/Window/Win32/WindowImplWin32.hpp index 4114c51b..a569c381 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Window.cpp b/src/SFML/Window/Window.cpp index 34d1b439..2ece6701 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowBase.cpp b/src/SFML/Window/WindowBase.cpp index cece16b3..58935cad 100644 --- a/src/SFML/Window/WindowBase.cpp +++ b/src/SFML/Window/WindowBase.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImpl.cpp b/src/SFML/Window/WindowImpl.cpp index 3de404a0..928493f5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImpl.hpp b/src/SFML/Window/WindowImpl.hpp index a360a018..abcafbb0 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/ClipboardImpl.hpp index f89d5a99..2e26069d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 641e16c9..d241b508 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 a886f32f..d83fb64a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/CursorImpl.hpp index 9d1dbfc8..f64191dd 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 7121f2e5..b67261b1 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.mm b/src/SFML/Window/iOS/EaglContext.mm index 9fd6b836..3a3254a8 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.hpp b/src/SFML/Window/iOS/InputImpl.hpp index 75b02b06..6bde166a 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.mm b/src/SFML/Window/iOS/InputImpl.mm index 92a2fd16..6d14f313 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/JoystickImpl.hpp index e9fc8bd9..f09429a9 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 47fa8d3c..dea4b043 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ObjCType.hpp b/src/SFML/Window/iOS/ObjCType.hpp index 5d06c51b..736b3ab9 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e3896557..da8e059c 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 ea69f41e..a57b7aa4 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/SFMain.hpp index 4d0b5b40..dbb8e6a5 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 4e9910a3..4a3aec30 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 f3f4276e..470760c6 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 940d0a8e..a832f933 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/SFViewController.hpp index 2b65d358..a2ff188d 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 8c23cdcf..79451258 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 05c6b934..14f3fca2 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 249c41aa..9c6f2ea2 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VideoModeImpl.mm b/src/SFML/Window/iOS/VideoModeImpl.mm index 7296d9d9..8f9dce0b 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/WindowImplUIKit.hpp index 60e0407d..9b340f64 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 35337dbc..7caeb063 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-2019 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp index cc7790ff..f6b2550d 100644 --- a/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp +++ b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2019 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/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm index 117ee82d..d16426a4 100644 --- a/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm +++ b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2019 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/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in index 3a7cfd0e..f7cc802c 100644 --- a/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in +++ b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2019 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/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist index 910c19cf..66b623c3 100644 --- a/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2019 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/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist index 2b28c72a..3d5e163f 100644 --- a/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2019 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/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist index b2c73d0c..466bfffb 100644 --- a/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2019 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/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in b/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in index b0e9acff..2bd30082 100644 --- a/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in +++ b/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2019 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/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist index dc9b7f6e..a71b8fc8 100644 --- a/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2018 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), Laurent Gomila (laurent@sfml-dev.org) This software is provided 'as-is', without any express or implied warranty. From 195f5d7409b52a256149c24b7bb19d600971fe3f Mon Sep 17 00:00:00 2001 From: = <jonathan.r.paton@googlemail.com> Date: Wed, 9 Jan 2019 15:22:49 +0000 Subject: [PATCH 138/211] Removed old android cmake toolchain --- cmake/toolchains/android.toolchain.cmake | 1666 ---------------------- 1 file changed, 1666 deletions(-) delete mode 100644 cmake/toolchains/android.toolchain.cmake diff --git a/cmake/toolchains/android.toolchain.cmake b/cmake/toolchains/android.toolchain.cmake deleted file mode 100644 index ee28e51e..00000000 --- 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 From 53d8f66d436e1160837d733e8389d27af8963a34 Mon Sep 17 00:00:00 2001 From: = <jonathan.r.paton@googlemail.com> Date: Thu, 10 Jan 2019 14:57:47 +0000 Subject: [PATCH 139/211] Add travis android builds --- .travis.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.travis.yml b/.travis.yml index 671bed6f..4c8f764a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -78,5 +78,28 @@ matrix: env: - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE" + - name: "Android armeabi-v7a" + language: android + android: &androidComponents + components: + - tools + - platform-tools + - build-tools-26.0.1 + env: + - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=/usr/local/android-sdk/ndk-bundle -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" + + install: &androidInstall + - echo y | sdkmanager "ndk-bundle" + - echo y | sdkmanager "cmake;3.10.2.4988404" + - echo y | sdkmanager "lldb;3.1" + - sudo ln -sf /usr/local/android-sdk/cmake/3.10.2.4988404/bin/cmake /usr/bin/cmake + + - name: "Android x86" + language: android + android: *androidComponents + env: + - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=/usr/local/android-sdk/ndk-bundle -DCMAKE_ANDROID_ARCH_ABI=x86 -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" + install: *androidInstall + notifications: email: false From 7e40f80f52ea0ba35ca6e4ffd40a6fc8c0fa7536 Mon Sep 17 00:00:00 2001 From: hobby8 <hobby8@users.noreply.github.com> Date: Sat, 6 Oct 2018 22:49:48 +0300 Subject: [PATCH 140/211] Fix OpenGL extensions not loading --- src/SFML/Window/GlContext.cpp | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/SFML/Window/GlContext.cpp b/src/SFML/Window/GlContext.cpp index 39dc9339..fd3805d4 100644 --- a/src/SFML/Window/GlContext.cpp +++ b/src/SFML/Window/GlContext.cpp @@ -218,10 +218,12 @@ namespace extensions.clear(); // Check whether a >= 3.0 context is available + glGetStringiFuncType glGetStringiFunc = NULL; + glGetStringiFunc = reinterpret_cast<glGetStringiFuncType>(sf::priv::GlContext::getFunction("glGetStringi")); int majorVersion = 0; glGetIntegerv(GL_MAJOR_VERSION, &majorVersion); - if (glGetError() == GL_INVALID_ENUM) + if (glGetError() == GL_INVALID_ENUM || !glGetStringiFunc) { // Try to load the < 3.0 way const char* extensionString = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)); @@ -240,22 +242,16 @@ namespace else { // Try to load the >= 3.0 way - glGetStringiFuncType glGetStringiFunc = NULL; - glGetStringiFunc = reinterpret_cast<glGetStringiFuncType>(sf::priv::GlContext::getFunction("glGetStringi")); + int numExtensions = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions); - if (glGetStringiFunc) + if (numExtensions) { - int numExtensions = 0; - glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions); - - if (numExtensions) + for (unsigned int i = 0; i < static_cast<unsigned int>(numExtensions); ++i) { - for (unsigned int i = 0; i < static_cast<unsigned int>(numExtensions); ++i) - { - const char* extensionString = reinterpret_cast<const char*>(glGetStringiFunc(GL_EXTENSIONS, i)); + const char* extensionString = reinterpret_cast<const char*>(glGetStringiFunc(GL_EXTENSIONS, i)); - extensions.push_back(extensionString); - } + extensions.push_back(extensionString); } } } From b516a3ae2bd4b673e7e61c8fe3fd3deba79ebcc0 Mon Sep 17 00:00:00 2001 From: = <jonathan.r.paton@googlemail.com> Date: Fri, 18 Jan 2019 16:20:56 +0000 Subject: [PATCH 141/211] Fix travis android build to use NDK version r18b --- .travis.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4c8f764a..ca4a4175 100644 --- a/.travis.yml +++ b/.travis.yml @@ -86,19 +86,20 @@ matrix: - platform-tools - build-tools-26.0.1 env: - - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=/usr/local/android-sdk/ndk-bundle -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" + - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r18b -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" install: &androidInstall - - echo y | sdkmanager "ndk-bundle" - echo y | sdkmanager "cmake;3.10.2.4988404" - echo y | sdkmanager "lldb;3.1" - sudo ln -sf /usr/local/android-sdk/cmake/3.10.2.4988404/bin/cmake /usr/bin/cmake + - wget https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip + - unzip -qq android-ndk-r18b-linux-x86_64.zip - name: "Android x86" language: android android: *androidComponents env: - - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=/usr/local/android-sdk/ndk-bundle -DCMAKE_ANDROID_ARCH_ABI=x86 -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" + - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r18b -DCMAKE_ANDROID_ARCH_ABI=x86 -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" install: *androidInstall notifications: From 82c2f4c05eb9b2ad5cae08271b009577796ee8f6 Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Wed, 11 Apr 2018 21:45:36 +0200 Subject: [PATCH 142/211] All mobile-compatible examples now successfully link --- CMakeLists.txt | 12 ++++- cmake/Macros.cmake | 92 ++++++++++++++++++++++++++------ examples/CMakeLists.txt | 49 +++++++++-------- examples/opengl/OpenGL.cpp | 9 ++++ examples/window/Window.cpp | 8 +++ src/SFML/Graphics/CMakeLists.txt | 2 + src/SFML/Window/CMakeLists.txt | 8 +-- 7 files changed, 137 insertions(+), 43 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e821a49b..d8b43b34 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,7 +84,7 @@ if(SFML_BUILD_WINDOW) sfml_set_option(SFML_OPENGL_ES ${OPENGL_ES} BOOL "TRUE to use an OpenGL ES implementation, FALSE to use a desktop OpenGL implementation") endif() -# Mac OS X specific options +# 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") @@ -99,6 +99,14 @@ else() 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) # make sure there's the android library available @@ -489,7 +497,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) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 21ffb545..25467cd2 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -27,6 +27,23 @@ function(sfml_set_stdlib target) 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() + # add a new target which is a SFML library # example: sfml_add_library(sfml-graphics # SOURCES sprite.cpp image.cpp ... @@ -140,9 +157,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 @@ -241,6 +257,10 @@ macro(sfml_add_example target) INSTALL_RPATH "$ORIGIN/${rel_lib_dir}") endif() + if (SFML_OS_IOS) + sfml_set_common_ios_properties(${target}) + endif() + # add the install rule install(TARGETS ${target} RUNTIME DESTINATION ${target_install_dir} COMPONENT examples @@ -266,12 +286,13 @@ macro(sfml_add_example target) endmacro() -# 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/") +# 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) @@ -284,16 +305,10 @@ 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() @@ -302,16 +317,61 @@ function(sfml_find_package) 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() + + set(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) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a13f585a..23adf00a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,10 +1,7 @@ -# 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 +13,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(X11) - elseif(SFML_OS_MACOSX) - add_subdirectory(cocoa) - endif() endif() - if(SFML_BUILD_GRAPHICS AND SFML_BUILD_AUDIO) - add_subdirectory(pong) + add_subdirectory(island) + if(SFML_OS_WINDOWS) + add_subdirectory(win32) + elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD) + add_subdirectory(X11) + elseif(SFML_OS_MACOSX) + add_subdirectory(cocoa) endif() -endif(SFML_OS_IOS) \ No newline at end of file +endif() +if(SFML_BUILD_GRAPHICS AND SFML_BUILD_AUDIO) + add_subdirectory(pong) +endif() + +# Mobile specific examples +if(SFML_OS_IOS) + add_subdirectory(iOS) +endif() diff --git a/examples/opengl/OpenGL.cpp b/examples/opengl/OpenGL.cpp index f2260d6b..a1b342f9 100644 --- a/examples/opengl/OpenGL.cpp +++ b/examples/opengl/OpenGL.cpp @@ -5,6 +5,15 @@ #include <SFML/Graphics.hpp> #include <SFML/OpenGL.hpp> +#ifdef SFML_SYSTEM_IOS +#include <SFML/Main.hpp> +#endif + +#ifdef SFML_OPENGL_ES +#define glClearDepth glClearDepthf +#define glFrustum glFrustumf +#endif + #ifndef GL_SRGB8_ALPHA8 #define GL_SRGB8_ALPHA8 0x8C43 #endif diff --git a/examples/window/Window.cpp b/examples/window/Window.cpp index 3fcea52c..c90f9676 100644 --- a/examples/window/Window.cpp +++ b/examples/window/Window.cpp @@ -4,6 +4,14 @@ #include <SFML/Window.hpp> #include <SFML/OpenGL.hpp> +#ifdef SFML_SYSTEM_IOS +#include <SFML/Main.hpp> +#endif + +#ifdef SFML_OPENGL_ES +#define glClearDepth glClearDepthf +#define glFrustum glFrustumf +#endif //////////////////////////////////////////////////////////// /// Entry point of application diff --git a/src/SFML/Graphics/CMakeLists.txt b/src/SFML/Graphics/CMakeLists.txt index 883c7581..9c0dcc3f 100644 --- a/src/SFML/Graphics/CMakeLists.txt +++ b/src/SFML/Graphics/CMakeLists.txt @@ -132,6 +132,8 @@ endif() if(SFML_OS_ANDROID) target_link_libraries(sfml-graphics PRIVATE z EGL GLESv1_CM) +elseif(SFML_OS_IOS) + target_link_libraries(sfml-graphics PRIVATE z bz2) endif() sfml_find_package(Freetype INCLUDE "FREETYPE_INCLUDE_DIRS" LINK "FREETYPE_LIBRARY") diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index f25ebb83..ecf35e14 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -251,14 +251,14 @@ endif() if(SFML_OPENGL_ES) if(SFML_OS_IOS) - target_link_libraries(sfml-window PRIVATE "-framework OpenGLES") + sfml_add_external(OpenGL LINK "-framework OpenGLES") elseif(SFML_OS_ANDROID) - target_link_libraries(sfml-window PRIVATE EGL GLESv1_CM) + sfml_add_external(OpenGL LINK "EGL" "GLESv1_CM") endif() else() - sfml_find_package(OpenGL INCLUDE "OPENGL_INCLUDE_DIR" LINK "OPENGL_LIBRARIES") - target_link_libraries(sfml-window PRIVATE OpenGL) + sfml_find_package(OpenGL INCLUDE "OPENGL_INCLUDE_DIR" LINK "OPENGL_gl_LIBRARY") endif() +target_link_libraries(sfml-window PRIVATE OpenGL) if(SFML_OS_WINDOWS AND NOT SFML_COMPILER_MSVC) include(CheckIncludeFile) From 1272b704d682966f8ccb1a9414d469c081ea5724 Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Thu, 12 Apr 2018 20:39:55 +0200 Subject: [PATCH 143/211] window, opengl and pong examples now work on iOS --- examples/CMakeLists.txt | 4 +++- examples/island/CMakeLists.txt | 4 ++-- examples/joystick/CMakeLists.txt | 2 +- examples/opengl/CMakeLists.txt | 9 +++++++++ examples/opengl/OpenGL.cpp | 16 ++++++++++++---- examples/pong/CMakeLists.txt | 7 +++++++ examples/pong/Pong.cpp | 16 ++++++++++++++-- 7 files changed, 48 insertions(+), 10 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 23adf00a..567d3977 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -22,11 +22,13 @@ endif() if(SFML_BUILD_GRAPHICS) add_subdirectory(opengl) + if (NOT SFML_OS_IOS) add_subdirectory(joystick) add_subdirectory(shader) + add_subdirectory(island) endif() - add_subdirectory(island) + if(SFML_OS_WINDOWS) add_subdirectory(win32) elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD) diff --git a/examples/island/CMakeLists.txt b/examples/island/CMakeLists.txt index 38428e31..3b063fb8 100644 --- a/examples/island/CMakeLists.txt +++ b/examples/island/CMakeLists.txt @@ -7,5 +7,5 @@ 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) diff --git a/examples/joystick/CMakeLists.txt b/examples/joystick/CMakeLists.txt index f04dc7fc..8d92f03d 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/opengl/CMakeLists.txt b/examples/opengl/CMakeLists.txt index 9b8ad49c..1cdde028 100644 --- a/examples/opengl/CMakeLists.txt +++ b/examples/opengl/CMakeLists.txt @@ -4,8 +4,17 @@ 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/texture.jpg + ${CMAKE_CURRENT_SOURCE_DIR}/resources/sansation.ttf) + set_source_files_properties(${RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) +endif() + # define the opengl target sfml_add_example(opengl GUI_APP SOURCES ${SRC} + BUNDLE_RESOURCES ${RESOURCES} DEPENDS sfml-graphics OpenGL RESOURCES_DIR resources) diff --git a/examples/opengl/OpenGL.cpp b/examples/opengl/OpenGL.cpp index a1b342f9..bcafba0b 100644 --- a/examples/opengl/OpenGL.cpp +++ b/examples/opengl/OpenGL.cpp @@ -18,6 +18,14 @@ #define GL_SRGB8_ALPHA8 0x8C43 #endif +std::string resourcesDir() +{ +#ifdef SFML_SYSTEM_IOS + return ""; +#else + return "resources/"; +#endif +} //////////////////////////////////////////////////////////// /// Entry point of application @@ -44,13 +52,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() + "sansation.ttf")) return EXIT_FAILURE; sf::Text text("SFML / OpenGL demo", font); sf::Text sRgbInstructions("Press space to toggle sRGB conversion", font); @@ -64,7 +72,7 @@ int main() // Load a texture to apply to our 3D cube sf::Texture texture; - if (!texture.loadFromFile("resources/texture.jpg")) + if (!texture.loadFromFile(resourcesDir() + "texture.jpg")) return EXIT_FAILURE; // Attempt to generate a mipmap for our cube texture @@ -189,7 +197,7 @@ int main() if (mipmapEnabled) { // We simply reload the texture to disable mipmapping - if (!texture.loadFromFile("resources/texture.jpg")) + if (!texture.loadFromFile(resourcesDir() + "texture.jpg")) return EXIT_FAILURE; mipmapEnabled = false; diff --git a/examples/pong/CMakeLists.txt b/examples/pong/CMakeLists.txt index a20f3b19..54e70c8b 100644 --- a/examples/pong/CMakeLists.txt +++ b/examples/pong/CMakeLists.txt @@ -3,9 +3,16 @@ set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/pong) # all source files set(SRC ${SRCROOT}/Pong.cpp) +if (SFML_OS_IOS) + set(RESOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/resources/ball.wav + ${CMAKE_CURRENT_SOURCE_DIR}/resources/sansation.ttf) + set_source_files_properties(${RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) +endif() # define the pong target sfml_add_example(pong GUI_APP SOURCES ${SRC} + BUNDLE_RESOURCES ${RESOURCES} DEPENDS sfml-audio sfml-graphics RESOURCES_DIR resources) diff --git a/examples/pong/Pong.cpp b/examples/pong/Pong.cpp index 58c9fd71..f643ca4d 100644 --- a/examples/pong/Pong.cpp +++ b/examples/pong/Pong.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 @@ -33,7 +45,7 @@ int main() // 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); @@ -63,7 +75,7 @@ int main() // Load the text font sf::Font font; - if (!font.loadFromFile("resources/sansation.ttf")) + if (!font.loadFromFile(resourcesDir() + "sansation.ttf")) return EXIT_FAILURE; // Initialize the pause message From 5ab36271c7214d0bea3fc34f84ba5da8aad0a55c Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Thu, 12 Apr 2018 20:43:04 +0200 Subject: [PATCH 144/211] Remove iOS example --- examples/CMakeLists.txt | 5 --- examples/iOS/CMakeLists.txt | 25 -------------- examples/iOS/main.cpp | 65 ------------------------------------- 3 files changed, 95 deletions(-) delete mode 100644 examples/iOS/CMakeLists.txt delete mode 100644 examples/iOS/main.cpp diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 567d3977..2c9393f3 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -40,8 +40,3 @@ endif() if(SFML_BUILD_GRAPHICS AND SFML_BUILD_AUDIO) add_subdirectory(pong) endif() - -# Mobile specific examples -if(SFML_OS_IOS) - add_subdirectory(iOS) -endif() diff --git a/examples/iOS/CMakeLists.txt b/examples/iOS/CMakeLists.txt deleted file mode 100644 index 24aca5f4..00000000 --- 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 473b2b91..00000000 --- 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(); - } -} - From 9f4a0c3c4f2fa01873fc544c4ff879eca8abc880 Mon Sep 17 00:00:00 2001 From: Ceylo <lucas.soltic@orange.fr> Date: Fri, 13 Apr 2018 19:22:20 +0200 Subject: [PATCH 145/211] Make Pong example "usable" on iOS --- examples/pong/Pong.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/examples/pong/Pong.cpp b/examples/pong/Pong.cpp index f643ca4d..5cd4afa6 100644 --- a/examples/pong/Pong.cpp +++ b/examples/pong/Pong.cpp @@ -111,7 +111,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) { @@ -150,6 +151,12 @@ int main() { leftPaddle.move(0.f, paddleSpeed * deltaTime); } + + if (sf::Touch::isDown(0)) + { + sf::Vector2i pos = sf::Touch::getPosition(0, window); + leftPaddle.setPosition(0.f, pos.y); + } // Move the computer's paddle if (((rightPaddleSpeed < 0.f) && (rightPaddle.getPosition().y - paddleSize.y / 2 > 5.f)) || From 353c846c87c8527d82d04859d35603906c21975a Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Fri, 18 Jan 2019 15:04:03 +0000 Subject: [PATCH 146/211] Update examples for iOS including touch support, proper handling of window resize, launch screens and icons --- cmake/Macros.cmake | 16 ++++++++-- examples/assets/LaunchScreen.storyboard | 38 ++++++++++++++++++++++++ examples/assets/icon.icns | Bin 0 -> 38947 bytes examples/assets/info.plist | 36 ++++++++++++++++++++++ examples/assets/logo.png | Bin 0 -> 30801 bytes examples/iOS/resources/canary.wav | Bin 63504 -> 0 bytes examples/iOS/resources/image.png | Bin 8849 -> 0 bytes examples/iOS/resources/orchestral.ogg | Bin 153776 -> 0 bytes examples/iOS/resources/sansation.ttf | Bin 28912 -> 0 bytes examples/opengl/OpenGL.cpp | 25 ++++++++++++++-- examples/pong/Pong.cpp | 29 +++++++++++++++--- examples/window/Window.cpp | 6 ++++ 12 files changed, 141 insertions(+), 9 deletions(-) create mode 100644 examples/assets/LaunchScreen.storyboard create mode 100644 examples/assets/icon.icns create mode 100644 examples/assets/info.plist create mode 100644 examples/assets/logo.png delete mode 100644 examples/iOS/resources/canary.wav delete mode 100644 examples/iOS/resources/image.png delete mode 100644 examples/iOS/resources/orchestral.ogg delete mode 100644 examples/iOS/resources/sansation.ttf diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 25467cd2..f92cf796 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -223,7 +223,18 @@ 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}) @@ -264,7 +275,8 @@ macro(sfml_add_example target) # add the install rule install(TARGETS ${target} RUNTIME DESTINATION ${target_install_dir} COMPONENT examples - BUNDLE DESTINATION ${target_install_dir} COMPONENT examples) + BUNDLE DESTINATION ${target_install_dir} COMPONENT examples + RESOURCE DESTINATION ${target_install_dir} COMPONENT examples) # install the example's source code install(FILES ${THIS_SOURCES} diff --git a/examples/assets/LaunchScreen.storyboard b/examples/assets/LaunchScreen.storyboard new file mode 100644 index 00000000..e2c2d2c3 --- /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 0000000000000000000000000000000000000000..cb95460b409b20f6f985501610e5822c3b3ba713 GIT binary patch literal 38947 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�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 literal 0 HcmV?d00001 diff --git a/examples/assets/info.plist b/examples/assets/info.plist new file mode 100644 index 00000000..910ff4c2 --- /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.5.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 0000000000000000000000000000000000000000..7b04c41ac16b55f68baf912b725c2ec158811ee9 GIT binary patch literal 30801 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 literal 0 HcmV?d00001 diff --git a/examples/iOS/resources/canary.wav b/examples/iOS/resources/canary.wav deleted file mode 100644 index a0f3aecc5db38e9357edce96c8139ec04d1fcee5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63504 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 Z*HQ{lAvEEW>X<D9Hd1L@VyI|t{y$RfYghmP diff --git a/examples/iOS/resources/image.png b/examples/iOS/resources/image.png deleted file mode 100644 index 29ba0102e52e1b094f1a31ecb321470e4e5ca725..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8849 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 Ao&W#< diff --git a/examples/iOS/resources/orchestral.ogg b/examples/iOS/resources/orchestral.ogg deleted file mode 100644 index f764d61db05f2f2516f491e615f0afb2d51ef2af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153776 zcmeFYby%EFvmiRS1q~iFNPq+g?(PsExJz(%cZcBa4DRmk!5xBI2r@Xq8T1bMec#zV z_u0MA-re)(_S4f--Bn%HU0q#WZ_hjOrlv{&Xu!Wxmh?Zs8=6Q-C=w_aTL%Mk$JZw4 z_p1M3a2TNe0;N#$uRZ@Gz4m;?bd5QoV9>w(r}PfyA4bFwyt=ua8H2ooDVdeIf$CrO zWKv|zpFgvHW@qMl<pu@!5Al0p5mhLFAOL_bj6nxiX&B8tj6)ttke4GoN;^a>JWZZY zDH6s#$Toy;DA8&ZE<EBt9jgL(?NC6Z_SHd(9+c^rkFPdvzfT5%cF9b~?UAS;P&5}P z-XWUlA1s;!?JJ!>wnVsnF+Kz;Ac8<8uaGrUbG*YO7X;cP3srQeVtd8no1!_OymA?Q z<#+VTIg+jU=Rb6RiT@Unuk8OqHcTK~$EsH@kSftXZDg!QIDl9HASah5{5K6624NjC zU>E?v5VXgZh{KktB^sNdL`6i^fP2*_B7{ydq(CyfP(9kj97yevN0XjMS6*j6TK8$J z?x>C7Z+A%m;Hv`mfE_l%-+o2_0HQukcs^(Jj(U8d1`r`Aqyie?2LQlA=-x=wV#}UW zPF?U$UH-rGKVr!M06+kZ5kAbnmjIERkU%6$5lb5xSC|M>gjje|q_i;b7i}<=;jB`H z5F)wP8Q<-O=h;6?fB^t}!{!Y0AEHDg4>G|1AZlMk27z`d)kod;DG}ELF@#$(J;z!h zJ^rc!GRGdWAPiv$4WytgNK}-hElM>AryU}49A_FL3w*=8pOYZRJyH-a$304!AFXIf z+la07rFIwBu(EL>)3I8J)-aN35dXgw6o1tKnJ@-Cfl(}EfI--QnL0rD5&bhQ2=dkJ ziNq8sB^)Rv;weYsKS?F<j@7?r*`K1aI4bih){8gRdN<aa^TwMu#;fzjI?2ZCjn+B~ zIy#Ha|2hAix*sgSFM0=}bx4+sE|5h2yEw5>01SX%K4<v0BxF6JsWjrL&67>tlZ)Nc zOTLr*C4npqL~D@bm-lzsC^eFc%z?$Pi(OV0UQ}9EW|3ZG{{Nk!bIHpA03-l_c*vee z!k%cz{&iM=HB1HrAOiqI6o|weJ`KgQ%0T8gCpvYdt-$WAq-Oo^MSzgJrXfdONFITx z0s<uPO3ks#{x9ZN#X<uh#up1cB}_{%4owu6n!n_E)(Kf@W8U~MsS~EFpG*j~rh^nF ziTO*kQ$)gV4EA}Qq?y8KuN9dG$p)7U-;gKbLl%!55M%<tr$mZnMTO*l1_q#%hhbHK zWtE3m@!uqM36Q-4$YTHFk^a^Azxfr*i~2_tb6OPhU;QD1L>1sf=l?AWB1IktYDW3L zL>4PLL=Z&We<y1mmRA9?;r}LxEQlZloc{`0|6=)nzy7ZV{%0D1m^dsa<fD!l98!S@ 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
#w=ggR_hkb&* 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 Tx%Yr^KOg32zryX%d+6l?8x!SD diff --git a/examples/iOS/resources/sansation.ttf b/examples/iOS/resources/sansation.ttf deleted file mode 100644 index d85fbc81d91e22c647a3338a37f24a9d684dcf8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28912 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 Y(-osHj2F<;P%p3rF{>lYhrW~jFV!_TuK)l5 diff --git a/examples/opengl/OpenGL.cpp b/examples/opengl/OpenGL.cpp index bcafba0b..37942ff7 100644 --- a/examples/opengl/OpenGL.cpp +++ b/examples/opengl/OpenGL.cpp @@ -220,13 +220,24 @@ 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); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + GLfloat ratio = static_cast<float>(event.size.width) / event.size.height; + glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f); // Make the window no longer the active window for OpenGL calls window.setActive(false); + + sf::View view; + view.setSize(textureSize.x, textureSize.y); + view.setCenter(textureSize.x/2.f, textureSize.y/2.f); + window.setView(view); } } @@ -241,9 +252,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(); + #endif + + float x = pos.x * 200.f / window.getSize().x - 100.f; + float y = -pos.y * 200.f / window.getSize().y + 100.f; // Apply some transformations glMatrixMode(GL_MODELVIEW); diff --git a/examples/pong/Pong.cpp b/examples/pong/Pong.cpp index 5cd4afa6..796d2ab2 100644 --- a/examples/pong/Pong.cpp +++ b/examples/pong/Pong.cpp @@ -84,7 +84,12 @@ int main() pauseMessage.setCharacterSize(40); pauseMessage.setPosition(170.f, 150.f); pauseMessage.setFillColor(sf::Color::White); + + #ifdef SFML_SYSTEM_IOS + pauseMessage.setString("Welcome to SFML pong!\nTouch the screen to start the game"); + #else pauseMessage.setString("Welcome to SFML pong!\nPress space to start the game"); + #endif // Define the paddles properties sf::Clock AITimer; @@ -134,6 +139,15 @@ int main() 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) @@ -154,8 +168,9 @@ int main() if (sf::Touch::isDown(0)) { - sf::Vector2i pos = sf::Touch::getPosition(0, window); - leftPaddle.setPosition(0.f, pos.y); + 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 @@ -181,16 +196,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" + 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" + inputString); } if (ball.getPosition().y - ballRadius < 0.f) { diff --git a/examples/window/Window.cpp b/examples/window/Window.cpp index c90f9676..c6a8c907 100644 --- a/examples/window/Window.cpp +++ b/examples/window/Window.cpp @@ -129,7 +129,13 @@ int main() // Resize event: adjust the viewport if (event.type == sf::Event::Resized) + { glViewport(0, 0, event.size.width, event.size.height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + GLfloat ratio = static_cast<float>(event.size.width) / event.size.height; + glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f); + } } // Clear the color and depth buffers From bf92efe9a4035fee0258386173d53556aa196e49 Mon Sep 17 00:00:00 2001 From: Tobias Widlund <widlundtobias@gmail.com> Date: Fri, 18 Jan 2019 14:12:14 +0100 Subject: [PATCH 147/211] Remove usages of std::auto_ptr to get rid of warnings when building with gcc 8.2+ --- src/SFML/Audio/AudioDevice.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/SFML/Audio/AudioDevice.cpp b/src/SFML/Audio/AudioDevice.cpp index ab6cb90d..e4ebc4b9 100644 --- a/src/SFML/Audio/AudioDevice.cpp +++ b/src/SFML/Audio/AudioDevice.cpp @@ -29,7 +29,7 @@ #include <SFML/Audio/ALCheck.hpp> #include <SFML/Audio/Listener.hpp> #include <SFML/System/Err.hpp> -#include <memory> +#include <vector> namespace @@ -107,9 +107,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 +129,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; From 0980e90ee486de80b082bf77c3e4762b885b4d67 Mon Sep 17 00:00:00 2001 From: Mario Liebisch <mario.liebisch@gmail.com> Date: Thu, 22 Jun 2017 11:24:53 +0200 Subject: [PATCH 148/211] Fixed potential buffer overrun in Win32 OpenGL error handling This fixes issue #1245. --- src/SFML/Window/Win32/WglContext.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/SFML/Window/Win32/WglContext.cpp b/src/SFML/Window/Win32/WglContext.cpp index 09496082..57516032 100644 --- a/src/SFML/Window/Win32/WglContext.cpp +++ b/src/SFML/Window/Win32/WglContext.cpp @@ -66,13 +66,17 @@ void ensureExtensionsInit(HDC deviceContext) //////////////////////////////////////////////////////////// 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()); + 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) + { + String errMsg(buffer); + LocalFree(buffer); + return errMsg; + } - return errMsg; + std::ostringstream ss; + ss << "Error " << errorCode; + return String(ss.str()); } From 4dfad062e43d7c6ef5161d52dd79ce8934ee4e68 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Tue, 20 Mar 2018 23:08:18 +0100 Subject: [PATCH 149/211] Added a VertexBuffer implementation to all Drawables that were rendered via VertexArrays. --- include/SFML/Graphics/Shape.hpp | 21 +++--- include/SFML/Graphics/Sprite.hpp | 8 +- include/SFML/Graphics/Text.hpp | 31 ++++---- src/SFML/Graphics/Shape.cpp | 77 ++++++++++++++++--- src/SFML/Graphics/Sprite.cpp | 41 +++++++++-- src/SFML/Graphics/Text.cpp | 122 +++++++++++++++++++++++-------- 6 files changed, 226 insertions(+), 74 deletions(-) diff --git a/include/SFML/Graphics/Shape.hpp b/include/SFML/Graphics/Shape.hpp index 94990f29..20c933a1 100644 --- a/include/SFML/Graphics/Shape.hpp +++ b/include/SFML/Graphics/Shape.hpp @@ -32,6 +32,7 @@ #include <SFML/Graphics/Drawable.hpp> #include <SFML/Graphics/Transformable.hpp> #include <SFML/Graphics/VertexArray.hpp> +#include <SFML/Graphics/VertexBuffer.hpp> #include <SFML/System/Vector2.hpp> @@ -305,15 +306,17 @@ 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 + VertexBuffer m_verticesBuffer; ///< Vertex buffer containing the fill geometry + VertexBuffer m_outlineVerticesBuffer; ///< Vertex buffer 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 b44584be..65f8f90f 100644 --- a/include/SFML/Graphics/Sprite.hpp +++ b/include/SFML/Graphics/Sprite.hpp @@ -33,6 +33,7 @@ #include <SFML/Graphics/Transformable.hpp> #include <SFML/Graphics/Vertex.hpp> #include <SFML/Graphics/Rect.hpp> +#include <SFML/Graphics/VertexBuffer.hpp> namespace sf @@ -215,9 +216,10 @@ 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 + VertexBuffer m_verticesBuffer; ///< Vertex buffer containing 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 158e149a..dfc08a75 100644 --- a/include/SFML/Graphics/Text.hpp +++ b/include/SFML/Graphics/Text.hpp @@ -34,6 +34,7 @@ #include <SFML/Graphics/Font.hpp> #include <SFML/Graphics/Rect.hpp> #include <SFML/Graphics/VertexArray.hpp> +#include <SFML/Graphics/VertexBuffer.hpp> #include <SFML/System/String.hpp> #include <string> #include <vector> @@ -435,20 +436,22 @@ 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 VertexBuffer m_verticesBuffer; ///< Vertex buffer containing the fill geometry + mutable VertexBuffer m_outlineVerticesBuffer; ///< Vertex buffer 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/src/SFML/Graphics/Shape.cpp b/src/SFML/Graphics/Shape.cpp index d0245d5d..10d743cc 100644 --- a/src/SFML/Graphics/Shape.cpp +++ b/src/SFML/Graphics/Shape.cpp @@ -87,6 +87,10 @@ void Shape::setTextureRect(const IntRect& rect) { m_textureRect = rect; updateTexCoords(); + + // Update the vertex buffers if they are being used + if (m_verticesBuffer.getVertexCount()) + m_verticesBuffer.update(&m_vertices[0]); } @@ -102,6 +106,10 @@ void Shape::setFillColor(const Color& color) { m_fillColor = color; updateFillColors(); + + // Update the vertex buffers if they are being used + if (m_verticesBuffer.getVertexCount()) + m_verticesBuffer.update(&m_vertices[0]); } @@ -117,6 +125,10 @@ void Shape::setOutlineColor(const Color& color) { m_outlineColor = color; updateOutlineColors(); + + // Update the vertex buffers if they are being used + if (m_outlineVerticesBuffer.getVertexCount()) + m_outlineVerticesBuffer.update(&m_outlineVertices[0]); } @@ -158,15 +170,17 @@ FloatRect Shape::getGlobalBounds() const //////////////////////////////////////////////////////////// Shape::Shape() : -m_texture (NULL), -m_textureRect (), -m_fillColor (255, 255, 255), -m_outlineColor (255, 255, 255), -m_outlineThickness(0), -m_vertices (TriangleFan), -m_outlineVertices (TriangleStrip), -m_insideBounds (), -m_bounds () +m_texture (NULL), +m_textureRect (), +m_fillColor (255, 255, 255), +m_outlineColor (255, 255, 255), +m_outlineThickness (0), +m_vertices (TriangleFan), +m_outlineVertices (TriangleStrip), +m_verticesBuffer (TriangleFan, VertexBuffer::Static), +m_outlineVerticesBuffer(TriangleStrip, VertexBuffer::Static), +m_insideBounds (), +m_bounds () { } @@ -180,6 +194,16 @@ void Shape::update() { m_vertices.resize(0); m_outlineVertices.resize(0); + + if (VertexBuffer::isAvailable()) + { + if (m_verticesBuffer.getVertexCount()) + m_verticesBuffer.create(0); + + if (m_outlineVerticesBuffer.getVertexCount()) + m_outlineVerticesBuffer.create(0); + } + return; } @@ -206,6 +230,21 @@ void Shape::update() // Outline updateOutline(); + + // Update the vertex buffers if they are being used + if (VertexBuffer::isAvailable()) + { + if (m_verticesBuffer.getVertexCount() != m_vertices.getVertexCount()) + m_verticesBuffer.create(m_vertices.getVertexCount()); + + m_verticesBuffer.update(&m_vertices[0]); + + if (m_outlineVerticesBuffer.getVertexCount() != m_outlineVertices.getVertexCount()) + m_outlineVerticesBuffer.create(m_outlineVertices.getVertexCount()); + + if (m_outlineVertices.getVertexCount()) + m_outlineVerticesBuffer.update(&m_outlineVertices[0]); + } } @@ -216,13 +255,29 @@ void Shape::draw(RenderTarget& target, RenderStates states) const // Render the inside states.texture = m_texture; - target.draw(m_vertices, states); + + if (VertexBuffer::isAvailable()) + { + target.draw(m_verticesBuffer, states); + } + else + { + target.draw(m_vertices, states); + } // Render the outline if (m_outlineThickness != 0) { states.texture = NULL; - target.draw(m_outlineVertices, states); + + if (VertexBuffer::isAvailable()) + { + target.draw(m_outlineVerticesBuffer, states); + } + else + { + target.draw(m_outlineVertices, states); + } } } diff --git a/src/SFML/Graphics/Sprite.cpp b/src/SFML/Graphics/Sprite.cpp index 1fdfc5d5..eae7a731 100644 --- a/src/SFML/Graphics/Sprite.cpp +++ b/src/SFML/Graphics/Sprite.cpp @@ -35,26 +35,37 @@ namespace sf { //////////////////////////////////////////////////////////// Sprite::Sprite() : -m_texture (NULL), -m_textureRect() +m_verticesBuffer(TrianglesStrip, VertexBuffer::Stream), +m_texture (NULL), +m_textureRect () { + if (VertexBuffer::isAvailable()) + m_verticesBuffer.create(4); } //////////////////////////////////////////////////////////// Sprite::Sprite(const Texture& texture) : -m_texture (NULL), -m_textureRect() +m_verticesBuffer(TrianglesStrip, VertexBuffer::Stream), +m_texture (NULL), +m_textureRect () { + if (VertexBuffer::isAvailable()) + m_verticesBuffer.create(4); + setTexture(texture); } //////////////////////////////////////////////////////////// Sprite::Sprite(const Texture& texture, const IntRect& rectangle) : -m_texture (NULL), -m_textureRect() +m_verticesBuffer(TrianglesStrip, VertexBuffer::Stream), +m_texture (NULL), +m_textureRect () { + if (VertexBuffer::isAvailable()) + m_verticesBuffer.create(4); + setTexture(texture); setTextureRect(rectangle); } @@ -80,6 +91,10 @@ void Sprite::setTextureRect(const IntRect& rectangle) m_textureRect = rectangle; updatePositions(); updateTexCoords(); + + // Update the vertex buffer if it is being used + if (VertexBuffer::isAvailable()) + m_verticesBuffer.update(m_vertices); } } @@ -92,6 +107,10 @@ void Sprite::setColor(const Color& color) m_vertices[1].color = color; m_vertices[2].color = color; m_vertices[3].color = color; + + // Update the vertex buffer if it is being used + if (VertexBuffer::isAvailable()) + m_verticesBuffer.update(m_vertices); } @@ -140,7 +159,15 @@ void Sprite::draw(RenderTarget& target, RenderStates states) const { states.transform *= getTransform(); states.texture = m_texture; - target.draw(m_vertices, 4, TriangleStrip, states); + + if (VertexBuffer::isAvailable()) + { + target.draw(m_verticesBuffer, states); + } + else + { + target.draw(m_vertices, 4, TriangleStrip, states); + } } } diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 7cb4f889..5b929485 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -76,20 +76,22 @@ namespace sf { //////////////////////////////////////////////////////////// Text::Text() : -m_string (), -m_font (NULL), -m_characterSize (30), -m_letterSpacingFactor(1.f), -m_lineSpacingFactor (1.f), -m_style (Regular), -m_fillColor (255, 255, 255), -m_outlineColor (0, 0, 0), -m_outlineThickness (0), -m_vertices (Triangles), -m_outlineVertices (Triangles), -m_bounds (), -m_geometryNeedUpdate (false), -m_fontTextureId (0) +m_string (), +m_font (NULL), +m_characterSize (30), +m_letterSpacingFactor (1.f), +m_lineSpacingFactor (1.f), +m_style (Regular), +m_fillColor (255, 255, 255), +m_outlineColor (0, 0, 0), +m_outlineThickness (0), +m_vertices (Triangles), +m_outlineVertices (Triangles), +m_verticesBuffer (Triangles, VertexBuffer::Static), +m_outlineVerticesBuffer(Triangles, VertexBuffer::Static), +m_bounds (), +m_geometryNeedUpdate (false), +m_fontTextureId (0) { } @@ -97,20 +99,22 @@ m_fontTextureId (0) //////////////////////////////////////////////////////////// Text::Text(const String& string, const Font& font, unsigned int characterSize) : -m_string (string), -m_font (&font), -m_characterSize (characterSize), -m_letterSpacingFactor(1.f), -m_lineSpacingFactor (1.f), -m_style (Regular), -m_fillColor (255, 255, 255), -m_outlineColor (0, 0, 0), -m_outlineThickness (0), -m_vertices (Triangles), -m_outlineVertices (Triangles), -m_bounds (), -m_geometryNeedUpdate (true), -m_fontTextureId (0) +m_string (string), +m_font (&font), +m_characterSize (characterSize), +m_letterSpacingFactor (1.f), +m_lineSpacingFactor (1.f), +m_style (Regular), +m_fillColor (255, 255, 255), +m_outlineColor (0, 0, 0), +m_outlineThickness (0), +m_vertices (Triangles), +m_outlineVertices (Triangles), +m_verticesBuffer (Triangles, VertexBuffer::Static), +m_outlineVerticesBuffer(Triangles, VertexBuffer::Static), +m_bounds (), +m_geometryNeedUpdate (true), +m_fontTextureId (0) { } @@ -202,6 +206,14 @@ void Text::setFillColor(const Color& color) { for (std::size_t i = 0; i < m_vertices.getVertexCount(); ++i) m_vertices[i].color = m_fillColor; + + if (VertexBuffer::isAvailable()) + { + if (m_verticesBuffer.getVertexCount() != m_vertices.getVertexCount()) + m_verticesBuffer.create(m_vertices.getVertexCount()); + + m_verticesBuffer.update(&m_vertices[0]); + } } } } @@ -220,6 +232,14 @@ void Text::setOutlineColor(const Color& color) { for (std::size_t i = 0; i < m_outlineVertices.getVertexCount(); ++i) m_outlineVertices[i].color = m_outlineColor; + + if (VertexBuffer::isAvailable()) + { + if (m_outlineVerticesBuffer.getVertexCount() != m_outlineVertices.getVertexCount()) + m_outlineVerticesBuffer.create(m_outlineVertices.getVertexCount()); + + m_outlineVerticesBuffer.update(&m_outlineVertices[0]); + } } } } @@ -382,9 +402,25 @@ void Text::draw(RenderTarget& target, RenderStates states) const // Only draw the outline if there is something to draw if (m_outlineThickness != 0) - target.draw(m_outlineVertices, states); + { + if (VertexBuffer::isAvailable()) + { + target.draw(m_outlineVerticesBuffer, states); + } + else + { + target.draw(m_outlineVertices, states); + } + } - target.draw(m_vertices, states); + if (VertexBuffer::isAvailable()) + { + target.draw(m_verticesBuffer, states); + } + else + { + target.draw(m_vertices, states); + } } } @@ -408,11 +444,23 @@ void Text::ensureGeometryUpdate() const // Clear the previous geometry m_vertices.clear(); m_outlineVertices.clear(); + m_bounds = FloatRect(); // No text: nothing to draw if (m_string.isEmpty()) + { + if (VertexBuffer::isAvailable()) + { + if (m_verticesBuffer.getVertexCount()) + m_verticesBuffer.create(0); + + if (m_outlineVerticesBuffer.getVertexCount()) + m_outlineVerticesBuffer.create(0); + } + return; + } // Compute values related to the text style bool isBold = m_style & Bold; @@ -562,6 +610,20 @@ void Text::ensureGeometryUpdate() const m_bounds.top = minY; m_bounds.width = maxX - minX; m_bounds.height = maxY - minY; + + // Update the vertex buffer if it is being used + if (VertexBuffer::isAvailable()) + { + if (m_verticesBuffer.getVertexCount() != m_vertices.getVertexCount()) + m_verticesBuffer.create(m_vertices.getVertexCount()); + + m_verticesBuffer.update(&m_vertices[0]); + + if (m_outlineVerticesBuffer.getVertexCount() != m_outlineVertices.getVertexCount()) + m_outlineVerticesBuffer.create(m_outlineVertices.getVertexCount()); + + m_outlineVerticesBuffer.update(&m_outlineVertices[0]); + } } } // namespace sf From 9c8cc19f9639c7e293f5f723cb8cadd46d6ea00a Mon Sep 17 00:00:00 2001 From: SGauvin <gauvinsimon@gmail.com> Date: Sun, 10 Feb 2019 11:02:45 -0500 Subject: [PATCH 150/211] Removed useless cast Removed useless cast in SFML/System/Utf.inl at line 296. This useless cast creates a warning when using -Wuseless-cast as an option in g++ and clang++. Operations can't be made on types smaller than 4 bytes (32 bits), so types smaller than 4 bytes are converted to at least 4 bytes types, thus rendering the static_cast<Uint32> useless in this particular case. --- include/SFML/System/Utf.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/SFML/System/Utf.inl b/include/SFML/System/Utf.inl index d48d8b51..1fed3a00 100644 --- a/include/SFML/System/Utf.inl +++ b/include/SFML/System/Utf.inl @@ -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 - 0xD800) << 10) + (second - 0xDC00) + 0x0010000; } else { From 3d46e39e6d95b205aaf60474e5820af414ddc922 Mon Sep 17 00:00:00 2001 From: Stefan Schindler <stefan@boxbox.org> Date: Tue, 26 Aug 2014 09:52:37 +0200 Subject: [PATCH 151/211] Added Catch unit test framework. Added Vector2(i) unit test. Re-enabled CMake's RPATH feature. --- CMakeLists.txt | 6 + extlibs/headers/catch.hpp | 8997 +++++++++++++++++++++++++++++++++++++ test/CMakeLists.txt | 21 + test/src/Main.cpp | 2 + test/src/Vector2.cpp | 222 + 5 files changed, 9248 insertions(+) create mode 100644 extlibs/headers/catch.hpp create mode 100644 test/CMakeLists.txt create mode 100644 test/src/Main.cpp create mode 100644 test/src/Vector2.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d8b43b34..dea32edb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,9 @@ if(SFML_BUILD_WINDOW) sfml_set_option(SFML_OPENGL_ES ${OPENGL_ES} BOOL "TRUE to use an OpenGL ES implementation, FALSE to use a desktop OpenGL implementation") endif() +# add an option for building the test suite +sfml_set_option(SFML_BUILD_TEST TRUE BOOL "TRUE to build the SFML test suite, FALSE to ignore them") + # macOS specific options if(SFML_OS_MACOSX) # add an option to build frameworks instead of dylibs (release only) @@ -281,6 +284,9 @@ endif() if(SFML_BUILD_DOC) add_subdirectory(doc) endif() +if(SFML_BUILD_TEST) + add_subdirectory(test) +endif() # on Linux and BSD-like OS, install pkg-config files by default set(SFML_INSTALL_PKGCONFIG_DEFAULT FALSE) diff --git a/extlibs/headers/catch.hpp b/extlibs/headers/catch.hpp new file mode 100644 index 00000000..6b8dfb5e --- /dev/null +++ b/extlibs/headers/catch.hpp @@ -0,0 +1,8997 @@ +/* + * CATCH v1.0 build 53 (master branch) + * Generated: 2014-08-20 08:08:19.533804 + * ---------------------------------------------------------- + * This file has been merged from multiple headers. Please don't edit it directly + * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED +#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED + +#define TWOBLUECUBES_CATCH_HPP_INCLUDED + +// #included from: internal/catch_suppress_warnings.h + +#define TWOBLUECUBES_CATCH_SUPPRESS_WARNINGS_H_INCLUDED + +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wglobal-constructors" +#pragma clang diagnostic ignored "-Wvariadic-macros" +#pragma clang diagnostic ignored "-Wc99-extensions" +#pragma clang diagnostic ignored "-Wunused-variable" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#pragma clang diagnostic ignored "-Wc++98-compat" +#pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#elif defined __GNUC__ +#pragma GCC diagnostic ignored "-Wvariadic-macros" +#pragma GCC diagnostic ignored "-Wunused-variable" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpadded" +#endif + +#ifdef CATCH_CONFIG_MAIN +# define CATCH_CONFIG_RUNNER +#endif + +#ifdef CATCH_CONFIG_RUNNER +# ifndef CLARA_CONFIG_MAIN +# define CLARA_CONFIG_MAIN_NOT_DEFINED +# define CLARA_CONFIG_MAIN +# endif +#endif + +// #included from: internal/catch_notimplemented_exception.h +#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED + +// #included from: catch_common.h +#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED + +#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line +#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) +#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) + +#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr +#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) + +#include <sstream> +#include <stdexcept> +#include <algorithm> + +// #included from: catch_compiler_capabilities.h +#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED + +// Much of the following code is based on Boost (1.53) + +#ifdef __clang__ + +# if __has_feature(cxx_nullptr) +# define CATCH_CONFIG_CPP11_NULLPTR +# endif + +# if __has_feature(cxx_noexcept) +# define CATCH_CONFIG_CPP11_NOEXCEPT +# endif + +#endif // __clang__ + +//////////////////////////////////////////////////////////////////////////////// +// Borland +#ifdef __BORLANDC__ + +#if (__BORLANDC__ > 0x582 ) +//#define CATCH_CONFIG_SFINAE // Not confirmed +#endif + +#endif // __BORLANDC__ + +//////////////////////////////////////////////////////////////////////////////// +// EDG +#ifdef __EDG_VERSION__ + +#if (__EDG_VERSION__ > 238 ) +//#define CATCH_CONFIG_SFINAE // Not confirmed +#endif + +#endif // __EDG_VERSION__ + +//////////////////////////////////////////////////////////////////////////////// +// Digital Mars +#ifdef __DMC__ + +#if (__DMC__ > 0x840 ) +//#define CATCH_CONFIG_SFINAE // Not confirmed +#endif + +#endif // __DMC__ + +//////////////////////////////////////////////////////////////////////////////// +// GCC +#ifdef __GNUC__ + +#if __GNUC__ < 3 + +#if (__GNUC_MINOR__ >= 96 ) +//#define CATCH_CONFIG_SFINAE +#endif + +#elif __GNUC__ >= 3 + +// #define CATCH_CONFIG_SFINAE // Taking this out completely for now + +#endif // __GNUC__ < 3 + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) ) + +#define CATCH_CONFIG_CPP11_NULLPTR +#endif + +#endif // __GNUC__ + +//////////////////////////////////////////////////////////////////////////////// +// Visual C++ +#ifdef _MSC_VER + +#if (_MSC_VER >= 1310 ) // (VC++ 7.0+) +//#define CATCH_CONFIG_SFINAE // Not confirmed +#endif + +#endif // _MSC_VER + +// Use variadic macros if the compiler supports them +#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ + ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ + ( defined __GNUC__ && __GNUC__ >= 3 ) || \ + ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) + +#ifndef CATCH_CONFIG_NO_VARIADIC_MACROS +#define CATCH_CONFIG_VARIADIC_MACROS +#endif + +#endif + +//////////////////////////////////////////////////////////////////////////////// +// C++ language feature support + +// detect language version: +#if (__cplusplus == 201103L) +# define CATCH_CPP11 +# define CATCH_CPP11_OR_GREATER +#elif (__cplusplus >= 201103L) +# define CATCH_CPP11_OR_GREATER +#endif + +// noexcept support: +#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) +# define CATCH_NOEXCEPT noexcept +# define CATCH_NOEXCEPT_IS(x) noexcept(x) +#else +# define CATCH_NOEXCEPT throw() +# define CATCH_NOEXCEPT_IS(x) +#endif + +namespace Catch { + + class NonCopyable { + NonCopyable( NonCopyable const& ); + void operator = ( NonCopyable const& ); + protected: + NonCopyable() {} + virtual ~NonCopyable(); + }; + + class SafeBool { + public: + typedef void (SafeBool::*type)() const; + + static type makeSafe( bool value ) { + return value ? &SafeBool::trueValue : 0; + } + private: + void trueValue() const {} + }; + + template<typename ContainerT> + inline void deleteAll( ContainerT& container ) { + typename ContainerT::const_iterator it = container.begin(); + typename ContainerT::const_iterator itEnd = container.end(); + for(; it != itEnd; ++it ) + delete *it; + } + template<typename AssociativeContainerT> + inline void deleteAllValues( AssociativeContainerT& container ) { + typename AssociativeContainerT::const_iterator it = container.begin(); + typename AssociativeContainerT::const_iterator itEnd = container.end(); + for(; it != itEnd; ++it ) + delete it->second; + } + + bool startsWith( std::string const& s, std::string const& prefix ); + bool endsWith( std::string const& s, std::string const& suffix ); + bool contains( std::string const& s, std::string const& infix ); + void toLowerInPlace( std::string& s ); + std::string toLower( std::string const& s ); + std::string trim( std::string const& str ); + + struct pluralise { + pluralise( std::size_t count, std::string const& label ); + + friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); + + std::size_t m_count; + std::string m_label; + }; + + struct SourceLineInfo { + + SourceLineInfo(); + SourceLineInfo( char const* _file, std::size_t _line ); + SourceLineInfo( SourceLineInfo const& other ); +# ifdef CATCH_CPP11_OR_GREATER + SourceLineInfo( SourceLineInfo && ) = default; + SourceLineInfo& operator = ( SourceLineInfo const& ) = default; + SourceLineInfo& operator = ( SourceLineInfo && ) = default; +# endif + bool empty() const; + bool operator == ( SourceLineInfo const& other ) const; + + std::string file; + std::size_t line; + }; + + std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); + + // This is just here to avoid compiler warnings with macro constants and boolean literals + inline bool isTrue( bool value ){ return value; } + inline bool alwaysTrue() { return true; } + inline bool alwaysFalse() { return false; } + + void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); + + // Use this in variadic streaming macros to allow + // >> +StreamEndStop + // as well as + // >> stuff +StreamEndStop + struct StreamEndStop { + std::string operator+() { + return std::string(); + } + }; + template<typename T> + T const& operator + ( T const& value, StreamEndStop ) { + return value; + } +} + +#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) ) +#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); + +#include <ostream> + +namespace Catch { + + class NotImplementedException : public std::exception + { + public: + NotImplementedException( SourceLineInfo const& lineInfo ); + NotImplementedException( NotImplementedException const& ) {} + + virtual ~NotImplementedException() CATCH_NOEXCEPT {} + + virtual const char* what() const CATCH_NOEXCEPT; + + private: + std::string m_what; + SourceLineInfo m_lineInfo; + }; + +} // end namespace Catch + +/////////////////////////////////////////////////////////////////////////////// +#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) + +// #included from: internal/catch_context.h +#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED + +// #included from: catch_interfaces_generators.h +#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED + +#include <string> + +namespace Catch { + + struct IGeneratorInfo { + virtual ~IGeneratorInfo(); + virtual bool moveNext() = 0; + virtual std::size_t getCurrentIndex() const = 0; + }; + + struct IGeneratorsForTest { + virtual ~IGeneratorsForTest(); + + virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; + virtual bool moveNext() = 0; + }; + + IGeneratorsForTest* createGeneratorsForTest(); + +} // end namespace Catch + +// #included from: catch_ptr.hpp +#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +namespace Catch { + + // An intrusive reference counting smart pointer. + // T must implement addRef() and release() methods + // typically implementing the IShared interface + template<typename T> + class Ptr { + public: + Ptr() : m_p( NULL ){} + Ptr( T* p ) : m_p( p ){ + if( m_p ) + m_p->addRef(); + } + Ptr( Ptr const& other ) : m_p( other.m_p ){ + if( m_p ) + m_p->addRef(); + } + ~Ptr(){ + if( m_p ) + m_p->release(); + } + void reset() { + if( m_p ) + m_p->release(); + m_p = NULL; + } + Ptr& operator = ( T* p ){ + Ptr temp( p ); + swap( temp ); + return *this; + } + Ptr& operator = ( Ptr const& other ){ + Ptr temp( other ); + swap( temp ); + return *this; + } + void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } + T* get() { return m_p; } + const T* get() const{ return m_p; } + T& operator*() const { return *m_p; } + T* operator->() const { return m_p; } + bool operator !() const { return m_p == NULL; } + operator SafeBool::type() const { return SafeBool::makeSafe( m_p != NULL ); } + + private: + T* m_p; + }; + + struct IShared : NonCopyable { + virtual ~IShared(); + virtual void addRef() const = 0; + virtual void release() const = 0; + }; + + template<typename T = IShared> + struct SharedImpl : T { + + SharedImpl() : m_rc( 0 ){} + + virtual void addRef() const { + ++m_rc; + } + virtual void release() const { + if( --m_rc == 0 ) + delete this; + } + + mutable unsigned int m_rc; + }; + +} // end namespace Catch + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#include <memory> +#include <vector> +#include <stdlib.h> + +namespace Catch { + + class TestCase; + class Stream; + struct IResultCapture; + struct IRunner; + struct IGeneratorsForTest; + struct IConfig; + + struct IContext + { + virtual ~IContext(); + + virtual IResultCapture* getResultCapture() = 0; + virtual IRunner* getRunner() = 0; + virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; + virtual bool advanceGeneratorsForCurrentTest() = 0; + virtual Ptr<IConfig const> getConfig() const = 0; + }; + + struct IMutableContext : IContext + { + virtual ~IMutableContext(); + virtual void setResultCapture( IResultCapture* resultCapture ) = 0; + virtual void setRunner( IRunner* runner ) = 0; + virtual void setConfig( Ptr<IConfig const> const& config ) = 0; + }; + + IContext& getCurrentContext(); + IMutableContext& getCurrentMutableContext(); + void cleanUpContext(); + Stream createStream( std::string const& streamName ); + +} + +// #included from: internal/catch_test_registry.hpp +#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED + +// #included from: catch_interfaces_testcase.h +#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED + +#include <vector> + +namespace Catch { + + class TestSpec; + + struct ITestCase : IShared { + virtual void invoke () const = 0; + protected: + virtual ~ITestCase(); + }; + + class TestCase; + struct IConfig; + + struct ITestCaseRegistry { + virtual ~ITestCaseRegistry(); + virtual std::vector<TestCase> const& getAllTests() const = 0; + virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector<TestCase>& matchingTestCases ) const = 0; + + }; +} + +namespace Catch { + +template<typename C> +class MethodTestCase : public SharedImpl<ITestCase> { + +public: + MethodTestCase( void (C::*method)() ) : m_method( method ) {} + + virtual void invoke() const { + C obj; + (obj.*m_method)(); + } + +private: + virtual ~MethodTestCase() {} + + void (C::*m_method)(); +}; + +typedef void(*TestFunction)(); + +struct NameAndDesc { + NameAndDesc( const char* _name = "", const char* _description= "" ) + : name( _name ), description( _description ) + {} + + const char* name; + const char* description; +}; + +struct AutoReg { + + AutoReg( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ); + + template<typename C> + AutoReg( void (C::*method)(), + char const* className, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ) { + registerTestCase( new MethodTestCase<C>( method ), + className, + nameAndDesc, + lineInfo ); + } + + void registerTestCase( ITestCase* testCase, + char const* className, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ); + + ~AutoReg(); + +private: + AutoReg( AutoReg const& ); + void operator= ( AutoReg const& ); +}; + +} // end namespace Catch + +#ifdef CATCH_CONFIG_VARIADIC_MACROS + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE( ... ) \ + static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ + static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\ + namespace{ \ + struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ + void test(); \ + }; \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ + } \ + void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() + +#else + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ + static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ + static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ + namespace{ \ + struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ + void test(); \ + }; \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ + } \ + void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() + +#endif + +// #included from: internal/catch_capture.hpp +#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED + +// #included from: catch_result_builder.h +#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED + +// #included from: catch_result_type.h +#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED + +namespace Catch { + + // ResultWas::OfType enum + struct ResultWas { enum OfType { + Unknown = -1, + Ok = 0, + Info = 1, + Warning = 2, + + FailureBit = 0x10, + + ExpressionFailed = FailureBit | 1, + ExplicitFailure = FailureBit | 2, + + Exception = 0x100 | FailureBit, + + ThrewException = Exception | 1, + DidntThrowException = Exception | 2 + + }; }; + + inline bool isOk( ResultWas::OfType resultType ) { + return ( resultType & ResultWas::FailureBit ) == 0; + } + inline bool isJustInfo( int flags ) { + return flags == ResultWas::Info; + } + + // ResultDisposition::Flags enum + struct ResultDisposition { enum Flags { + Normal = 0x00, + + ContinueOnFailure = 0x01, // Failures fail test, but execution continues + FalseTest = 0x02, // Prefix expression with ! + SuppressFail = 0x04 // Failures are reported but do not fail the test + }; }; + + inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { + return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) ); + } + + inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } + inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } + inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } + +} // end namespace Catch + +// #included from: catch_assertionresult.h +#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED + +#include <string> + +namespace Catch { + + struct AssertionInfo + { + AssertionInfo() {} + AssertionInfo( std::string const& _macroName, + SourceLineInfo const& _lineInfo, + std::string const& _capturedExpression, + ResultDisposition::Flags _resultDisposition ); + + std::string macroName; + SourceLineInfo lineInfo; + std::string capturedExpression; + ResultDisposition::Flags resultDisposition; + }; + + struct AssertionResultData + { + AssertionResultData() : resultType( ResultWas::Unknown ) {} + + std::string reconstructedExpression; + std::string message; + ResultWas::OfType resultType; + }; + + class AssertionResult { + public: + AssertionResult(); + AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); + ~AssertionResult(); +# ifdef CATCH_CPP11_OR_GREATER + AssertionResult( AssertionResult const& ) = default; + AssertionResult( AssertionResult && ) = default; + AssertionResult& operator = ( AssertionResult const& ) = default; + AssertionResult& operator = ( AssertionResult && ) = default; +# endif + + bool isOk() const; + bool succeeded() const; + ResultWas::OfType getResultType() const; + bool hasExpression() const; + bool hasMessage() const; + std::string getExpression() const; + std::string getExpressionInMacro() const; + bool hasExpandedExpression() const; + std::string getExpandedExpression() const; + std::string getMessage() const; + SourceLineInfo getSourceInfo() const; + std::string getTestMacroName() const; + + protected: + AssertionInfo m_info; + AssertionResultData m_resultData; + }; + +} // end namespace Catch + +namespace Catch { + + struct TestFailureException{}; + + template<typename T> class ExpressionLhs; + + struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; + + struct CopyableStream { + CopyableStream() {} + CopyableStream( CopyableStream const& other ) { + oss << other.oss.str(); + } + CopyableStream& operator=( CopyableStream const& other ) { + oss.str(""); + oss << other.oss.str(); + return *this; + } + std::ostringstream oss; + }; + + class ResultBuilder { + public: + ResultBuilder( char const* macroName, + SourceLineInfo const& lineInfo, + char const* capturedExpression, + ResultDisposition::Flags resultDisposition ); + + template<typename T> + ExpressionLhs<T const&> operator->* ( T const& operand ); + ExpressionLhs<bool> operator->* ( bool value ); + + template<typename T> + ResultBuilder& operator << ( T const& value ) { + m_stream.oss << value; + return *this; + } + + template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); + template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); + + ResultBuilder& setResultType( ResultWas::OfType result ); + ResultBuilder& setResultType( bool result ); + ResultBuilder& setLhs( std::string const& lhs ); + ResultBuilder& setRhs( std::string const& rhs ); + ResultBuilder& setOp( std::string const& op ); + + void endExpression(); + + std::string reconstructExpression() const; + AssertionResult build() const; + + void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); + void captureResult( ResultWas::OfType resultType ); + void captureExpression(); + void react(); + bool shouldDebugBreak() const; + bool allowThrows() const; + + private: + AssertionInfo m_assertionInfo; + AssertionResultData m_data; + struct ExprComponents { + ExprComponents() : testFalse( false ) {} + bool testFalse; + std::string lhs, rhs, op; + } m_exprComponents; + CopyableStream m_stream; + + bool m_shouldDebugBreak; + bool m_shouldThrow; + }; + +} // namespace Catch + +// Include after due to circular dependency: +// #included from: catch_expression_lhs.hpp +#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED + +// #included from: catch_evaluate.hpp +#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4389) // '==' : signed/unsigned mismatch +#endif + +#include <cstddef> + +namespace Catch { +namespace Internal { + + enum Operator { + IsEqualTo, + IsNotEqualTo, + IsLessThan, + IsGreaterThan, + IsLessThanOrEqualTo, + IsGreaterThanOrEqualTo + }; + + template<Operator Op> struct OperatorTraits { static const char* getName(){ return "*error*"; } }; + template<> struct OperatorTraits<IsEqualTo> { static const char* getName(){ return "=="; } }; + template<> struct OperatorTraits<IsNotEqualTo> { static const char* getName(){ return "!="; } }; + template<> struct OperatorTraits<IsLessThan> { static const char* getName(){ return "<"; } }; + template<> struct OperatorTraits<IsGreaterThan> { static const char* getName(){ return ">"; } }; + template<> struct OperatorTraits<IsLessThanOrEqualTo> { static const char* getName(){ return "<="; } }; + template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } }; + + template<typename T> + inline T& opCast(T const& t) { return const_cast<T&>(t); } + +// nullptr_t support based on pull request #154 from Konstantin Baumann +#ifdef CATCH_CONFIG_CPP11_NULLPTR + inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } +#endif // CATCH_CONFIG_CPP11_NULLPTR + + // So the compare overloads can be operator agnostic we convey the operator as a template + // enum, which is used to specialise an Evaluator for doing the comparison. + template<typename T1, typename T2, Operator Op> + class Evaluator{}; + + template<typename T1, typename T2> + struct Evaluator<T1, T2, IsEqualTo> { + static bool evaluate( T1 const& lhs, T2 const& rhs) { + return opCast( lhs ) == opCast( rhs ); + } + }; + template<typename T1, typename T2> + struct Evaluator<T1, T2, IsNotEqualTo> { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return opCast( lhs ) != opCast( rhs ); + } + }; + template<typename T1, typename T2> + struct Evaluator<T1, T2, IsLessThan> { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return opCast( lhs ) < opCast( rhs ); + } + }; + template<typename T1, typename T2> + struct Evaluator<T1, T2, IsGreaterThan> { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return opCast( lhs ) > opCast( rhs ); + } + }; + template<typename T1, typename T2> + struct Evaluator<T1, T2, IsGreaterThanOrEqualTo> { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return opCast( lhs ) >= opCast( rhs ); + } + }; + template<typename T1, typename T2> + struct Evaluator<T1, T2, IsLessThanOrEqualTo> { + static bool evaluate( T1 const& lhs, T2 const& rhs ) { + return opCast( lhs ) <= opCast( rhs ); + } + }; + + template<Operator Op, typename T1, typename T2> + bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { + return Evaluator<T1, T2, Op>::evaluate( lhs, rhs ); + } + + // This level of indirection allows us to specialise for integer types + // to avoid signed/ unsigned warnings + + // "base" overload + template<Operator Op, typename T1, typename T2> + bool compare( T1 const& lhs, T2 const& rhs ) { + return Evaluator<T1, T2, Op>::evaluate( lhs, rhs ); + } + + // unsigned X to int + template<Operator Op> bool compare( unsigned int lhs, int rhs ) { + return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) ); + } + template<Operator Op> bool compare( unsigned long lhs, int rhs ) { + return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) ); + } + template<Operator Op> bool compare( unsigned char lhs, int rhs ) { + return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) ); + } + + // unsigned X to long + template<Operator Op> bool compare( unsigned int lhs, long rhs ) { + return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) ); + } + template<Operator Op> bool compare( unsigned long lhs, long rhs ) { + return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) ); + } + template<Operator Op> bool compare( unsigned char lhs, long rhs ) { + return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) ); + } + + // int to unsigned X + template<Operator Op> bool compare( int lhs, unsigned int rhs ) { + return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs ); + } + template<Operator Op> bool compare( int lhs, unsigned long rhs ) { + return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs ); + } + template<Operator Op> bool compare( int lhs, unsigned char rhs ) { + return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs ); + } + + // long to unsigned X + template<Operator Op> bool compare( long lhs, unsigned int rhs ) { + return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs ); + } + template<Operator Op> bool compare( long lhs, unsigned long rhs ) { + return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs ); + } + template<Operator Op> bool compare( long lhs, unsigned char rhs ) { + return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs ); + } + + // pointer to long (when comparing against NULL) + template<Operator Op, typename T> bool compare( long lhs, T* rhs ) { + return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs ); + } + template<Operator Op, typename T> bool compare( T* lhs, long rhs ) { + return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) ); + } + + // pointer to int (when comparing against NULL) + template<Operator Op, typename T> bool compare( int lhs, T* rhs ) { + return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs ); + } + template<Operator Op, typename T> bool compare( T* lhs, int rhs ) { + return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) ); + } + +#ifdef CATCH_CONFIG_CPP11_NULLPTR + // pointer to nullptr_t (when comparing against nullptr) + template<Operator Op, typename T> bool compare( std::nullptr_t, T* rhs ) { + return Evaluator<T*, T*, Op>::evaluate( NULL, rhs ); + } + template<Operator Op, typename T> bool compare( T* lhs, std::nullptr_t ) { + return Evaluator<T*, T*, Op>::evaluate( lhs, NULL ); + } +#endif // CATCH_CONFIG_CPP11_NULLPTR + +} // end of namespace Internal +} // end of namespace Catch + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +// #included from: catch_tostring.h +#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED + +// #included from: catch_sfinae.hpp +#define TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED + +// Try to detect if the current compiler supports SFINAE + +namespace Catch { + + struct TrueType { + static const bool value = true; + typedef void Enable; + char sizer[1]; + }; + struct FalseType { + static const bool value = false; + typedef void Disable; + char sizer[2]; + }; + +#ifdef CATCH_CONFIG_SFINAE + + template<bool> struct NotABooleanExpression; + + template<bool c> struct If : NotABooleanExpression<c> {}; + template<> struct If<true> : TrueType {}; + template<> struct If<false> : FalseType {}; + + template<int size> struct SizedIf; + template<> struct SizedIf<sizeof(TrueType)> : TrueType {}; + template<> struct SizedIf<sizeof(FalseType)> : FalseType {}; + +#endif // CATCH_CONFIG_SFINAE + +} // end namespace Catch + +#include <sstream> +#include <iomanip> +#include <limits> +#include <vector> +#include <cstddef> + +#ifdef __OBJC__ +// #included from: catch_objc_arc.hpp +#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED + +#import <Foundation/Foundation.h> + +#ifdef __has_feature +#define CATCH_ARC_ENABLED __has_feature(objc_arc) +#else +#define CATCH_ARC_ENABLED 0 +#endif + +void arcSafeRelease( NSObject* obj ); +id performOptionalSelector( id obj, SEL sel ); + +#if !CATCH_ARC_ENABLED +inline void arcSafeRelease( NSObject* obj ) { + [obj release]; +} +inline id performOptionalSelector( id obj, SEL sel ) { + if( [obj respondsToSelector: sel] ) + return [obj performSelector: sel]; + return nil; +} +#define CATCH_UNSAFE_UNRETAINED +#define CATCH_ARC_STRONG +#else +inline void arcSafeRelease( NSObject* ){} +inline id performOptionalSelector( id obj, SEL sel ) { +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" +#endif + if( [obj respondsToSelector: sel] ) + return [obj performSelector: sel]; +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + return nil; +} +#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained +#define CATCH_ARC_STRONG __strong +#endif + +#endif + +namespace Catch { +namespace Detail { + +// SFINAE is currently disabled by default for all compilers. +// If the non SFINAE version of IsStreamInsertable is ambiguous for you +// and your compiler supports SFINAE, try #defining CATCH_CONFIG_SFINAE +#ifdef CATCH_CONFIG_SFINAE + + template<typename T> + class IsStreamInsertableHelper { + template<int N> struct TrueIfSizeable : TrueType {}; + + template<typename T2> + static TrueIfSizeable<sizeof((*(std::ostream*)0) << *((T2 const*)0))> dummy(T2*); + static FalseType dummy(...); + + public: + typedef SizedIf<sizeof(dummy((T*)0))> type; + }; + + template<typename T> + struct IsStreamInsertable : IsStreamInsertableHelper<T>::type {}; + +#else + + struct BorgType { + template<typename T> BorgType( T const& ); + }; + + TrueType& testStreamable( std::ostream& ); + FalseType testStreamable( FalseType ); + + FalseType operator<<( std::ostream const&, BorgType const& ); + + template<typename T> + struct IsStreamInsertable { + static std::ostream &s; + static T const&t; + enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; + }; + +#endif + + template<bool C> + struct StringMakerBase { + template<typename T> + static std::string convert( T const& ) { return "{?}"; } + }; + + template<> + struct StringMakerBase<true> { + template<typename T> + static std::string convert( T const& _value ) { + std::ostringstream oss; + oss << _value; + return oss.str(); + } + }; + + std::string rawMemoryToString( const void *object, std::size_t size ); + + template<typename T> + inline std::string rawMemoryToString( const T& object ) { + return rawMemoryToString( &object, sizeof(object) ); + } + +} // end namespace Detail + +template<typename T> +std::string toString( T const& value ); + +template<typename T> +struct StringMaker : + Detail::StringMakerBase<Detail::IsStreamInsertable<T>::value> {}; + +template<typename T> +struct StringMaker<T*> { + template<typename U> + static std::string convert( U* p ) { + if( !p ) + return INTERNAL_CATCH_STRINGIFY( NULL ); + else + return Detail::rawMemoryToString( p ); + } +}; + +template<typename R, typename C> +struct StringMaker<R C::*> { + static std::string convert( R C::* p ) { + if( !p ) + return INTERNAL_CATCH_STRINGIFY( NULL ); + else + return Detail::rawMemoryToString( p ); + } +}; + +namespace Detail { + template<typename InputIterator> + std::string rangeToString( InputIterator first, InputIterator last ); +} + +template<typename T, typename Allocator> +struct StringMaker<std::vector<T, Allocator> > { + static std::string convert( std::vector<T,Allocator> const& v ) { + return Detail::rangeToString( v.begin(), v.end() ); + } +}; + +namespace Detail { + template<typename T> + std::string makeString( T const& value ) { + return StringMaker<T>::convert( value ); + } +} // end namespace Detail + +/// \brief converts any type to a string +/// +/// The default template forwards on to ostringstream - except when an +/// ostringstream overload does not exist - in which case it attempts to detect +/// that and writes {?}. +/// Overload (not specialise) this template for custom typs that you don't want +/// to provide an ostream overload for. +template<typename T> +std::string toString( T const& value ) { + return StringMaker<T>::convert( value ); +} + +// Built in overloads + +std::string toString( std::string const& value ); +std::string toString( std::wstring const& value ); +std::string toString( const char* const value ); +std::string toString( char* const value ); +std::string toString( const wchar_t* const value ); +std::string toString( wchar_t* const value ); +std::string toString( int value ); +std::string toString( unsigned long value ); +std::string toString( unsigned int value ); +std::string toString( const double value ); +std::string toString( const float value ); +std::string toString( bool value ); +std::string toString( char value ); +std::string toString( signed char value ); +std::string toString( unsigned char value ); + +#ifdef CATCH_CONFIG_CPP11_NULLPTR +std::string toString( std::nullptr_t ); +#endif + +#ifdef __OBJC__ + std::string toString( NSString const * const& nsstring ); + std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ); + std::string toString( NSObject* const& nsObject ); +#endif + + namespace Detail { + template<typename InputIterator> + std::string rangeToString( InputIterator first, InputIterator last ) { + std::ostringstream oss; + oss << "{ "; + if( first != last ) { + oss << toString( *first ); + for( ++first ; first != last ; ++first ) { + oss << ", " << toString( *first ); + } + } + oss << " }"; + return oss.str(); + } +} + +} // end namespace Catch + +namespace Catch { + +// Wraps the LHS of an expression and captures the operator and RHS (if any) - +// wrapping them all in a ResultBuilder object +template<typename T> +class ExpressionLhs { + ExpressionLhs& operator = ( ExpressionLhs const& ); +# ifdef CATCH_CPP11_OR_GREATER + ExpressionLhs& operator = ( ExpressionLhs && ) = delete; +# endif + +public: + ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ) {} +# ifdef CATCH_CPP11_OR_GREATER + ExpressionLhs( ExpressionLhs const& ) = default; + ExpressionLhs( ExpressionLhs && ) = default; +# endif + + template<typename RhsT> + ResultBuilder& operator == ( RhsT const& rhs ) { + return captureExpression<Internal::IsEqualTo>( rhs ); + } + + template<typename RhsT> + ResultBuilder& operator != ( RhsT const& rhs ) { + return captureExpression<Internal::IsNotEqualTo>( rhs ); + } + + template<typename RhsT> + ResultBuilder& operator < ( RhsT const& rhs ) { + return captureExpression<Internal::IsLessThan>( rhs ); + } + + template<typename RhsT> + ResultBuilder& operator > ( RhsT const& rhs ) { + return captureExpression<Internal::IsGreaterThan>( rhs ); + } + + template<typename RhsT> + ResultBuilder& operator <= ( RhsT const& rhs ) { + return captureExpression<Internal::IsLessThanOrEqualTo>( rhs ); + } + + template<typename RhsT> + ResultBuilder& operator >= ( RhsT const& rhs ) { + return captureExpression<Internal::IsGreaterThanOrEqualTo>( rhs ); + } + + ResultBuilder& operator == ( bool rhs ) { + return captureExpression<Internal::IsEqualTo>( rhs ); + } + + ResultBuilder& operator != ( bool rhs ) { + return captureExpression<Internal::IsNotEqualTo>( rhs ); + } + + void endExpression() { + bool value = m_lhs ? true : false; + m_rb + .setLhs( Catch::toString( value ) ) + .setResultType( value ) + .endExpression(); + } + + // Only simple binary expressions are allowed on the LHS. + // If more complex compositions are required then place the sub expression in parentheses + template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& ); + template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& ); + template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& ); + template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& ); + template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); + template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); + +private: + template<Internal::Operator Op, typename RhsT> + ResultBuilder& captureExpression( RhsT const& rhs ) { + return m_rb + .setResultType( Internal::compare<Op>( m_lhs, rhs ) ) + .setLhs( Catch::toString( m_lhs ) ) + .setRhs( Catch::toString( rhs ) ) + .setOp( Internal::OperatorTraits<Op>::getName() ); + } + +private: + ResultBuilder& m_rb; + T m_lhs; +}; + +} // end namespace Catch + + +namespace Catch { + + template<typename T> + inline ExpressionLhs<T const&> ResultBuilder::operator->* ( T const& operand ) { + return ExpressionLhs<T const&>( *this, operand ); + } + + inline ExpressionLhs<bool> ResultBuilder::operator->* ( bool value ) { + return ExpressionLhs<bool>( *this, value ); + } + +} // namespace Catch + +// #included from: catch_message.h +#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED + +#include <string> + +namespace Catch { + + struct MessageInfo { + MessageInfo( std::string const& _macroName, + SourceLineInfo const& _lineInfo, + ResultWas::OfType _type ); + + std::string macroName; + SourceLineInfo lineInfo; + ResultWas::OfType type; + std::string message; + unsigned int sequence; + + bool operator == ( MessageInfo const& other ) const { + return sequence == other.sequence; + } + bool operator < ( MessageInfo const& other ) const { + return sequence < other.sequence; + } + private: + static unsigned int globalCount; + }; + + struct MessageBuilder { + MessageBuilder( std::string const& macroName, + SourceLineInfo const& lineInfo, + ResultWas::OfType type ) + : m_info( macroName, lineInfo, type ) + {} + + template<typename T> + MessageBuilder& operator << ( T const& value ) { + m_stream << value; + return *this; + } + + MessageInfo m_info; + std::ostringstream m_stream; + }; + + class ScopedMessage { + public: + ScopedMessage( MessageBuilder const& builder ); + ScopedMessage( ScopedMessage const& other ); + ~ScopedMessage(); + + MessageInfo m_info; + }; + +} // end namespace Catch + +// #included from: catch_interfaces_capture.h +#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED + +#include <string> + +namespace Catch { + + class TestCase; + class AssertionResult; + struct AssertionInfo; + struct SectionInfo; + struct MessageInfo; + class ScopedMessageBuilder; + struct Counts; + + struct IResultCapture { + + virtual ~IResultCapture(); + + virtual void assertionEnded( AssertionResult const& result ) = 0; + virtual bool sectionStarted( SectionInfo const& sectionInfo, + Counts& assertions ) = 0; + virtual void sectionEnded( SectionInfo const& name, Counts const& assertions, double _durationInSeconds ) = 0; + virtual void pushScopedMessage( MessageInfo const& message ) = 0; + virtual void popScopedMessage( MessageInfo const& message ) = 0; + + virtual std::string getCurrentTestName() const = 0; + virtual const AssertionResult* getLastResult() const = 0; + }; + + IResultCapture& getResultCapture(); +} + +// #included from: catch_debugger.h +#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED + +// #included from: catch_platform.h +#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED + +#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +#define CATCH_PLATFORM_MAC +#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#define CATCH_PLATFORM_IPHONE +#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) +#define CATCH_PLATFORM_WINDOWS +#endif + +#include <string> + +namespace Catch{ + + bool isDebuggerActive(); + void writeToDebugConsole( std::string const& text ); +} + +#ifdef CATCH_PLATFORM_MAC + + // The following code snippet based on: + // http://cocoawithlove.com/2008/03/break-into-debugger.html + #ifdef DEBUG + #if defined(__ppc64__) || defined(__ppc__) + #define CATCH_BREAK_INTO_DEBUGGER() \ + if( Catch::isDebuggerActive() ) { \ + __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ + : : : "memory","r0","r3","r4" ); \ + } + #else + #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );} + #endif + #endif + +#elif defined(_MSC_VER) + #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { __debugbreak(); } +#elif defined(__MINGW32__) + extern "C" __declspec(dllimport) void __stdcall DebugBreak(); + #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { DebugBreak(); } +#endif + +#ifndef CATCH_BREAK_INTO_DEBUGGER +#define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); +#endif + +// #included from: catch_interfaces_runner.h +#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED + +namespace Catch { + class TestCase; + + struct IRunner { + virtual ~IRunner(); + virtual bool aborting() const = 0; + }; +} + +/////////////////////////////////////////////////////////////////////////////// +// In the event of a failure works out if the debugger needs to be invoked +// and/or an exception thrown and takes appropriate action. +// This needs to be done as a macro so the debugger will stop in the user +// source code rather than in Catch library code +#define INTERNAL_CATCH_REACT( resultBuilder ) \ + if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ + resultBuilder.react(); + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + try { \ + ( __catchResult->*expr ).endExpression(); \ + } \ + catch( ... ) { \ + __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \ + } \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::isTrue( false && (expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ + INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ + if( Catch::getResultCapture().getLastResult()->succeeded() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \ + INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ + if( !Catch::getResultCapture().getLastResult()->succeeded() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + try { \ + expr; \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + } \ + catch( ... ) { \ + __catchResult.useActiveException( resultDisposition ); \ + } \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS( expr, resultDisposition, macroName ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + if( __catchResult.allowThrows() ) \ + try { \ + expr; \ + __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ + } \ + catch( ... ) { \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + } \ + else \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + if( __catchResult.allowThrows() ) \ + try { \ + expr; \ + __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ + } \ + catch( exceptionType ) { \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + } \ + catch( ... ) { \ + __catchResult.useActiveException( resultDisposition ); \ + } \ + else \ + __catchResult.captureResult( Catch::ResultWas::Ok ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +/////////////////////////////////////////////////////////////////////////////// +#ifdef CATCH_CONFIG_VARIADIC_MACROS + #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ + __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ + __catchResult.captureResult( messageType ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) +#else + #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ + __catchResult << log + ::Catch::StreamEndStop(); \ + __catchResult.captureResult( messageType ); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) +#endif + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_INFO( log, macroName ) \ + Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg " " #matcher, resultDisposition ); \ + try { \ + std::string matcherAsString = ::Catch::Matchers::matcher.toString(); \ + __catchResult \ + .setLhs( Catch::toString( arg ) ) \ + .setRhs( matcherAsString == "{?}" ? #matcher : matcherAsString ) \ + .setOp( "matches" ) \ + .setResultType( ::Catch::Matchers::matcher.match( arg ) ); \ + __catchResult.captureExpression(); \ + } catch( ... ) { \ + __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ + } \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +// #included from: internal/catch_section.h +#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED + +// #included from: catch_section_info.h +#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED + +namespace Catch { + + struct SectionInfo { + SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name, + std::string const& _description = std::string() ); + + std::string name; + std::string description; + SourceLineInfo lineInfo; + }; + +} // end namespace Catch + +// #included from: catch_totals.hpp +#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED + +#include <cstddef> + +namespace Catch { + + struct Counts { + Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {} + + Counts operator - ( Counts const& other ) const { + Counts diff; + diff.passed = passed - other.passed; + diff.failed = failed - other.failed; + diff.failedButOk = failedButOk - other.failedButOk; + return diff; + } + Counts& operator += ( Counts const& other ) { + passed += other.passed; + failed += other.failed; + failedButOk += other.failedButOk; + return *this; + } + + std::size_t total() const { + return passed + failed + failedButOk; + } + bool allPassed() const { + return failed == 0 && failedButOk == 0; + } + + std::size_t passed; + std::size_t failed; + std::size_t failedButOk; + }; + + struct Totals { + + Totals operator - ( Totals const& other ) const { + Totals diff; + diff.assertions = assertions - other.assertions; + diff.testCases = testCases - other.testCases; + return diff; + } + + Totals delta( Totals const& prevTotals ) const { + Totals diff = *this - prevTotals; + if( diff.assertions.failed > 0 ) + ++diff.testCases.failed; + else if( diff.assertions.failedButOk > 0 ) + ++diff.testCases.failedButOk; + else + ++diff.testCases.passed; + return diff; + } + + Totals& operator += ( Totals const& other ) { + assertions += other.assertions; + testCases += other.testCases; + return *this; + } + + Counts assertions; + Counts testCases; + }; +} + +// #included from: catch_timer.h +#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED + +#ifdef CATCH_PLATFORM_WINDOWS +typedef unsigned long long uint64_t; +#else +#include <stdint.h> +#endif + +namespace Catch { + + class Timer { + public: + Timer() : m_ticks( 0 ) {} + void start(); + unsigned int getElapsedNanoseconds() const; + unsigned int getElapsedMilliseconds() const; + double getElapsedSeconds() const; + + private: + uint64_t m_ticks; + }; + +} // namespace Catch + +#include <string> + +namespace Catch { + + class Section { + public: + Section( SectionInfo const& info ); + ~Section(); + + // This indicates whether the section should be executed or not + operator bool() const; + + private: +#ifdef CATCH_CPP11_OR_GREATER + Section( Section const& ) = delete; + Section( Section && ) = delete; + Section& operator = ( Section const& ) = delete; + Section& operator = ( Section && ) = delete; +#else + Section( Section const& info ); + Section& operator = ( Section const& ); +#endif + SectionInfo m_info; + + std::string m_name; + Counts m_assertions; + bool m_sectionIncluded; + Timer m_timer; + }; + +} // end namespace Catch + +#ifdef CATCH_CONFIG_VARIADIC_MACROS + #define INTERNAL_CATCH_SECTION( ... ) \ + if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) +#else + #define INTERNAL_CATCH_SECTION( name, desc ) \ + if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) ) +#endif + +// #included from: internal/catch_generators.hpp +#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED + +#include <iterator> +#include <vector> +#include <string> +#include <stdlib.h> + +namespace Catch { + +template<typename T> +struct IGenerator { + virtual ~IGenerator() {} + virtual T getValue( std::size_t index ) const = 0; + virtual std::size_t size () const = 0; +}; + +template<typename T> +class BetweenGenerator : public IGenerator<T> { +public: + BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} + + virtual T getValue( std::size_t index ) const { + return m_from+static_cast<int>( index ); + } + + virtual std::size_t size() const { + return static_cast<std::size_t>( 1+m_to-m_from ); + } + +private: + + T m_from; + T m_to; +}; + +template<typename T> +class ValuesGenerator : public IGenerator<T> { +public: + ValuesGenerator(){} + + void add( T value ) { + m_values.push_back( value ); + } + + virtual T getValue( std::size_t index ) const { + return m_values[index]; + } + + virtual std::size_t size() const { + return m_values.size(); + } + +private: + std::vector<T> m_values; +}; + +template<typename T> +class CompositeGenerator { +public: + CompositeGenerator() : m_totalSize( 0 ) {} + + // *** Move semantics, similar to auto_ptr *** + CompositeGenerator( CompositeGenerator& other ) + : m_fileInfo( other.m_fileInfo ), + m_totalSize( 0 ) + { + move( other ); + } + + CompositeGenerator& setFileInfo( const char* fileInfo ) { + m_fileInfo = fileInfo; + return *this; + } + + ~CompositeGenerator() { + deleteAll( m_composed ); + } + + operator T () const { + size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); + + typename std::vector<const IGenerator<T>*>::const_iterator it = m_composed.begin(); + typename std::vector<const IGenerator<T>*>::const_iterator itEnd = m_composed.end(); + for( size_t index = 0; it != itEnd; ++it ) + { + const IGenerator<T>* generator = *it; + if( overallIndex >= index && overallIndex < index + generator->size() ) + { + return generator->getValue( overallIndex-index ); + } + index += generator->size(); + } + CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); + return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so + } + + void add( const IGenerator<T>* generator ) { + m_totalSize += generator->size(); + m_composed.push_back( generator ); + } + + CompositeGenerator& then( CompositeGenerator& other ) { + move( other ); + return *this; + } + + CompositeGenerator& then( T value ) { + ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>(); + valuesGen->add( value ); + add( valuesGen ); + return *this; + } + +private: + + void move( CompositeGenerator& other ) { + std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) ); + m_totalSize += other.m_totalSize; + other.m_composed.clear(); + } + + std::vector<const IGenerator<T>*> m_composed; + std::string m_fileInfo; + size_t m_totalSize; +}; + +namespace Generators +{ + template<typename T> + CompositeGenerator<T> between( T from, T to ) { + CompositeGenerator<T> generators; + generators.add( new BetweenGenerator<T>( from, to ) ); + return generators; + } + + template<typename T> + CompositeGenerator<T> values( T val1, T val2 ) { + CompositeGenerator<T> generators; + ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>(); + valuesGen->add( val1 ); + valuesGen->add( val2 ); + generators.add( valuesGen ); + return generators; + } + + template<typename T> + CompositeGenerator<T> values( T val1, T val2, T val3 ){ + CompositeGenerator<T> generators; + ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>(); + valuesGen->add( val1 ); + valuesGen->add( val2 ); + valuesGen->add( val3 ); + generators.add( valuesGen ); + return generators; + } + + template<typename T> + CompositeGenerator<T> values( T val1, T val2, T val3, T val4 ) { + CompositeGenerator<T> generators; + ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>(); + valuesGen->add( val1 ); + valuesGen->add( val2 ); + valuesGen->add( val3 ); + valuesGen->add( val4 ); + generators.add( valuesGen ); + return generators; + } + +} // end namespace Generators + +using namespace Generators; + +} // end namespace Catch + +#define INTERNAL_CATCH_LINESTR2( line ) #line +#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) + +#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) + +// #included from: internal/catch_interfaces_exception.h +#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED + +#include <string> +// #included from: catch_interfaces_registry_hub.h +#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED + +#include <string> + +namespace Catch { + + class TestCase; + struct ITestCaseRegistry; + struct IExceptionTranslatorRegistry; + struct IExceptionTranslator; + struct IReporterRegistry; + struct IReporterFactory; + + struct IRegistryHub { + virtual ~IRegistryHub(); + + virtual IReporterRegistry const& getReporterRegistry() const = 0; + virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; + virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; + }; + + struct IMutableRegistryHub { + virtual ~IMutableRegistryHub(); + virtual void registerReporter( std::string const& name, IReporterFactory* factory ) = 0; + virtual void registerTest( TestCase const& testInfo ) = 0; + virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; + }; + + IRegistryHub& getRegistryHub(); + IMutableRegistryHub& getMutableRegistryHub(); + void cleanUp(); + std::string translateActiveException(); + +} + + +namespace Catch { + + typedef std::string(*exceptionTranslateFunction)(); + + struct IExceptionTranslator { + virtual ~IExceptionTranslator(); + virtual std::string translate() const = 0; + }; + + struct IExceptionTranslatorRegistry { + virtual ~IExceptionTranslatorRegistry(); + + virtual std::string translateActiveException() const = 0; + }; + + class ExceptionTranslatorRegistrar { + template<typename T> + class ExceptionTranslator : public IExceptionTranslator { + public: + + ExceptionTranslator( std::string(*translateFunction)( T& ) ) + : m_translateFunction( translateFunction ) + {} + + virtual std::string translate() const { + try { + throw; + } + catch( T& ex ) { + return m_translateFunction( ex ); + } + } + + protected: + std::string(*m_translateFunction)( T& ); + }; + + public: + template<typename T> + ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { + getMutableRegistryHub().registerTranslator + ( new ExceptionTranslator<T>( translateFunction ) ); + } + }; +} + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \ + static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \ + namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\ + static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ) + +// #included from: internal/catch_approx.hpp +#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED + +#include <cmath> +#include <limits> + +namespace Catch { +namespace Detail { + + class Approx { + public: + explicit Approx ( double value ) + : m_epsilon( std::numeric_limits<float>::epsilon()*100 ), + m_scale( 1.0 ), + m_value( value ) + {} + + Approx( Approx const& other ) + : m_epsilon( other.m_epsilon ), + m_scale( other.m_scale ), + m_value( other.m_value ) + {} + + static Approx custom() { + return Approx( 0 ); + } + + Approx operator()( double value ) { + Approx approx( value ); + approx.epsilon( m_epsilon ); + approx.scale( m_scale ); + return approx; + } + + friend bool operator == ( double lhs, Approx const& rhs ) { + // Thanks to Richard Harris for his help refining this formula + return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) ); + } + + friend bool operator == ( Approx const& lhs, double rhs ) { + return operator==( rhs, lhs ); + } + + friend bool operator != ( double lhs, Approx const& rhs ) { + return !operator==( lhs, rhs ); + } + + friend bool operator != ( Approx const& lhs, double rhs ) { + return !operator==( rhs, lhs ); + } + + Approx& epsilon( double newEpsilon ) { + m_epsilon = newEpsilon; + return *this; + } + + Approx& scale( double newScale ) { + m_scale = newScale; + return *this; + } + + std::string toString() const { + std::ostringstream oss; + oss << "Approx( " << Catch::toString( m_value ) << " )"; + return oss.str(); + } + + private: + double m_epsilon; + double m_scale; + double m_value; + }; +} + +template<> +inline std::string toString<Detail::Approx>( Detail::Approx const& value ) { + return value.toString(); +} + +} // end namespace Catch + +// #included from: internal/catch_matchers.hpp +#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED + +namespace Catch { +namespace Matchers { + namespace Impl { + + template<typename ExpressionT> + struct Matcher : SharedImpl<IShared> + { + typedef ExpressionT ExpressionType; + + virtual ~Matcher() {} + virtual Ptr<Matcher> clone() const = 0; + virtual bool match( ExpressionT const& expr ) const = 0; + virtual std::string toString() const = 0; + }; + + template<typename DerivedT, typename ExpressionT> + struct MatcherImpl : Matcher<ExpressionT> { + + virtual Ptr<Matcher<ExpressionT> > clone() const { + return Ptr<Matcher<ExpressionT> >( new DerivedT( static_cast<DerivedT const&>( *this ) ) ); + } + }; + + namespace Generic { + + template<typename ExpressionT> + class AllOf : public MatcherImpl<AllOf<ExpressionT>, ExpressionT> { + public: + + AllOf() {} + AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {} + + AllOf& add( Matcher<ExpressionT> const& matcher ) { + m_matchers.push_back( matcher.clone() ); + return *this; + } + virtual bool match( ExpressionT const& expr ) const + { + for( std::size_t i = 0; i < m_matchers.size(); ++i ) + if( !m_matchers[i]->match( expr ) ) + return false; + return true; + } + virtual std::string toString() const { + std::ostringstream oss; + oss << "( "; + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if( i != 0 ) + oss << " and "; + oss << m_matchers[i]->toString(); + } + oss << " )"; + return oss.str(); + } + + private: + std::vector<Ptr<Matcher<ExpressionT> > > m_matchers; + }; + + template<typename ExpressionT> + class AnyOf : public MatcherImpl<AnyOf<ExpressionT>, ExpressionT> { + public: + + AnyOf() {} + AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {} + + AnyOf& add( Matcher<ExpressionT> const& matcher ) { + m_matchers.push_back( matcher.clone() ); + return *this; + } + virtual bool match( ExpressionT const& expr ) const + { + for( std::size_t i = 0; i < m_matchers.size(); ++i ) + if( m_matchers[i]->match( expr ) ) + return true; + return false; + } + virtual std::string toString() const { + std::ostringstream oss; + oss << "( "; + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if( i != 0 ) + oss << " or "; + oss << m_matchers[i]->toString(); + } + oss << " )"; + return oss.str(); + } + + private: + std::vector<Ptr<Matcher<ExpressionT> > > m_matchers; + }; + + } + + namespace StdString { + + inline std::string makeString( std::string const& str ) { return str; } + inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); } + + struct Equals : MatcherImpl<Equals, std::string> { + Equals( std::string const& str ) : m_str( str ){} + Equals( Equals const& other ) : m_str( other.m_str ){} + + virtual ~Equals(); + + virtual bool match( std::string const& expr ) const { + return m_str == expr; + } + virtual std::string toString() const { + return "equals: \"" + m_str + "\""; + } + + std::string m_str; + }; + + struct Contains : MatcherImpl<Contains, std::string> { + Contains( std::string const& substr ) : m_substr( substr ){} + Contains( Contains const& other ) : m_substr( other.m_substr ){} + + virtual ~Contains(); + + virtual bool match( std::string const& expr ) const { + return expr.find( m_substr ) != std::string::npos; + } + virtual std::string toString() const { + return "contains: \"" + m_substr + "\""; + } + + std::string m_substr; + }; + + struct StartsWith : MatcherImpl<StartsWith, std::string> { + StartsWith( std::string const& substr ) : m_substr( substr ){} + StartsWith( StartsWith const& other ) : m_substr( other.m_substr ){} + + virtual ~StartsWith(); + + virtual bool match( std::string const& expr ) const { + return expr.find( m_substr ) == 0; + } + virtual std::string toString() const { + return "starts with: \"" + m_substr + "\""; + } + + std::string m_substr; + }; + + struct EndsWith : MatcherImpl<EndsWith, std::string> { + EndsWith( std::string const& substr ) : m_substr( substr ){} + EndsWith( EndsWith const& other ) : m_substr( other.m_substr ){} + + virtual ~EndsWith(); + + virtual bool match( std::string const& expr ) const { + return expr.find( m_substr ) == expr.size() - m_substr.size(); + } + virtual std::string toString() const { + return "ends with: \"" + m_substr + "\""; + } + + std::string m_substr; + }; + } // namespace StdString + } // namespace Impl + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + template<typename ExpressionT> + inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1, + Impl::Matcher<ExpressionT> const& m2 ) { + return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 ); + } + template<typename ExpressionT> + inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1, + Impl::Matcher<ExpressionT> const& m2, + Impl::Matcher<ExpressionT> const& m3 ) { + return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 ); + } + template<typename ExpressionT> + inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1, + Impl::Matcher<ExpressionT> const& m2 ) { + return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 ); + } + template<typename ExpressionT> + inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1, + Impl::Matcher<ExpressionT> const& m2, + Impl::Matcher<ExpressionT> const& m3 ) { + return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 ); + } + + inline Impl::StdString::Equals Equals( std::string const& str ) { + return Impl::StdString::Equals( str ); + } + inline Impl::StdString::Equals Equals( const char* str ) { + return Impl::StdString::Equals( Impl::StdString::makeString( str ) ); + } + inline Impl::StdString::Contains Contains( std::string const& substr ) { + return Impl::StdString::Contains( substr ); + } + inline Impl::StdString::Contains Contains( const char* substr ) { + return Impl::StdString::Contains( Impl::StdString::makeString( substr ) ); + } + inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) { + return Impl::StdString::StartsWith( substr ); + } + inline Impl::StdString::StartsWith StartsWith( const char* substr ) { + return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) ); + } + inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) { + return Impl::StdString::EndsWith( substr ); + } + inline Impl::StdString::EndsWith EndsWith( const char* substr ) { + return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) ); + } + +} // namespace Matchers + +using namespace Matchers; + +} // namespace Catch + +// #included from: internal/catch_interfaces_tag_alias_registry.h +#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED + +// #included from: catch_tag_alias.h +#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED + +#include <string> + +namespace Catch { + + struct TagAlias { + TagAlias( std::string _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} + + std::string tag; + SourceLineInfo lineInfo; + }; + + struct RegistrarForTagAliases { + RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); + }; + +} // end namespace Catch + +#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } +// #included from: catch_option.hpp +#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED + +namespace Catch { + + // An optional type + template<typename T> + class Option { + public: + Option() : nullableValue( NULL ) {} + Option( T const& _value ) + : nullableValue( new( storage ) T( _value ) ) + {} + Option( Option const& _other ) + : nullableValue( _other ? new( storage ) T( *_other ) : NULL ) + {} + + ~Option() { + reset(); + } + + Option& operator= ( Option const& _other ) { + if( &_other != this ) { + reset(); + if( _other ) + nullableValue = new( storage ) T( *_other ); + } + return *this; + } + Option& operator = ( T const& _value ) { + reset(); + nullableValue = new( storage ) T( _value ); + return *this; + } + + void reset() { + if( nullableValue ) + nullableValue->~T(); + nullableValue = NULL; + } + + T& operator*() { return *nullableValue; } + T const& operator*() const { return *nullableValue; } + T* operator->() { return nullableValue; } + const T* operator->() const { return nullableValue; } + + T valueOr( T const& defaultValue ) const { + return nullableValue ? *nullableValue : defaultValue; + } + + bool some() const { return nullableValue != NULL; } + bool none() const { return nullableValue == NULL; } + + bool operator !() const { return nullableValue == NULL; } + operator SafeBool::type() const { + return SafeBool::makeSafe( some() ); + } + + private: + T* nullableValue; + char storage[sizeof(T)]; + }; + +} // end namespace Catch + +namespace Catch { + + struct ITagAliasRegistry { + virtual ~ITagAliasRegistry(); + virtual Option<TagAlias> find( std::string const& alias ) const = 0; + virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; + + static ITagAliasRegistry const& get(); + }; + +} // end namespace Catch + +// These files are included here so the single_include script doesn't put them +// in the conditionally compiled sections +// #included from: internal/catch_test_case_info.h +#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED + +#include <string> +#include <set> + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +namespace Catch { + + struct ITestCase; + + struct TestCaseInfo { + enum SpecialProperties{ + None = 0, + IsHidden = 1 << 1, + ShouldFail = 1 << 2, + MayFail = 1 << 3, + Throws = 1 << 4 + }; + + TestCaseInfo( std::string const& _name, + std::string const& _className, + std::string const& _description, + std::set<std::string> const& _tags, + SourceLineInfo const& _lineInfo ); + + TestCaseInfo( TestCaseInfo const& other ); + + bool isHidden() const; + bool throws() const; + bool okToFail() const; + bool expectedToFail() const; + + std::string name; + std::string className; + std::string description; + std::set<std::string> tags; + std::set<std::string> lcaseTags; + std::string tagsAsString; + SourceLineInfo lineInfo; + SpecialProperties properties; + }; + + class TestCase : public TestCaseInfo { + public: + + TestCase( ITestCase* testCase, TestCaseInfo const& info ); + TestCase( TestCase const& other ); + + TestCase withName( std::string const& _newName ) const; + + void invoke() const; + + TestCaseInfo const& getTestCaseInfo() const; + + void swap( TestCase& other ); + bool operator == ( TestCase const& other ) const; + bool operator < ( TestCase const& other ) const; + TestCase& operator = ( TestCase const& other ); + + private: + Ptr<ITestCase> test; + }; + + TestCase makeTestCase( ITestCase* testCase, + std::string const& className, + std::string const& name, + std::string const& description, + SourceLineInfo const& lineInfo ); +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + + +#ifdef __OBJC__ +// #included from: internal/catch_objc.hpp +#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED + +#import <objc/runtime.h> + +#include <string> + +// NB. Any general catch headers included here must be included +// in catch.hpp first to make sure they are included by the single +// header for non obj-usage + +/////////////////////////////////////////////////////////////////////////////// +// This protocol is really only here for (self) documenting purposes, since +// all its methods are optional. +@protocol OcFixture + +@optional + +-(void) setUp; +-(void) tearDown; + +@end + +namespace Catch { + + class OcMethod : public SharedImpl<ITestCase> { + + public: + OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} + + virtual void invoke() const { + id obj = [[m_cls alloc] init]; + + performOptionalSelector( obj, @selector(setUp) ); + performOptionalSelector( obj, m_sel ); + performOptionalSelector( obj, @selector(tearDown) ); + + arcSafeRelease( obj ); + } + private: + virtual ~OcMethod() {} + + Class m_cls; + SEL m_sel; + }; + + namespace Detail{ + + inline std::string getAnnotation( Class cls, + std::string const& annotationName, + std::string const& testCaseName ) { + NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; + SEL sel = NSSelectorFromString( selStr ); + arcSafeRelease( selStr ); + id value = performOptionalSelector( cls, sel ); + if( value ) + return [(NSString*)value UTF8String]; + return ""; + } + } + + inline size_t registerTestMethods() { + size_t noTestMethods = 0; + int noClasses = objc_getClassList( NULL, 0 ); + + Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); + objc_getClassList( classes, noClasses ); + + for( int c = 0; c < noClasses; c++ ) { + Class cls = classes[c]; + { + u_int count; + Method* methods = class_copyMethodList( cls, &count ); + for( u_int m = 0; m < count ; m++ ) { + SEL selector = method_getName(methods[m]); + std::string methodName = sel_getName(selector); + if( startsWith( methodName, "Catch_TestCase_" ) ) { + std::string testCaseName = methodName.substr( 15 ); + std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); + std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); + const char* className = class_getName( cls ); + + getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); + noTestMethods++; + } + } + free(methods); + } + } + return noTestMethods; + } + + namespace Matchers { + namespace Impl { + namespace NSStringMatchers { + + template<typename MatcherT> + struct StringHolder : MatcherImpl<MatcherT, NSString*>{ + StringHolder( NSString* substr ) : m_substr( [substr copy] ){} + StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} + StringHolder() { + arcSafeRelease( m_substr ); + } + + NSString* m_substr; + }; + + struct Equals : StringHolder<Equals> { + Equals( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( ExpressionType const& str ) const { + return (str != nil || m_substr == nil ) && + [str isEqualToString:m_substr]; + } + + virtual std::string toString() const { + return "equals string: " + Catch::toString( m_substr ); + } + }; + + struct Contains : StringHolder<Contains> { + Contains( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( ExpressionType const& str ) const { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location != NSNotFound; + } + + virtual std::string toString() const { + return "contains string: " + Catch::toString( m_substr ); + } + }; + + struct StartsWith : StringHolder<StartsWith> { + StartsWith( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( ExpressionType const& str ) const { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location == 0; + } + + virtual std::string toString() const { + return "starts with: " + Catch::toString( m_substr ); + } + }; + struct EndsWith : StringHolder<EndsWith> { + EndsWith( NSString* substr ) : StringHolder( substr ){} + + virtual bool match( ExpressionType const& str ) const { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location == [str length] - [m_substr length]; + } + + virtual std::string toString() const { + return "ends with: " + Catch::toString( m_substr ); + } + }; + + } // namespace NSStringMatchers + } // namespace Impl + + inline Impl::NSStringMatchers::Equals + Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } + + inline Impl::NSStringMatchers::Contains + Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } + + inline Impl::NSStringMatchers::StartsWith + StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } + + inline Impl::NSStringMatchers::EndsWith + EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } + + } // namespace Matchers + + using namespace Matchers; + +} // namespace Catch + +/////////////////////////////////////////////////////////////////////////////// +#define OC_TEST_CASE( name, desc )\ ++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ +{\ +return @ name; \ +}\ ++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ +{ \ +return @ desc; \ +} \ +-(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) + +#endif + +#ifdef CATCH_CONFIG_RUNNER +// #included from: internal/catch_impl.hpp +#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED + +// Collect all the implementation files together here +// These are the equivalent of what would usually be cpp files + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wweak-vtables" +#endif + +// #included from: catch_runner.hpp +#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED + +// #included from: internal/catch_commandline.hpp +#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED + +// #included from: catch_config.hpp +#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED + +// #included from: catch_test_spec_parser.hpp +#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +// #included from: catch_test_spec.hpp +#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +#include <string> +#include <vector> + +namespace Catch { + + class TestSpec { + struct Pattern : SharedImpl<> { + virtual ~Pattern(); + virtual bool matches( TestCaseInfo const& testCase ) const = 0; + }; + class NamePattern : public Pattern { + enum WildcardPosition { + NoWildcard = 0, + WildcardAtStart = 1, + WildcardAtEnd = 2, + WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd + }; + + public: + NamePattern( std::string const& name ) : m_name( toLower( name ) ), m_wildcard( NoWildcard ) { + if( startsWith( m_name, "*" ) ) { + m_name = m_name.substr( 1 ); + m_wildcard = WildcardAtStart; + } + if( endsWith( m_name, "*" ) ) { + m_name = m_name.substr( 0, m_name.size()-1 ); + m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd ); + } + } + virtual ~NamePattern(); + virtual bool matches( TestCaseInfo const& testCase ) const { + switch( m_wildcard ) { + case NoWildcard: + return m_name == toLower( testCase.name ); + case WildcardAtStart: + return endsWith( toLower( testCase.name ), m_name ); + case WildcardAtEnd: + return startsWith( toLower( testCase.name ), m_name ); + case WildcardAtBothEnds: + return contains( toLower( testCase.name ), m_name ); + } + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" +#endif + throw std::logic_error( "Unknown enum" ); +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + } + private: + std::string m_name; + WildcardPosition m_wildcard; + }; + class TagPattern : public Pattern { + public: + TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} + virtual ~TagPattern(); + virtual bool matches( TestCaseInfo const& testCase ) const { + return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end(); + } + private: + std::string m_tag; + }; + class ExcludedPattern : public Pattern { + public: + ExcludedPattern( Ptr<Pattern> const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} + virtual ~ExcludedPattern(); + virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } + private: + Ptr<Pattern> m_underlyingPattern; + }; + + struct Filter { + std::vector<Ptr<Pattern> > m_patterns; + + bool matches( TestCaseInfo const& testCase ) const { + // All patterns in a filter must match for the filter to be a match + for( std::vector<Ptr<Pattern> >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) + if( !(*it)->matches( testCase ) ) + return false; + return true; + } + }; + + public: + bool hasFilters() const { + return !m_filters.empty(); + } + bool matches( TestCaseInfo const& testCase ) const { + // A TestSpec matches if any filter matches + for( std::vector<Filter>::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it ) + if( it->matches( testCase ) ) + return true; + return false; + } + + private: + std::vector<Filter> m_filters; + + friend class TestSpecParser; + }; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +namespace Catch { + + class TestSpecParser { + enum Mode{ None, Name, QuotedName, Tag }; + Mode m_mode; + bool m_exclusion; + std::size_t m_start, m_pos; + std::string m_arg; + TestSpec::Filter m_currentFilter; + TestSpec m_testSpec; + ITagAliasRegistry const* m_tagAliases; + + public: + TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} + + TestSpecParser& parse( std::string const& arg ) { + m_mode = None; + m_exclusion = false; + m_start = std::string::npos; + m_arg = m_tagAliases->expandAliases( arg ); + for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) + visitChar( m_arg[m_pos] ); + if( m_mode == Name ) + addPattern<TestSpec::NamePattern>(); + return *this; + } + TestSpec testSpec() { + addFilter(); + return m_testSpec; + } + private: + void visitChar( char c ) { + if( m_mode == None ) { + switch( c ) { + case ' ': return; + case '~': m_exclusion = true; return; + case '[': return startNewMode( Tag, ++m_pos ); + case '"': return startNewMode( QuotedName, ++m_pos ); + default: startNewMode( Name, m_pos ); break; + } + } + if( m_mode == Name ) { + if( c == ',' ) { + addPattern<TestSpec::NamePattern>(); + addFilter(); + } + else if( c == '[' ) { + if( subString() == "exclude:" ) + m_exclusion = true; + else + addPattern<TestSpec::NamePattern>(); + startNewMode( Tag, ++m_pos ); + } + } + else if( m_mode == QuotedName && c == '"' ) + addPattern<TestSpec::NamePattern>(); + else if( m_mode == Tag && c == ']' ) + addPattern<TestSpec::TagPattern>(); + } + void startNewMode( Mode mode, std::size_t start ) { + m_mode = mode; + m_start = start; + } + std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } + template<typename T> + void addPattern() { + std::string token = subString(); + if( startsWith( token, "exclude:" ) ) { + m_exclusion = true; + token = token.substr( 8 ); + } + if( !token.empty() ) { + Ptr<TestSpec::Pattern> pattern = new T( token ); + if( m_exclusion ) + pattern = new TestSpec::ExcludedPattern( pattern ); + m_currentFilter.m_patterns.push_back( pattern ); + } + m_exclusion = false; + m_mode = None; + } + void addFilter() { + if( !m_currentFilter.m_patterns.empty() ) { + m_testSpec.m_filters.push_back( m_currentFilter ); + m_currentFilter = TestSpec::Filter(); + } + } + }; + inline TestSpec parseTestSpec( std::string const& arg ) { + return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); + } + +} // namespace Catch + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// #included from: catch_interfaces_config.h +#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED + +#include <iostream> +#include <string> +#include <vector> + +namespace Catch { + + struct Verbosity { enum Level { + NoOutput = 0, + Quiet, + Normal + }; }; + + struct WarnAbout { enum What { + Nothing = 0x00, + NoAssertions = 0x01 + }; }; + + struct ShowDurations { enum OrNot { + DefaultForReporter, + Always, + Never + }; }; + + class TestSpec; + + struct IConfig : IShared { + + virtual ~IConfig(); + + virtual bool allowThrows() const = 0; + virtual std::ostream& stream() const = 0; + virtual std::string name() const = 0; + virtual bool includeSuccessfulResults() const = 0; + virtual bool shouldDebugBreak() const = 0; + virtual bool warnAboutMissingAssertions() const = 0; + virtual int abortAfter() const = 0; + virtual bool showInvisibles() const = 0; + virtual ShowDurations::OrNot showDurations() const = 0; + virtual TestSpec const& testSpec() const = 0; + }; +} + +// #included from: catch_stream.h +#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED + +#include <streambuf> + +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wpadded" +#endif + +namespace Catch { + + class Stream { + public: + Stream(); + Stream( std::streambuf* _streamBuf, bool _isOwned ); + void release(); + + std::streambuf* streamBuf; + + private: + bool isOwned; + }; +} + +#include <memory> +#include <vector> +#include <string> +#include <iostream> + +#ifndef CATCH_CONFIG_CONSOLE_WIDTH +#define CATCH_CONFIG_CONSOLE_WIDTH 80 +#endif + +namespace Catch { + + struct ConfigData { + + ConfigData() + : listTests( false ), + listTags( false ), + listReporters( false ), + listTestNamesOnly( false ), + showSuccessfulTests( false ), + shouldDebugBreak( false ), + noThrow( false ), + showHelp( false ), + showInvisibles( false ), + abortAfter( -1 ), + verbosity( Verbosity::Normal ), + warnings( WarnAbout::Nothing ), + showDurations( ShowDurations::DefaultForReporter ) + {} + + bool listTests; + bool listTags; + bool listReporters; + bool listTestNamesOnly; + + bool showSuccessfulTests; + bool shouldDebugBreak; + bool noThrow; + bool showHelp; + bool showInvisibles; + + int abortAfter; + + Verbosity::Level verbosity; + WarnAbout::What warnings; + ShowDurations::OrNot showDurations; + + std::string reporterName; + std::string outputFilename; + std::string name; + std::string processName; + + std::vector<std::string> testsOrTags; + }; + + class Config : public SharedImpl<IConfig> { + private: + Config( Config const& other ); + Config& operator = ( Config const& other ); + virtual void dummy(); + public: + + Config() + : m_os( std::cout.rdbuf() ) + {} + + Config( ConfigData const& data ) + : m_data( data ), + m_os( std::cout.rdbuf() ) + { + if( !data.testsOrTags.empty() ) { + TestSpecParser parser( ITagAliasRegistry::get() ); + for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) + parser.parse( data.testsOrTags[i] ); + m_testSpec = parser.testSpec(); + } + } + + virtual ~Config() { + m_os.rdbuf( std::cout.rdbuf() ); + m_stream.release(); + } + + void setFilename( std::string const& filename ) { + m_data.outputFilename = filename; + } + + std::string const& getFilename() const { + return m_data.outputFilename ; + } + + bool listTests() const { return m_data.listTests; } + bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } + bool listTags() const { return m_data.listTags; } + bool listReporters() const { return m_data.listReporters; } + + std::string getProcessName() const { return m_data.processName; } + + bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } + + void setStreamBuf( std::streambuf* buf ) { + m_os.rdbuf( buf ? buf : std::cout.rdbuf() ); + } + + void useStream( std::string const& streamName ) { + Stream stream = createStream( streamName ); + setStreamBuf( stream.streamBuf ); + m_stream.release(); + m_stream = stream; + } + + std::string getReporterName() const { return m_data.reporterName; } + + int abortAfter() const { return m_data.abortAfter; } + + TestSpec const& testSpec() const { return m_testSpec; } + + bool showHelp() const { return m_data.showHelp; } + bool showInvisibles() const { return m_data.showInvisibles; } + + // IConfig interface + virtual bool allowThrows() const { return !m_data.noThrow; } + virtual std::ostream& stream() const { return m_os; } + virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } + virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; } + virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; } + virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } + + private: + ConfigData m_data; + + Stream m_stream; + mutable std::ostream m_os; + TestSpec m_testSpec; + }; + +} // end namespace Catch + +// #included from: catch_clara.h +#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED + +// Use Catch's value for console width (store Clara's off to the side, if present) +#ifdef CLARA_CONFIG_CONSOLE_WIDTH +#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH +#undef CLARA_CONFIG_CONSOLE_WIDTH +#endif +#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH + +// Declare Clara inside the Catch namespace +#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { +// #included from: ../external/clara.h + +// Only use header guard if we are not using an outer namespace +#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) + +#ifndef STITCH_CLARA_OPEN_NAMESPACE +#define TWOBLUECUBES_CLARA_H_INCLUDED +#define STITCH_CLARA_OPEN_NAMESPACE +#define STITCH_CLARA_CLOSE_NAMESPACE +#else +#define STITCH_CLARA_CLOSE_NAMESPACE } +#endif + +#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE + +// ----------- #included from tbc_text_format.h ----------- + +// Only use header guard if we are not using an outer namespace +#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) +#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +#define TBC_TEXT_FORMAT_H_INCLUDED +#endif + +#include <string> +#include <vector> +#include <sstream> + +// Use optional outer namespace +#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { +#endif + +namespace Tbc { + +#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH + const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; +#else + const unsigned int consoleWidth = 80; +#endif + + struct TextAttributes { + TextAttributes() + : initialIndent( std::string::npos ), + indent( 0 ), + width( consoleWidth-1 ), + tabChar( '\t' ) + {} + + TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } + TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } + TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } + TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } + + std::size_t initialIndent; // indent of first line, or npos + std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos + std::size_t width; // maximum width of text, including indent. Longer text will wrap + char tabChar; // If this char is seen the indent is changed to current pos + }; + + class Text { + public: + Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) + : attr( _attr ) + { + std::string wrappableChars = " [({.,/|\\-"; + std::size_t indent = _attr.initialIndent != std::string::npos + ? _attr.initialIndent + : _attr.indent; + std::string remainder = _str; + + while( !remainder.empty() ) { + if( lines.size() >= 1000 ) { + lines.push_back( "... message truncated due to excessive size" ); + return; + } + std::size_t tabPos = std::string::npos; + std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); + std::size_t pos = remainder.find_first_of( '\n' ); + if( pos <= width ) { + width = pos; + } + pos = remainder.find_last_of( _attr.tabChar, width ); + if( pos != std::string::npos ) { + tabPos = pos; + if( remainder[width] == '\n' ) + width--; + remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); + } + + if( width == remainder.size() ) { + spliceLine( indent, remainder, width ); + } + else if( remainder[width] == '\n' ) { + spliceLine( indent, remainder, width ); + if( width <= 1 || remainder.size() != 1 ) + remainder = remainder.substr( 1 ); + indent = _attr.indent; + } + else { + pos = remainder.find_last_of( wrappableChars, width ); + if( pos != std::string::npos && pos > 0 ) { + spliceLine( indent, remainder, pos ); + if( remainder[0] == ' ' ) + remainder = remainder.substr( 1 ); + } + else { + spliceLine( indent, remainder, width-1 ); + lines.back() += "-"; + } + if( lines.size() == 1 ) + indent = _attr.indent; + if( tabPos != std::string::npos ) + indent += tabPos; + } + } + } + + void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { + lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); + _remainder = _remainder.substr( _pos ); + } + + typedef std::vector<std::string>::const_iterator const_iterator; + + const_iterator begin() const { return lines.begin(); } + const_iterator end() const { return lines.end(); } + std::string const& last() const { return lines.back(); } + std::size_t size() const { return lines.size(); } + std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } + std::string toString() const { + std::ostringstream oss; + oss << *this; + return oss.str(); + } + + inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { + for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); + it != itEnd; ++it ) { + if( it != _text.begin() ) + _stream << "\n"; + _stream << *it; + } + return _stream; + } + + private: + std::string str; + TextAttributes attr; + std::vector<std::string> lines; + }; + +} // end namespace Tbc + +#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +} // end outer namespace +#endif + +#endif // TBC_TEXT_FORMAT_H_INCLUDED + +// ----------- end of #include from tbc_text_format.h ----------- +// ........... back in /Users/philnash/Dev/OSS/Clara/srcs/clara.h + +#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE + +#include <map> +#include <algorithm> +#include <stdexcept> +#include <memory> + +// Use optional outer namespace +#ifdef STITCH_CLARA_OPEN_NAMESPACE +STITCH_CLARA_OPEN_NAMESPACE +#endif + +namespace Clara { + + struct UnpositionalTag {}; + + extern UnpositionalTag _; + +#ifdef CLARA_CONFIG_MAIN + UnpositionalTag _; +#endif + + namespace Detail { + +#ifdef CLARA_CONSOLE_WIDTH + const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH; +#else + const unsigned int consoleWidth = 80; +#endif + + using namespace Tbc; + + inline bool startsWith( std::string const& str, std::string const& prefix ) { + return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix; + } + + template<typename T> struct RemoveConstRef{ typedef T type; }; + template<typename T> struct RemoveConstRef<T&>{ typedef T type; }; + template<typename T> struct RemoveConstRef<T const&>{ typedef T type; }; + template<typename T> struct RemoveConstRef<T const>{ typedef T type; }; + + template<typename T> struct IsBool { static const bool value = false; }; + template<> struct IsBool<bool> { static const bool value = true; }; + + template<typename T> + void convertInto( std::string const& _source, T& _dest ) { + std::stringstream ss; + ss << _source; + ss >> _dest; + if( ss.fail() ) + throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); + } + inline void convertInto( std::string const& _source, std::string& _dest ) { + _dest = _source; + } + inline void convertInto( std::string const& _source, bool& _dest ) { + std::string sourceLC = _source; + std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower ); + if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) + _dest = true; + else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) + _dest = false; + else + throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); + } + inline void convertInto( bool _source, bool& _dest ) { + _dest = _source; + } + template<typename T> + inline void convertInto( bool, T& ) { + throw std::runtime_error( "Invalid conversion" ); + } + + template<typename ConfigT> + struct IArgFunction { + virtual ~IArgFunction() {} +# ifdef CATCH_CPP11_OR_GREATER + IArgFunction() = default; + IArgFunction( IArgFunction const& ) = default; +# endif + virtual void set( ConfigT& config, std::string const& value ) const = 0; + virtual void setFlag( ConfigT& config ) const = 0; + virtual bool takesArg() const = 0; + virtual IArgFunction* clone() const = 0; + }; + + template<typename ConfigT> + class BoundArgFunction { + public: + BoundArgFunction() : functionObj( NULL ) {} + BoundArgFunction( IArgFunction<ConfigT>* _functionObj ) : functionObj( _functionObj ) {} + BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : NULL ) {} + BoundArgFunction& operator = ( BoundArgFunction const& other ) { + IArgFunction<ConfigT>* newFunctionObj = other.functionObj ? other.functionObj->clone() : NULL; + delete functionObj; + functionObj = newFunctionObj; + return *this; + } + ~BoundArgFunction() { delete functionObj; } + + void set( ConfigT& config, std::string const& value ) const { + functionObj->set( config, value ); + } + void setFlag( ConfigT& config ) const { + functionObj->setFlag( config ); + } + bool takesArg() const { return functionObj->takesArg(); } + + bool isSet() const { + return functionObj != NULL; + } + private: + IArgFunction<ConfigT>* functionObj; + }; + + template<typename C> + struct NullBinder : IArgFunction<C>{ + virtual void set( C&, std::string const& ) const {} + virtual void setFlag( C& ) const {} + virtual bool takesArg() const { return true; } + virtual IArgFunction<C>* clone() const { return new NullBinder( *this ); } + }; + + template<typename C, typename M> + struct BoundDataMember : IArgFunction<C>{ + BoundDataMember( M C::* _member ) : member( _member ) {} + virtual void set( C& p, std::string const& stringValue ) const { + convertInto( stringValue, p.*member ); + } + virtual void setFlag( C& p ) const { + convertInto( true, p.*member ); + } + virtual bool takesArg() const { return !IsBool<M>::value; } + virtual IArgFunction<C>* clone() const { return new BoundDataMember( *this ); } + M C::* member; + }; + template<typename C, typename M> + struct BoundUnaryMethod : IArgFunction<C>{ + BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} + virtual void set( C& p, std::string const& stringValue ) const { + typename RemoveConstRef<M>::type value; + convertInto( stringValue, value ); + (p.*member)( value ); + } + virtual void setFlag( C& p ) const { + typename RemoveConstRef<M>::type value; + convertInto( true, value ); + (p.*member)( value ); + } + virtual bool takesArg() const { return !IsBool<M>::value; } + virtual IArgFunction<C>* clone() const { return new BoundUnaryMethod( *this ); } + void (C::*member)( M ); + }; + template<typename C> + struct BoundNullaryMethod : IArgFunction<C>{ + BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} + virtual void set( C& p, std::string const& stringValue ) const { + bool value; + convertInto( stringValue, value ); + if( value ) + (p.*member)(); + } + virtual void setFlag( C& p ) const { + (p.*member)(); + } + virtual bool takesArg() const { return false; } + virtual IArgFunction<C>* clone() const { return new BoundNullaryMethod( *this ); } + void (C::*member)(); + }; + + template<typename C> + struct BoundUnaryFunction : IArgFunction<C>{ + BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} + virtual void set( C& obj, std::string const& stringValue ) const { + bool value; + convertInto( stringValue, value ); + if( value ) + function( obj ); + } + virtual void setFlag( C& p ) const { + function( p ); + } + virtual bool takesArg() const { return false; } + virtual IArgFunction<C>* clone() const { return new BoundUnaryFunction( *this ); } + void (*function)( C& ); + }; + + template<typename C, typename T> + struct BoundBinaryFunction : IArgFunction<C>{ + BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} + virtual void set( C& obj, std::string const& stringValue ) const { + typename RemoveConstRef<T>::type value; + convertInto( stringValue, value ); + function( obj, value ); + } + virtual void setFlag( C& obj ) const { + typename RemoveConstRef<T>::type value; + convertInto( true, value ); + function( obj, value ); + } + virtual bool takesArg() const { return !IsBool<T>::value; } + virtual IArgFunction<C>* clone() const { return new BoundBinaryFunction( *this ); } + void (*function)( C&, T ); + }; + + } // namespace Detail + + struct Parser { + Parser() : separators( " \t=:" ) {} + + struct Token { + enum Type { Positional, ShortOpt, LongOpt }; + Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} + Type type; + std::string data; + }; + + void parseIntoTokens( int argc, char const * const * argv, std::vector<Parser::Token>& tokens ) const { + const std::string doubleDash = "--"; + for( int i = 1; i < argc && argv[i] != doubleDash; ++i ) + parseIntoTokens( argv[i] , tokens); + } + void parseIntoTokens( std::string arg, std::vector<Parser::Token>& tokens ) const { + while( !arg.empty() ) { + Parser::Token token( Parser::Token::Positional, arg ); + arg = ""; + if( token.data[0] == '-' ) { + if( token.data.size() > 1 && token.data[1] == '-' ) { + token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) ); + } + else { + token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) ); + if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) { + arg = "-" + token.data.substr( 1 ); + token.data = token.data.substr( 0, 1 ); + } + } + } + if( token.type != Parser::Token::Positional ) { + std::size_t pos = token.data.find_first_of( separators ); + if( pos != std::string::npos ) { + arg = token.data.substr( pos+1 ); + token.data = token.data.substr( 0, pos ); + } + } + tokens.push_back( token ); + } + } + std::string separators; + }; + + template<typename ConfigT> + struct CommonArgProperties { + CommonArgProperties() {} + CommonArgProperties( Detail::BoundArgFunction<ConfigT> const& _boundField ) : boundField( _boundField ) {} + + Detail::BoundArgFunction<ConfigT> boundField; + std::string description; + std::string detail; + std::string placeholder; // Only value if boundField takes an arg + + bool takesArg() const { + return !placeholder.empty(); + } + void validate() const { + if( !boundField.isSet() ) + throw std::logic_error( "option not bound" ); + } + }; + struct OptionArgProperties { + std::vector<std::string> shortNames; + std::string longName; + + bool hasShortName( std::string const& shortName ) const { + return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end(); + } + bool hasLongName( std::string const& _longName ) const { + return _longName == longName; + } + }; + struct PositionalArgProperties { + PositionalArgProperties() : position( -1 ) {} + int position; // -1 means non-positional (floating) + + bool isFixedPositional() const { + return position != -1; + } + }; + + template<typename ConfigT> + class CommandLine { + + struct Arg : CommonArgProperties<ConfigT>, OptionArgProperties, PositionalArgProperties { + Arg() {} + Arg( Detail::BoundArgFunction<ConfigT> const& _boundField ) : CommonArgProperties<ConfigT>( _boundField ) {} + + using CommonArgProperties<ConfigT>::placeholder; // !TBD + + std::string dbgName() const { + if( !longName.empty() ) + return "--" + longName; + if( !shortNames.empty() ) + return "-" + shortNames[0]; + return "positional args"; + } + std::string commands() const { + std::ostringstream oss; + bool first = true; + std::vector<std::string>::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); + for(; it != itEnd; ++it ) { + if( first ) + first = false; + else + oss << ", "; + oss << "-" << *it; + } + if( !longName.empty() ) { + if( !first ) + oss << ", "; + oss << "--" << longName; + } + if( !placeholder.empty() ) + oss << " <" << placeholder << ">"; + return oss.str(); + } + }; + + // NOTE: std::auto_ptr is deprecated in c++11/c++0x +#if defined(__cplusplus) && __cplusplus > 199711L + typedef std::unique_ptr<Arg> ArgAutoPtr; +#else + typedef std::auto_ptr<Arg> ArgAutoPtr; +#endif + + friend void addOptName( Arg& arg, std::string const& optName ) + { + if( optName.empty() ) + return; + if( Detail::startsWith( optName, "--" ) ) { + if( !arg.longName.empty() ) + throw std::logic_error( "Only one long opt may be specified. '" + + arg.longName + + "' already specified, now attempting to add '" + + optName + "'" ); + arg.longName = optName.substr( 2 ); + } + else if( Detail::startsWith( optName, "-" ) ) + arg.shortNames.push_back( optName.substr( 1 ) ); + else + throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" ); + } + friend void setPositionalArg( Arg& arg, int position ) + { + arg.position = position; + } + + class ArgBuilder { + public: + ArgBuilder( Arg* arg ) : m_arg( arg ) {} + + // Bind a non-boolean data member (requires placeholder string) + template<typename C, typename M> + void bind( M C::* field, std::string const& placeholder ) { + m_arg->boundField = new Detail::BoundDataMember<C,M>( field ); + m_arg->placeholder = placeholder; + } + // Bind a boolean data member (no placeholder required) + template<typename C> + void bind( bool C::* field ) { + m_arg->boundField = new Detail::BoundDataMember<C,bool>( field ); + } + + // Bind a method taking a single, non-boolean argument (requires a placeholder string) + template<typename C, typename M> + void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) { + m_arg->boundField = new Detail::BoundUnaryMethod<C,M>( unaryMethod ); + m_arg->placeholder = placeholder; + } + + // Bind a method taking a single, boolean argument (no placeholder string required) + template<typename C> + void bind( void (C::* unaryMethod)( bool ) ) { + m_arg->boundField = new Detail::BoundUnaryMethod<C,bool>( unaryMethod ); + } + + // Bind a method that takes no arguments (will be called if opt is present) + template<typename C> + void bind( void (C::* nullaryMethod)() ) { + m_arg->boundField = new Detail::BoundNullaryMethod<C>( nullaryMethod ); + } + + // Bind a free function taking a single argument - the object to operate on (no placeholder string required) + template<typename C> + void bind( void (* unaryFunction)( C& ) ) { + m_arg->boundField = new Detail::BoundUnaryFunction<C>( unaryFunction ); + } + + // Bind a free function taking a single argument - the object to operate on (requires a placeholder string) + template<typename C, typename T> + void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) { + m_arg->boundField = new Detail::BoundBinaryFunction<C, T>( binaryFunction ); + m_arg->placeholder = placeholder; + } + + ArgBuilder& describe( std::string const& description ) { + m_arg->description = description; + return *this; + } + ArgBuilder& detail( std::string const& detail ) { + m_arg->detail = detail; + return *this; + } + + protected: + Arg* m_arg; + }; + + class OptBuilder : public ArgBuilder { + public: + OptBuilder( Arg* arg ) : ArgBuilder( arg ) {} + OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {} + + OptBuilder& operator[]( std::string const& optName ) { + addOptName( *ArgBuilder::m_arg, optName ); + return *this; + } + }; + + public: + + CommandLine() + : m_boundProcessName( new Detail::NullBinder<ConfigT>() ), + m_highestSpecifiedArgPosition( 0 ), + m_throwOnUnrecognisedTokens( false ) + {} + CommandLine( CommandLine const& other ) + : m_boundProcessName( other.m_boundProcessName ), + m_options ( other.m_options ), + m_positionalArgs( other.m_positionalArgs ), + m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ), + m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) + { + if( other.m_floatingArg.get() ) + m_floatingArg = ArgAutoPtr( new Arg( *other.m_floatingArg ) ); + } + + CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { + m_throwOnUnrecognisedTokens = shouldThrow; + return *this; + } + + OptBuilder operator[]( std::string const& optName ) { + m_options.push_back( Arg() ); + addOptName( m_options.back(), optName ); + OptBuilder builder( &m_options.back() ); + return builder; + } + + ArgBuilder operator[]( int position ) { + m_positionalArgs.insert( std::make_pair( position, Arg() ) ); + if( position > m_highestSpecifiedArgPosition ) + m_highestSpecifiedArgPosition = position; + setPositionalArg( m_positionalArgs[position], position ); + ArgBuilder builder( &m_positionalArgs[position] ); + return builder; + } + + // Invoke this with the _ instance + ArgBuilder operator[]( UnpositionalTag ) { + if( m_floatingArg.get() ) + throw std::logic_error( "Only one unpositional argument can be added" ); + m_floatingArg = ArgAutoPtr( new Arg() ); + ArgBuilder builder( m_floatingArg.get() ); + return builder; + } + + template<typename C, typename M> + void bindProcessName( M C::* field ) { + m_boundProcessName = new Detail::BoundDataMember<C,M>( field ); + } + template<typename C, typename M> + void bindProcessName( void (C::*_unaryMethod)( M ) ) { + m_boundProcessName = new Detail::BoundUnaryMethod<C,M>( _unaryMethod ); + } + + void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const { + typename std::vector<Arg>::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; + std::size_t maxWidth = 0; + for( it = itBegin; it != itEnd; ++it ) + maxWidth = (std::max)( maxWidth, it->commands().size() ); + + for( it = itBegin; it != itEnd; ++it ) { + Detail::Text usage( it->commands(), Detail::TextAttributes() + .setWidth( maxWidth+indent ) + .setIndent( indent ) ); + Detail::Text desc( it->description, Detail::TextAttributes() + .setWidth( width - maxWidth - 3 ) ); + + for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { + std::string usageCol = i < usage.size() ? usage[i] : ""; + os << usageCol; + + if( i < desc.size() && !desc[i].empty() ) + os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) + << desc[i]; + os << "\n"; + } + } + } + std::string optUsage() const { + std::ostringstream oss; + optUsage( oss ); + return oss.str(); + } + + void argSynopsis( std::ostream& os ) const { + for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { + if( i > 1 ) + os << " "; + typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( i ); + if( it != m_positionalArgs.end() ) + os << "<" << it->second.placeholder << ">"; + else if( m_floatingArg.get() ) + os << "<" << m_floatingArg->placeholder << ">"; + else + throw std::logic_error( "non consecutive positional arguments with no floating args" ); + } + // !TBD No indication of mandatory args + if( m_floatingArg.get() ) { + if( m_highestSpecifiedArgPosition > 1 ) + os << " "; + os << "[<" << m_floatingArg->placeholder << "> ...]"; + } + } + std::string argSynopsis() const { + std::ostringstream oss; + argSynopsis( oss ); + return oss.str(); + } + + void usage( std::ostream& os, std::string const& procName ) const { + validate(); + os << "usage:\n " << procName << " "; + argSynopsis( os ); + if( !m_options.empty() ) { + os << " [options]\n\nwhere options are: \n"; + optUsage( os, 2 ); + } + os << "\n"; + } + std::string usage( std::string const& procName ) const { + std::ostringstream oss; + usage( oss, procName ); + return oss.str(); + } + + ConfigT parse( int argc, char const * const * argv ) const { + ConfigT config; + parseInto( argc, argv, config ); + return config; + } + + std::vector<Parser::Token> parseInto( int argc, char const * const * argv, ConfigT& config ) const { + std::string processName = argv[0]; + std::size_t lastSlash = processName.find_last_of( "/\\" ); + if( lastSlash != std::string::npos ) + processName = processName.substr( lastSlash+1 ); + m_boundProcessName.set( config, processName ); + std::vector<Parser::Token> tokens; + Parser parser; + parser.parseIntoTokens( argc, argv, tokens ); + return populate( tokens, config ); + } + + std::vector<Parser::Token> populate( std::vector<Parser::Token> const& tokens, ConfigT& config ) const { + validate(); + std::vector<Parser::Token> unusedTokens = populateOptions( tokens, config ); + unusedTokens = populateFixedArgs( unusedTokens, config ); + unusedTokens = populateFloatingArgs( unusedTokens, config ); + return unusedTokens; + } + + std::vector<Parser::Token> populateOptions( std::vector<Parser::Token> const& tokens, ConfigT& config ) const { + std::vector<Parser::Token> unusedTokens; + std::vector<std::string> errors; + for( std::size_t i = 0; i < tokens.size(); ++i ) { + Parser::Token const& token = tokens[i]; + typename std::vector<Arg>::const_iterator it = m_options.begin(), itEnd = m_options.end(); + for(; it != itEnd; ++it ) { + Arg const& arg = *it; + + try { + if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || + ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { + if( arg.takesArg() ) { + if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) + errors.push_back( "Expected argument to option: " + token.data ); + else + arg.boundField.set( config, tokens[++i].data ); + } + else { + arg.boundField.setFlag( config ); + } + break; + } + } + catch( std::exception& ex ) { + errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); + } + } + if( it == itEnd ) { + if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) + unusedTokens.push_back( token ); + else if( m_throwOnUnrecognisedTokens ) + errors.push_back( "unrecognised option: " + token.data ); + } + } + if( !errors.empty() ) { + std::ostringstream oss; + for( std::vector<std::string>::const_iterator it = errors.begin(), itEnd = errors.end(); + it != itEnd; + ++it ) { + if( it != errors.begin() ) + oss << "\n"; + oss << *it; + } + throw std::runtime_error( oss.str() ); + } + return unusedTokens; + } + std::vector<Parser::Token> populateFixedArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const { + std::vector<Parser::Token> unusedTokens; + int position = 1; + for( std::size_t i = 0; i < tokens.size(); ++i ) { + Parser::Token const& token = tokens[i]; + typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( position ); + if( it != m_positionalArgs.end() ) + it->second.boundField.set( config, token.data ); + else + unusedTokens.push_back( token ); + if( token.type == Parser::Token::Positional ) + position++; + } + return unusedTokens; + } + std::vector<Parser::Token> populateFloatingArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const { + if( !m_floatingArg.get() ) + return tokens; + std::vector<Parser::Token> unusedTokens; + for( std::size_t i = 0; i < tokens.size(); ++i ) { + Parser::Token const& token = tokens[i]; + if( token.type == Parser::Token::Positional ) + m_floatingArg->boundField.set( config, token.data ); + else + unusedTokens.push_back( token ); + } + return unusedTokens; + } + + void validate() const + { + if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() ) + throw std::logic_error( "No options or arguments specified" ); + + for( typename std::vector<Arg>::const_iterator it = m_options.begin(), + itEnd = m_options.end(); + it != itEnd; ++it ) + it->validate(); + } + + private: + Detail::BoundArgFunction<ConfigT> m_boundProcessName; + std::vector<Arg> m_options; + std::map<int, Arg> m_positionalArgs; + ArgAutoPtr m_floatingArg; + int m_highestSpecifiedArgPosition; + bool m_throwOnUnrecognisedTokens; + }; + +} // end namespace Clara + +STITCH_CLARA_CLOSE_NAMESPACE +#undef STITCH_CLARA_OPEN_NAMESPACE +#undef STITCH_CLARA_CLOSE_NAMESPACE + +#endif // TWOBLUECUBES_CLARA_H_INCLUDED +#undef STITCH_CLARA_OPEN_NAMESPACE + +// Restore Clara's value for console width, if present +#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#endif + +#include <fstream> + +namespace Catch { + + inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } + inline void abortAfterX( ConfigData& config, int x ) { + if( x < 1 ) + throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); + config.abortAfter = x; + } + inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } + + inline void addWarning( ConfigData& config, std::string const& _warning ) { + if( _warning == "NoAssertions" ) + config.warnings = static_cast<WarnAbout::What>( config.warnings | WarnAbout::NoAssertions ); + else + throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" ); + + } + inline void setVerbosity( ConfigData& config, int level ) { + // !TBD: accept strings? + config.verbosity = static_cast<Verbosity::Level>( level ); + } + inline void setShowDurations( ConfigData& config, bool _showDurations ) { + config.showDurations = _showDurations + ? ShowDurations::Always + : ShowDurations::Never; + } + inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { + std::ifstream f( _filename.c_str() ); + if( !f.is_open() ) + throw std::domain_error( "Unable to load input file: " + _filename ); + + std::string line; + while( std::getline( f, line ) ) { + line = trim(line); + if( !line.empty() && !startsWith( line, "#" ) ) + addTestOrTags( config, "\"" + line + "\"," ); + } + } + + inline Clara::CommandLine<ConfigData> makeCommandLineParser() { + + using namespace Clara; + CommandLine<ConfigData> cli; + + cli.bindProcessName( &ConfigData::processName ); + + cli["-?"]["-h"]["--help"] + .describe( "display usage information" ) + .bind( &ConfigData::showHelp ); + + cli["-l"]["--list-tests"] + .describe( "list all/matching test cases" ) + .bind( &ConfigData::listTests ); + + cli["-t"]["--list-tags"] + .describe( "list all/matching tags" ) + .bind( &ConfigData::listTags ); + + cli["-s"]["--success"] + .describe( "include successful tests in output" ) + .bind( &ConfigData::showSuccessfulTests ); + + cli["-b"]["--break"] + .describe( "break into debugger on failure" ) + .bind( &ConfigData::shouldDebugBreak ); + + cli["-e"]["--nothrow"] + .describe( "skip exception tests" ) + .bind( &ConfigData::noThrow ); + + cli["-i"]["--invisibles"] + .describe( "show invisibles (tabs, newlines)" ) + .bind( &ConfigData::showInvisibles ); + + cli["-o"]["--out"] + .describe( "output filename" ) + .bind( &ConfigData::outputFilename, "filename" ); + + cli["-r"]["--reporter"] +// .placeholder( "name[:filename]" ) + .describe( "reporter to use (defaults to console)" ) + .bind( &ConfigData::reporterName, "name" ); + + cli["-n"]["--name"] + .describe( "suite name" ) + .bind( &ConfigData::name, "name" ); + + cli["-a"]["--abort"] + .describe( "abort at first failure" ) + .bind( &abortAfterFirst ); + + cli["-x"]["--abortx"] + .describe( "abort after x failures" ) + .bind( &abortAfterX, "no. failures" ); + + cli["-w"]["--warn"] + .describe( "enable warnings" ) + .bind( &addWarning, "warning name" ); + +// - needs updating if reinstated +// cli.into( &setVerbosity ) +// .describe( "level of verbosity (0=no output)" ) +// .shortOpt( "v") +// .longOpt( "verbosity" ) +// .placeholder( "level" ); + + cli[_] + .describe( "which test or tests to use" ) + .bind( &addTestOrTags, "test name, pattern or tags" ); + + cli["-d"]["--durations"] + .describe( "show test durations" ) + .bind( &setShowDurations, "yes/no" ); + + cli["-f"]["--input-file"] + .describe( "load test names to run from a file" ) + .bind( &loadTestNamesFromFile, "filename" ); + + // Less common commands which don't have a short form + cli["--list-test-names-only"] + .describe( "list all/matching test cases names only" ) + .bind( &ConfigData::listTestNamesOnly ); + + cli["--list-reporters"] + .describe( "list all reporters" ) + .bind( &ConfigData::listReporters ); + + return cli; + } + +} // end namespace Catch + +// #included from: internal/catch_list.hpp +#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED + +// #included from: catch_text.h +#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED + +#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH + +#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch +// #included from: ../external/tbc_text_format.h +// Only use header guard if we are not using an outer namespace +#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED +# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +# endif +# else +# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED +# endif +#endif +#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +#include <string> +#include <vector> +#include <sstream> + +// Use optional outer namespace +#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { +#endif + +namespace Tbc { + +#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH + const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; +#else + const unsigned int consoleWidth = 80; +#endif + + struct TextAttributes { + TextAttributes() + : initialIndent( std::string::npos ), + indent( 0 ), + width( consoleWidth-1 ), + tabChar( '\t' ) + {} + + TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } + TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } + TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } + TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } + + std::size_t initialIndent; // indent of first line, or npos + std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos + std::size_t width; // maximum width of text, including indent. Longer text will wrap + char tabChar; // If this char is seen the indent is changed to current pos + }; + + class Text { + public: + Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) + : attr( _attr ) + { + std::string wrappableChars = " [({.,/|\\-"; + std::size_t indent = _attr.initialIndent != std::string::npos + ? _attr.initialIndent + : _attr.indent; + std::string remainder = _str; + + while( !remainder.empty() ) { + if( lines.size() >= 1000 ) { + lines.push_back( "... message truncated due to excessive size" ); + return; + } + std::size_t tabPos = std::string::npos; + std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); + std::size_t pos = remainder.find_first_of( '\n' ); + if( pos <= width ) { + width = pos; + } + pos = remainder.find_last_of( _attr.tabChar, width ); + if( pos != std::string::npos ) { + tabPos = pos; + if( remainder[width] == '\n' ) + width--; + remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); + } + + if( width == remainder.size() ) { + spliceLine( indent, remainder, width ); + } + else if( remainder[width] == '\n' ) { + spliceLine( indent, remainder, width ); + if( width <= 1 || remainder.size() != 1 ) + remainder = remainder.substr( 1 ); + indent = _attr.indent; + } + else { + pos = remainder.find_last_of( wrappableChars, width ); + if( pos != std::string::npos && pos > 0 ) { + spliceLine( indent, remainder, pos ); + if( remainder[0] == ' ' ) + remainder = remainder.substr( 1 ); + } + else { + spliceLine( indent, remainder, width-1 ); + lines.back() += "-"; + } + if( lines.size() == 1 ) + indent = _attr.indent; + if( tabPos != std::string::npos ) + indent += tabPos; + } + } + } + + void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { + lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); + _remainder = _remainder.substr( _pos ); + } + + typedef std::vector<std::string>::const_iterator const_iterator; + + const_iterator begin() const { return lines.begin(); } + const_iterator end() const { return lines.end(); } + std::string const& last() const { return lines.back(); } + std::size_t size() const { return lines.size(); } + std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } + std::string toString() const { + std::ostringstream oss; + oss << *this; + return oss.str(); + } + + inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { + for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); + it != itEnd; ++it ) { + if( it != _text.begin() ) + _stream << "\n"; + _stream << *it; + } + return _stream; + } + + private: + std::string str; + TextAttributes attr; + std::vector<std::string> lines; + }; + +} // end namespace Tbc + +#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +} // end outer namespace +#endif + +#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED +#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE + +namespace Catch { + using Tbc::Text; + using Tbc::TextAttributes; +} + +// #included from: catch_console_colour.hpp +#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED + +namespace Catch { + + namespace Detail { + struct IColourImpl; + } + + struct Colour { + enum Code { + None = 0, + + White, + Red, + Green, + Blue, + Cyan, + Yellow, + Grey, + + Bright = 0x10, + + BrightRed = Bright | Red, + BrightGreen = Bright | Green, + LightGrey = Bright | Grey, + BrightWhite = Bright | White, + + // By intention + FileName = LightGrey, + Warning = Yellow, + ResultError = BrightRed, + ResultSuccess = BrightGreen, + ResultExpectedFailure = Warning, + + Error = BrightRed, + Success = Green, + + OriginalExpression = Cyan, + ReconstructedExpression = Yellow, + + SecondaryText = LightGrey, + Headers = White + }; + + // Use constructed object for RAII guard + Colour( Code _colourCode ); + Colour( Colour const& other ); + ~Colour(); + + // Use static method for one-shot changes + static void use( Code _colourCode ); + + private: + static Detail::IColourImpl* impl(); + bool m_moved; + }; + + inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } + +} // end namespace Catch + +// #included from: catch_interfaces_reporter.h +#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED + +#include <string> +#include <ostream> +#include <map> +#include <assert.h> + +namespace Catch +{ + struct ReporterConfig { + explicit ReporterConfig( Ptr<IConfig> const& _fullConfig ) + : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} + + ReporterConfig( Ptr<IConfig> const& _fullConfig, std::ostream& _stream ) + : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} + + std::ostream& stream() const { return *m_stream; } + Ptr<IConfig> fullConfig() const { return m_fullConfig; } + + private: + std::ostream* m_stream; + Ptr<IConfig> m_fullConfig; + }; + + struct ReporterPreferences { + ReporterPreferences() + : shouldRedirectStdOut( false ) + {} + + bool shouldRedirectStdOut; + }; + + template<typename T> + struct LazyStat : Option<T> { + LazyStat() : used( false ) {} + LazyStat& operator=( T const& _value ) { + Option<T>::operator=( _value ); + used = false; + return *this; + } + void reset() { + Option<T>::reset(); + used = false; + } + bool used; + }; + + struct TestRunInfo { + TestRunInfo( std::string const& _name ) : name( _name ) {} + std::string name; + }; + struct GroupInfo { + GroupInfo( std::string const& _name, + std::size_t _groupIndex, + std::size_t _groupsCount ) + : name( _name ), + groupIndex( _groupIndex ), + groupsCounts( _groupsCount ) + {} + + std::string name; + std::size_t groupIndex; + std::size_t groupsCounts; + }; + + struct AssertionStats { + AssertionStats( AssertionResult const& _assertionResult, + std::vector<MessageInfo> const& _infoMessages, + Totals const& _totals ) + : assertionResult( _assertionResult ), + infoMessages( _infoMessages ), + totals( _totals ) + { + if( assertionResult.hasMessage() ) { + // Copy message into messages list. + // !TBD This should have been done earlier, somewhere + MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); + builder << assertionResult.getMessage(); + builder.m_info.message = builder.m_stream.str(); + + infoMessages.push_back( builder.m_info ); + } + } + virtual ~AssertionStats(); + +# ifdef CATCH_CPP11_OR_GREATER + AssertionStats( AssertionStats const& ) = default; + AssertionStats( AssertionStats && ) = default; + AssertionStats& operator = ( AssertionStats const& ) = default; + AssertionStats& operator = ( AssertionStats && ) = default; +# endif + + AssertionResult assertionResult; + std::vector<MessageInfo> infoMessages; + Totals totals; + }; + + struct SectionStats { + SectionStats( SectionInfo const& _sectionInfo, + Counts const& _assertions, + double _durationInSeconds, + bool _missingAssertions ) + : sectionInfo( _sectionInfo ), + assertions( _assertions ), + durationInSeconds( _durationInSeconds ), + missingAssertions( _missingAssertions ) + {} + virtual ~SectionStats(); +# ifdef CATCH_CPP11_OR_GREATER + SectionStats( SectionStats const& ) = default; + SectionStats( SectionStats && ) = default; + SectionStats& operator = ( SectionStats const& ) = default; + SectionStats& operator = ( SectionStats && ) = default; +# endif + + SectionInfo sectionInfo; + Counts assertions; + double durationInSeconds; + bool missingAssertions; + }; + + struct TestCaseStats { + TestCaseStats( TestCaseInfo const& _testInfo, + Totals const& _totals, + std::string const& _stdOut, + std::string const& _stdErr, + bool _aborting ) + : testInfo( _testInfo ), + totals( _totals ), + stdOut( _stdOut ), + stdErr( _stdErr ), + aborting( _aborting ) + {} + virtual ~TestCaseStats(); + +# ifdef CATCH_CPP11_OR_GREATER + TestCaseStats( TestCaseStats const& ) = default; + TestCaseStats( TestCaseStats && ) = default; + TestCaseStats& operator = ( TestCaseStats const& ) = default; + TestCaseStats& operator = ( TestCaseStats && ) = default; +# endif + + TestCaseInfo testInfo; + Totals totals; + std::string stdOut; + std::string stdErr; + bool aborting; + }; + + struct TestGroupStats { + TestGroupStats( GroupInfo const& _groupInfo, + Totals const& _totals, + bool _aborting ) + : groupInfo( _groupInfo ), + totals( _totals ), + aborting( _aborting ) + {} + TestGroupStats( GroupInfo const& _groupInfo ) + : groupInfo( _groupInfo ), + aborting( false ) + {} + virtual ~TestGroupStats(); + +# ifdef CATCH_CPP11_OR_GREATER + TestGroupStats( TestGroupStats const& ) = default; + TestGroupStats( TestGroupStats && ) = default; + TestGroupStats& operator = ( TestGroupStats const& ) = default; + TestGroupStats& operator = ( TestGroupStats && ) = default; +# endif + + GroupInfo groupInfo; + Totals totals; + bool aborting; + }; + + struct TestRunStats { + TestRunStats( TestRunInfo const& _runInfo, + Totals const& _totals, + bool _aborting ) + : runInfo( _runInfo ), + totals( _totals ), + aborting( _aborting ) + {} + virtual ~TestRunStats(); + +# ifndef CATCH_CPP11_OR_GREATER + TestRunStats( TestRunStats const& _other ) + : runInfo( _other.runInfo ), + totals( _other.totals ), + aborting( _other.aborting ) + {} +# else + TestRunStats( TestRunStats const& ) = default; + TestRunStats( TestRunStats && ) = default; + TestRunStats& operator = ( TestRunStats const& ) = default; + TestRunStats& operator = ( TestRunStats && ) = default; +# endif + + TestRunInfo runInfo; + Totals totals; + bool aborting; + }; + + struct IStreamingReporter : IShared { + virtual ~IStreamingReporter(); + + // Implementing class must also provide the following static method: + // static std::string getDescription(); + + virtual ReporterPreferences getPreferences() const = 0; + + virtual void noMatchingTestCases( std::string const& spec ) = 0; + + virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; + virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; + + virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; + virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; + + virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; + + virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; + virtual void sectionEnded( SectionStats const& sectionStats ) = 0; + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; + virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; + }; + + struct IReporterFactory { + virtual ~IReporterFactory(); + virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; + virtual std::string getDescription() const = 0; + }; + + struct IReporterRegistry { + typedef std::map<std::string, IReporterFactory*> FactoryMap; + + virtual ~IReporterRegistry(); + virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig> const& config ) const = 0; + virtual FactoryMap const& getFactories() const = 0; + }; + +} + +#include <limits> +#include <algorithm> + +namespace Catch { + + inline std::size_t listTests( Config const& config ) { + + TestSpec testSpec = config.testSpec(); + if( config.testSpec().hasFilters() ) + std::cout << "Matching test cases:\n"; + else { + std::cout << "All available test cases:\n"; + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); + } + + std::size_t matchedTests = 0; + TextAttributes nameAttr, tagsAttr; + nameAttr.setInitialIndent( 2 ).setIndent( 4 ); + tagsAttr.setIndent( 6 ); + + std::vector<TestCase> matchedTestCases; + getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); + for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); + it != itEnd; + ++it ) { + matchedTests++; + TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); + Colour::Code colour = testCaseInfo.isHidden() + ? Colour::SecondaryText + : Colour::None; + Colour colourGuard( colour ); + + std::cout << Text( testCaseInfo.name, nameAttr ) << std::endl; + if( !testCaseInfo.tags.empty() ) + std::cout << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; + } + + if( !config.testSpec().hasFilters() ) + std::cout << pluralise( matchedTests, "test case" ) << "\n" << std::endl; + else + std::cout << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl; + return matchedTests; + } + + inline std::size_t listTestsNamesOnly( Config const& config ) { + TestSpec testSpec = config.testSpec(); + if( !config.testSpec().hasFilters() ) + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); + std::size_t matchedTests = 0; + std::vector<TestCase> matchedTestCases; + getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); + for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); + it != itEnd; + ++it ) { + matchedTests++; + TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); + std::cout << testCaseInfo.name << std::endl; + } + return matchedTests; + } + + struct TagInfo { + TagInfo() : count ( 0 ) {} + void add( std::string const& spelling ) { + ++count; + spellings.insert( spelling ); + } + std::string all() const { + std::string out; + for( std::set<std::string>::const_iterator it = spellings.begin(), itEnd = spellings.end(); + it != itEnd; + ++it ) + out += "[" + *it + "]"; + return out; + } + std::set<std::string> spellings; + std::size_t count; + }; + + inline std::size_t listTags( Config const& config ) { + TestSpec testSpec = config.testSpec(); + if( config.testSpec().hasFilters() ) + std::cout << "Tags for matching test cases:\n"; + else { + std::cout << "All available tags:\n"; + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); + } + + std::map<std::string, TagInfo> tagCounts; + + std::vector<TestCase> matchedTestCases; + getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); + for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); + it != itEnd; + ++it ) { + for( std::set<std::string>::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), + tagItEnd = it->getTestCaseInfo().tags.end(); + tagIt != tagItEnd; + ++tagIt ) { + std::string tagName = *tagIt; + std::string lcaseTagName = toLower( tagName ); + std::map<std::string, TagInfo>::iterator countIt = tagCounts.find( lcaseTagName ); + if( countIt == tagCounts.end() ) + countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; + countIt->second.add( tagName ); + } + } + + for( std::map<std::string, TagInfo>::const_iterator countIt = tagCounts.begin(), + countItEnd = tagCounts.end(); + countIt != countItEnd; + ++countIt ) { + std::ostringstream oss; + oss << " " << std::setw(2) << countIt->second.count << " "; + Text wrapper( countIt->second.all(), TextAttributes() + .setInitialIndent( 0 ) + .setIndent( oss.str().size() ) + .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); + std::cout << oss.str() << wrapper << "\n"; + } + std::cout << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl; + return tagCounts.size(); + } + + inline std::size_t listReporters( Config const& /*config*/ ) { + std::cout << "Available reports:\n"; + IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); + IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; + std::size_t maxNameLen = 0; + for(it = itBegin; it != itEnd; ++it ) + maxNameLen = (std::max)( maxNameLen, it->first.size() ); + + for(it = itBegin; it != itEnd; ++it ) { + Text wrapper( it->second->getDescription(), TextAttributes() + .setInitialIndent( 0 ) + .setIndent( 7+maxNameLen ) + .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); + std::cout << " " + << it->first + << ":" + << std::string( maxNameLen - it->first.size() + 2, ' ' ) + << wrapper << "\n"; + } + std::cout << std::endl; + return factories.size(); + } + + inline Option<std::size_t> list( Config const& config ) { + Option<std::size_t> listedCount; + if( config.listTests() ) + listedCount = listedCount.valueOr(0) + listTests( config ); + if( config.listTestNamesOnly() ) + listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); + if( config.listTags() ) + listedCount = listedCount.valueOr(0) + listTags( config ); + if( config.listReporters() ) + listedCount = listedCount.valueOr(0) + listReporters( config ); + return listedCount; + } + +} // end namespace Catch + +// #included from: internal/catch_runner_impl.hpp +#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED + +// #included from: catch_test_case_tracker.hpp +#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED + +#include <map> +#include <string> +#include <assert.h> + +namespace Catch { +namespace SectionTracking { + + class TrackedSection { + + typedef std::map<std::string, TrackedSection> TrackedSections; + + public: + enum RunState { + NotStarted, + Executing, + ExecutingChildren, + Completed + }; + + TrackedSection( std::string const& name, TrackedSection* parent ) + : m_name( name ), m_runState( NotStarted ), m_parent( parent ) + {} + + RunState runState() const { return m_runState; } + + TrackedSection* findChild( std::string const& childName ) { + TrackedSections::iterator it = m_children.find( childName ); + return it != m_children.end() + ? &it->second + : NULL; + } + TrackedSection* acquireChild( std::string const& childName ) { + if( TrackedSection* child = findChild( childName ) ) + return child; + m_children.insert( std::make_pair( childName, TrackedSection( childName, this ) ) ); + return findChild( childName ); + } + void enter() { + if( m_runState == NotStarted ) + m_runState = Executing; + } + void leave() { + for( TrackedSections::const_iterator it = m_children.begin(), itEnd = m_children.end(); + it != itEnd; + ++it ) + if( it->second.runState() != Completed ) { + m_runState = ExecutingChildren; + return; + } + m_runState = Completed; + } + TrackedSection* getParent() { + return m_parent; + } + bool hasChildren() const { + return !m_children.empty(); + } + + private: + std::string m_name; + RunState m_runState; + TrackedSections m_children; + TrackedSection* m_parent; + + }; + + class TestCaseTracker { + public: + TestCaseTracker( std::string const& testCaseName ) + : m_testCase( testCaseName, NULL ), + m_currentSection( &m_testCase ), + m_completedASectionThisRun( false ) + {} + + bool enterSection( std::string const& name ) { + TrackedSection* child = m_currentSection->acquireChild( name ); + if( m_completedASectionThisRun || child->runState() == TrackedSection::Completed ) + return false; + + m_currentSection = child; + m_currentSection->enter(); + return true; + } + void leaveSection() { + m_currentSection->leave(); + m_currentSection = m_currentSection->getParent(); + assert( m_currentSection != NULL ); + m_completedASectionThisRun = true; + } + + bool currentSectionHasChildren() const { + return m_currentSection->hasChildren(); + } + bool isCompleted() const { + return m_testCase.runState() == TrackedSection::Completed; + } + + class Guard { + public: + Guard( TestCaseTracker& tracker ) : m_tracker( tracker ) { + m_tracker.enterTestCase(); + } + ~Guard() { + m_tracker.leaveTestCase(); + } + private: + Guard( Guard const& ); + void operator = ( Guard const& ); + TestCaseTracker& m_tracker; + }; + + private: + void enterTestCase() { + m_currentSection = &m_testCase; + m_completedASectionThisRun = false; + m_testCase.enter(); + } + void leaveTestCase() { + m_testCase.leave(); + } + + TrackedSection m_testCase; + TrackedSection* m_currentSection; + bool m_completedASectionThisRun; + }; + +} // namespace SectionTracking + +using SectionTracking::TestCaseTracker; + +} // namespace Catch + +#include <set> +#include <string> + +namespace Catch { + + class StreamRedirect { + + public: + StreamRedirect( std::ostream& stream, std::string& targetString ) + : m_stream( stream ), + m_prevBuf( stream.rdbuf() ), + m_targetString( targetString ) + { + stream.rdbuf( m_oss.rdbuf() ); + } + + ~StreamRedirect() { + m_targetString += m_oss.str(); + m_stream.rdbuf( m_prevBuf ); + } + + private: + std::ostream& m_stream; + std::streambuf* m_prevBuf; + std::ostringstream m_oss; + std::string& m_targetString; + }; + + /////////////////////////////////////////////////////////////////////////// + + class RunContext : public IResultCapture, public IRunner { + + RunContext( RunContext const& ); + void operator =( RunContext const& ); + + public: + + explicit RunContext( Ptr<IConfig const> const& config, Ptr<IStreamingReporter> const& reporter ) + : m_runInfo( config->name() ), + m_context( getCurrentMutableContext() ), + m_activeTestCase( NULL ), + m_config( config ), + m_reporter( reporter ), + m_prevRunner( m_context.getRunner() ), + m_prevResultCapture( m_context.getResultCapture() ), + m_prevConfig( m_context.getConfig() ) + { + m_context.setRunner( this ); + m_context.setConfig( m_config ); + m_context.setResultCapture( this ); + m_reporter->testRunStarting( m_runInfo ); + } + + virtual ~RunContext() { + m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); + m_context.setRunner( m_prevRunner ); + m_context.setConfig( NULL ); + m_context.setResultCapture( m_prevResultCapture ); + m_context.setConfig( m_prevConfig ); + } + + void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { + m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); + } + void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { + m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); + } + + Totals runTest( TestCase const& testCase ) { + Totals prevTotals = m_totals; + + std::string redirectedCout; + std::string redirectedCerr; + + TestCaseInfo testInfo = testCase.getTestCaseInfo(); + + m_reporter->testCaseStarting( testInfo ); + + m_activeTestCase = &testCase; + m_testCaseTracker = TestCaseTracker( testInfo.name ); + + do { + do { + runCurrentTest( redirectedCout, redirectedCerr ); + } + while( !m_testCaseTracker->isCompleted() && !aborting() ); + } + while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); + + Totals deltaTotals = m_totals.delta( prevTotals ); + m_totals.testCases += deltaTotals.testCases; + m_reporter->testCaseEnded( TestCaseStats( testInfo, + deltaTotals, + redirectedCout, + redirectedCerr, + aborting() ) ); + + m_activeTestCase = NULL; + m_testCaseTracker.reset(); + + return deltaTotals; + } + + Ptr<IConfig const> config() const { + return m_config; + } + + private: // IResultCapture + + virtual void assertionEnded( AssertionResult const& result ) { + if( result.getResultType() == ResultWas::Ok ) { + m_totals.assertions.passed++; + } + else if( !result.isOk() ) { + m_totals.assertions.failed++; + } + + if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) ) + m_messages.clear(); + + // Reset working state + m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); + m_lastResult = result; + } + + virtual bool sectionStarted ( + SectionInfo const& sectionInfo, + Counts& assertions + ) + { + std::ostringstream oss; + oss << sectionInfo.name << "@" << sectionInfo.lineInfo; + + if( !m_testCaseTracker->enterSection( oss.str() ) ) + return false; + + m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; + + m_reporter->sectionStarting( sectionInfo ); + + assertions = m_totals.assertions; + + return true; + } + bool testForMissingAssertions( Counts& assertions ) { + if( assertions.total() != 0 || + !m_config->warnAboutMissingAssertions() || + m_testCaseTracker->currentSectionHasChildren() ) + return false; + m_totals.assertions.failed++; + assertions.failed++; + return true; + } + + virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions, double _durationInSeconds ) { + if( std::uncaught_exception() ) { + m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions, _durationInSeconds ) ); + return; + } + + Counts assertions = m_totals.assertions - prevAssertions; + bool missingAssertions = testForMissingAssertions( assertions ); + + m_testCaseTracker->leaveSection(); + + m_reporter->sectionEnded( SectionStats( info, assertions, _durationInSeconds, missingAssertions ) ); + m_messages.clear(); + } + + virtual void pushScopedMessage( MessageInfo const& message ) { + m_messages.push_back( message ); + } + + virtual void popScopedMessage( MessageInfo const& message ) { + m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); + } + + virtual std::string getCurrentTestName() const { + return m_activeTestCase + ? m_activeTestCase->getTestCaseInfo().name + : ""; + } + + virtual const AssertionResult* getLastResult() const { + return &m_lastResult; + } + + public: + // !TBD We need to do this another way! + bool aborting() const { + return m_totals.assertions.failed == static_cast<std::size_t>( m_config->abortAfter() ); + } + + private: + + void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { + TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); + SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); + m_reporter->sectionStarting( testCaseSection ); + Counts prevAssertions = m_totals.assertions; + double duration = 0; + try { + m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); + TestCaseTracker::Guard guard( *m_testCaseTracker ); + + Timer timer; + timer.start(); + if( m_reporter->getPreferences().shouldRedirectStdOut ) { + StreamRedirect coutRedir( std::cout, redirectedCout ); + StreamRedirect cerrRedir( std::cerr, redirectedCerr ); + m_activeTestCase->invoke(); + } + else { + m_activeTestCase->invoke(); + } + duration = timer.getElapsedSeconds(); + } + catch( TestFailureException& ) { + // This just means the test was aborted due to failure + } + catch(...) { + ResultBuilder exResult( m_lastAssertionInfo.macroName.c_str(), + m_lastAssertionInfo.lineInfo, + m_lastAssertionInfo.capturedExpression.c_str(), + m_lastAssertionInfo.resultDisposition ); + exResult.useActiveException(); + } + // If sections ended prematurely due to an exception we stored their + // infos here so we can tear them down outside the unwind process. + for( std::vector<UnfinishedSections>::const_reverse_iterator it = m_unfinishedSections.rbegin(), + itEnd = m_unfinishedSections.rend(); + it != itEnd; + ++it ) + sectionEnded( it->info, it->prevAssertions, it->durationInSeconds ); + m_unfinishedSections.clear(); + m_messages.clear(); + + Counts assertions = m_totals.assertions - prevAssertions; + bool missingAssertions = testForMissingAssertions( assertions ); + + if( testCaseInfo.okToFail() ) { + std::swap( assertions.failedButOk, assertions.failed ); + m_totals.assertions.failed -= assertions.failedButOk; + m_totals.assertions.failedButOk += assertions.failedButOk; + } + + SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); + m_reporter->sectionEnded( testCaseSectionStats ); + } + + private: + struct UnfinishedSections { + UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions, double _durationInSeconds ) + : info( _info ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) + {} + + SectionInfo info; + Counts prevAssertions; + double durationInSeconds; + }; + + TestRunInfo m_runInfo; + IMutableContext& m_context; + TestCase const* m_activeTestCase; + Option<TestCaseTracker> m_testCaseTracker; + AssertionResult m_lastResult; + + Ptr<IConfig const> m_config; + Totals m_totals; + Ptr<IStreamingReporter> m_reporter; + std::vector<MessageInfo> m_messages; + IRunner* m_prevRunner; + IResultCapture* m_prevResultCapture; + Ptr<IConfig const> m_prevConfig; + AssertionInfo m_lastAssertionInfo; + std::vector<UnfinishedSections> m_unfinishedSections; + }; + + IResultCapture& getResultCapture() { + if( IResultCapture* capture = getCurrentContext().getResultCapture() ) + return *capture; + else + throw std::logic_error( "No result capture instance" ); + } + +} // end namespace Catch + +// #included from: internal/catch_version.h +#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED + +namespace Catch { + + // Versioning information + struct Version { + Version( unsigned int _majorVersion, + unsigned int _minorVersion, + unsigned int _buildNumber, + char const* const _branchName ) + : majorVersion( _majorVersion ), + minorVersion( _minorVersion ), + buildNumber( _buildNumber ), + branchName( _branchName ) + {} + + unsigned int const majorVersion; + unsigned int const minorVersion; + unsigned int const buildNumber; + char const* const branchName; + + private: + void operator=( Version const& ); + }; + + extern Version libraryVersion; +} + +#include <fstream> +#include <stdlib.h> +#include <limits> + +namespace Catch { + + class Runner { + + public: + Runner( Ptr<Config> const& config ) + : m_config( config ) + { + openStream(); + makeReporter(); + } + + Totals runTests() { + + RunContext context( m_config.get(), m_reporter ); + + Totals totals; + + context.testGroupStarting( "", 1, 1 ); // deprecated? + + TestSpec testSpec = m_config->testSpec(); + if( !testSpec.hasFilters() ) + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests + + std::vector<TestCase> testCases; + getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, *m_config, testCases ); + + int testsRunForGroup = 0; + for( std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end(); + it != itEnd; + ++it ) { + testsRunForGroup++; + if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) { + + if( context.aborting() ) + break; + + totals += context.runTest( *it ); + m_testsAlreadyRun.insert( *it ); + } + } + context.testGroupEnded( "", totals, 1, 1 ); + return totals; + } + + private: + void openStream() { + // Open output file, if specified + if( !m_config->getFilename().empty() ) { + m_ofs.open( m_config->getFilename().c_str() ); + if( m_ofs.fail() ) { + std::ostringstream oss; + oss << "Unable to open file: '" << m_config->getFilename() << "'"; + throw std::domain_error( oss.str() ); + } + m_config->setStreamBuf( m_ofs.rdbuf() ); + } + } + void makeReporter() { + std::string reporterName = m_config->getReporterName().empty() + ? "console" + : m_config->getReporterName(); + + m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, m_config.get() ); + if( !m_reporter ) { + std::ostringstream oss; + oss << "No reporter registered with name: '" << reporterName << "'"; + throw std::domain_error( oss.str() ); + } + } + + private: + Ptr<Config> m_config; + std::ofstream m_ofs; + Ptr<IStreamingReporter> m_reporter; + std::set<TestCase> m_testsAlreadyRun; + }; + + class Session { + static bool alreadyInstantiated; + + public: + + struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; + + Session() + : m_cli( makeCommandLineParser() ) { + if( alreadyInstantiated ) { + std::string msg = "Only one instance of Catch::Session can ever be used"; + std::cerr << msg << std::endl; + throw std::logic_error( msg ); + } + alreadyInstantiated = true; + } + ~Session() { + Catch::cleanUp(); + } + + void showHelp( std::string const& processName ) { + std::cout << "\nCatch v" << libraryVersion.majorVersion << "." + << libraryVersion.minorVersion << " build " + << libraryVersion.buildNumber; + if( libraryVersion.branchName != std::string( "master" ) ) + std::cout << " (" << libraryVersion.branchName << " branch)"; + std::cout << "\n"; + + m_cli.usage( std::cout, processName ); + std::cout << "For more detail usage please see the project docs\n" << std::endl; + } + + int applyCommandLine( int argc, char* const argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { + try { + m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); + m_unusedTokens = m_cli.parseInto( argc, argv, m_configData ); + if( m_configData.showHelp ) + showHelp( m_configData.processName ); + m_config.reset(); + } + catch( std::exception& ex ) { + { + Colour colourGuard( Colour::Red ); + std::cerr << "\nError(s) in input:\n" + << Text( ex.what(), TextAttributes().setIndent(2) ) + << "\n\n"; + } + m_cli.usage( std::cout, m_configData.processName ); + return (std::numeric_limits<int>::max)(); + } + return 0; + } + + void useConfigData( ConfigData const& _configData ) { + m_configData = _configData; + m_config.reset(); + } + + int run( int argc, char* const argv[] ) { + + int returnCode = applyCommandLine( argc, argv ); + if( returnCode == 0 ) + returnCode = run(); + return returnCode; + } + + int run() { + if( m_configData.showHelp ) + return 0; + + try + { + config(); // Force config to be constructed + Runner runner( m_config ); + + // Handle list request + if( Option<std::size_t> listed = list( config() ) ) + return static_cast<int>( *listed ); + + return static_cast<int>( runner.runTests().assertions.failed ); + } + catch( std::exception& ex ) { + std::cerr << ex.what() << std::endl; + return (std::numeric_limits<int>::max)(); + } + } + + Clara::CommandLine<ConfigData> const& cli() const { + return m_cli; + } + std::vector<Clara::Parser::Token> const& unusedTokens() const { + return m_unusedTokens; + } + ConfigData& configData() { + return m_configData; + } + Config& config() { + if( !m_config ) + m_config = new Config( m_configData ); + return *m_config; + } + + private: + Clara::CommandLine<ConfigData> m_cli; + std::vector<Clara::Parser::Token> m_unusedTokens; + ConfigData m_configData; + Ptr<Config> m_config; + }; + + bool Session::alreadyInstantiated = false; + +} // end namespace Catch + +// #included from: catch_registry_hub.hpp +#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED + +// #included from: catch_test_case_registry_impl.hpp +#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED + +#include <vector> +#include <set> +#include <sstream> +#include <iostream> + +namespace Catch { + + class TestRegistry : public ITestCaseRegistry { + public: + TestRegistry() : m_unnamedCount( 0 ) {} + virtual ~TestRegistry(); + + virtual void registerTest( TestCase const& testCase ) { + std::string name = testCase.getTestCaseInfo().name; + if( name == "" ) { + std::ostringstream oss; + oss << "Anonymous test case " << ++m_unnamedCount; + return registerTest( testCase.withName( oss.str() ) ); + } + + if( m_functions.find( testCase ) == m_functions.end() ) { + m_functions.insert( testCase ); + m_functionsInOrder.push_back( testCase ); + if( !testCase.isHidden() ) + m_nonHiddenFunctions.push_back( testCase ); + } + else { + TestCase const& prev = *m_functions.find( testCase ); + { + Colour colourGuard( Colour::Red ); + std::cerr << "error: TEST_CASE( \"" << name << "\" ) already defined.\n" + << "\tFirst seen at " << prev.getTestCaseInfo().lineInfo << "\n" + << "\tRedefined at " << testCase.getTestCaseInfo().lineInfo << std::endl; + } + exit(1); + } + } + + virtual std::vector<TestCase> const& getAllTests() const { + return m_functionsInOrder; + } + + virtual std::vector<TestCase> const& getAllNonHiddenTests() const { + return m_nonHiddenFunctions; + } + + virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector<TestCase>& matchingTestCases ) const { + for( std::vector<TestCase>::const_iterator it = m_functionsInOrder.begin(), + itEnd = m_functionsInOrder.end(); + it != itEnd; + ++it ) { + if( testSpec.matches( *it ) && ( config.allowThrows() || !it->throws() ) ) + matchingTestCases.push_back( *it ); + } + } + + private: + + std::set<TestCase> m_functions; + std::vector<TestCase> m_functionsInOrder; + std::vector<TestCase> m_nonHiddenFunctions; + size_t m_unnamedCount; + }; + + /////////////////////////////////////////////////////////////////////////// + + class FreeFunctionTestCase : public SharedImpl<ITestCase> { + public: + + FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} + + virtual void invoke() const { + m_fun(); + } + + private: + virtual ~FreeFunctionTestCase(); + + TestFunction m_fun; + }; + + inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { + std::string className = classOrQualifiedMethodName; + if( startsWith( className, "&" ) ) + { + std::size_t lastColons = className.rfind( "::" ); + std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); + if( penultimateColons == std::string::npos ) + penultimateColons = 1; + className = className.substr( penultimateColons, lastColons-penultimateColons ); + } + return className; + } + + /////////////////////////////////////////////////////////////////////////// + + AutoReg::AutoReg( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ) { + registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); + } + + AutoReg::~AutoReg() {} + + void AutoReg::registerTestCase( ITestCase* testCase, + char const* classOrQualifiedMethodName, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ) { + + getMutableRegistryHub().registerTest + ( makeTestCase( testCase, + extractClassName( classOrQualifiedMethodName ), + nameAndDesc.name, + nameAndDesc.description, + lineInfo ) ); + } + +} // end namespace Catch + +// #included from: catch_reporter_registry.hpp +#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED + +#include <map> + +namespace Catch { + + class ReporterRegistry : public IReporterRegistry { + + public: + + virtual ~ReporterRegistry() { + deleteAllValues( m_factories ); + } + + virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig> const& config ) const { + FactoryMap::const_iterator it = m_factories.find( name ); + if( it == m_factories.end() ) + return NULL; + return it->second->create( ReporterConfig( config ) ); + } + + void registerReporter( std::string const& name, IReporterFactory* factory ) { + m_factories.insert( std::make_pair( name, factory ) ); + } + + FactoryMap const& getFactories() const { + return m_factories; + } + + private: + FactoryMap m_factories; + }; +} + +// #included from: catch_exception_translator_registry.hpp +#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED + +#ifdef __OBJC__ +#import "Foundation/Foundation.h" +#endif + +namespace Catch { + + class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { + public: + ~ExceptionTranslatorRegistry() { + deleteAll( m_translators ); + } + + virtual void registerTranslator( const IExceptionTranslator* translator ) { + m_translators.push_back( translator ); + } + + virtual std::string translateActiveException() const { + try { +#ifdef __OBJC__ + // In Objective-C try objective-c exceptions first + @try { + throw; + } + @catch (NSException *exception) { + return toString( [exception description] ); + } +#else + throw; +#endif + } + catch( TestFailureException& ) { + throw; + } + catch( std::exception& ex ) { + return ex.what(); + } + catch( std::string& msg ) { + return msg; + } + catch( const char* msg ) { + return msg; + } + catch(...) { + return tryTranslators( m_translators.begin() ); + } + } + + std::string tryTranslators( std::vector<const IExceptionTranslator*>::const_iterator it ) const { + if( it == m_translators.end() ) + return "Unknown exception"; + + try { + return (*it)->translate(); + } + catch(...) { + return tryTranslators( it+1 ); + } + } + + private: + std::vector<const IExceptionTranslator*> m_translators; + }; +} + +namespace Catch { + + namespace { + + class RegistryHub : public IRegistryHub, public IMutableRegistryHub { + + RegistryHub( RegistryHub const& ); + void operator=( RegistryHub const& ); + + public: // IRegistryHub + RegistryHub() { + } + virtual IReporterRegistry const& getReporterRegistry() const { + return m_reporterRegistry; + } + virtual ITestCaseRegistry const& getTestCaseRegistry() const { + return m_testCaseRegistry; + } + virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() { + return m_exceptionTranslatorRegistry; + } + + public: // IMutableRegistryHub + virtual void registerReporter( std::string const& name, IReporterFactory* factory ) { + m_reporterRegistry.registerReporter( name, factory ); + } + virtual void registerTest( TestCase const& testInfo ) { + m_testCaseRegistry.registerTest( testInfo ); + } + virtual void registerTranslator( const IExceptionTranslator* translator ) { + m_exceptionTranslatorRegistry.registerTranslator( translator ); + } + + private: + TestRegistry m_testCaseRegistry; + ReporterRegistry m_reporterRegistry; + ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; + }; + + // Single, global, instance + inline RegistryHub*& getTheRegistryHub() { + static RegistryHub* theRegistryHub = NULL; + if( !theRegistryHub ) + theRegistryHub = new RegistryHub(); + return theRegistryHub; + } + } + + IRegistryHub& getRegistryHub() { + return *getTheRegistryHub(); + } + IMutableRegistryHub& getMutableRegistryHub() { + return *getTheRegistryHub(); + } + void cleanUp() { + delete getTheRegistryHub(); + getTheRegistryHub() = NULL; + cleanUpContext(); + } + std::string translateActiveException() { + return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); + } + +} // end namespace Catch + +// #included from: catch_notimplemented_exception.hpp +#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED + +#include <ostream> + +namespace Catch { + + NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) + : m_lineInfo( lineInfo ) { + std::ostringstream oss; + oss << lineInfo << ": function "; + oss << "not implemented"; + m_what = oss.str(); + } + + const char* NotImplementedException::what() const CATCH_NOEXCEPT { + return m_what.c_str(); + } + +} // end namespace Catch + +// #included from: catch_context_impl.hpp +#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED + +// #included from: catch_stream.hpp +#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED + +// #included from: catch_streambuf.h +#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED + +#include <streambuf> + +namespace Catch { + + class StreamBufBase : public std::streambuf { + public: + virtual ~StreamBufBase() CATCH_NOEXCEPT; + }; +} + +#include <stdexcept> +#include <cstdio> + +namespace Catch { + + template<typename WriterF, size_t bufferSize=256> + class StreamBufImpl : public StreamBufBase { + char data[bufferSize]; + WriterF m_writer; + + public: + StreamBufImpl() { + setp( data, data + sizeof(data) ); + } + + ~StreamBufImpl() CATCH_NOEXCEPT { + sync(); + } + + private: + int overflow( int c ) { + sync(); + + if( c != EOF ) { + if( pbase() == epptr() ) + m_writer( std::string( 1, static_cast<char>( c ) ) ); + else + sputc( static_cast<char>( c ) ); + } + return 0; + } + + int sync() { + if( pbase() != pptr() ) { + m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) ); + setp( pbase(), epptr() ); + } + return 0; + } + }; + + /////////////////////////////////////////////////////////////////////////// + + struct OutputDebugWriter { + + void operator()( std::string const&str ) { + writeToDebugConsole( str ); + } + }; + + Stream::Stream() + : streamBuf( NULL ), isOwned( false ) + {} + + Stream::Stream( std::streambuf* _streamBuf, bool _isOwned ) + : streamBuf( _streamBuf ), isOwned( _isOwned ) + {} + + void Stream::release() { + if( isOwned ) { + delete streamBuf; + streamBuf = NULL; + isOwned = false; + } + } +} + +namespace Catch { + + class Context : public IMutableContext { + + Context() : m_config( NULL ), m_runner( NULL ), m_resultCapture( NULL ) {} + Context( Context const& ); + void operator=( Context const& ); + + public: // IContext + virtual IResultCapture* getResultCapture() { + return m_resultCapture; + } + virtual IRunner* getRunner() { + return m_runner; + } + virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { + return getGeneratorsForCurrentTest() + .getGeneratorInfo( fileInfo, totalSize ) + .getCurrentIndex(); + } + virtual bool advanceGeneratorsForCurrentTest() { + IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); + return generators && generators->moveNext(); + } + + virtual Ptr<IConfig const> getConfig() const { + return m_config; + } + + public: // IMutableContext + virtual void setResultCapture( IResultCapture* resultCapture ) { + m_resultCapture = resultCapture; + } + virtual void setRunner( IRunner* runner ) { + m_runner = runner; + } + virtual void setConfig( Ptr<IConfig const> const& config ) { + m_config = config; + } + + friend IMutableContext& getCurrentMutableContext(); + + private: + IGeneratorsForTest* findGeneratorsForCurrentTest() { + std::string testName = getResultCapture()->getCurrentTestName(); + + std::map<std::string, IGeneratorsForTest*>::const_iterator it = + m_generatorsByTestName.find( testName ); + return it != m_generatorsByTestName.end() + ? it->second + : NULL; + } + + IGeneratorsForTest& getGeneratorsForCurrentTest() { + IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); + if( !generators ) { + std::string testName = getResultCapture()->getCurrentTestName(); + generators = createGeneratorsForTest(); + m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); + } + return *generators; + } + + private: + Ptr<IConfig const> m_config; + IRunner* m_runner; + IResultCapture* m_resultCapture; + std::map<std::string, IGeneratorsForTest*> m_generatorsByTestName; + }; + + namespace { + Context* currentContext = NULL; + } + IMutableContext& getCurrentMutableContext() { + if( !currentContext ) + currentContext = new Context(); + return *currentContext; + } + IContext& getCurrentContext() { + return getCurrentMutableContext(); + } + + Stream createStream( std::string const& streamName ) { + if( streamName == "stdout" ) return Stream( std::cout.rdbuf(), false ); + if( streamName == "stderr" ) return Stream( std::cerr.rdbuf(), false ); + if( streamName == "debug" ) return Stream( new StreamBufImpl<OutputDebugWriter>, true ); + + throw std::domain_error( "Unknown stream: " + streamName ); + } + + void cleanUpContext() { + delete currentContext; + currentContext = NULL; + } +} + +// #included from: catch_console_colour_impl.hpp +#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED + +namespace Catch { namespace Detail { + struct IColourImpl { + virtual ~IColourImpl() {} + virtual void use( Colour::Code _colourCode ) = 0; + }; +}} + +#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// + +#ifndef NOMINMAX +#define NOMINMAX +#endif + +#ifdef __AFXDLL +#include <AfxWin.h> +#else +#include <windows.h> +#endif + +namespace Catch { +namespace { + + class Win32ColourImpl : public Detail::IColourImpl { + public: + Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) + { + CONSOLE_SCREEN_BUFFER_INFO csbiInfo; + GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); + originalAttributes = csbiInfo.wAttributes; + } + + virtual void use( Colour::Code _colourCode ) { + switch( _colourCode ) { + case Colour::None: return setTextAttribute( originalAttributes ); + case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); + case Colour::Red: return setTextAttribute( FOREGROUND_RED ); + case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); + case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); + case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); + case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); + case Colour::Grey: return setTextAttribute( 0 ); + + case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); + case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); + case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); + case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); + + case Colour::Bright: throw std::logic_error( "not a colour" ); + } + } + + private: + void setTextAttribute( WORD _textAttribute ) { + SetConsoleTextAttribute( stdoutHandle, _textAttribute ); + } + HANDLE stdoutHandle; + WORD originalAttributes; + }; + + inline bool shouldUseColourForPlatform() { + return true; + } + + static Detail::IColourImpl* platformColourInstance() { + static Win32ColourImpl s_instance; + return &s_instance; + } + +} // end anon namespace +} // end namespace Catch + +#else // Not Windows - assumed to be POSIX compatible ////////////////////////// + +#include <unistd.h> + +namespace Catch { +namespace { + + // use POSIX/ ANSI console terminal codes + // Thanks to Adam Strzelecki for original contribution + // (http://github.com/nanoant) + // https://github.com/philsquared/Catch/pull/131 + class PosixColourImpl : public Detail::IColourImpl { + public: + virtual void use( Colour::Code _colourCode ) { + switch( _colourCode ) { + case Colour::None: + case Colour::White: return setColour( "[0m" ); + case Colour::Red: return setColour( "[0;31m" ); + case Colour::Green: return setColour( "[0;32m" ); + case Colour::Blue: return setColour( "[0:34m" ); + case Colour::Cyan: return setColour( "[0;36m" ); + case Colour::Yellow: return setColour( "[0;33m" ); + case Colour::Grey: return setColour( "[1;30m" ); + + case Colour::LightGrey: return setColour( "[0;37m" ); + case Colour::BrightRed: return setColour( "[1;31m" ); + case Colour::BrightGreen: return setColour( "[1;32m" ); + case Colour::BrightWhite: return setColour( "[1;37m" ); + + case Colour::Bright: throw std::logic_error( "not a colour" ); + } + } + private: + void setColour( const char* _escapeCode ) { + std::cout << '\033' << _escapeCode; + } + }; + + inline bool shouldUseColourForPlatform() { + return isatty(STDOUT_FILENO); + } + + static Detail::IColourImpl* platformColourInstance() { + static PosixColourImpl s_instance; + return &s_instance; + } + +} // end anon namespace +} // end namespace Catch + +#endif // not Windows + +namespace Catch { + + namespace { + struct NoColourImpl : Detail::IColourImpl { + void use( Colour::Code ) {} + + static IColourImpl* instance() { + static NoColourImpl s_instance; + return &s_instance; + } + }; + static bool shouldUseColour() { + return shouldUseColourForPlatform() && !isDebuggerActive(); + } + } + + Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } + Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast<Colour&>( _other ).m_moved = true; } + Colour::~Colour(){ if( !m_moved ) use( None ); } + void Colour::use( Code _colourCode ) { + impl()->use( _colourCode ); + } + + Detail::IColourImpl* Colour::impl() { + return shouldUseColour() + ? platformColourInstance() + : NoColourImpl::instance(); + } + +} // end namespace Catch + +// #included from: catch_generators_impl.hpp +#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED + +#include <vector> +#include <string> +#include <map> + +namespace Catch { + + struct GeneratorInfo : IGeneratorInfo { + + GeneratorInfo( std::size_t size ) + : m_size( size ), + m_currentIndex( 0 ) + {} + + bool moveNext() { + if( ++m_currentIndex == m_size ) { + m_currentIndex = 0; + return false; + } + return true; + } + + std::size_t getCurrentIndex() const { + return m_currentIndex; + } + + std::size_t m_size; + std::size_t m_currentIndex; + }; + + /////////////////////////////////////////////////////////////////////////// + + class GeneratorsForTest : public IGeneratorsForTest { + + public: + ~GeneratorsForTest() { + deleteAll( m_generatorsInOrder ); + } + + IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { + std::map<std::string, IGeneratorInfo*>::const_iterator it = m_generatorsByName.find( fileInfo ); + if( it == m_generatorsByName.end() ) { + IGeneratorInfo* info = new GeneratorInfo( size ); + m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); + m_generatorsInOrder.push_back( info ); + return *info; + } + return *it->second; + } + + bool moveNext() { + std::vector<IGeneratorInfo*>::const_iterator it = m_generatorsInOrder.begin(); + std::vector<IGeneratorInfo*>::const_iterator itEnd = m_generatorsInOrder.end(); + for(; it != itEnd; ++it ) { + if( (*it)->moveNext() ) + return true; + } + return false; + } + + private: + std::map<std::string, IGeneratorInfo*> m_generatorsByName; + std::vector<IGeneratorInfo*> m_generatorsInOrder; + }; + + IGeneratorsForTest* createGeneratorsForTest() + { + return new GeneratorsForTest(); + } + +} // end namespace Catch + +// #included from: catch_assertionresult.hpp +#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED + +namespace Catch { + + AssertionInfo::AssertionInfo( std::string const& _macroName, + SourceLineInfo const& _lineInfo, + std::string const& _capturedExpression, + ResultDisposition::Flags _resultDisposition ) + : macroName( _macroName ), + lineInfo( _lineInfo ), + capturedExpression( _capturedExpression ), + resultDisposition( _resultDisposition ) + {} + + AssertionResult::AssertionResult() {} + + AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) + : m_info( info ), + m_resultData( data ) + {} + + AssertionResult::~AssertionResult() {} + + // Result was a success + bool AssertionResult::succeeded() const { + return Catch::isOk( m_resultData.resultType ); + } + + // Result was a success, or failure is suppressed + bool AssertionResult::isOk() const { + return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); + } + + ResultWas::OfType AssertionResult::getResultType() const { + return m_resultData.resultType; + } + + bool AssertionResult::hasExpression() const { + return !m_info.capturedExpression.empty(); + } + + bool AssertionResult::hasMessage() const { + return !m_resultData.message.empty(); + } + + std::string AssertionResult::getExpression() const { + if( isFalseTest( m_info.resultDisposition ) ) + return "!" + m_info.capturedExpression; + else + return m_info.capturedExpression; + } + std::string AssertionResult::getExpressionInMacro() const { + if( m_info.macroName.empty() ) + return m_info.capturedExpression; + else + return m_info.macroName + "( " + m_info.capturedExpression + " )"; + } + + bool AssertionResult::hasExpandedExpression() const { + return hasExpression() && getExpandedExpression() != getExpression(); + } + + std::string AssertionResult::getExpandedExpression() const { + return m_resultData.reconstructedExpression; + } + + std::string AssertionResult::getMessage() const { + return m_resultData.message; + } + SourceLineInfo AssertionResult::getSourceInfo() const { + return m_info.lineInfo; + } + + std::string AssertionResult::getTestMacroName() const { + return m_info.macroName; + } + +} // end namespace Catch + +// #included from: catch_test_case_info.hpp +#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED + +namespace Catch { + + inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { + if( tag == "." || + tag == "hide" || + tag == "!hide" ) + return TestCaseInfo::IsHidden; + else if( tag == "!throws" ) + return TestCaseInfo::Throws; + else if( tag == "!shouldfail" ) + return TestCaseInfo::ShouldFail; + else if( tag == "!mayfail" ) + return TestCaseInfo::MayFail; + else + return TestCaseInfo::None; + } + inline bool isReservedTag( std::string const& tag ) { + return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !isalnum( tag[0] ); + } + inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { + if( isReservedTag( tag ) ) { + { + Colour colourGuard( Colour::Red ); + std::cerr + << "Tag name [" << tag << "] not allowed.\n" + << "Tag names starting with non alpha-numeric characters are reserved\n"; + } + { + Colour colourGuard( Colour::FileName ); + std::cerr << _lineInfo << std::endl; + } + exit(1); + } + } + + TestCase makeTestCase( ITestCase* _testCase, + std::string const& _className, + std::string const& _name, + std::string const& _descOrTags, + SourceLineInfo const& _lineInfo ) + { + bool isHidden( startsWith( _name, "./" ) ); // Legacy support + + // Parse out tags + std::set<std::string> tags; + std::string desc, tag; + bool inTag = false; + for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { + char c = _descOrTags[i]; + if( !inTag ) { + if( c == '[' ) + inTag = true; + else + desc += c; + } + else { + if( c == ']' ) { + enforceNotReservedTag( tag, _lineInfo ); + + inTag = false; + if( tag == "hide" || tag == "." ) + isHidden = true; + else + tags.insert( tag ); + tag.clear(); + } + else + tag += c; + } + } + if( isHidden ) { + tags.insert( "hide" ); + tags.insert( "." ); + } + + TestCaseInfo info( _name, _className, desc, tags, _lineInfo ); + return TestCase( _testCase, info ); + } + + TestCaseInfo::TestCaseInfo( std::string const& _name, + std::string const& _className, + std::string const& _description, + std::set<std::string> const& _tags, + SourceLineInfo const& _lineInfo ) + : name( _name ), + className( _className ), + description( _description ), + tags( _tags ), + lineInfo( _lineInfo ), + properties( None ) + { + std::ostringstream oss; + for( std::set<std::string>::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it ) { + oss << "[" << *it << "]"; + std::string lcaseTag = toLower( *it ); + properties = static_cast<SpecialProperties>( properties | parseSpecialTag( lcaseTag ) ); + lcaseTags.insert( lcaseTag ); + } + tagsAsString = oss.str(); + } + + TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) + : name( other.name ), + className( other.className ), + description( other.description ), + tags( other.tags ), + lcaseTags( other.lcaseTags ), + tagsAsString( other.tagsAsString ), + lineInfo( other.lineInfo ), + properties( other.properties ) + {} + + bool TestCaseInfo::isHidden() const { + return ( properties & IsHidden ) != 0; + } + bool TestCaseInfo::throws() const { + return ( properties & Throws ) != 0; + } + bool TestCaseInfo::okToFail() const { + return ( properties & (ShouldFail | MayFail ) ) != 0; + } + bool TestCaseInfo::expectedToFail() const { + return ( properties & (ShouldFail ) ) != 0; + } + + TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} + + TestCase::TestCase( TestCase const& other ) + : TestCaseInfo( other ), + test( other.test ) + {} + + TestCase TestCase::withName( std::string const& _newName ) const { + TestCase other( *this ); + other.name = _newName; + return other; + } + + void TestCase::swap( TestCase& other ) { + test.swap( other.test ); + name.swap( other.name ); + className.swap( other.className ); + description.swap( other.description ); + tags.swap( other.tags ); + lcaseTags.swap( other.lcaseTags ); + tagsAsString.swap( other.tagsAsString ); + std::swap( TestCaseInfo::properties, static_cast<TestCaseInfo&>( other ).properties ); + std::swap( lineInfo, other.lineInfo ); + } + + void TestCase::invoke() const { + test->invoke(); + } + + bool TestCase::operator == ( TestCase const& other ) const { + return test.get() == other.test.get() && + name == other.name && + className == other.className; + } + + bool TestCase::operator < ( TestCase const& other ) const { + return name < other.name; + } + TestCase& TestCase::operator = ( TestCase const& other ) { + TestCase temp( other ); + swap( temp ); + return *this; + } + + TestCaseInfo const& TestCase::getTestCaseInfo() const + { + return *this; + } + +} // end namespace Catch + +// #included from: catch_version.hpp +#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED + +namespace Catch { + + // These numbers are maintained by a script + Version libraryVersion( 1, 0, 53, "master" ); +} + +// #included from: catch_message.hpp +#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED + +namespace Catch { + + MessageInfo::MessageInfo( std::string const& _macroName, + SourceLineInfo const& _lineInfo, + ResultWas::OfType _type ) + : macroName( _macroName ), + lineInfo( _lineInfo ), + type( _type ), + sequence( ++globalCount ) + {} + + // This may need protecting if threading support is added + unsigned int MessageInfo::globalCount = 0; + + //////////////////////////////////////////////////////////////////////////// + + ScopedMessage::ScopedMessage( MessageBuilder const& builder ) + : m_info( builder.m_info ) + { + m_info.message = builder.m_stream.str(); + getResultCapture().pushScopedMessage( m_info ); + } + ScopedMessage::ScopedMessage( ScopedMessage const& other ) + : m_info( other.m_info ) + {} + + ScopedMessage::~ScopedMessage() { + getResultCapture().popScopedMessage( m_info ); + } + +} // end namespace Catch + +// #included from: catch_legacy_reporter_adapter.hpp +#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED + +// #included from: catch_legacy_reporter_adapter.h +#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED + +namespace Catch +{ + // Deprecated + struct IReporter : IShared { + virtual ~IReporter(); + + virtual bool shouldRedirectStdout() const = 0; + + virtual void StartTesting() = 0; + virtual void EndTesting( Totals const& totals ) = 0; + virtual void StartGroup( std::string const& groupName ) = 0; + virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; + virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; + virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; + virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; + virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; + virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; + virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; + virtual void Aborted() = 0; + virtual void Result( AssertionResult const& result ) = 0; + }; + + class LegacyReporterAdapter : public SharedImpl<IStreamingReporter> + { + public: + LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter ); + virtual ~LegacyReporterAdapter(); + + virtual ReporterPreferences getPreferences() const; + virtual void noMatchingTestCases( std::string const& ); + virtual void testRunStarting( TestRunInfo const& ); + virtual void testGroupStarting( GroupInfo const& groupInfo ); + virtual void testCaseStarting( TestCaseInfo const& testInfo ); + virtual void sectionStarting( SectionInfo const& sectionInfo ); + virtual void assertionStarting( AssertionInfo const& ); + virtual bool assertionEnded( AssertionStats const& assertionStats ); + virtual void sectionEnded( SectionStats const& sectionStats ); + virtual void testCaseEnded( TestCaseStats const& testCaseStats ); + virtual void testGroupEnded( TestGroupStats const& testGroupStats ); + virtual void testRunEnded( TestRunStats const& testRunStats ); + + private: + Ptr<IReporter> m_legacyReporter; + }; +} + +namespace Catch +{ + LegacyReporterAdapter::LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter ) + : m_legacyReporter( legacyReporter ) + {} + LegacyReporterAdapter::~LegacyReporterAdapter() {} + + ReporterPreferences LegacyReporterAdapter::getPreferences() const { + ReporterPreferences prefs; + prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); + return prefs; + } + + void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} + void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { + m_legacyReporter->StartTesting(); + } + void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { + m_legacyReporter->StartGroup( groupInfo.name ); + } + void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { + m_legacyReporter->StartTestCase( testInfo ); + } + void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { + m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); + } + void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { + // Not on legacy interface + } + + bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { + if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { + for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); + it != itEnd; + ++it ) { + if( it->type == ResultWas::Info ) { + ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal ); + rb << it->message; + rb.setResultType( ResultWas::Info ); + AssertionResult result = rb.build(); + m_legacyReporter->Result( result ); + } + } + } + m_legacyReporter->Result( assertionStats.assertionResult ); + return true; + } + void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { + if( sectionStats.missingAssertions ) + m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); + m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); + } + void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { + m_legacyReporter->EndTestCase + ( testCaseStats.testInfo, + testCaseStats.totals, + testCaseStats.stdOut, + testCaseStats.stdErr ); + } + void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { + if( testGroupStats.aborting ) + m_legacyReporter->Aborted(); + m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); + } + void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { + m_legacyReporter->EndTesting( testRunStats.totals ); + } +} + +// #included from: catch_timer.hpp + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wc++11-long-long" +#endif + +#ifdef CATCH_PLATFORM_WINDOWS +#include <windows.h> +#else +#include <sys/time.h> +#endif + +namespace Catch { + + namespace { +#ifdef CATCH_PLATFORM_WINDOWS + uint64_t getCurrentTicks() { + static uint64_t hz=0, hzo=0; + if (!hz) { + QueryPerformanceFrequency((LARGE_INTEGER*)&hz); + QueryPerformanceCounter((LARGE_INTEGER*)&hzo); + } + uint64_t t; + QueryPerformanceCounter((LARGE_INTEGER*)&t); + return ((t-hzo)*1000000)/hz; + } +#else + uint64_t getCurrentTicks() { + timeval t; + gettimeofday(&t,NULL); + return static_cast<uint64_t>( t.tv_sec ) * 1000000ull + static_cast<uint64_t>( t.tv_usec ); + } +#endif + } + + void Timer::start() { + m_ticks = getCurrentTicks(); + } + unsigned int Timer::getElapsedNanoseconds() const { + return static_cast<unsigned int>(getCurrentTicks() - m_ticks); + } + unsigned int Timer::getElapsedMilliseconds() const { + return static_cast<unsigned int>((getCurrentTicks() - m_ticks)/1000); + } + double Timer::getElapsedSeconds() const { + return (getCurrentTicks() - m_ticks)/1000000.0; + } + +} // namespace Catch + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +// #included from: catch_common.hpp +#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED + +namespace Catch { + + bool startsWith( std::string const& s, std::string const& prefix ) { + return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix; + } + bool endsWith( std::string const& s, std::string const& suffix ) { + return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix; + } + bool contains( std::string const& s, std::string const& infix ) { + return s.find( infix ) != std::string::npos; + } + void toLowerInPlace( std::string& s ) { + std::transform( s.begin(), s.end(), s.begin(), ::tolower ); + } + std::string toLower( std::string const& s ) { + std::string lc = s; + toLowerInPlace( lc ); + return lc; + } + std::string trim( std::string const& str ) { + static char const* whitespaceChars = "\n\r\t "; + std::string::size_type start = str.find_first_not_of( whitespaceChars ); + std::string::size_type end = str.find_last_not_of( whitespaceChars ); + + return start != std::string::npos ? str.substr( start, 1+end-start ) : ""; + } + + pluralise::pluralise( std::size_t count, std::string const& label ) + : m_count( count ), + m_label( label ) + {} + + std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { + os << pluraliser.m_count << " " << pluraliser.m_label; + if( pluraliser.m_count != 1 ) + os << "s"; + return os; + } + + SourceLineInfo::SourceLineInfo() : line( 0 ){} + SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) + : file( _file ), + line( _line ) + {} + SourceLineInfo::SourceLineInfo( SourceLineInfo const& other ) + : file( other.file ), + line( other.line ) + {} + bool SourceLineInfo::empty() const { + return file.empty(); + } + bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { + return line == other.line && file == other.file; + } + + std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { +#ifndef __GNUG__ + os << info.file << "(" << info.line << ")"; +#else + os << info.file << ":" << info.line; +#endif + return os; + } + + void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { + std::ostringstream oss; + oss << locationInfo << ": Internal Catch error: '" << message << "'"; + if( alwaysTrue() ) + throw std::logic_error( oss.str() ); + } +} + +// #included from: catch_section.hpp +#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED + +namespace Catch { + + SectionInfo::SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name, + std::string const& _description ) + : name( _name ), + description( _description ), + lineInfo( _lineInfo ) + {} + + Section::Section( SectionInfo const& info ) + : m_info( info ), + m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) + { + m_timer.start(); + } + + Section::~Section() { + if( m_sectionIncluded ) + getResultCapture().sectionEnded( m_info, m_assertions, m_timer.getElapsedSeconds() ); + } + + // This indicates whether the section should be executed or not + Section::operator bool() const { + return m_sectionIncluded; + } + +} // end namespace Catch + +// #included from: catch_debugger.hpp +#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED + +#include <iostream> + +#ifdef CATCH_PLATFORM_MAC + + #include <assert.h> + #include <stdbool.h> + #include <sys/types.h> + #include <unistd.h> + #include <sys/sysctl.h> + + namespace Catch{ + + // The following function is taken directly from the following technical note: + // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html + + // Returns true if the current process is being debugged (either + // running under the debugger or has a debugger attached post facto). + bool isDebuggerActive(){ + + int mib[4]; + struct kinfo_proc info; + size_t size; + + // Initialize the flags so that, if sysctl fails for some bizarre + // reason, we get a predictable result. + + info.kp_proc.p_flag = 0; + + // Initialize mib, which tells sysctl the info we want, in this case + // we're looking for information about a specific process ID. + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + // Call sysctl. + + size = sizeof(info); + if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0) != 0 ) { + std::cerr << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; + return false; + } + + // We're being debugged if the P_TRACED flag is set. + + return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); + } + } // namespace Catch + +#elif defined(_MSC_VER) + extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); + namespace Catch { + bool isDebuggerActive() { + return IsDebuggerPresent() != 0; + } + } +#elif defined(__MINGW32__) + extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); + namespace Catch { + bool isDebuggerActive() { + return IsDebuggerPresent() != 0; + } + } +#else + namespace Catch { + inline bool isDebuggerActive() { return false; } + } +#endif // Platform + +#ifdef CATCH_PLATFORM_WINDOWS + extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* ); + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + ::OutputDebugStringA( text.c_str() ); + } + } +#else + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + // !TBD: Need a version for Mac/ XCode and other IDEs + std::cout << text; + } + } +#endif // Platform + +// #included from: catch_tostring.hpp +#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED + +namespace Catch { + +namespace Detail { + + namespace { + struct Endianness { + enum Arch { Big, Little }; + + static Arch which() { + union _{ + int asInt; + char asChar[sizeof (int)]; + } u; + + u.asInt = 1; + return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; + } + }; + } + + std::string rawMemoryToString( const void *object, std::size_t size ) + { + // Reverse order for little endian architectures + int i = 0, end = static_cast<int>( size ), inc = 1; + if( Endianness::which() == Endianness::Little ) { + i = end-1; + end = inc = -1; + } + + unsigned char const *bytes = static_cast<unsigned char const *>(object); + std::ostringstream os; + os << "0x" << std::setfill('0') << std::hex; + for( ; i != end; i += inc ) + os << std::setw(2) << static_cast<unsigned>(bytes[i]); + return os.str(); + } +} + +std::string toString( std::string const& value ) { + std::string s = value; + if( getCurrentContext().getConfig()->showInvisibles() ) { + for(size_t i = 0; i < s.size(); ++i ) { + std::string subs; + switch( s[i] ) { + case '\n': subs = "\\n"; break; + case '\t': subs = "\\t"; break; + default: break; + } + if( !subs.empty() ) { + s = s.substr( 0, i ) + subs + s.substr( i+1 ); + ++i; + } + } + } + return "\"" + s + "\""; +} +std::string toString( std::wstring const& value ) { + + std::string s; + s.reserve( value.size() ); + for(size_t i = 0; i < value.size(); ++i ) + s += value[i] <= 0xff ? static_cast<char>( value[i] ) : '?'; + return toString( s ); +} + +std::string toString( const char* const value ) { + return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); +} + +std::string toString( char* const value ) { + return Catch::toString( static_cast<const char*>( value ) ); +} + +std::string toString( const wchar_t* const value ) +{ + return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" ); +} + +std::string toString( wchar_t* const value ) +{ + return Catch::toString( static_cast<const wchar_t*>( value ) ); +} + +std::string toString( int value ) { + std::ostringstream oss; + oss << value; + return oss.str(); +} + +std::string toString( unsigned long value ) { + std::ostringstream oss; + if( value > 8192 ) + oss << "0x" << std::hex << value; + else + oss << value; + return oss.str(); +} + +std::string toString( unsigned int value ) { + return toString( static_cast<unsigned long>( value ) ); +} + +template<typename T> +std::string fpToString( T value, int precision ) { + std::ostringstream oss; + oss << std::setprecision( precision ) + << std::fixed + << value; + std::string d = oss.str(); + std::size_t i = d.find_last_not_of( '0' ); + if( i != std::string::npos && i != d.size()-1 ) { + if( d[i] == '.' ) + i++; + d = d.substr( 0, i+1 ); + } + return d; +} + +std::string toString( const double value ) { + return fpToString( value, 10 ); +} +std::string toString( const float value ) { + return fpToString( value, 5 ) + "f"; +} + +std::string toString( bool value ) { + return value ? "true" : "false"; +} + +std::string toString( char value ) { + return value < ' ' + ? toString( static_cast<unsigned int>( value ) ) + : Detail::makeString( value ); +} + +std::string toString( signed char value ) { + return toString( static_cast<char>( value ) ); +} + +std::string toString( unsigned char value ) { + return toString( static_cast<char>( value ) ); +} + +#ifdef CATCH_CONFIG_CPP11_NULLPTR +std::string toString( std::nullptr_t ) { + return "nullptr"; +} +#endif + +#ifdef __OBJC__ + std::string toString( NSString const * const& nsstring ) { + if( !nsstring ) + return "nil"; + return "@" + toString([nsstring UTF8String]); + } + std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) { + if( !nsstring ) + return "nil"; + return "@" + toString([nsstring UTF8String]); + } + std::string toString( NSObject* const& nsObject ) { + return toString( [nsObject description] ); + } +#endif + +} // end namespace Catch + +// #included from: catch_result_builder.hpp +#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED + +namespace Catch { + + ResultBuilder::ResultBuilder( char const* macroName, + SourceLineInfo const& lineInfo, + char const* capturedExpression, + ResultDisposition::Flags resultDisposition ) + : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition ), + m_shouldDebugBreak( false ), + m_shouldThrow( false ) + {} + + ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { + m_data.resultType = result; + return *this; + } + ResultBuilder& ResultBuilder::setResultType( bool result ) { + m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; + return *this; + } + ResultBuilder& ResultBuilder::setLhs( std::string const& lhs ) { + m_exprComponents.lhs = lhs; + return *this; + } + ResultBuilder& ResultBuilder::setRhs( std::string const& rhs ) { + m_exprComponents.rhs = rhs; + return *this; + } + ResultBuilder& ResultBuilder::setOp( std::string const& op ) { + m_exprComponents.op = op; + return *this; + } + + void ResultBuilder::endExpression() { + m_exprComponents.testFalse = isFalseTest( m_assertionInfo.resultDisposition ); + captureExpression(); + } + + void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { + m_assertionInfo.resultDisposition = resultDisposition; + m_stream.oss << Catch::translateActiveException(); + captureResult( ResultWas::ThrewException ); + } + + void ResultBuilder::captureResult( ResultWas::OfType resultType ) { + setResultType( resultType ); + captureExpression(); + } + + void ResultBuilder::captureExpression() { + AssertionResult result = build(); + getResultCapture().assertionEnded( result ); + + if( !result.isOk() ) { + if( getCurrentContext().getConfig()->shouldDebugBreak() ) + m_shouldDebugBreak = true; + if( getCurrentContext().getRunner()->aborting() || m_assertionInfo.resultDisposition == ResultDisposition::Normal ) + m_shouldThrow = true; + } + } + void ResultBuilder::react() { + if( m_shouldThrow ) + throw Catch::TestFailureException(); + } + + bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } + bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } + + AssertionResult ResultBuilder::build() const + { + assert( m_data.resultType != ResultWas::Unknown ); + + AssertionResultData data = m_data; + + // Flip bool results if testFalse is set + if( m_exprComponents.testFalse ) { + if( data.resultType == ResultWas::Ok ) + data.resultType = ResultWas::ExpressionFailed; + else if( data.resultType == ResultWas::ExpressionFailed ) + data.resultType = ResultWas::Ok; + } + + data.message = m_stream.oss.str(); + data.reconstructedExpression = reconstructExpression(); + if( m_exprComponents.testFalse ) { + if( m_exprComponents.op == "" ) + data.reconstructedExpression = "!" + data.reconstructedExpression; + else + data.reconstructedExpression = "!(" + data.reconstructedExpression + ")"; + } + return AssertionResult( m_assertionInfo, data ); + } + std::string ResultBuilder::reconstructExpression() const { + if( m_exprComponents.op == "" ) + return m_exprComponents.lhs.empty() ? m_assertionInfo.capturedExpression : m_exprComponents.op + m_exprComponents.lhs; + else if( m_exprComponents.op == "matches" ) + return m_exprComponents.lhs + " " + m_exprComponents.rhs; + else if( m_exprComponents.op != "!" ) { + if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 && + m_exprComponents.lhs.find("\n") == std::string::npos && + m_exprComponents.rhs.find("\n") == std::string::npos ) + return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs; + else + return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs; + } + else + return "{can't expand - use " + m_assertionInfo.macroName + "_FALSE( " + m_assertionInfo.capturedExpression.substr(1) + " ) instead of " + m_assertionInfo.macroName + "( " + m_assertionInfo.capturedExpression + " ) for better diagnostics}"; + } + +} // end namespace Catch + +// #included from: catch_tag_alias_registry.hpp +#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED + +// #included from: catch_tag_alias_registry.h +#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED + +#include <map> + +namespace Catch { + + class TagAliasRegistry : public ITagAliasRegistry { + public: + virtual ~TagAliasRegistry(); + virtual Option<TagAlias> find( std::string const& alias ) const; + virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; + void add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); + static TagAliasRegistry& get(); + + private: + std::map<std::string, TagAlias> m_registry; + }; + +} // end namespace Catch + +#include <map> +#include <iostream> + +namespace Catch { + + TagAliasRegistry::~TagAliasRegistry() {} + + Option<TagAlias> TagAliasRegistry::find( std::string const& alias ) const { + std::map<std::string, TagAlias>::const_iterator it = m_registry.find( alias ); + if( it != m_registry.end() ) + return it->second; + else + return Option<TagAlias>(); + } + + std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { + std::string expandedTestSpec = unexpandedTestSpec; + for( std::map<std::string, TagAlias>::const_iterator it = m_registry.begin(), itEnd = m_registry.end(); + it != itEnd; + ++it ) { + std::size_t pos = expandedTestSpec.find( it->first ); + if( pos != std::string::npos ) { + expandedTestSpec = expandedTestSpec.substr( 0, pos ) + + it->second.tag + + expandedTestSpec.substr( pos + it->first.size() ); + } + } + return expandedTestSpec; + } + + void TagAliasRegistry::add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { + + if( !startsWith( alias, "[@" ) || !endsWith( alias, "]" ) ) { + std::ostringstream oss; + oss << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" << lineInfo; + throw std::domain_error( oss.str().c_str() ); + } + if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { + std::ostringstream oss; + oss << "error: tag alias, \"" << alias << "\" already registered.\n" + << "\tFirst seen at " << find(alias)->lineInfo << "\n" + << "\tRedefined at " << lineInfo; + throw std::domain_error( oss.str().c_str() ); + } + } + + TagAliasRegistry& TagAliasRegistry::get() { + static TagAliasRegistry instance; + return instance; + + } + + ITagAliasRegistry::~ITagAliasRegistry() {} + ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); } + + RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { + try { + TagAliasRegistry::get().add( alias, tag, lineInfo ); + } + catch( std::exception& ex ) { + Colour colourGuard( Colour::Red ); + std::cerr << ex.what() << std::endl; + exit(1); + } + } + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_xml.hpp +#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED + +// #included from: catch_reporter_bases.hpp +#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED + +namespace Catch { + + struct StreamingReporterBase : SharedImpl<IStreamingReporter> { + + StreamingReporterBase( ReporterConfig const& _config ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) + {} + + virtual ~StreamingReporterBase(); + + virtual void noMatchingTestCases( std::string const& ) {} + + virtual void testRunStarting( TestRunInfo const& _testRunInfo ) { + currentTestRunInfo = _testRunInfo; + } + virtual void testGroupStarting( GroupInfo const& _groupInfo ) { + currentGroupInfo = _groupInfo; + } + + virtual void testCaseStarting( TestCaseInfo const& _testInfo ) { + currentTestCaseInfo = _testInfo; + } + virtual void sectionStarting( SectionInfo const& _sectionInfo ) { + m_sectionStack.push_back( _sectionInfo ); + } + + virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) { + m_sectionStack.pop_back(); + } + virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) { + currentTestCaseInfo.reset(); + assert( m_sectionStack.empty() ); + } + virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) { + currentGroupInfo.reset(); + } + virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) { + currentTestCaseInfo.reset(); + currentGroupInfo.reset(); + currentTestRunInfo.reset(); + } + + Ptr<IConfig> m_config; + std::ostream& stream; + + LazyStat<TestRunInfo> currentTestRunInfo; + LazyStat<GroupInfo> currentGroupInfo; + LazyStat<TestCaseInfo> currentTestCaseInfo; + + std::vector<SectionInfo> m_sectionStack; + }; + + struct CumulativeReporterBase : SharedImpl<IStreamingReporter> { + template<typename T, typename ChildNodeT> + struct Node : SharedImpl<> { + explicit Node( T const& _value ) : value( _value ) {} + virtual ~Node() {} + + typedef std::vector<Ptr<ChildNodeT> > ChildNodes; + T value; + ChildNodes children; + }; + struct SectionNode : SharedImpl<> { + explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} + virtual ~SectionNode(); + + bool operator == ( SectionNode const& other ) const { + return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; + } + bool operator == ( Ptr<SectionNode> const& other ) const { + return operator==( *other ); + } + + SectionStats stats; + typedef std::vector<Ptr<SectionNode> > ChildSections; + typedef std::vector<AssertionStats> Assertions; + ChildSections childSections; + Assertions assertions; + std::string stdOut; + std::string stdErr; + }; + + struct BySectionInfo { + BySectionInfo( SectionInfo const& other ) : m_other( other ) {} + BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} + bool operator() ( Ptr<SectionNode> const& node ) const { + return node->stats.sectionInfo.lineInfo == m_other.lineInfo; + } + private: + void operator=( BySectionInfo const& ); + SectionInfo const& m_other; + }; + + typedef Node<TestCaseStats, SectionNode> TestCaseNode; + typedef Node<TestGroupStats, TestCaseNode> TestGroupNode; + typedef Node<TestRunStats, TestGroupNode> TestRunNode; + + CumulativeReporterBase( ReporterConfig const& _config ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) + {} + ~CumulativeReporterBase(); + + virtual void testRunStarting( TestRunInfo const& ) {} + virtual void testGroupStarting( GroupInfo const& ) {} + + virtual void testCaseStarting( TestCaseInfo const& ) {} + + virtual void sectionStarting( SectionInfo const& sectionInfo ) { + SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); + Ptr<SectionNode> node; + if( m_sectionStack.empty() ) { + if( !m_rootSection ) + m_rootSection = new SectionNode( incompleteStats ); + node = m_rootSection; + } + else { + SectionNode& parentNode = *m_sectionStack.back(); + SectionNode::ChildSections::const_iterator it = + std::find_if( parentNode.childSections.begin(), + parentNode.childSections.end(), + BySectionInfo( sectionInfo ) ); + if( it == parentNode.childSections.end() ) { + node = new SectionNode( incompleteStats ); + parentNode.childSections.push_back( node ); + } + else + node = *it; + } + m_sectionStack.push_back( node ); + m_deepestSection = node; + } + + virtual void assertionStarting( AssertionInfo const& ) {} + + virtual bool assertionEnded( AssertionStats const& assertionStats ) { + assert( !m_sectionStack.empty() ); + SectionNode& sectionNode = *m_sectionStack.back(); + sectionNode.assertions.push_back( assertionStats ); + return true; + } + virtual void sectionEnded( SectionStats const& sectionStats ) { + assert( !m_sectionStack.empty() ); + SectionNode& node = *m_sectionStack.back(); + node.stats = sectionStats; + m_sectionStack.pop_back(); + } + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { + Ptr<TestCaseNode> node = new TestCaseNode( testCaseStats ); + assert( m_sectionStack.size() == 0 ); + node->children.push_back( m_rootSection ); + m_testCases.push_back( node ); + m_rootSection.reset(); + + assert( m_deepestSection ); + m_deepestSection->stdOut = testCaseStats.stdOut; + m_deepestSection->stdErr = testCaseStats.stdErr; + } + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { + Ptr<TestGroupNode> node = new TestGroupNode( testGroupStats ); + node->children.swap( m_testCases ); + m_testGroups.push_back( node ); + } + virtual void testRunEnded( TestRunStats const& testRunStats ) { + Ptr<TestRunNode> node = new TestRunNode( testRunStats ); + node->children.swap( m_testGroups ); + m_testRuns.push_back( node ); + testRunEndedCumulative(); + } + virtual void testRunEndedCumulative() = 0; + + Ptr<IConfig> m_config; + std::ostream& stream; + std::vector<AssertionStats> m_assertions; + std::vector<std::vector<Ptr<SectionNode> > > m_sections; + std::vector<Ptr<TestCaseNode> > m_testCases; + std::vector<Ptr<TestGroupNode> > m_testGroups; + + std::vector<Ptr<TestRunNode> > m_testRuns; + + Ptr<SectionNode> m_rootSection; + Ptr<SectionNode> m_deepestSection; + std::vector<Ptr<SectionNode> > m_sectionStack; + + }; + +} // end namespace Catch + +// #included from: ../internal/catch_reporter_registrars.hpp +#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED + +namespace Catch { + + template<typename T> + class LegacyReporterRegistrar { + + class ReporterFactory : public IReporterFactory { + virtual IStreamingReporter* create( ReporterConfig const& config ) const { + return new LegacyReporterAdapter( new T( config ) ); + } + + virtual std::string getDescription() const { + return T::getDescription(); + } + }; + + public: + + LegacyReporterRegistrar( std::string const& name ) { + getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); + } + }; + + template<typename T> + class ReporterRegistrar { + + class ReporterFactory : public IReporterFactory { + + // *** Please Note ***: + // - If you end up here looking at a compiler error because it's trying to register + // your custom reporter class be aware that the native reporter interface has changed + // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via + // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. + // However please consider updating to the new interface as the old one is now + // deprecated and will probably be removed quite soon! + // Please contact me via github if you have any questions at all about this. + // In fact, ideally, please contact me anyway to let me know you've hit this - as I have + // no idea who is actually using custom reporters at all (possibly no-one!). + // The new interface is designed to minimise exposure to interface changes in the future. + virtual IStreamingReporter* create( ReporterConfig const& config ) const { + return new T( config ); + } + + virtual std::string getDescription() const { + return T::getDescription(); + } + }; + + public: + + ReporterRegistrar( std::string const& name ) { + getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); + } + }; +} + +#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ + namespace{ Catch::LegacyReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } +#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ + namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } + +// #included from: ../internal/catch_xmlwriter.hpp +#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED + +#include <sstream> +#include <iostream> +#include <string> +#include <vector> + +namespace Catch { + + class XmlWriter { + public: + + class ScopedElement { + public: + ScopedElement( XmlWriter* writer ) + : m_writer( writer ) + {} + + ScopedElement( ScopedElement const& other ) + : m_writer( other.m_writer ){ + other.m_writer = NULL; + } + + ~ScopedElement() { + if( m_writer ) + m_writer->endElement(); + } + + ScopedElement& writeText( std::string const& text, bool indent = true ) { + m_writer->writeText( text, indent ); + return *this; + } + + template<typename T> + ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { + m_writer->writeAttribute( name, attribute ); + return *this; + } + + private: + mutable XmlWriter* m_writer; + }; + + XmlWriter() + : m_tagIsOpen( false ), + m_needsNewline( false ), + m_os( &std::cout ) + {} + + XmlWriter( std::ostream& os ) + : m_tagIsOpen( false ), + m_needsNewline( false ), + m_os( &os ) + {} + + ~XmlWriter() { + while( !m_tags.empty() ) + endElement(); + } + +//# ifndef CATCH_CPP11_OR_GREATER +// XmlWriter& operator = ( XmlWriter const& other ) { +// XmlWriter temp( other ); +// swap( temp ); +// return *this; +// } +//# else +// XmlWriter( XmlWriter const& ) = default; +// XmlWriter( XmlWriter && ) = default; +// XmlWriter& operator = ( XmlWriter const& ) = default; +// XmlWriter& operator = ( XmlWriter && ) = default; +//# endif +// +// void swap( XmlWriter& other ) { +// std::swap( m_tagIsOpen, other.m_tagIsOpen ); +// std::swap( m_needsNewline, other.m_needsNewline ); +// std::swap( m_tags, other.m_tags ); +// std::swap( m_indent, other.m_indent ); +// std::swap( m_os, other.m_os ); +// } + + XmlWriter& startElement( std::string const& name ) { + ensureTagClosed(); + newlineIfNecessary(); + stream() << m_indent << "<" << name; + m_tags.push_back( name ); + m_indent += " "; + m_tagIsOpen = true; + return *this; + } + + ScopedElement scopedElement( std::string const& name ) { + ScopedElement scoped( this ); + startElement( name ); + return scoped; + } + + XmlWriter& endElement() { + newlineIfNecessary(); + m_indent = m_indent.substr( 0, m_indent.size()-2 ); + if( m_tagIsOpen ) { + stream() << "/>\n"; + m_tagIsOpen = false; + } + else { + stream() << m_indent << "</" << m_tags.back() << ">\n"; + } + m_tags.pop_back(); + return *this; + } + + XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { + if( !name.empty() && !attribute.empty() ) { + stream() << " " << name << "=\""; + writeEncodedText( attribute ); + stream() << "\""; + } + return *this; + } + + XmlWriter& writeAttribute( std::string const& name, bool attribute ) { + stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\""; + return *this; + } + + template<typename T> + XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { + if( !name.empty() ) + stream() << " " << name << "=\"" << attribute << "\""; + return *this; + } + + XmlWriter& writeText( std::string const& text, bool indent = true ) { + if( !text.empty() ){ + bool tagWasOpen = m_tagIsOpen; + ensureTagClosed(); + if( tagWasOpen && indent ) + stream() << m_indent; + writeEncodedText( text ); + m_needsNewline = true; + } + return *this; + } + + XmlWriter& writeComment( std::string const& text ) { + ensureTagClosed(); + stream() << m_indent << "<!--" << text << "-->"; + m_needsNewline = true; + return *this; + } + + XmlWriter& writeBlankLine() { + ensureTagClosed(); + stream() << "\n"; + return *this; + } + + void setStream( std::ostream& os ) { + m_os = &os; + } + + private: + XmlWriter( XmlWriter const& ); + void operator=( XmlWriter const& ); + + std::ostream& stream() { + return *m_os; + } + + void ensureTagClosed() { + if( m_tagIsOpen ) { + stream() << ">\n"; + m_tagIsOpen = false; + } + } + + void newlineIfNecessary() { + if( m_needsNewline ) { + stream() << "\n"; + m_needsNewline = false; + } + } + + void writeEncodedText( std::string const& text ) { + static const char* charsToEncode = "<&\""; + std::string mtext = text; + std::string::size_type pos = mtext.find_first_of( charsToEncode ); + while( pos != std::string::npos ) { + stream() << mtext.substr( 0, pos ); + + switch( mtext[pos] ) { + case '<': + stream() << "<"; + break; + case '&': + stream() << "&"; + break; + case '\"': + stream() << """; + break; + } + mtext = mtext.substr( pos+1 ); + pos = mtext.find_first_of( charsToEncode ); + } + stream() << mtext; + } + + bool m_tagIsOpen; + bool m_needsNewline; + std::vector<std::string> m_tags; + std::string m_indent; + std::ostream* m_os; + }; + +} +namespace Catch { + class XmlReporter : public SharedImpl<IReporter> { + public: + XmlReporter( ReporterConfig const& config ) : m_config( config ), m_sectionDepth( 0 ) {} + + static std::string getDescription() { + return "Reports test results as an XML document"; + } + virtual ~XmlReporter(); + + private: // IReporter + + virtual bool shouldRedirectStdout() const { + return true; + } + + virtual void StartTesting() { + m_xml.setStream( m_config.stream() ); + m_xml.startElement( "Catch" ); + if( !m_config.fullConfig()->name().empty() ) + m_xml.writeAttribute( "name", m_config.fullConfig()->name() ); + } + + virtual void EndTesting( const Totals& totals ) { + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", totals.assertions.passed ) + .writeAttribute( "failures", totals.assertions.failed ) + .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); + m_xml.endElement(); + } + + virtual void StartGroup( const std::string& groupName ) { + m_xml.startElement( "Group" ) + .writeAttribute( "name", groupName ); + } + + virtual void EndGroup( const std::string&, const Totals& totals ) { + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", totals.assertions.passed ) + .writeAttribute( "failures", totals.assertions.failed ) + .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); + m_xml.endElement(); + } + + virtual void StartSection( const std::string& sectionName, const std::string& description ) { + if( m_sectionDepth++ > 0 ) { + m_xml.startElement( "Section" ) + .writeAttribute( "name", trim( sectionName ) ) + .writeAttribute( "description", description ); + } + } + virtual void NoAssertionsInSection( const std::string& ) {} + virtual void NoAssertionsInTestCase( const std::string& ) {} + + virtual void EndSection( const std::string& /*sectionName*/, const Counts& assertions ) { + if( --m_sectionDepth > 0 ) { + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", assertions.passed ) + .writeAttribute( "failures", assertions.failed ) + .writeAttribute( "expectedFailures", assertions.failedButOk ); + m_xml.endElement(); + } + } + + virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) { + m_xml.startElement( "TestCase" ).writeAttribute( "name", trim( testInfo.name ) ); + m_currentTestSuccess = true; + } + + virtual void Result( const Catch::AssertionResult& assertionResult ) { + if( !m_config.fullConfig()->includeSuccessfulResults() && assertionResult.getResultType() == ResultWas::Ok ) + return; + + if( assertionResult.hasExpression() ) { + m_xml.startElement( "Expression" ) + .writeAttribute( "success", assertionResult.succeeded() ) + .writeAttribute( "filename", assertionResult.getSourceInfo().file ) + .writeAttribute( "line", assertionResult.getSourceInfo().line ); + + m_xml.scopedElement( "Original" ) + .writeText( assertionResult.getExpression() ); + m_xml.scopedElement( "Expanded" ) + .writeText( assertionResult.getExpandedExpression() ); + m_currentTestSuccess &= assertionResult.succeeded(); + } + + switch( assertionResult.getResultType() ) { + case ResultWas::ThrewException: + m_xml.scopedElement( "Exception" ) + .writeAttribute( "filename", assertionResult.getSourceInfo().file ) + .writeAttribute( "line", assertionResult.getSourceInfo().line ) + .writeText( assertionResult.getMessage() ); + m_currentTestSuccess = false; + break; + case ResultWas::Info: + m_xml.scopedElement( "Info" ) + .writeText( assertionResult.getMessage() ); + break; + case ResultWas::Warning: + m_xml.scopedElement( "Warning" ) + .writeText( assertionResult.getMessage() ); + break; + case ResultWas::ExplicitFailure: + m_xml.scopedElement( "Failure" ) + .writeText( assertionResult.getMessage() ); + m_currentTestSuccess = false; + break; + case ResultWas::Unknown: + case ResultWas::Ok: + case ResultWas::FailureBit: + case ResultWas::ExpressionFailed: + case ResultWas::Exception: + case ResultWas::DidntThrowException: + break; + } + if( assertionResult.hasExpression() ) + m_xml.endElement(); + } + + virtual void Aborted() { + // !TBD + } + + virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string&, const std::string& ) { + m_xml.scopedElement( "OverallResult" ).writeAttribute( "success", m_currentTestSuccess ); + m_xml.endElement(); + } + + private: + ReporterConfig m_config; + bool m_currentTestSuccess; + XmlWriter m_xml; + int m_sectionDepth; + }; + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_junit.hpp +#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED + +#include <assert.h> + +namespace Catch { + + class JunitReporter : public CumulativeReporterBase { + public: + JunitReporter( ReporterConfig const& _config ) + : CumulativeReporterBase( _config ), + xml( _config.stream() ) + {} + + ~JunitReporter(); + + static std::string getDescription() { + return "Reports test results in an XML format that looks like Ant's junitreport target"; + } + + virtual void noMatchingTestCases( std::string const& /*spec*/ ) {} + + virtual ReporterPreferences getPreferences() const { + ReporterPreferences prefs; + prefs.shouldRedirectStdOut = true; + return prefs; + } + + virtual void testRunStarting( TestRunInfo const& runInfo ) { + CumulativeReporterBase::testRunStarting( runInfo ); + xml.startElement( "testsuites" ); + } + + virtual void testGroupStarting( GroupInfo const& groupInfo ) { + suiteTimer.start(); + stdOutForSuite.str(""); + stdErrForSuite.str(""); + unexpectedExceptions = 0; + CumulativeReporterBase::testGroupStarting( groupInfo ); + } + + virtual bool assertionEnded( AssertionStats const& assertionStats ) { + if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException ) + unexpectedExceptions++; + return CumulativeReporterBase::assertionEnded( assertionStats ); + } + + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { + stdOutForSuite << testCaseStats.stdOut; + stdErrForSuite << testCaseStats.stdErr; + CumulativeReporterBase::testCaseEnded( testCaseStats ); + } + + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { + double suiteTime = suiteTimer.getElapsedSeconds(); + CumulativeReporterBase::testGroupEnded( testGroupStats ); + writeGroup( *m_testGroups.back(), suiteTime ); + } + + virtual void testRunEndedCumulative() { + xml.endElement(); + } + + void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { + XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); + TestGroupStats const& stats = groupNode.value; + xml.writeAttribute( "name", stats.groupInfo.name ); + xml.writeAttribute( "errors", unexpectedExceptions ); + xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); + xml.writeAttribute( "tests", stats.totals.assertions.total() ); + xml.writeAttribute( "hostname", "tbd" ); // !TBD + if( m_config->showDurations() == ShowDurations::Never ) + xml.writeAttribute( "time", "" ); + else + xml.writeAttribute( "time", suiteTime ); + xml.writeAttribute( "timestamp", "tbd" ); // !TBD + + // Write test cases + for( TestGroupNode::ChildNodes::const_iterator + it = groupNode.children.begin(), itEnd = groupNode.children.end(); + it != itEnd; + ++it ) + writeTestCase( **it ); + + xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); + xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); + } + + void writeTestCase( TestCaseNode const& testCaseNode ) { + TestCaseStats const& stats = testCaseNode.value; + + // All test cases have exactly one section - which represents the + // test case itself. That section may have 0-n nested sections + assert( testCaseNode.children.size() == 1 ); + SectionNode const& rootSection = *testCaseNode.children.front(); + + std::string className = stats.testInfo.className; + + if( className.empty() ) { + if( rootSection.childSections.empty() ) + className = "global"; + } + writeSection( className, "", rootSection ); + } + + void writeSection( std::string const& className, + std::string const& rootName, + SectionNode const& sectionNode ) { + std::string name = trim( sectionNode.stats.sectionInfo.name ); + if( !rootName.empty() ) + name = rootName + "/" + name; + + if( !sectionNode.assertions.empty() || + !sectionNode.stdOut.empty() || + !sectionNode.stdErr.empty() ) { + XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); + if( className.empty() ) { + xml.writeAttribute( "classname", name ); + xml.writeAttribute( "name", "root" ); + } + else { + xml.writeAttribute( "classname", className ); + xml.writeAttribute( "name", name ); + } + xml.writeAttribute( "time", toString( sectionNode.stats.durationInSeconds ) ); + + writeAssertions( sectionNode ); + + if( !sectionNode.stdOut.empty() ) + xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); + if( !sectionNode.stdErr.empty() ) + xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); + } + for( SectionNode::ChildSections::const_iterator + it = sectionNode.childSections.begin(), + itEnd = sectionNode.childSections.end(); + it != itEnd; + ++it ) + if( className.empty() ) + writeSection( name, "", **it ); + else + writeSection( className, name, **it ); + } + + void writeAssertions( SectionNode const& sectionNode ) { + for( SectionNode::Assertions::const_iterator + it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); + it != itEnd; + ++it ) + writeAssertion( *it ); + } + void writeAssertion( AssertionStats const& stats ) { + AssertionResult const& result = stats.assertionResult; + if( !result.isOk() ) { + std::string elementName; + switch( result.getResultType() ) { + case ResultWas::ThrewException: + elementName = "error"; + break; + case ResultWas::ExplicitFailure: + elementName = "failure"; + break; + case ResultWas::ExpressionFailed: + elementName = "failure"; + break; + case ResultWas::DidntThrowException: + elementName = "failure"; + break; + + // We should never see these here: + case ResultWas::Info: + case ResultWas::Warning: + case ResultWas::Ok: + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + elementName = "internalError"; + break; + } + + XmlWriter::ScopedElement e = xml.scopedElement( elementName ); + + xml.writeAttribute( "message", result.getExpandedExpression() ); + xml.writeAttribute( "type", result.getTestMacroName() ); + + std::ostringstream oss; + if( !result.getMessage().empty() ) + oss << result.getMessage() << "\n"; + for( std::vector<MessageInfo>::const_iterator + it = stats.infoMessages.begin(), + itEnd = stats.infoMessages.end(); + it != itEnd; + ++it ) + if( it->type == ResultWas::Info ) + oss << it->message << "\n"; + + oss << "at " << result.getSourceInfo(); + xml.writeText( oss.str(), false ); + } + } + + XmlWriter xml; + Timer suiteTimer; + std::ostringstream stdOutForSuite; + std::ostringstream stdErrForSuite; + unsigned int unexpectedExceptions; + }; + + INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_console.hpp +#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED + +#include <cstring> + +namespace Catch { + + struct ConsoleReporter : StreamingReporterBase { + ConsoleReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ), + m_headerPrinted( false ) + {} + + virtual ~ConsoleReporter(); + static std::string getDescription() { + return "Reports test results as plain lines of text"; + } + virtual ReporterPreferences getPreferences() const { + ReporterPreferences prefs; + prefs.shouldRedirectStdOut = false; + return prefs; + } + + virtual void noMatchingTestCases( std::string const& spec ) { + stream << "No test cases matched '" << spec << "'" << std::endl; + } + + virtual void assertionStarting( AssertionInfo const& ) { + } + + virtual bool assertionEnded( AssertionStats const& _assertionStats ) { + AssertionResult const& result = _assertionStats.assertionResult; + + bool printInfoMessages = true; + + // Drop out if result was successful and we're not printing those + if( !m_config->includeSuccessfulResults() && result.isOk() ) { + if( result.getResultType() != ResultWas::Warning ) + return false; + printInfoMessages = false; + } + + lazyPrint(); + + AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); + printer.print(); + stream << std::endl; + return true; + } + + virtual void sectionStarting( SectionInfo const& _sectionInfo ) { + m_headerPrinted = false; + StreamingReporterBase::sectionStarting( _sectionInfo ); + } + virtual void sectionEnded( SectionStats const& _sectionStats ) { + if( _sectionStats.missingAssertions ) { + lazyPrint(); + Colour colour( Colour::ResultError ); + if( m_sectionStack.size() > 1 ) + stream << "\nNo assertions in section"; + else + stream << "\nNo assertions in test case"; + stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; + } + if( m_headerPrinted ) { + if( m_config->showDurations() == ShowDurations::Always ) + stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl; + m_headerPrinted = false; + } + else { + if( m_config->showDurations() == ShowDurations::Always ) + stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl; + } + StreamingReporterBase::sectionEnded( _sectionStats ); + } + + virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) { + StreamingReporterBase::testCaseEnded( _testCaseStats ); + m_headerPrinted = false; + } + virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) { + if( currentGroupInfo.used ) { + printSummaryDivider(); + stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; + printTotals( _testGroupStats.totals ); + stream << "\n" << std::endl; + } + StreamingReporterBase::testGroupEnded( _testGroupStats ); + } + virtual void testRunEnded( TestRunStats const& _testRunStats ) { + printTotalsDivider( _testRunStats.totals ); + printTotals( _testRunStats.totals ); + stream << std::endl; + StreamingReporterBase::testRunEnded( _testRunStats ); + } + + private: + + class AssertionPrinter { + void operator= ( AssertionPrinter const& ); + public: + AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) + : stream( _stream ), + stats( _stats ), + result( _stats.assertionResult ), + colour( Colour::None ), + message( result.getMessage() ), + messages( _stats.infoMessages ), + printInfoMessages( _printInfoMessages ) + { + switch( result.getResultType() ) { + case ResultWas::Ok: + colour = Colour::Success; + passOrFail = "PASSED"; + //if( result.hasMessage() ) + if( _stats.infoMessages.size() == 1 ) + messageLabel = "with message"; + if( _stats.infoMessages.size() > 1 ) + messageLabel = "with messages"; + break; + case ResultWas::ExpressionFailed: + if( result.isOk() ) { + colour = Colour::Success; + passOrFail = "FAILED - but was ok"; + } + else { + colour = Colour::Error; + passOrFail = "FAILED"; + } + if( _stats.infoMessages.size() == 1 ) + messageLabel = "with message"; + if( _stats.infoMessages.size() > 1 ) + messageLabel = "with messages"; + break; + case ResultWas::ThrewException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to unexpected exception with message"; + break; + case ResultWas::DidntThrowException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "because no exception was thrown where one was expected"; + break; + case ResultWas::Info: + messageLabel = "info"; + break; + case ResultWas::Warning: + messageLabel = "warning"; + break; + case ResultWas::ExplicitFailure: + passOrFail = "FAILED"; + colour = Colour::Error; + if( _stats.infoMessages.size() == 1 ) + messageLabel = "explicitly with message"; + if( _stats.infoMessages.size() > 1 ) + messageLabel = "explicitly with messages"; + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + passOrFail = "** internal error **"; + colour = Colour::Error; + break; + } + } + + void print() const { + printSourceInfo(); + if( stats.totals.assertions.total() > 0 ) { + if( result.isOk() ) + stream << "\n"; + printResultType(); + printOriginalExpression(); + printReconstructedExpression(); + } + else { + stream << "\n"; + } + printMessage(); + } + + private: + void printResultType() const { + if( !passOrFail.empty() ) { + Colour colourGuard( colour ); + stream << passOrFail << ":\n"; + } + } + void printOriginalExpression() const { + if( result.hasExpression() ) { + Colour colourGuard( Colour::OriginalExpression ); + stream << " "; + stream << result.getExpressionInMacro(); + stream << "\n"; + } + } + void printReconstructedExpression() const { + if( result.hasExpandedExpression() ) { + stream << "with expansion:\n"; + Colour colourGuard( Colour::ReconstructedExpression ); + stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n"; + } + } + void printMessage() const { + if( !messageLabel.empty() ) + stream << messageLabel << ":" << "\n"; + for( std::vector<MessageInfo>::const_iterator it = messages.begin(), itEnd = messages.end(); + it != itEnd; + ++it ) { + // If this assertion is a warning ignore any INFO messages + if( printInfoMessages || it->type != ResultWas::Info ) + stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n"; + } + } + void printSourceInfo() const { + Colour colourGuard( Colour::FileName ); + stream << result.getSourceInfo() << ": "; + } + + std::ostream& stream; + AssertionStats const& stats; + AssertionResult const& result; + Colour::Code colour; + std::string passOrFail; + std::string messageLabel; + std::string message; + std::vector<MessageInfo> messages; + bool printInfoMessages; + }; + + void lazyPrint() { + + if( !currentTestRunInfo.used ) + lazyPrintRunInfo(); + if( !currentGroupInfo.used ) + lazyPrintGroupInfo(); + + if( !m_headerPrinted ) { + printTestCaseAndSectionHeader(); + m_headerPrinted = true; + } + } + void lazyPrintRunInfo() { + stream << "\n" << getLineOfChars<'~'>() << "\n"; + Colour colour( Colour::SecondaryText ); + stream << currentTestRunInfo->name + << " is a Catch v" << libraryVersion.majorVersion << "." + << libraryVersion.minorVersion << " b" + << libraryVersion.buildNumber; + if( libraryVersion.branchName != std::string( "master" ) ) + stream << " (" << libraryVersion.branchName << ")"; + stream << " host application.\n" + << "Run with -? for options\n\n"; + + currentTestRunInfo.used = true; + } + void lazyPrintGroupInfo() { + if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { + printClosedHeader( "Group: " + currentGroupInfo->name ); + currentGroupInfo.used = true; + } + } + void printTestCaseAndSectionHeader() { + assert( !m_sectionStack.empty() ); + printOpenHeader( currentTestCaseInfo->name ); + + if( m_sectionStack.size() > 1 ) { + Colour colourGuard( Colour::Headers ); + + std::vector<SectionInfo>::const_iterator + it = m_sectionStack.begin()+1, // Skip first section (test case) + itEnd = m_sectionStack.end(); + for( ; it != itEnd; ++it ) + printHeaderString( it->name, 2 ); + } + + SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; + + if( !lineInfo.empty() ){ + stream << getLineOfChars<'-'>() << "\n"; + Colour colourGuard( Colour::FileName ); + stream << lineInfo << "\n"; + } + stream << getLineOfChars<'.'>() << "\n" << std::endl; + } + + void printClosedHeader( std::string const& _name ) { + printOpenHeader( _name ); + stream << getLineOfChars<'.'>() << "\n"; + } + void printOpenHeader( std::string const& _name ) { + stream << getLineOfChars<'-'>() << "\n"; + { + Colour colourGuard( Colour::Headers ); + printHeaderString( _name ); + } + } + + // if string has a : in first line will set indent to follow it on + // subsequent lines + void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { + std::size_t i = _string.find( ": " ); + if( i != std::string::npos ) + i+=2; + else + i = 0; + stream << Text( _string, TextAttributes() + .setIndent( indent+i) + .setInitialIndent( indent ) ) << "\n"; + } + + struct SummaryColumn { + + SummaryColumn( std::string const& _label, Colour::Code _colour ) + : label( _label ), + colour( _colour ) + {} + SummaryColumn addRow( std::size_t count ) { + std::ostringstream oss; + oss << count; + std::string row = oss.str(); + for( std::vector<std::string>::iterator it = rows.begin(); it != rows.end(); ++it ) { + while( it->size() < row.size() ) + *it = " " + *it; + while( it->size() > row.size() ) + row = " " + row; + } + rows.push_back( row ); + return *this; + } + + std::string label; + Colour::Code colour; + std::vector<std::string> rows; + + }; + + void printTotals( Totals const& totals ) { + if( totals.testCases.total() == 0 ) { + stream << Colour( Colour::Warning ) << "No tests ran\n"; + } + else if( totals.assertions.total() > 0 && totals.assertions.allPassed() ) { + stream << Colour( Colour::ResultSuccess ) << "All tests passed"; + stream << " (" + << pluralise( totals.assertions.passed, "assertion" ) << " in " + << pluralise( totals.testCases.passed, "test case" ) << ")" + << "\n"; + } + else { + + std::vector<SummaryColumn> columns; + columns.push_back( SummaryColumn( "", Colour::None ) + .addRow( totals.testCases.total() ) + .addRow( totals.assertions.total() ) ); + columns.push_back( SummaryColumn( "passed", Colour::Success ) + .addRow( totals.testCases.passed ) + .addRow( totals.assertions.passed ) ); + columns.push_back( SummaryColumn( "failed", Colour::ResultError ) + .addRow( totals.testCases.failed ) + .addRow( totals.assertions.failed ) ); + columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure ) + .addRow( totals.testCases.failedButOk ) + .addRow( totals.assertions.failedButOk ) ); + + printSummaryRow( "test cases", columns, 0 ); + printSummaryRow( "assertions", columns, 1 ); + } + } + void printSummaryRow( std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row ) { + for( std::vector<SummaryColumn>::const_iterator it = cols.begin(); it != cols.end(); ++it ) { + std::string value = it->rows[row]; + if( it->label.empty() ) { + stream << label << ": "; + if( value != "0" ) + stream << value; + else + stream << Colour( Colour::Warning ) << "- none -"; + } + else if( value != "0" ) { + stream << Colour( Colour::LightGrey ) << " | "; + stream << Colour( it->colour ) + << value << " " << it->label; + } + } + stream << "\n"; + } + + static std::size_t makeRatio( std::size_t number, std::size_t total ) { + std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0; + return ( ratio == 0 && number > 0 ) ? 1 : ratio; + } + static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) { + if( i > j && i > k ) + return i; + else if( j > k ) + return j; + else + return k; + } + + void printTotalsDivider( Totals const& totals ) { + if( totals.testCases.total() > 0 ) { + std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() ); + std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() ); + std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() ); + while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 ) + findMax( failedRatio, failedButOkRatio, passedRatio )++; + while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 ) + findMax( failedRatio, failedButOkRatio, passedRatio )--; + + stream << Colour( Colour::Error ) << std::string( failedRatio, '=' ); + stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' ); + if( totals.testCases.allPassed() ) + stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' ); + else + stream << Colour( Colour::Success ) << std::string( passedRatio, '=' ); + } + else { + stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); + } + stream << "\n"; + } + void printSummaryDivider() { + stream << getLineOfChars<'-'>() << "\n"; + } + template<char C> + static char const* getLineOfChars() { + static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; + if( !*line ) { + memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); + line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; + } + return line; + } + + private: + bool m_headerPrinted; + }; + + INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) + +} // end namespace Catch + +// #included from: ../reporters/catch_reporter_compact.hpp +#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED + +namespace Catch { + + struct CompactReporter : StreamingReporterBase { + + CompactReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ) + {} + + virtual ~CompactReporter(); + + static std::string getDescription() { + return "Reports test results on a single line, suitable for IDEs"; + } + + virtual ReporterPreferences getPreferences() const { + ReporterPreferences prefs; + prefs.shouldRedirectStdOut = false; + return prefs; + } + + virtual void noMatchingTestCases( std::string const& spec ) { + stream << "No test cases matched '" << spec << "'" << std::endl; + } + + virtual void assertionStarting( AssertionInfo const& ) { + } + + virtual bool assertionEnded( AssertionStats const& _assertionStats ) { + AssertionResult const& result = _assertionStats.assertionResult; + + bool printInfoMessages = true; + + // Drop out if result was successful and we're not printing those + if( !m_config->includeSuccessfulResults() && result.isOk() ) { + if( result.getResultType() != ResultWas::Warning ) + return false; + printInfoMessages = false; + } + + AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); + printer.print(); + + stream << std::endl; + return true; + } + + virtual void testRunEnded( TestRunStats const& _testRunStats ) { + printTotals( _testRunStats.totals ); + stream << "\n" << std::endl; + StreamingReporterBase::testRunEnded( _testRunStats ); + } + + private: + class AssertionPrinter { + void operator= ( AssertionPrinter const& ); + public: + AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) + : stream( _stream ) + , stats( _stats ) + , result( _stats.assertionResult ) + , messages( _stats.infoMessages ) + , itMessage( _stats.infoMessages.begin() ) + , printInfoMessages( _printInfoMessages ) + {} + + void print() { + printSourceInfo(); + + itMessage = messages.begin(); + + switch( result.getResultType() ) { + case ResultWas::Ok: + printResultType( Colour::ResultSuccess, passedString() ); + printOriginalExpression(); + printReconstructedExpression(); + if ( ! result.hasExpression() ) + printRemainingMessages( Colour::None ); + else + printRemainingMessages(); + break; + case ResultWas::ExpressionFailed: + if( result.isOk() ) + printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) ); + else + printResultType( Colour::Error, failedString() ); + printOriginalExpression(); + printReconstructedExpression(); + printRemainingMessages(); + break; + case ResultWas::ThrewException: + printResultType( Colour::Error, failedString() ); + printIssue( "unexpected exception with message:" ); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::DidntThrowException: + printResultType( Colour::Error, failedString() ); + printIssue( "expected exception, got none" ); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::Info: + printResultType( Colour::None, "info" ); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::Warning: + printResultType( Colour::None, "warning" ); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::ExplicitFailure: + printResultType( Colour::Error, failedString() ); + printIssue( "explicitly" ); + printRemainingMessages( Colour::None ); + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + printResultType( Colour::Error, "** internal error **" ); + break; + } + } + + private: + // Colour::LightGrey + + static Colour::Code dimColour() { return Colour::FileName; } + +#ifdef CATCH_PLATFORM_MAC + static const char* failedString() { return "FAILED"; } + static const char* passedString() { return "PASSED"; } +#else + static const char* failedString() { return "failed"; } + static const char* passedString() { return "passed"; } +#endif + + void printSourceInfo() const { + Colour colourGuard( Colour::FileName ); + stream << result.getSourceInfo() << ":"; + } + + void printResultType( Colour::Code colour, std::string passOrFail ) const { + if( !passOrFail.empty() ) { + { + Colour colourGuard( colour ); + stream << " " << passOrFail; + } + stream << ":"; + } + } + + void printIssue( std::string issue ) const { + stream << " " << issue; + } + + void printExpressionWas() { + if( result.hasExpression() ) { + stream << ";"; + { + Colour colour( dimColour() ); + stream << " expression was:"; + } + printOriginalExpression(); + } + } + + void printOriginalExpression() const { + if( result.hasExpression() ) { + stream << " " << result.getExpression(); + } + } + + void printReconstructedExpression() const { + if( result.hasExpandedExpression() ) { + { + Colour colour( dimColour() ); + stream << " for: "; + } + stream << result.getExpandedExpression(); + } + } + + void printMessage() { + if ( itMessage != messages.end() ) { + stream << " '" << itMessage->message << "'"; + ++itMessage; + } + } + + void printRemainingMessages( Colour::Code colour = dimColour() ) { + if ( itMessage == messages.end() ) + return; + + // using messages.end() directly yields compilation error: + std::vector<MessageInfo>::const_iterator itEnd = messages.end(); + const std::size_t N = static_cast<std::size_t>( std::distance( itMessage, itEnd ) ); + + { + Colour colourGuard( colour ); + stream << " with " << pluralise( N, "message" ) << ":"; + } + + for(; itMessage != itEnd; ) { + // If this assertion is a warning ignore any INFO messages + if( printInfoMessages || itMessage->type != ResultWas::Info ) { + stream << " '" << itMessage->message << "'"; + if ( ++itMessage != itEnd ) { + Colour colourGuard( dimColour() ); + stream << " and"; + } + } + } + } + + private: + std::ostream& stream; + AssertionStats const& stats; + AssertionResult const& result; + std::vector<MessageInfo> messages; + std::vector<MessageInfo>::const_iterator itMessage; + bool printInfoMessages; + }; + + // Colour, message variants: + // - white: No tests ran. + // - red: Failed [both/all] N test cases, failed [both/all] M assertions. + // - white: Passed [both/all] N test cases (no assertions). + // - red: Failed N tests cases, failed M assertions. + // - green: Passed [both/all] N tests cases with M assertions. + + std::string bothOrAll( std::size_t count ) const { + return count == 1 ? "" : count == 2 ? "both " : "all " ; + } + + void printTotals( const Totals& totals ) const { + if( totals.testCases.total() == 0 ) { + stream << "No tests ran."; + } + else if( totals.testCases.failed == totals.testCases.total() ) { + Colour colour( Colour::ResultError ); + const std::string qualify_assertions_failed = + totals.assertions.failed == totals.assertions.total() ? + bothOrAll( totals.assertions.failed ) : ""; + stream << + "Failed " << bothOrAll( totals.testCases.failed ) + << pluralise( totals.testCases.failed, "test case" ) << ", " + "failed " << qualify_assertions_failed << + pluralise( totals.assertions.failed, "assertion" ) << "."; + } + else if( totals.assertions.total() == 0 ) { + stream << + "Passed " << bothOrAll( totals.testCases.total() ) + << pluralise( totals.testCases.total(), "test case" ) + << " (no assertions)."; + } + else if( totals.assertions.failed ) { + Colour colour( Colour::ResultError ); + stream << + "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " + "failed " << pluralise( totals.assertions.failed, "assertion" ) << "."; + } + else { + Colour colour( Colour::ResultSuccess ); + stream << + "Passed " << bothOrAll( totals.testCases.passed ) + << pluralise( totals.testCases.passed, "test case" ) << + " with " << pluralise( totals.assertions.passed, "assertion" ) << "."; + } + } + }; + + INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter ) + +} // end namespace Catch + +namespace Catch { + NonCopyable::~NonCopyable() {} + IShared::~IShared() {} + StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} + IContext::~IContext() {} + IResultCapture::~IResultCapture() {} + ITestCase::~ITestCase() {} + ITestCaseRegistry::~ITestCaseRegistry() {} + IRegistryHub::~IRegistryHub() {} + IMutableRegistryHub::~IMutableRegistryHub() {} + IExceptionTranslator::~IExceptionTranslator() {} + IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} + IReporter::~IReporter() {} + IReporterFactory::~IReporterFactory() {} + IReporterRegistry::~IReporterRegistry() {} + IStreamingReporter::~IStreamingReporter() {} + AssertionStats::~AssertionStats() {} + SectionStats::~SectionStats() {} + TestCaseStats::~TestCaseStats() {} + TestGroupStats::~TestGroupStats() {} + TestRunStats::~TestRunStats() {} + CumulativeReporterBase::SectionNode::~SectionNode() {} + CumulativeReporterBase::~CumulativeReporterBase() {} + + StreamingReporterBase::~StreamingReporterBase() {} + ConsoleReporter::~ConsoleReporter() {} + CompactReporter::~CompactReporter() {} + IRunner::~IRunner() {} + IMutableContext::~IMutableContext() {} + IConfig::~IConfig() {} + XmlReporter::~XmlReporter() {} + JunitReporter::~JunitReporter() {} + TestRegistry::~TestRegistry() {} + FreeFunctionTestCase::~FreeFunctionTestCase() {} + IGeneratorInfo::~IGeneratorInfo() {} + IGeneratorsForTest::~IGeneratorsForTest() {} + TestSpec::Pattern::~Pattern() {} + TestSpec::NamePattern::~NamePattern() {} + TestSpec::TagPattern::~TagPattern() {} + TestSpec::ExcludedPattern::~ExcludedPattern() {} + + Matchers::Impl::StdString::Equals::~Equals() {} + Matchers::Impl::StdString::Contains::~Contains() {} + Matchers::Impl::StdString::StartsWith::~StartsWith() {} + Matchers::Impl::StdString::EndsWith::~EndsWith() {} + + void Config::dummy() {} + + INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "xml", XmlReporter ) +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#endif + +#ifdef CATCH_CONFIG_MAIN +// #included from: internal/catch_default_main.hpp +#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED + +#ifndef __OBJC__ + +// Standard C/C++ main entry point +int main (int argc, char * const argv[]) { + return Catch::Session().run( argc, argv ); +} + +#else // __OBJC__ + +// Objective-C entry point +int main (int argc, char * const argv[]) { +#if !CATCH_ARC_ENABLED + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; +#endif + + Catch::registerTestMethods(); + int result = Catch::Session().run( argc, (char* const*)argv ); + +#if !CATCH_ARC_ENABLED + [pool drain]; +#endif + + return result; +} + +#endif // __OBJC__ + +#endif + +#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED +# undef CLARA_CONFIG_MAIN +#endif + +////// + +// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ +#ifdef CATCH_CONFIG_PREFIX_ALL + +#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" ) +#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "CATCH_REQUIRE_FALSE" ) + +#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS" ) +#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" ) +#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" ) + +#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" ) +#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CATCH_CHECK_FALSE" ) +#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" ) +#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" ) +#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" ) + +#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" ) +#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" ) +#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" ) + +#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" ) +#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" ) + +#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) +#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN", msg ) +#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) +#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) +#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) + +#ifdef CATCH_CONFIG_VARIADIC_MACROS + #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) + #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) + #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) + #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) + #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__ ) + #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__ ) +#else + #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) + #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) + #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) + #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) + #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg ) + #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg ) +#endif +#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) + +#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) +#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) + +#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) + +// "BDD-style" convenience wrappers +#ifdef CATCH_CONFIG_VARIADIC_MACROS +#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) +#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) +#else +#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) +#define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) +#endif +#define CATCH_GIVEN( desc ) CATCH_SECTION( "Given: " desc, "" ) +#define CATCH_WHEN( desc ) CATCH_SECTION( " When: " desc, "" ) +#define CATCH_AND_WHEN( desc ) CATCH_SECTION( " And: " desc, "" ) +#define CATCH_THEN( desc ) CATCH_SECTION( " Then: " desc, "" ) +#define CATCH_AND_THEN( desc ) CATCH_SECTION( " And: " desc, "" ) + +// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required +#else + +#define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" ) +#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "REQUIRE_FALSE" ) + +#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "REQUIRE_THROWS" ) +#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" ) +#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" ) + +#define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" ) +#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CHECK_FALSE" ) +#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" ) +#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" ) +#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" ) + +#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS" ) +#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" ) +#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" ) + +#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" ) +#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" ) + +#define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) +#define WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN", msg ) +#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) +#define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) +#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) + +#ifdef CATCH_CONFIG_VARIADIC_MACROS + #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) + #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) + #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) + #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) + #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__ ) + #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__ ) +#else + #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) + #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) + #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) + #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) + #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg ) + #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg ) +#endif +#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) + +#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) +#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) + +#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) + +#endif + +#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) + +// "BDD-style" convenience wrappers +#ifdef CATCH_CONFIG_VARIADIC_MACROS +#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) +#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) +#else +#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) +#define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) +#endif +#define GIVEN( desc ) SECTION( " Given: " desc, "" ) +#define WHEN( desc ) SECTION( " When: " desc, "" ) +#define AND_WHEN( desc ) SECTION( "And when: " desc, "" ) +#define THEN( desc ) SECTION( " Then: " desc, "" ) +#define AND_THEN( desc ) SECTION( " And: " desc, "" ) + +using Catch::Detail::Approx; + +// #included from: internal/catch_reenable_warnings.h + +#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED + +#ifdef __clang__ +#pragma clang diagnostic pop +#elif defined __GNUC__ +#pragma GCC diagnostic pop +#endif + +#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED + diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 00000000..83d0bbcd --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,21 @@ +set(SRCROOT "${PROJECT_SOURCE_DIR}/test/src") + +SET(SRC + "${SRCROOT}/Main.cpp" + "${SRCROOT}/Vector2.cpp" +) + +include_directories("${PROJECT_SOURCE_DIR}/include") +include_directories("${PROJECT_SOURCE_DIR}/extlibs/headers") + +# Using sfmltest instead of test because the latter is reserved. +add_executable(sfmltest ${SRC}) + +target_link_libraries(sfmltest sfml-graphics sfml-window sfml-audio sfml-network sfml-system) + +add_custom_target(runtests ALL + DEPENDS sfmltest + WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/test" + COMMAND ${CMAKE_COMMAND} -E echo_append "Running test suite..." + COMMAND sfmltest +) diff --git a/test/src/Main.cpp b/test/src/Main.cpp new file mode 100644 index 00000000..b3143fbb --- /dev/null +++ b/test/src/Main.cpp @@ -0,0 +1,2 @@ +#define CATCH_CONFIG_MAIN +#include <catch.hpp> diff --git a/test/src/Vector2.cpp b/test/src/Vector2.cpp new file mode 100644 index 00000000..1a977592 --- /dev/null +++ b/test/src/Vector2.cpp @@ -0,0 +1,222 @@ +#include <SFML/System/Vector2.hpp> +#include <catch.hpp> + +// Use sf::Vector2i for tests. Test coverage is given, as there are no template specializations. + +SCENARIO("Constructing sf::Vector2") +{ + WHEN("default constructor is used") + { + sf::Vector2i vector; + + THEN("x and y are 0") + { + CHECK(vector.x == 0); + CHECK(vector.y == 0); + } + } + + WHEN("x, y constructor is used") + { + sf::Vector2i vector(1, 2); + + THEN("x and y are set accordingly") + { + CHECK(vector.x == 1); + CHECK(vector.y == 2); + } + } + + GIVEN("a vector of a different type") + { + sf::Vector2f sourceVector(1.0f, 2.0f); + + WHEN("a vector is constructed from the another vector") + { + sf::Vector2i vector(sourceVector); + + THEN("x and y are equal to the source vector's elements") + { + CHECK(vector.x == static_cast<int>(sourceVector.x)); + CHECK(vector.y == static_cast<int>(sourceVector.y)); + } + } + } +} + +SCENARIO("sf::Vector2 algebra") +{ + GIVEN("a vector with x and y != 0") + { + sf::Vector2i vector(1, 2); + + WHEN("the vector is negated") + { + sf::Vector2i negatedVector = -vector; + + THEN("x and y are negated") + { + CHECK(negatedVector.x == -1); + CHECK(negatedVector.y == -2); + } + } + } + + GIVEN("two different vectors with x and y != 0") + { + sf::Vector2i firstVector(2, 5); + sf::Vector2i secondVector(8, 3); + + WHEN("one vector is increased by another one") + { + firstVector += secondVector; + + THEN("the first operand's x and y are increased by the second one's") + { + CHECK(firstVector.x == 10); + CHECK(firstVector.y == 8); + } + } + + WHEN("one vector is decreased by another one") + { + firstVector -= secondVector; + + THEN("the first operand's x and y are decreased by the second one's") + { + CHECK(firstVector.x == -6); + CHECK(firstVector.y == 2); + } + } + + WHEN("two vectors are summed") + { + sf::Vector2i result = firstVector + secondVector; + + THEN("the result vector's x and y are the sum of the vectors' x and y") + { + CHECK(result.x == 10); + CHECK(result.y == 8); + } + } + + WHEN("one vector is subtracted from another one") + { + sf::Vector2i result = firstVector - secondVector; + + THEN("the result vector's x and y are the difference of the vectors' x and y") + { + CHECK(result.x == -6); + CHECK(result.y == 2); + } + } + } + + GIVEN("a vector with x and y != 0 and a scalar value") + { + sf::Vector2i vector(26, 12); + int scalar(2); + + WHEN("a vector is multiplied by a scalar") + { + sf::Vector2i result = vector * scalar; + + THEN("the result vector's x and y are the product with the scalar") + { + CHECK(result.x == 52); + CHECK(result.y == 24); + } + } + + WHEN("a scalar is multiplied by a vector") + { + sf::Vector2i result = scalar * vector ; + + THEN("the result vector's x and y are the product with the scalar") + { + CHECK(result.x == 52); + CHECK(result.y == 24); + } + } + + WHEN("a vector is multiplied by a scalar in itself") + { + vector *= scalar; + + THEN("the vector's x and y are the product with the scalar") + { + CHECK(vector.x == 52); + CHECK(vector.y == 24); + } + } + + WHEN("a vector is divided by a scalar") + { + sf::Vector2i result = vector / scalar; + + THEN("the result vector's x and y are the division with the scalar") + { + CHECK(result.x == 13); + CHECK(result.y == 6); + } + } + + WHEN("a vector is divided by a scalar in itself") + { + vector /= scalar; + + THEN("the vector's x and y are the division with the scalar") + { + CHECK(vector.x == 13); + CHECK(vector.y == 6); + } + } + } + + GIVEN("3 vectors, where two are equal") + { + sf::Vector2i firstEqualVector(1, 5); + sf::Vector2i secondEqualVector(1, 5); + sf::Vector2i differentVector(6, 9); + + WHEN("equal vectors are tested for equality") + { + bool equal = (firstEqualVector == secondEqualVector); + + THEN("the result is true") + { + CHECK(equal == true); + } + } + + WHEN("different vectors are tested for equality") + { + bool equal = (firstEqualVector == differentVector); + + THEN("the result is false") + { + CHECK(equal == false); + } + } + + WHEN("equal vectors are tested for inequality") + { + bool equal = (firstEqualVector != secondEqualVector); + + THEN("the result is false") + { + CHECK(equal == false); + } + } + + WHEN("different vectors are tested for inequality") + { + bool equal = (firstEqualVector != differentVector); + + THEN("the result is true") + { + CHECK(equal == true); + } + } + } +} From a85dc6dabbc86be16fe558a342cd7700dc509437 Mon Sep 17 00:00:00 2001 From: Jan Haller <bromeon@gmail.com> Date: Sun, 26 Apr 2015 15:24:49 +0200 Subject: [PATCH 152/211] Rewrote Vector2 tests in a more concise way --- test/src/Vector2.cpp | 180 +++++++++++++------------------------------ 1 file changed, 53 insertions(+), 127 deletions(-) diff --git a/test/src/Vector2.cpp b/test/src/Vector2.cpp index 1a977592..92fde45b 100644 --- a/test/src/Vector2.cpp +++ b/test/src/Vector2.cpp @@ -3,220 +3,146 @@ // Use sf::Vector2i for tests. Test coverage is given, as there are no template specializations. -SCENARIO("Constructing sf::Vector2") +TEST_CASE("sf::Vector2 class") { - WHEN("default constructor is used") + SECTION("Construction") { - sf::Vector2i vector; - - THEN("x and y are 0") + SECTION("Default constructor") { + sf::Vector2i vector; CHECK(vector.x == 0); CHECK(vector.y == 0); } - } - WHEN("x, y constructor is used") - { - sf::Vector2i vector(1, 2); - - THEN("x and y are set accordingly") + SECTION("(x,y) coordinate constructor") { + sf::Vector2i vector(1, 2); CHECK(vector.x == 1); CHECK(vector.y == 2); } - } - GIVEN("a vector of a different type") - { - sf::Vector2f sourceVector(1.0f, 2.0f); - - WHEN("a vector is constructed from the another vector") + SECTION("Conversion constructor") { + sf::Vector2f sourceVector(1.0f, 2.0f); sf::Vector2i vector(sourceVector); - THEN("x and y are equal to the source vector's elements") - { - CHECK(vector.x == static_cast<int>(sourceVector.x)); - CHECK(vector.y == static_cast<int>(sourceVector.y)); - } + CHECK(vector.x == static_cast<int>(sourceVector.x)); + CHECK(vector.y == static_cast<int>(sourceVector.y)); } } -} -SCENARIO("sf::Vector2 algebra") -{ - GIVEN("a vector with x and y != 0") + SECTION("Unary operations") { - sf::Vector2i vector(1, 2); - - WHEN("the vector is negated") + SECTION("-vector") { + sf::Vector2i vector(1, 2); sf::Vector2i negatedVector = -vector; - THEN("x and y are negated") - { - CHECK(negatedVector.x == -1); - CHECK(negatedVector.y == -2); - } + CHECK(negatedVector.x == -1); + CHECK(negatedVector.y == -2); } } - GIVEN("two different vectors with x and y != 0") + SECTION("Arithmetic operations between two vectors") { sf::Vector2i firstVector(2, 5); sf::Vector2i secondVector(8, 3); - WHEN("one vector is increased by another one") + SECTION("vector += vector") { firstVector += secondVector; - THEN("the first operand's x and y are increased by the second one's") - { - CHECK(firstVector.x == 10); - CHECK(firstVector.y == 8); - } + CHECK(firstVector.x == 10); + CHECK(firstVector.y == 8); } - WHEN("one vector is decreased by another one") + SECTION("vector -= vector") { firstVector -= secondVector; - THEN("the first operand's x and y are decreased by the second one's") - { - CHECK(firstVector.x == -6); - CHECK(firstVector.y == 2); - } + CHECK(firstVector.x == -6); + CHECK(firstVector.y == 2); } - WHEN("two vectors are summed") + SECTION("vector + vector") { sf::Vector2i result = firstVector + secondVector; - THEN("the result vector's x and y are the sum of the vectors' x and y") - { - CHECK(result.x == 10); - CHECK(result.y == 8); - } + CHECK(result.x == 10); + CHECK(result.y == 8); } - WHEN("one vector is subtracted from another one") + SECTION("vector - vector") { sf::Vector2i result = firstVector - secondVector; - THEN("the result vector's x and y are the difference of the vectors' x and y") - { - CHECK(result.x == -6); - CHECK(result.y == 2); - } + CHECK(result.x == -6); + CHECK(result.y == 2); } } - GIVEN("a vector with x and y != 0 and a scalar value") + SECTION("Arithmetic operations between vector and scalar value") { sf::Vector2i vector(26, 12); - int scalar(2); + int scalar = 2; - WHEN("a vector is multiplied by a scalar") + SECTION("vector * scalar") { sf::Vector2i result = vector * scalar; - THEN("the result vector's x and y are the product with the scalar") - { - CHECK(result.x == 52); - CHECK(result.y == 24); - } + CHECK(result.x == 52); + CHECK(result.y == 24); } - WHEN("a scalar is multiplied by a vector") + SECTION("scalar * vector") { - sf::Vector2i result = scalar * vector ; + sf::Vector2i result = scalar * vector; - THEN("the result vector's x and y are the product with the scalar") - { - CHECK(result.x == 52); - CHECK(result.y == 24); - } + CHECK(result.x == 52); + CHECK(result.y == 24); } - WHEN("a vector is multiplied by a scalar in itself") + SECTION("vector *= scalar") { vector *= scalar; - THEN("the vector's x and y are the product with the scalar") - { - CHECK(vector.x == 52); - CHECK(vector.y == 24); - } + CHECK(vector.x == 52); + CHECK(vector.y == 24); } - WHEN("a vector is divided by a scalar") + SECTION("vector / scalar") { sf::Vector2i result = vector / scalar; - THEN("the result vector's x and y are the division with the scalar") - { - CHECK(result.x == 13); - CHECK(result.y == 6); - } + CHECK(result.x == 13); + CHECK(result.y == 6); } - WHEN("a vector is divided by a scalar in itself") + SECTION("vector /= scalar") { vector /= scalar; - THEN("the vector's x and y are the division with the scalar") - { - CHECK(vector.x == 13); - CHECK(vector.y == 6); - } + CHECK(vector.x == 13); + CHECK(vector.y == 6); } } - GIVEN("3 vectors, where two are equal") + SECTION("Comparison operations (two equal and one different vector)") { sf::Vector2i firstEqualVector(1, 5); sf::Vector2i secondEqualVector(1, 5); sf::Vector2i differentVector(6, 9); - WHEN("equal vectors are tested for equality") + SECTION("vector == vector") { - bool equal = (firstEqualVector == secondEqualVector); - - THEN("the result is true") - { - CHECK(equal == true); - } + CHECK(firstEqualVector == secondEqualVector); + CHECK_FALSE(firstEqualVector == differentVector); } - WHEN("different vectors are tested for equality") + SECTION("vector != vector") { - bool equal = (firstEqualVector == differentVector); - - THEN("the result is false") - { - CHECK(equal == false); - } - } - - WHEN("equal vectors are tested for inequality") - { - bool equal = (firstEqualVector != secondEqualVector); - - THEN("the result is false") - { - CHECK(equal == false); - } - } - - WHEN("different vectors are tested for inequality") - { - bool equal = (firstEqualVector != differentVector); - - THEN("the result is true") - { - CHECK(equal == true); - } + CHECK(firstEqualVector != differentVector); + CHECK_FALSE(firstEqualVector != secondEqualVector); } } } From 5b08f8133fd05b763209ca303220a3ca7626ecbd Mon Sep 17 00:00:00 2001 From: Jan Haller <bromeon@gmail.com> Date: Tue, 28 Apr 2015 21:54:03 +0200 Subject: [PATCH 153/211] Used LF as line ending; added line break for echo output winline --- test/CMakeLists.txt | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 83d0bbcd..1cd27fc2 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,21 +1,21 @@ -set(SRCROOT "${PROJECT_SOURCE_DIR}/test/src") - -SET(SRC - "${SRCROOT}/Main.cpp" - "${SRCROOT}/Vector2.cpp" -) - -include_directories("${PROJECT_SOURCE_DIR}/include") -include_directories("${PROJECT_SOURCE_DIR}/extlibs/headers") - -# Using sfmltest instead of test because the latter is reserved. -add_executable(sfmltest ${SRC}) - -target_link_libraries(sfmltest sfml-graphics sfml-window sfml-audio sfml-network sfml-system) - -add_custom_target(runtests ALL - DEPENDS sfmltest - WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/test" - COMMAND ${CMAKE_COMMAND} -E echo_append "Running test suite..." - COMMAND sfmltest -) +set(SRCROOT "${PROJECT_SOURCE_DIR}/test/src") + +SET(SRC + "${SRCROOT}/Main.cpp" + "${SRCROOT}/Vector2.cpp" +) + +include_directories("${PROJECT_SOURCE_DIR}/include") +include_directories("${PROJECT_SOURCE_DIR}/extlibs/headers") + +# Using sfmltest instead of test because the latter is reserved. +add_executable(sfmltest ${SRC}) + +target_link_libraries(sfmltest sfml-graphics sfml-window sfml-audio sfml-network sfml-system) + +add_custom_target(runtests ALL + DEPENDS sfmltest + WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/test" + COMMAND ${CMAKE_COMMAND} -E echo "Running test suite..." + COMMAND sfmltest +) From 620c9989d682f4aa9851a55ef0a73a36b11c5e7b Mon Sep 17 00:00:00 2001 From: Zack Mulgrew <zack@zackthehuman.com> Date: Mon, 27 Apr 2015 21:07:19 -0700 Subject: [PATCH 154/211] Add unit test for Rect.hpp --- test/CMakeLists.txt | 1 + test/src/Rect.cpp | 120 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 test/src/Rect.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 1cd27fc2..aab0467e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -3,6 +3,7 @@ set(SRCROOT "${PROJECT_SOURCE_DIR}/test/src") SET(SRC "${SRCROOT}/Main.cpp" "${SRCROOT}/Vector2.cpp" + "${SRCROOT}/Rect.cpp" ) include_directories("${PROJECT_SOURCE_DIR}/include") diff --git a/test/src/Rect.cpp b/test/src/Rect.cpp new file mode 100644 index 00000000..a6eabe06 --- /dev/null +++ b/test/src/Rect.cpp @@ -0,0 +1,120 @@ +#include <SFML/Graphics/Rect.hpp> +#include <SFML/System/Vector2.hpp> +#include <catch.hpp> + +TEST_CASE("sf::Rect class") +{ + 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); + } +} From c3e5a35a6edb876f0265065b9402e533055d938f Mon Sep 17 00:00:00 2001 From: Jan Haller <bromeon@gmail.com> Date: Tue, 28 Apr 2015 21:37:01 +0200 Subject: [PATCH 155/211] Added string conversions for equality-comparable classes Provides a Catch::toString() overload for the following SFML classes, that support at least operator== and operator!=, and can thus be used in Catch assertion expressions: * String * Time * Vector2<T> * Vector3<T> * VideoMode * Color * Rect<T> The intermediate header UnitTests.hpp is introduced to ensure string conversion visibility. Do not include <catch.hpp> directly any longer. --- test/CMakeLists.txt | 1 + test/src/Rect.cpp | 2 +- test/src/UnitTests.cpp | 42 ++++++++++++++++++++++++++++++ test/src/UnitTests.hpp | 58 ++++++++++++++++++++++++++++++++++++++++++ test/src/Vector2.cpp | 2 +- 5 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 test/src/UnitTests.cpp create mode 100644 test/src/UnitTests.hpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index aab0467e..2ea08f4a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -2,6 +2,7 @@ set(SRCROOT "${PROJECT_SOURCE_DIR}/test/src") SET(SRC "${SRCROOT}/Main.cpp" + "${SRCROOT}/UnitTests.cpp" "${SRCROOT}/Vector2.cpp" "${SRCROOT}/Rect.cpp" ) diff --git a/test/src/Rect.cpp b/test/src/Rect.cpp index a6eabe06..f6b06ee2 100644 --- a/test/src/Rect.cpp +++ b/test/src/Rect.cpp @@ -1,6 +1,6 @@ #include <SFML/Graphics/Rect.hpp> #include <SFML/System/Vector2.hpp> -#include <catch.hpp> +#include "UnitTests.hpp" TEST_CASE("sf::Rect class") { diff --git a/test/src/UnitTests.cpp b/test/src/UnitTests.cpp new file mode 100644 index 00000000..74f72b08 --- /dev/null +++ b/test/src/UnitTests.cpp @@ -0,0 +1,42 @@ +// Note: No need to increase compile time by including UnitTests.hpp +#include <SFML/System/String.hpp> +#include <SFML/System/Time.hpp> +#include <SFML/Window/VideoMode.hpp> +#include <SFML/Graphics/Color.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(); + } + + std::string toString(const sf::VideoMode& videoMode) + { + std::ostringstream stream; + stream << videoMode.width << "x" << videoMode.height << "x" << videoMode.bitsPerPixel; + return stream.str(); + } + + 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/UnitTests.hpp b/test/src/UnitTests.hpp new file mode 100644 index 00000000..0e11c952 --- /dev/null +++ b/test/src/UnitTests.hpp @@ -0,0 +1,58 @@ +// Header for SFML unit tests. +// +// For a new 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_UNITTESTS_HPP +#define SFML_UNITTESTS_HPP + +#include <SFML/System/Vector2.hpp> +#include <SFML/System/Vector3.hpp> +#include <SFML/Graphics/Rect.hpp> +#include <sstream> +#include <catch.hpp> + + +// Forward declarations for non-template types +namespace sf +{ + class Color; + class String; + class Time; + class VideoMode; +} + +// String conversions for Catch framework +namespace Catch +{ + std::string toString(const sf::String& string); + std::string toString(sf::Time time); + std::string toString(const sf::VideoMode& videoMode); + std::string toString(const sf::Color& color); + + 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(); + } + + 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_UNITTESTS_HPP diff --git a/test/src/Vector2.cpp b/test/src/Vector2.cpp index 92fde45b..50a53b4a 100644 --- a/test/src/Vector2.cpp +++ b/test/src/Vector2.cpp @@ -1,5 +1,5 @@ #include <SFML/System/Vector2.hpp> -#include <catch.hpp> +#include "UnitTests.hpp" // Use sf::Vector2i for tests. Test coverage is given, as there are no template specializations. From 11b3fe4283a64fd90fd1a5fe053b2913e913c94e Mon Sep 17 00:00:00 2001 From: Jan Haller <bromeon@gmail.com> Date: Tue, 28 Apr 2015 22:46:24 +0200 Subject: [PATCH 156/211] Added tags (module names) in TEST_CASE macros --- test/src/Rect.cpp | 2 +- test/src/Vector2.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/Rect.cpp b/test/src/Rect.cpp index f6b06ee2..70bd4838 100644 --- a/test/src/Rect.cpp +++ b/test/src/Rect.cpp @@ -2,7 +2,7 @@ #include <SFML/System/Vector2.hpp> #include "UnitTests.hpp" -TEST_CASE("sf::Rect class") +TEST_CASE("sf::Rect class template", "[graphics]") { SECTION("Construction") { diff --git a/test/src/Vector2.cpp b/test/src/Vector2.cpp index 50a53b4a..556a4952 100644 --- a/test/src/Vector2.cpp +++ b/test/src/Vector2.cpp @@ -3,7 +3,7 @@ // Use sf::Vector2i for tests. Test coverage is given, as there are no template specializations. -TEST_CASE("sf::Vector2 class") +TEST_CASE("sf::Vector2 class template", "[system]") { SECTION("Construction") { From 7d496095a54697a408150ae651ddb671b4835e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Tue, 14 Aug 2018 22:56:34 +0200 Subject: [PATCH 157/211] Updated catch to v1.12.2 --- extlibs/headers/catch.hpp | 6566 ++++++++++++++++++++++++++----------- test/CMakeLists.txt | 1 + test/src/UnitTests.cpp | 1 - 3 files changed, 4630 insertions(+), 1938 deletions(-) diff --git a/extlibs/headers/catch.hpp b/extlibs/headers/catch.hpp index 6b8dfb5e..fdb046fe 100644 --- a/extlibs/headers/catch.hpp +++ b/extlibs/headers/catch.hpp @@ -1,6 +1,6 @@ /* - * CATCH v1.0 build 53 (master branch) - * Generated: 2014-08-20 08:08:19.533804 + * Catch v1.12.2 + * Generated: 2018-05-14 15:10:01.112442 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. @@ -13,31 +13,43 @@ #define TWOBLUECUBES_CATCH_HPP_INCLUDED +#ifdef __clang__ +# pragma clang system_header +#elif defined __GNUC__ +# pragma GCC system_header +#endif + // #included from: internal/catch_suppress_warnings.h -#define TWOBLUECUBES_CATCH_SUPPRESS_WARNINGS_H_INCLUDED - #ifdef __clang__ -#pragma clang diagnostic ignored "-Wglobal-constructors" -#pragma clang diagnostic ignored "-Wvariadic-macros" -#pragma clang diagnostic ignored "-Wc99-extensions" -#pragma clang diagnostic ignored "-Wunused-variable" -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#pragma clang diagnostic ignored "-Wc++98-compat" -#pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +# ifdef __ICC // icpc defines the __clang__ macro +# pragma warning(push) +# pragma warning(disable: 161 1682) +# else // __ICC +# pragma clang diagnostic ignored "-Wglobal-constructors" +# pragma clang diagnostic ignored "-Wvariadic-macros" +# pragma clang diagnostic ignored "-Wc99-extensions" +# pragma clang diagnostic ignored "-Wunused-variable" +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wpadded" +# pragma clang diagnostic ignored "-Wc++98-compat" +# pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +# pragma clang diagnostic ignored "-Wswitch-enum" +# pragma clang diagnostic ignored "-Wcovered-switch-default" +# endif #elif defined __GNUC__ -#pragma GCC diagnostic ignored "-Wvariadic-macros" -#pragma GCC diagnostic ignored "-Wunused-variable" -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wpadded" +# pragma GCC diagnostic ignored "-Wvariadic-macros" +# pragma GCC diagnostic ignored "-Wunused-variable" +# pragma GCC diagnostic ignored "-Wparentheses" + +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpadded" +#endif +#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) +# define CATCH_IMPL #endif -#ifdef CATCH_CONFIG_MAIN -# define CATCH_CONFIG_RUNNER -#endif - -#ifdef CATCH_CONFIG_RUNNER +#ifdef CATCH_IMPL # ifndef CLARA_CONFIG_MAIN # define CLARA_CONFIG_MAIN_NOT_DEFINED # define CLARA_CONFIG_MAIN @@ -50,84 +62,132 @@ // #included from: catch_common.h #define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED -#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line -#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) - -#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr -#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) - -#include <sstream> -#include <stdexcept> -#include <algorithm> - // #included from: catch_compiler_capabilities.h #define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED -// Much of the following code is based on Boost (1.53) +// Detect a number of compiler features - mostly C++11/14 conformance - by compiler +// The following features are defined: +// +// CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported? +// CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported? +// CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods +// CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported? +// CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported +// CATCH_CONFIG_CPP11_LONG_LONG : is long long supported? +// CATCH_CONFIG_CPP11_OVERRIDE : is override supported? +// CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) +// CATCH_CONFIG_CPP11_SHUFFLE : is std::shuffle supported? +// CATCH_CONFIG_CPP11_TYPE_TRAITS : are type_traits and enable_if supported? + +// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported? + +// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported? +// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? +// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? +// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? +// **************** +// Note to maintainers: if new toggles are added please document them +// in configuration.md, too +// **************** + +// In general each macro has a _NO_<feature name> form +// (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature. +// Many features, at point of detection, define an _INTERNAL_ macro, so they +// can be combined, en-mass, with the _NO_ forms later. + +// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11 + +#ifdef __cplusplus + +# if __cplusplus >= 201103L +# define CATCH_CPP11_OR_GREATER +# endif + +# if __cplusplus >= 201402L +# define CATCH_CPP14_OR_GREATER +# endif + +#endif #ifdef __clang__ # if __has_feature(cxx_nullptr) -# define CATCH_CONFIG_CPP11_NULLPTR +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR # endif # if __has_feature(cxx_noexcept) -# define CATCH_CONFIG_CPP11_NOEXCEPT +# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT # endif +# if defined(CATCH_CPP11_OR_GREATER) +# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + _Pragma( "clang diagnostic push" ) \ + _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) +# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + _Pragma( "clang diagnostic pop" ) + +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + _Pragma( "clang diagnostic push" ) \ + _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) +# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ + _Pragma( "clang diagnostic pop" ) +# endif + #endif // __clang__ +//////////////////////////////////////////////////////////////////////////////// +// We know some environments not to support full POSIX signals +#if defined(__CYGWIN__) || defined(__QNX__) + +# if !defined(CATCH_CONFIG_POSIX_SIGNALS) +# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS +# endif + +#endif + +#ifdef __OS400__ +# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS +# define CATCH_CONFIG_COLOUR_NONE +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Cygwin +#ifdef __CYGWIN__ + +// Required for some versions of Cygwin to declare gettimeofday +// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin +# define _BSD_SOURCE + +#endif // __CYGWIN__ + //////////////////////////////////////////////////////////////////////////////// // Borland #ifdef __BORLANDC__ -#if (__BORLANDC__ > 0x582 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - #endif // __BORLANDC__ //////////////////////////////////////////////////////////////////////////////// // EDG #ifdef __EDG_VERSION__ -#if (__EDG_VERSION__ > 238 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - #endif // __EDG_VERSION__ //////////////////////////////////////////////////////////////////////////////// // Digital Mars #ifdef __DMC__ -#if (__DMC__ > 0x840 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - #endif // __DMC__ //////////////////////////////////////////////////////////////////////////////// // GCC #ifdef __GNUC__ -#if __GNUC__ < 3 +# if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# endif -#if (__GNUC_MINOR__ >= 96 ) -//#define CATCH_CONFIG_SFINAE -#endif - -#elif __GNUC__ >= 3 - -// #define CATCH_CONFIG_SFINAE // Taking this out completely for now - -#endif // __GNUC__ < 3 - -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) ) - -#define CATCH_CONFIG_CPP11_NULLPTR -#endif +// - otherwise more recent versions define __cplusplus >= 201103L +// and will get picked up below #endif // __GNUC__ @@ -135,20 +195,44 @@ // Visual C++ #ifdef _MSC_VER -#if (_MSC_VER >= 1310 ) // (VC++ 7.0+) -//#define CATCH_CONFIG_SFINAE // Not confirmed +#define CATCH_INTERNAL_CONFIG_WINDOWS_SEH + +#if (_MSC_VER >= 1600) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +#endif + +#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) +#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT +#define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE +#define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS #endif #endif // _MSC_VER +//////////////////////////////////////////////////////////////////////////////// + // Use variadic macros if the compiler supports them #if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ ( defined __GNUC__ && __GNUC__ >= 3 ) || \ ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) -#ifndef CATCH_CONFIG_NO_VARIADIC_MACROS -#define CATCH_CONFIG_VARIADIC_MACROS +#define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS + +#endif + +// Use __COUNTER__ if the compiler supports it +#if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \ + ( defined __GNUC__ && ( __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3 )) ) || \ + ( defined __clang__ && __clang_major__ >= 3 ) + +// Use of __COUNTER__ is suppressed during code analysis in CLion/AppCode 2017.2.x and former, +// because __COUNTER__ is not properly handled by it. +// This does not affect compilation +#if ( !defined __JETBRAINS_IDE__ || __JETBRAINS_IDE__ >= 20170300L ) + #define CATCH_INTERNAL_CONFIG_COUNTER #endif #endif @@ -156,12 +240,104 @@ //////////////////////////////////////////////////////////////////////////////// // C++ language feature support -// detect language version: -#if (__cplusplus == 201103L) -# define CATCH_CPP11 -# define CATCH_CPP11_OR_GREATER -#elif (__cplusplus >= 201103L) -# define CATCH_CPP11_OR_GREATER +// catch all support for C++11 +#if defined(CATCH_CPP11_OR_GREATER) + +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT +# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +# define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM +# define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM +# endif + +# ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE +# define CATCH_INTERNAL_CONFIG_CPP11_TUPLE +# endif + +# ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS +# define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS +# endif + +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) +# define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG +# endif + +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) +# define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE +# endif +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) +# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +# endif +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) +# define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE +# endif +# if !defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) +# define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS +# endif + +#endif // __cplusplus >= 201103L + +// Now set the actual defines based on the above + anything the user has configured +#if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_NULLPTR +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_NOEXCEPT +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_GENERATED_METHODS +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_NO_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_IS_ENUM +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_TUPLE +#endif +#if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS) +# define CATCH_CONFIG_VARIADIC_MACROS +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_LONG_LONG +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_OVERRIDE +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_UNIQUE_PTR +#endif +#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) +# define CATCH_CONFIG_COUNTER +#endif +#if defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_NO_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_SHUFFLE +#endif +# if defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_NO_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_NO_CPP11) +# define CATCH_CONFIG_CPP11_TYPE_TRAITS +# endif +#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) +# define CATCH_CONFIG_WINDOWS_SEH +#endif +// This is set by default, because we assume that unix compilers are posix-signal-compatible by default. +#if !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) +# define CATCH_CONFIG_POSIX_SIGNALS +#endif + +#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS +# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS +# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS #endif // noexcept support: @@ -173,11 +349,61 @@ # define CATCH_NOEXCEPT_IS(x) #endif +// nullptr support +#ifdef CATCH_CONFIG_CPP11_NULLPTR +# define CATCH_NULL nullptr +#else +# define CATCH_NULL NULL +#endif + +// override support +#ifdef CATCH_CONFIG_CPP11_OVERRIDE +# define CATCH_OVERRIDE override +#else +# define CATCH_OVERRIDE +#endif + +// unique_ptr support +#ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR +# define CATCH_AUTO_PTR( T ) std::unique_ptr<T> +#else +# define CATCH_AUTO_PTR( T ) std::auto_ptr<T> +#endif + +#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line +#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) +#ifdef CATCH_CONFIG_COUNTER +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) +#else +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) +#endif + +#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr +#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) + +#include <sstream> +#include <algorithm> + namespace Catch { + struct IConfig; + + struct CaseSensitive { enum Choice { + Yes, + No + }; }; + class NonCopyable { - NonCopyable( NonCopyable const& ); - void operator = ( NonCopyable const& ); +#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + NonCopyable( NonCopyable const& ) = delete; + NonCopyable( NonCopyable && ) = delete; + NonCopyable& operator = ( NonCopyable const& ) = delete; + NonCopyable& operator = ( NonCopyable && ) = delete; +#else + NonCopyable( NonCopyable const& info ); + NonCopyable& operator = ( NonCopyable const& ); +#endif + protected: NonCopyable() {} virtual ~NonCopyable(); @@ -195,14 +421,14 @@ namespace Catch { }; template<typename ContainerT> - inline void deleteAll( ContainerT& container ) { + void deleteAll( ContainerT& container ) { typename ContainerT::const_iterator it = container.begin(); typename ContainerT::const_iterator itEnd = container.end(); for(; it != itEnd; ++it ) delete *it; } template<typename AssociativeContainerT> - inline void deleteAllValues( AssociativeContainerT& container ) { + void deleteAllValues( AssociativeContainerT& container ) { typename AssociativeContainerT::const_iterator it = container.begin(); typename AssociativeContainerT::const_iterator itEnd = container.end(); for(; it != itEnd; ++it ) @@ -210,11 +436,14 @@ namespace Catch { } bool startsWith( std::string const& s, std::string const& prefix ); + bool startsWith( std::string const& s, char prefix ); bool endsWith( std::string const& s, std::string const& suffix ); + bool endsWith( std::string const& s, char suffix ); bool contains( std::string const& s, std::string const& infix ); void toLowerInPlace( std::string& s ); std::string toLower( std::string const& s ); std::string trim( std::string const& str ); + bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ); struct pluralise { pluralise( std::size_t count, std::string const& label ); @@ -229,16 +458,17 @@ namespace Catch { SourceLineInfo(); SourceLineInfo( char const* _file, std::size_t _line ); - SourceLineInfo( SourceLineInfo const& other ); -# ifdef CATCH_CPP11_OR_GREATER +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS + SourceLineInfo(SourceLineInfo const& other) = default; SourceLineInfo( SourceLineInfo && ) = default; SourceLineInfo& operator = ( SourceLineInfo const& ) = default; SourceLineInfo& operator = ( SourceLineInfo && ) = default; # endif bool empty() const; bool operator == ( SourceLineInfo const& other ) const; + bool operator < ( SourceLineInfo const& other ) const; - std::string file; + char const* file; std::size_t line; }; @@ -251,6 +481,9 @@ namespace Catch { void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); + void seedRng( IConfig const& config ); + unsigned int rngSeed(); + // Use this in variadic streaming macros to allow // >> +StreamEndStop // as well as @@ -269,15 +502,12 @@ namespace Catch { #define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) ) #define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); -#include <ostream> - namespace Catch { class NotImplementedException : public std::exception { public: NotImplementedException( SourceLineInfo const& lineInfo ); - NotImplementedException( NotImplementedException const& ) {} virtual ~NotImplementedException() CATCH_NOEXCEPT {} @@ -336,7 +566,7 @@ namespace Catch { template<typename T> class Ptr { public: - Ptr() : m_p( NULL ){} + Ptr() : m_p( CATCH_NULL ){} Ptr( T* p ) : m_p( p ){ if( m_p ) m_p->addRef(); @@ -352,7 +582,7 @@ namespace Catch { void reset() { if( m_p ) m_p->release(); - m_p = NULL; + m_p = CATCH_NULL; } Ptr& operator = ( T* p ){ Ptr temp( p ); @@ -365,12 +595,11 @@ namespace Catch { return *this; } void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } - T* get() { return m_p; } - const T* get() const{ return m_p; } + T* get() const{ return m_p; } T& operator*() const { return *m_p; } T* operator->() const { return m_p; } - bool operator !() const { return m_p == NULL; } - operator SafeBool::type() const { return SafeBool::makeSafe( m_p != NULL ); } + bool operator !() const { return m_p == CATCH_NULL; } + operator SafeBool::type() const { return SafeBool::makeSafe( m_p != CATCH_NULL ); } private: T* m_p; @@ -404,10 +633,6 @@ namespace Catch { #pragma clang diagnostic pop #endif -#include <memory> -#include <vector> -#include <stdlib.h> - namespace Catch { class TestCase; @@ -467,9 +692,13 @@ namespace Catch { struct ITestCaseRegistry { virtual ~ITestCaseRegistry(); virtual std::vector<TestCase> const& getAllTests() const = 0; - virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector<TestCase>& matchingTestCases ) const = 0; - + virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const = 0; }; + + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); + std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ); + std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ); + } namespace Catch { @@ -502,27 +731,32 @@ struct NameAndDesc { const char* description; }; +void registerTestCase + ( ITestCase* testCase, + char const* className, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ); + struct AutoReg { - AutoReg( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); + AutoReg + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ); template<typename C> - AutoReg( void (C::*method)(), - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - registerTestCase( new MethodTestCase<C>( method ), - className, - nameAndDesc, - lineInfo ); - } + AutoReg + ( void (C::*method)(), + char const* className, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ) { - void registerTestCase( ITestCase* testCase, - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ); + registerTestCase + ( new MethodTestCase<C>( method ), + className, + nameAndDesc, + lineInfo ); + } ~AutoReg(); @@ -531,49 +765,86 @@ private: void operator= ( AutoReg const& ); }; +void registerTestCaseFunction + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ); + } // end namespace Catch #ifdef CATCH_CONFIG_VARIADIC_MACROS /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ + static void TestName(); \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); } /* NOLINT */ \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + static void TestName() #define INTERNAL_CATCH_TESTCASE( ... ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } /* NOLINT */ \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\ + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ + struct TestName : ClassName{ \ void test(); \ }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); /* NOLINT */ \ } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + void TestName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); /* NOLINT */ \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS #else /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \ + static void TestName(); \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); } /* NOLINT */ \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + static void TestName() #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } /* NOLINT */ \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ + struct TestCaseName : ClassName{ \ void test(); \ }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); /* NOLINT */ \ } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \ + void TestCaseName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \ + CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \ + Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); /* NOLINT */ \ + CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS #endif @@ -603,7 +874,9 @@ namespace Catch { Exception = 0x100 | FailureBit, ThrewException = Exception | 1, - DidntThrowException = Exception | 2 + DidntThrowException = Exception | 2, + + FatalErrorCondition = 0x200 | FailureBit }; }; @@ -616,11 +889,11 @@ namespace Catch { // ResultDisposition::Flags enum struct ResultDisposition { enum Flags { - Normal = 0x00, + Normal = 0x01, - ContinueOnFailure = 0x01, // Failures fail test, but execution continues - FalseTest = 0x02, // Prefix expression with ! - SuppressFail = 0x04 // Failures are reported but do not fail the test + ContinueOnFailure = 0x02, // Failures fail test, but execution continues + FalseTest = 0x04, // Prefix expression with ! + SuppressFail = 0x08 // Failures are reported but do not fail the test }; }; inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { @@ -640,27 +913,83 @@ namespace Catch { namespace Catch { + struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; + + struct DecomposedExpression + { + virtual ~DecomposedExpression() {} + virtual bool isBinaryExpression() const { + return false; + } + virtual void reconstructExpression( std::string& dest ) const = 0; + + // Only simple binary comparisons can be decomposed. + // If more complex check is required then wrap sub-expressions in parentheses. + template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( T const& ); + template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( T const& ); + template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( T const& ); + template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( T const& ); + template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator % ( T const& ); + template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( T const& ); + template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( T const& ); + + private: + DecomposedExpression& operator = (DecomposedExpression const&); + }; + struct AssertionInfo { - AssertionInfo() {} - AssertionInfo( std::string const& _macroName, + AssertionInfo(); + AssertionInfo( char const * _macroName, SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ); + char const * _capturedExpression, + ResultDisposition::Flags _resultDisposition, + char const * _secondArg = ""); - std::string macroName; + char const * macroName; SourceLineInfo lineInfo; - std::string capturedExpression; + char const * capturedExpression; ResultDisposition::Flags resultDisposition; + char const * secondArg; }; struct AssertionResultData { - AssertionResultData() : resultType( ResultWas::Unknown ) {} + AssertionResultData() : decomposedExpression( CATCH_NULL ) + , resultType( ResultWas::Unknown ) + , negated( false ) + , parenthesized( false ) {} - std::string reconstructedExpression; + void negate( bool parenthesize ) { + negated = !negated; + parenthesized = parenthesize; + if( resultType == ResultWas::Ok ) + resultType = ResultWas::ExpressionFailed; + else if( resultType == ResultWas::ExpressionFailed ) + resultType = ResultWas::Ok; + } + + std::string const& reconstructExpression() const { + if( decomposedExpression != CATCH_NULL ) { + decomposedExpression->reconstructExpression( reconstructedExpression ); + if( parenthesized ) { + reconstructedExpression.insert( 0, 1, '(' ); + reconstructedExpression.append( 1, ')' ); + } + if( negated ) { + reconstructedExpression.insert( 0, 1, '!' ); + } + decomposedExpression = CATCH_NULL; + } + return reconstructedExpression; + } + + mutable DecomposedExpression const* decomposedExpression; + mutable std::string reconstructedExpression; std::string message; ResultWas::OfType resultType; + bool negated; + bool parenthesized; }; class AssertionResult { @@ -668,7 +997,7 @@ namespace Catch { AssertionResult(); AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); ~AssertionResult(); -# ifdef CATCH_CPP11_OR_GREATER +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS AssertionResult( AssertionResult const& ) = default; AssertionResult( AssertionResult && ) = default; AssertionResult& operator = ( AssertionResult const& ) = default; @@ -687,6 +1016,8 @@ namespace Catch { std::string getMessage() const; SourceLineInfo getSourceInfo() const; std::string getTestMacroName() const; + void discardDecomposedExpression() const; + void expandDecomposedExpression() const; protected: AssertionInfo m_info; @@ -695,77 +1026,259 @@ namespace Catch { } // end namespace Catch +// #included from: catch_matchers.hpp +#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED + +namespace Catch { +namespace Matchers { + namespace Impl { + + template<typename ArgT> struct MatchAllOf; + template<typename ArgT> struct MatchAnyOf; + template<typename ArgT> struct MatchNotOf; + + class MatcherUntypedBase { + public: + std::string toString() const { + if( m_cachedToString.empty() ) + m_cachedToString = describe(); + return m_cachedToString; + } + + protected: + virtual ~MatcherUntypedBase(); + virtual std::string describe() const = 0; + mutable std::string m_cachedToString; + private: + MatcherUntypedBase& operator = ( MatcherUntypedBase const& ); + }; + + template<typename ObjectT> + struct MatcherMethod { + virtual bool match( ObjectT const& arg ) const = 0; + }; + template<typename PtrT> + struct MatcherMethod<PtrT*> { + virtual bool match( PtrT* arg ) const = 0; + }; + + template<typename ObjectT, typename ComparatorT = ObjectT> + struct MatcherBase : MatcherUntypedBase, MatcherMethod<ObjectT> { + + MatchAllOf<ComparatorT> operator && ( MatcherBase const& other ) const; + MatchAnyOf<ComparatorT> operator || ( MatcherBase const& other ) const; + MatchNotOf<ComparatorT> operator ! () const; + }; + + template<typename ArgT> + struct MatchAllOf : MatcherBase<ArgT> { + virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if (!m_matchers[i]->match(arg)) + return false; + } + return true; + } + virtual std::string describe() const CATCH_OVERRIDE { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if( i != 0 ) + description += " and "; + description += m_matchers[i]->toString(); + } + description += " )"; + return description; + } + + MatchAllOf<ArgT>& operator && ( MatcherBase<ArgT> const& other ) { + m_matchers.push_back( &other ); + return *this; + } + + std::vector<MatcherBase<ArgT> const*> m_matchers; + }; + template<typename ArgT> + struct MatchAnyOf : MatcherBase<ArgT> { + + virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if (m_matchers[i]->match(arg)) + return true; + } + return false; + } + virtual std::string describe() const CATCH_OVERRIDE { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + for( std::size_t i = 0; i < m_matchers.size(); ++i ) { + if( i != 0 ) + description += " or "; + description += m_matchers[i]->toString(); + } + description += " )"; + return description; + } + + MatchAnyOf<ArgT>& operator || ( MatcherBase<ArgT> const& other ) { + m_matchers.push_back( &other ); + return *this; + } + + std::vector<MatcherBase<ArgT> const*> m_matchers; + }; + + template<typename ArgT> + struct MatchNotOf : MatcherBase<ArgT> { + + MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {} + + virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE { + return !m_underlyingMatcher.match( arg ); + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "not " + m_underlyingMatcher.toString(); + } + MatcherBase<ArgT> const& m_underlyingMatcher; + }; + + template<typename ObjectT, typename ComparatorT> + MatchAllOf<ComparatorT> MatcherBase<ObjectT, ComparatorT>::operator && ( MatcherBase const& other ) const { + return MatchAllOf<ComparatorT>() && *this && other; + } + template<typename ObjectT, typename ComparatorT> + MatchAnyOf<ComparatorT> MatcherBase<ObjectT, ComparatorT>::operator || ( MatcherBase const& other ) const { + return MatchAnyOf<ComparatorT>() || *this || other; + } + template<typename ObjectT, typename ComparatorT> + MatchNotOf<ComparatorT> MatcherBase<ObjectT, ComparatorT>::operator ! () const { + return MatchNotOf<ComparatorT>( *this ); + } + + } // namespace Impl + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + // - deprecated: prefer ||, && and ! + template<typename T> + Impl::MatchNotOf<T> Not( Impl::MatcherBase<T> const& underlyingMatcher ) { + return Impl::MatchNotOf<T>( underlyingMatcher ); + } + template<typename T> + Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) { + return Impl::MatchAllOf<T>() && m1 && m2; + } + template<typename T> + Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) { + return Impl::MatchAllOf<T>() && m1 && m2 && m3; + } + template<typename T> + Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) { + return Impl::MatchAnyOf<T>() || m1 || m2; + } + template<typename T> + Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) { + return Impl::MatchAnyOf<T>() || m1 || m2 || m3; + } + +} // namespace Matchers + +using namespace Matchers; +using Matchers::Impl::MatcherBase; + +} // namespace Catch + namespace Catch { struct TestFailureException{}; template<typename T> class ExpressionLhs; - struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; - struct CopyableStream { CopyableStream() {} CopyableStream( CopyableStream const& other ) { oss << other.oss.str(); } CopyableStream& operator=( CopyableStream const& other ) { - oss.str(""); + oss.str(std::string()); oss << other.oss.str(); return *this; } std::ostringstream oss; }; - class ResultBuilder { + class ResultBuilder : public DecomposedExpression { public: ResultBuilder( char const* macroName, SourceLineInfo const& lineInfo, char const* capturedExpression, - ResultDisposition::Flags resultDisposition ); + ResultDisposition::Flags resultDisposition, + char const* secondArg = "" ); + ~ResultBuilder(); template<typename T> - ExpressionLhs<T const&> operator->* ( T const& operand ); - ExpressionLhs<bool> operator->* ( bool value ); + ExpressionLhs<T const&> operator <= ( T const& operand ); + ExpressionLhs<bool> operator <= ( bool value ); template<typename T> ResultBuilder& operator << ( T const& value ) { - m_stream.oss << value; + stream().oss << value; return *this; } - template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); - ResultBuilder& setResultType( ResultWas::OfType result ); ResultBuilder& setResultType( bool result ); - ResultBuilder& setLhs( std::string const& lhs ); - ResultBuilder& setRhs( std::string const& rhs ); - ResultBuilder& setOp( std::string const& op ); - void endExpression(); + void endExpression( DecomposedExpression const& expr ); + + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE; - std::string reconstructExpression() const; AssertionResult build() const; + AssertionResult build( DecomposedExpression const& expr ) const; void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); void captureResult( ResultWas::OfType resultType ); void captureExpression(); + void captureExpectedException( std::string const& expectedMessage ); + void captureExpectedException( Matchers::Impl::MatcherBase<std::string> const& matcher ); + void handleResult( AssertionResult const& result ); void react(); bool shouldDebugBreak() const; bool allowThrows() const; + template<typename ArgT, typename MatcherT> + void captureMatch( ArgT const& arg, MatcherT const& matcher, char const* matcherString ); + + void setExceptionGuard(); + void unsetExceptionGuard(); + private: AssertionInfo m_assertionInfo; AssertionResultData m_data; - struct ExprComponents { - ExprComponents() : testFalse( false ) {} - bool testFalse; - std::string lhs, rhs, op; - } m_exprComponents; - CopyableStream m_stream; + + CopyableStream &stream() + { + if(!m_usedStream) + { + m_usedStream = true; + m_stream().oss.str(""); + } + return m_stream(); + } + + static CopyableStream &m_stream() + { + static CopyableStream s; + return s; + } bool m_shouldDebugBreak; bool m_shouldThrow; + bool m_guardException; + bool m_usedStream; }; } // namespace Catch @@ -780,6 +1293,8 @@ namespace Catch { #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4389) // '==' : signed/unsigned mismatch +#pragma warning(disable:4018) // more "signed/unsigned mismatch" +#pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform) #endif #include <cstddef> @@ -805,7 +1320,7 @@ namespace Internal { template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } }; template<typename T> - inline T& opCast(T const& t) { return const_cast<T&>(t); } + T& opCast(T const& t) { return const_cast<T&>(t); } // nullptr_t support based on pull request #154 from Konstantin Baumann #ifdef CATCH_CONFIG_CPP11_NULLPTR @@ -815,42 +1330,42 @@ namespace Internal { // So the compare overloads can be operator agnostic we convey the operator as a template // enum, which is used to specialise an Evaluator for doing the comparison. template<typename T1, typename T2, Operator Op> - class Evaluator{}; + struct Evaluator{}; template<typename T1, typename T2> struct Evaluator<T1, T2, IsEqualTo> { static bool evaluate( T1 const& lhs, T2 const& rhs) { - return opCast( lhs ) == opCast( rhs ); + return bool( opCast( lhs ) == opCast( rhs ) ); } }; template<typename T1, typename T2> struct Evaluator<T1, T2, IsNotEqualTo> { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) != opCast( rhs ); + return bool( opCast( lhs ) != opCast( rhs ) ); } }; template<typename T1, typename T2> struct Evaluator<T1, T2, IsLessThan> { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) < opCast( rhs ); + return bool( opCast( lhs ) < opCast( rhs ) ); } }; template<typename T1, typename T2> struct Evaluator<T1, T2, IsGreaterThan> { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) > opCast( rhs ); + return bool( opCast( lhs ) > opCast( rhs ) ); } }; template<typename T1, typename T2> struct Evaluator<T1, T2, IsGreaterThanOrEqualTo> { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) >= opCast( rhs ); + return bool( opCast( lhs ) >= opCast( rhs ) ); } }; template<typename T1, typename T2> struct Evaluator<T1, T2, IsLessThanOrEqualTo> { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) <= opCast( rhs ); + return bool( opCast( lhs ) <= opCast( rhs ) ); } }; @@ -928,13 +1443,51 @@ namespace Internal { return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) ); } +#ifdef CATCH_CONFIG_CPP11_LONG_LONG + // long long to unsigned X + template<Operator Op> bool compare( long long lhs, unsigned int rhs ) { + return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs ); + } + template<Operator Op> bool compare( long long lhs, unsigned long rhs ) { + return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs ); + } + template<Operator Op> bool compare( long long lhs, unsigned long long rhs ) { + return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs ); + } + template<Operator Op> bool compare( long long lhs, unsigned char rhs ) { + return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs ); + } + + // unsigned long long to X + template<Operator Op> bool compare( unsigned long long lhs, int rhs ) { + return applyEvaluator<Op>( static_cast<long>( lhs ), rhs ); + } + template<Operator Op> bool compare( unsigned long long lhs, long rhs ) { + return applyEvaluator<Op>( static_cast<long>( lhs ), rhs ); + } + template<Operator Op> bool compare( unsigned long long lhs, long long rhs ) { + return applyEvaluator<Op>( static_cast<long>( lhs ), rhs ); + } + template<Operator Op> bool compare( unsigned long long lhs, char rhs ) { + return applyEvaluator<Op>( static_cast<long>( lhs ), rhs ); + } + + // pointer to long long (when comparing against NULL) + template<Operator Op, typename T> bool compare( long long lhs, T* rhs ) { + return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs ); + } + template<Operator Op, typename T> bool compare( T* lhs, long long rhs ) { + return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) ); + } +#endif // CATCH_CONFIG_CPP11_LONG_LONG + #ifdef CATCH_CONFIG_CPP11_NULLPTR // pointer to nullptr_t (when comparing against nullptr) template<Operator Op, typename T> bool compare( std::nullptr_t, T* rhs ) { - return Evaluator<T*, T*, Op>::evaluate( NULL, rhs ); + return Evaluator<T*, T*, Op>::evaluate( nullptr, rhs ); } template<Operator Op, typename T> bool compare( T* lhs, std::nullptr_t ) { - return Evaluator<T*, T*, Op>::evaluate( lhs, NULL ); + return Evaluator<T*, T*, Op>::evaluate( lhs, nullptr ); } #endif // CATCH_CONFIG_CPP11_NULLPTR @@ -948,40 +1501,6 @@ namespace Internal { // #included from: catch_tostring.h #define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED -// #included from: catch_sfinae.hpp -#define TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED - -// Try to detect if the current compiler supports SFINAE - -namespace Catch { - - struct TrueType { - static const bool value = true; - typedef void Enable; - char sizer[1]; - }; - struct FalseType { - static const bool value = false; - typedef void Disable; - char sizer[2]; - }; - -#ifdef CATCH_CONFIG_SFINAE - - template<bool> struct NotABooleanExpression; - - template<bool c> struct If : NotABooleanExpression<c> {}; - template<> struct If<true> : TrueType {}; - template<> struct If<false> : FalseType {}; - - template<int size> struct SizedIf; - template<> struct SizedIf<sizeof(TrueType)> : TrueType {}; - template<> struct SizedIf<sizeof(FalseType)> : FalseType {}; - -#endif // CATCH_CONFIG_SFINAE - -} // end namespace Catch - #include <sstream> #include <iomanip> #include <limits> @@ -1034,35 +1553,65 @@ inline id performOptionalSelector( id obj, SEL sel ) { #endif +#ifdef CATCH_CONFIG_CPP11_TUPLE +#include <tuple> +#endif + +#ifdef CATCH_CONFIG_CPP11_IS_ENUM +#include <type_traits> +#endif + namespace Catch { + +// Why we're here. +template<typename T> +std::string toString( T const& value ); + +// Built in overloads + +std::string toString( std::string const& value ); +std::string toString( std::wstring const& value ); +std::string toString( const char* const value ); +std::string toString( char* const value ); +std::string toString( const wchar_t* const value ); +std::string toString( wchar_t* const value ); +std::string toString( int value ); +std::string toString( unsigned long value ); +std::string toString( unsigned int value ); +std::string toString( const double value ); +std::string toString( const float value ); +std::string toString( bool value ); +std::string toString( char value ); +std::string toString( signed char value ); +std::string toString( unsigned char value ); + +#ifdef CATCH_CONFIG_CPP11_LONG_LONG +std::string toString( long long value ); +std::string toString( unsigned long long value ); +#endif + +#ifdef CATCH_CONFIG_CPP11_NULLPTR +std::string toString( std::nullptr_t ); +#endif + +#ifdef __OBJC__ + std::string toString( NSString const * const& nsstring ); + std::string toString( NSString * CATCH_ARC_STRONG & nsstring ); + std::string toString( NSObject* const& nsObject ); +#endif + namespace Detail { -// SFINAE is currently disabled by default for all compilers. -// If the non SFINAE version of IsStreamInsertable is ambiguous for you -// and your compiler supports SFINAE, try #defining CATCH_CONFIG_SFINAE -#ifdef CATCH_CONFIG_SFINAE - - template<typename T> - class IsStreamInsertableHelper { - template<int N> struct TrueIfSizeable : TrueType {}; - - template<typename T2> - static TrueIfSizeable<sizeof((*(std::ostream*)0) << *((T2 const*)0))> dummy(T2*); - static FalseType dummy(...); - - public: - typedef SizedIf<sizeof(dummy((T*)0))> type; - }; - - template<typename T> - struct IsStreamInsertable : IsStreamInsertableHelper<T>::type {}; - -#else + extern const std::string unprintableString; + #if !defined(CATCH_CONFIG_CPP11_STREAM_INSERTABLE_CHECK) struct BorgType { template<typename T> BorgType( T const& ); }; + struct TrueType { char sizer[1]; }; + struct FalseType { char sizer[2]; }; + TrueType& testStreamable( std::ostream& ); FalseType testStreamable( FalseType ); @@ -1074,13 +1623,53 @@ namespace Detail { static T const&t; enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; }; +#else + template<typename T> + class IsStreamInsertable { + template<typename SS, typename TT> + static auto test(int) + -> decltype( std::declval<SS&>() << std::declval<TT>(), std::true_type() ); + template<typename, typename> + static auto test(...) -> std::false_type; + + public: + static const bool value = decltype(test<std::ostream,const T&>(0))::value; + }; #endif +#if defined(CATCH_CONFIG_CPP11_IS_ENUM) + template<typename T, + bool IsEnum = std::is_enum<T>::value + > + struct EnumStringMaker + { + static std::string convert( T const& ) { return unprintableString; } + }; + + template<typename T> + struct EnumStringMaker<T,true> + { + static std::string convert( T const& v ) + { + return ::Catch::toString( + static_cast<typename std::underlying_type<T>::type>(v) + ); + } + }; +#endif template<bool C> struct StringMakerBase { +#if defined(CATCH_CONFIG_CPP11_IS_ENUM) template<typename T> - static std::string convert( T const& ) { return "{?}"; } + static std::string convert( T const& v ) + { + return EnumStringMaker<T>::convert( v ); + } +#else + template<typename T> + static std::string convert( T const& ) { return unprintableString; } +#endif }; template<> @@ -1096,15 +1685,12 @@ namespace Detail { std::string rawMemoryToString( const void *object, std::size_t size ); template<typename T> - inline std::string rawMemoryToString( const T& object ) { + std::string rawMemoryToString( const T& object ) { return rawMemoryToString( &object, sizeof(object) ); } } // end namespace Detail -template<typename T> -std::string toString( T const& value ); - template<typename T> struct StringMaker : Detail::StringMakerBase<Detail::IsStreamInsertable<T>::value> {}; @@ -1114,7 +1700,7 @@ struct StringMaker<T*> { template<typename U> static std::string convert( U* p ) { if( !p ) - return INTERNAL_CATCH_STRINGIFY( NULL ); + return "NULL"; else return Detail::rawMemoryToString( p ); } @@ -1124,7 +1710,7 @@ template<typename R, typename C> struct StringMaker<R C::*> { static std::string convert( R C::* p ) { if( !p ) - return INTERNAL_CATCH_STRINGIFY( NULL ); + return "NULL"; else return Detail::rawMemoryToString( p ); } @@ -1135,12 +1721,59 @@ namespace Detail { std::string rangeToString( InputIterator first, InputIterator last ); } +//template<typename T, typename Allocator> +//struct StringMaker<std::vector<T, Allocator> > { +// static std::string convert( std::vector<T,Allocator> const& v ) { +// return Detail::rangeToString( v.begin(), v.end() ); +// } +//}; + template<typename T, typename Allocator> -struct StringMaker<std::vector<T, Allocator> > { - static std::string convert( std::vector<T,Allocator> const& v ) { - return Detail::rangeToString( v.begin(), v.end() ); +std::string toString( std::vector<T,Allocator> const& v ) { + return Detail::rangeToString( v.begin(), v.end() ); +} + +#ifdef CATCH_CONFIG_CPP11_TUPLE + +// toString for tuples +namespace TupleDetail { + template< + typename Tuple, + std::size_t N = 0, + bool = (N < std::tuple_size<Tuple>::value) + > + struct ElementPrinter { + static void print( const Tuple& tuple, std::ostream& os ) + { + os << ( N ? ", " : " " ) + << Catch::toString(std::get<N>(tuple)); + ElementPrinter<Tuple,N+1>::print(tuple,os); + } + }; + + template< + typename Tuple, + std::size_t N + > + struct ElementPrinter<Tuple,N,false> { + static void print( const Tuple&, std::ostream& ) {} + }; + +} + +template<typename ...Types> +struct StringMaker<std::tuple<Types...>> { + + static std::string convert( const std::tuple<Types...>& tuple ) + { + std::ostringstream os; + os << '{'; + TupleDetail::ElementPrinter<std::tuple<Types...>>::print( tuple, os ); + os << " }"; + return os.str(); } }; +#endif // CATCH_CONFIG_CPP11_TUPLE namespace Detail { template<typename T> @@ -1161,44 +1794,15 @@ std::string toString( T const& value ) { return StringMaker<T>::convert( value ); } -// Built in overloads - -std::string toString( std::string const& value ); -std::string toString( std::wstring const& value ); -std::string toString( const char* const value ); -std::string toString( char* const value ); -std::string toString( const wchar_t* const value ); -std::string toString( wchar_t* const value ); -std::string toString( int value ); -std::string toString( unsigned long value ); -std::string toString( unsigned int value ); -std::string toString( const double value ); -std::string toString( const float value ); -std::string toString( bool value ); -std::string toString( char value ); -std::string toString( signed char value ); -std::string toString( unsigned char value ); - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ); -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ); - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ); - std::string toString( NSObject* const& nsObject ); -#endif - namespace Detail { template<typename InputIterator> std::string rangeToString( InputIterator first, InputIterator last ) { std::ostringstream oss; oss << "{ "; if( first != last ) { - oss << toString( *first ); - for( ++first ; first != last ; ++first ) { - oss << ", " << toString( *first ); - } + oss << Catch::toString( *first ); + for( ++first ; first != last ; ++first ) + oss << ", " << Catch::toString( *first ); } oss << " }"; return oss.str(); @@ -1209,90 +1813,159 @@ std::string toString( std::nullptr_t ); namespace Catch { -// Wraps the LHS of an expression and captures the operator and RHS (if any) - -// wrapping them all in a ResultBuilder object -template<typename T> -class ExpressionLhs { - ExpressionLhs& operator = ( ExpressionLhs const& ); -# ifdef CATCH_CPP11_OR_GREATER - ExpressionLhs& operator = ( ExpressionLhs && ) = delete; -# endif +template<typename LhsT, Internal::Operator Op, typename RhsT> +class BinaryExpression; +template<typename ArgT, typename MatcherT> +class MatchExpression; + +// Wraps the LHS of an expression and overloads comparison operators +// for also capturing those and RHS (if any) +template<typename T> +class ExpressionLhs : public DecomposedExpression { public: - ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ) {} -# ifdef CATCH_CPP11_OR_GREATER - ExpressionLhs( ExpressionLhs const& ) = default; - ExpressionLhs( ExpressionLhs && ) = default; -# endif + ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ), m_truthy(false) {} + + ExpressionLhs& operator = ( const ExpressionLhs& ); template<typename RhsT> - ResultBuilder& operator == ( RhsT const& rhs ) { + BinaryExpression<T, Internal::IsEqualTo, RhsT const&> + operator == ( RhsT const& rhs ) { return captureExpression<Internal::IsEqualTo>( rhs ); } template<typename RhsT> - ResultBuilder& operator != ( RhsT const& rhs ) { + BinaryExpression<T, Internal::IsNotEqualTo, RhsT const&> + operator != ( RhsT const& rhs ) { return captureExpression<Internal::IsNotEqualTo>( rhs ); } template<typename RhsT> - ResultBuilder& operator < ( RhsT const& rhs ) { + BinaryExpression<T, Internal::IsLessThan, RhsT const&> + operator < ( RhsT const& rhs ) { return captureExpression<Internal::IsLessThan>( rhs ); } template<typename RhsT> - ResultBuilder& operator > ( RhsT const& rhs ) { + BinaryExpression<T, Internal::IsGreaterThan, RhsT const&> + operator > ( RhsT const& rhs ) { return captureExpression<Internal::IsGreaterThan>( rhs ); } template<typename RhsT> - ResultBuilder& operator <= ( RhsT const& rhs ) { + BinaryExpression<T, Internal::IsLessThanOrEqualTo, RhsT const&> + operator <= ( RhsT const& rhs ) { return captureExpression<Internal::IsLessThanOrEqualTo>( rhs ); } template<typename RhsT> - ResultBuilder& operator >= ( RhsT const& rhs ) { + BinaryExpression<T, Internal::IsGreaterThanOrEqualTo, RhsT const&> + operator >= ( RhsT const& rhs ) { return captureExpression<Internal::IsGreaterThanOrEqualTo>( rhs ); } - ResultBuilder& operator == ( bool rhs ) { + BinaryExpression<T, Internal::IsEqualTo, bool> operator == ( bool rhs ) { return captureExpression<Internal::IsEqualTo>( rhs ); } - ResultBuilder& operator != ( bool rhs ) { + BinaryExpression<T, Internal::IsNotEqualTo, bool> operator != ( bool rhs ) { return captureExpression<Internal::IsNotEqualTo>( rhs ); } void endExpression() { - bool value = m_lhs ? true : false; + m_truthy = m_lhs ? true : false; m_rb - .setLhs( Catch::toString( value ) ) - .setResultType( value ) - .endExpression(); + .setResultType( m_truthy ) + .endExpression( *this ); } - // Only simple binary expressions are allowed on the LHS. - // If more complex compositions are required then place the sub expression in parentheses - template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& ); - template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& ); - template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& ); - template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& ); - template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { + dest = Catch::toString( m_lhs ); + } private: template<Internal::Operator Op, typename RhsT> - ResultBuilder& captureExpression( RhsT const& rhs ) { - return m_rb - .setResultType( Internal::compare<Op>( m_lhs, rhs ) ) - .setLhs( Catch::toString( m_lhs ) ) - .setRhs( Catch::toString( rhs ) ) - .setOp( Internal::OperatorTraits<Op>::getName() ); + BinaryExpression<T, Op, RhsT&> captureExpression( RhsT& rhs ) const { + return BinaryExpression<T, Op, RhsT&>( m_rb, m_lhs, rhs ); + } + + template<Internal::Operator Op> + BinaryExpression<T, Op, bool> captureExpression( bool rhs ) const { + return BinaryExpression<T, Op, bool>( m_rb, m_lhs, rhs ); } private: ResultBuilder& m_rb; T m_lhs; + bool m_truthy; +}; + +template<typename LhsT, Internal::Operator Op, typename RhsT> +class BinaryExpression : public DecomposedExpression { +public: + BinaryExpression( ResultBuilder& rb, LhsT lhs, RhsT rhs ) + : m_rb( rb ), m_lhs( lhs ), m_rhs( rhs ) {} + + BinaryExpression& operator = ( BinaryExpression& ); + + void endExpression() const { + m_rb + .setResultType( Internal::compare<Op>( m_lhs, m_rhs ) ) + .endExpression( *this ); + } + + virtual bool isBinaryExpression() const CATCH_OVERRIDE { + return true; + } + + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { + std::string lhs = Catch::toString( m_lhs ); + std::string rhs = Catch::toString( m_rhs ); + char delim = lhs.size() + rhs.size() < 40 && + lhs.find('\n') == std::string::npos && + rhs.find('\n') == std::string::npos ? ' ' : '\n'; + dest.reserve( 7 + lhs.size() + rhs.size() ); + // 2 for spaces around operator + // 2 for operator + // 2 for parentheses (conditionally added later) + // 1 for negation (conditionally added later) + dest = lhs; + dest += delim; + dest += Internal::OperatorTraits<Op>::getName(); + dest += delim; + dest += rhs; + } + +private: + ResultBuilder& m_rb; + LhsT m_lhs; + RhsT m_rhs; +}; + +template<typename ArgT, typename MatcherT> +class MatchExpression : public DecomposedExpression { +public: + MatchExpression( ArgT arg, MatcherT matcher, char const* matcherString ) + : m_arg( arg ), m_matcher( matcher ), m_matcherString( matcherString ) {} + + virtual bool isBinaryExpression() const CATCH_OVERRIDE { + return true; + } + + virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE { + std::string matcherAsString = m_matcher.toString(); + dest = Catch::toString( m_arg ); + dest += ' '; + if( matcherAsString == Detail::unprintableString ) + dest += m_matcherString; + else + dest += matcherAsString; + } + +private: + ArgT m_arg; + MatcherT m_matcher; + char const* m_matcherString; }; } // end namespace Catch @@ -1301,14 +1974,22 @@ private: namespace Catch { template<typename T> - inline ExpressionLhs<T const&> ResultBuilder::operator->* ( T const& operand ) { + ExpressionLhs<T const&> ResultBuilder::operator <= ( T const& operand ) { return ExpressionLhs<T const&>( *this, operand ); } - inline ExpressionLhs<bool> ResultBuilder::operator->* ( bool value ) { + inline ExpressionLhs<bool> ResultBuilder::operator <= ( bool value ) { return ExpressionLhs<bool>( *this, value ); } + template<typename ArgT, typename MatcherT> + void ResultBuilder::captureMatch( ArgT const& arg, MatcherT const& matcher, + char const* matcherString ) { + MatchExpression<ArgT const&, MatcherT const&> expr( arg, matcher, matcherString ); + setResultType( matcher.match( arg ) ); + endExpression( expr ); + } + } // namespace Catch // #included from: catch_message.h @@ -1378,6 +2059,7 @@ namespace Catch { class AssertionResult; struct AssertionInfo; struct SectionInfo; + struct SectionEndInfo; struct MessageInfo; class ScopedMessageBuilder; struct Counts; @@ -1389,12 +2071,21 @@ namespace Catch { virtual void assertionEnded( AssertionResult const& result ) = 0; virtual bool sectionStarted( SectionInfo const& sectionInfo, Counts& assertions ) = 0; - virtual void sectionEnded( SectionInfo const& name, Counts const& assertions, double _durationInSeconds ) = 0; + virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; + virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; virtual void pushScopedMessage( MessageInfo const& message ) = 0; virtual void popScopedMessage( MessageInfo const& message ) = 0; virtual std::string getCurrentTestName() const = 0; virtual const AssertionResult* getLastResult() const = 0; + + virtual void exceptionEarlyReported() = 0; + + virtual void handleFatalErrorCondition( std::string const& message ) = 0; + + virtual bool lastAssertionPassed() = 0; + virtual void assertionPassed() = 0; + virtual void assertionRun() = 0; }; IResultCapture& getResultCapture(); @@ -1407,11 +2098,19 @@ namespace Catch { #define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_MAC +# define CATCH_PLATFORM_MAC #elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_IPHONE +# define CATCH_PLATFORM_IPHONE +#elif defined(linux) || defined(__linux) || defined(__linux__) +# define CATCH_PLATFORM_LINUX #elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) -#define CATCH_PLATFORM_WINDOWS +# define CATCH_PLATFORM_WINDOWS +# if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX) +# define CATCH_DEFINES_NOMINMAX +# endif +# if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN) +# define CATCH_DEFINES_WIN32_LEAN_AND_MEAN +# endif #endif #include <string> @@ -1426,27 +2125,36 @@ namespace Catch{ // The following code snippet based on: // http://cocoawithlove.com/2008/03/break-into-debugger.html - #ifdef DEBUG - #if defined(__ppc64__) || defined(__ppc__) - #define CATCH_BREAK_INTO_DEBUGGER() \ - if( Catch::isDebuggerActive() ) { \ - __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ - : : : "memory","r0","r3","r4" ); \ - } - #else - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );} - #endif + #if defined(__ppc64__) || defined(__ppc__) + #define CATCH_TRAP() \ + __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ + : : : "memory","r0","r3","r4" ) /* NOLINT */ + #else + #define CATCH_TRAP() __asm__("int $3\n" : : /* NOLINT */ ) #endif +#elif defined(CATCH_PLATFORM_LINUX) + // If we can use inline assembler, do it because this allows us to break + // directly at the location of the failing check instead of breaking inside + // raise() called from it, i.e. one stack frame below. + #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) + #define CATCH_TRAP() asm volatile ("int $3") /* NOLINT */ + #else // Fall back to the generic way. + #include <signal.h> + + #define CATCH_TRAP() raise(SIGTRAP) + #endif #elif defined(_MSC_VER) - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { __debugbreak(); } + #define CATCH_TRAP() __debugbreak() #elif defined(__MINGW32__) extern "C" __declspec(dllimport) void __stdcall DebugBreak(); - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { DebugBreak(); } + #define CATCH_TRAP() DebugBreak() #endif -#ifndef CATCH_BREAK_INTO_DEBUGGER -#define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); +#ifdef CATCH_TRAP + #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } +#else + #define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); #endif // #included from: catch_interfaces_runner.h @@ -1461,6 +2169,47 @@ namespace Catch { }; } +#if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION) +# define CATCH_INTERNAL_STRINGIFY(expr) #expr +#else +# define CATCH_INTERNAL_STRINGIFY(expr) "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION" +#endif + +#if defined(CATCH_CONFIG_FAST_COMPILE) +/////////////////////////////////////////////////////////////////////////////// +// We can speedup compilation significantly by breaking into debugger lower in +// the callstack, because then we don't have to expand CATCH_BREAK_INTO_DEBUGGER +// macro in each assertion +#define INTERNAL_CATCH_REACT( resultBuilder ) \ + resultBuilder.react(); + +/////////////////////////////////////////////////////////////////////////////// +// Another way to speed-up compilation is to omit local try-catch for REQUIRE* +// macros. +// This can potentially cause false negative, if the test code catches +// the exception before it propagates back up to the runner. +#define INTERNAL_CATCH_TEST_NO_TRY( macroName, resultDisposition, expr ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr), resultDisposition ); \ + __catchResult.setExceptionGuard(); \ + CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + ( __catchResult <= expr ).endExpression(); \ + CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ + __catchResult.unsetExceptionGuard(); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::isTrue( false && static_cast<bool>( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look +// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. + +#define INTERNAL_CHECK_THAT_NO_TRY( macroName, matcher, resultDisposition, arg ) \ + do { \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(arg) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ + __catchResult.setExceptionGuard(); \ + __catchResult.captureMatch( arg, matcher, CATCH_INTERNAL_STRINGIFY(matcher) ); \ + __catchResult.unsetExceptionGuard(); \ + INTERNAL_CATCH_REACT( __catchResult ) \ + } while( Catch::alwaysFalse() ) + +#else /////////////////////////////////////////////////////////////////////////////// // In the event of a failure works out if the debugger needs to be invoked // and/or an exception thrown and takes appropriate action. @@ -1469,36 +2218,40 @@ namespace Catch { #define INTERNAL_CATCH_REACT( resultBuilder ) \ if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ resultBuilder.react(); +#endif /////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \ +#define INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ) \ do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr), resultDisposition ); \ try { \ - ( __catchResult->*expr ).endExpression(); \ + CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + ( __catchResult <= expr ).endExpression(); \ + CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ } \ catch( ... ) { \ - __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \ + __catchResult.useActiveException( resultDisposition ); \ } \ INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && (expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look + } while( Catch::isTrue( false && static_cast<bool>( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look + // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. /////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( Catch::getResultCapture().getLastResult()->succeeded() ) +#define INTERNAL_CATCH_IF( macroName, resultDisposition, expr ) \ + INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \ + if( Catch::getResultCapture().lastAssertionPassed() ) /////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( !Catch::getResultCapture().getLastResult()->succeeded() ) +#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, expr ) \ + INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \ + if( !Catch::getResultCapture().lastAssertionPassed() ) /////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \ +#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, expr ) \ do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr), resultDisposition ); \ try { \ - expr; \ + static_cast<void>(expr); \ __catchResult.captureResult( Catch::ResultWas::Ok ); \ } \ catch( ... ) { \ @@ -1508,16 +2261,16 @@ namespace Catch { } while( Catch::alwaysFalse() ) /////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS( expr, resultDisposition, macroName ) \ +#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, matcher, expr ) \ do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr), resultDisposition, CATCH_INTERNAL_STRINGIFY(matcher) ); \ if( __catchResult.allowThrows() ) \ try { \ - expr; \ + static_cast<void>(expr); \ __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ } \ catch( ... ) { \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ + __catchResult.captureExpectedException( matcher ); \ } \ else \ __catchResult.captureResult( Catch::ResultWas::Ok ); \ @@ -1525,12 +2278,12 @@ namespace Catch { } while( Catch::alwaysFalse() ) /////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \ +#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \ do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr) ", " CATCH_INTERNAL_STRINGIFY(exceptionType), resultDisposition ); \ if( __catchResult.allowThrows() ) \ try { \ - expr; \ + static_cast<void>(expr); \ __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ } \ catch( exceptionType ) { \ @@ -1546,7 +2299,7 @@ namespace Catch { /////////////////////////////////////////////////////////////////////////////// #ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \ + #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \ do { \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ @@ -1554,7 +2307,7 @@ namespace Catch { INTERNAL_CATCH_REACT( __catchResult ) \ } while( Catch::alwaysFalse() ) #else - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \ + #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, log ) \ do { \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ __catchResult << log + ::Catch::StreamEndStop(); \ @@ -1564,21 +2317,15 @@ namespace Catch { #endif /////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_INFO( log, macroName ) \ +#define INTERNAL_CATCH_INFO( macroName, log ) \ Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; /////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \ +#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \ do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg " " #matcher, resultDisposition ); \ + Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(arg) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ try { \ - std::string matcherAsString = ::Catch::Matchers::matcher.toString(); \ - __catchResult \ - .setLhs( Catch::toString( arg ) ) \ - .setRhs( matcherAsString == "{?}" ? #matcher : matcherAsString ) \ - .setOp( "matches" ) \ - .setResultType( ::Catch::Matchers::matcher.match( arg ) ); \ - __catchResult.captureExpression(); \ + __catchResult.captureMatch( arg, matcher, CATCH_INTERNAL_STRINGIFY(matcher) ); \ } catch( ... ) { \ __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ } \ @@ -1591,21 +2338,6 @@ namespace Catch { // #included from: catch_section_info.h #define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED -namespace Catch { - - struct SectionInfo { - SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description = std::string() ); - - std::string name; - std::string description; - SourceLineInfo lineInfo; - }; - -} // end namespace Catch - // #included from: catch_totals.hpp #define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED @@ -1636,6 +2368,9 @@ namespace Catch { bool allPassed() const { return failed == 0 && failedButOk == 0; } + bool allOk() const { + return failed == 0; + } std::size_t passed; std::size_t failed; @@ -1673,27 +2408,59 @@ namespace Catch { }; } -// #included from: catch_timer.h -#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED - -#ifdef CATCH_PLATFORM_WINDOWS -typedef unsigned long long uint64_t; -#else -#include <stdint.h> -#endif +#include <string> namespace Catch { + struct SectionInfo { + SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name, + std::string const& _description = std::string() ); + + std::string name; + std::string description; + SourceLineInfo lineInfo; + }; + + struct SectionEndInfo { + SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds ) + : sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) + {} + + SectionInfo sectionInfo; + Counts prevAssertions; + double durationInSeconds; + }; + +} // end namespace Catch + +// #included from: catch_timer.h +#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED + +#ifdef _MSC_VER + +namespace Catch { + typedef unsigned long long UInt64; +} +#else +#include <stdint.h> +namespace Catch { + typedef uint64_t UInt64; +} +#endif + +namespace Catch { class Timer { public: Timer() : m_ticks( 0 ) {} void start(); - unsigned int getElapsedNanoseconds() const; + unsigned int getElapsedMicroseconds() const; unsigned int getElapsedMilliseconds() const; double getElapsedSeconds() const; private: - uint64_t m_ticks; + UInt64 m_ticks; }; } // namespace Catch @@ -1702,7 +2469,7 @@ namespace Catch { namespace Catch { - class Section { + class Section : NonCopyable { public: Section( SectionInfo const& info ); ~Section(); @@ -1711,15 +2478,6 @@ namespace Catch { operator bool() const; private: -#ifdef CATCH_CPP11_OR_GREATER - Section( Section const& ) = delete; - Section( Section && ) = delete; - Section& operator = ( Section const& ) = delete; - Section& operator = ( Section && ) = delete; -#else - Section( Section const& info ); - Section& operator = ( Section const& ); -#endif SectionInfo m_info; std::string m_name; @@ -1741,7 +2499,6 @@ namespace Catch { // #included from: internal/catch_generators.hpp #define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED -#include <iterator> #include <vector> #include <string> #include <stdlib.h> @@ -1855,7 +2612,7 @@ public: private: void move( CompositeGenerator& other ) { - std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) ); + m_composed.insert( m_composed.end(), other.m_composed.begin(), other.m_composed.end() ); m_totalSize += other.m_totalSize; other.m_composed.clear(); } @@ -1922,6 +2679,8 @@ using namespace Generators; #define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED #include <string> +#include <vector> + // #included from: catch_interfaces_registry_hub.h #define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED @@ -1935,20 +2694,25 @@ namespace Catch { struct IExceptionTranslator; struct IReporterRegistry; struct IReporterFactory; + struct ITagAliasRegistry; struct IRegistryHub { virtual ~IRegistryHub(); virtual IReporterRegistry const& getReporterRegistry() const = 0; virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; + virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0; + virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; }; struct IMutableRegistryHub { virtual ~IMutableRegistryHub(); - virtual void registerReporter( std::string const& name, IReporterFactory* factory ) = 0; + virtual void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) = 0; + virtual void registerListener( Ptr<IReporterFactory> const& factory ) = 0; virtual void registerTest( TestCase const& testInfo ) = 0; virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; + virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0; }; IRegistryHub& getRegistryHub(); @@ -1958,14 +2722,16 @@ namespace Catch { } - namespace Catch { typedef std::string(*exceptionTranslateFunction)(); + struct IExceptionTranslator; + typedef std::vector<const IExceptionTranslator*> ExceptionTranslators; + struct IExceptionTranslator { virtual ~IExceptionTranslator(); - virtual std::string translate() const = 0; + virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0; }; struct IExceptionTranslatorRegistry { @@ -1983,9 +2749,12 @@ namespace Catch { : m_translateFunction( translateFunction ) {} - virtual std::string translate() const { + virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE { try { - throw; + if( it == itEnd ) + throw; + else + return (*it)->translate( it+1, itEnd ); } catch( T& ex ) { return m_translateFunction( ex ); @@ -2006,10 +2775,12 @@ namespace Catch { } /////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \ - namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ) +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ + static std::string translatorName( signature ); \ + namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\ + static std::string translatorName( signature ) + +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) // #included from: internal/catch_approx.hpp #define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED @@ -2017,6 +2788,10 @@ namespace Catch { #include <cmath> #include <limits> +#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) +#include <type_traits> +#endif + namespace Catch { namespace Detail { @@ -2024,30 +2799,112 @@ namespace Detail { public: explicit Approx ( double value ) : m_epsilon( std::numeric_limits<float>::epsilon()*100 ), + m_margin( 0.0 ), m_scale( 1.0 ), m_value( value ) {} - Approx( Approx const& other ) - : m_epsilon( other.m_epsilon ), - m_scale( other.m_scale ), - m_value( other.m_value ) - {} - static Approx custom() { return Approx( 0 ); } +#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx operator()( T value ) { + Approx approx( static_cast<double>(value) ); + approx.epsilon( m_epsilon ); + approx.margin( m_margin ); + approx.scale( m_scale ); + return approx; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + explicit Approx( T value ): Approx(static_cast<double>(value)) + {} + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator == ( const T& lhs, Approx const& rhs ) { + // Thanks to Richard Harris for his help refining this formula + auto lhs_v = double(lhs); + bool relativeOK = std::fabs(lhs_v - rhs.m_value) < rhs.m_epsilon * (rhs.m_scale + (std::max)(std::fabs(lhs_v), std::fabs(rhs.m_value))); + if (relativeOK) { + return true; + } + + return std::fabs(lhs_v - rhs.m_value) <= rhs.m_margin; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator == ( Approx const& lhs, const T& rhs ) { + return operator==( rhs, lhs ); + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator != ( T lhs, Approx const& rhs ) { + return !operator==( lhs, rhs ); + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator != ( Approx const& lhs, T rhs ) { + return !operator==( rhs, lhs ); + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator <= ( T lhs, Approx const& rhs ) { + return double(lhs) < rhs.m_value || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator <= ( Approx const& lhs, T rhs ) { + return lhs.m_value < double(rhs) || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator >= ( T lhs, Approx const& rhs ) { + return double(lhs) > rhs.m_value || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator >= ( Approx const& lhs, T rhs ) { + return lhs.m_value > double(rhs) || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx& epsilon( T newEpsilon ) { + m_epsilon = double(newEpsilon); + return *this; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx& margin( T newMargin ) { + m_margin = double(newMargin); + return *this; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx& scale( T newScale ) { + m_scale = double(newScale); + return *this; + } + +#else + Approx operator()( double value ) { Approx approx( value ); approx.epsilon( m_epsilon ); + approx.margin( m_margin ); approx.scale( m_scale ); return approx; } friend bool operator == ( double lhs, Approx const& rhs ) { // Thanks to Richard Harris for his help refining this formula - return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) ); + bool relativeOK = std::fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( std::fabs(lhs), std::fabs(rhs.m_value) ) ); + if (relativeOK) { + return true; + } + return std::fabs(lhs - rhs.m_value) <= rhs.m_margin; } friend bool operator == ( Approx const& lhs, double rhs ) { @@ -2062,15 +2919,37 @@ namespace Detail { return !operator==( rhs, lhs ); } + friend bool operator <= ( double lhs, Approx const& rhs ) { + return lhs < rhs.m_value || lhs == rhs; + } + + friend bool operator <= ( Approx const& lhs, double rhs ) { + return lhs.m_value < rhs || lhs == rhs; + } + + friend bool operator >= ( double lhs, Approx const& rhs ) { + return lhs > rhs.m_value || lhs == rhs; + } + + friend bool operator >= ( Approx const& lhs, double rhs ) { + return lhs.m_value > rhs || lhs == rhs; + } + Approx& epsilon( double newEpsilon ) { m_epsilon = newEpsilon; return *this; } + Approx& margin( double newMargin ) { + m_margin = newMargin; + return *this; + } + Approx& scale( double newScale ) { m_scale = newScale; return *this; } +#endif std::string toString() const { std::ostringstream oss; @@ -2080,6 +2959,7 @@ namespace Detail { private: double m_epsilon; + double m_margin; double m_scale; double m_value; }; @@ -2092,229 +2972,151 @@ inline std::string toString<Detail::Approx>( Detail::Approx const& value ) { } // end namespace Catch -// #included from: internal/catch_matchers.hpp -#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED +// #included from: internal/catch_matchers_string.h +#define TWOBLUECUBES_CATCH_MATCHERS_STRING_H_INCLUDED namespace Catch { namespace Matchers { - namespace Impl { - - template<typename ExpressionT> - struct Matcher : SharedImpl<IShared> - { - typedef ExpressionT ExpressionType; - - virtual ~Matcher() {} - virtual Ptr<Matcher> clone() const = 0; - virtual bool match( ExpressionT const& expr ) const = 0; - virtual std::string toString() const = 0; - }; - - template<typename DerivedT, typename ExpressionT> - struct MatcherImpl : Matcher<ExpressionT> { - - virtual Ptr<Matcher<ExpressionT> > clone() const { - return Ptr<Matcher<ExpressionT> >( new DerivedT( static_cast<DerivedT const&>( *this ) ) ); - } - }; - - namespace Generic { - - template<typename ExpressionT> - class AllOf : public MatcherImpl<AllOf<ExpressionT>, ExpressionT> { - public: - - AllOf() {} - AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {} - - AllOf& add( Matcher<ExpressionT> const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( !m_matchers[i]->match( expr ) ) - return false; - return true; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " and "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - private: - std::vector<Ptr<Matcher<ExpressionT> > > m_matchers; - }; - - template<typename ExpressionT> - class AnyOf : public MatcherImpl<AnyOf<ExpressionT>, ExpressionT> { - public: - - AnyOf() {} - AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {} - - AnyOf& add( Matcher<ExpressionT> const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( m_matchers[i]->match( expr ) ) - return true; - return false; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " or "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - private: - std::vector<Ptr<Matcher<ExpressionT> > > m_matchers; - }; - - } namespace StdString { - inline std::string makeString( std::string const& str ) { return str; } - inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); } - - struct Equals : MatcherImpl<Equals, std::string> { - Equals( std::string const& str ) : m_str( str ){} - Equals( Equals const& other ) : m_str( other.m_str ){} - - virtual ~Equals(); - - virtual bool match( std::string const& expr ) const { - return m_str == expr; - } - virtual std::string toString() const { - return "equals: \"" + m_str + "\""; - } + struct CasedString + { + CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ); + std::string adjustString( std::string const& str ) const; + std::string caseSensitivitySuffix() const; + CaseSensitive::Choice m_caseSensitivity; std::string m_str; }; - struct Contains : MatcherImpl<Contains, std::string> { - Contains( std::string const& substr ) : m_substr( substr ){} - Contains( Contains const& other ) : m_substr( other.m_substr ){} + struct StringMatcherBase : MatcherBase<std::string> { + StringMatcherBase( std::string const& operation, CasedString const& comparator ); + virtual std::string describe() const CATCH_OVERRIDE; - virtual ~Contains(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) != std::string::npos; - } - virtual std::string toString() const { - return "contains: \"" + m_substr + "\""; - } - - std::string m_substr; + CasedString m_comparator; + std::string m_operation; }; - struct StartsWith : MatcherImpl<StartsWith, std::string> { - StartsWith( std::string const& substr ) : m_substr( substr ){} - StartsWith( StartsWith const& other ) : m_substr( other.m_substr ){} - - virtual ~StartsWith(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) == 0; - } - virtual std::string toString() const { - return "starts with: \"" + m_substr + "\""; - } - - std::string m_substr; + struct EqualsMatcher : StringMatcherBase { + EqualsMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; + }; + struct ContainsMatcher : StringMatcherBase { + ContainsMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; + }; + struct StartsWithMatcher : StringMatcherBase { + StartsWithMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; + }; + struct EndsWithMatcher : StringMatcherBase { + EndsWithMatcher( CasedString const& comparator ); + virtual bool match( std::string const& source ) const CATCH_OVERRIDE; }; - struct EndsWith : MatcherImpl<EndsWith, std::string> { - EndsWith( std::string const& substr ) : m_substr( substr ){} - EndsWith( EndsWith const& other ) : m_substr( other.m_substr ){} - - virtual ~EndsWith(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) == expr.size() - m_substr.size(); - } - virtual std::string toString() const { - return "ends with: \"" + m_substr + "\""; - } - - std::string m_substr; - }; } // namespace StdString - } // namespace Impl // The following functions create the actual matcher objects. // This allows the types to be inferred - template<typename ExpressionT> - inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1, - Impl::Matcher<ExpressionT> const& m2 ) { - return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 ); - } - template<typename ExpressionT> - inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1, - Impl::Matcher<ExpressionT> const& m2, - Impl::Matcher<ExpressionT> const& m3 ) { - return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 ); - } - template<typename ExpressionT> - inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1, - Impl::Matcher<ExpressionT> const& m2 ) { - return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 ); - } - template<typename ExpressionT> - inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1, - Impl::Matcher<ExpressionT> const& m2, - Impl::Matcher<ExpressionT> const& m3 ) { - return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 ); + + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + +} // namespace Matchers +} // namespace Catch + +// #included from: internal/catch_matchers_vector.h +#define TWOBLUECUBES_CATCH_MATCHERS_VECTOR_H_INCLUDED + +namespace Catch { +namespace Matchers { + + namespace Vector { + + template<typename T> + struct ContainsElementMatcher : MatcherBase<std::vector<T>, T> { + + ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {} + + bool match(std::vector<T> const &v) const CATCH_OVERRIDE { + return std::find(v.begin(), v.end(), m_comparator) != v.end(); + } + + virtual std::string describe() const CATCH_OVERRIDE { + return "Contains: " + Catch::toString( m_comparator ); + } + + T const& m_comparator; + }; + + template<typename T> + struct ContainsMatcher : MatcherBase<std::vector<T>, std::vector<T> > { + + ContainsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {} + + bool match(std::vector<T> const &v) const CATCH_OVERRIDE { + // !TBD: see note in EqualsMatcher + if (m_comparator.size() > v.size()) + return false; + for (size_t i = 0; i < m_comparator.size(); ++i) + if (std::find(v.begin(), v.end(), m_comparator[i]) == v.end()) + return false; + return true; + } + virtual std::string describe() const CATCH_OVERRIDE { + return "Contains: " + Catch::toString( m_comparator ); + } + + std::vector<T> const& m_comparator; + }; + + template<typename T> + struct EqualsMatcher : MatcherBase<std::vector<T>, std::vector<T> > { + + EqualsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {} + + bool match(std::vector<T> const &v) const CATCH_OVERRIDE { + // !TBD: This currently works if all elements can be compared using != + // - a more general approach would be via a compare template that defaults + // to using !=. but could be specialised for, e.g. std::vector<T> etc + // - then just call that directly + if (m_comparator.size() != v.size()) + return false; + for (size_t i = 0; i < v.size(); ++i) + if (m_comparator[i] != v[i]) + return false; + return true; + } + virtual std::string describe() const CATCH_OVERRIDE { + return "Equals: " + Catch::toString( m_comparator ); + } + std::vector<T> const& m_comparator; + }; + + } // namespace Vector + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + + template<typename T> + Vector::ContainsMatcher<T> Contains( std::vector<T> const& comparator ) { + return Vector::ContainsMatcher<T>( comparator ); } - inline Impl::StdString::Equals Equals( std::string const& str ) { - return Impl::StdString::Equals( str ); + template<typename T> + Vector::ContainsElementMatcher<T> VectorContains( T const& comparator ) { + return Vector::ContainsElementMatcher<T>( comparator ); } - inline Impl::StdString::Equals Equals( const char* str ) { - return Impl::StdString::Equals( Impl::StdString::makeString( str ) ); - } - inline Impl::StdString::Contains Contains( std::string const& substr ) { - return Impl::StdString::Contains( substr ); - } - inline Impl::StdString::Contains Contains( const char* substr ) { - return Impl::StdString::Contains( Impl::StdString::makeString( substr ) ); - } - inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) { - return Impl::StdString::StartsWith( substr ); - } - inline Impl::StdString::StartsWith StartsWith( const char* substr ) { - return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) ); - } - inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) { - return Impl::StdString::EndsWith( substr ); - } - inline Impl::StdString::EndsWith EndsWith( const char* substr ) { - return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) ); + + template<typename T> + Vector::EqualsMatcher<T> Equals( std::vector<T> const& comparator ) { + return Vector::EqualsMatcher<T>( comparator ); } } // namespace Matchers - -using namespace Matchers; - } // namespace Catch // #included from: internal/catch_interfaces_tag_alias_registry.h @@ -2328,7 +3130,7 @@ using namespace Matchers; namespace Catch { struct TagAlias { - TagAlias( std::string _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} + TagAlias( std::string const& _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} std::string tag; SourceLineInfo lineInfo; @@ -2350,12 +3152,12 @@ namespace Catch { template<typename T> class Option { public: - Option() : nullableValue( NULL ) {} + Option() : nullableValue( CATCH_NULL ) {} Option( T const& _value ) : nullableValue( new( storage ) T( _value ) ) {} Option( Option const& _other ) - : nullableValue( _other ? new( storage ) T( *_other ) : NULL ) + : nullableValue( _other ? new( storage ) T( *_other ) : CATCH_NULL ) {} ~Option() { @@ -2379,7 +3181,7 @@ namespace Catch { void reset() { if( nullableValue ) nullableValue->~T(); - nullableValue = NULL; + nullableValue = CATCH_NULL; } T& operator*() { return *nullableValue; } @@ -2391,17 +3193,27 @@ namespace Catch { return nullableValue ? *nullableValue : defaultValue; } - bool some() const { return nullableValue != NULL; } - bool none() const { return nullableValue == NULL; } + bool some() const { return nullableValue != CATCH_NULL; } + bool none() const { return nullableValue == CATCH_NULL; } - bool operator !() const { return nullableValue == NULL; } + bool operator !() const { return nullableValue == CATCH_NULL; } operator SafeBool::type() const { return SafeBool::makeSafe( some() ); } private: - T* nullableValue; - char storage[sizeof(T)]; + T *nullableValue; + union { + char storage[sizeof(T)]; + + // These are here to force alignment for the storage + long double dummy1; + void (*dummy2)(); + long double dummy3; +#ifdef CATCH_CONFIG_CPP11_LONG_LONG + long long dummy4; +#endif + }; }; } // end namespace Catch @@ -2441,7 +3253,8 @@ namespace Catch { IsHidden = 1 << 1, ShouldFail = 1 << 2, MayFail = 1 << 3, - Throws = 1 << 4 + Throws = 1 << 4, + NonPortable = 1 << 5 }; TestCaseInfo( std::string const& _name, @@ -2452,6 +3265,8 @@ namespace Catch { TestCaseInfo( TestCaseInfo const& other ); + friend void setTags( TestCaseInfo& testCaseInfo, std::set<std::string> const& tags ); + bool isHidden() const; bool throws() const; bool okToFail() const; @@ -2564,7 +3379,7 @@ namespace Catch { inline size_t registerTestMethods() { size_t noTestMethods = 0; - int noClasses = objc_getClassList( NULL, 0 ); + int noClasses = objc_getClassList( CATCH_NULL, 0 ); Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); objc_getClassList( classes, noClasses ); @@ -2597,64 +3412,67 @@ namespace Catch { namespace Impl { namespace NSStringMatchers { - template<typename MatcherT> - struct StringHolder : MatcherImpl<MatcherT, NSString*>{ + struct StringHolder : MatcherBase<NSString*>{ StringHolder( NSString* substr ) : m_substr( [substr copy] ){} StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} StringHolder() { arcSafeRelease( m_substr ); } + virtual bool match( NSString* arg ) const CATCH_OVERRIDE { + return false; + } + NSString* m_substr; }; - struct Equals : StringHolder<Equals> { + struct Equals : StringHolder { Equals( NSString* substr ) : StringHolder( substr ){} - virtual bool match( ExpressionType const& str ) const { + virtual bool match( NSString* str ) const CATCH_OVERRIDE { return (str != nil || m_substr == nil ) && [str isEqualToString:m_substr]; } - virtual std::string toString() const { + virtual std::string describe() const CATCH_OVERRIDE { return "equals string: " + Catch::toString( m_substr ); } }; - struct Contains : StringHolder<Contains> { + struct Contains : StringHolder { Contains( NSString* substr ) : StringHolder( substr ){} - virtual bool match( ExpressionType const& str ) const { + virtual bool match( NSString* str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location != NSNotFound; } - virtual std::string toString() const { + virtual std::string describe() const CATCH_OVERRIDE { return "contains string: " + Catch::toString( m_substr ); } }; - struct StartsWith : StringHolder<StartsWith> { + struct StartsWith : StringHolder { StartsWith( NSString* substr ) : StringHolder( substr ){} - virtual bool match( ExpressionType const& str ) const { + virtual bool match( NSString* str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == 0; } - virtual std::string toString() const { + virtual std::string describe() const CATCH_OVERRIDE { return "starts with: " + Catch::toString( m_substr ); } }; - struct EndsWith : StringHolder<EndsWith> { + struct EndsWith : StringHolder { EndsWith( NSString* substr ) : StringHolder( substr ){} - virtual bool match( ExpressionType const& str ) const { + virtual bool match( NSString* str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == [str length] - [m_substr length]; } - virtual std::string toString() const { + virtual std::string describe() const CATCH_OVERRIDE { return "ends with: " + Catch::toString( m_substr ); } }; @@ -2694,7 +3512,30 @@ return @ desc; \ #endif -#ifdef CATCH_CONFIG_RUNNER +#ifdef CATCH_IMPL + +// !TBD: Move the leak detector code into a separate header +#ifdef CATCH_CONFIG_WINDOWS_CRTDBG +#include <crtdbg.h> +class LeakDetector { +public: + LeakDetector() { + int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); + flag |= _CRTDBG_LEAK_CHECK_DF; + flag |= _CRTDBG_ALLOC_MEM_DF; + _CrtSetDbgFlag(flag); + _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); + // Change this to leaking allocation's number to break there + _CrtSetBreakAlloc(-1); + } +}; +#else +class LeakDetector {}; +#endif + +LeakDetector leakDetector; + // #included from: internal/catch_impl.hpp #define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED @@ -2706,7 +3547,7 @@ return @ desc; \ #pragma clang diagnostic ignored "-Wweak-vtables" #endif -// #included from: catch_runner.hpp +// #included from: ../catch_session.hpp #define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED // #included from: internal/catch_commandline.hpp @@ -2731,6 +3572,69 @@ return @ desc; \ #pragma clang diagnostic ignored "-Wpadded" #endif +// #included from: catch_wildcard_pattern.hpp +#define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED + +#include <stdexcept> + +namespace Catch +{ + class WildcardPattern { + enum WildcardPosition { + NoWildcard = 0, + WildcardAtStart = 1, + WildcardAtEnd = 2, + WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd + }; + + public: + + WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_wildcard( NoWildcard ), + m_pattern( adjustCase( pattern ) ) + { + if( startsWith( m_pattern, '*' ) ) { + m_pattern = m_pattern.substr( 1 ); + m_wildcard = WildcardAtStart; + } + if( endsWith( m_pattern, '*' ) ) { + m_pattern = m_pattern.substr( 0, m_pattern.size()-1 ); + m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd ); + } + } + virtual ~WildcardPattern(); + virtual bool matches( std::string const& str ) const { + switch( m_wildcard ) { + case NoWildcard: + return m_pattern == adjustCase( str ); + case WildcardAtStart: + return endsWith( adjustCase( str ), m_pattern ); + case WildcardAtEnd: + return startsWith( adjustCase( str ), m_pattern ); + case WildcardAtBothEnds: + return contains( adjustCase( str ), m_pattern ); + } + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" +#endif + throw std::logic_error( "Unknown enum" ); +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + } + private: + std::string adjustCase( std::string const& str ) const { + return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; + } + CaseSensitive::Choice m_caseSensitivity; + WildcardPosition m_wildcard; + std::string m_pattern; + }; +} + #include <string> #include <vector> @@ -2742,50 +3646,18 @@ namespace Catch { virtual bool matches( TestCaseInfo const& testCase ) const = 0; }; class NamePattern : public Pattern { - enum WildcardPosition { - NoWildcard = 0, - WildcardAtStart = 1, - WildcardAtEnd = 2, - WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd - }; - public: - NamePattern( std::string const& name ) : m_name( toLower( name ) ), m_wildcard( NoWildcard ) { - if( startsWith( m_name, "*" ) ) { - m_name = m_name.substr( 1 ); - m_wildcard = WildcardAtStart; - } - if( endsWith( m_name, "*" ) ) { - m_name = m_name.substr( 0, m_name.size()-1 ); - m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd ); - } - } + NamePattern( std::string const& name ) + : m_wildcardPattern( toLower( name ), CaseSensitive::No ) + {} virtual ~NamePattern(); virtual bool matches( TestCaseInfo const& testCase ) const { - switch( m_wildcard ) { - case NoWildcard: - return m_name == toLower( testCase.name ); - case WildcardAtStart: - return endsWith( toLower( testCase.name ), m_name ); - case WildcardAtEnd: - return startsWith( toLower( testCase.name ), m_name ); - case WildcardAtBothEnds: - return contains( toLower( testCase.name ), m_name ); - } - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunreachable-code" -#endif - throw std::logic_error( "Unknown enum" ); -#ifdef __clang__ -#pragma clang diagnostic pop -#endif + return m_wildcardPattern.matches( toLower( testCase.name ) ); } private: - std::string m_name; - WildcardPosition m_wildcard; + WildcardPattern m_wildcardPattern; }; + class TagPattern : public Pattern { public: TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} @@ -2796,6 +3668,7 @@ namespace Catch { private: std::string m_tag; }; + class ExcludedPattern : public Pattern { public: ExcludedPattern( Ptr<Pattern> const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} @@ -2810,10 +3683,11 @@ namespace Catch { bool matches( TestCaseInfo const& testCase ) const { // All patterns in a filter must match for the filter to be a match - for( std::vector<Ptr<Pattern> >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) + for( std::vector<Ptr<Pattern> >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) { if( !(*it)->matches( testCase ) ) return false; - return true; + } + return true; } }; @@ -2843,23 +3717,25 @@ namespace Catch { namespace Catch { class TestSpecParser { - enum Mode{ None, Name, QuotedName, Tag }; + enum Mode{ None, Name, QuotedName, Tag, EscapedName }; Mode m_mode; bool m_exclusion; std::size_t m_start, m_pos; std::string m_arg; + std::vector<std::size_t> m_escapeChars; TestSpec::Filter m_currentFilter; TestSpec m_testSpec; ITagAliasRegistry const* m_tagAliases; public: - TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} + TestSpecParser( ITagAliasRegistry const& tagAliases ) :m_mode(None), m_exclusion(false), m_start(0), m_pos(0), m_tagAliases( &tagAliases ) {} TestSpecParser& parse( std::string const& arg ) { m_mode = None; m_exclusion = false; m_start = std::string::npos; m_arg = m_tagAliases->expandAliases( arg ); + m_escapeChars.clear(); for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) visitChar( m_arg[m_pos] ); if( m_mode == Name ) @@ -2878,6 +3754,7 @@ namespace Catch { case '~': m_exclusion = true; return; case '[': return startNewMode( Tag, ++m_pos ); case '"': return startNewMode( QuotedName, ++m_pos ); + case '\\': return escape(); default: startNewMode( Name, m_pos ); break; } } @@ -2893,7 +3770,11 @@ namespace Catch { addPattern<TestSpec::NamePattern>(); startNewMode( Tag, ++m_pos ); } + else if( c == '\\' ) + escape(); } + else if( m_mode == EscapedName ) + m_mode = Name; else if( m_mode == QuotedName && c == '"' ) addPattern<TestSpec::NamePattern>(); else if( m_mode == Tag && c == ']' ) @@ -2903,10 +3784,19 @@ namespace Catch { m_mode = mode; m_start = start; } + void escape() { + if( m_mode == None ) + m_start = m_pos; + m_mode = EscapedName; + m_escapeChars.push_back( m_pos ); + } std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } template<typename T> void addPattern() { std::string token = subString(); + for( size_t i = 0; i < m_escapeChars.size(); ++i ) + token = token.substr( 0, m_escapeChars[i]-m_start-i ) + token.substr( m_escapeChars[i]-m_start-i+1 ); + m_escapeChars.clear(); if( startsWith( token, "exclude:" ) ) { m_exclusion = true; token = token.substr( 8 ); @@ -2940,7 +3830,7 @@ namespace Catch { // #included from: catch_interfaces_config.h #define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED -#include <iostream> +#include <iosfwd> #include <string> #include <vector> @@ -2962,6 +3852,22 @@ namespace Catch { Always, Never }; }; + struct RunTests { enum InWhatOrder { + InDeclarationOrder, + InLexicographicalOrder, + InRandomOrder + }; }; + struct UseColour { enum YesOrNo { + Auto, + Yes, + No + }; }; + struct WaitForKeypress { enum When { + Never, + BeforeStart = 1, + BeforeExit = 2, + BeforeStartAndExit = BeforeStart | BeforeExit + }; }; class TestSpec; @@ -2979,37 +3885,81 @@ namespace Catch { virtual bool showInvisibles() const = 0; virtual ShowDurations::OrNot showDurations() const = 0; virtual TestSpec const& testSpec() const = 0; + virtual RunTests::InWhatOrder runOrder() const = 0; + virtual unsigned int rngSeed() const = 0; + virtual UseColour::YesOrNo useColour() const = 0; + virtual std::vector<std::string> const& getSectionsToRun() const = 0; + }; } // #included from: catch_stream.h #define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED -#include <streambuf> +// #included from: catch_streambuf.h +#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wpadded" -#endif +#include <streambuf> namespace Catch { - class Stream { + class StreamBufBase : public std::streambuf { public: - Stream(); - Stream( std::streambuf* _streamBuf, bool _isOwned ); - void release(); + virtual ~StreamBufBase() CATCH_NOEXCEPT; + }; +} - std::streambuf* streamBuf; +#include <streambuf> +#include <ostream> +#include <fstream> +#include <memory> - private: - bool isOwned; +namespace Catch { + + std::ostream& cout(); + std::ostream& cerr(); + std::ostream& clog(); + + struct IStream { + virtual ~IStream() CATCH_NOEXCEPT; + virtual std::ostream& stream() const = 0; + }; + + class FileStream : public IStream { + mutable std::ofstream m_ofs; + public: + FileStream( std::string const& filename ); + virtual ~FileStream() CATCH_NOEXCEPT; + public: // IStream + virtual std::ostream& stream() const CATCH_OVERRIDE; + }; + + class CoutStream : public IStream { + mutable std::ostream m_os; + public: + CoutStream(); + virtual ~CoutStream() CATCH_NOEXCEPT; + + public: // IStream + virtual std::ostream& stream() const CATCH_OVERRIDE; + }; + + class DebugOutStream : public IStream { + CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf; + mutable std::ostream m_os; + public: + DebugOutStream(); + virtual ~DebugOutStream() CATCH_NOEXCEPT; + + public: // IStream + virtual std::ostream& stream() const CATCH_OVERRIDE; }; } #include <memory> #include <vector> #include <string> -#include <iostream> +#include <stdexcept> #ifndef CATCH_CONFIG_CONSOLE_WIDTH #define CATCH_CONFIG_CONSOLE_WIDTH 80 @@ -3024,40 +3974,55 @@ namespace Catch { listTags( false ), listReporters( false ), listTestNamesOnly( false ), + listExtraInfo( false ), showSuccessfulTests( false ), shouldDebugBreak( false ), noThrow( false ), showHelp( false ), showInvisibles( false ), + filenamesAsTags( false ), + libIdentify( false ), abortAfter( -1 ), + rngSeed( 0 ), verbosity( Verbosity::Normal ), warnings( WarnAbout::Nothing ), - showDurations( ShowDurations::DefaultForReporter ) + showDurations( ShowDurations::DefaultForReporter ), + runOrder( RunTests::InDeclarationOrder ), + useColour( UseColour::Auto ), + waitForKeypress( WaitForKeypress::Never ) {} bool listTests; bool listTags; bool listReporters; bool listTestNamesOnly; + bool listExtraInfo; bool showSuccessfulTests; bool shouldDebugBreak; bool noThrow; bool showHelp; bool showInvisibles; + bool filenamesAsTags; + bool libIdentify; int abortAfter; + unsigned int rngSeed; Verbosity::Level verbosity; WarnAbout::What warnings; ShowDurations::OrNot showDurations; + RunTests::InWhatOrder runOrder; + UseColour::YesOrNo useColour; + WaitForKeypress::When waitForKeypress; - std::string reporterName; std::string outputFilename; std::string name; std::string processName; + std::vector<std::string> reporterNames; std::vector<std::string> testsOrTags; + std::vector<std::string> sectionsToRun; }; class Config : public SharedImpl<IConfig> { @@ -3068,12 +4033,11 @@ namespace Catch { public: Config() - : m_os( std::cout.rdbuf() ) {} Config( ConfigData const& data ) : m_data( data ), - m_os( std::cout.rdbuf() ) + m_stream( openStream() ) { if( !data.testsOrTags.empty() ) { TestSpecParser parser( ITagAliasRegistry::get() ); @@ -3083,14 +4047,7 @@ namespace Catch { } } - virtual ~Config() { - m_os.rdbuf( std::cout.rdbuf() ); - m_stream.release(); - } - - void setFilename( std::string const& filename ) { - m_data.outputFilename = filename; - } + virtual ~Config() {} std::string const& getFilename() const { return m_data.outputFilename ; @@ -3100,44 +4057,48 @@ namespace Catch { bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } bool listTags() const { return m_data.listTags; } bool listReporters() const { return m_data.listReporters; } + bool listExtraInfo() const { return m_data.listExtraInfo; } std::string getProcessName() const { return m_data.processName; } - bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } + std::vector<std::string> const& getReporterNames() const { return m_data.reporterNames; } + std::vector<std::string> const& getSectionsToRun() const CATCH_OVERRIDE { return m_data.sectionsToRun; } - void setStreamBuf( std::streambuf* buf ) { - m_os.rdbuf( buf ? buf : std::cout.rdbuf() ); - } - - void useStream( std::string const& streamName ) { - Stream stream = createStream( streamName ); - setStreamBuf( stream.streamBuf ); - m_stream.release(); - m_stream = stream; - } - - std::string getReporterName() const { return m_data.reporterName; } - - int abortAfter() const { return m_data.abortAfter; } - - TestSpec const& testSpec() const { return m_testSpec; } + virtual TestSpec const& testSpec() const CATCH_OVERRIDE { return m_testSpec; } bool showHelp() const { return m_data.showHelp; } - bool showInvisibles() const { return m_data.showInvisibles; } // IConfig interface - virtual bool allowThrows() const { return !m_data.noThrow; } - virtual std::ostream& stream() const { return m_os; } - virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } - virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; } - virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; } - virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } + virtual bool allowThrows() const CATCH_OVERRIDE { return !m_data.noThrow; } + virtual std::ostream& stream() const CATCH_OVERRIDE { return m_stream->stream(); } + virtual std::string name() const CATCH_OVERRIDE { return m_data.name.empty() ? m_data.processName : m_data.name; } + virtual bool includeSuccessfulResults() const CATCH_OVERRIDE { return m_data.showSuccessfulTests; } + virtual bool warnAboutMissingAssertions() const CATCH_OVERRIDE { return m_data.warnings & WarnAbout::NoAssertions; } + virtual ShowDurations::OrNot showDurations() const CATCH_OVERRIDE { return m_data.showDurations; } + virtual RunTests::InWhatOrder runOrder() const CATCH_OVERRIDE { return m_data.runOrder; } + virtual unsigned int rngSeed() const CATCH_OVERRIDE { return m_data.rngSeed; } + virtual UseColour::YesOrNo useColour() const CATCH_OVERRIDE { return m_data.useColour; } + virtual bool shouldDebugBreak() const CATCH_OVERRIDE { return m_data.shouldDebugBreak; } + virtual int abortAfter() const CATCH_OVERRIDE { return m_data.abortAfter; } + virtual bool showInvisibles() const CATCH_OVERRIDE { return m_data.showInvisibles; } private: + + IStream const* openStream() { + if( m_data.outputFilename.empty() ) + return new CoutStream(); + else if( m_data.outputFilename[0] == '%' ) { + if( m_data.outputFilename == "%debug" ) + return new DebugOutStream(); + else + throw std::domain_error( "Unrecognised stream: " + m_data.outputFilename ); + } + else + return new FileStream( m_data.outputFilename ); + } ConfigData m_data; - Stream m_stream; - mutable std::ostream m_os; + CATCH_AUTO_PTR( IStream const ) m_stream; TestSpec m_testSpec; }; @@ -3157,6 +4118,8 @@ namespace Catch { #define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { // #included from: ../external/clara.h +// Version 0.0.2.4 + // Only use header guard if we are not using an outer namespace #if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) @@ -3181,6 +4144,8 @@ namespace Catch { #include <string> #include <vector> #include <sstream> +#include <algorithm> +#include <cctype> // Use optional outer namespace #ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE @@ -3290,7 +4255,7 @@ namespace Tbc { return oss.str(); } - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { + friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); it != itEnd; ++it ) { if( it != _text.begin() ) @@ -3315,15 +4280,165 @@ namespace Tbc { #endif // TBC_TEXT_FORMAT_H_INCLUDED // ----------- end of #include from tbc_text_format.h ----------- -// ........... back in /Users/philnash/Dev/OSS/Clara/srcs/clara.h +// ........... back in clara.h #undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE +// ----------- #included from clara_compilers.h ----------- + +#ifndef TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED +#define TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED + +// Detect a number of compiler features - mostly C++11/14 conformance - by compiler +// The following features are defined: +// +// CLARA_CONFIG_CPP11_NULLPTR : is nullptr supported? +// CLARA_CONFIG_CPP11_NOEXCEPT : is noexcept supported? +// CLARA_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods +// CLARA_CONFIG_CPP11_OVERRIDE : is override supported? +// CLARA_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) + +// CLARA_CONFIG_CPP11_OR_GREATER : Is C++11 supported? + +// CLARA_CONFIG_VARIADIC_MACROS : are variadic macros supported? + +// In general each macro has a _NO_<feature name> form +// (e.g. CLARA_CONFIG_CPP11_NO_NULLPTR) which disables the feature. +// Many features, at point of detection, define an _INTERNAL_ macro, so they +// can be combined, en-mass, with the _NO_ forms later. + +// All the C++11 features can be disabled with CLARA_CONFIG_NO_CPP11 + +#ifdef __clang__ + +#if __has_feature(cxx_nullptr) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#endif + +#if __has_feature(cxx_noexcept) +#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#endif + +#endif // __clang__ + +//////////////////////////////////////////////////////////////////////////////// +// GCC +#ifdef __GNUC__ + +#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#endif + +// - otherwise more recent versions define __cplusplus >= 201103L +// and will get picked up below + +#endif // __GNUC__ + +//////////////////////////////////////////////////////////////////////////////// +// Visual C++ +#ifdef _MSC_VER + +#if (_MSC_VER >= 1600) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +#endif + +#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) +#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#endif + +#endif // _MSC_VER + +//////////////////////////////////////////////////////////////////////////////// +// C++ language feature support + +// catch all support for C++11 +#if defined(__cplusplus) && __cplusplus >= 201103L + +#define CLARA_CPP11_OR_GREATER + +#if !defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) +#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR +#endif + +#ifndef CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT +#endif + +#ifndef CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS +#endif + +#if !defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) +#define CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE +#endif +#if !defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) +#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR +#endif + +#endif // __cplusplus >= 201103L + +// Now set the actual defines based on the above + anything the user has configured +#if defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NO_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_NULLPTR +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_NOEXCEPT +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_GENERATED_METHODS +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_OVERRIDE) && !defined(CLARA_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_OVERRIDE +#endif +#if defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_UNIQUE_PTR) && !defined(CLARA_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_CPP11) +#define CLARA_CONFIG_CPP11_UNIQUE_PTR +#endif + +// noexcept support: +#if defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_NOEXCEPT) +#define CLARA_NOEXCEPT noexcept +# define CLARA_NOEXCEPT_IS(x) noexcept(x) +#else +#define CLARA_NOEXCEPT throw() +# define CLARA_NOEXCEPT_IS(x) +#endif + +// nullptr support +#ifdef CLARA_CONFIG_CPP11_NULLPTR +#define CLARA_NULL nullptr +#else +#define CLARA_NULL NULL +#endif + +// override support +#ifdef CLARA_CONFIG_CPP11_OVERRIDE +#define CLARA_OVERRIDE override +#else +#define CLARA_OVERRIDE +#endif + +// unique_ptr support +#ifdef CLARA_CONFIG_CPP11_UNIQUE_PTR +# define CLARA_AUTO_PTR( T ) std::unique_ptr<T> +#else +# define CLARA_AUTO_PTR( T ) std::auto_ptr<T> +#endif + +#endif // TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED + +// ----------- end of #include from clara_compilers.h ----------- +// ........... back in clara.h + #include <map> -#include <algorithm> #include <stdexcept> #include <memory> +#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) +#define CLARA_PLATFORM_WINDOWS +#endif + // Use optional outer namespace #ifdef STITCH_CLARA_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE @@ -3372,9 +4487,12 @@ namespace Clara { inline void convertInto( std::string const& _source, std::string& _dest ) { _dest = _source; } + char toLowerCh(char c) { + return static_cast<char>( std::tolower( c ) ); + } inline void convertInto( std::string const& _source, bool& _dest ) { std::string sourceLC = _source; - std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower ); + std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), toLowerCh ); if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) _dest = true; else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) @@ -3382,23 +4500,15 @@ namespace Clara { else throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); } - inline void convertInto( bool _source, bool& _dest ) { - _dest = _source; - } - template<typename T> - inline void convertInto( bool, T& ) { - throw std::runtime_error( "Invalid conversion" ); - } template<typename ConfigT> struct IArgFunction { virtual ~IArgFunction() {} -# ifdef CATCH_CPP11_OR_GREATER +#ifdef CLARA_CONFIG_CPP11_GENERATED_METHODS IArgFunction() = default; IArgFunction( IArgFunction const& ) = default; -# endif +#endif virtual void set( ConfigT& config, std::string const& value ) const = 0; - virtual void setFlag( ConfigT& config ) const = 0; virtual bool takesArg() const = 0; virtual IArgFunction* clone() const = 0; }; @@ -3406,11 +4516,11 @@ namespace Clara { template<typename ConfigT> class BoundArgFunction { public: - BoundArgFunction() : functionObj( NULL ) {} + BoundArgFunction() : functionObj( CLARA_NULL ) {} BoundArgFunction( IArgFunction<ConfigT>* _functionObj ) : functionObj( _functionObj ) {} - BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : NULL ) {} + BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : CLARA_NULL ) {} BoundArgFunction& operator = ( BoundArgFunction const& other ) { - IArgFunction<ConfigT>* newFunctionObj = other.functionObj ? other.functionObj->clone() : NULL; + IArgFunction<ConfigT>* newFunctionObj = other.functionObj ? other.functionObj->clone() : CLARA_NULL; delete functionObj; functionObj = newFunctionObj; return *this; @@ -3420,13 +4530,10 @@ namespace Clara { void set( ConfigT& config, std::string const& value ) const { functionObj->set( config, value ); } - void setFlag( ConfigT& config ) const { - functionObj->setFlag( config ); - } bool takesArg() const { return functionObj->takesArg(); } bool isSet() const { - return functionObj != NULL; + return functionObj != CLARA_NULL; } private: IArgFunction<ConfigT>* functionObj; @@ -3435,7 +4542,6 @@ namespace Clara { template<typename C> struct NullBinder : IArgFunction<C>{ virtual void set( C&, std::string const& ) const {} - virtual void setFlag( C& ) const {} virtual bool takesArg() const { return true; } virtual IArgFunction<C>* clone() const { return new NullBinder( *this ); } }; @@ -3446,9 +4552,6 @@ namespace Clara { virtual void set( C& p, std::string const& stringValue ) const { convertInto( stringValue, p.*member ); } - virtual void setFlag( C& p ) const { - convertInto( true, p.*member ); - } virtual bool takesArg() const { return !IsBool<M>::value; } virtual IArgFunction<C>* clone() const { return new BoundDataMember( *this ); } M C::* member; @@ -3461,11 +4564,6 @@ namespace Clara { convertInto( stringValue, value ); (p.*member)( value ); } - virtual void setFlag( C& p ) const { - typename RemoveConstRef<M>::type value; - convertInto( true, value ); - (p.*member)( value ); - } virtual bool takesArg() const { return !IsBool<M>::value; } virtual IArgFunction<C>* clone() const { return new BoundUnaryMethod( *this ); } void (C::*member)( M ); @@ -3479,9 +4577,6 @@ namespace Clara { if( value ) (p.*member)(); } - virtual void setFlag( C& p ) const { - (p.*member)(); - } virtual bool takesArg() const { return false; } virtual IArgFunction<C>* clone() const { return new BoundNullaryMethod( *this ); } void (C::*member)(); @@ -3496,9 +4591,6 @@ namespace Clara { if( value ) function( obj ); } - virtual void setFlag( C& p ) const { - function( p ); - } virtual bool takesArg() const { return false; } virtual IArgFunction<C>* clone() const { return new BoundUnaryFunction( *this ); } void (*function)( C& ); @@ -3512,11 +4604,6 @@ namespace Clara { convertInto( stringValue, value ); function( obj, value ); } - virtual void setFlag( C& obj ) const { - typename RemoveConstRef<T>::type value; - convertInto( true, value ); - function( obj, value ); - } virtual bool takesArg() const { return !IsBool<T>::value; } virtual IArgFunction<C>* clone() const { return new BoundBinaryFunction( *this ); } void (*function)( C&, T ); @@ -3524,8 +4611,20 @@ namespace Clara { } // namespace Detail - struct Parser { - Parser() : separators( " \t=:" ) {} + inline std::vector<std::string> argsToVector( int argc, char const* const* const argv ) { + std::vector<std::string> args( static_cast<std::size_t>( argc ) ); + for( std::size_t i = 0; i < static_cast<std::size_t>( argc ); ++i ) + args[i] = argv[i]; + + return args; + } + + class Parser { + enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional }; + Mode mode; + std::size_t from; + bool inQuotes; + public: struct Token { enum Type { Positional, ShortOpt, LongOpt }; @@ -3534,38 +4633,77 @@ namespace Clara { std::string data; }; - void parseIntoTokens( int argc, char const * const * argv, std::vector<Parser::Token>& tokens ) const { + Parser() : mode( None ), from( 0 ), inQuotes( false ){} + + void parseIntoTokens( std::vector<std::string> const& args, std::vector<Token>& tokens ) { const std::string doubleDash = "--"; - for( int i = 1; i < argc && argv[i] != doubleDash; ++i ) - parseIntoTokens( argv[i] , tokens); + for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i ) + parseIntoTokens( args[i], tokens); } - void parseIntoTokens( std::string arg, std::vector<Parser::Token>& tokens ) const { - while( !arg.empty() ) { - Parser::Token token( Parser::Token::Positional, arg ); - arg = ""; - if( token.data[0] == '-' ) { - if( token.data.size() > 1 && token.data[1] == '-' ) { - token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) ); - } - else { - token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) ); - if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) { - arg = "-" + token.data.substr( 1 ); - token.data = token.data.substr( 0, 1 ); - } - } - } - if( token.type != Parser::Token::Positional ) { - std::size_t pos = token.data.find_first_of( separators ); - if( pos != std::string::npos ) { - arg = token.data.substr( pos+1 ); - token.data = token.data.substr( 0, pos ); - } - } - tokens.push_back( token ); + + void parseIntoTokens( std::string const& arg, std::vector<Token>& tokens ) { + for( std::size_t i = 0; i < arg.size(); ++i ) { + char c = arg[i]; + if( c == '"' ) + inQuotes = !inQuotes; + mode = handleMode( i, c, arg, tokens ); + } + mode = handleMode( arg.size(), '\0', arg, tokens ); + } + Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) { + switch( mode ) { + case None: return handleNone( i, c ); + case MaybeShortOpt: return handleMaybeShortOpt( i, c ); + case ShortOpt: + case LongOpt: + case SlashOpt: return handleOpt( i, c, arg, tokens ); + case Positional: return handlePositional( i, c, arg, tokens ); + default: throw std::logic_error( "Unknown mode" ); } } - std::string separators; + + Mode handleNone( std::size_t i, char c ) { + if( inQuotes ) { + from = i; + return Positional; + } + switch( c ) { + case '-': return MaybeShortOpt; +#ifdef CLARA_PLATFORM_WINDOWS + case '/': from = i+1; return SlashOpt; +#endif + default: from = i; return Positional; + } + } + Mode handleMaybeShortOpt( std::size_t i, char c ) { + switch( c ) { + case '-': from = i+1; return LongOpt; + default: from = i; return ShortOpt; + } + } + + Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) { + if( std::string( ":=\0", 3 ).find( c ) == std::string::npos ) + return mode; + + std::string optName = arg.substr( from, i-from ); + if( mode == ShortOpt ) + for( std::size_t j = 0; j < optName.size(); ++j ) + tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) ); + else if( mode == SlashOpt && optName.size() == 1 ) + tokens.push_back( Token( Token::ShortOpt, optName ) ); + else + tokens.push_back( Token( Token::LongOpt, optName ) ); + return None; + } + Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) { + if( inQuotes || std::string( "\0", 1 ).find( c ) == std::string::npos ) + return mode; + + std::string data = arg.substr( from, i-from ); + tokens.push_back( Token( Token::Positional, data ) ); + return None; + } }; template<typename ConfigT> @@ -3644,12 +4782,7 @@ namespace Clara { } }; - // NOTE: std::auto_ptr is deprecated in c++11/c++0x -#if defined(__cplusplus) && __cplusplus > 199711L - typedef std::unique_ptr<Arg> ArgAutoPtr; -#else - typedef std::auto_ptr<Arg> ArgAutoPtr; -#endif + typedef CLARA_AUTO_PTR( Arg ) ArgAutoPtr; friend void addOptName( Arg& arg, std::string const& optName ) { @@ -3760,7 +4893,7 @@ namespace Clara { m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) { if( other.m_floatingArg.get() ) - m_floatingArg = ArgAutoPtr( new Arg( *other.m_floatingArg ) ); + m_floatingArg.reset( new Arg( *other.m_floatingArg ) ); } CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { @@ -3788,7 +4921,7 @@ namespace Clara { ArgBuilder operator[]( UnpositionalTag ) { if( m_floatingArg.get() ) throw std::logic_error( "Only one unpositional argument can be added" ); - m_floatingArg = ArgAutoPtr( new Arg() ); + m_floatingArg.reset( new Arg() ); ArgBuilder builder( m_floatingArg.get() ); return builder; } @@ -3873,21 +5006,21 @@ namespace Clara { return oss.str(); } - ConfigT parse( int argc, char const * const * argv ) const { + ConfigT parse( std::vector<std::string> const& args ) const { ConfigT config; - parseInto( argc, argv, config ); + parseInto( args, config ); return config; } - std::vector<Parser::Token> parseInto( int argc, char const * const * argv, ConfigT& config ) const { - std::string processName = argv[0]; + std::vector<Parser::Token> parseInto( std::vector<std::string> const& args, ConfigT& config ) const { + std::string processName = args.empty() ? std::string() : args[0]; std::size_t lastSlash = processName.find_last_of( "/\\" ); if( lastSlash != std::string::npos ) processName = processName.substr( lastSlash+1 ); m_boundProcessName.set( config, processName ); std::vector<Parser::Token> tokens; Parser parser; - parser.parseIntoTokens( argc, argv, tokens ); + parser.parseIntoTokens( args, tokens ); return populate( tokens, config ); } @@ -3918,7 +5051,7 @@ namespace Clara { arg.boundField.set( config, tokens[++i].data ); } else { - arg.boundField.setFlag( config ); + arg.boundField.set( config, "true" ); } break; } @@ -3930,7 +5063,7 @@ namespace Clara { if( it == itEnd ) { if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) unusedTokens.push_back( token ); - else if( m_throwOnUnrecognisedTokens ) + else if( errors.empty() && m_throwOnUnrecognisedTokens ) errors.push_back( "unrecognised option: " + token.data ); } } @@ -4012,6 +5145,7 @@ STITCH_CLARA_CLOSE_NAMESPACE #endif #include <fstream> +#include <ctime> namespace Catch { @@ -4022,13 +5156,36 @@ namespace Catch { config.abortAfter = x; } inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } + inline void addSectionToRun( ConfigData& config, std::string const& sectionName ) { config.sectionsToRun.push_back( sectionName ); } + inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); } inline void addWarning( ConfigData& config, std::string const& _warning ) { if( _warning == "NoAssertions" ) config.warnings = static_cast<WarnAbout::What>( config.warnings | WarnAbout::NoAssertions ); else - throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" ); - + throw std::runtime_error( "Unrecognised warning: '" + _warning + '\'' ); + } + inline void setOrder( ConfigData& config, std::string const& order ) { + if( startsWith( "declared", order ) ) + config.runOrder = RunTests::InDeclarationOrder; + else if( startsWith( "lexical", order ) ) + config.runOrder = RunTests::InLexicographicalOrder; + else if( startsWith( "random", order ) ) + config.runOrder = RunTests::InRandomOrder; + else + throw std::runtime_error( "Unrecognised ordering: '" + order + '\'' ); + } + inline void setRngSeed( ConfigData& config, std::string const& seed ) { + if( seed == "time" ) { + config.rngSeed = static_cast<unsigned int>( std::time(0) ); + } + else { + std::stringstream ss; + ss << seed; + ss >> config.rngSeed; + if( ss.fail() ) + throw std::runtime_error( "Argument to --rng-seed should be the word 'time' or a number" ); + } } inline void setVerbosity( ConfigData& config, int level ) { // !TBD: accept strings? @@ -4039,6 +5196,33 @@ namespace Catch { ? ShowDurations::Always : ShowDurations::Never; } + inline void setUseColour( ConfigData& config, std::string const& value ) { + std::string mode = toLower( value ); + + if( mode == "yes" ) + config.useColour = UseColour::Yes; + else if( mode == "no" ) + config.useColour = UseColour::No; + else if( mode == "auto" ) + config.useColour = UseColour::Auto; + else + throw std::runtime_error( "colour mode must be one of: auto, yes or no" ); + } + inline void setWaitForKeypress( ConfigData& config, std::string const& keypress ) { + std::string keypressLc = toLower( keypress ); + if( keypressLc == "start" ) + config.waitForKeypress = WaitForKeypress::BeforeStart; + else if( keypressLc == "exit" ) + config.waitForKeypress = WaitForKeypress::BeforeExit; + else if( keypressLc == "both" ) + config.waitForKeypress = WaitForKeypress::BeforeStartAndExit; + else + throw std::runtime_error( "keypress argument must be one of: start, exit or both. '" + keypress + "' not recognised" ); + }; + + inline void forceColour( ConfigData& config ) { + config.useColour = UseColour::Yes; + } inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { std::ifstream f( _filename.c_str() ); if( !f.is_open() ) @@ -4047,8 +5231,11 @@ namespace Catch { std::string line; while( std::getline( f, line ) ) { line = trim(line); - if( !line.empty() && !startsWith( line, "#" ) ) - addTestOrTags( config, "\"" + line + "\"," ); + if( !line.empty() && !startsWith( line, '#' ) ) { + if( !startsWith( line, '"' ) ) + line = '"' + line + '"'; + addTestOrTags( config, line + ',' ); + } } } @@ -4094,7 +5281,7 @@ namespace Catch { cli["-r"]["--reporter"] // .placeholder( "name[:filename]" ) .describe( "reporter to use (defaults to console)" ) - .bind( &ConfigData::reporterName, "name" ); + .bind( &addReporterName, "name" ); cli["-n"]["--name"] .describe( "suite name" ) @@ -4125,21 +5312,57 @@ namespace Catch { cli["-d"]["--durations"] .describe( "show test durations" ) - .bind( &setShowDurations, "yes/no" ); + .bind( &setShowDurations, "yes|no" ); cli["-f"]["--input-file"] .describe( "load test names to run from a file" ) .bind( &loadTestNamesFromFile, "filename" ); + cli["-#"]["--filenames-as-tags"] + .describe( "adds a tag for the filename" ) + .bind( &ConfigData::filenamesAsTags ); + + cli["-c"]["--section"] + .describe( "specify section to run" ) + .bind( &addSectionToRun, "section name" ); + // Less common commands which don't have a short form cli["--list-test-names-only"] .describe( "list all/matching test cases names only" ) .bind( &ConfigData::listTestNamesOnly ); + cli["--list-extra-info"] + .describe( "list all/matching test cases with more info" ) + .bind( &ConfigData::listExtraInfo ); + cli["--list-reporters"] .describe( "list all reporters" ) .bind( &ConfigData::listReporters ); + cli["--order"] + .describe( "test case order (defaults to decl)" ) + .bind( &setOrder, "decl|lex|rand" ); + + cli["--rng-seed"] + .describe( "set a specific seed for random numbers" ) + .bind( &setRngSeed, "'time'|number" ); + + cli["--force-colour"] + .describe( "force colourised output (deprecated)" ) + .bind( &forceColour ); + + cli["--use-colour"] + .describe( "should output be colourised" ) + .bind( &setUseColour, "yes|no" ); + + cli["--libidentify"] + .describe( "report name and version according to libidentify standard" ) + .bind( &ConfigData::libIdentify ); + + cli["--wait-for-keypress"] + .describe( "waits for a keypress before exiting" ) + .bind( &setWaitForKeypress, "start|exit|both" ); + return cli; } @@ -4187,19 +5410,16 @@ namespace Tbc { TextAttributes() : initialIndent( std::string::npos ), indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) + width( consoleWidth-1 ) {} TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } std::size_t initialIndent; // indent of first line, or npos std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos }; class Text { @@ -4207,62 +5427,76 @@ namespace Tbc { Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) : attr( _attr ) { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; + const std::string wrappableBeforeChars = "[({<\t"; + const std::string wrappableAfterChars = "])}>-,./|\\"; + const std::string wrappableInsteadOfChars = " \n\r"; + std::string indent = _attr.initialIndent != std::string::npos + ? std::string( _attr.initialIndent, ' ' ) + : std::string( _attr.indent, ' ' ); + + typedef std::string::const_iterator iterator; + iterator it = _str.begin(); + const iterator strEnd = _str.end(); + + while( it != strEnd ) { - while( !remainder.empty() ) { if( lines.size() >= 1000 ) { lines.push_back( "... message truncated due to excessive size" ); return; } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); + std::string suffix; + std::size_t width = (std::min)( static_cast<size_t>( strEnd-it ), _attr.width-static_cast<size_t>( indent.size() ) ); + iterator itEnd = it+width; + iterator itNext = _str.end(); + + iterator itNewLine = std::find( it, itEnd, '\n' ); + if( itNewLine != itEnd ) + itEnd = itNewLine; + + if( itEnd != strEnd ) { + bool foundWrapPoint = false; + iterator findIt = itEnd; + do { + if( wrappableAfterChars.find( *findIt ) != std::string::npos && findIt != itEnd ) { + itEnd = findIt+1; + itNext = findIt+1; + foundWrapPoint = true; + } + else if( findIt > it && wrappableBeforeChars.find( *findIt ) != std::string::npos ) { + itEnd = findIt; + itNext = findIt; + foundWrapPoint = true; + } + else if( wrappableInsteadOfChars.find( *findIt ) != std::string::npos ) { + itNext = findIt+1; + itEnd = findIt; + foundWrapPoint = true; + } + if( findIt == it ) + break; + else + --findIt; + } + while( !foundWrapPoint ); + + if( !foundWrapPoint ) { + // No good wrap char, so we'll break mid word and add a hyphen + --itEnd; + itNext = itEnd; + suffix = "-"; } else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; + while( itEnd > it && wrappableInsteadOfChars.find( *(itEnd-1) ) != std::string::npos ) + --itEnd; } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; } - } - } + lines.push_back( indent + std::string( it, itEnd ) + suffix ); - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); + if( indent.size() != _attr.indent ) + indent = std::string( _attr.indent, ' ' ); + it = itNext; + } } typedef std::vector<std::string>::const_iterator const_iterator; @@ -4313,10 +5547,6 @@ namespace Catch { namespace Catch { - namespace Detail { - struct IColourImpl; - } - struct Colour { enum Code { None = 0, @@ -4362,7 +5592,6 @@ namespace Catch { static void use( Code _colourCode ); private: - static Detail::IColourImpl* impl(); bool m_moved; }; @@ -4376,23 +5605,22 @@ namespace Catch { #include <string> #include <ostream> #include <map> -#include <assert.h> namespace Catch { struct ReporterConfig { - explicit ReporterConfig( Ptr<IConfig> const& _fullConfig ) + explicit ReporterConfig( Ptr<IConfig const> const& _fullConfig ) : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} - ReporterConfig( Ptr<IConfig> const& _fullConfig, std::ostream& _stream ) + ReporterConfig( Ptr<IConfig const> const& _fullConfig, std::ostream& _stream ) : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} std::ostream& stream() const { return *m_stream; } - Ptr<IConfig> fullConfig() const { return m_fullConfig; } + Ptr<IConfig const> fullConfig() const { return m_fullConfig; } private: std::ostream* m_stream; - Ptr<IConfig> m_fullConfig; + Ptr<IConfig const> m_fullConfig; }; struct ReporterPreferences { @@ -4456,7 +5684,7 @@ namespace Catch } virtual ~AssertionStats(); -# ifdef CATCH_CPP11_OR_GREATER +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS AssertionStats( AssertionStats const& ) = default; AssertionStats( AssertionStats && ) = default; AssertionStats& operator = ( AssertionStats const& ) = default; @@ -4479,7 +5707,7 @@ namespace Catch missingAssertions( _missingAssertions ) {} virtual ~SectionStats(); -# ifdef CATCH_CPP11_OR_GREATER +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS SectionStats( SectionStats const& ) = default; SectionStats( SectionStats && ) = default; SectionStats& operator = ( SectionStats const& ) = default; @@ -4506,7 +5734,7 @@ namespace Catch {} virtual ~TestCaseStats(); -# ifdef CATCH_CPP11_OR_GREATER +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS TestCaseStats( TestCaseStats const& ) = default; TestCaseStats( TestCaseStats && ) = default; TestCaseStats& operator = ( TestCaseStats const& ) = default; @@ -4534,7 +5762,7 @@ namespace Catch {} virtual ~TestGroupStats(); -# ifdef CATCH_CPP11_OR_GREATER +# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS TestGroupStats( TestGroupStats const& ) = default; TestGroupStats( TestGroupStats && ) = default; TestGroupStats& operator = ( TestGroupStats const& ) = default; @@ -4556,7 +5784,7 @@ namespace Catch {} virtual ~TestRunStats(); -# ifndef CATCH_CPP11_OR_GREATER +# ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS TestRunStats( TestRunStats const& _other ) : runInfo( _other.runInfo ), totals( _other.totals ), @@ -4574,6 +5802,8 @@ namespace Catch bool aborting; }; + class MultipleReporters; + struct IStreamingReporter : IShared { virtual ~IStreamingReporter(); @@ -4592,27 +5822,37 @@ namespace Catch virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; + // The return value indicates if the messages buffer should be cleared: virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; + virtual void sectionEnded( SectionStats const& sectionStats ) = 0; virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; + + virtual void skipTest( TestCaseInfo const& testInfo ) = 0; + + virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; } }; - struct IReporterFactory { + struct IReporterFactory : IShared { virtual ~IReporterFactory(); virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; virtual std::string getDescription() const = 0; }; struct IReporterRegistry { - typedef std::map<std::string, IReporterFactory*> FactoryMap; + typedef std::map<std::string, Ptr<IReporterFactory> > FactoryMap; + typedef std::vector<Ptr<IReporterFactory> > Listeners; virtual ~IReporterRegistry(); - virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig> const& config ) const = 0; + virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig const> const& config ) const = 0; virtual FactoryMap const& getFactories() const = 0; + virtual Listeners const& getListeners() const = 0; }; + Ptr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter ); + } #include <limits> @@ -4624,19 +5864,19 @@ namespace Catch { TestSpec testSpec = config.testSpec(); if( config.testSpec().hasFilters() ) - std::cout << "Matching test cases:\n"; + Catch::cout() << "Matching test cases:\n"; else { - std::cout << "All available test cases:\n"; + Catch::cout() << "All available test cases:\n"; testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); } std::size_t matchedTests = 0; - TextAttributes nameAttr, tagsAttr; + TextAttributes nameAttr, descAttr, tagsAttr; nameAttr.setInitialIndent( 2 ).setIndent( 4 ); + descAttr.setIndent( 4 ); tagsAttr.setIndent( 6 ); - std::vector<TestCase> matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); + std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); it != itEnd; ++it ) { @@ -4647,15 +5887,22 @@ namespace Catch { : Colour::None; Colour colourGuard( colour ); - std::cout << Text( testCaseInfo.name, nameAttr ) << std::endl; + Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl; + if( config.listExtraInfo() ) { + Catch::cout() << " " << testCaseInfo.lineInfo << std::endl; + std::string description = testCaseInfo.description; + if( description.empty() ) + description = "(NO DESCRIPTION)"; + Catch::cout() << Text( description, descAttr ) << std::endl; + } if( !testCaseInfo.tags.empty() ) - std::cout << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; + Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; } if( !config.testSpec().hasFilters() ) - std::cout << pluralise( matchedTests, "test case" ) << "\n" << std::endl; + Catch::cout() << pluralise( matchedTests, "test case" ) << '\n' << std::endl; else - std::cout << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl; + Catch::cout() << pluralise( matchedTests, "matching test case" ) << '\n' << std::endl; return matchedTests; } @@ -4664,14 +5911,19 @@ namespace Catch { if( !config.testSpec().hasFilters() ) testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); std::size_t matchedTests = 0; - std::vector<TestCase> matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); + std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); it != itEnd; ++it ) { matchedTests++; TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - std::cout << testCaseInfo.name << std::endl; + if( startsWith( testCaseInfo.name, '#' ) ) + Catch::cout() << '"' << testCaseInfo.name << '"'; + else + Catch::cout() << testCaseInfo.name; + if ( config.listExtraInfo() ) + Catch::cout() << "\t@" << testCaseInfo.lineInfo; + Catch::cout() << std::endl; } return matchedTests; } @@ -4697,16 +5949,15 @@ namespace Catch { inline std::size_t listTags( Config const& config ) { TestSpec testSpec = config.testSpec(); if( config.testSpec().hasFilters() ) - std::cout << "Tags for matching test cases:\n"; + Catch::cout() << "Tags for matching test cases:\n"; else { - std::cout << "All available tags:\n"; + Catch::cout() << "All available tags:\n"; testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); } std::map<std::string, TagInfo> tagCounts; - std::vector<TestCase> matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); + std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); it != itEnd; ++it ) { @@ -4733,14 +5984,14 @@ namespace Catch { .setInitialIndent( 0 ) .setIndent( oss.str().size() ) .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); - std::cout << oss.str() << wrapper << "\n"; + Catch::cout() << oss.str() << wrapper << '\n'; } - std::cout << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl; + Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl; return tagCounts.size(); } inline std::size_t listReporters( Config const& /*config*/ ) { - std::cout << "Available reports:\n"; + Catch::cout() << "Available reporters:\n"; IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; std::size_t maxNameLen = 0; @@ -4752,19 +6003,19 @@ namespace Catch { .setInitialIndent( 0 ) .setIndent( 7+maxNameLen ) .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); - std::cout << " " + Catch::cout() << " " << it->first - << ":" + << ':' << std::string( maxNameLen - it->first.size() + 2, ' ' ) - << wrapper << "\n"; + << wrapper << '\n'; } - std::cout << std::endl; + Catch::cout() << std::endl; return factories.size(); } inline Option<std::size_t> list( Config const& config ) { Option<std::size_t> listedCount; - if( config.listTests() ) + if( config.listTests() || ( config.listExtraInfo() && !config.listTestNamesOnly() ) ) listedCount = listedCount.valueOr(0) + listTests( config ); if( config.listTestNamesOnly() ) listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); @@ -4777,144 +6028,578 @@ namespace Catch { } // end namespace Catch -// #included from: internal/catch_runner_impl.hpp +// #included from: internal/catch_run_context.hpp #define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED // #included from: catch_test_case_tracker.hpp #define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED -#include <map> +#include <algorithm> #include <string> #include <assert.h> +#include <vector> +#include <stdexcept> + +CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS namespace Catch { -namespace SectionTracking { +namespace TestCaseTracking { - class TrackedSection { + struct NameAndLocation { + std::string name; + SourceLineInfo location; - typedef std::map<std::string, TrackedSection> TrackedSections; + NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) + : name( _name ), + location( _location ) + {} + }; + + struct ITracker : SharedImpl<> { + virtual ~ITracker(); + + // static queries + virtual NameAndLocation const& nameAndLocation() const = 0; + + // dynamic queries + virtual bool isComplete() const = 0; // Successfully completed or failed + virtual bool isSuccessfullyCompleted() const = 0; + virtual bool isOpen() const = 0; // Started but not complete + virtual bool hasChildren() const = 0; + + virtual ITracker& parent() = 0; + + // actions + virtual void close() = 0; // Successfully complete + virtual void fail() = 0; + virtual void markAsNeedingAnotherRun() = 0; + + virtual void addChild( Ptr<ITracker> const& child ) = 0; + virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) = 0; + virtual void openChild() = 0; + + // Debug/ checking + virtual bool isSectionTracker() const = 0; + virtual bool isIndexTracker() const = 0; + }; + + class TrackerContext { - public: enum RunState { NotStarted, Executing, - ExecutingChildren, - Completed + CompletedCycle }; - TrackedSection( std::string const& name, TrackedSection* parent ) - : m_name( name ), m_runState( NotStarted ), m_parent( parent ) + Ptr<ITracker> m_rootTracker; + ITracker* m_currentTracker; + RunState m_runState; + + public: + + static TrackerContext& instance() { + static TrackerContext s_instance; + return s_instance; + } + + TrackerContext() + : m_currentTracker( CATCH_NULL ), + m_runState( NotStarted ) {} - RunState runState() const { return m_runState; } + ITracker& startRun(); - TrackedSection* findChild( std::string const& childName ) { - TrackedSections::iterator it = m_children.find( childName ); - return it != m_children.end() - ? &it->second - : NULL; + void endRun() { + m_rootTracker.reset(); + m_currentTracker = CATCH_NULL; + m_runState = NotStarted; } - TrackedSection* acquireChild( std::string const& childName ) { - if( TrackedSection* child = findChild( childName ) ) - return child; - m_children.insert( std::make_pair( childName, TrackedSection( childName, this ) ) ); - return findChild( childName ); + + void startCycle() { + m_currentTracker = m_rootTracker.get(); + m_runState = Executing; } - void enter() { - if( m_runState == NotStarted ) - m_runState = Executing; + void completeCycle() { + m_runState = CompletedCycle; } - void leave() { - for( TrackedSections::const_iterator it = m_children.begin(), itEnd = m_children.end(); - it != itEnd; - ++it ) - if( it->second.runState() != Completed ) { - m_runState = ExecutingChildren; - return; - } - m_runState = Completed; + + bool completedCycle() const { + return m_runState == CompletedCycle; } - TrackedSection* getParent() { - return m_parent; + ITracker& currentTracker() { + return *m_currentTracker; } - bool hasChildren() const { + void setCurrentTracker( ITracker* tracker ) { + m_currentTracker = tracker; + } + }; + + class TrackerBase : public ITracker { + protected: + enum CycleState { + NotStarted, + Executing, + ExecutingChildren, + NeedsAnotherRun, + CompletedSuccessfully, + Failed + }; + class TrackerHasName { + NameAndLocation m_nameAndLocation; + public: + TrackerHasName( NameAndLocation const& nameAndLocation ) : m_nameAndLocation( nameAndLocation ) {} + bool operator ()( Ptr<ITracker> const& tracker ) { + return + tracker->nameAndLocation().name == m_nameAndLocation.name && + tracker->nameAndLocation().location == m_nameAndLocation.location; + } + }; + typedef std::vector<Ptr<ITracker> > Children; + NameAndLocation m_nameAndLocation; + TrackerContext& m_ctx; + ITracker* m_parent; + Children m_children; + CycleState m_runState; + public: + TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : m_nameAndLocation( nameAndLocation ), + m_ctx( ctx ), + m_parent( parent ), + m_runState( NotStarted ) + {} + virtual ~TrackerBase(); + + virtual NameAndLocation const& nameAndLocation() const CATCH_OVERRIDE { + return m_nameAndLocation; + } + virtual bool isComplete() const CATCH_OVERRIDE { + return m_runState == CompletedSuccessfully || m_runState == Failed; + } + virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE { + return m_runState == CompletedSuccessfully; + } + virtual bool isOpen() const CATCH_OVERRIDE { + return m_runState != NotStarted && !isComplete(); + } + virtual bool hasChildren() const CATCH_OVERRIDE { return !m_children.empty(); } - private: - std::string m_name; - RunState m_runState; - TrackedSections m_children; - TrackedSection* m_parent; + virtual void addChild( Ptr<ITracker> const& child ) CATCH_OVERRIDE { + m_children.push_back( child ); + } + virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) CATCH_OVERRIDE { + Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( nameAndLocation ) ); + return( it != m_children.end() ) + ? it->get() + : CATCH_NULL; + } + virtual ITracker& parent() CATCH_OVERRIDE { + assert( m_parent ); // Should always be non-null except for root + return *m_parent; + } + + virtual void openChild() CATCH_OVERRIDE { + if( m_runState != ExecutingChildren ) { + m_runState = ExecutingChildren; + if( m_parent ) + m_parent->openChild(); + } + } + + virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; } + virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; } + + void open() { + m_runState = Executing; + moveToThis(); + if( m_parent ) + m_parent->openChild(); + } + + virtual void close() CATCH_OVERRIDE { + + // Close any still open children (e.g. generators) + while( &m_ctx.currentTracker() != this ) + m_ctx.currentTracker().close(); + + switch( m_runState ) { + case NotStarted: + case CompletedSuccessfully: + case Failed: + throw std::logic_error( "Illogical state" ); + + case NeedsAnotherRun: + break;; + + case Executing: + m_runState = CompletedSuccessfully; + break; + case ExecutingChildren: + if( m_children.empty() || m_children.back()->isComplete() ) + m_runState = CompletedSuccessfully; + break; + + default: + throw std::logic_error( "Unexpected state" ); + } + moveToParent(); + m_ctx.completeCycle(); + } + virtual void fail() CATCH_OVERRIDE { + m_runState = Failed; + if( m_parent ) + m_parent->markAsNeedingAnotherRun(); + moveToParent(); + m_ctx.completeCycle(); + } + virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE { + m_runState = NeedsAnotherRun; + } + private: + void moveToParent() { + assert( m_parent ); + m_ctx.setCurrentTracker( m_parent ); + } + void moveToThis() { + m_ctx.setCurrentTracker( this ); + } }; - class TestCaseTracker { + class SectionTracker : public TrackerBase { + std::vector<std::string> m_filters; public: - TestCaseTracker( std::string const& testCaseName ) - : m_testCase( testCaseName, NULL ), - m_currentSection( &m_testCase ), - m_completedASectionThisRun( false ) - {} + SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : TrackerBase( nameAndLocation, ctx, parent ) + { + if( parent ) { + while( !parent->isSectionTracker() ) + parent = &parent->parent(); - bool enterSection( std::string const& name ) { - TrackedSection* child = m_currentSection->acquireChild( name ); - if( m_completedASectionThisRun || child->runState() == TrackedSection::Completed ) - return false; - - m_currentSection = child; - m_currentSection->enter(); - return true; - } - void leaveSection() { - m_currentSection->leave(); - m_currentSection = m_currentSection->getParent(); - assert( m_currentSection != NULL ); - m_completedASectionThisRun = true; - } - - bool currentSectionHasChildren() const { - return m_currentSection->hasChildren(); - } - bool isCompleted() const { - return m_testCase.runState() == TrackedSection::Completed; - } - - class Guard { - public: - Guard( TestCaseTracker& tracker ) : m_tracker( tracker ) { - m_tracker.enterTestCase(); + SectionTracker& parentSection = static_cast<SectionTracker&>( *parent ); + addNextFilters( parentSection.m_filters ); } - ~Guard() { - m_tracker.leaveTestCase(); + } + virtual ~SectionTracker(); + + virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; } + + static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { + SectionTracker* section = CATCH_NULL; + + ITracker& currentTracker = ctx.currentTracker(); + if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { + assert( childTracker ); + assert( childTracker->isSectionTracker() ); + section = static_cast<SectionTracker*>( childTracker ); } - private: - Guard( Guard const& ); - void operator = ( Guard const& ); - TestCaseTracker& m_tracker; - }; - - private: - void enterTestCase() { - m_currentSection = &m_testCase; - m_completedASectionThisRun = false; - m_testCase.enter(); - } - void leaveTestCase() { - m_testCase.leave(); + else { + section = new SectionTracker( nameAndLocation, ctx, ¤tTracker ); + currentTracker.addChild( section ); + } + if( !ctx.completedCycle() ) + section->tryOpen(); + return *section; } - TrackedSection m_testCase; - TrackedSection* m_currentSection; - bool m_completedASectionThisRun; + void tryOpen() { + if( !isComplete() && (m_filters.empty() || m_filters[0].empty() || m_filters[0] == m_nameAndLocation.name ) ) + open(); + } + + void addInitialFilters( std::vector<std::string> const& filters ) { + if( !filters.empty() ) { + m_filters.push_back(""); // Root - should never be consulted + m_filters.push_back(""); // Test Case - not a section filter + m_filters.insert( m_filters.end(), filters.begin(), filters.end() ); + } + } + void addNextFilters( std::vector<std::string> const& filters ) { + if( filters.size() > 1 ) + m_filters.insert( m_filters.end(), ++filters.begin(), filters.end() ); + } }; -} // namespace SectionTracking + class IndexTracker : public TrackerBase { + int m_size; + int m_index; + public: + IndexTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent, int size ) + : TrackerBase( nameAndLocation, ctx, parent ), + m_size( size ), + m_index( -1 ) + {} + virtual ~IndexTracker(); -using SectionTracking::TestCaseTracker; + virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; } + + static IndexTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation, int size ) { + IndexTracker* tracker = CATCH_NULL; + + ITracker& currentTracker = ctx.currentTracker(); + if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { + assert( childTracker ); + assert( childTracker->isIndexTracker() ); + tracker = static_cast<IndexTracker*>( childTracker ); + } + else { + tracker = new IndexTracker( nameAndLocation, ctx, ¤tTracker, size ); + currentTracker.addChild( tracker ); + } + + if( !ctx.completedCycle() && !tracker->isComplete() ) { + if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun ) + tracker->moveNext(); + tracker->open(); + } + + return *tracker; + } + + int index() const { return m_index; } + + void moveNext() { + m_index++; + m_children.clear(); + } + + virtual void close() CATCH_OVERRIDE { + TrackerBase::close(); + if( m_runState == CompletedSuccessfully && m_index < m_size-1 ) + m_runState = Executing; + } + }; + + inline ITracker& TrackerContext::startRun() { + m_rootTracker = new SectionTracker( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, CATCH_NULL ); + m_currentTracker = CATCH_NULL; + m_runState = Executing; + return *m_rootTracker; + } + +} // namespace TestCaseTracking + +using TestCaseTracking::ITracker; +using TestCaseTracking::TrackerContext; +using TestCaseTracking::SectionTracker; +using TestCaseTracking::IndexTracker; } // namespace Catch +CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS + +// #included from: catch_fatal_condition.hpp +#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED + +namespace Catch { + + // Report the error condition + inline void reportFatal( std::string const& message ) { + IContext& context = Catch::getCurrentContext(); + IResultCapture* resultCapture = context.getResultCapture(); + resultCapture->handleFatalErrorCondition( message ); + } + +} // namespace Catch + +#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// +// #included from: catch_windows_h_proxy.h + +#define TWOBLUECUBES_CATCH_WINDOWS_H_PROXY_H_INCLUDED + +#ifdef CATCH_DEFINES_NOMINMAX +# define NOMINMAX +#endif +#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif + +#ifdef __AFXDLL +#include <AfxWin.h> +#else +#include <windows.h> +#endif + +#ifdef CATCH_DEFINES_NOMINMAX +# undef NOMINMAX +#endif +#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN +# undef WIN32_LEAN_AND_MEAN +#endif + + +# if !defined ( CATCH_CONFIG_WINDOWS_SEH ) + +namespace Catch { + struct FatalConditionHandler { + void reset() {} + }; +} + +# else // CATCH_CONFIG_WINDOWS_SEH is defined + +namespace Catch { + + struct SignalDefs { DWORD id; const char* name; }; + extern SignalDefs signalDefs[]; + // There is no 1-1 mapping between signals and windows exceptions. + // Windows can easily distinguish between SO and SigSegV, + // but SigInt, SigTerm, etc are handled differently. + SignalDefs signalDefs[] = { + { EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL - Illegal instruction signal" }, + { EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow" }, + { EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal" }, + { EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" }, + }; + + struct FatalConditionHandler { + + static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { + for (int i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { + if (ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) { + reportFatal(signalDefs[i].name); + } + } + // If its not an exception we care about, pass it along. + // This stops us from eating debugger breaks etc. + return EXCEPTION_CONTINUE_SEARCH; + } + + FatalConditionHandler() { + isSet = true; + // 32k seems enough for Catch to handle stack overflow, + // but the value was found experimentally, so there is no strong guarantee + guaranteeSize = 32 * 1024; + exceptionHandlerHandle = CATCH_NULL; + // Register as first handler in current chain + exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); + // Pass in guarantee size to be filled + SetThreadStackGuarantee(&guaranteeSize); + } + + static void reset() { + if (isSet) { + // Unregister handler and restore the old guarantee + RemoveVectoredExceptionHandler(exceptionHandlerHandle); + SetThreadStackGuarantee(&guaranteeSize); + exceptionHandlerHandle = CATCH_NULL; + isSet = false; + } + } + + ~FatalConditionHandler() { + reset(); + } + private: + static bool isSet; + static ULONG guaranteeSize; + static PVOID exceptionHandlerHandle; + }; + + bool FatalConditionHandler::isSet = false; + ULONG FatalConditionHandler::guaranteeSize = 0; + PVOID FatalConditionHandler::exceptionHandlerHandle = CATCH_NULL; + +} // namespace Catch + +# endif // CATCH_CONFIG_WINDOWS_SEH + +#else // Not Windows - assumed to be POSIX compatible ////////////////////////// + +# if !defined(CATCH_CONFIG_POSIX_SIGNALS) + +namespace Catch { + struct FatalConditionHandler { + void reset() {} + }; +} + +# else // CATCH_CONFIG_POSIX_SIGNALS is defined + +#include <signal.h> + +namespace Catch { + + struct SignalDefs { + int id; + const char* name; + }; + extern SignalDefs signalDefs[]; + SignalDefs signalDefs[] = { + { SIGINT, "SIGINT - Terminal interrupt signal" }, + { SIGILL, "SIGILL - Illegal instruction signal" }, + { SIGFPE, "SIGFPE - Floating point error signal" }, + { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, + { SIGTERM, "SIGTERM - Termination request signal" }, + { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } + }; + + struct FatalConditionHandler { + + static bool isSet; + static struct sigaction oldSigActions [sizeof(signalDefs)/sizeof(SignalDefs)]; + static stack_t oldSigStack; + static char altStackMem[SIGSTKSZ]; + + static void handleSignal( int sig ) { + std::string name = "<unknown signal>"; + for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { + SignalDefs &def = signalDefs[i]; + if (sig == def.id) { + name = def.name; + break; + } + } + reset(); + reportFatal(name); + raise( sig ); + } + + FatalConditionHandler() { + isSet = true; + stack_t sigStack; + sigStack.ss_sp = altStackMem; + sigStack.ss_size = SIGSTKSZ; + sigStack.ss_flags = 0; + sigaltstack(&sigStack, &oldSigStack); + struct sigaction sa = { 0 }; + + sa.sa_handler = handleSignal; + sa.sa_flags = SA_ONSTACK; + for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) { + sigaction(signalDefs[i].id, &sa, &oldSigActions[i]); + } + } + + ~FatalConditionHandler() { + reset(); + } + static void reset() { + if( isSet ) { + // Set signals back to previous values -- hopefully nobody overwrote them in the meantime + for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) { + sigaction(signalDefs[i].id, &oldSigActions[i], CATCH_NULL); + } + // Return the old stack + sigaltstack(&oldSigStack, CATCH_NULL); + isSet = false; + } + } + }; + + bool FatalConditionHandler::isSet = false; + struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {}; + stack_t FatalConditionHandler::oldSigStack = {}; + char FatalConditionHandler::altStackMem[SIGSTKSZ] = {}; + +} // namespace Catch + +# endif // CATCH_CONFIG_POSIX_SIGNALS + +#endif // not Windows + +#include <cassert> #include <set> #include <string> @@ -4943,6 +6628,29 @@ namespace Catch { std::string& m_targetString; }; + // StdErr has two constituent streams in C++, std::cerr and std::clog + // This means that we need to redirect 2 streams into 1 to keep proper + // order of writes and cannot use StreamRedirect on its own + class StdErrRedirect { + public: + StdErrRedirect(std::string& targetString) + :m_cerrBuf( cerr().rdbuf() ), m_clogBuf(clog().rdbuf()), + m_targetString(targetString){ + cerr().rdbuf(m_oss.rdbuf()); + clog().rdbuf(m_oss.rdbuf()); + } + ~StdErrRedirect() { + m_targetString += m_oss.str(); + cerr().rdbuf(m_cerrBuf); + clog().rdbuf(m_clogBuf); + } + private: + std::streambuf* m_cerrBuf; + std::streambuf* m_clogBuf; + std::ostringstream m_oss; + std::string& m_targetString; + }; + /////////////////////////////////////////////////////////////////////////// class RunContext : public IResultCapture, public IRunner { @@ -4952,15 +6660,13 @@ namespace Catch { public: - explicit RunContext( Ptr<IConfig const> const& config, Ptr<IStreamingReporter> const& reporter ) - : m_runInfo( config->name() ), + explicit RunContext( Ptr<IConfig const> const& _config, Ptr<IStreamingReporter> const& reporter ) + : m_runInfo( _config->name() ), m_context( getCurrentMutableContext() ), - m_activeTestCase( NULL ), - m_config( config ), + m_activeTestCase( CATCH_NULL ), + m_config( _config ), m_reporter( reporter ), - m_prevRunner( m_context.getRunner() ), - m_prevResultCapture( m_context.getResultCapture() ), - m_prevConfig( m_context.getConfig() ) + m_shouldReportUnexpected ( true ) { m_context.setRunner( this ); m_context.setConfig( m_config ); @@ -4970,10 +6676,6 @@ namespace Catch { virtual ~RunContext() { m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); - m_context.setRunner( m_prevRunner ); - m_context.setConfig( NULL ); - m_context.setResultCapture( m_prevResultCapture ); - m_context.setConfig( m_prevConfig ); } void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { @@ -4994,17 +6696,27 @@ namespace Catch { m_reporter->testCaseStarting( testInfo ); m_activeTestCase = &testCase; - m_testCaseTracker = TestCaseTracker( testInfo.name ); do { + ITracker& rootTracker = m_trackerContext.startRun(); + assert( rootTracker.isSectionTracker() ); + static_cast<SectionTracker&>( rootTracker ).addInitialFilters( m_config->getSectionsToRun() ); do { + m_trackerContext.startCycle(); + m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( testInfo.name, testInfo.lineInfo ) ); runCurrentTest( redirectedCout, redirectedCerr ); } - while( !m_testCaseTracker->isCompleted() && !aborting() ); + while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() ); } + // !TBD: deprecated - this will be replaced by indexed trackers while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); Totals deltaTotals = m_totals.delta( prevTotals ); + if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) { + deltaTotals.assertions.failed++; + deltaTotals.testCases.passed--; + deltaTotals.testCases.failed++; + } m_totals.testCases += deltaTotals.testCases; m_reporter->testCaseEnded( TestCaseStats( testInfo, deltaTotals, @@ -5012,8 +6724,8 @@ namespace Catch { redirectedCerr, aborting() ) ); - m_activeTestCase = NULL; - m_testCaseTracker.reset(); + m_activeTestCase = CATCH_NULL; + m_testCaseTracker = CATCH_NULL; return deltaTotals; } @@ -5029,27 +6741,47 @@ namespace Catch { m_totals.assertions.passed++; } else if( !result.isOk() ) { - m_totals.assertions.failed++; + if( m_activeTestCase->getTestCaseInfo().okToFail() ) + m_totals.assertions.failedButOk++; + else + m_totals.assertions.failed++; } - if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) ) - m_messages.clear(); + // We have no use for the return value (whether messages should be cleared), because messages were made scoped + // and should be let to clear themselves out. + static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals))); // Reset working state m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); m_lastResult = result; } + virtual bool lastAssertionPassed() + { + return m_totals.assertions.passed == (m_prevPassed + 1); + } + + virtual void assertionPassed() + { + m_totals.assertions.passed++; + m_lastAssertionInfo.capturedExpression = "{Unknown expression after the reported line}"; + m_lastAssertionInfo.macroName = ""; + } + + virtual void assertionRun() + { + m_prevPassed = m_totals.assertions.passed; + } + virtual bool sectionStarted ( SectionInfo const& sectionInfo, Counts& assertions ) { - std::ostringstream oss; - oss << sectionInfo.name << "@" << sectionInfo.lineInfo; - - if( !m_testCaseTracker->enterSection( oss.str() ) ) + ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( sectionInfo.name, sectionInfo.lineInfo ) ); + if( !sectionTracker.isOpen() ) return false; + m_activeSections.push_back( §ionTracker ); m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; @@ -5060,30 +6792,40 @@ namespace Catch { return true; } bool testForMissingAssertions( Counts& assertions ) { - if( assertions.total() != 0 || - !m_config->warnAboutMissingAssertions() || - m_testCaseTracker->currentSectionHasChildren() ) + if( assertions.total() != 0 ) + return false; + if( !m_config->warnAboutMissingAssertions() ) + return false; + if( m_trackerContext.currentTracker().hasChildren() ) return false; m_totals.assertions.failed++; assertions.failed++; return true; } - virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions, double _durationInSeconds ) { - if( std::uncaught_exception() ) { - m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions, _durationInSeconds ) ); - return; - } - - Counts assertions = m_totals.assertions - prevAssertions; + virtual void sectionEnded( SectionEndInfo const& endInfo ) { + Counts assertions = m_totals.assertions - endInfo.prevAssertions; bool missingAssertions = testForMissingAssertions( assertions ); - m_testCaseTracker->leaveSection(); + if( !m_activeSections.empty() ) { + m_activeSections.back()->close(); + m_activeSections.pop_back(); + } - m_reporter->sectionEnded( SectionStats( info, assertions, _durationInSeconds, missingAssertions ) ); + m_reporter->sectionEnded( SectionStats( endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions ) ); m_messages.clear(); } + virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) { + if( m_unfinishedSections.empty() ) + m_activeSections.back()->fail(); + else + m_activeSections.back()->close(); + m_activeSections.pop_back(); + + m_unfinishedSections.push_back( endInfo ); + } + virtual void pushScopedMessage( MessageInfo const& message ) { m_messages.push_back( message ); } @@ -5095,13 +6837,53 @@ namespace Catch { virtual std::string getCurrentTestName() const { return m_activeTestCase ? m_activeTestCase->getTestCaseInfo().name - : ""; + : std::string(); } virtual const AssertionResult* getLastResult() const { return &m_lastResult; } + virtual void exceptionEarlyReported() { + m_shouldReportUnexpected = false; + } + + virtual void handleFatalErrorCondition( std::string const& message ) { + // Don't rebuild the result -- the stringification itself can cause more fatal errors + // Instead, fake a result data. + AssertionResultData tempResult; + tempResult.resultType = ResultWas::FatalErrorCondition; + tempResult.message = message; + AssertionResult result(m_lastAssertionInfo, tempResult); + + getResultCapture().assertionEnded(result); + + handleUnfinishedSections(); + + // Recreate section for test case (as we will lose the one that was in scope) + TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); + SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); + + Counts assertions; + assertions.failed = 1; + SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false ); + m_reporter->sectionEnded( testCaseSectionStats ); + + TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo(); + + Totals deltaTotals; + deltaTotals.testCases.failed = 1; + deltaTotals.assertions.failed = 1; + m_reporter->testCaseEnded( TestCaseStats( testInfo, + deltaTotals, + std::string(), + std::string(), + false ) ); + m_totals.testCases.failed++; + testGroupEnded( std::string(), m_totals, 1, 1 ); + m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) ); + } + public: // !TBD We need to do this another way! bool aborting() const { @@ -5116,19 +6898,21 @@ namespace Catch { m_reporter->sectionStarting( testCaseSection ); Counts prevAssertions = m_totals.assertions; double duration = 0; + m_shouldReportUnexpected = true; try { m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); - TestCaseTracker::Guard guard( *m_testCaseTracker ); + + seedRng( *m_config ); Timer timer; timer.start(); if( m_reporter->getPreferences().shouldRedirectStdOut ) { - StreamRedirect coutRedir( std::cout, redirectedCout ); - StreamRedirect cerrRedir( std::cerr, redirectedCerr ); - m_activeTestCase->invoke(); + StreamRedirect coutRedir( Catch::cout(), redirectedCout ); + StdErrRedirect errRedir( redirectedCerr ); + invokeActiveTestCase(); } else { - m_activeTestCase->invoke(); + invokeActiveTestCase(); } duration = timer.getElapsedSeconds(); } @@ -5136,61 +6920,66 @@ namespace Catch { // This just means the test was aborted due to failure } catch(...) { - ResultBuilder exResult( m_lastAssertionInfo.macroName.c_str(), - m_lastAssertionInfo.lineInfo, - m_lastAssertionInfo.capturedExpression.c_str(), - m_lastAssertionInfo.resultDisposition ); - exResult.useActiveException(); + // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions + // are reported without translation at the point of origin. + if (m_shouldReportUnexpected) { + makeUnexpectedResultBuilder().useActiveException(); + } } - // If sections ended prematurely due to an exception we stored their - // infos here so we can tear them down outside the unwind process. - for( std::vector<UnfinishedSections>::const_reverse_iterator it = m_unfinishedSections.rbegin(), - itEnd = m_unfinishedSections.rend(); - it != itEnd; - ++it ) - sectionEnded( it->info, it->prevAssertions, it->durationInSeconds ); - m_unfinishedSections.clear(); + m_testCaseTracker->close(); + handleUnfinishedSections(); m_messages.clear(); Counts assertions = m_totals.assertions - prevAssertions; bool missingAssertions = testForMissingAssertions( assertions ); - if( testCaseInfo.okToFail() ) { - std::swap( assertions.failedButOk, assertions.failed ); - m_totals.assertions.failed -= assertions.failedButOk; - m_totals.assertions.failedButOk += assertions.failedButOk; - } - SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); m_reporter->sectionEnded( testCaseSectionStats ); } - private: - struct UnfinishedSections { - UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions, double _durationInSeconds ) - : info( _info ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) - {} + void invokeActiveTestCase() { + FatalConditionHandler fatalConditionHandler; // Handle signals + m_activeTestCase->invoke(); + fatalConditionHandler.reset(); + } - SectionInfo info; - Counts prevAssertions; - double durationInSeconds; - }; + private: + + ResultBuilder makeUnexpectedResultBuilder() const { + return ResultBuilder( m_lastAssertionInfo.macroName, + m_lastAssertionInfo.lineInfo, + m_lastAssertionInfo.capturedExpression, + m_lastAssertionInfo.resultDisposition ); + } + + void handleUnfinishedSections() { + // If sections ended prematurely due to an exception we stored their + // infos here so we can tear them down outside the unwind process. + for( std::vector<SectionEndInfo>::const_reverse_iterator it = m_unfinishedSections.rbegin(), + itEnd = m_unfinishedSections.rend(); + it != itEnd; + ++it ) + sectionEnded( *it ); + m_unfinishedSections.clear(); + } TestRunInfo m_runInfo; IMutableContext& m_context; TestCase const* m_activeTestCase; - Option<TestCaseTracker> m_testCaseTracker; + ITracker* m_testCaseTracker; + ITracker* m_currentSectionTracker; AssertionResult m_lastResult; Ptr<IConfig const> m_config; Totals m_totals; Ptr<IStreamingReporter> m_reporter; std::vector<MessageInfo> m_messages; - IRunner* m_prevRunner; - IResultCapture* m_prevResultCapture; - Ptr<IConfig const> m_prevConfig; AssertionInfo m_lastAssertionInfo; - std::vector<UnfinishedSections> m_unfinishedSections; + std::vector<SectionEndInfo> m_unfinishedSections; + std::vector<ITracker*> m_activeSections; + TrackerContext m_trackerContext; + size_t m_prevPassed; + bool m_shouldReportUnexpected; }; IResultCapture& getResultCapture() { @@ -5211,24 +7000,25 @@ namespace Catch { struct Version { Version( unsigned int _majorVersion, unsigned int _minorVersion, - unsigned int _buildNumber, - char const* const _branchName ) - : majorVersion( _majorVersion ), - minorVersion( _minorVersion ), - buildNumber( _buildNumber ), - branchName( _branchName ) - {} + unsigned int _patchNumber, + char const * const _branchName, + unsigned int _buildNumber ); unsigned int const majorVersion; unsigned int const minorVersion; + unsigned int const patchNumber; + + // buildNumber is only used if branchName is not null + char const * const branchName; unsigned int const buildNumber; - char const* const branchName; + + friend std::ostream& operator << ( std::ostream& os, Version const& version ); private: void operator=( Version const& ); }; - extern Version libraryVersion; + inline Version libraryVersion(); } #include <fstream> @@ -5237,83 +7027,93 @@ namespace Catch { namespace Catch { - class Runner { + Ptr<IStreamingReporter> createReporter( std::string const& reporterName, Ptr<Config> const& config ) { + Ptr<IStreamingReporter> reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() ); + if( !reporter ) { + std::ostringstream oss; + oss << "No reporter registered with name: '" << reporterName << "'"; + throw std::domain_error( oss.str() ); + } + return reporter; + } - public: - Runner( Ptr<Config> const& config ) - : m_config( config ) - { - openStream(); - makeReporter(); +#if !defined(CATCH_CONFIG_DEFAULT_REPORTER) +#define CATCH_CONFIG_DEFAULT_REPORTER "console" +#endif + + Ptr<IStreamingReporter> makeReporter( Ptr<Config> const& config ) { + std::vector<std::string> reporters = config->getReporterNames(); + if( reporters.empty() ) + reporters.push_back( CATCH_CONFIG_DEFAULT_REPORTER ); + + Ptr<IStreamingReporter> reporter; + for( std::vector<std::string>::const_iterator it = reporters.begin(), itEnd = reporters.end(); + it != itEnd; + ++it ) + reporter = addReporter( reporter, createReporter( *it, config ) ); + return reporter; + } + Ptr<IStreamingReporter> addListeners( Ptr<IConfig const> const& config, Ptr<IStreamingReporter> reporters ) { + IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners(); + for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end(); + it != itEnd; + ++it ) + reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) ); + return reporters; + } + + Totals runTests( Ptr<Config> const& config ) { + + Ptr<IConfig const> iconfig = config.get(); + + Ptr<IStreamingReporter> reporter = makeReporter( config ); + reporter = addListeners( iconfig, reporter ); + + RunContext context( iconfig, reporter ); + + Totals totals; + + context.testGroupStarting( config->name(), 1, 1 ); + + TestSpec testSpec = config->testSpec(); + if( !testSpec.hasFilters() ) + testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests + + std::vector<TestCase> const& allTestCases = getAllTestCasesSorted( *iconfig ); + for( std::vector<TestCase>::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end(); + it != itEnd; + ++it ) { + if( !context.aborting() && matchTest( *it, testSpec, *iconfig ) ) + totals += context.runTest( *it ); + else + reporter->skipTest( *it ); } - Totals runTests() { + context.testGroupEnded( iconfig->name(), totals, 1, 1 ); + return totals; + } - RunContext context( m_config.get(), m_reporter ); + void applyFilenamesAsTags( IConfig const& config ) { + std::vector<TestCase> const& tests = getAllTestCasesSorted( config ); + for(std::size_t i = 0; i < tests.size(); ++i ) { + TestCase& test = const_cast<TestCase&>( tests[i] ); + std::set<std::string> tags = test.tags; - Totals totals; + std::string filename = test.lineInfo.file; + std::string::size_type lastSlash = filename.find_last_of( "\\/" ); + if( lastSlash != std::string::npos ) + filename = filename.substr( lastSlash+1 ); - context.testGroupStarting( "", 1, 1 ); // deprecated? + std::string::size_type lastDot = filename.find_last_of( '.' ); + if( lastDot != std::string::npos ) + filename = filename.substr( 0, lastDot ); - TestSpec testSpec = m_config->testSpec(); - if( !testSpec.hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests - - std::vector<TestCase> testCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, *m_config, testCases ); - - int testsRunForGroup = 0; - for( std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end(); - it != itEnd; - ++it ) { - testsRunForGroup++; - if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) { - - if( context.aborting() ) - break; - - totals += context.runTest( *it ); - m_testsAlreadyRun.insert( *it ); - } - } - context.testGroupEnded( "", totals, 1, 1 ); - return totals; + tags.insert( '#' + filename ); + setTags( test, tags ); } + } - private: - void openStream() { - // Open output file, if specified - if( !m_config->getFilename().empty() ) { - m_ofs.open( m_config->getFilename().c_str() ); - if( m_ofs.fail() ) { - std::ostringstream oss; - oss << "Unable to open file: '" << m_config->getFilename() << "'"; - throw std::domain_error( oss.str() ); - } - m_config->setStreamBuf( m_ofs.rdbuf() ); - } - } - void makeReporter() { - std::string reporterName = m_config->getReporterName().empty() - ? "console" - : m_config->getReporterName(); - - m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, m_config.get() ); - if( !m_reporter ) { - std::ostringstream oss; - oss << "No reporter registered with name: '" << reporterName << "'"; - throw std::domain_error( oss.str() ); - } - } - - private: - Ptr<Config> m_config; - std::ofstream m_ofs; - Ptr<IStreamingReporter> m_reporter; - std::set<TestCase> m_testsAlreadyRun; - }; - - class Session { + class Session : NonCopyable { static bool alreadyInstantiated; public: @@ -5324,7 +7124,7 @@ namespace Catch { : m_cli( makeCommandLineParser() ) { if( alreadyInstantiated ) { std::string msg = "Only one instance of Catch::Session can ever be used"; - std::cerr << msg << std::endl; + Catch::cerr() << msg << std::endl; throw std::logic_error( msg ); } alreadyInstantiated = true; @@ -5334,33 +7134,38 @@ namespace Catch { } void showHelp( std::string const& processName ) { - std::cout << "\nCatch v" << libraryVersion.majorVersion << "." - << libraryVersion.minorVersion << " build " - << libraryVersion.buildNumber; - if( libraryVersion.branchName != std::string( "master" ) ) - std::cout << " (" << libraryVersion.branchName << " branch)"; - std::cout << "\n"; + Catch::cout() << "\nCatch v" << libraryVersion() << "\n"; - m_cli.usage( std::cout, processName ); - std::cout << "For more detail usage please see the project docs\n" << std::endl; + m_cli.usage( Catch::cout(), processName ); + Catch::cout() << "For more detail usage please see the project docs\n" << std::endl; + } + void libIdentify() { + Catch::cout() + << std::left << std::setw(16) << "description: " << "A Catch test executable\n" + << std::left << std::setw(16) << "category: " << "testframework\n" + << std::left << std::setw(16) << "framework: " << "Catch Test\n" + << std::left << std::setw(16) << "version: " << libraryVersion() << std::endl; } - int applyCommandLine( int argc, char* const argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { + int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { try { m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); - m_unusedTokens = m_cli.parseInto( argc, argv, m_configData ); + m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData ); if( m_configData.showHelp ) showHelp( m_configData.processName ); + if( m_configData.libIdentify ) + libIdentify(); m_config.reset(); } catch( std::exception& ex ) { { Colour colourGuard( Colour::Red ); - std::cerr << "\nError(s) in input:\n" - << Text( ex.what(), TextAttributes().setIndent(2) ) - << "\n\n"; + Catch::cerr() + << "\nError(s) in input:\n" + << Text( ex.what(), TextAttributes().setIndent(2) ) + << "\n\n"; } - m_cli.usage( std::cout, m_configData.processName ); + m_cli.usage( Catch::cout(), m_configData.processName ); return (std::numeric_limits<int>::max)(); } return 0; @@ -5371,7 +7176,7 @@ namespace Catch { m_config.reset(); } - int run( int argc, char* const argv[] ) { + int run( int argc, char const* const* const argv ) { int returnCode = applyCommandLine( argc, argv ); if( returnCode == 0 ) @@ -5379,25 +7184,43 @@ namespace Catch { return returnCode; } + #if defined(WIN32) && defined(UNICODE) + int run( int argc, wchar_t const* const* const argv ) { + + char **utf8Argv = new char *[ argc ]; + + for ( int i = 0; i < argc; ++i ) { + int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, NULL, 0, NULL, NULL ); + + utf8Argv[ i ] = new char[ bufSize ]; + + WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, NULL, NULL ); + } + + int returnCode = applyCommandLine( argc, utf8Argv ); + if( returnCode == 0 ) + returnCode = run(); + + for ( int i = 0; i < argc; ++i ) + delete [] utf8Argv[ i ]; + + delete [] utf8Argv; + + return returnCode; + } + #endif + int run() { - if( m_configData.showHelp ) - return 0; - - try - { - config(); // Force config to be constructed - Runner runner( m_config ); - - // Handle list request - if( Option<std::size_t> listed = list( config() ) ) - return static_cast<int>( *listed ); - - return static_cast<int>( runner.runTests().assertions.failed ); + if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeStart ) != 0 ) { + Catch::cout() << "...waiting for enter/ return before starting" << std::endl; + static_cast<void>(std::getchar()); } - catch( std::exception& ex ) { - std::cerr << ex.what() << std::endl; - return (std::numeric_limits<int>::max)(); + int exitCode = runInternal(); + if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeExit ) != 0 ) { + Catch::cout() << "...waiting for enter/ return before exiting, with code: " << exitCode << std::endl; + static_cast<void>(std::getchar()); } + return exitCode; } Clara::CommandLine<ConfigData> const& cli() const { @@ -5414,8 +7237,33 @@ namespace Catch { m_config = new Config( m_configData ); return *m_config; } - private: + + int runInternal() { + if( m_configData.showHelp || m_configData.libIdentify ) + return 0; + + try + { + config(); // Force config to be constructed + + seedRng( *m_config ); + + if( m_configData.filenamesAsTags ) + applyFilenamesAsTags( *m_config ); + + // Handle list request + if( Option<std::size_t> listed = list( config() ) ) + return static_cast<int>( *listed ); + + return static_cast<int>( runTests( m_config ).assertions.failed ); + } + catch( std::exception& ex ) { + Catch::cerr() << ex.what() << std::endl; + return (std::numeric_limits<int>::max)(); + } + } + Clara::CommandLine<ConfigData> m_cli; std::vector<Clara::Parser::Token> m_unusedTokens; ConfigData m_configData; @@ -5435,65 +7283,126 @@ namespace Catch { #include <vector> #include <set> #include <sstream> -#include <iostream> +#include <algorithm> namespace Catch { + struct RandomNumberGenerator { + typedef unsigned int result_type; + + result_type operator()( result_type n ) const { return std::rand() % n; } + +#ifdef CATCH_CONFIG_CPP11_SHUFFLE + static constexpr result_type (min)() { return 0; } + static constexpr result_type (max)() { return 1000000; } + result_type operator()() const { return std::rand() % (max)(); } +#endif + template<typename V> + static void shuffle( V& vector ) { + RandomNumberGenerator rng; +#ifdef CATCH_CONFIG_CPP11_SHUFFLE + std::shuffle( vector.begin(), vector.end(), rng ); +#else + std::random_shuffle( vector.begin(), vector.end(), rng ); +#endif + } + }; + + inline std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) { + + std::vector<TestCase> sorted = unsortedTestCases; + + switch( config.runOrder() ) { + case RunTests::InLexicographicalOrder: + std::sort( sorted.begin(), sorted.end() ); + break; + case RunTests::InRandomOrder: + { + seedRng( config ); + RandomNumberGenerator::shuffle( sorted ); + } + break; + case RunTests::InDeclarationOrder: + // already in declaration order + break; + } + return sorted; + } + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { + return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() ); + } + + void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ) { + std::set<TestCase> seenFunctions; + for( std::vector<TestCase>::const_iterator it = functions.begin(), itEnd = functions.end(); + it != itEnd; + ++it ) { + std::pair<std::set<TestCase>::const_iterator, bool> prev = seenFunctions.insert( *it ); + if( !prev.second ) { + std::ostringstream ss; + + ss << Colour( Colour::Red ) + << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" + << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << '\n' + << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; + + throw std::runtime_error(ss.str()); + } + } + } + + std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ) { + std::vector<TestCase> filtered; + filtered.reserve( testCases.size() ); + for( std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end(); + it != itEnd; + ++it ) + if( matchTest( *it, testSpec, config ) ) + filtered.push_back( *it ); + return filtered; + } + std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ) { + return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config ); + } + class TestRegistry : public ITestCaseRegistry { public: - TestRegistry() : m_unnamedCount( 0 ) {} + TestRegistry() + : m_currentSortOrder( RunTests::InDeclarationOrder ), + m_unnamedCount( 0 ) + {} virtual ~TestRegistry(); virtual void registerTest( TestCase const& testCase ) { std::string name = testCase.getTestCaseInfo().name; - if( name == "" ) { + if( name.empty() ) { std::ostringstream oss; oss << "Anonymous test case " << ++m_unnamedCount; return registerTest( testCase.withName( oss.str() ) ); } - - if( m_functions.find( testCase ) == m_functions.end() ) { - m_functions.insert( testCase ); - m_functionsInOrder.push_back( testCase ); - if( !testCase.isHidden() ) - m_nonHiddenFunctions.push_back( testCase ); - } - else { - TestCase const& prev = *m_functions.find( testCase ); - { - Colour colourGuard( Colour::Red ); - std::cerr << "error: TEST_CASE( \"" << name << "\" ) already defined.\n" - << "\tFirst seen at " << prev.getTestCaseInfo().lineInfo << "\n" - << "\tRedefined at " << testCase.getTestCaseInfo().lineInfo << std::endl; - } - exit(1); - } + m_functions.push_back( testCase ); } virtual std::vector<TestCase> const& getAllTests() const { - return m_functionsInOrder; + return m_functions; } + virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const { + if( m_sortedFunctions.empty() ) + enforceNoDuplicateTestCases( m_functions ); - virtual std::vector<TestCase> const& getAllNonHiddenTests() const { - return m_nonHiddenFunctions; - } - - virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector<TestCase>& matchingTestCases ) const { - for( std::vector<TestCase>::const_iterator it = m_functionsInOrder.begin(), - itEnd = m_functionsInOrder.end(); - it != itEnd; - ++it ) { - if( testSpec.matches( *it ) && ( config.allowThrows() || !it->throws() ) ) - matchingTestCases.push_back( *it ); + if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) { + m_sortedFunctions = sortTests( config, m_functions ); + m_currentSortOrder = config.runOrder(); } + return m_sortedFunctions; } private: - - std::set<TestCase> m_functions; - std::vector<TestCase> m_functionsInOrder; - std::vector<TestCase> m_nonHiddenFunctions; + std::vector<TestCase> m_functions; + mutable RunTests::InWhatOrder m_currentSortOrder; + mutable std::vector<TestCase> m_sortedFunctions; size_t m_unnamedCount; + std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised }; /////////////////////////////////////////////////////////////////////////// @@ -5515,7 +7424,7 @@ namespace Catch { inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { std::string className = classOrQualifiedMethodName; - if( startsWith( className, "&" ) ) + if( startsWith( className, '&' ) ) { std::size_t lastColons = className.rfind( "::" ); std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); @@ -5526,29 +7435,38 @@ namespace Catch { return className; } - /////////////////////////////////////////////////////////////////////////// + void registerTestCase + ( ITestCase* testCase, + char const* classOrQualifiedMethodName, + NameAndDesc const& nameAndDesc, + SourceLineInfo const& lineInfo ) { - AutoReg::AutoReg( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { + getMutableRegistryHub().registerTest + ( makeTestCase + ( testCase, + extractClassName( classOrQualifiedMethodName ), + nameAndDesc.name, + nameAndDesc.description, + lineInfo ) ); + } + void registerTestCaseFunction + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ) { registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); } - AutoReg::~AutoReg() {} + /////////////////////////////////////////////////////////////////////////// - void AutoReg::registerTestCase( ITestCase* testCase, - char const* classOrQualifiedMethodName, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - getMutableRegistryHub().registerTest - ( makeTestCase( testCase, - extractClassName( classOrQualifiedMethodName ), - nameAndDesc.name, - nameAndDesc.description, - lineInfo ) ); + AutoReg::AutoReg + ( TestFunction function, + SourceLineInfo const& lineInfo, + NameAndDesc const& nameAndDesc ) { + registerTestCaseFunction( function, lineInfo, nameAndDesc ); } + AutoReg::~AutoReg() {} + } // end namespace Catch // #included from: catch_reporter_registry.hpp @@ -5562,27 +7480,32 @@ namespace Catch { public: - virtual ~ReporterRegistry() { - deleteAllValues( m_factories ); - } + virtual ~ReporterRegistry() CATCH_OVERRIDE {} - virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig> const& config ) const { + virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig const> const& config ) const CATCH_OVERRIDE { FactoryMap::const_iterator it = m_factories.find( name ); if( it == m_factories.end() ) - return NULL; + return CATCH_NULL; return it->second->create( ReporterConfig( config ) ); } - void registerReporter( std::string const& name, IReporterFactory* factory ) { + void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) { m_factories.insert( std::make_pair( name, factory ) ); } + void registerListener( Ptr<IReporterFactory> const& factory ) { + m_listeners.push_back( factory ); + } - FactoryMap const& getFactories() const { + virtual FactoryMap const& getFactories() const CATCH_OVERRIDE { return m_factories; } + virtual Listeners const& getListeners() const CATCH_OVERRIDE { + return m_listeners; + } private: FactoryMap m_factories; + Listeners m_listeners; }; } @@ -5610,13 +7533,13 @@ namespace Catch { #ifdef __OBJC__ // In Objective-C try objective-c exceptions first @try { - throw; + return tryTranslators(); } @catch (NSException *exception) { - return toString( [exception description] ); + return Catch::toString( [exception description] ); } #else - throw; + return tryTranslators(); #endif } catch( TestFailureException& ) { @@ -5632,20 +7555,15 @@ namespace Catch { return msg; } catch(...) { - return tryTranslators( m_translators.begin() ); + return "Unknown exception"; } } - std::string tryTranslators( std::vector<const IExceptionTranslator*>::const_iterator it ) const { - if( it == m_translators.end() ) - return "Unknown exception"; - - try { - return (*it)->translate(); - } - catch(...) { - return tryTranslators( it+1 ); - } + std::string tryTranslators() const { + if( m_translators.empty() ) + throw; + else + return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() ); } private: @@ -5653,6 +7571,26 @@ namespace Catch { }; } +// #included from: catch_tag_alias_registry.h +#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED + +#include <map> + +namespace Catch { + + class TagAliasRegistry : public ITagAliasRegistry { + public: + virtual ~TagAliasRegistry(); + virtual Option<TagAlias> find( std::string const& alias ) const; + virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; + void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ); + + private: + std::map<std::string, TagAlias> m_registry; + }; + +} // end namespace Catch + namespace Catch { namespace { @@ -5665,36 +7603,46 @@ namespace Catch { public: // IRegistryHub RegistryHub() { } - virtual IReporterRegistry const& getReporterRegistry() const { + virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE { return m_reporterRegistry; } - virtual ITestCaseRegistry const& getTestCaseRegistry() const { + virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE { return m_testCaseRegistry; } - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() { + virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE { return m_exceptionTranslatorRegistry; } + virtual ITagAliasRegistry const& getTagAliasRegistry() const CATCH_OVERRIDE { + return m_tagAliasRegistry; + } public: // IMutableRegistryHub - virtual void registerReporter( std::string const& name, IReporterFactory* factory ) { + virtual void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) CATCH_OVERRIDE { m_reporterRegistry.registerReporter( name, factory ); } - virtual void registerTest( TestCase const& testInfo ) { + virtual void registerListener( Ptr<IReporterFactory> const& factory ) CATCH_OVERRIDE { + m_reporterRegistry.registerListener( factory ); + } + virtual void registerTest( TestCase const& testInfo ) CATCH_OVERRIDE { m_testCaseRegistry.registerTest( testInfo ); } - virtual void registerTranslator( const IExceptionTranslator* translator ) { + virtual void registerTranslator( const IExceptionTranslator* translator ) CATCH_OVERRIDE { m_exceptionTranslatorRegistry.registerTranslator( translator ); } + virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) CATCH_OVERRIDE { + m_tagAliasRegistry.add( alias, tag, lineInfo ); + } private: TestRegistry m_testCaseRegistry; ReporterRegistry m_reporterRegistry; ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; + TagAliasRegistry m_tagAliasRegistry; }; // Single, global, instance inline RegistryHub*& getTheRegistryHub() { - static RegistryHub* theRegistryHub = NULL; + static RegistryHub* theRegistryHub = CATCH_NULL; if( !theRegistryHub ) theRegistryHub = new RegistryHub(); return theRegistryHub; @@ -5709,7 +7657,7 @@ namespace Catch { } void cleanUp() { delete getTheRegistryHub(); - getTheRegistryHub() = NULL; + getTheRegistryHub() = CATCH_NULL; cleanUpContext(); } std::string translateActiveException() { @@ -5721,7 +7669,7 @@ namespace Catch { // #included from: catch_notimplemented_exception.hpp #define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED -#include <ostream> +#include <sstream> namespace Catch { @@ -5745,21 +7693,9 @@ namespace Catch { // #included from: catch_stream.hpp #define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED -// #included from: catch_streambuf.h -#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED - -#include <streambuf> - -namespace Catch { - - class StreamBufBase : public std::streambuf { - public: - virtual ~StreamBufBase() CATCH_NOEXCEPT; - }; -} - #include <stdexcept> #include <cstdio> +#include <iostream> namespace Catch { @@ -5801,6 +7737,19 @@ namespace Catch { /////////////////////////////////////////////////////////////////////////// + FileStream::FileStream( std::string const& filename ) { + m_ofs.open( filename.c_str() ); + if( m_ofs.fail() ) { + std::ostringstream oss; + oss << "Unable to open file: '" << filename << '\''; + throw std::domain_error( oss.str() ); + } + } + + std::ostream& FileStream::stream() const { + return m_ofs; + } + struct OutputDebugWriter { void operator()( std::string const&str ) { @@ -5808,31 +7757,51 @@ namespace Catch { } }; - Stream::Stream() - : streamBuf( NULL ), isOwned( false ) + DebugOutStream::DebugOutStream() + : m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ), + m_os( m_streamBuf.get() ) {} - Stream::Stream( std::streambuf* _streamBuf, bool _isOwned ) - : streamBuf( _streamBuf ), isOwned( _isOwned ) - {} - - void Stream::release() { - if( isOwned ) { - delete streamBuf; - streamBuf = NULL; - isOwned = false; - } + std::ostream& DebugOutStream::stream() const { + return m_os; } + + // Store the streambuf from cout up-front because + // cout may get redirected when running tests + CoutStream::CoutStream() + : m_os( Catch::cout().rdbuf() ) + {} + + std::ostream& CoutStream::stream() const { + return m_os; + } + +#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions + std::ostream& cout() { + return std::cout; + } + std::ostream& cerr() { + return std::cerr; + } + std::ostream& clog() { + return std::clog; + } +#endif } namespace Catch { class Context : public IMutableContext { - Context() : m_config( NULL ), m_runner( NULL ), m_resultCapture( NULL ) {} + Context() : m_config( CATCH_NULL ), m_runner( CATCH_NULL ), m_resultCapture( CATCH_NULL ) {} Context( Context const& ); void operator=( Context const& ); + public: + virtual ~Context() { + deleteAllValues( m_generatorsByTestName ); + } + public: // IContext virtual IResultCapture* getResultCapture() { return m_resultCapture; @@ -5872,10 +7841,10 @@ namespace Catch { std::string testName = getResultCapture()->getCurrentTestName(); std::map<std::string, IGeneratorsForTest*>::const_iterator it = - m_generatorsByTestName.find( testName ); + m_generatorsByTestName.find( testName ); return it != m_generatorsByTestName.end() ? it->second - : NULL; + : CATCH_NULL; } IGeneratorsForTest& getGeneratorsForCurrentTest() { @@ -5896,7 +7865,7 @@ namespace Catch { }; namespace { - Context* currentContext = NULL; + Context* currentContext = CATCH_NULL; } IMutableContext& getCurrentMutableContext() { if( !currentContext ) @@ -5907,57 +7876,78 @@ namespace Catch { return getCurrentMutableContext(); } - Stream createStream( std::string const& streamName ) { - if( streamName == "stdout" ) return Stream( std::cout.rdbuf(), false ); - if( streamName == "stderr" ) return Stream( std::cerr.rdbuf(), false ); - if( streamName == "debug" ) return Stream( new StreamBufImpl<OutputDebugWriter>, true ); - - throw std::domain_error( "Unknown stream: " + streamName ); - } - void cleanUpContext() { delete currentContext; - currentContext = NULL; + currentContext = CATCH_NULL; } } // #included from: catch_console_colour_impl.hpp #define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED -namespace Catch { namespace Detail { - struct IColourImpl { - virtual ~IColourImpl() {} - virtual void use( Colour::Code _colourCode ) = 0; +// #included from: catch_errno_guard.hpp +#define TWOBLUECUBES_CATCH_ERRNO_GUARD_HPP_INCLUDED + +#include <cerrno> + +namespace Catch { + + class ErrnoGuard { + public: + ErrnoGuard():m_oldErrno(errno){} + ~ErrnoGuard() { errno = m_oldErrno; } + private: + int m_oldErrno; }; -}} -#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// +} -#ifndef NOMINMAX -#define NOMINMAX +namespace Catch { + namespace { + + struct IColourImpl { + virtual ~IColourImpl() {} + virtual void use( Colour::Code _colourCode ) = 0; + }; + + struct NoColourImpl : IColourImpl { + void use( Colour::Code ) {} + + static IColourImpl* instance() { + static NoColourImpl s_instance; + return &s_instance; + } + }; + + } // anon namespace +} // namespace Catch + +#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI ) +# ifdef CATCH_PLATFORM_WINDOWS +# define CATCH_CONFIG_COLOUR_WINDOWS +# else +# define CATCH_CONFIG_COLOUR_ANSI +# endif #endif -#ifdef __AFXDLL -#include <AfxWin.h> -#else -#include <windows.h> -#endif +#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// namespace Catch { namespace { - class Win32ColourImpl : public Detail::IColourImpl { + class Win32ColourImpl : public IColourImpl { public: Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) { CONSOLE_SCREEN_BUFFER_INFO csbiInfo; GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); - originalAttributes = csbiInfo.wAttributes; + originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); + originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY ); } virtual void use( Colour::Code _colourCode ) { switch( _colourCode ) { - case Colour::None: return setTextAttribute( originalAttributes ); + case Colour::None: return setTextAttribute( originalForegroundAttributes ); case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); case Colour::Red: return setTextAttribute( FOREGROUND_RED ); case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); @@ -5977,25 +7967,33 @@ namespace { private: void setTextAttribute( WORD _textAttribute ) { - SetConsoleTextAttribute( stdoutHandle, _textAttribute ); + SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes ); } HANDLE stdoutHandle; - WORD originalAttributes; + WORD originalForegroundAttributes; + WORD originalBackgroundAttributes; }; - inline bool shouldUseColourForPlatform() { - return true; - } - - static Detail::IColourImpl* platformColourInstance() { + IColourImpl* platformColourInstance() { static Win32ColourImpl s_instance; - return &s_instance; + + Ptr<IConfig const> config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = !isDebuggerActive() + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes + ? &s_instance + : NoColourImpl::instance(); } } // end anon namespace } // end namespace Catch -#else // Not Windows - assumed to be POSIX compatible ////////////////////////// +#elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// #include <unistd.h> @@ -6006,7 +8004,7 @@ namespace { // Thanks to Adam Strzelecki for original contribution // (http://github.com/nanoant) // https://github.com/philsquared/Catch/pull/131 - class PosixColourImpl : public Detail::IColourImpl { + class PosixColourImpl : public IColourImpl { public: virtual void use( Colour::Code _colourCode ) { switch( _colourCode ) { @@ -6014,7 +8012,7 @@ namespace { case Colour::White: return setColour( "[0m" ); case Colour::Red: return setColour( "[0;31m" ); case Colour::Green: return setColour( "[0;32m" ); - case Colour::Blue: return setColour( "[0:34m" ); + case Colour::Blue: return setColour( "[0;34m" ); case Colour::Cyan: return setColour( "[0;36m" ); case Colour::Yellow: return setColour( "[0;33m" ); case Colour::Grey: return setColour( "[1;30m" ); @@ -6027,53 +8025,54 @@ namespace { case Colour::Bright: throw std::logic_error( "not a colour" ); } } + static IColourImpl* instance() { + static PosixColourImpl s_instance; + return &s_instance; + } + private: void setColour( const char* _escapeCode ) { - std::cout << '\033' << _escapeCode; + Catch::cout() << '\033' << _escapeCode; } }; - inline bool shouldUseColourForPlatform() { - return isatty(STDOUT_FILENO); - } - - static Detail::IColourImpl* platformColourInstance() { - static PosixColourImpl s_instance; - return &s_instance; + IColourImpl* platformColourInstance() { + ErrnoGuard guard; + Ptr<IConfig const> config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) ) + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes + ? PosixColourImpl::instance() + : NoColourImpl::instance(); } } // end anon namespace } // end namespace Catch -#endif // not Windows +#else // not Windows or ANSI /////////////////////////////////////////////// namespace Catch { - namespace { - struct NoColourImpl : Detail::IColourImpl { - void use( Colour::Code ) {} + static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); } - static IColourImpl* instance() { - static NoColourImpl s_instance; - return &s_instance; - } - }; - static bool shouldUseColour() { - return shouldUseColourForPlatform() && !isDebuggerActive(); - } - } +} // end namespace Catch + +#endif // Windows/ ANSI/ None + +namespace Catch { Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast<Colour&>( _other ).m_moved = true; } Colour::~Colour(){ if( !m_moved ) use( None ); } - void Colour::use( Code _colourCode ) { - impl()->use( _colourCode ); - } - Detail::IColourImpl* Colour::impl() { - return shouldUseColour() - ? platformColourInstance() - : NoColourImpl::instance(); + void Colour::use( Code _colourCode ) { + static IColourImpl* impl = platformColourInstance(); + impl->use( _colourCode ); } } // end namespace Catch @@ -6157,14 +8156,18 @@ namespace Catch { namespace Catch { - AssertionInfo::AssertionInfo( std::string const& _macroName, + AssertionInfo::AssertionInfo():macroName(""), capturedExpression(""), resultDisposition(ResultDisposition::Normal), secondArg(""){} + + AssertionInfo::AssertionInfo( char const * _macroName, SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ) + char const * _capturedExpression, + ResultDisposition::Flags _resultDisposition, + char const * _secondArg) : macroName( _macroName ), lineInfo( _lineInfo ), capturedExpression( _capturedExpression ), - resultDisposition( _resultDisposition ) + resultDisposition( _resultDisposition ), + secondArg( _secondArg ) {} AssertionResult::AssertionResult() {} @@ -6191,24 +8194,30 @@ namespace Catch { } bool AssertionResult::hasExpression() const { - return !m_info.capturedExpression.empty(); + return m_info.capturedExpression[0] != 0; } bool AssertionResult::hasMessage() const { return !m_resultData.message.empty(); } + std::string capturedExpressionWithSecondArgument( char const * capturedExpression, char const * secondArg ) { + return (secondArg[0] == 0 || secondArg[0] == '"' && secondArg[1] == '"') + ? capturedExpression + : std::string(capturedExpression) + ", " + secondArg; + } + std::string AssertionResult::getExpression() const { if( isFalseTest( m_info.resultDisposition ) ) - return "!" + m_info.capturedExpression; + return "!(" + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg) + ")"; else - return m_info.capturedExpression; + return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); } std::string AssertionResult::getExpressionInMacro() const { - if( m_info.macroName.empty() ) - return m_info.capturedExpression; + if( m_info.macroName[0] == 0 ) + return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg); else - return m_info.macroName + "( " + m_info.capturedExpression + " )"; + return std::string(m_info.macroName) + "( " + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg) + " )"; } bool AssertionResult::hasExpandedExpression() const { @@ -6216,7 +8225,7 @@ namespace Catch { } std::string AssertionResult::getExpandedExpression() const { - return m_resultData.reconstructedExpression; + return m_resultData.reconstructExpression(); } std::string AssertionResult::getMessage() const { @@ -6230,15 +8239,25 @@ namespace Catch { return m_info.macroName; } + void AssertionResult::discardDecomposedExpression() const { + m_resultData.decomposedExpression = CATCH_NULL; + } + + void AssertionResult::expandDecomposedExpression() const { + m_resultData.reconstructExpression(); + } + } // end namespace Catch // #included from: catch_test_case_info.hpp #define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED +#include <cctype> + namespace Catch { inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { - if( tag == "." || + if( startsWith( tag, '.' ) || tag == "hide" || tag == "!hide" ) return TestCaseInfo::IsHidden; @@ -6248,25 +8267,23 @@ namespace Catch { return TestCaseInfo::ShouldFail; else if( tag == "!mayfail" ) return TestCaseInfo::MayFail; + else if( tag == "!nonportable" ) + return TestCaseInfo::NonPortable; else return TestCaseInfo::None; } inline bool isReservedTag( std::string const& tag ) { - return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !isalnum( tag[0] ); + return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( tag[0] ); } inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { if( isReservedTag( tag ) ) { - { - Colour colourGuard( Colour::Red ); - std::cerr - << "Tag name [" << tag << "] not allowed.\n" - << "Tag names starting with non alpha-numeric characters are reserved\n"; - } - { - Colour colourGuard( Colour::FileName ); - std::cerr << _lineInfo << std::endl; - } - exit(1); + std::ostringstream ss; + ss << Colour(Colour::Red) + << "Tag name [" << tag << "] not allowed.\n" + << "Tag names starting with non alpha-numeric characters are reserved\n" + << Colour(Colour::FileName) + << _lineInfo << '\n'; + throw std::runtime_error(ss.str()); } } @@ -6292,14 +8309,15 @@ namespace Catch { } else { if( c == ']' ) { - enforceNotReservedTag( tag, _lineInfo ); - - inTag = false; - if( tag == "hide" || tag == "." ) + TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag ); + if( prop == TestCaseInfo::IsHidden ) isHidden = true; - else - tags.insert( tag ); + else if( prop == TestCaseInfo::None ) + enforceNotReservedTag( tag, _lineInfo ); + + tags.insert( tag ); tag.clear(); + inTag = false; } else tag += c; @@ -6314,6 +8332,21 @@ namespace Catch { return TestCase( _testCase, info ); } + void setTags( TestCaseInfo& testCaseInfo, std::set<std::string> const& tags ) + { + testCaseInfo.tags = tags; + testCaseInfo.lcaseTags.clear(); + + std::ostringstream oss; + for( std::set<std::string>::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it ) { + oss << '[' << *it << ']'; + std::string lcaseTag = toLower( *it ); + testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>( testCaseInfo.properties | parseSpecialTag( lcaseTag ) ); + testCaseInfo.lcaseTags.insert( lcaseTag ); + } + testCaseInfo.tagsAsString = oss.str(); + } + TestCaseInfo::TestCaseInfo( std::string const& _name, std::string const& _className, std::string const& _description, @@ -6322,18 +8355,10 @@ namespace Catch { : name( _name ), className( _className ), description( _description ), - tags( _tags ), lineInfo( _lineInfo ), properties( None ) { - std::ostringstream oss; - for( std::set<std::string>::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it ) { - oss << "[" << *it << "]"; - std::string lcaseTag = toLower( *it ); - properties = static_cast<SpecialProperties>( properties | parseSpecialTag( lcaseTag ) ); - lcaseTags.insert( lcaseTag ); - } - tagsAsString = oss.str(); + setTags( *this, _tags ); } TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) @@ -6416,8 +8441,36 @@ namespace Catch { namespace Catch { - // These numbers are maintained by a script - Version libraryVersion( 1, 0, 53, "master" ); + Version::Version + ( unsigned int _majorVersion, + unsigned int _minorVersion, + unsigned int _patchNumber, + char const * const _branchName, + unsigned int _buildNumber ) + : majorVersion( _majorVersion ), + minorVersion( _minorVersion ), + patchNumber( _patchNumber ), + branchName( _branchName ), + buildNumber( _buildNumber ) + {} + + std::ostream& operator << ( std::ostream& os, Version const& version ) { + os << version.majorVersion << '.' + << version.minorVersion << '.' + << version.patchNumber; + // branchName is never null -> 0th char is \0 if it is empty + if (version.branchName[0]) { + os << '-' << version.branchName + << '.' << version.buildNumber; + } + return os; + } + + inline Version libraryVersion() { + static Version version( 1, 12, 2, "", 0 ); + return version; + } + } // #included from: catch_message.hpp @@ -6449,9 +8502,18 @@ namespace Catch { : m_info( other.m_info ) {} +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4996) // std::uncaught_exception is deprecated in C++17 +#endif ScopedMessage::~ScopedMessage() { - getResultCapture().popScopedMessage( m_info ); + if ( !std::uncaught_exception() ){ + getResultCapture().popScopedMessage(m_info); + } } +#if defined(_MSC_VER) +#pragma warning(pop) +#endif } // end namespace Catch @@ -6501,6 +8563,7 @@ namespace Catch virtual void testCaseEnded( TestCaseStats const& testCaseStats ); virtual void testGroupEnded( TestGroupStats const& testGroupStats ); virtual void testRunEnded( TestRunStats const& testRunStats ); + virtual void skipTest( TestCaseInfo const& ); private: Ptr<IReporter> m_legacyReporter; @@ -6574,6 +8637,8 @@ namespace Catch void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { m_legacyReporter->EndTesting( testRunStats.totals ); } + void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) { + } } // #included from: catch_timer.hpp @@ -6584,30 +8649,32 @@ namespace Catch #endif #ifdef CATCH_PLATFORM_WINDOWS -#include <windows.h> + #else + #include <sys/time.h> + #endif namespace Catch { namespace { #ifdef CATCH_PLATFORM_WINDOWS - uint64_t getCurrentTicks() { - static uint64_t hz=0, hzo=0; + UInt64 getCurrentTicks() { + static UInt64 hz=0, hzo=0; if (!hz) { - QueryPerformanceFrequency((LARGE_INTEGER*)&hz); - QueryPerformanceCounter((LARGE_INTEGER*)&hzo); + QueryPerformanceFrequency( reinterpret_cast<LARGE_INTEGER*>( &hz ) ); + QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>( &hzo ) ); } - uint64_t t; - QueryPerformanceCounter((LARGE_INTEGER*)&t); + UInt64 t; + QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>( &t ) ); return ((t-hzo)*1000000)/hz; } #else - uint64_t getCurrentTicks() { + UInt64 getCurrentTicks() { timeval t; - gettimeofday(&t,NULL); - return static_cast<uint64_t>( t.tv_sec ) * 1000000ull + static_cast<uint64_t>( t.tv_usec ); + gettimeofday(&t,CATCH_NULL); + return static_cast<UInt64>( t.tv_sec ) * 1000000ull + static_cast<UInt64>( t.tv_usec ); } #endif } @@ -6615,14 +8682,14 @@ namespace Catch { void Timer::start() { m_ticks = getCurrentTicks(); } - unsigned int Timer::getElapsedNanoseconds() const { + unsigned int Timer::getElapsedMicroseconds() const { return static_cast<unsigned int>(getCurrentTicks() - m_ticks); } unsigned int Timer::getElapsedMilliseconds() const { - return static_cast<unsigned int>((getCurrentTicks() - m_ticks)/1000); + return static_cast<unsigned int>(getElapsedMicroseconds()/1000); } double Timer::getElapsedSeconds() const { - return (getCurrentTicks() - m_ticks)/1000000.0; + return getElapsedMicroseconds()/1000000.0; } } // namespace Catch @@ -6633,19 +8700,31 @@ namespace Catch { // #included from: catch_common.hpp #define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED +#include <cstring> +#include <cctype> + namespace Catch { bool startsWith( std::string const& s, std::string const& prefix ) { - return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix; + return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin()); + } + bool startsWith( std::string const& s, char prefix ) { + return !s.empty() && s[0] == prefix; } bool endsWith( std::string const& s, std::string const& suffix ) { - return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix; + return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin()); + } + bool endsWith( std::string const& s, char suffix ) { + return !s.empty() && s[s.size()-1] == suffix; } bool contains( std::string const& s, std::string const& infix ) { return s.find( infix ) != std::string::npos; } + char toLowerCh(char c) { + return static_cast<char>( std::tolower( c ) ); + } void toLowerInPlace( std::string& s ) { - std::transform( s.begin(), s.end(), s.begin(), ::tolower ); + std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); } std::string toLower( std::string const& s ) { std::string lc = s; @@ -6657,7 +8736,21 @@ namespace Catch { std::string::size_type start = str.find_first_not_of( whitespaceChars ); std::string::size_type end = str.find_last_not_of( whitespaceChars ); - return start != std::string::npos ? str.substr( start, 1+end-start ) : ""; + return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string(); + } + + bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { + bool replaced = false; + std::size_t i = str.find( replaceThis ); + while( i != std::string::npos ) { + replaced = true; + str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); + if( i < str.size()-withThis.size() ) + i = str.find( replaceThis, i+withThis.size() ); + else + i = std::string::npos; + } + return replaced; } pluralise::pluralise( std::size_t count, std::string const& label ) @@ -6666,40 +8759,47 @@ namespace Catch { {} std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { - os << pluraliser.m_count << " " << pluraliser.m_label; + os << pluraliser.m_count << ' ' << pluraliser.m_label; if( pluraliser.m_count != 1 ) - os << "s"; + os << 's'; return os; } - SourceLineInfo::SourceLineInfo() : line( 0 ){} + SourceLineInfo::SourceLineInfo() : file(""), line( 0 ){} SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) : file( _file ), line( _line ) {} - SourceLineInfo::SourceLineInfo( SourceLineInfo const& other ) - : file( other.file ), - line( other.line ) - {} bool SourceLineInfo::empty() const { - return file.empty(); + return file[0] == '\0'; } bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { - return line == other.line && file == other.file; + return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0); + } + bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const { + return line < other.line || ( line == other.line && (std::strcmp(file, other.file) < 0)); + } + + void seedRng( IConfig const& config ) { + if( config.rngSeed() != 0 ) + std::srand( config.rngSeed() ); + } + unsigned int rngSeed() { + return getCurrentContext().getConfig()->rngSeed(); } std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { #ifndef __GNUG__ - os << info.file << "(" << info.line << ")"; + os << info.file << '(' << info.line << ')'; #else - os << info.file << ":" << info.line; + os << info.file << ':' << info.line; #endif return os; } void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { std::ostringstream oss; - oss << locationInfo << ": Internal Catch error: '" << message << "'"; + oss << locationInfo << ": Internal Catch error: '" << message << '\''; if( alwaysTrue() ) throw std::logic_error( oss.str() ); } @@ -6726,10 +8826,22 @@ namespace Catch { m_timer.start(); } +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4996) // std::uncaught_exception is deprecated in C++17 +#endif Section::~Section() { - if( m_sectionIncluded ) - getResultCapture().sectionEnded( m_info, m_assertions, m_timer.getElapsedSeconds() ); + if( m_sectionIncluded ) { + SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() ); + if( std::uncaught_exception() ) + getResultCapture().sectionEndedEarly( endInfo ); + else + getResultCapture().sectionEnded( endInfo ); + } } +#if defined(_MSC_VER) +#pragma warning(pop) +#endif // This indicates whether the section should be executed or not Section::operator bool() const { @@ -6741,8 +8853,6 @@ namespace Catch { // #included from: catch_debugger.hpp #define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED -#include <iostream> - #ifdef CATCH_PLATFORM_MAC #include <assert.h> @@ -6780,8 +8890,8 @@ namespace Catch { // Call sysctl. size = sizeof(info); - if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0) != 0 ) { - std::cerr << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; + if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0 ) { + Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; return false; } @@ -6791,6 +8901,36 @@ namespace Catch { } } // namespace Catch +#elif defined(CATCH_PLATFORM_LINUX) + #include <fstream> + #include <string> + + namespace Catch{ + // The standard POSIX way of detecting a debugger is to attempt to + // ptrace() the process, but this needs to be done from a child and not + // this process itself to still allow attaching to this process later + // if wanted, so is rather heavy. Under Linux we have the PID of the + // "debugger" (which doesn't need to be gdb, of course, it could also + // be strace, for example) in /proc/$PID/status, so just get it from + // there instead. + bool isDebuggerActive(){ + // Libstdc++ has a bug, where std::ifstream sets errno to 0 + // This way our users can properly assert over errno values + ErrnoGuard guard; + std::ifstream in("/proc/self/status"); + for( std::string line; std::getline(in, line); ) { + static const int PREFIX_LEN = 11; + if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) { + // We're traced if the PID is not 0 and no other PID starts + // with 0 digit, so it's enough to check for just a single + // character. + return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0'; + } + } + + return false; + } + } // namespace Catch #elif defined(_MSC_VER) extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); namespace Catch { @@ -6812,7 +8952,7 @@ namespace Catch { #endif // Platform #ifdef CATCH_PLATFORM_WINDOWS - extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* ); + namespace Catch { void writeToDebugConsole( std::string const& text ) { ::OutputDebugStringA( text.c_str() ); @@ -6822,7 +8962,7 @@ namespace Catch { namespace Catch { void writeToDebugConsole( std::string const& text ) { // !TBD: Need a version for Mac/ XCode and other IDEs - std::cout << text; + Catch::cout() << text; } } #endif // Platform @@ -6834,7 +8974,11 @@ namespace Catch { namespace Detail { + const std::string unprintableString = "{?}"; + namespace { + const int hexThreshold = 255; + struct Endianness { enum Arch { Big, Little }; @@ -6884,7 +9028,7 @@ std::string toString( std::string const& value ) { } } } - return "\"" + s + "\""; + return '"' + s + '"'; } std::string toString( std::wstring const& value ) { @@ -6892,7 +9036,7 @@ std::string toString( std::wstring const& value ) { s.reserve( value.size() ); for(size_t i = 0; i < value.size(); ++i ) s += value[i] <= 0xff ? static_cast<char>( value[i] ) : '?'; - return toString( s ); + return Catch::toString( s ); } std::string toString( const char* const value ) { @@ -6905,31 +9049,32 @@ std::string toString( char* const value ) { std::string toString( const wchar_t* const value ) { - return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" ); + return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" ); } std::string toString( wchar_t* const value ) { - return Catch::toString( static_cast<const wchar_t*>( value ) ); + return Catch::toString( static_cast<const wchar_t*>( value ) ); } std::string toString( int value ) { std::ostringstream oss; oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; return oss.str(); } std::string toString( unsigned long value ) { std::ostringstream oss; - if( value > 8192 ) - oss << "0x" << std::hex << value; - else - oss << value; + oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; return oss.str(); } std::string toString( unsigned int value ) { - return toString( static_cast<unsigned long>( value ) ); + return Catch::toString( static_cast<unsigned long>( value ) ); } template<typename T> @@ -6952,7 +9097,7 @@ std::string toString( const double value ) { return fpToString( value, 10 ); } std::string toString( const float value ) { - return fpToString( value, 5 ) + "f"; + return fpToString( value, 5 ) + 'f'; } std::string toString( bool value ) { @@ -6960,9 +9105,19 @@ std::string toString( bool value ) { } std::string toString( char value ) { - return value < ' ' - ? toString( static_cast<unsigned int>( value ) ) - : Detail::makeString( value ); + if ( value == '\r' ) + return "'\\r'"; + if ( value == '\f' ) + return "'\\f'"; + if ( value == '\n' ) + return "'\\n'"; + if ( value == '\t' ) + return "'\\t'"; + if ( '\0' <= value && value < ' ' ) + return toString( static_cast<unsigned int>( value ) ); + char chstr[] = "' '"; + chstr[1] = value; + return chstr; } std::string toString( signed char value ) { @@ -6973,6 +9128,23 @@ std::string toString( unsigned char value ) { return toString( static_cast<char>( value ) ); } +#ifdef CATCH_CONFIG_CPP11_LONG_LONG +std::string toString( long long value ) { + std::ostringstream oss; + oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; + return oss.str(); +} +std::string toString( unsigned long long value ) { + std::ostringstream oss; + oss << value; + if( value > Detail::hexThreshold ) + oss << " (0x" << std::hex << value << ')'; + return oss.str(); +} +#endif + #ifdef CATCH_CONFIG_CPP11_NULLPTR std::string toString( std::nullptr_t ) { return "nullptr"; @@ -6985,7 +9157,7 @@ std::string toString( std::nullptr_t ) { return "nil"; return "@" + toString([nsstring UTF8String]); } - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) { + std::string toString( NSString * CATCH_ARC_STRONG & nsstring ) { if( !nsstring ) return "nil"; return "@" + toString([nsstring UTF8String]); @@ -7000,17 +9172,32 @@ std::string toString( std::nullptr_t ) { // #included from: catch_result_builder.hpp #define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED +#include <cassert> + namespace Catch { ResultBuilder::ResultBuilder( char const* macroName, SourceLineInfo const& lineInfo, char const* capturedExpression, - ResultDisposition::Flags resultDisposition ) - : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition ), + ResultDisposition::Flags resultDisposition, + char const* secondArg ) + : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition, secondArg ), m_shouldDebugBreak( false ), - m_shouldThrow( false ) + m_shouldThrow( false ), + m_guardException( false ), + m_usedStream( false ) {} + ResultBuilder::~ResultBuilder() { +#if defined(CATCH_CONFIG_FAST_COMPILE) + if ( m_guardException ) { + stream().oss << "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE"; + captureResult( ResultWas::ThrewException ); + getCurrentContext().getResultCapture()->exceptionEarlyReported(); + } +#endif + } + ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { m_data.resultType = result; return *this; @@ -7019,27 +9206,27 @@ namespace Catch { m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; return *this; } - ResultBuilder& ResultBuilder::setLhs( std::string const& lhs ) { - m_exprComponents.lhs = lhs; - return *this; - } - ResultBuilder& ResultBuilder::setRhs( std::string const& rhs ) { - m_exprComponents.rhs = rhs; - return *this; - } - ResultBuilder& ResultBuilder::setOp( std::string const& op ) { - m_exprComponents.op = op; - return *this; - } - void ResultBuilder::endExpression() { - m_exprComponents.testFalse = isFalseTest( m_assertionInfo.resultDisposition ); - captureExpression(); + void ResultBuilder::endExpression( DecomposedExpression const& expr ) { + // Flip bool results if FalseTest flag is set + if( isFalseTest( m_assertionInfo.resultDisposition ) ) { + m_data.negate( expr.isBinaryExpression() ); + } + + getResultCapture().assertionRun(); + + if(getCurrentContext().getConfig()->includeSuccessfulResults() || m_data.resultType != ResultWas::Ok) + { + AssertionResult result = build( expr ); + handleResult( result ); + } + else + getResultCapture().assertionPassed(); } void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { m_assertionInfo.resultDisposition = resultDisposition; - m_stream.oss << Catch::translateActiveException(); + stream().oss << Catch::translateActiveException(); captureResult( ResultWas::ThrewException ); } @@ -7048,18 +9235,56 @@ namespace Catch { captureExpression(); } + void ResultBuilder::captureExpectedException( std::string const& expectedMessage ) { + if( expectedMessage.empty() ) + captureExpectedException( Matchers::Impl::MatchAllOf<std::string>() ); + else + captureExpectedException( Matchers::Equals( expectedMessage ) ); + } + + void ResultBuilder::captureExpectedException( Matchers::Impl::MatcherBase<std::string> const& matcher ) { + + assert( !isFalseTest( m_assertionInfo.resultDisposition ) ); + AssertionResultData data = m_data; + data.resultType = ResultWas::Ok; + data.reconstructedExpression = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg); + + std::string actualMessage = Catch::translateActiveException(); + if( !matcher.match( actualMessage ) ) { + data.resultType = ResultWas::ExpressionFailed; + data.reconstructedExpression = actualMessage; + } + AssertionResult result( m_assertionInfo, data ); + handleResult( result ); + } + void ResultBuilder::captureExpression() { AssertionResult result = build(); + handleResult( result ); + } + + void ResultBuilder::handleResult( AssertionResult const& result ) + { getResultCapture().assertionEnded( result ); if( !result.isOk() ) { if( getCurrentContext().getConfig()->shouldDebugBreak() ) m_shouldDebugBreak = true; - if( getCurrentContext().getRunner()->aborting() || m_assertionInfo.resultDisposition == ResultDisposition::Normal ) + if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) ) m_shouldThrow = true; } } + void ResultBuilder::react() { +#if defined(CATCH_CONFIG_FAST_COMPILE) + if (m_shouldDebugBreak) { + /////////////////////////////////////////////////////////////////// + // To inspect the state during test, you need to go one level up the callstack + // To go back to the test and change execution, jump over the throw statement + /////////////////////////////////////////////////////////////////// + CATCH_BREAK_INTO_DEBUGGER(); + } +#endif if( m_shouldThrow ) throw Catch::TestFailureException(); } @@ -7069,43 +9294,35 @@ namespace Catch { AssertionResult ResultBuilder::build() const { - assert( m_data.resultType != ResultWas::Unknown ); + return build( *this ); + } + // CAVEAT: The returned AssertionResult stores a pointer to the argument expr, + // a temporary DecomposedExpression, which in turn holds references to + // operands, possibly temporary as well. + // It should immediately be passed to handleResult; if the expression + // needs to be reported, its string expansion must be composed before + // the temporaries are destroyed. + AssertionResult ResultBuilder::build( DecomposedExpression const& expr ) const + { + assert( m_data.resultType != ResultWas::Unknown ); AssertionResultData data = m_data; - // Flip bool results if testFalse is set - if( m_exprComponents.testFalse ) { - if( data.resultType == ResultWas::Ok ) - data.resultType = ResultWas::ExpressionFailed; - else if( data.resultType == ResultWas::ExpressionFailed ) - data.resultType = ResultWas::Ok; - } - - data.message = m_stream.oss.str(); - data.reconstructedExpression = reconstructExpression(); - if( m_exprComponents.testFalse ) { - if( m_exprComponents.op == "" ) - data.reconstructedExpression = "!" + data.reconstructedExpression; - else - data.reconstructedExpression = "!(" + data.reconstructedExpression + ")"; - } + if(m_usedStream) + data.message = m_stream().oss.str(); + data.decomposedExpression = &expr; // for lazy reconstruction return AssertionResult( m_assertionInfo, data ); } - std::string ResultBuilder::reconstructExpression() const { - if( m_exprComponents.op == "" ) - return m_exprComponents.lhs.empty() ? m_assertionInfo.capturedExpression : m_exprComponents.op + m_exprComponents.lhs; - else if( m_exprComponents.op == "matches" ) - return m_exprComponents.lhs + " " + m_exprComponents.rhs; - else if( m_exprComponents.op != "!" ) { - if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 && - m_exprComponents.lhs.find("\n") == std::string::npos && - m_exprComponents.rhs.find("\n") == std::string::npos ) - return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs; - else - return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs; - } - else - return "{can't expand - use " + m_assertionInfo.macroName + "_FALSE( " + m_assertionInfo.capturedExpression.substr(1) + " ) instead of " + m_assertionInfo.macroName + "( " + m_assertionInfo.capturedExpression + " ) for better diagnostics}"; + + void ResultBuilder::reconstructExpression( std::string& dest ) const { + dest = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg); + } + + void ResultBuilder::setExceptionGuard() { + m_guardException = true; + } + void ResultBuilder::unsetExceptionGuard() { + m_guardException = false; } } // end namespace Catch @@ -7113,30 +9330,6 @@ namespace Catch { // #included from: catch_tag_alias_registry.hpp #define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED -// #included from: catch_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED - -#include <map> - -namespace Catch { - - class TagAliasRegistry : public ITagAliasRegistry { - public: - virtual ~TagAliasRegistry(); - virtual Option<TagAlias> find( std::string const& alias ) const; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; - void add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - static TagAliasRegistry& get(); - - private: - std::map<std::string, TagAlias> m_registry; - }; - -} // end namespace Catch - -#include <map> -#include <iostream> - namespace Catch { TagAliasRegistry::~TagAliasRegistry() {} @@ -7164,94 +9357,343 @@ namespace Catch { return expandedTestSpec; } - void TagAliasRegistry::add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { + void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) { - if( !startsWith( alias, "[@" ) || !endsWith( alias, "]" ) ) { + if( !startsWith( alias, "[@" ) || !endsWith( alias, ']' ) ) { std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" << lineInfo; + oss << Colour( Colour::Red ) + << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" + << Colour( Colour::FileName ) + << lineInfo << '\n'; throw std::domain_error( oss.str().c_str() ); } if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" already registered.\n" - << "\tFirst seen at " << find(alias)->lineInfo << "\n" - << "\tRedefined at " << lineInfo; + oss << Colour( Colour::Red ) + << "error: tag alias, \"" << alias << "\" already registered.\n" + << "\tFirst seen at " + << Colour( Colour::Red ) << find(alias)->lineInfo << '\n' + << Colour( Colour::Red ) << "\tRedefined at " + << Colour( Colour::FileName) << lineInfo << '\n'; throw std::domain_error( oss.str().c_str() ); } } - TagAliasRegistry& TagAliasRegistry::get() { - static TagAliasRegistry instance; - return instance; - - } - ITagAliasRegistry::~ITagAliasRegistry() {} - ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); } + + ITagAliasRegistry const& ITagAliasRegistry::get() { + return getRegistryHub().getTagAliasRegistry(); + } RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - try { - TagAliasRegistry::get().add( alias, tag, lineInfo ); - } - catch( std::exception& ex ) { - Colour colourGuard( Colour::Red ); - std::cerr << ex.what() << std::endl; - exit(1); - } + getMutableRegistryHub().registerTagAlias( alias, tag, lineInfo ); } } // end namespace Catch +// #included from: catch_matchers_string.hpp + +namespace Catch { +namespace Matchers { + + namespace StdString { + + CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_str( adjustString( str ) ) + {} + std::string CasedString::adjustString( std::string const& str ) const { + return m_caseSensitivity == CaseSensitive::No + ? toLower( str ) + : str; + } + std::string CasedString::caseSensitivitySuffix() const { + return m_caseSensitivity == CaseSensitive::No + ? " (case insensitive)" + : std::string(); + } + + StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator ) + : m_comparator( comparator ), + m_operation( operation ) { + } + + std::string StringMatcherBase::describe() const { + std::string description; + description.reserve(5 + m_operation.size() + m_comparator.m_str.size() + + m_comparator.caseSensitivitySuffix().size()); + description += m_operation; + description += ": \""; + description += m_comparator.m_str; + description += "\""; + description += m_comparator.caseSensitivitySuffix(); + return description; + } + + EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {} + + bool EqualsMatcher::match( std::string const& source ) const { + return m_comparator.adjustString( source ) == m_comparator.m_str; + } + + ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {} + + bool ContainsMatcher::match( std::string const& source ) const { + return contains( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {} + + bool StartsWithMatcher::match( std::string const& source ) const { + return startsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {} + + bool EndsWithMatcher::match( std::string const& source ) const { + return endsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + } // namespace StdString + + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } + +} // namespace Matchers +} // namespace Catch +// #included from: ../reporters/catch_reporter_multi.hpp +#define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED + +namespace Catch { + +class MultipleReporters : public SharedImpl<IStreamingReporter> { + typedef std::vector<Ptr<IStreamingReporter> > Reporters; + Reporters m_reporters; + +public: + void add( Ptr<IStreamingReporter> const& reporter ) { + m_reporters.push_back( reporter ); + } + +public: // IStreamingReporter + + virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { + return m_reporters[0]->getPreferences(); + } + + virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->noMatchingTestCases( spec ); + } + + virtual void testRunStarting( TestRunInfo const& testRunInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testRunStarting( testRunInfo ); + } + + virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testGroupStarting( groupInfo ); + } + + virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testCaseStarting( testInfo ); + } + + virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->sectionStarting( sectionInfo ); + } + + virtual void assertionStarting( AssertionInfo const& assertionInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->assertionStarting( assertionInfo ); + } + + // The return value indicates if the messages buffer should be cleared: + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { + bool clearBuffer = false; + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + clearBuffer |= (*it)->assertionEnded( assertionStats ); + return clearBuffer; + } + + virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->sectionEnded( sectionStats ); + } + + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testCaseEnded( testCaseStats ); + } + + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testGroupEnded( testGroupStats ); + } + + virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->testRunEnded( testRunStats ); + } + + virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { + for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); + it != itEnd; + ++it ) + (*it)->skipTest( testInfo ); + } + + virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE { + return this; + } + +}; + +Ptr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter ) { + Ptr<IStreamingReporter> resultingReporter; + + if( existingReporter ) { + MultipleReporters* multi = existingReporter->tryAsMulti(); + if( !multi ) { + multi = new MultipleReporters; + resultingReporter = Ptr<IStreamingReporter>( multi ); + if( existingReporter ) + multi->add( existingReporter ); + } + else + resultingReporter = existingReporter; + multi->add( additionalReporter ); + } + else + resultingReporter = additionalReporter; + + return resultingReporter; +} + +} // end namespace Catch + // #included from: ../reporters/catch_reporter_xml.hpp #define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED // #included from: catch_reporter_bases.hpp #define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED +#include <cstring> +#include <cfloat> +#include <cstdio> +#include <assert.h> + namespace Catch { + namespace { + // Because formatting using c++ streams is stateful, drop down to C is required + // Alternatively we could use stringstream, but its performance is... not good. + std::string getFormattedDuration( double duration ) { + // Max exponent + 1 is required to represent the whole part + // + 1 for decimal point + // + 3 for the 3 decimal places + // + 1 for null terminator + const size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1; + char buffer[maxDoubleSize]; + + // Save previous errno, to prevent sprintf from overwriting it + ErrnoGuard guard; +#ifdef _MSC_VER + sprintf_s(buffer, "%.3f", duration); +#else + sprintf(buffer, "%.3f", duration); +#endif + return std::string(buffer); + } + } + struct StreamingReporterBase : SharedImpl<IStreamingReporter> { StreamingReporterBase( ReporterConfig const& _config ) : m_config( _config.fullConfig() ), stream( _config.stream() ) - {} + { + m_reporterPrefs.shouldRedirectStdOut = false; + } - virtual ~StreamingReporterBase(); + virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { + return m_reporterPrefs; + } - virtual void noMatchingTestCases( std::string const& ) {} + virtual ~StreamingReporterBase() CATCH_OVERRIDE; - virtual void testRunStarting( TestRunInfo const& _testRunInfo ) { + virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {} + + virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE { currentTestRunInfo = _testRunInfo; } - virtual void testGroupStarting( GroupInfo const& _groupInfo ) { + virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE { currentGroupInfo = _groupInfo; } - virtual void testCaseStarting( TestCaseInfo const& _testInfo ) { + virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE { currentTestCaseInfo = _testInfo; } - virtual void sectionStarting( SectionInfo const& _sectionInfo ) { + virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { m_sectionStack.push_back( _sectionInfo ); } - virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) { + virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE { m_sectionStack.pop_back(); } - virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) { + virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE { currentTestCaseInfo.reset(); - assert( m_sectionStack.empty() ); } - virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) { + virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE { currentGroupInfo.reset(); } - virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) { + virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE { currentTestCaseInfo.reset(); currentGroupInfo.reset(); currentTestRunInfo.reset(); } - Ptr<IConfig> m_config; + virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE { + // Don't do anything with this by default. + // It can optionally be overridden in the derived class. + } + + Ptr<IConfig const> m_config; std::ostream& stream; LazyStat<TestRunInfo> currentTestRunInfo; @@ -7259,6 +9701,7 @@ namespace Catch { LazyStat<TestCaseInfo> currentTestCaseInfo; std::vector<SectionInfo> m_sectionStack; + ReporterPreferences m_reporterPrefs; }; struct CumulativeReporterBase : SharedImpl<IStreamingReporter> { @@ -7293,12 +9736,13 @@ namespace Catch { struct BySectionInfo { BySectionInfo( SectionInfo const& other ) : m_other( other ) {} - BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} + BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} bool operator() ( Ptr<SectionNode> const& node ) const { - return node->stats.sectionInfo.lineInfo == m_other.lineInfo; + return ((node->stats.sectionInfo.name == m_other.name) && + (node->stats.sectionInfo.lineInfo == m_other.lineInfo)); } private: - void operator=( BySectionInfo const& ); + void operator=( BySectionInfo const& ); SectionInfo const& m_other; }; @@ -7309,15 +9753,21 @@ namespace Catch { CumulativeReporterBase( ReporterConfig const& _config ) : m_config( _config.fullConfig() ), stream( _config.stream() ) - {} + { + m_reporterPrefs.shouldRedirectStdOut = false; + } ~CumulativeReporterBase(); - virtual void testRunStarting( TestRunInfo const& ) {} - virtual void testGroupStarting( GroupInfo const& ) {} + virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { + return m_reporterPrefs; + } - virtual void testCaseStarting( TestCaseInfo const& ) {} + virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {} + virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {} - virtual void sectionStarting( SectionInfo const& sectionInfo ) { + virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {} + + virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); Ptr<SectionNode> node; if( m_sectionStack.empty() ) { @@ -7342,21 +9792,27 @@ namespace Catch { m_deepestSection = node; } - virtual void assertionStarting( AssertionInfo const& ) {} + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} - virtual bool assertionEnded( AssertionStats const& assertionStats ) { + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { assert( !m_sectionStack.empty() ); SectionNode& sectionNode = *m_sectionStack.back(); sectionNode.assertions.push_back( assertionStats ); + // AssertionResult holds a pointer to a temporary DecomposedExpression, + // which getExpandedExpression() calls to build the expression string. + // Our section stack copy of the assertionResult will likely outlive the + // temporary, so it must be expanded or discarded now to avoid calling + // a destroyed object later. + prepareExpandedExpression( sectionNode.assertions.back().assertionResult ); return true; } - virtual void sectionEnded( SectionStats const& sectionStats ) { + virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { assert( !m_sectionStack.empty() ); SectionNode& node = *m_sectionStack.back(); node.stats = sectionStats; m_sectionStack.pop_back(); } - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { Ptr<TestCaseNode> node = new TestCaseNode( testCaseStats ); assert( m_sectionStack.size() == 0 ); node->children.push_back( m_rootSection ); @@ -7367,12 +9823,12 @@ namespace Catch { m_deepestSection->stdOut = testCaseStats.stdOut; m_deepestSection->stdErr = testCaseStats.stdErr; } - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { Ptr<TestGroupNode> node = new TestGroupNode( testGroupStats ); node->children.swap( m_testCases ); m_testGroups.push_back( node ); } - virtual void testRunEnded( TestRunStats const& testRunStats ) { + virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { Ptr<TestRunNode> node = new TestRunNode( testRunStats ); node->children.swap( m_testGroups ); m_testRuns.push_back( node ); @@ -7380,7 +9836,16 @@ namespace Catch { } virtual void testRunEndedCumulative() = 0; - Ptr<IConfig> m_config; + virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {} + + virtual void prepareExpandedExpression( AssertionResult& result ) const { + if( result.isOk() ) + result.discardDecomposedExpression(); + else + result.expandDecomposedExpression(); + } + + Ptr<IConfig const> m_config; std::ostream& stream; std::vector<AssertionStats> m_assertions; std::vector<std::vector<Ptr<SectionNode> > > m_sections; @@ -7392,9 +9857,31 @@ namespace Catch { Ptr<SectionNode> m_rootSection; Ptr<SectionNode> m_deepestSection; std::vector<Ptr<SectionNode> > m_sectionStack; + ReporterPreferences m_reporterPrefs; }; + template<char C> + char const* getLineOfChars() { + static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; + if( !*line ) { + std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); + line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; + } + return line; + } + + struct TestEventListenerBase : StreamingReporterBase { + TestEventListenerBase( ReporterConfig const& _config ) + : StreamingReporterBase( _config ) + {} + + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} + virtual bool assertionEnded( AssertionStats const& ) CATCH_OVERRIDE { + return false; + } + }; + } // end namespace Catch // #included from: ../internal/catch_reporter_registrars.hpp @@ -7425,7 +9912,7 @@ namespace Catch { template<typename T> class ReporterRegistrar { - class ReporterFactory : public IReporterFactory { + class ReporterFactory : public SharedImpl<IReporterFactory> { // *** Please Note ***: // - If you end up here looking at a compiler error because it's trying to register @@ -7453,23 +9940,110 @@ namespace Catch { getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); } }; + + template<typename T> + class ListenerRegistrar { + + class ListenerFactory : public SharedImpl<IReporterFactory> { + + virtual IStreamingReporter* create( ReporterConfig const& config ) const { + return new T( config ); + } + virtual std::string getDescription() const { + return std::string(); + } + }; + + public: + + ListenerRegistrar() { + getMutableRegistryHub().registerListener( new ListenerFactory() ); + } + }; } #define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ namespace{ Catch::LegacyReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } + #define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } +// Deprecated - use the form without INTERNAL_ +#define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \ + namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } + +#define CATCH_REGISTER_LISTENER( listenerType ) \ + namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } + // #included from: ../internal/catch_xmlwriter.hpp #define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED #include <sstream> -#include <iostream> #include <string> #include <vector> +#include <iomanip> namespace Catch { + class XmlEncode { + public: + enum ForWhat { ForTextNodes, ForAttributes }; + + XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ) + : m_str( str ), + m_forWhat( forWhat ) + {} + + void encodeTo( std::ostream& os ) const { + + // Apostrophe escaping not necessary if we always use " to write attributes + // (see: http://www.w3.org/TR/xml/#syntax) + + for( std::size_t i = 0; i < m_str.size(); ++ i ) { + char c = m_str[i]; + switch( c ) { + case '<': os << "<"; break; + case '&': os << "&"; break; + + case '>': + // See: http://www.w3.org/TR/xml/#syntax + if( i > 2 && m_str[i-1] == ']' && m_str[i-2] == ']' ) + os << ">"; + else + os << c; + break; + + case '\"': + if( m_forWhat == ForAttributes ) + os << """; + else + os << c; + break; + + default: + // Escape control chars - based on contribution by @espenalb in PR #465 and + // by @mrpi PR #588 + if ( ( c >= 0 && c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' ) { + // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 + os << "\\x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) + << static_cast<int>( c ); + } + else + os << c; + } + } + } + + friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) { + xmlEncode.encodeTo( os ); + return os; + } + + private: + std::string m_str; + ForWhat m_forWhat; + }; + class XmlWriter { public: @@ -7481,7 +10055,7 @@ namespace Catch { ScopedElement( ScopedElement const& other ) : m_writer( other.m_writer ){ - other.m_writer = NULL; + other.m_writer = CATCH_NULL; } ~ScopedElement() { @@ -7507,45 +10081,28 @@ namespace Catch { XmlWriter() : m_tagIsOpen( false ), m_needsNewline( false ), - m_os( &std::cout ) - {} + m_os( Catch::cout() ) + { + writeDeclaration(); + } XmlWriter( std::ostream& os ) : m_tagIsOpen( false ), m_needsNewline( false ), - m_os( &os ) - {} + m_os( os ) + { + writeDeclaration(); + } ~XmlWriter() { while( !m_tags.empty() ) endElement(); } -//# ifndef CATCH_CPP11_OR_GREATER -// XmlWriter& operator = ( XmlWriter const& other ) { -// XmlWriter temp( other ); -// swap( temp ); -// return *this; -// } -//# else -// XmlWriter( XmlWriter const& ) = default; -// XmlWriter( XmlWriter && ) = default; -// XmlWriter& operator = ( XmlWriter const& ) = default; -// XmlWriter& operator = ( XmlWriter && ) = default; -//# endif -// -// void swap( XmlWriter& other ) { -// std::swap( m_tagIsOpen, other.m_tagIsOpen ); -// std::swap( m_needsNewline, other.m_needsNewline ); -// std::swap( m_tags, other.m_tags ); -// std::swap( m_indent, other.m_indent ); -// std::swap( m_os, other.m_os ); -// } - XmlWriter& startElement( std::string const& name ) { ensureTagClosed(); newlineIfNecessary(); - stream() << m_indent << "<" << name; + m_os << m_indent << '<' << name; m_tags.push_back( name ); m_indent += " "; m_tagIsOpen = true; @@ -7562,35 +10119,33 @@ namespace Catch { newlineIfNecessary(); m_indent = m_indent.substr( 0, m_indent.size()-2 ); if( m_tagIsOpen ) { - stream() << "/>\n"; + m_os << "/>"; m_tagIsOpen = false; } else { - stream() << m_indent << "</" << m_tags.back() << ">\n"; + m_os << m_indent << "</" << m_tags.back() << ">"; } + m_os << std::endl; m_tags.pop_back(); return *this; } XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { - if( !name.empty() && !attribute.empty() ) { - stream() << " " << name << "=\""; - writeEncodedText( attribute ); - stream() << "\""; - } + if( !name.empty() && !attribute.empty() ) + m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"'; return *this; } XmlWriter& writeAttribute( std::string const& name, bool attribute ) { - stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\""; + m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"'; return *this; } template<typename T> XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { - if( !name.empty() ) - stream() << " " << name << "=\"" << attribute << "\""; - return *this; + std::ostringstream oss; + oss << attribute; + return writeAttribute( name, oss.str() ); } XmlWriter& writeText( std::string const& text, bool indent = true ) { @@ -7598,8 +10153,8 @@ namespace Catch { bool tagWasOpen = m_tagIsOpen; ensureTagClosed(); if( tagWasOpen && indent ) - stream() << m_indent; - writeEncodedText( text ); + m_os << m_indent; + m_os << XmlEncode( text ); m_needsNewline = true; } return *this; @@ -7607,210 +10162,262 @@ namespace Catch { XmlWriter& writeComment( std::string const& text ) { ensureTagClosed(); - stream() << m_indent << "<!--" << text << "-->"; + m_os << m_indent << "<!--" << text << "-->"; m_needsNewline = true; return *this; } + void writeStylesheetRef( std::string const& url ) { + m_os << "<?xml-stylesheet type=\"text/xsl\" href=\"" << url << "\"?>\n"; + } + XmlWriter& writeBlankLine() { ensureTagClosed(); - stream() << "\n"; + m_os << '\n'; return *this; } - void setStream( std::ostream& os ) { - m_os = &os; + void ensureTagClosed() { + if( m_tagIsOpen ) { + m_os << ">" << std::endl; + m_tagIsOpen = false; + } } private: XmlWriter( XmlWriter const& ); void operator=( XmlWriter const& ); - std::ostream& stream() { - return *m_os; - } - - void ensureTagClosed() { - if( m_tagIsOpen ) { - stream() << ">\n"; - m_tagIsOpen = false; - } + void writeDeclaration() { + m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; } void newlineIfNecessary() { if( m_needsNewline ) { - stream() << "\n"; + m_os << std::endl; m_needsNewline = false; } } - void writeEncodedText( std::string const& text ) { - static const char* charsToEncode = "<&\""; - std::string mtext = text; - std::string::size_type pos = mtext.find_first_of( charsToEncode ); - while( pos != std::string::npos ) { - stream() << mtext.substr( 0, pos ); - - switch( mtext[pos] ) { - case '<': - stream() << "<"; - break; - case '&': - stream() << "&"; - break; - case '\"': - stream() << """; - break; - } - mtext = mtext.substr( pos+1 ); - pos = mtext.find_first_of( charsToEncode ); - } - stream() << mtext; - } - bool m_tagIsOpen; bool m_needsNewline; std::vector<std::string> m_tags; std::string m_indent; - std::ostream* m_os; + std::ostream& m_os; }; } + namespace Catch { - class XmlReporter : public SharedImpl<IReporter> { + class XmlReporter : public StreamingReporterBase { public: - XmlReporter( ReporterConfig const& config ) : m_config( config ), m_sectionDepth( 0 ) {} + XmlReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ), + m_xml(_config.stream()), + m_sectionDepth( 0 ) + { + m_reporterPrefs.shouldRedirectStdOut = true; + } + + virtual ~XmlReporter() CATCH_OVERRIDE; static std::string getDescription() { return "Reports test results as an XML document"; } - virtual ~XmlReporter(); - private: // IReporter - - virtual bool shouldRedirectStdout() const { - return true; + virtual std::string getStylesheetRef() const { + return std::string(); } - virtual void StartTesting() { - m_xml.setStream( m_config.stream() ); + void writeSourceInfo( SourceLineInfo const& sourceInfo ) { + m_xml + .writeAttribute( "filename", sourceInfo.file ) + .writeAttribute( "line", sourceInfo.line ); + } + + public: // StreamingReporterBase + + virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE { + StreamingReporterBase::noMatchingTestCases( s ); + } + + virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE { + StreamingReporterBase::testRunStarting( testInfo ); + std::string stylesheetRef = getStylesheetRef(); + if( !stylesheetRef.empty() ) + m_xml.writeStylesheetRef( stylesheetRef ); m_xml.startElement( "Catch" ); - if( !m_config.fullConfig()->name().empty() ) - m_xml.writeAttribute( "name", m_config.fullConfig()->name() ); + if( !m_config->name().empty() ) + m_xml.writeAttribute( "name", m_config->name() ); } - virtual void EndTesting( const Totals& totals ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", totals.assertions.passed ) - .writeAttribute( "failures", totals.assertions.failed ) - .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); - m_xml.endElement(); - } - - virtual void StartGroup( const std::string& groupName ) { + virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { + StreamingReporterBase::testGroupStarting( groupInfo ); m_xml.startElement( "Group" ) - .writeAttribute( "name", groupName ); + .writeAttribute( "name", groupInfo.name ); } - virtual void EndGroup( const std::string&, const Totals& totals ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", totals.assertions.passed ) - .writeAttribute( "failures", totals.assertions.failed ) - .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); - m_xml.endElement(); + virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { + StreamingReporterBase::testCaseStarting(testInfo); + m_xml.startElement( "TestCase" ) + .writeAttribute( "name", trim( testInfo.name ) ) + .writeAttribute( "description", testInfo.description ) + .writeAttribute( "tags", testInfo.tagsAsString ); + + writeSourceInfo( testInfo.lineInfo ); + + if ( m_config->showDurations() == ShowDurations::Always ) + m_testCaseTimer.start(); + m_xml.ensureTagClosed(); } - virtual void StartSection( const std::string& sectionName, const std::string& description ) { + virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { + StreamingReporterBase::sectionStarting( sectionInfo ); if( m_sectionDepth++ > 0 ) { m_xml.startElement( "Section" ) - .writeAttribute( "name", trim( sectionName ) ) - .writeAttribute( "description", description ); - } - } - virtual void NoAssertionsInSection( const std::string& ) {} - virtual void NoAssertionsInTestCase( const std::string& ) {} - - virtual void EndSection( const std::string& /*sectionName*/, const Counts& assertions ) { - if( --m_sectionDepth > 0 ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", assertions.passed ) - .writeAttribute( "failures", assertions.failed ) - .writeAttribute( "expectedFailures", assertions.failedButOk ); - m_xml.endElement(); + .writeAttribute( "name", trim( sectionInfo.name ) ) + .writeAttribute( "description", sectionInfo.description ); + writeSourceInfo( sectionInfo.lineInfo ); + m_xml.ensureTagClosed(); } } - virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) { - m_xml.startElement( "TestCase" ).writeAttribute( "name", trim( testInfo.name ) ); - m_currentTestSuccess = true; - } + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { } - virtual void Result( const Catch::AssertionResult& assertionResult ) { - if( !m_config.fullConfig()->includeSuccessfulResults() && assertionResult.getResultType() == ResultWas::Ok ) - return; + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - if( assertionResult.hasExpression() ) { + AssertionResult const& result = assertionStats.assertionResult; + + bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); + + if( includeResults || result.getResultType() == ResultWas::Warning ) { + // Print any info messages in <Info> tags. + for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); + it != itEnd; + ++it ) { + if( it->type == ResultWas::Info && includeResults ) { + m_xml.scopedElement( "Info" ) + .writeText( it->message ); + } else if ( it->type == ResultWas::Warning ) { + m_xml.scopedElement( "Warning" ) + .writeText( it->message ); + } + } + } + + // Drop out if result was successful but we're not printing them. + if( !includeResults && result.getResultType() != ResultWas::Warning ) + return true; + + // Print the expression if there is one. + if( result.hasExpression() ) { m_xml.startElement( "Expression" ) - .writeAttribute( "success", assertionResult.succeeded() ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ); + .writeAttribute( "success", result.succeeded() ) + .writeAttribute( "type", result.getTestMacroName() ); + + writeSourceInfo( result.getSourceInfo() ); m_xml.scopedElement( "Original" ) - .writeText( assertionResult.getExpression() ); + .writeText( result.getExpression() ); m_xml.scopedElement( "Expanded" ) - .writeText( assertionResult.getExpandedExpression() ); - m_currentTestSuccess &= assertionResult.succeeded(); + .writeText( result.getExpandedExpression() ); } - switch( assertionResult.getResultType() ) { + // And... Print a result applicable to each result type. + switch( result.getResultType() ) { case ResultWas::ThrewException: - m_xml.scopedElement( "Exception" ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ) - .writeText( assertionResult.getMessage() ); - m_currentTestSuccess = false; + m_xml.startElement( "Exception" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + case ResultWas::FatalErrorCondition: + m_xml.startElement( "FatalErrorCondition" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); break; case ResultWas::Info: m_xml.scopedElement( "Info" ) - .writeText( assertionResult.getMessage() ); + .writeText( result.getMessage() ); break; case ResultWas::Warning: - m_xml.scopedElement( "Warning" ) - .writeText( assertionResult.getMessage() ); + // Warning will already have been written break; case ResultWas::ExplicitFailure: - m_xml.scopedElement( "Failure" ) - .writeText( assertionResult.getMessage() ); - m_currentTestSuccess = false; + m_xml.startElement( "Failure" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); break; - case ResultWas::Unknown: - case ResultWas::Ok: - case ResultWas::FailureBit: - case ResultWas::ExpressionFailed: - case ResultWas::Exception: - case ResultWas::DidntThrowException: + default: break; } - if( assertionResult.hasExpression() ) + + if( result.hasExpression() ) m_xml.endElement(); + + return true; } - virtual void Aborted() { - // !TBD + virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { + StreamingReporterBase::sectionEnded( sectionStats ); + if( --m_sectionDepth > 0 ) { + XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); + e.writeAttribute( "successes", sectionStats.assertions.passed ); + e.writeAttribute( "failures", sectionStats.assertions.failed ); + e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); + + if ( m_config->showDurations() == ShowDurations::Always ) + e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); + + m_xml.endElement(); + } } - virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string&, const std::string& ) { - m_xml.scopedElement( "OverallResult" ).writeAttribute( "success", m_currentTestSuccess ); + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { + StreamingReporterBase::testCaseEnded( testCaseStats ); + XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); + e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); + + if ( m_config->showDurations() == ShowDurations::Always ) + e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); + + if( !testCaseStats.stdOut.empty() ) + m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), false ); + if( !testCaseStats.stdErr.empty() ) + m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), false ); + + m_xml.endElement(); + } + + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { + StreamingReporterBase::testGroupEnded( testGroupStats ); + // TODO: Check testGroupStats.aborting and act accordingly. + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) + .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); + m_xml.endElement(); + } + + virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { + StreamingReporterBase::testRunEnded( testRunStats ); + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", testRunStats.totals.assertions.passed ) + .writeAttribute( "failures", testRunStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); m_xml.endElement(); } private: - ReporterConfig m_config; - bool m_currentTestSuccess; + Timer m_testCaseTimer; XmlWriter m_xml; int m_sectionDepth; }; + INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter ) + } // end namespace Catch // #included from: ../reporters/catch_reporter_junit.hpp @@ -7820,33 +10427,60 @@ namespace Catch { namespace Catch { + namespace { + std::string getCurrentTimestamp() { + // Beware, this is not reentrant because of backward compatibility issues + // Also, UTC only, again because of backward compatibility (%z is C++11) + time_t rawtime; + std::time(&rawtime); + const size_t timeStampSize = sizeof("2017-01-16T17:06:45Z"); + +#ifdef _MSC_VER + std::tm timeInfo = {}; + gmtime_s(&timeInfo, &rawtime); +#else + std::tm* timeInfo; + timeInfo = std::gmtime(&rawtime); +#endif + + char timeStamp[timeStampSize]; + const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; + +#ifdef _MSC_VER + std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); +#else + std::strftime(timeStamp, timeStampSize, fmt, timeInfo); +#endif + return std::string(timeStamp); + } + + } + class JunitReporter : public CumulativeReporterBase { public: JunitReporter( ReporterConfig const& _config ) : CumulativeReporterBase( _config ), - xml( _config.stream() ) - {} + xml( _config.stream() ), + unexpectedExceptions( 0 ), + m_okToFail( false ) + { + m_reporterPrefs.shouldRedirectStdOut = true; + } - ~JunitReporter(); + virtual ~JunitReporter() CATCH_OVERRIDE; static std::string getDescription() { return "Reports test results in an XML format that looks like Ant's junitreport target"; } - virtual void noMatchingTestCases( std::string const& /*spec*/ ) {} + virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {} - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = true; - return prefs; - } - - virtual void testRunStarting( TestRunInfo const& runInfo ) { + virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE { CumulativeReporterBase::testRunStarting( runInfo ); xml.startElement( "testsuites" ); } - virtual void testGroupStarting( GroupInfo const& groupInfo ) { + virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { suiteTimer.start(); stdOutForSuite.str(""); stdErrForSuite.str(""); @@ -7854,25 +10488,28 @@ namespace Catch { CumulativeReporterBase::testGroupStarting( groupInfo ); } - virtual bool assertionEnded( AssertionStats const& assertionStats ) { - if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException ) + virtual void testCaseStarting( TestCaseInfo const& testCaseInfo ) CATCH_OVERRIDE { + m_okToFail = testCaseInfo.okToFail(); + } + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { + if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail ) unexpectedExceptions++; return CumulativeReporterBase::assertionEnded( assertionStats ); } - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { stdOutForSuite << testCaseStats.stdOut; stdErrForSuite << testCaseStats.stdErr; CumulativeReporterBase::testCaseEnded( testCaseStats ); } - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { double suiteTime = suiteTimer.getElapsedSeconds(); CumulativeReporterBase::testGroupEnded( testGroupStats ); writeGroup( *m_testGroups.back(), suiteTime ); } - virtual void testRunEndedCumulative() { + virtual void testRunEndedCumulative() CATCH_OVERRIDE { xml.endElement(); } @@ -7888,7 +10525,7 @@ namespace Catch { xml.writeAttribute( "time", "" ); else xml.writeAttribute( "time", suiteTime ); - xml.writeAttribute( "timestamp", "tbd" ); // !TBD + xml.writeAttribute( "timestamp", getCurrentTimestamp() ); // Write test cases for( TestGroupNode::ChildNodes::const_iterator @@ -7923,7 +10560,7 @@ namespace Catch { SectionNode const& sectionNode ) { std::string name = trim( sectionNode.stats.sectionInfo.name ); if( !rootName.empty() ) - name = rootName + "/" + name; + name = rootName + '/' + name; if( !sectionNode.assertions.empty() || !sectionNode.stdOut.empty() || @@ -7937,7 +10574,7 @@ namespace Catch { xml.writeAttribute( "classname", className ); xml.writeAttribute( "name", name ); } - xml.writeAttribute( "time", toString( sectionNode.stats.durationInSeconds ) ); + xml.writeAttribute( "time", Catch::toString( sectionNode.stats.durationInSeconds ) ); writeAssertions( sectionNode ); @@ -7970,6 +10607,7 @@ namespace Catch { std::string elementName; switch( result.getResultType() ) { case ResultWas::ThrewException: + case ResultWas::FatalErrorCondition: elementName = "error"; break; case ResultWas::ExplicitFailure: @@ -8000,14 +10638,14 @@ namespace Catch { std::ostringstream oss; if( !result.getMessage().empty() ) - oss << result.getMessage() << "\n"; + oss << result.getMessage() << '\n'; for( std::vector<MessageInfo>::const_iterator it = stats.infoMessages.begin(), itEnd = stats.infoMessages.end(); it != itEnd; ++it ) if( it->type == ResultWas::Info ) - oss << it->message << "\n"; + oss << it->message << '\n'; oss << "at " << result.getSourceInfo(); xml.writeText( oss.str(), false ); @@ -8019,6 +10657,7 @@ namespace Catch { std::ostringstream stdOutForSuite; std::ostringstream stdErrForSuite; unsigned int unexpectedExceptions; + bool m_okToFail; }; INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) @@ -8028,7 +10667,9 @@ namespace Catch { // #included from: ../reporters/catch_reporter_console.hpp #define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED -#include <cstring> +#include <cassert> +#include <cfloat> +#include <cstdio> namespace Catch { @@ -8038,48 +10679,40 @@ namespace Catch { m_headerPrinted( false ) {} - virtual ~ConsoleReporter(); + virtual ~ConsoleReporter() CATCH_OVERRIDE; static std::string getDescription() { return "Reports test results as plain lines of text"; } - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = false; - return prefs; + + virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { + stream << "No test cases matched '" << spec << '\'' << std::endl; } - virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << "'" << std::endl; + virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { } - virtual void assertionStarting( AssertionInfo const& ) { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) { + virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE { AssertionResult const& result = _assertionStats.assertionResult; - bool printInfoMessages = true; + bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } + // Drop out if result was successful but we're not printing them. + if( !includeResults && result.getResultType() != ResultWas::Warning ) + return false; lazyPrint(); - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); + AssertionPrinter printer( stream, _assertionStats, includeResults ); printer.print(); stream << std::endl; return true; } - virtual void sectionStarting( SectionInfo const& _sectionInfo ) { + virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { m_headerPrinted = false; StreamingReporterBase::sectionStarting( _sectionInfo ); } - virtual void sectionEnded( SectionStats const& _sectionStats ) { + virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE { if( _sectionStats.missingAssertions ) { lazyPrint(); Colour colour( Colour::ResultError ); @@ -8089,32 +10722,29 @@ namespace Catch { stream << "\nNo assertions in test case"; stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; } - if( m_headerPrinted ) { - if( m_config->showDurations() == ShowDurations::Always ) - stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl; - m_headerPrinted = false; + if( m_config->showDurations() == ShowDurations::Always ) { + stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; } - else { - if( m_config->showDurations() == ShowDurations::Always ) - stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl; + if( m_headerPrinted ) { + m_headerPrinted = false; } StreamingReporterBase::sectionEnded( _sectionStats ); } - virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) { + virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE { StreamingReporterBase::testCaseEnded( _testCaseStats ); m_headerPrinted = false; } - virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) { + virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE { if( currentGroupInfo.used ) { printSummaryDivider(); stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; printTotals( _testGroupStats.totals ); - stream << "\n" << std::endl; + stream << '\n' << std::endl; } StreamingReporterBase::testGroupEnded( _testGroupStats ); } - virtual void testRunEnded( TestRunStats const& _testRunStats ) { + virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE { printTotalsDivider( _testRunStats.totals ); printTotals( _testRunStats.totals ); stream << std::endl; @@ -8162,7 +10792,16 @@ namespace Catch { case ResultWas::ThrewException: colour = Colour::Error; passOrFail = "FAILED"; - messageLabel = "due to unexpected exception with message"; + messageLabel = "due to unexpected exception with "; + if (_stats.infoMessages.size() == 1) + messageLabel += "message"; + if (_stats.infoMessages.size() > 1) + messageLabel += "messages"; + break; + case ResultWas::FatalErrorCondition: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to a fatal error condition"; break; case ResultWas::DidntThrowException: colour = Colour::Error; @@ -8197,13 +10836,13 @@ namespace Catch { printSourceInfo(); if( stats.totals.assertions.total() > 0 ) { if( result.isOk() ) - stream << "\n"; + stream << '\n'; printResultType(); printOriginalExpression(); printReconstructedExpression(); } else { - stream << "\n"; + stream << '\n'; } printMessage(); } @@ -8220,25 +10859,25 @@ namespace Catch { Colour colourGuard( Colour::OriginalExpression ); stream << " "; stream << result.getExpressionInMacro(); - stream << "\n"; + stream << '\n'; } } void printReconstructedExpression() const { if( result.hasExpandedExpression() ) { stream << "with expansion:\n"; Colour colourGuard( Colour::ReconstructedExpression ); - stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n"; + stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << '\n'; } } void printMessage() const { if( !messageLabel.empty() ) - stream << messageLabel << ":" << "\n"; + stream << messageLabel << ':' << '\n'; for( std::vector<MessageInfo>::const_iterator it = messages.begin(), itEnd = messages.end(); it != itEnd; ++it ) { // If this assertion is a warning ignore any INFO messages if( printInfoMessages || it->type != ResultWas::Info ) - stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n"; + stream << Text( it->message, TextAttributes().setIndent(2) ) << '\n'; } } void printSourceInfo() const { @@ -8270,17 +10909,15 @@ namespace Catch { } } void lazyPrintRunInfo() { - stream << "\n" << getLineOfChars<'~'>() << "\n"; + stream << '\n' << getLineOfChars<'~'>() << '\n'; Colour colour( Colour::SecondaryText ); stream << currentTestRunInfo->name - << " is a Catch v" << libraryVersion.majorVersion << "." - << libraryVersion.minorVersion << " b" - << libraryVersion.buildNumber; - if( libraryVersion.branchName != std::string( "master" ) ) - stream << " (" << libraryVersion.branchName << ")"; - stream << " host application.\n" + << " is a Catch v" << libraryVersion() << " host application.\n" << "Run with -? for options\n\n"; + if( m_config->rngSeed() != 0 ) + stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; + currentTestRunInfo.used = true; } void lazyPrintGroupInfo() { @@ -8303,22 +10940,22 @@ namespace Catch { printHeaderString( it->name, 2 ); } - SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; + SourceLineInfo lineInfo = m_sectionStack.back().lineInfo; if( !lineInfo.empty() ){ - stream << getLineOfChars<'-'>() << "\n"; + stream << getLineOfChars<'-'>() << '\n'; Colour colourGuard( Colour::FileName ); - stream << lineInfo << "\n"; + stream << lineInfo << '\n'; } - stream << getLineOfChars<'.'>() << "\n" << std::endl; + stream << getLineOfChars<'.'>() << '\n' << std::endl; } void printClosedHeader( std::string const& _name ) { printOpenHeader( _name ); - stream << getLineOfChars<'.'>() << "\n"; + stream << getLineOfChars<'.'>() << '\n'; } void printOpenHeader( std::string const& _name ) { - stream << getLineOfChars<'-'>() << "\n"; + stream << getLineOfChars<'-'>() << '\n'; { Colour colourGuard( Colour::Headers ); printHeaderString( _name ); @@ -8335,7 +10972,7 @@ namespace Catch { i = 0; stream << Text( _string, TextAttributes() .setIndent( indent+i) - .setInitialIndent( indent ) ) << "\n"; + .setInitialIndent( indent ) ) << '\n'; } struct SummaryColumn { @@ -8350,9 +10987,9 @@ namespace Catch { std::string row = oss.str(); for( std::vector<std::string>::iterator it = rows.begin(); it != rows.end(); ++it ) { while( it->size() < row.size() ) - *it = " " + *it; + *it = ' ' + *it; while( it->size() > row.size() ) - row = " " + row; + row = ' ' + row; } rows.push_back( row ); return *this; @@ -8368,12 +11005,12 @@ namespace Catch { if( totals.testCases.total() == 0 ) { stream << Colour( Colour::Warning ) << "No tests ran\n"; } - else if( totals.assertions.total() > 0 && totals.assertions.allPassed() ) { + else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) { stream << Colour( Colour::ResultSuccess ) << "All tests passed"; stream << " (" << pluralise( totals.assertions.passed, "assertion" ) << " in " - << pluralise( totals.testCases.passed, "test case" ) << ")" - << "\n"; + << pluralise( totals.testCases.passed, "test case" ) << ')' + << '\n'; } else { @@ -8408,10 +11045,10 @@ namespace Catch { else if( value != "0" ) { stream << Colour( Colour::LightGrey ) << " | "; stream << Colour( it->colour ) - << value << " " << it->label; + << value << ' ' << it->label; } } - stream << "\n"; + stream << '\n'; } static std::size_t makeRatio( std::size_t number, std::size_t total ) { @@ -8447,19 +11084,10 @@ namespace Catch { else { stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); } - stream << "\n"; + stream << '\n'; } void printSummaryDivider() { - stream << getLineOfChars<'-'>() << "\n"; - } - template<char C> - static char const* getLineOfChars() { - static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; - if( !*line ) { - memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); - line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; - } - return line; + stream << getLineOfChars<'-'>() << '\n'; } private: @@ -8494,11 +11122,10 @@ namespace Catch { } virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << "'" << std::endl; + stream << "No test cases matched '" << spec << '\'' << std::endl; } - virtual void assertionStarting( AssertionInfo const& ) { - } + virtual void assertionStarting( AssertionInfo const& ) {} virtual bool assertionEnded( AssertionStats const& _assertionStats ) { AssertionResult const& result = _assertionStats.assertionResult; @@ -8519,9 +11146,15 @@ namespace Catch { return true; } + virtual void sectionEnded(SectionStats const& _sectionStats) CATCH_OVERRIDE { + if (m_config->showDurations() == ShowDurations::Always) { + stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; + } + } + virtual void testRunEnded( TestRunStats const& _testRunStats ) { printTotals( _testRunStats.totals ); - stream << "\n" << std::endl; + stream << '\n' << std::endl; StreamingReporterBase::testRunEnded( _testRunStats ); } @@ -8569,6 +11202,13 @@ namespace Catch { printExpressionWas(); printRemainingMessages(); break; + case ResultWas::FatalErrorCondition: + printResultType( Colour::Error, failedString() ); + printIssue( "fatal error condition with message:" ); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; case ResultWas::DidntThrowException: printResultType( Colour::Error, failedString() ); printIssue( "expected exception, got none" ); @@ -8614,26 +11254,26 @@ namespace Catch { void printSourceInfo() const { Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ":"; + stream << result.getSourceInfo() << ':'; } - void printResultType( Colour::Code colour, std::string passOrFail ) const { + void printResultType( Colour::Code colour, std::string const& passOrFail ) const { if( !passOrFail.empty() ) { { Colour colourGuard( colour ); - stream << " " << passOrFail; + stream << ' ' << passOrFail; } - stream << ":"; + stream << ':'; } } - void printIssue( std::string issue ) const { - stream << " " << issue; + void printIssue( std::string const& issue ) const { + stream << ' ' << issue; } void printExpressionWas() { if( result.hasExpression() ) { - stream << ";"; + stream << ';'; { Colour colour( dimColour() ); stream << " expression was:"; @@ -8644,7 +11284,7 @@ namespace Catch { void printOriginalExpression() const { if( result.hasExpression() ) { - stream << " " << result.getExpression(); + stream << ' ' << result.getExpression(); } } @@ -8660,7 +11300,7 @@ namespace Catch { void printMessage() { if ( itMessage != messages.end() ) { - stream << " '" << itMessage->message << "'"; + stream << " '" << itMessage->message << '\''; ++itMessage; } } @@ -8675,13 +11315,13 @@ namespace Catch { { Colour colourGuard( colour ); - stream << " with " << pluralise( N, "message" ) << ":"; + stream << " with " << pluralise( N, "message" ) << ':'; } for(; itMessage != itEnd; ) { // If this assertion is a warning ignore any INFO messages if( printInfoMessages || itMessage->type != ResultWas::Info ) { - stream << " '" << itMessage->message << "'"; + stream << " '" << itMessage->message << '\''; if ( ++itMessage != itEnd ) { Colour colourGuard( dimColour() ); stream << " and"; @@ -8707,7 +11347,7 @@ namespace Catch { // - green: Passed [both/all] N tests cases with M assertions. std::string bothOrAll( std::size_t count ) const { - return count == 1 ? "" : count == 2 ? "both " : "all " ; + return count == 1 ? std::string() : count == 2 ? "both " : "all " ; } void printTotals( const Totals& totals ) const { @@ -8718,12 +11358,12 @@ namespace Catch { Colour colour( Colour::ResultError ); const std::string qualify_assertions_failed = totals.assertions.failed == totals.assertions.total() ? - bothOrAll( totals.assertions.failed ) : ""; + bothOrAll( totals.assertions.failed ) : std::string(); stream << "Failed " << bothOrAll( totals.testCases.failed ) << pluralise( totals.testCases.failed, "test case" ) << ", " "failed " << qualify_assertions_failed << - pluralise( totals.assertions.failed, "assertion" ) << "."; + pluralise( totals.assertions.failed, "assertion" ) << '.'; } else if( totals.assertions.total() == 0 ) { stream << @@ -8735,14 +11375,14 @@ namespace Catch { Colour colour( Colour::ResultError ); stream << "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << pluralise( totals.assertions.failed, "assertion" ) << "."; + "failed " << pluralise( totals.assertions.failed, "assertion" ) << '.'; } else { Colour colour( Colour::ResultSuccess ); stream << "Passed " << bothOrAll( totals.testCases.passed ) << pluralise( totals.testCases.passed, "test case" ) << - " with " << pluralise( totals.assertions.passed, "assertion" ) << "."; + " with " << pluralise( totals.assertions.passed, "assertion" ) << '.'; } } }; @@ -8752,8 +11392,14 @@ namespace Catch { } // end namespace Catch namespace Catch { + // These are all here to avoid warnings about not having any out of line + // virtual methods NonCopyable::~NonCopyable() {} IShared::~IShared() {} + IStream::~IStream() CATCH_NOEXCEPT {} + FileStream::~FileStream() CATCH_NOEXCEPT {} + CoutStream::~CoutStream() CATCH_NOEXCEPT {} + DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {} StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} IContext::~IContext() {} IResultCapture::~IResultCapture() {} @@ -8787,19 +11433,21 @@ namespace Catch { FreeFunctionTestCase::~FreeFunctionTestCase() {} IGeneratorInfo::~IGeneratorInfo() {} IGeneratorsForTest::~IGeneratorsForTest() {} + WildcardPattern::~WildcardPattern() {} TestSpec::Pattern::~Pattern() {} TestSpec::NamePattern::~NamePattern() {} TestSpec::TagPattern::~TagPattern() {} TestSpec::ExcludedPattern::~ExcludedPattern() {} - - Matchers::Impl::StdString::Equals::~Equals() {} - Matchers::Impl::StdString::Contains::~Contains() {} - Matchers::Impl::StdString::StartsWith::~StartsWith() {} - Matchers::Impl::StdString::EndsWith::~EndsWith() {} + Matchers::Impl::MatcherUntypedBase::~MatcherUntypedBase() {} void Config::dummy() {} - INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "xml", XmlReporter ) + namespace TestCaseTracking { + ITracker::~ITracker() {} + TrackerBase::~TrackerBase() {} + SectionTracker::~SectionTracker() {} + IndexTracker::~IndexTracker() {} + } } #ifdef __clang__ @@ -8814,9 +11462,16 @@ namespace Catch { #ifndef __OBJC__ +#if defined(WIN32) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN) +// Standard C/C++ Win32 Unicode wmain entry point +extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) { +#else // Standard C/C++ main entry point -int main (int argc, char * const argv[]) { - return Catch::Session().run( argc, argv ); +int main (int argc, char * argv[]) { +#endif + + int result = Catch::Session().run( argc, argv ); + return ( result < 0xff ? result : 0xff ); } #else // __OBJC__ @@ -8834,7 +11489,7 @@ int main (int argc, char * const argv[]) { [pool drain]; #endif - return result; + return ( result < 0xff ? result : 0xff ); } #endif // __OBJC__ @@ -8850,46 +11505,62 @@ int main (int argc, char * const argv[]) { // If this config identifier is defined then all CATCH macros are prefixed with CATCH_ #ifdef CATCH_CONFIG_PREFIX_ALL -#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" ) -#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "CATCH_REQUIRE_FALSE" ) +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) +#else +#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) +#endif -#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS" ) -#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" ) -#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" ) +#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr ) +#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) +#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) +#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr ) -#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" ) -#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CATCH_CHECK_FALSE" ) -#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" ) -#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" ) -#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" ) +#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr ) +#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr ) -#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" ) -#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" ) -#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" ) +#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr ) +#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" ) -#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" ) +#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) -#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN", msg ) -#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) -#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#else +#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#endif + +#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) +#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) +#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) +#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) ) +#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) ) #ifdef CATCH_CONFIG_VARIADIC_MACROS #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) + #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__ ) - #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__ ) + #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) + #define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) + #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #else #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) + #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description ) #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg ) - #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg ) + #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg ) + #define CATCH_FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg ) + #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg ) #endif #define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) @@ -8906,55 +11577,72 @@ int main (int argc, char * const argv[]) { #define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) #define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) #endif -#define CATCH_GIVEN( desc ) CATCH_SECTION( "Given: " desc, "" ) -#define CATCH_WHEN( desc ) CATCH_SECTION( " When: " desc, "" ) -#define CATCH_AND_WHEN( desc ) CATCH_SECTION( " And: " desc, "" ) -#define CATCH_THEN( desc ) CATCH_SECTION( " Then: " desc, "" ) -#define CATCH_AND_THEN( desc ) CATCH_SECTION( " And: " desc, "" ) +#define CATCH_GIVEN( desc ) CATCH_SECTION( std::string( "Given: ") + desc, "" ) +#define CATCH_WHEN( desc ) CATCH_SECTION( std::string( " When: ") + desc, "" ) +#define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) +#define CATCH_THEN( desc ) CATCH_SECTION( std::string( " Then: ") + desc, "" ) +#define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) // If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required #else -#define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" ) -#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "REQUIRE_FALSE" ) +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) -#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "REQUIRE_THROWS" ) -#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" ) -#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" ) +#else +#define REQUIRE( expr ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, expr ) +#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr ) +#endif -#define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" ) -#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CHECK_FALSE" ) -#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" ) -#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" ) -#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" ) +#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr ) +#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) +#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) +#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr ) -#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS" ) -#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" ) -#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" ) +#define CHECK( expr ) INTERNAL_CATCH_TEST( "CHECK", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr ) +#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr ) -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" ) -#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" ) +#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr ) +#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr ) -#define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN", msg ) -#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) -#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) +#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) + +#if defined(CATCH_CONFIG_FAST_COMPILE) +#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#else +#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#endif + +#define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) +#define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) +#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) +#define CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) ) +#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) ) #ifdef CATCH_CONFIG_VARIADIC_MACROS - #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__ ) - #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__ ) +#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) +#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) +#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) +#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) +#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #else - #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) +#define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) + #define REGISTER_TEST_CASE( method, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( method, name, description ) #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg ) - #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg ) + #define FAIL( msg ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg ) + #define FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg ) + #define SUCCEED( msg ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg ) #endif #define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) @@ -8975,11 +11663,11 @@ int main (int argc, char * const argv[]) { #define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) #define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) #endif -#define GIVEN( desc ) SECTION( " Given: " desc, "" ) -#define WHEN( desc ) SECTION( " When: " desc, "" ) -#define AND_WHEN( desc ) SECTION( "And when: " desc, "" ) -#define THEN( desc ) SECTION( " Then: " desc, "" ) -#define AND_THEN( desc ) SECTION( " And: " desc, "" ) +#define GIVEN( desc ) SECTION( std::string(" Given: ") + desc, "" ) +#define WHEN( desc ) SECTION( std::string(" When: ") + desc, "" ) +#define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc, "" ) +#define THEN( desc ) SECTION( std::string(" Then: ") + desc, "" ) +#define AND_THEN( desc ) SECTION( std::string(" And: ") + desc, "" ) using Catch::Detail::Approx; @@ -8988,9 +11676,13 @@ using Catch::Detail::Approx; #define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED #ifdef __clang__ -#pragma clang diagnostic pop +# ifdef __ICC // icpc defines the __clang__ macro +# pragma warning(pop) +# else +# pragma clang diagnostic pop +# endif #elif defined __GNUC__ -#pragma GCC diagnostic pop +# pragma GCC diagnostic pop #endif #endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 2ea08f4a..7249c847 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -2,6 +2,7 @@ set(SRCROOT "${PROJECT_SOURCE_DIR}/test/src") SET(SRC "${SRCROOT}/Main.cpp" + "${SRCROOT}/UnitTests.hpp" "${SRCROOT}/UnitTests.cpp" "${SRCROOT}/Vector2.cpp" "${SRCROOT}/Rect.cpp" diff --git a/test/src/UnitTests.cpp b/test/src/UnitTests.cpp index 74f72b08..a4fc9b22 100644 --- a/test/src/UnitTests.cpp +++ b/test/src/UnitTests.cpp @@ -5,7 +5,6 @@ #include <SFML/Graphics/Color.hpp> #include <sstream> - // String conversions for Catch framework namespace Catch { From d402ce5a5df18b27bcfc77e51753488b23f76099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Sun, 19 Aug 2018 01:30:53 +0200 Subject: [PATCH 158/211] Separated test suites into their individual modules - Building per module only requires to have split test utility sections - System module tests are always added, as the system module is always built --- CMakeLists.txt | 4 +- test/CMakeLists.txt | 44 +++++++++++++++---- test/src/Rect.cpp | 2 +- test/src/TestUtilities/Graphics.cpp | 19 ++++++++ test/src/TestUtilities/Graphics.hpp | 23 ++++++++++ test/src/TestUtilities/System.cpp | 20 +++++++++ .../System.hpp} | 25 +++-------- test/src/TestUtilities/Window.cpp | 14 ++++++ test/src/TestUtilities/Window.hpp | 33 ++++++++++++++ test/src/UnitTests.cpp | 41 ----------------- test/src/Vector2.cpp | 2 +- 11 files changed, 154 insertions(+), 73 deletions(-) create mode 100644 test/src/TestUtilities/Graphics.cpp create mode 100644 test/src/TestUtilities/Graphics.hpp create mode 100644 test/src/TestUtilities/System.cpp rename test/src/{UnitTests.hpp => TestUtilities/System.hpp} (60%) create mode 100644 test/src/TestUtilities/Window.cpp create mode 100644 test/src/TestUtilities/Window.hpp delete mode 100644 test/src/UnitTests.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index dea32edb..5bbea988 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,7 +85,7 @@ if(SFML_BUILD_WINDOW) endif() # add an option for building the test suite -sfml_set_option(SFML_BUILD_TEST TRUE BOOL "TRUE to build the SFML test suite, FALSE to ignore them") +sfml_set_option(SFML_BUILD_TEST_SUITE TRUE BOOL "TRUE to build the SFML test suite, FALSE to ignore it") # macOS specific options if(SFML_OS_MACOSX) @@ -284,7 +284,7 @@ endif() if(SFML_BUILD_DOC) add_subdirectory(doc) endif() -if(SFML_BUILD_TEST) +if(SFML_BUILD_TEST_SUITE) add_subdirectory(test) endif() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7249c847..932f0fdb 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,20 +1,46 @@ set(SRCROOT "${PROJECT_SOURCE_DIR}/test/src") -SET(SRC - "${SRCROOT}/Main.cpp" - "${SRCROOT}/UnitTests.hpp" - "${SRCROOT}/UnitTests.cpp" - "${SRCROOT}/Vector2.cpp" - "${SRCROOT}/Rect.cpp" -) - include_directories("${PROJECT_SOURCE_DIR}/include") include_directories("${PROJECT_SOURCE_DIR}/extlibs/headers") +# System is always built +SET(SYSTEM_SRC + "${SRCROOT}/Vector2.cpp" + "${SRCROOT}/TestUtilities/System.hpp" + "${SRCROOT}/TestUtilities/System.cpp" +) +SET(SYSTEM_LIB "sfml-system") + +if(SFML_BUILD_WINDOW) + SET(WINDOW_SRC + "${SRCROOT}/TestUtilities/Window.hpp" + "${SRCROOT}/TestUtilities/Window.cpp" + ) + SET(WINDOW_LIB "sfml-window") +endif() + +if(SFML_BUILD_GRAPHICS) + SET(GRAPHICS_SRC + "${SRCROOT}/Rect.cpp" + "${SRCROOT}/TestUtilities/Graphics.hpp" + "${SRCROOT}/TestUtilities/Graphics.cpp" + ) + SET(WINDOW_LIB "sfml-graphics") +endif() + +SET(SRC + "${SRCROOT}/Main.cpp" + "${SYSTEM_SRC}" + "${WINDOW_SRC}" + "${GRAPHICS_SRC}" + "${AUDIO_SRC}" + "${NETWORK_SRC}" +) + # Using sfmltest instead of test because the latter is reserved. add_executable(sfmltest ${SRC}) -target_link_libraries(sfmltest sfml-graphics sfml-window sfml-audio sfml-network sfml-system) +target_link_libraries(sfmltest ${GRAPHICS_LIB} ${WINDOW_LIB} ${AUDIO_LIB} ${NETWORK_LIB} ${SYSTEM_LIB}) add_custom_target(runtests ALL DEPENDS sfmltest diff --git a/test/src/Rect.cpp b/test/src/Rect.cpp index 70bd4838..7ac8933a 100644 --- a/test/src/Rect.cpp +++ b/test/src/Rect.cpp @@ -1,6 +1,6 @@ #include <SFML/Graphics/Rect.hpp> #include <SFML/System/Vector2.hpp> -#include "UnitTests.hpp" +#include "TestUtilities/Graphics.hpp" TEST_CASE("sf::Rect class template", "[graphics]") { diff --git a/test/src/TestUtilities/Graphics.cpp b/test/src/TestUtilities/Graphics.cpp new file mode 100644 index 00000000..e323bb76 --- /dev/null +++ b/test/src/TestUtilities/Graphics.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/Graphics.hpp b/test/src/TestUtilities/Graphics.hpp new file mode 100644 index 00000000..a251bc56 --- /dev/null +++ b/test/src/TestUtilities/Graphics.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 "Window.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/System.cpp b/test/src/TestUtilities/System.cpp new file mode 100644 index 00000000..21a92d68 --- /dev/null +++ b/test/src/TestUtilities/System.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/UnitTests.hpp b/test/src/TestUtilities/System.hpp similarity index 60% rename from test/src/UnitTests.hpp rename to test/src/TestUtilities/System.hpp index 0e11c952..8a48f225 100644 --- a/test/src/UnitTests.hpp +++ b/test/src/TestUtilities/System.hpp @@ -1,25 +1,22 @@ // Header for SFML unit tests. // -// For a new test case, include this header and not <catch.hpp> directly. +// 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_UNITTESTS_HPP -#define SFML_UNITTESTS_HPP +#ifndef SFML_TESTUTILITIES_SYSTEM_HPP +#define SFML_TESTUTILITIES_SYSTEM_HPP + +#include <catch.hpp> #include <SFML/System/Vector2.hpp> #include <SFML/System/Vector3.hpp> -#include <SFML/Graphics/Rect.hpp> #include <sstream> -#include <catch.hpp> - // Forward declarations for non-template types namespace sf { - class Color; class String; class Time; - class VideoMode; } // String conversions for Catch framework @@ -27,8 +24,6 @@ namespace Catch { std::string toString(const sf::String& string); std::string toString(sf::Time time); - std::string toString(const sf::VideoMode& videoMode); - std::string toString(const sf::Color& color); template <typename T> std::string toString(const sf::Vector2<T>& vector) @@ -45,14 +40,6 @@ namespace Catch stream << "(" << vector.x << ", " << vector.y << ", " << vector.z << ")"; return stream.str(); } - - 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_UNITTESTS_HPP +#endif // SFML_TESTUTILITIES_SYSTEM_HPP diff --git a/test/src/TestUtilities/Window.cpp b/test/src/TestUtilities/Window.cpp new file mode 100644 index 00000000..52b36357 --- /dev/null +++ b/test/src/TestUtilities/Window.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/Window.hpp b/test/src/TestUtilities/Window.hpp new file mode 100644 index 00000000..3ddc158f --- /dev/null +++ b/test/src/TestUtilities/Window.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 "System.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/test/src/UnitTests.cpp b/test/src/UnitTests.cpp deleted file mode 100644 index a4fc9b22..00000000 --- a/test/src/UnitTests.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// Note: No need to increase compile time by including UnitTests.hpp -#include <SFML/System/String.hpp> -#include <SFML/System/Time.hpp> -#include <SFML/Window/VideoMode.hpp> -#include <SFML/Graphics/Color.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(); - } - - std::string toString(const sf::VideoMode& videoMode) - { - std::ostringstream stream; - stream << videoMode.width << "x" << videoMode.height << "x" << videoMode.bitsPerPixel; - return stream.str(); - } - - 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/Vector2.cpp b/test/src/Vector2.cpp index 556a4952..1dd4c5f6 100644 --- a/test/src/Vector2.cpp +++ b/test/src/Vector2.cpp @@ -1,5 +1,5 @@ #include <SFML/System/Vector2.hpp> -#include "UnitTests.hpp" +#include "TestUtilities/System.hpp" // Use sf::Vector2i for tests. Test coverage is given, as there are no template specializations. From a88e854dc3ab16a8708d89d4efba5d49cea762d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Sun, 19 Aug 2018 16:14:54 +0200 Subject: [PATCH 159/211] Added test cases for Vector3<T> --- test/CMakeLists.txt | 1 + test/src/Vector2.cpp | 2 +- test/src/Vector3.cpp | 161 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 test/src/Vector3.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 932f0fdb..bbdcb37b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories("${PROJECT_SOURCE_DIR}/extlibs/headers") # System is always built SET(SYSTEM_SRC "${SRCROOT}/Vector2.cpp" + "${SRCROOT}/Vector3.cpp" "${SRCROOT}/TestUtilities/System.hpp" "${SRCROOT}/TestUtilities/System.cpp" ) diff --git a/test/src/Vector2.cpp b/test/src/Vector2.cpp index 1dd4c5f6..73ae8463 100644 --- a/test/src/Vector2.cpp +++ b/test/src/Vector2.cpp @@ -14,7 +14,7 @@ TEST_CASE("sf::Vector2 class template", "[system]") CHECK(vector.y == 0); } - SECTION("(x,y) coordinate constructor") + SECTION("(x, y) coordinate constructor") { sf::Vector2i vector(1, 2); CHECK(vector.x == 1); diff --git a/test/src/Vector3.cpp b/test/src/Vector3.cpp new file mode 100644 index 00000000..cf80fb1d --- /dev/null +++ b/test/src/Vector3.cpp @@ -0,0 +1,161 @@ +#include <SFML/System/Vector3.hpp> +#include "TestUtilities/System.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); + } + } +} From d3a072fb63f089edcaf3f3937aaea5b5890ce8b5 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Sun, 19 Aug 2018 19:04:11 +0100 Subject: [PATCH 160/211] Use modern cmake testing functionality including catch integration --- CMakeLists.txt | 1 + cmake/Catch.cmake | 175 ++++++++++++++++++++++++++++++++++++++ cmake/CatchAddTests.cmake | 151 ++++++++++++++++++++++++++++++++ test/CMakeLists.txt | 41 +++++---- test/src/Main.cpp | 2 - test/src/Rect.cpp | 2 + test/src/Vector2.cpp | 2 + test/src/Window.cpp | 10 +++ 8 files changed, 361 insertions(+), 23 deletions(-) create mode 100644 cmake/Catch.cmake create mode 100644 cmake/CatchAddTests.cmake delete mode 100644 test/src/Main.cpp create mode 100644 test/src/Window.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5bbea988..ff8aa6de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -285,6 +285,7 @@ if(SFML_BUILD_DOC) add_subdirectory(doc) endif() if(SFML_BUILD_TEST_SUITE) + enable_testing() add_subdirectory(test) endif() diff --git a/cmake/Catch.cmake b/cmake/Catch.cmake new file mode 100644 index 00000000..5f76e0cd --- /dev/null +++ b/cmake/Catch.cmake @@ -0,0 +1,175 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +Catch +----- + +This module defines a function to help use the Catch test framework. + +The :command:`catch_discover_tests` discovers tests by asking the compiled test +executable to enumerate its tests. This does not require CMake to be re-run +when tests change. However, it may not work in a cross-compiling environment, +and setting test properties is less convenient. + +This command is intended to replace use of :command:`add_test` to register +tests, and will create a separate CTest test for each Catch test case. Note +that this is in some cases less efficient, as common set-up and tear-down logic +cannot be shared by multiple test cases executing in the same instance. +However, it provides more fine-grained pass/fail information to CTest, which is +usually considered as more beneficial. By default, the CTest test name is the +same as the Catch name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``. + +.. command:: catch_discover_tests + + Automatically add tests with CTest by querying the compiled test executable + for available tests:: + + catch_discover_tests(target + [TEST_SPEC arg1...] + [EXTRA_ARGS arg1...] + [WORKING_DIRECTORY dir] + [TEST_PREFIX prefix] + [TEST_SUFFIX suffix] + [PROPERTIES name1 value1...] + [TEST_LIST var] + ) + + ``catch_discover_tests`` sets up a post-build command on the test executable + that generates the list of tests by parsing the output from running the test + with the ``--list-test-names-only`` argument. This ensures that the full + list of tests is obtained. Since test discovery occurs at build time, it is + not necessary to re-run CMake when the list of tests changes. + However, it requires that :prop_tgt:`CROSSCOMPILING_EMULATOR` is properly set + in order to function in a cross-compiling environment. + + Additionally, setting properties on tests is somewhat less convenient, since + the tests are not available at CMake time. Additional test properties may be + assigned to the set of tests as a whole using the ``PROPERTIES`` option. If + more fine-grained test control is needed, custom content may be provided + through an external CTest script using the :prop_dir:`TEST_INCLUDE_FILES` + directory property. The set of discovered tests is made accessible to such a + script via the ``<target>_TESTS`` variable. + + The options are: + + ``target`` + Specifies the Catch executable, which must be a known CMake executable + target. CMake will substitute the location of the built executable when + running the test. + + ``TEST_SPEC arg1...`` + Specifies test cases, wildcarded test cases, tags and tag expressions to + pass to the Catch executable with the ``--list-test-names-only`` argument. + + ``EXTRA_ARGS arg1...`` + Any extra arguments to pass on the command line to each test case. + + ``WORKING_DIRECTORY dir`` + Specifies the directory in which to run the discovered test cases. If this + option is not provided, the current binary directory is used. + + ``TEST_PREFIX prefix`` + Specifies a ``prefix`` to be prepended to the name of each discovered test + case. This can be useful when the same test executable is being used in + multiple calls to ``catch_discover_tests()`` but with different + ``TEST_SPEC`` or ``EXTRA_ARGS``. + + ``TEST_SUFFIX suffix`` + Similar to ``TEST_PREFIX`` except the ``suffix`` is appended to the name of + every discovered test case. Both ``TEST_PREFIX`` and ``TEST_SUFFIX`` may + be specified. + + ``PROPERTIES name1 value1...`` + Specifies additional properties to be set on all tests discovered by this + invocation of ``catch_discover_tests``. + + ``TEST_LIST var`` + Make the list of tests available in the variable ``var``, rather than the + default ``<target>_TESTS``. This can be useful when the same test + executable is being used in multiple calls to ``catch_discover_tests()``. + Note that this variable is only available in CTest. + +#]=======================================================================] + +#------------------------------------------------------------------------------ +function(catch_discover_tests TARGET) + cmake_parse_arguments( + "" + "" + "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST" + "TEST_SPEC;EXTRA_ARGS;PROPERTIES" + ${ARGN} + ) + + if(NOT _WORKING_DIRECTORY) + set(_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") + endif() + if(NOT _TEST_LIST) + set(_TEST_LIST ${TARGET}_TESTS) + endif() + + ## Generate a unique name based on the extra arguments + string(SHA1 args_hash "${_TEST_SPEC} ${_EXTRA_ARGS}") + string(SUBSTRING ${args_hash} 0 7 args_hash) + + # Define rule to generate test list for aforementioned test executable + set(ctest_include_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_include-${args_hash}.cmake") + set(ctest_tests_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_tests-${args_hash}.cmake") + get_property(crosscompiling_emulator + TARGET ${TARGET} + PROPERTY CROSSCOMPILING_EMULATOR + ) + add_custom_command( + TARGET ${TARGET} POST_BUILD + BYPRODUCTS "${ctest_tests_file}" + COMMAND "${CMAKE_COMMAND}" + -D "TEST_TARGET=${TARGET}" + -D "TEST_EXECUTABLE=$<TARGET_FILE:${TARGET}>" + -D "TEST_EXECUTOR=${crosscompiling_emulator}" + -D "TEST_WORKING_DIR=${_WORKING_DIRECTORY}" + -D "TEST_SPEC=${_TEST_SPEC}" + -D "TEST_EXTRA_ARGS=${_EXTRA_ARGS}" + -D "TEST_PROPERTIES=${_PROPERTIES}" + -D "TEST_PREFIX=${_TEST_PREFIX}" + -D "TEST_SUFFIX=${_TEST_SUFFIX}" + -D "TEST_LIST=${_TEST_LIST}" + -D "CTEST_FILE=${ctest_tests_file}" + -P "${_CATCH_DISCOVER_TESTS_SCRIPT}" + VERBATIM + ) + + file(WRITE "${ctest_include_file}" + "if(EXISTS \"${ctest_tests_file}\")\n" + " include(\"${ctest_tests_file}\")\n" + "else()\n" + " add_test(${TARGET}_NOT_BUILT-${args_hash} ${TARGET}_NOT_BUILT-${args_hash})\n" + "endif()\n" + ) + + if(NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0") + # Add discovered tests to directory TEST_INCLUDE_FILES + set_property(DIRECTORY + APPEND PROPERTY TEST_INCLUDE_FILES "${ctest_include_file}" + ) + else() + # Add discovered tests as directory TEST_INCLUDE_FILE if possible + get_property(test_include_file_set DIRECTORY PROPERTY TEST_INCLUDE_FILE SET) + if (NOT ${test_include_file_set}) + set_property(DIRECTORY + PROPERTY TEST_INCLUDE_FILE "${ctest_include_file}" + ) + else() + message(FATAL_ERROR + "Cannot set more than one TEST_INCLUDE_FILE" + ) + endif() + endif() + +endfunction() + +############################################################################### + +set(_CATCH_DISCOVER_TESTS_SCRIPT + ${CMAKE_CURRENT_LIST_DIR}/CatchAddTests.cmake +) \ No newline at end of file diff --git a/cmake/CatchAddTests.cmake b/cmake/CatchAddTests.cmake new file mode 100644 index 00000000..4b855ce2 --- /dev/null +++ b/cmake/CatchAddTests.cmake @@ -0,0 +1,151 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +set(prefix "${TEST_PREFIX}") +set(suffix "${TEST_SUFFIX}") +set(spec ${TEST_SPEC}) +set(extra_args ${TEST_EXTRA_ARGS}) +set(properties ${TEST_PROPERTIES}) +set(script) +set(suite) +set(tests) + +function(add_command NAME) + set(_args "") + foreach(_arg ${ARGN}) + if(_arg MATCHES "[^-./:a-zA-Z0-9_]") + set(_args "${_args} [==[${_arg}]==]") # form a bracket_argument + else() + set(_args "${_args} ${_arg}") + endif() + endforeach() + set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE) +endfunction() + +# Run test executable to get list of available tests +if(NOT EXISTS "${TEST_EXECUTABLE}") + message(FATAL_ERROR + "Specified test executable '${TEST_EXECUTABLE}' does not exist" + ) +endif() +execute_process( + COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-test-names-only + OUTPUT_VARIABLE output + RESULT_VARIABLE result +) +# Catch --list-test-names-only reports the number of tests, so 0 is... surprising +if(${result} EQUAL 0) + message(WARNING + "Test executable '${TEST_EXECUTABLE}' contains no tests!\n" + ) +elseif(${result} LESS 0) + message(FATAL_ERROR + "Error running test executable '${TEST_EXECUTABLE}':\n" + " Result: ${result}\n" + " Output: ${output}\n" + ) +endif() + +string(REPLACE "\n" ";" output "${output}") + +# Parse output +foreach(line ${output}) + set(test ${line}) + # ...and add to script + add_command(add_test + "${prefix}${test}${suffix}" + ${TEST_EXECUTOR} + "${TEST_EXECUTABLE}" + "${test}" + ${extra_args} + ) + add_command(set_tests_properties + "${prefix}${test}${suffix}" + PROPERTIES + WORKING_DIRECTORY "${TEST_WORKING_DIR}" + ${properties} + ) + list(APPEND tests "${prefix}${test}${suffix}") +endforeach() + +# Create a list of all discovered tests, which users may use to e.g. set +# properties on the tests +add_command(set ${TEST_LIST} ${tests}) + +# Write CTest script +file(WRITE "${CTEST_FILE}" "${script}")# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +set(prefix "${TEST_PREFIX}") +set(suffix "${TEST_SUFFIX}") +set(spec ${TEST_SPEC}) +set(extra_args ${TEST_EXTRA_ARGS}) +set(properties ${TEST_PROPERTIES}) +set(script) +set(suite) +set(tests) + +function(add_command NAME) + set(_args "") + foreach(_arg ${ARGN}) + if(_arg MATCHES "[^-./:a-zA-Z0-9_]") + set(_args "${_args} [==[${_arg}]==]") # form a bracket_argument + else() + set(_args "${_args} ${_arg}") + endif() + endforeach() + set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE) +endfunction() + +# Run test executable to get list of available tests +if(NOT EXISTS "${TEST_EXECUTABLE}") + message(FATAL_ERROR + "Specified test executable '${TEST_EXECUTABLE}' does not exist" + ) +endif() +execute_process( + COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-test-names-only + OUTPUT_VARIABLE output + RESULT_VARIABLE result +) +# Catch --list-test-names-only reports the number of tests, so 0 is... surprising +if(${result} EQUAL 0) + message(WARNING + "Test executable '${TEST_EXECUTABLE}' contains no tests!\n" + ) +elseif(${result} LESS 0) + message(FATAL_ERROR + "Error running test executable '${TEST_EXECUTABLE}':\n" + " Result: ${result}\n" + " Output: ${output}\n" + ) +endif() + +string(REPLACE "\n" ";" output "${output}") + +# Parse output +foreach(line ${output}) + set(test ${line}) + # ...and add to script + add_command(add_test + "${prefix}${test}${suffix}" + ${TEST_EXECUTOR} + "${TEST_EXECUTABLE}" + "${test}" + ${extra_args} + ) + add_command(set_tests_properties + "${prefix}${test}${suffix}" + PROPERTIES + WORKING_DIRECTORY "${TEST_WORKING_DIR}" + ${properties} + ) + list(APPEND tests "${prefix}${test}${suffix}") +endforeach() + +# Create a list of all discovered tests, which users may use to e.g. set +# properties on the tests +add_command(set ${TEST_LIST} ${tests}) + +# Write CTest script +file(WRITE "${CTEST_FILE}" "${script}") \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index bbdcb37b..73712d36 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,3 +1,6 @@ +# Include the extra catch cmake functions +include("${CMAKE_SOURCE_DIR}/cmake/Catch.cmake") + set(SRCROOT "${PROJECT_SOURCE_DIR}/test/src") include_directories("${PROJECT_SOURCE_DIR}/include") @@ -10,14 +13,19 @@ SET(SYSTEM_SRC "${SRCROOT}/TestUtilities/System.hpp" "${SRCROOT}/TestUtilities/System.cpp" ) -SET(SYSTEM_LIB "sfml-system") +add_executable(systemtest ${SYSTEM_SRC}) +target_link_libraries(systemtest sfml-system) +catch_discover_tests(systemtest) if(SFML_BUILD_WINDOW) SET(WINDOW_SRC + "${SRCROOT}/Window.cpp" "${SRCROOT}/TestUtilities/Window.hpp" "${SRCROOT}/TestUtilities/Window.cpp" ) - SET(WINDOW_LIB "sfml-window") + add_executable(windowtest ${WINDOW_SRC}) + target_link_libraries(windowtest sfml-window) + catch_discover_tests(windowtest) endif() if(SFML_BUILD_GRAPHICS) @@ -26,26 +34,17 @@ if(SFML_BUILD_GRAPHICS) "${SRCROOT}/TestUtilities/Graphics.hpp" "${SRCROOT}/TestUtilities/Graphics.cpp" ) - SET(WINDOW_LIB "sfml-graphics") + add_executable(graphicstest ${GRAPHICS_SRC}) + target_link_libraries(graphicstest sfml-graphics) + catch_discover_tests(graphicstest) endif() -SET(SRC - "${SRCROOT}/Main.cpp" - "${SYSTEM_SRC}" - "${WINDOW_SRC}" - "${GRAPHICS_SRC}" - "${AUDIO_SRC}" - "${NETWORK_SRC}" +# Automatically run the tests at the end of the build +add_custom_target( runtests ALL + DEPENDS systemtest windowtest graphicstest ) - -# Using sfmltest instead of test because the latter is reserved. -add_executable(sfmltest ${SRC}) - -target_link_libraries(sfmltest ${GRAPHICS_LIB} ${WINDOW_LIB} ${AUDIO_LIB} ${NETWORK_LIB} ${SYSTEM_LIB}) - -add_custom_target(runtests ALL - DEPENDS sfmltest - WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/test" - COMMAND ${CMAKE_COMMAND} -E echo "Running test suite..." - COMMAND sfmltest +add_custom_command(TARGET runtests + COMMENT "Run tests" + POST_BUILD COMMAND ctest ARGS --output-on-failure + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) diff --git a/test/src/Main.cpp b/test/src/Main.cpp deleted file mode 100644 index b3143fbb..00000000 --- a/test/src/Main.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#define CATCH_CONFIG_MAIN -#include <catch.hpp> diff --git a/test/src/Rect.cpp b/test/src/Rect.cpp index 7ac8933a..e35aa397 100644 --- a/test/src/Rect.cpp +++ b/test/src/Rect.cpp @@ -1,3 +1,5 @@ +#define CATCH_CONFIG_MAIN + #include <SFML/Graphics/Rect.hpp> #include <SFML/System/Vector2.hpp> #include "TestUtilities/Graphics.hpp" diff --git a/test/src/Vector2.cpp b/test/src/Vector2.cpp index 73ae8463..175ebee2 100644 --- a/test/src/Vector2.cpp +++ b/test/src/Vector2.cpp @@ -1,3 +1,5 @@ +#define CATCH_CONFIG_MAIN + #include <SFML/System/Vector2.hpp> #include "TestUtilities/System.hpp" diff --git a/test/src/Window.cpp b/test/src/Window.cpp new file mode 100644 index 00000000..e5733626 --- /dev/null +++ b/test/src/Window.cpp @@ -0,0 +1,10 @@ +#define CATCH_CONFIG_MAIN + +#include <SFML/Graphics/Rect.hpp> +#include <SFML/System/Vector2.hpp> +#include "TestUtilities/Window.hpp" + +TEST_CASE("Window unit test exists", "[window]") +{ + CHECK(TRUE); +} From bc7258006c0021c366eb986698a79f2e1807fc8f Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Mon, 20 Aug 2018 08:51:42 +0100 Subject: [PATCH 161/211] Restructure test source folders --- test/CMakeLists.txt | 23 +++++++++++-------- test/src/CatchMain.cpp | 2 ++ test/src/{ => Graphics}/Rect.cpp | 4 +--- test/src/{ => System}/Vector2.cpp | 4 +--- test/src/{ => System}/Vector3.cpp | 2 +- .../{Graphics.cpp => GraphicsUtil.cpp} | 0 .../{Graphics.hpp => GraphicsUtil.hpp} | 2 +- .../{System.cpp => SystemUtil.cpp} | 0 .../{System.hpp => SystemUtil.hpp} | 0 .../{Window.cpp => WindowUtil.cpp} | 0 .../{Window.hpp => WindowUtil.hpp} | 2 +- test/src/Window.cpp | 10 -------- 12 files changed, 20 insertions(+), 29 deletions(-) create mode 100644 test/src/CatchMain.cpp rename test/src/{ => Graphics}/Rect.cpp (98%) rename test/src/{ => System}/Vector2.cpp (98%) rename test/src/{ => System}/Vector3.cpp (99%) rename test/src/TestUtilities/{Graphics.cpp => GraphicsUtil.cpp} (100%) rename test/src/TestUtilities/{Graphics.hpp => GraphicsUtil.hpp} (95%) rename test/src/TestUtilities/{System.cpp => SystemUtil.cpp} (100%) rename test/src/TestUtilities/{System.hpp => SystemUtil.hpp} (100%) rename test/src/TestUtilities/{Window.cpp => WindowUtil.cpp} (100%) rename test/src/TestUtilities/{Window.hpp => WindowUtil.hpp} (97%) delete mode 100644 test/src/Window.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 73712d36..beb4b204 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -5,13 +5,15 @@ 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}/Vector2.cpp" - "${SRCROOT}/Vector3.cpp" - "${SRCROOT}/TestUtilities/System.hpp" - "${SRCROOT}/TestUtilities/System.cpp" + "${SRCROOT}/CatchMain.cpp" + "${SRCROOT}/System/Vector2.cpp" + "${SRCROOT}/System/Vector3.cpp" + "${SRCROOT}/TestUtilities/SystemUtil.hpp" + "${SRCROOT}/TestUtilities/SystemUtil.cpp" ) add_executable(systemtest ${SYSTEM_SRC}) target_link_libraries(systemtest sfml-system) @@ -19,9 +21,9 @@ catch_discover_tests(systemtest) if(SFML_BUILD_WINDOW) SET(WINDOW_SRC - "${SRCROOT}/Window.cpp" - "${SRCROOT}/TestUtilities/Window.hpp" - "${SRCROOT}/TestUtilities/Window.cpp" + "${SRCROOT}/CatchMain.cpp" + "${SRCROOT}/TestUtilities/WindowUtil.hpp" + "${SRCROOT}/TestUtilities/WindowUtil.cpp" ) add_executable(windowtest ${WINDOW_SRC}) target_link_libraries(windowtest sfml-window) @@ -30,9 +32,10 @@ endif() if(SFML_BUILD_GRAPHICS) SET(GRAPHICS_SRC - "${SRCROOT}/Rect.cpp" - "${SRCROOT}/TestUtilities/Graphics.hpp" - "${SRCROOT}/TestUtilities/Graphics.cpp" + "${SRCROOT}/CatchMain.cpp" + "${SRCROOT}/Graphics/Rect.cpp" + "${SRCROOT}/TestUtilities/GraphicsUtil.hpp" + "${SRCROOT}/TestUtilities/GraphicsUtil.cpp" ) add_executable(graphicstest ${GRAPHICS_SRC}) target_link_libraries(graphicstest sfml-graphics) diff --git a/test/src/CatchMain.cpp b/test/src/CatchMain.cpp new file mode 100644 index 00000000..fd9339d7 --- /dev/null +++ b/test/src/CatchMain.cpp @@ -0,0 +1,2 @@ +#define CATCH_CONFIG_MAIN +#include <catch.hpp> \ No newline at end of file diff --git a/test/src/Rect.cpp b/test/src/Graphics/Rect.cpp similarity index 98% rename from test/src/Rect.cpp rename to test/src/Graphics/Rect.cpp index e35aa397..e67fd91e 100644 --- a/test/src/Rect.cpp +++ b/test/src/Graphics/Rect.cpp @@ -1,8 +1,6 @@ -#define CATCH_CONFIG_MAIN - #include <SFML/Graphics/Rect.hpp> #include <SFML/System/Vector2.hpp> -#include "TestUtilities/Graphics.hpp" +#include "GraphicsUtil.hpp" TEST_CASE("sf::Rect class template", "[graphics]") { diff --git a/test/src/Vector2.cpp b/test/src/System/Vector2.cpp similarity index 98% rename from test/src/Vector2.cpp rename to test/src/System/Vector2.cpp index 175ebee2..bb3b28ea 100644 --- a/test/src/Vector2.cpp +++ b/test/src/System/Vector2.cpp @@ -1,7 +1,5 @@ -#define CATCH_CONFIG_MAIN - #include <SFML/System/Vector2.hpp> -#include "TestUtilities/System.hpp" +#include "SystemUtil.hpp" // Use sf::Vector2i for tests. Test coverage is given, as there are no template specializations. diff --git a/test/src/Vector3.cpp b/test/src/System/Vector3.cpp similarity index 99% rename from test/src/Vector3.cpp rename to test/src/System/Vector3.cpp index cf80fb1d..948a0ff7 100644 --- a/test/src/Vector3.cpp +++ b/test/src/System/Vector3.cpp @@ -1,5 +1,5 @@ #include <SFML/System/Vector3.hpp> -#include "TestUtilities/System.hpp" +#include "SystemUtil.hpp" // Use sf::Vector3i for tests. Test coverage is given, as there are no template specializations. diff --git a/test/src/TestUtilities/Graphics.cpp b/test/src/TestUtilities/GraphicsUtil.cpp similarity index 100% rename from test/src/TestUtilities/Graphics.cpp rename to test/src/TestUtilities/GraphicsUtil.cpp diff --git a/test/src/TestUtilities/Graphics.hpp b/test/src/TestUtilities/GraphicsUtil.hpp similarity index 95% rename from test/src/TestUtilities/Graphics.hpp rename to test/src/TestUtilities/GraphicsUtil.hpp index a251bc56..2a792e4c 100644 --- a/test/src/TestUtilities/Graphics.hpp +++ b/test/src/TestUtilities/GraphicsUtil.hpp @@ -6,7 +6,7 @@ #ifndef SFML_TESTUTILITIES_GRAPHICS_HPP #define SFML_TESTUTILITIES_GRAPHICS_HPP -#include "Window.hpp" +#include "WindowUtil.hpp" // Forward declarations for non-template types namespace sf diff --git a/test/src/TestUtilities/System.cpp b/test/src/TestUtilities/SystemUtil.cpp similarity index 100% rename from test/src/TestUtilities/System.cpp rename to test/src/TestUtilities/SystemUtil.cpp diff --git a/test/src/TestUtilities/System.hpp b/test/src/TestUtilities/SystemUtil.hpp similarity index 100% rename from test/src/TestUtilities/System.hpp rename to test/src/TestUtilities/SystemUtil.hpp diff --git a/test/src/TestUtilities/Window.cpp b/test/src/TestUtilities/WindowUtil.cpp similarity index 100% rename from test/src/TestUtilities/Window.cpp rename to test/src/TestUtilities/WindowUtil.cpp diff --git a/test/src/TestUtilities/Window.hpp b/test/src/TestUtilities/WindowUtil.hpp similarity index 97% rename from test/src/TestUtilities/Window.hpp rename to test/src/TestUtilities/WindowUtil.hpp index 3ddc158f..b0a9f21d 100644 --- a/test/src/TestUtilities/Window.hpp +++ b/test/src/TestUtilities/WindowUtil.hpp @@ -6,7 +6,7 @@ #ifndef SFML_TESTUTILITIES_WINDOW_HPP #define SFML_TESTUTILITIES_WINDOW_HPP -#include "System.hpp" +#include "SystemUtil.hpp" #include <SFML/Graphics/Rect.hpp> diff --git a/test/src/Window.cpp b/test/src/Window.cpp deleted file mode 100644 index e5733626..00000000 --- a/test/src/Window.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#define CATCH_CONFIG_MAIN - -#include <SFML/Graphics/Rect.hpp> -#include <SFML/System/Vector2.hpp> -#include "TestUtilities/Window.hpp" - -TEST_CASE("Window unit test exists", "[window]") -{ - CHECK(TRUE); -} From d53858afb1d36c59f487cc0d4dadf4bcc04e0753 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Mon, 20 Aug 2018 20:09:29 +0100 Subject: [PATCH 162/211] Removed incompatible cmake/catch functionality, replaced with vanilla cmake --- cmake/Catch.cmake | 175 -------------------------------------- cmake/CatchAddTests.cmake | 151 -------------------------------- test/CMakeLists.txt | 9 +- 3 files changed, 3 insertions(+), 332 deletions(-) delete mode 100644 cmake/Catch.cmake delete mode 100644 cmake/CatchAddTests.cmake diff --git a/cmake/Catch.cmake b/cmake/Catch.cmake deleted file mode 100644 index 5f76e0cd..00000000 --- a/cmake/Catch.cmake +++ /dev/null @@ -1,175 +0,0 @@ -# Distributed under the OSI-approved BSD 3-Clause License. See accompanying -# file Copyright.txt or https://cmake.org/licensing for details. - -#[=======================================================================[.rst: -Catch ------ - -This module defines a function to help use the Catch test framework. - -The :command:`catch_discover_tests` discovers tests by asking the compiled test -executable to enumerate its tests. This does not require CMake to be re-run -when tests change. However, it may not work in a cross-compiling environment, -and setting test properties is less convenient. - -This command is intended to replace use of :command:`add_test` to register -tests, and will create a separate CTest test for each Catch test case. Note -that this is in some cases less efficient, as common set-up and tear-down logic -cannot be shared by multiple test cases executing in the same instance. -However, it provides more fine-grained pass/fail information to CTest, which is -usually considered as more beneficial. By default, the CTest test name is the -same as the Catch name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``. - -.. command:: catch_discover_tests - - Automatically add tests with CTest by querying the compiled test executable - for available tests:: - - catch_discover_tests(target - [TEST_SPEC arg1...] - [EXTRA_ARGS arg1...] - [WORKING_DIRECTORY dir] - [TEST_PREFIX prefix] - [TEST_SUFFIX suffix] - [PROPERTIES name1 value1...] - [TEST_LIST var] - ) - - ``catch_discover_tests`` sets up a post-build command on the test executable - that generates the list of tests by parsing the output from running the test - with the ``--list-test-names-only`` argument. This ensures that the full - list of tests is obtained. Since test discovery occurs at build time, it is - not necessary to re-run CMake when the list of tests changes. - However, it requires that :prop_tgt:`CROSSCOMPILING_EMULATOR` is properly set - in order to function in a cross-compiling environment. - - Additionally, setting properties on tests is somewhat less convenient, since - the tests are not available at CMake time. Additional test properties may be - assigned to the set of tests as a whole using the ``PROPERTIES`` option. If - more fine-grained test control is needed, custom content may be provided - through an external CTest script using the :prop_dir:`TEST_INCLUDE_FILES` - directory property. The set of discovered tests is made accessible to such a - script via the ``<target>_TESTS`` variable. - - The options are: - - ``target`` - Specifies the Catch executable, which must be a known CMake executable - target. CMake will substitute the location of the built executable when - running the test. - - ``TEST_SPEC arg1...`` - Specifies test cases, wildcarded test cases, tags and tag expressions to - pass to the Catch executable with the ``--list-test-names-only`` argument. - - ``EXTRA_ARGS arg1...`` - Any extra arguments to pass on the command line to each test case. - - ``WORKING_DIRECTORY dir`` - Specifies the directory in which to run the discovered test cases. If this - option is not provided, the current binary directory is used. - - ``TEST_PREFIX prefix`` - Specifies a ``prefix`` to be prepended to the name of each discovered test - case. This can be useful when the same test executable is being used in - multiple calls to ``catch_discover_tests()`` but with different - ``TEST_SPEC`` or ``EXTRA_ARGS``. - - ``TEST_SUFFIX suffix`` - Similar to ``TEST_PREFIX`` except the ``suffix`` is appended to the name of - every discovered test case. Both ``TEST_PREFIX`` and ``TEST_SUFFIX`` may - be specified. - - ``PROPERTIES name1 value1...`` - Specifies additional properties to be set on all tests discovered by this - invocation of ``catch_discover_tests``. - - ``TEST_LIST var`` - Make the list of tests available in the variable ``var``, rather than the - default ``<target>_TESTS``. This can be useful when the same test - executable is being used in multiple calls to ``catch_discover_tests()``. - Note that this variable is only available in CTest. - -#]=======================================================================] - -#------------------------------------------------------------------------------ -function(catch_discover_tests TARGET) - cmake_parse_arguments( - "" - "" - "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST" - "TEST_SPEC;EXTRA_ARGS;PROPERTIES" - ${ARGN} - ) - - if(NOT _WORKING_DIRECTORY) - set(_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") - endif() - if(NOT _TEST_LIST) - set(_TEST_LIST ${TARGET}_TESTS) - endif() - - ## Generate a unique name based on the extra arguments - string(SHA1 args_hash "${_TEST_SPEC} ${_EXTRA_ARGS}") - string(SUBSTRING ${args_hash} 0 7 args_hash) - - # Define rule to generate test list for aforementioned test executable - set(ctest_include_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_include-${args_hash}.cmake") - set(ctest_tests_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_tests-${args_hash}.cmake") - get_property(crosscompiling_emulator - TARGET ${TARGET} - PROPERTY CROSSCOMPILING_EMULATOR - ) - add_custom_command( - TARGET ${TARGET} POST_BUILD - BYPRODUCTS "${ctest_tests_file}" - COMMAND "${CMAKE_COMMAND}" - -D "TEST_TARGET=${TARGET}" - -D "TEST_EXECUTABLE=$<TARGET_FILE:${TARGET}>" - -D "TEST_EXECUTOR=${crosscompiling_emulator}" - -D "TEST_WORKING_DIR=${_WORKING_DIRECTORY}" - -D "TEST_SPEC=${_TEST_SPEC}" - -D "TEST_EXTRA_ARGS=${_EXTRA_ARGS}" - -D "TEST_PROPERTIES=${_PROPERTIES}" - -D "TEST_PREFIX=${_TEST_PREFIX}" - -D "TEST_SUFFIX=${_TEST_SUFFIX}" - -D "TEST_LIST=${_TEST_LIST}" - -D "CTEST_FILE=${ctest_tests_file}" - -P "${_CATCH_DISCOVER_TESTS_SCRIPT}" - VERBATIM - ) - - file(WRITE "${ctest_include_file}" - "if(EXISTS \"${ctest_tests_file}\")\n" - " include(\"${ctest_tests_file}\")\n" - "else()\n" - " add_test(${TARGET}_NOT_BUILT-${args_hash} ${TARGET}_NOT_BUILT-${args_hash})\n" - "endif()\n" - ) - - if(NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0") - # Add discovered tests to directory TEST_INCLUDE_FILES - set_property(DIRECTORY - APPEND PROPERTY TEST_INCLUDE_FILES "${ctest_include_file}" - ) - else() - # Add discovered tests as directory TEST_INCLUDE_FILE if possible - get_property(test_include_file_set DIRECTORY PROPERTY TEST_INCLUDE_FILE SET) - if (NOT ${test_include_file_set}) - set_property(DIRECTORY - PROPERTY TEST_INCLUDE_FILE "${ctest_include_file}" - ) - else() - message(FATAL_ERROR - "Cannot set more than one TEST_INCLUDE_FILE" - ) - endif() - endif() - -endfunction() - -############################################################################### - -set(_CATCH_DISCOVER_TESTS_SCRIPT - ${CMAKE_CURRENT_LIST_DIR}/CatchAddTests.cmake -) \ No newline at end of file diff --git a/cmake/CatchAddTests.cmake b/cmake/CatchAddTests.cmake deleted file mode 100644 index 4b855ce2..00000000 --- a/cmake/CatchAddTests.cmake +++ /dev/null @@ -1,151 +0,0 @@ -# Distributed under the OSI-approved BSD 3-Clause License. See accompanying -# file Copyright.txt or https://cmake.org/licensing for details. - -set(prefix "${TEST_PREFIX}") -set(suffix "${TEST_SUFFIX}") -set(spec ${TEST_SPEC}) -set(extra_args ${TEST_EXTRA_ARGS}) -set(properties ${TEST_PROPERTIES}) -set(script) -set(suite) -set(tests) - -function(add_command NAME) - set(_args "") - foreach(_arg ${ARGN}) - if(_arg MATCHES "[^-./:a-zA-Z0-9_]") - set(_args "${_args} [==[${_arg}]==]") # form a bracket_argument - else() - set(_args "${_args} ${_arg}") - endif() - endforeach() - set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE) -endfunction() - -# Run test executable to get list of available tests -if(NOT EXISTS "${TEST_EXECUTABLE}") - message(FATAL_ERROR - "Specified test executable '${TEST_EXECUTABLE}' does not exist" - ) -endif() -execute_process( - COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-test-names-only - OUTPUT_VARIABLE output - RESULT_VARIABLE result -) -# Catch --list-test-names-only reports the number of tests, so 0 is... surprising -if(${result} EQUAL 0) - message(WARNING - "Test executable '${TEST_EXECUTABLE}' contains no tests!\n" - ) -elseif(${result} LESS 0) - message(FATAL_ERROR - "Error running test executable '${TEST_EXECUTABLE}':\n" - " Result: ${result}\n" - " Output: ${output}\n" - ) -endif() - -string(REPLACE "\n" ";" output "${output}") - -# Parse output -foreach(line ${output}) - set(test ${line}) - # ...and add to script - add_command(add_test - "${prefix}${test}${suffix}" - ${TEST_EXECUTOR} - "${TEST_EXECUTABLE}" - "${test}" - ${extra_args} - ) - add_command(set_tests_properties - "${prefix}${test}${suffix}" - PROPERTIES - WORKING_DIRECTORY "${TEST_WORKING_DIR}" - ${properties} - ) - list(APPEND tests "${prefix}${test}${suffix}") -endforeach() - -# Create a list of all discovered tests, which users may use to e.g. set -# properties on the tests -add_command(set ${TEST_LIST} ${tests}) - -# Write CTest script -file(WRITE "${CTEST_FILE}" "${script}")# Distributed under the OSI-approved BSD 3-Clause License. See accompanying -# file Copyright.txt or https://cmake.org/licensing for details. - -set(prefix "${TEST_PREFIX}") -set(suffix "${TEST_SUFFIX}") -set(spec ${TEST_SPEC}) -set(extra_args ${TEST_EXTRA_ARGS}) -set(properties ${TEST_PROPERTIES}) -set(script) -set(suite) -set(tests) - -function(add_command NAME) - set(_args "") - foreach(_arg ${ARGN}) - if(_arg MATCHES "[^-./:a-zA-Z0-9_]") - set(_args "${_args} [==[${_arg}]==]") # form a bracket_argument - else() - set(_args "${_args} ${_arg}") - endif() - endforeach() - set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE) -endfunction() - -# Run test executable to get list of available tests -if(NOT EXISTS "${TEST_EXECUTABLE}") - message(FATAL_ERROR - "Specified test executable '${TEST_EXECUTABLE}' does not exist" - ) -endif() -execute_process( - COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-test-names-only - OUTPUT_VARIABLE output - RESULT_VARIABLE result -) -# Catch --list-test-names-only reports the number of tests, so 0 is... surprising -if(${result} EQUAL 0) - message(WARNING - "Test executable '${TEST_EXECUTABLE}' contains no tests!\n" - ) -elseif(${result} LESS 0) - message(FATAL_ERROR - "Error running test executable '${TEST_EXECUTABLE}':\n" - " Result: ${result}\n" - " Output: ${output}\n" - ) -endif() - -string(REPLACE "\n" ";" output "${output}") - -# Parse output -foreach(line ${output}) - set(test ${line}) - # ...and add to script - add_command(add_test - "${prefix}${test}${suffix}" - ${TEST_EXECUTOR} - "${TEST_EXECUTABLE}" - "${test}" - ${extra_args} - ) - add_command(set_tests_properties - "${prefix}${test}${suffix}" - PROPERTIES - WORKING_DIRECTORY "${TEST_WORKING_DIR}" - ${properties} - ) - list(APPEND tests "${prefix}${test}${suffix}") -endforeach() - -# Create a list of all discovered tests, which users may use to e.g. set -# properties on the tests -add_command(set ${TEST_LIST} ${tests}) - -# Write CTest script -file(WRITE "${CTEST_FILE}" "${script}") \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index beb4b204..abfe34f2 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,6 +1,3 @@ -# Include the extra catch cmake functions -include("${CMAKE_SOURCE_DIR}/cmake/Catch.cmake") - set(SRCROOT "${PROJECT_SOURCE_DIR}/test/src") include_directories("${PROJECT_SOURCE_DIR}/include") @@ -17,7 +14,7 @@ SET(SYSTEM_SRC ) add_executable(systemtest ${SYSTEM_SRC}) target_link_libraries(systemtest sfml-system) -catch_discover_tests(systemtest) +add_test(System-module-tests systemtest) if(SFML_BUILD_WINDOW) SET(WINDOW_SRC @@ -27,7 +24,7 @@ if(SFML_BUILD_WINDOW) ) add_executable(windowtest ${WINDOW_SRC}) target_link_libraries(windowtest sfml-window) - catch_discover_tests(windowtest) + add_test(Window-module-tests windowtest) endif() if(SFML_BUILD_GRAPHICS) @@ -39,7 +36,7 @@ if(SFML_BUILD_GRAPHICS) ) add_executable(graphicstest ${GRAPHICS_SRC}) target_link_libraries(graphicstest sfml-graphics) - catch_discover_tests(graphicstest) + add_test(Graphics-module-tests graphicstest) endif() # Automatically run the tests at the end of the build From c626332e03782076c5f938f41c179a3de4873751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Mon, 20 Aug 2018 23:49:56 +0200 Subject: [PATCH 163/211] Disabled tests by default --- CMakeLists.txt | 2 +- test/CMakeLists.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ff8aa6de..eefd9fea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,7 +85,7 @@ if(SFML_BUILD_WINDOW) endif() # add an option for building the test suite -sfml_set_option(SFML_BUILD_TEST_SUITE TRUE BOOL "TRUE to build the SFML test suite, FALSE to ignore it") +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) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index abfe34f2..86dd8128 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -40,8 +40,8 @@ if(SFML_BUILD_GRAPHICS) endif() # Automatically run the tests at the end of the build -add_custom_target( runtests ALL - DEPENDS systemtest windowtest graphicstest +add_custom_target(runtests ALL + DEPENDS systemtest windowtest graphicstest ) add_custom_command(TARGET runtests COMMENT "Run tests" From 2c3a321afd3d904bc3e56f853645094d5972a118 Mon Sep 17 00:00:00 2001 From: Jonny <jonathan.r.paton@googlemail.com> Date: Thu, 29 Nov 2018 10:26:40 +0000 Subject: [PATCH 164/211] Update travis/appveyor to build and run test suite --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ca4a4175..40d8ff6c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ addons: before_script: - mkdir build && cd build -- cmake .. $CMAKE_FLAGS -DCMAKE_INSTALL_PREFIX=../install -DSFML_BUILD_EXAMPLES=TRUE +- cmake .. $CMAKE_FLAGS -DSFML_BUILD_TEST_SUITE=TRUE -DCMAKE_INSTALL_PREFIX=../install -DSFML_BUILD_EXAMPLES=TRUE script: - cmake --build . --target install From 53972ed5f21cc4a0d7bd63846fb008ff6200945e Mon Sep 17 00:00:00 2001 From: = <jonathan.r.paton@googlemail.com> Date: Thu, 29 Nov 2018 18:38:27 +0000 Subject: [PATCH 165/211] Use sfml_add_test macro for unit tests and copy dlls to output directory if required --- CMakeLists.txt | 8 ++++++-- cmake/Macros.cmake | 36 ++++++++++++++++++++++++++++++++++++ test/CMakeLists.txt | 16 +++++----------- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eefd9fea..abb18a80 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -285,8 +285,12 @@ if(SFML_BUILD_DOC) add_subdirectory(doc) endif() if(SFML_BUILD_TEST_SUITE) - enable_testing() - add_subdirectory(test) + 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 diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index f92cf796..f8e19f1f 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -297,6 +297,42 @@ macro(sfml_add_example target) endmacro() +# 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) + + # set a source group for the source files + source_group("" FILES ${SOURCES}) + + # check whether resources must be added in target + set(target_input ${SOURCES}) + + # create the target + add_executable(${target} ${target_input}) + + # set the target's folder (for IDEs that support it, e.g. Visual Studio) + set_target_properties(${target} PROPERTIES FOLDER "Tests") + + # 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. diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 86dd8128..7bbcc155 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -12,9 +12,7 @@ SET(SYSTEM_SRC "${SRCROOT}/TestUtilities/SystemUtil.hpp" "${SRCROOT}/TestUtilities/SystemUtil.cpp" ) -add_executable(systemtest ${SYSTEM_SRC}) -target_link_libraries(systemtest sfml-system) -add_test(System-module-tests systemtest) +sfml_add_test(systemtest "${SYSTEM_SRC}" sfml-system) if(SFML_BUILD_WINDOW) SET(WINDOW_SRC @@ -22,9 +20,7 @@ if(SFML_BUILD_WINDOW) "${SRCROOT}/TestUtilities/WindowUtil.hpp" "${SRCROOT}/TestUtilities/WindowUtil.cpp" ) - add_executable(windowtest ${WINDOW_SRC}) - target_link_libraries(windowtest sfml-window) - add_test(Window-module-tests windowtest) + sfml_add_test(windowtest "${WINDOW_SRC}" sfml-window) endif() if(SFML_BUILD_GRAPHICS) @@ -34,17 +30,15 @@ if(SFML_BUILD_GRAPHICS) "${SRCROOT}/TestUtilities/GraphicsUtil.hpp" "${SRCROOT}/TestUtilities/GraphicsUtil.cpp" ) - add_executable(graphicstest ${GRAPHICS_SRC}) - target_link_libraries(graphicstest sfml-graphics) - add_test(Graphics-module-tests graphicstest) + sfml_add_test(graphicstest "${GRAPHICS_SRC}" sfml-graphics) endif() # Automatically run the tests at the end of the build add_custom_target(runtests ALL DEPENDS systemtest windowtest graphicstest ) + add_custom_command(TARGET runtests COMMENT "Run tests" POST_BUILD COMMAND ctest ARGS --output-on-failure - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} -) +) \ No newline at end of file From 1d768839e7c1c5dc396e114ca7f2f927b6ae1020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Sat, 19 Jan 2019 15:03:33 +0100 Subject: [PATCH 166/211] Removed test suite for Android builds --- .travis.yml | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 40d8ff6c..d32844db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ addons: before_script: - mkdir build && cd build -- cmake .. $CMAKE_FLAGS -DSFML_BUILD_TEST_SUITE=TRUE -DCMAKE_INSTALL_PREFIX=../install -DSFML_BUILD_EXAMPLES=TRUE +- cmake .. $CMAKE_FLAGS -DCMAKE_INSTALL_PREFIX=../install -DSFML_BUILD_EXAMPLES=TRUE script: - cmake --build . --target install @@ -26,57 +26,63 @@ matrix: os: linux dist: xenial compiler: gcc + env: + - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE" - name: "Linux gcc Static" os: linux dist: xenial compiler: gcc env: - - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE" + - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE -DSFML_BUILD_TEST_SUITE=TRUE" - name: "Linux clang Dynamic" os: linux dist: xenial compiler: clang + env: + - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE" - name: "Linux clang Static" os: linux dist: xenial compiler: clang env: - - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE" + - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE -DSFML_BUILD_TEST_SUITE=TRUE" - name: "macOS Xcode 10 Dynamic" os: osx osx_image: xcode10 env: - - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install" + - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install -DSFML_BUILD_TEST_SUITE=TRUE" - name: "macOS Xcode 10 Frameworks" os: osx osx_image: xcode10 env: - - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install -DSFML_BUILD_FRAMEWORKS=TRUE" + - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install -DSFML_BUILD_TEST_SUITE=TRUE -DSFML_BUILD_FRAMEWORKS=TRUE" - name: "macOS Xcode 10 Static" os: osx osx_image: xcode10 env: - - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install -DBUILD_SHARED_LIBS=FALSE" + - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install -DSFML_BUILD_TEST_SUITE=TRUE -DBUILD_SHARED_LIBS=FALSE" - name: "iOS Xcode 10" os: osx osx_image: xcode10 env: - - CMAKE_FLAGS="-GXcode -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/iOS.toolchain.cmake -DIOS_PLATFORM=SIMULATOR" + - CMAKE_FLAGS="-GXcode -DSFML_BUILD_TEST_SUITE=TRUE -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/iOS.toolchain.cmake -DIOS_PLATFORM=SIMULATOR" - name: "Visual studio 15 2017 Dynamic" os: windows + env: + - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE" - name: "Visual studio 15 2017 Static" os: windows env: - - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE" + - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE -DSFML_BUILD_TEST_SUITE=TRUE" - name: "Android armeabi-v7a" language: android @@ -86,7 +92,7 @@ matrix: - platform-tools - build-tools-26.0.1 env: - - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r18b -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" + - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DSFML_BUILD_TEST_SUITE=FALSE -DCMAKE_ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r18b -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" install: &androidInstall - echo y | sdkmanager "cmake;3.10.2.4988404" @@ -99,7 +105,7 @@ matrix: language: android android: *androidComponents env: - - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r18b -DCMAKE_ANDROID_ARCH_ABI=x86 -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" + - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DSFML_BUILD_TEST_SUITE=FALSE -DCMAKE_ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r18b -DCMAKE_ANDROID_ARCH_ABI=x86 -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" install: *androidInstall notifications: From 7e7216f598889c04f5144be182a411c69d358d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Mon, 11 Feb 2019 22:32:04 +0100 Subject: [PATCH 167/211] Renamed test targets to test-sfml-module structure --- cmake/Macros.cmake | 6 +----- test/CMakeLists.txt | 10 +++++----- test/src/CatchMain.cpp | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index f8e19f1f..a966bc5b 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -306,11 +306,8 @@ function(sfml_add_test target SOURCES DEPENDS) # set a source group for the source files source_group("" FILES ${SOURCES}) - # check whether resources must be added in target - set(target_input ${SOURCES}) - # create the target - add_executable(${target} ${target_input}) + 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") @@ -462,4 +459,3 @@ function(sfml_export_targets) DESTINATION ${config_package_location} COMPONENT devel) endfunction() - diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7bbcc155..9e9f6111 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -12,7 +12,7 @@ SET(SYSTEM_SRC "${SRCROOT}/TestUtilities/SystemUtil.hpp" "${SRCROOT}/TestUtilities/SystemUtil.cpp" ) -sfml_add_test(systemtest "${SYSTEM_SRC}" sfml-system) +sfml_add_test(test-sfml-system "${SYSTEM_SRC}" sfml-system) if(SFML_BUILD_WINDOW) SET(WINDOW_SRC @@ -20,7 +20,7 @@ if(SFML_BUILD_WINDOW) "${SRCROOT}/TestUtilities/WindowUtil.hpp" "${SRCROOT}/TestUtilities/WindowUtil.cpp" ) - sfml_add_test(windowtest "${WINDOW_SRC}" sfml-window) + sfml_add_test(test-sfml-window "${WINDOW_SRC}" sfml-window) endif() if(SFML_BUILD_GRAPHICS) @@ -30,15 +30,15 @@ if(SFML_BUILD_GRAPHICS) "${SRCROOT}/TestUtilities/GraphicsUtil.hpp" "${SRCROOT}/TestUtilities/GraphicsUtil.cpp" ) - sfml_add_test(graphicstest "${GRAPHICS_SRC}" sfml-graphics) + sfml_add_test(test-sfml-graphics "${GRAPHICS_SRC}" sfml-graphics) endif() # Automatically run the tests at the end of the build add_custom_target(runtests ALL - DEPENDS systemtest windowtest graphicstest + DEPENDS test-sfml-system test-sfml-window test-sfml-graphics ) add_custom_command(TARGET runtests COMMENT "Run tests" POST_BUILD COMMAND ctest ARGS --output-on-failure -) \ No newline at end of file +) diff --git a/test/src/CatchMain.cpp b/test/src/CatchMain.cpp index fd9339d7..b3143fbb 100644 --- a/test/src/CatchMain.cpp +++ b/test/src/CatchMain.cpp @@ -1,2 +1,2 @@ #define CATCH_CONFIG_MAIN -#include <catch.hpp> \ No newline at end of file +#include <catch.hpp> From 6d8143088ec8ffc31a12ee3a9a60119474407872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <lukas.duerrenberger@zuehlke.com> Date: Tue, 19 Feb 2019 10:17:55 +0100 Subject: [PATCH 168/211] Disabled test suite for Visual Studio Dynamic build on Travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d32844db..f568dd88 100644 --- a/.travis.yml +++ b/.travis.yml @@ -77,7 +77,7 @@ matrix: - name: "Visual studio 15 2017 Dynamic" os: windows env: - - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE" + - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=FALSE" - name: "Visual studio 15 2017 Static" os: windows From 4043f71156a7149f8d4bafe15d3ac73c440fae7b Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Wed, 20 Feb 2019 20:09:33 +0100 Subject: [PATCH 169/211] Fixed missing checks for empty vertex arrays when updating the vertex buffers in sf::Text. (Fixes #1558) --- src/SFML/Graphics/Text.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 5b929485..64e0dacc 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -212,7 +212,8 @@ void Text::setFillColor(const Color& color) if (m_verticesBuffer.getVertexCount() != m_vertices.getVertexCount()) m_verticesBuffer.create(m_vertices.getVertexCount()); - m_verticesBuffer.update(&m_vertices[0]); + if (m_vertices.getVertexCount() > 0) + m_verticesBuffer.update(&m_vertices[0]); } } } @@ -238,7 +239,8 @@ void Text::setOutlineColor(const Color& color) if (m_outlineVerticesBuffer.getVertexCount() != m_outlineVertices.getVertexCount()) m_outlineVerticesBuffer.create(m_outlineVertices.getVertexCount()); - m_outlineVerticesBuffer.update(&m_outlineVertices[0]); + if (m_outlineVertices.getVertexCount() > 0) + m_outlineVerticesBuffer.update(&m_outlineVertices[0]); } } } @@ -617,12 +619,14 @@ void Text::ensureGeometryUpdate() const if (m_verticesBuffer.getVertexCount() != m_vertices.getVertexCount()) m_verticesBuffer.create(m_vertices.getVertexCount()); - m_verticesBuffer.update(&m_vertices[0]); + if (m_vertices.getVertexCount() > 0) + m_verticesBuffer.update(&m_vertices[0]); if (m_outlineVerticesBuffer.getVertexCount() != m_outlineVertices.getVertexCount()) m_outlineVerticesBuffer.create(m_outlineVertices.getVertexCount()); - m_outlineVerticesBuffer.update(&m_outlineVertices[0]); + if (m_outlineVertices.getVertexCount() > 0) + m_outlineVerticesBuffer.update(&m_outlineVertices[0]); } } From 86672a37246100f40077e692bc7130a8e4e87d2c Mon Sep 17 00:00:00 2001 From: Benjamin Porter <benjamin.porter@gmail.com> Date: Sun, 17 Mar 2019 15:51:06 +1100 Subject: [PATCH 170/211] Fix: Win32 no longer hides cursor when hovering title bar, keeping in line with behaviour of other platforms. --- src/SFML/Window/Win32/WindowImplWin32.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index e4e0dba5..925c2bf4 100755 --- a/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -399,14 +399,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 +416,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); } @@ -586,8 +580,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; } From b00317e90cf29b933dae2d5365f6f674f1b633fb Mon Sep 17 00:00:00 2001 From: Jonny <jonathan.r.paton@googlemail.com> Date: Sat, 31 Aug 2019 16:34:02 +0100 Subject: [PATCH 171/211] Initialise m_context correctly in SFContext constructors --- src/SFML/Window/OSX/SFContext.mm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/SFML/Window/OSX/SFContext.mm b/src/SFML/Window/OSX/SFContext.mm index ab1e04ce..4bd3c3eb 100644 --- a/src/SFML/Window/OSX/SFContext.mm +++ b/src/SFML/Window/OSX/SFContext.mm @@ -42,6 +42,7 @@ namespace priv //////////////////////////////////////////////////////////// SFContext::SFContext(SFContext* shared) : +m_context(0), m_view(0), m_window(0) { @@ -58,6 +59,7 @@ 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) { @@ -76,6 +78,7 @@ 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) { From 81a1da6a59853befc7912a1a49edb492b5369c89 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sat, 4 May 2019 16:39:50 +0200 Subject: [PATCH 172/211] Revert "Added a VertexBuffer implementation to all Drawables that were rendered via VertexArrays." This reverts commit 4dfad062e43d7c6ef5161d52dd79ce8934ee4e68. --- include/SFML/Graphics/Shape.hpp | 21 +++--- include/SFML/Graphics/Sprite.hpp | 8 +- include/SFML/Graphics/Text.hpp | 31 ++++---- src/SFML/Graphics/Shape.cpp | 77 +++---------------- src/SFML/Graphics/Sprite.cpp | 41 ++-------- src/SFML/Graphics/Text.cpp | 126 ++++++++----------------------- 6 files changed, 74 insertions(+), 230 deletions(-) diff --git a/include/SFML/Graphics/Shape.hpp b/include/SFML/Graphics/Shape.hpp index 20c933a1..94990f29 100644 --- a/include/SFML/Graphics/Shape.hpp +++ b/include/SFML/Graphics/Shape.hpp @@ -32,7 +32,6 @@ #include <SFML/Graphics/Drawable.hpp> #include <SFML/Graphics/Transformable.hpp> #include <SFML/Graphics/VertexArray.hpp> -#include <SFML/Graphics/VertexBuffer.hpp> #include <SFML/System/Vector2.hpp> @@ -306,17 +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 - VertexBuffer m_verticesBuffer; ///< Vertex buffer containing the fill geometry - VertexBuffer m_outlineVerticesBuffer; ///< Vertex buffer 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 65f8f90f..b44584be 100644 --- a/include/SFML/Graphics/Sprite.hpp +++ b/include/SFML/Graphics/Sprite.hpp @@ -33,7 +33,6 @@ #include <SFML/Graphics/Transformable.hpp> #include <SFML/Graphics/Vertex.hpp> #include <SFML/Graphics/Rect.hpp> -#include <SFML/Graphics/VertexBuffer.hpp> namespace sf @@ -216,10 +215,9 @@ private: //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - Vertex m_vertices[4]; ///< Vertices defining the sprite's geometry - VertexBuffer m_verticesBuffer; ///< Vertex buffer containing 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 dfc08a75..158e149a 100644 --- a/include/SFML/Graphics/Text.hpp +++ b/include/SFML/Graphics/Text.hpp @@ -34,7 +34,6 @@ #include <SFML/Graphics/Font.hpp> #include <SFML/Graphics/Rect.hpp> #include <SFML/Graphics/VertexArray.hpp> -#include <SFML/Graphics/VertexBuffer.hpp> #include <SFML/System/String.hpp> #include <string> #include <vector> @@ -436,22 +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 VertexBuffer m_verticesBuffer; ///< Vertex buffer containing the fill geometry - mutable VertexBuffer m_outlineVerticesBuffer; ///< Vertex buffer 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/src/SFML/Graphics/Shape.cpp b/src/SFML/Graphics/Shape.cpp index 10d743cc..d0245d5d 100644 --- a/src/SFML/Graphics/Shape.cpp +++ b/src/SFML/Graphics/Shape.cpp @@ -87,10 +87,6 @@ void Shape::setTextureRect(const IntRect& rect) { m_textureRect = rect; updateTexCoords(); - - // Update the vertex buffers if they are being used - if (m_verticesBuffer.getVertexCount()) - m_verticesBuffer.update(&m_vertices[0]); } @@ -106,10 +102,6 @@ void Shape::setFillColor(const Color& color) { m_fillColor = color; updateFillColors(); - - // Update the vertex buffers if they are being used - if (m_verticesBuffer.getVertexCount()) - m_verticesBuffer.update(&m_vertices[0]); } @@ -125,10 +117,6 @@ void Shape::setOutlineColor(const Color& color) { m_outlineColor = color; updateOutlineColors(); - - // Update the vertex buffers if they are being used - if (m_outlineVerticesBuffer.getVertexCount()) - m_outlineVerticesBuffer.update(&m_outlineVertices[0]); } @@ -170,17 +158,15 @@ FloatRect Shape::getGlobalBounds() const //////////////////////////////////////////////////////////// Shape::Shape() : -m_texture (NULL), -m_textureRect (), -m_fillColor (255, 255, 255), -m_outlineColor (255, 255, 255), -m_outlineThickness (0), -m_vertices (TriangleFan), -m_outlineVertices (TriangleStrip), -m_verticesBuffer (TriangleFan, VertexBuffer::Static), -m_outlineVerticesBuffer(TriangleStrip, VertexBuffer::Static), -m_insideBounds (), -m_bounds () +m_texture (NULL), +m_textureRect (), +m_fillColor (255, 255, 255), +m_outlineColor (255, 255, 255), +m_outlineThickness(0), +m_vertices (TriangleFan), +m_outlineVertices (TriangleStrip), +m_insideBounds (), +m_bounds () { } @@ -194,16 +180,6 @@ void Shape::update() { m_vertices.resize(0); m_outlineVertices.resize(0); - - if (VertexBuffer::isAvailable()) - { - if (m_verticesBuffer.getVertexCount()) - m_verticesBuffer.create(0); - - if (m_outlineVerticesBuffer.getVertexCount()) - m_outlineVerticesBuffer.create(0); - } - return; } @@ -230,21 +206,6 @@ void Shape::update() // Outline updateOutline(); - - // Update the vertex buffers if they are being used - if (VertexBuffer::isAvailable()) - { - if (m_verticesBuffer.getVertexCount() != m_vertices.getVertexCount()) - m_verticesBuffer.create(m_vertices.getVertexCount()); - - m_verticesBuffer.update(&m_vertices[0]); - - if (m_outlineVerticesBuffer.getVertexCount() != m_outlineVertices.getVertexCount()) - m_outlineVerticesBuffer.create(m_outlineVertices.getVertexCount()); - - if (m_outlineVertices.getVertexCount()) - m_outlineVerticesBuffer.update(&m_outlineVertices[0]); - } } @@ -255,29 +216,13 @@ void Shape::draw(RenderTarget& target, RenderStates states) const // Render the inside states.texture = m_texture; - - if (VertexBuffer::isAvailable()) - { - target.draw(m_verticesBuffer, states); - } - else - { - target.draw(m_vertices, states); - } + target.draw(m_vertices, states); // Render the outline if (m_outlineThickness != 0) { states.texture = NULL; - - if (VertexBuffer::isAvailable()) - { - target.draw(m_outlineVerticesBuffer, states); - } - else - { - target.draw(m_outlineVertices, states); - } + target.draw(m_outlineVertices, states); } } diff --git a/src/SFML/Graphics/Sprite.cpp b/src/SFML/Graphics/Sprite.cpp index eae7a731..1fdfc5d5 100644 --- a/src/SFML/Graphics/Sprite.cpp +++ b/src/SFML/Graphics/Sprite.cpp @@ -35,37 +35,26 @@ namespace sf { //////////////////////////////////////////////////////////// Sprite::Sprite() : -m_verticesBuffer(TrianglesStrip, VertexBuffer::Stream), -m_texture (NULL), -m_textureRect () +m_texture (NULL), +m_textureRect() { - if (VertexBuffer::isAvailable()) - m_verticesBuffer.create(4); } //////////////////////////////////////////////////////////// Sprite::Sprite(const Texture& texture) : -m_verticesBuffer(TrianglesStrip, VertexBuffer::Stream), -m_texture (NULL), -m_textureRect () +m_texture (NULL), +m_textureRect() { - if (VertexBuffer::isAvailable()) - m_verticesBuffer.create(4); - setTexture(texture); } //////////////////////////////////////////////////////////// Sprite::Sprite(const Texture& texture, const IntRect& rectangle) : -m_verticesBuffer(TrianglesStrip, VertexBuffer::Stream), -m_texture (NULL), -m_textureRect () +m_texture (NULL), +m_textureRect() { - if (VertexBuffer::isAvailable()) - m_verticesBuffer.create(4); - setTexture(texture); setTextureRect(rectangle); } @@ -91,10 +80,6 @@ void Sprite::setTextureRect(const IntRect& rectangle) m_textureRect = rectangle; updatePositions(); updateTexCoords(); - - // Update the vertex buffer if it is being used - if (VertexBuffer::isAvailable()) - m_verticesBuffer.update(m_vertices); } } @@ -107,10 +92,6 @@ void Sprite::setColor(const Color& color) m_vertices[1].color = color; m_vertices[2].color = color; m_vertices[3].color = color; - - // Update the vertex buffer if it is being used - if (VertexBuffer::isAvailable()) - m_verticesBuffer.update(m_vertices); } @@ -159,15 +140,7 @@ void Sprite::draw(RenderTarget& target, RenderStates states) const { states.transform *= getTransform(); states.texture = m_texture; - - if (VertexBuffer::isAvailable()) - { - target.draw(m_verticesBuffer, states); - } - else - { - target.draw(m_vertices, 4, TriangleStrip, states); - } + target.draw(m_vertices, 4, TriangleStrip, states); } } diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 64e0dacc..7cb4f889 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -76,22 +76,20 @@ namespace sf { //////////////////////////////////////////////////////////// Text::Text() : -m_string (), -m_font (NULL), -m_characterSize (30), -m_letterSpacingFactor (1.f), -m_lineSpacingFactor (1.f), -m_style (Regular), -m_fillColor (255, 255, 255), -m_outlineColor (0, 0, 0), -m_outlineThickness (0), -m_vertices (Triangles), -m_outlineVertices (Triangles), -m_verticesBuffer (Triangles, VertexBuffer::Static), -m_outlineVerticesBuffer(Triangles, VertexBuffer::Static), -m_bounds (), -m_geometryNeedUpdate (false), -m_fontTextureId (0) +m_string (), +m_font (NULL), +m_characterSize (30), +m_letterSpacingFactor(1.f), +m_lineSpacingFactor (1.f), +m_style (Regular), +m_fillColor (255, 255, 255), +m_outlineColor (0, 0, 0), +m_outlineThickness (0), +m_vertices (Triangles), +m_outlineVertices (Triangles), +m_bounds (), +m_geometryNeedUpdate (false), +m_fontTextureId (0) { } @@ -99,22 +97,20 @@ m_fontTextureId (0) //////////////////////////////////////////////////////////// Text::Text(const String& string, const Font& font, unsigned int characterSize) : -m_string (string), -m_font (&font), -m_characterSize (characterSize), -m_letterSpacingFactor (1.f), -m_lineSpacingFactor (1.f), -m_style (Regular), -m_fillColor (255, 255, 255), -m_outlineColor (0, 0, 0), -m_outlineThickness (0), -m_vertices (Triangles), -m_outlineVertices (Triangles), -m_verticesBuffer (Triangles, VertexBuffer::Static), -m_outlineVerticesBuffer(Triangles, VertexBuffer::Static), -m_bounds (), -m_geometryNeedUpdate (true), -m_fontTextureId (0) +m_string (string), +m_font (&font), +m_characterSize (characterSize), +m_letterSpacingFactor(1.f), +m_lineSpacingFactor (1.f), +m_style (Regular), +m_fillColor (255, 255, 255), +m_outlineColor (0, 0, 0), +m_outlineThickness (0), +m_vertices (Triangles), +m_outlineVertices (Triangles), +m_bounds (), +m_geometryNeedUpdate (true), +m_fontTextureId (0) { } @@ -206,15 +202,6 @@ void Text::setFillColor(const Color& color) { for (std::size_t i = 0; i < m_vertices.getVertexCount(); ++i) m_vertices[i].color = m_fillColor; - - if (VertexBuffer::isAvailable()) - { - if (m_verticesBuffer.getVertexCount() != m_vertices.getVertexCount()) - m_verticesBuffer.create(m_vertices.getVertexCount()); - - if (m_vertices.getVertexCount() > 0) - m_verticesBuffer.update(&m_vertices[0]); - } } } } @@ -233,15 +220,6 @@ void Text::setOutlineColor(const Color& color) { for (std::size_t i = 0; i < m_outlineVertices.getVertexCount(); ++i) m_outlineVertices[i].color = m_outlineColor; - - if (VertexBuffer::isAvailable()) - { - if (m_outlineVerticesBuffer.getVertexCount() != m_outlineVertices.getVertexCount()) - m_outlineVerticesBuffer.create(m_outlineVertices.getVertexCount()); - - if (m_outlineVertices.getVertexCount() > 0) - m_outlineVerticesBuffer.update(&m_outlineVertices[0]); - } } } } @@ -404,25 +382,9 @@ void Text::draw(RenderTarget& target, RenderStates states) const // Only draw the outline if there is something to draw if (m_outlineThickness != 0) - { - if (VertexBuffer::isAvailable()) - { - target.draw(m_outlineVerticesBuffer, states); - } - else - { - target.draw(m_outlineVertices, states); - } - } + target.draw(m_outlineVertices, states); - if (VertexBuffer::isAvailable()) - { - target.draw(m_verticesBuffer, states); - } - else - { - target.draw(m_vertices, states); - } + target.draw(m_vertices, states); } } @@ -446,23 +408,11 @@ void Text::ensureGeometryUpdate() const // Clear the previous geometry m_vertices.clear(); m_outlineVertices.clear(); - m_bounds = FloatRect(); // No text: nothing to draw if (m_string.isEmpty()) - { - if (VertexBuffer::isAvailable()) - { - if (m_verticesBuffer.getVertexCount()) - m_verticesBuffer.create(0); - - if (m_outlineVerticesBuffer.getVertexCount()) - m_outlineVerticesBuffer.create(0); - } - return; - } // Compute values related to the text style bool isBold = m_style & Bold; @@ -612,22 +562,6 @@ void Text::ensureGeometryUpdate() const m_bounds.top = minY; m_bounds.width = maxX - minX; m_bounds.height = maxY - minY; - - // Update the vertex buffer if it is being used - if (VertexBuffer::isAvailable()) - { - if (m_verticesBuffer.getVertexCount() != m_vertices.getVertexCount()) - m_verticesBuffer.create(m_vertices.getVertexCount()); - - if (m_vertices.getVertexCount() > 0) - m_verticesBuffer.update(&m_vertices[0]); - - if (m_outlineVerticesBuffer.getVertexCount() != m_outlineVertices.getVertexCount()) - m_outlineVerticesBuffer.create(m_outlineVertices.getVertexCount()); - - if (m_outlineVertices.getVertexCount() > 0) - m_outlineVerticesBuffer.update(&m_outlineVertices[0]); - } } } // namespace sf From 27a4c83ebc724a978e554e77f5f231b887e0bdd9 Mon Sep 17 00:00:00 2001 From: Jonny <jonathan.r.paton@googlemail.com> Date: Tue, 9 Apr 2019 11:02:17 +0100 Subject: [PATCH 173/211] Use GnuInstallDirs module for cmake install paths --- .travis.yml | 6 +-- CMakeLists.txt | 55 +++++++++++++--------------- cmake/Config.cmake | 2 +- cmake/Macros.cmake | 42 ++------------------- doc/CMakeLists.txt | 4 +- tools/pkg-config/sfml-all.pc.in | 2 +- tools/pkg-config/sfml-audio.pc.in | 2 +- tools/pkg-config/sfml-graphics.pc.in | 2 +- tools/pkg-config/sfml-network.pc.in | 2 +- tools/pkg-config/sfml-system.pc.in | 2 +- tools/pkg-config/sfml-window.pc.in | 2 +- 11 files changed, 41 insertions(+), 80 deletions(-) diff --git a/.travis.yml b/.travis.yml index f568dd88..ebefd2c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -54,19 +54,19 @@ matrix: os: osx osx_image: xcode10 env: - - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install -DSFML_BUILD_TEST_SUITE=TRUE" + - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE" - name: "macOS Xcode 10 Frameworks" os: osx osx_image: xcode10 env: - - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install -DSFML_BUILD_TEST_SUITE=TRUE -DSFML_BUILD_FRAMEWORKS=TRUE" + - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE -DSFML_BUILD_FRAMEWORKS=TRUE" - name: "macOS Xcode 10 Static" os: osx osx_image: xcode10 env: - - CMAKE_FLAGS="-DSFML_DEPENDENCIES_INSTALL_PREFIX=../install -DSFML_BUILD_TEST_SUITE=TRUE -DBUILD_SHARED_LIBS=FALSE" + - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE -DBUILD_SHARED_LIBS=FALSE" - name: "iOS Xcode 10" os: osx diff --git a/CMakeLists.txt b/CMakeLists.txt index abb18a80..63ab622e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,6 +47,11 @@ 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) @@ -92,14 +97,8 @@ 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 @@ -125,9 +124,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}") @@ -158,9 +156,6 @@ elseif(SFML_OS_MACOSX) 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) @@ -417,8 +412,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) @@ -426,22 +421,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) + install(DIRECTORY extlibs/libs-msvc/x86/ DESTINATION ${CMAKE_INSTALL_LIBDIR}) elseif(SFML_COMPILER_MSVC) - install(DIRECTORY extlibs/libs-msvc-universal/x86/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib) + 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) + install(DIRECTORY extlibs/libs-msvc/x64/ DESTINATION ${CMAKE_INSTALL_LIBDIR}) elseif(SFML_COMPILER_MSVC) - install(DIRECTORY extlibs/libs-msvc-universal/x64/ DESTINATION ${SFML_DEPENDENCIES_INSTALL_PREFIX}/lib) + 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() @@ -450,33 +445,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() @@ -498,7 +493,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 diff --git a/cmake/Config.cmake b/cmake/Config.cmake index 0a286602..ec382089 100644 --- a/cmake/Config.cmake +++ b/cmake/Config.cmake @@ -71,7 +71,7 @@ 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) set(SFML_PKGCONFIG_DIR "/libdata/pkgconfig") diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index a966bc5b..36fc5bab 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -175,9 +175,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 @@ -257,44 +257,10 @@ macro(sfml_add_example target) target_link_libraries(${target} PRIVATE ${THIS_DEPENDS}) endif() - set(target_install_dir ${SFML_MISC_INSTALL_PREFIX}/examples/${target}) - - if(BUILD_SHARED_LIBS AND (SFML_OS_LINUX OR SFML_OS_FREEBSD)) - file(RELATIVE_PATH rel_lib_dir - ${CMAKE_INSTALL_PREFIX}/${target_install_dir} - ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) - - set_target_properties(${target} PROPERTIES - INSTALL_RPATH "$ORIGIN/${rel_lib_dir}") - endif() - if (SFML_OS_IOS) sfml_set_common_ios_properties(${target}) endif() - # add the install rule - install(TARGETS ${target} - RUNTIME DESTINATION ${target_install_dir} COMPONENT examples - BUNDLE DESTINATION ${target_install_dir} COMPONENT examples - RESOURCE DESTINATION ${target_install_dir} COMPONENT examples) - - # install the example's source code - install(FILES ${THIS_SOURCES} - DESTINATION ${target_install_dir} - COMPONENT examples) - - if (THIS_RESOURCES_DIR) - # install the example's resources as well - get_filename_component(THIS_RESOURCES_DIR "${THIS_RESOURCES_DIR}" ABSOLUTE) - - 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 ${target_install_dir} - COMPONENT examples) - endif() - endmacro() # add a new target which is a SFML test @@ -441,7 +407,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}") diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 123b44cf..175fa733 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -53,10 +53,10 @@ add_custom_target(doc ALL # setup install rules 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/tools/pkg-config/sfml-all.pc.in b/tools/pkg-config/sfml-all.pc.in index dd2d4c36..3dba4f7c 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 0d7a3ce1..ad7fad72 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 b1381607..46f53874 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 4381ca01..c0199350 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 647ab53c..285852d7 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 93bf344c..e216473c 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 From ca21695521c148cb5e06ed9be80abffe3d9019c2 Mon Sep 17 00:00:00 2001 From: Stefan Schindler <stefan@boxbox.org> Date: Fri, 22 Jan 2016 21:30:54 +0100 Subject: [PATCH 174/211] Added getPosition() and getSize() to sf::Rect<T>. --- include/SFML/Graphics/Rect.hpp | 20 ++++++++++++++++++++ include/SFML/Graphics/Rect.inl | 12 ++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/SFML/Graphics/Rect.hpp b/include/SFML/Graphics/Rect.hpp index f3c6d3b6..466db4d0 100644 --- a/include/SFML/Graphics/Rect.hpp +++ b/include/SFML/Graphics/Rect.hpp @@ -151,6 +151,26 @@ 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 //////////////////////////////////////////////////////////// diff --git a/include/SFML/Graphics/Rect.inl b/include/SFML/Graphics/Rect.inl index ef3fc345..1aa073dc 100644 --- a/include/SFML/Graphics/Rect.inl +++ b/include/SFML/Graphics/Rect.inl @@ -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> From ea71dd2fe03547cde5a5b30d8b3d645ffdbedf77 Mon Sep 17 00:00:00 2001 From: acsbendi <acsbendi28@gmail.com> Date: Sun, 10 Feb 2019 19:17:55 +0100 Subject: [PATCH 175/211] Fixed navigation bar not being entirely hidden. --- src/SFML/Main/MainAndroid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Main/MainAndroid.cpp b/src/SFML/Main/MainAndroid.cpp index 7f4d8e2e..0f9731d2 100644 --- a/src/SFML/Main/MainAndroid.cpp +++ b/src/SFML/Main/MainAndroid.cpp @@ -175,7 +175,7 @@ void goToFullscreenMode(ANativeActivity* activity) // 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; } From f2b8e6397b3420f01b463d549ccc145ddf152dea Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Fri, 30 Aug 2019 23:05:03 +0200 Subject: [PATCH 176/211] Remove the glFlush() call that became unnecessary after 3871e01a9fd8c9c889eeb9ad56ff6dc386be15d3 was merged. This also fixes glFlush() being called in a state in which no context would be active in specific use cases. --- src/SFML/Graphics/Texture.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/SFML/Graphics/Texture.cpp b/src/SFML/Graphics/Texture.cpp index 9cf7b19c..0d4c396f 100644 --- a/src/SFML/Graphics/Texture.cpp +++ b/src/SFML/Graphics/Texture.cpp @@ -92,10 +92,6 @@ m_cacheId (getUniqueId()) 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 { From 2eb70c6537d140892d6c05ac7a37688c10fa37cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Sat, 13 Apr 2019 13:16:32 +0200 Subject: [PATCH 177/211] Replaced glLoadGen loader with glad loader and dynamically load EGL and GLES extensions as is done for desktop GL. --- examples/CMakeLists.txt | 2 - examples/X11/CMakeLists.txt | 2 +- examples/X11/X11.cpp | 31 +- examples/X11/gl.h | 7837 ++++++++++++++++++++ examples/opengl/CMakeLists.txt | 2 +- examples/opengl/OpenGL.cpp | 36 +- examples/opengl/gl.h | 7837 ++++++++++++++++++++ examples/window/CMakeLists.txt | 2 +- examples/window/Window.cpp | 28 +- examples/window/gl.h | 7837 ++++++++++++++++++++ extlibs/headers/glad/include/glad/egl.h | 1497 ++++ extlibs/headers/glad/include/glad/gl.h | 7839 +++++++++++++++++++++ extlibs/headers/glad/include/glad/glx.h | 1043 +++ extlibs/headers/glad/include/glad/wgl.h | 586 ++ src/SFML/Graphics/CMakeLists.txt | 27 +- src/SFML/Graphics/GLExtensions.cpp | 9 +- src/SFML/Graphics/GLExtensions.hpp | 88 +- src/SFML/Graphics/GLLoader.cpp | 1019 --- src/SFML/Graphics/GLLoader.hpp | 1706 ----- src/SFML/Graphics/RenderTarget.cpp | 4 +- src/SFML/Graphics/Texture.cpp | 4 +- src/SFML/Main/CMakeLists.txt | 5 + src/SFML/Main/MainAndroid.cpp | 3 + src/SFML/System/Android/Activity.hpp | 1 - src/SFML/System/CMakeLists.txt | 5 + src/SFML/Window/CMakeLists.txt | 45 +- src/SFML/Window/EGLCheck.cpp | 6 +- src/SFML/Window/EGLCheck.hpp | 9 +- src/SFML/Window/EglContext.cpp | 109 +- src/SFML/Window/EglContext.hpp | 19 +- src/SFML/Window/GlContext.cpp | 129 +- src/SFML/Window/Unix/GlxContext.cpp | 59 +- src/SFML/Window/Unix/GlxContext.hpp | 2 +- src/SFML/Window/Unix/GlxExtensions.cpp | 218 - src/SFML/Window/Unix/GlxExtensions.hpp | 251 - src/SFML/Window/Unix/GlxExtensions.txt | 14 - src/SFML/Window/Win32/WglContext.cpp | 73 +- src/SFML/Window/Win32/WglContext.hpp | 2 +- src/SFML/Window/Win32/WglExtensions.cpp | 223 - src/SFML/Window/Win32/WglExtensions.hpp | 236 - src/SFML/Window/Win32/WglExtensions.txt | 13 - src/SFML/Window/Win32/WindowImplWin32.cpp | 1 - src/SFML/Window/iOS/EaglContext.hpp | 12 +- src/SFML/Window/iOS/EaglContext.mm | 97 +- 44 files changed, 35003 insertions(+), 3965 deletions(-) create mode 100644 examples/X11/gl.h create mode 100644 examples/opengl/gl.h create mode 100644 examples/window/gl.h create mode 100644 extlibs/headers/glad/include/glad/egl.h create mode 100644 extlibs/headers/glad/include/glad/gl.h create mode 100644 extlibs/headers/glad/include/glad/glx.h create mode 100644 extlibs/headers/glad/include/glad/wgl.h delete mode 100644 src/SFML/Graphics/GLLoader.cpp delete mode 100644 src/SFML/Graphics/GLLoader.hpp delete mode 100644 src/SFML/Window/Unix/GlxExtensions.cpp delete mode 100644 src/SFML/Window/Unix/GlxExtensions.hpp delete mode 100644 src/SFML/Window/Unix/GlxExtensions.txt delete mode 100644 src/SFML/Window/Win32/WglExtensions.cpp delete mode 100644 src/SFML/Window/Win32/WglExtensions.hpp delete mode 100644 src/SFML/Window/Win32/WglExtensions.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 2c9393f3..3b64fcc7 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,5 +1,3 @@ - - # CLI based examples if (NOT SFML_OS_IOS) if(SFML_BUILD_NETWORK) diff --git a/examples/X11/CMakeLists.txt b/examples/X11/CMakeLists.txt index 27509a62..d4039c0e 100644 --- a/examples/X11/CMakeLists.txt +++ b/examples/X11/CMakeLists.txt @@ -7,4 +7,4 @@ 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) diff --git a/examples/X11/X11.cpp b/examples/X11/X11.cpp index fd919600..9fd06f63 100644 --- a/examples/X11/X11.cpp +++ b/examples/X11/X11.cpp @@ -4,7 +4,10 @@ //////////////////////////////////////////////////////////// #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 +26,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 +42,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 +191,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); diff --git a/examples/X11/gl.h b/examples/X11/gl.h new file mode 100644 index 00000000..54500f6e --- /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/opengl/CMakeLists.txt b/examples/opengl/CMakeLists.txt index 1cdde028..29b46680 100644 --- a/examples/opengl/CMakeLists.txt +++ b/examples/opengl/CMakeLists.txt @@ -16,5 +16,5 @@ endif() sfml_add_example(opengl GUI_APP SOURCES ${SRC} BUNDLE_RESOURCES ${RESOURCES} - DEPENDS sfml-graphics OpenGL + DEPENDS sfml-graphics RESOURCES_DIR resources) diff --git a/examples/opengl/OpenGL.cpp b/examples/opengl/OpenGL.cpp index 37942ff7..e11a8c1b 100644 --- a/examples/opengl/OpenGL.cpp +++ b/examples/opengl/OpenGL.cpp @@ -3,17 +3,14 @@ // 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 -#ifdef SFML_OPENGL_ES -#define glClearDepth glClearDepthf -#define glFrustum glFrustumf -#endif - #ifndef GL_SRGB8_ALPHA8 #define GL_SRGB8_ALPHA8 0x8C43 #endif @@ -83,10 +80,21 @@ 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); @@ -98,7 +106,11 @@ int main() glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLfloat ratio = static_cast<float>(window.getSize().x) / 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); @@ -221,7 +233,7 @@ int main() if (event.type == sf::Event::Resized) { sf::Vector2u textureSize = backgroundTexture.getSize(); - + // Make the window the active window for OpenGL calls window.setActive(true); @@ -229,11 +241,15 @@ int main() glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLfloat ratio = static_cast<float>(event.size.width) / event.size.height; +#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 // Make the window no longer the active window for OpenGL calls window.setActive(false); - + sf::View view; view.setSize(textureSize.x, textureSize.y); view.setCenter(textureSize.x/2.f, textureSize.y/2.f); @@ -254,13 +270,13 @@ int main() // 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(); #endif - + float x = pos.x * 200.f / window.getSize().x - 100.f; float y = -pos.y * 200.f / window.getSize().y + 100.f; diff --git a/examples/opengl/gl.h b/examples/opengl/gl.h new file mode 100644 index 00000000..54500f6e --- /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/window/CMakeLists.txt b/examples/window/CMakeLists.txt index b106c043..f4ee1d13 100644 --- a/examples/window/CMakeLists.txt +++ b/examples/window/CMakeLists.txt @@ -7,4 +7,4 @@ set(SRC ${SRCROOT}/Window.cpp) # define the window target sfml_add_example(window GUI_APP SOURCES ${SRC} - DEPENDS sfml-window OpenGL) + DEPENDS sfml-window) diff --git a/examples/window/Window.cpp b/examples/window/Window.cpp index c6a8c907..db7b0687 100644 --- a/examples/window/Window.cpp +++ b/examples/window/Window.cpp @@ -2,17 +2,14 @@ // 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 -#ifdef SFML_OPENGL_ES -#define glClearDepth glClearDepthf -#define glFrustum glFrustumf -#endif - //////////////////////////////////////////////////////////// /// Entry point of application /// @@ -31,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 @@ -50,7 +58,11 @@ int main() glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLfloat ratio = static_cast<float>(window.getSize().x) / 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[] = @@ -134,7 +146,11 @@ int main() glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLfloat ratio = static_cast<float>(event.size.width) / event.size.height; +#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 } } diff --git a/examples/window/gl.h b/examples/window/gl.h new file mode 100644 index 00000000..54500f6e --- /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 00000000..fe8188ee --- /dev/null +++ b/extlibs/headers/glad/include/glad/egl.h @@ -0,0 +1,1497 @@ +/** + * Loader generated by glad 2.0.0-beta on Wed Jul 17 02:11:09 2019 + * + * Generator: C/C++ + * Specification: egl + * Extensions: 5 + * + * APIs: + * - egl=1.5 + * + * Options: + * - MX_GLOBAL = False + * - ON_DEMAND = False + * - LOADER = True + * - ALIAS = True + * - HEADER_ONLY = True + * - DEBUG = False + * - MX = 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 --loader --alias --header-only + * + * 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=LOADER%2CALIAS%2CHEADER_ONLY + * + */ + +#ifndef SF_GLAD_EGL_H_ +#define SF_GLAD_EGL_H_ + + +#define SF_GLAD_EGL +#define GLAD_OPTION_EGL_LOADER +#define GLAD_OPTION_EGL_ALIAS +#define GLAD_OPTION_EGL_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 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(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_ */ +#ifndef __eglplatform_h_ +#define __eglplatform_h_ + +/* +** Copyright (c) 2007-2016 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. +*/ + +/* Platform-specific types and definitions for egl.h + * $Revision: 30994 $ on $Date: 2015-04-30 13:36:48 -0700 (Thu, 30 Apr 2015) $ + * + * 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 sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) + * by filing a bug against product "EGL" component "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(_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(__unix__) || defined(USE_X11) + +/* X11 (tentative) */ +#include <X11/Xlib.h> +#include <X11/Xutil.h> + +typedef Display *EGLNativeDisplayType; +typedef Pixmap EGLNativePixmapType; +typedef Window 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; + +#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; + +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 ( *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); + + +#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_ */ + + +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_eglCreateSync = (PFNEGLCREATESYNCPROC) load(userptr, "eglCreateSync"); + 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_eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC) load(userptr, "eglClientWaitSync"); + sf_glad_eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC) load(userptr, "eglClientWaitSyncKHR"); + sf_glad_eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC) load(userptr, "eglCreateSyncKHR"); + sf_glad_eglDestroySync = (PFNEGLDESTROYSYNCPROC) load(userptr, "eglDestroySync"); + 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_eglDestroyImage = (PFNEGLDESTROYIMAGEPROC) load(userptr, "eglDestroyImage"); + 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_eglDestroyImage = (PFNEGLDESTROYIMAGEPROC) load(userptr, "eglDestroyImage"); + 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_eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC) load(userptr, "eglClientWaitSync"); + sf_glad_eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC) load(userptr, "eglClientWaitSyncKHR"); + sf_glad_eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC) load(userptr, "eglCreateSyncKHR"); + sf_glad_eglDestroySync = (PFNEGLDESTROYSYNCPROC) load(userptr, "eglDestroySync"); + 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 + if (display == EGL_NO_DISPLAY) { + return 0; + } + + 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); + + 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 */ + +#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 00000000..eca47072 --- /dev/null +++ b/extlibs/headers/glad/include/glad/gl.h @@ -0,0 +1,7839 @@ +/** + * Loader generated by glad 2.0.0-beta on Wed Jul 17 20:53:00 2019 + * + * Generator: C/C++ + * Specification: gl + * Extensions: 44 + * + * 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_depth24,GL_OES_depth32,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_depth24%2CGL_OES_depth32%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 SF_GLAD_GL_H_ +#define SF_GLAD_GL_H_ + +#ifdef __gl_h_ + #error OpenGL header already included (API: gl), remove previous include! +#endif +#define __gl_h_ 1 + + +#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_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_COMPONENT24_OES 0x81A6 +#define GL_DEPTH_COMPONENT32_OES 0x81A7 +#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 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_ES_CM_1_0 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_ES_CM_1_0; +#define GL_ARB_copy_buffer 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_copy_buffer; +#define GL_ARB_fragment_shader 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_fragment_shader; +#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_imaging 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_imaging; +#define GL_ARB_multitexture 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_multitexture; +#define GL_ARB_separate_shader_objects 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_separate_shader_objects; +#define GL_ARB_shader_objects 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_shader_objects; +#define GL_ARB_shading_language_100 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_shading_language_100; +#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_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_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_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_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_single_precision 1 +GLAD_API_CALL int SF_GLAD_GL_OES_single_precision; +#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 *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 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 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 PFNGLBINDFRAMEBUFFERPROC sf_glad_glBindFramebuffer; +#define glBindFramebuffer sf_glad_glBindFramebuffer +GLAD_API_CALL PFNGLBINDFRAMEBUFFEREXTPROC sf_glad_glBindFramebufferEXT; +#define glBindFramebufferEXT sf_glad_glBindFramebufferEXT +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 PFNGLBINDTEXTUREPROC sf_glad_glBindTexture; +#define glBindTexture sf_glad_glBindTexture +GLAD_API_CALL PFNGLBINDTEXTUREEXTPROC sf_glad_glBindTextureEXT; +#define glBindTextureEXT sf_glad_glBindTextureEXT +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 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 PFNGLBLITFRAMEBUFFERPROC sf_glad_glBlitFramebuffer; +#define glBlitFramebuffer sf_glad_glBlitFramebuffer +GLAD_API_CALL PFNGLBLITFRAMEBUFFEREXTPROC sf_glad_glBlitFramebufferEXT; +#define glBlitFramebufferEXT sf_glad_glBlitFramebufferEXT +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 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 PFNGLCLEARPROC sf_glad_glClear; +#define glClear sf_glad_glClear +GLAD_API_CALL PFNGLCLEARACCUMPROC sf_glad_glClearAccum; +#define glClearAccum sf_glad_glClearAccum +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 PFNGLCLEARINDEXPROC sf_glad_glClearIndex; +#define glClearIndex sf_glad_glClearIndex +GLAD_API_CALL PFNGLCLEARSTENCILPROC sf_glad_glClearStencil; +#define glClearStencil sf_glad_glClearStencil +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 PFNGLCLIPPLANEPROC sf_glad_glClipPlane; +#define glClipPlane sf_glad_glClipPlane +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 PFNGLCOLORMATERIALPROC sf_glad_glColorMaterial; +#define glColorMaterial sf_glad_glColorMaterial +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 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 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 PFNGLCREATEPROGRAMPROC sf_glad_glCreateProgram; +#define glCreateProgram sf_glad_glCreateProgram +GLAD_API_CALL PFNGLCREATEPROGRAMOBJECTARBPROC sf_glad_glCreateProgramObjectARB; +#define glCreateProgramObjectARB sf_glad_glCreateProgramObjectARB +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 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 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 PFNGLDELETERENDERBUFFERSPROC sf_glad_glDeleteRenderbuffers; +#define glDeleteRenderbuffers sf_glad_glDeleteRenderbuffers +GLAD_API_CALL PFNGLDELETERENDERBUFFERSEXTPROC sf_glad_glDeleteRenderbuffersEXT; +#define glDeleteRenderbuffersEXT sf_glad_glDeleteRenderbuffersEXT +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 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 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 PFNGLDISABLEVERTEXATTRIBARRAYPROC sf_glad_glDisableVertexAttribArray; +#define glDisableVertexAttribArray sf_glad_glDisableVertexAttribArray +GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYARBPROC sf_glad_glDisableVertexAttribArrayARB; +#define glDisableVertexAttribArrayARB sf_glad_glDisableVertexAttribArrayARB +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 PFNGLDRAWBUFFERPROC sf_glad_glDrawBuffer; +#define glDrawBuffer sf_glad_glDrawBuffer +GLAD_API_CALL PFNGLDRAWELEMENTSPROC sf_glad_glDrawElements; +#define glDrawElements sf_glad_glDrawElements +GLAD_API_CALL PFNGLDRAWPIXELSPROC sf_glad_glDrawPixels; +#define glDrawPixels sf_glad_glDrawPixels +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 PFNGLENABLEVERTEXATTRIBARRAYPROC sf_glad_glEnableVertexAttribArray; +#define glEnableVertexAttribArray sf_glad_glEnableVertexAttribArray +GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYARBPROC sf_glad_glEnableVertexAttribArrayARB; +#define glEnableVertexAttribArrayARB sf_glad_glEnableVertexAttribArrayARB +GLAD_API_CALL PFNGLENDPROC sf_glad_glEnd; +#define glEnd sf_glad_glEnd +GLAD_API_CALL PFNGLENDLISTPROC sf_glad_glEndList; +#define glEndList sf_glad_glEndList +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 PFNGLFINISHPROC sf_glad_glFinish; +#define glFinish sf_glad_glFinish +GLAD_API_CALL PFNGLFLUSHPROC sf_glad_glFlush; +#define glFlush sf_glad_glFlush +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 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 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 PFNGLGENRENDERBUFFERSPROC sf_glad_glGenRenderbuffers; +#define glGenRenderbuffers sf_glad_glGenRenderbuffers +GLAD_API_CALL PFNGLGENRENDERBUFFERSEXTPROC sf_glad_glGenRenderbuffersEXT; +#define glGenRenderbuffersEXT sf_glad_glGenRenderbuffersEXT +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 PFNGLGENERATEMIPMAPPROC sf_glad_glGenerateMipmap; +#define glGenerateMipmap sf_glad_glGenerateMipmap +GLAD_API_CALL PFNGLGENERATEMIPMAPEXTPROC sf_glad_glGenerateMipmapEXT; +#define glGenerateMipmapEXT sf_glad_glGenerateMipmapEXT +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 PFNGLGETACTIVEUNIFORMPROC sf_glad_glGetActiveUniform; +#define glGetActiveUniform sf_glad_glGetActiveUniform +GLAD_API_CALL PFNGLGETACTIVEUNIFORMARBPROC sf_glad_glGetActiveUniformARB; +#define glGetActiveUniformARB sf_glad_glGetActiveUniformARB +GLAD_API_CALL PFNGLGETATTACHEDOBJECTSARBPROC sf_glad_glGetAttachedObjectsARB; +#define glGetAttachedObjectsARB sf_glad_glGetAttachedObjectsARB +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 PFNGLGETBOOLEANVPROC sf_glad_glGetBooleanv; +#define glGetBooleanv sf_glad_glGetBooleanv +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 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 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 PFNGLGETDOUBLEVPROC sf_glad_glGetDoublev; +#define glGetDoublev sf_glad_glGetDoublev +GLAD_API_CALL PFNGLGETERRORPROC sf_glad_glGetError; +#define glGetError sf_glad_glGetError +GLAD_API_CALL PFNGLGETFLOATVPROC sf_glad_glGetFloatv; +#define glGetFloatv sf_glad_glGetFloatv +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 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 PFNGLGETINTEGERVPROC sf_glad_glGetIntegerv; +#define glGetIntegerv sf_glad_glGetIntegerv +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 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 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 PFNGLGETPROGRAMSTRINGARBPROC sf_glad_glGetProgramStringARB; +#define glGetProgramStringARB sf_glad_glGetProgramStringARB +GLAD_API_CALL PFNGLGETPROGRAMSTRINGNVPROC sf_glad_glGetProgramStringNV; +#define glGetProgramStringNV sf_glad_glGetProgramStringNV +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 PFNGLGETRENDERBUFFERPARAMETERIVPROC sf_glad_glGetRenderbufferParameteriv; +#define glGetRenderbufferParameteriv sf_glad_glGetRenderbufferParameteriv +GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC sf_glad_glGetRenderbufferParameterivEXT; +#define glGetRenderbufferParameterivEXT sf_glad_glGetRenderbufferParameterivEXT +GLAD_API_CALL PFNGLGETSEPARABLEFILTERPROC sf_glad_glGetSeparableFilter; +#define glGetSeparableFilter sf_glad_glGetSeparableFilter +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 PFNGLGETSTRINGPROC sf_glad_glGetString; +#define glGetString sf_glad_glGetString +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 PFNGLGETTEXPARAMETERFVPROC sf_glad_glGetTexParameterfv; +#define glGetTexParameterfv sf_glad_glGetTexParameterfv +GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC sf_glad_glGetTexParameteriv; +#define glGetTexParameteriv sf_glad_glGetTexParameteriv +GLAD_API_CALL PFNGLGETTRACKMATRIXIVNVPROC sf_glad_glGetTrackMatrixivNV; +#define glGetTrackMatrixivNV sf_glad_glGetTrackMatrixivNV +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 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 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 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 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 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 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 PFNGLISRENDERBUFFERPROC sf_glad_glIsRenderbuffer; +#define glIsRenderbuffer sf_glad_glIsRenderbuffer +GLAD_API_CALL PFNGLISRENDERBUFFEREXTPROC sf_glad_glIsRenderbufferEXT; +#define glIsRenderbufferEXT sf_glad_glIsRenderbufferEXT +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 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 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 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 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 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 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 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 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 PFNGLPASSTHROUGHPROC sf_glad_glPassThrough; +#define glPassThrough sf_glad_glPassThrough +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 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 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 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 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 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 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 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 PFNGLROTATEDPROC sf_glad_glRotated; +#define glRotated sf_glad_glRotated +GLAD_API_CALL PFNGLROTATEFPROC sf_glad_glRotatef; +#define glRotatef sf_glad_glRotatef +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 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 PFNGLSHADERSOURCEPROC sf_glad_glShaderSource; +#define glShaderSource sf_glad_glShaderSource +GLAD_API_CALL PFNGLSHADERSOURCEARBPROC sf_glad_glShaderSourceARB; +#define glShaderSourceARB sf_glad_glShaderSourceARB +GLAD_API_CALL PFNGLSTENCILFUNCPROC sf_glad_glStencilFunc; +#define glStencilFunc sf_glad_glStencilFunc +GLAD_API_CALL PFNGLSTENCILMASKPROC sf_glad_glStencilMask; +#define glStencilMask sf_glad_glStencilMask +GLAD_API_CALL PFNGLSTENCILOPPROC sf_glad_glStencilOp; +#define glStencilOp sf_glad_glStencilOp +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 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 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 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 PFNGLTRACKMATRIXNVPROC sf_glad_glTrackMatrixNV; +#define glTrackMatrixNV sf_glad_glTrackMatrixNV +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 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 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 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 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 PFNGLUNIFORMMATRIX2FVPROC sf_glad_glUniformMatrix2fv; +#define glUniformMatrix2fv sf_glad_glUniformMatrix2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX2FVARBPROC sf_glad_glUniformMatrix2fvARB; +#define glUniformMatrix2fvARB sf_glad_glUniformMatrix2fvARB +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 PFNGLUNIFORMMATRIX4FVPROC sf_glad_glUniformMatrix4fv; +#define glUniformMatrix4fv sf_glad_glUniformMatrix4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4FVARBPROC sf_glad_glUniformMatrix4fvARB; +#define glUniformMatrix4fvARB sf_glad_glUniformMatrix4fvARB +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 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 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 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 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 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 PFNGLCLEARDEPTHFPROC sf_glad_glClearDepthf; +#define glClearDepthf sf_glad_glClearDepthf +GLAD_API_CALL PFNGLCLEARDEPTHFOESPROC sf_glad_glClearDepthfOES; +#define glClearDepthfOES sf_glad_glClearDepthfOES +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 PFNGLCLIPPLANEFOESPROC sf_glad_glClipPlanefOES; +#define glClipPlanefOES sf_glad_glClipPlanefOES +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 PFNGLCOMPRESSEDTEXIMAGE2DPROC sf_glad_glCompressedTexImage2D; +#define glCompressedTexImage2D sf_glad_glCompressedTexImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC sf_glad_glCompressedTexSubImage2D; +#define glCompressedTexSubImage2D sf_glad_glCompressedTexSubImage2D +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 PFNGLDEPTHRANGEFPROC sf_glad_glDepthRangef; +#define glDepthRangef sf_glad_glDepthRangef +GLAD_API_CALL PFNGLDEPTHRANGEFOESPROC sf_glad_glDepthRangefOES; +#define glDepthRangefOES sf_glad_glDepthRangefOES +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 PFNGLFRUSTUMFOESPROC sf_glad_glFrustumfOES; +#define glFrustumfOES sf_glad_glFrustumfOES +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 PFNGLGETCLIPPLANEFOESPROC sf_glad_glGetClipPlanefOES; +#define glGetClipPlanefOES sf_glad_glGetClipPlanefOES +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 PFNGLORTHOFOESPROC sf_glad_glOrthofOES; +#define glOrthofOES sf_glad_glOrthofOES +GLAD_API_CALL PFNGLORTHOXPROC sf_glad_glOrthox; +#define glOrthox sf_glad_glOrthox +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 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 PFNGLSAMPLECOVERAGEPROC sf_glad_glSampleCoverage; +#define glSampleCoverage sf_glad_glSampleCoverage +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_ */ + + +int SF_GLAD_GL_VERSION_1_0 = 0; +int SF_GLAD_GL_VERSION_1_1 = 0; +int SF_GLAD_GL_VERSION_ES_CM_1_0 = 0; +int SF_GLAD_GL_ARB_copy_buffer = 0; +int SF_GLAD_GL_ARB_fragment_shader = 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_imaging = 0; +int SF_GLAD_GL_ARB_multitexture = 0; +int SF_GLAD_GL_ARB_separate_shader_objects = 0; +int SF_GLAD_GL_ARB_shader_objects = 0; +int SF_GLAD_GL_ARB_shading_language_100 = 0; +int SF_GLAD_GL_ARB_texture_non_power_of_two = 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_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_NV_geometry_program4 = 0; +int SF_GLAD_GL_NV_vertex_program = 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_single_precision = 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; +PFNGLBINDATTRIBLOCATIONPROC sf_glad_glBindAttribLocation = NULL; +PFNGLBINDATTRIBLOCATIONARBPROC sf_glad_glBindAttribLocationARB = NULL; +PFNGLBINDBUFFERPROC sf_glad_glBindBuffer = NULL; +PFNGLBINDBUFFERARBPROC sf_glad_glBindBufferARB = NULL; +PFNGLBINDFRAMEBUFFERPROC sf_glad_glBindFramebuffer = NULL; +PFNGLBINDFRAMEBUFFEREXTPROC sf_glad_glBindFramebufferEXT = 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; +PFNGLBINDTEXTUREPROC sf_glad_glBindTexture = NULL; +PFNGLBINDTEXTUREEXTPROC sf_glad_glBindTextureEXT = 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; +PFNGLBLENDFUNCPROC sf_glad_glBlendFunc = NULL; +PFNGLBLENDFUNCSEPARATEPROC sf_glad_glBlendFuncSeparate = NULL; +PFNGLBLENDFUNCSEPARATEEXTPROC sf_glad_glBlendFuncSeparateEXT = NULL; +PFNGLBLENDFUNCSEPARATEINGRPROC sf_glad_glBlendFuncSeparateINGR = NULL; +PFNGLBLITFRAMEBUFFERPROC sf_glad_glBlitFramebuffer = NULL; +PFNGLBLITFRAMEBUFFEREXTPROC sf_glad_glBlitFramebufferEXT = NULL; +PFNGLBUFFERDATAPROC sf_glad_glBufferData = NULL; +PFNGLBUFFERDATAARBPROC sf_glad_glBufferDataARB = 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; +PFNGLCLEARPROC sf_glad_glClear = NULL; +PFNGLCLEARACCUMPROC sf_glad_glClearAccum = NULL; +PFNGLCLEARCOLORPROC sf_glad_glClearColor = NULL; +PFNGLCLEARDEPTHPROC sf_glad_glClearDepth = NULL; +PFNGLCLEARINDEXPROC sf_glad_glClearIndex = NULL; +PFNGLCLEARSTENCILPROC sf_glad_glClearStencil = NULL; +PFNGLCLIENTACTIVETEXTUREPROC sf_glad_glClientActiveTexture = NULL; +PFNGLCLIENTACTIVETEXTUREARBPROC sf_glad_glClientActiveTextureARB = NULL; +PFNGLCLIPPLANEPROC sf_glad_glClipPlane = 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; +PFNGLCOLORMATERIALPROC sf_glad_glColorMaterial = 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; +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; +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; +PFNGLCREATEPROGRAMPROC sf_glad_glCreateProgram = NULL; +PFNGLCREATEPROGRAMOBJECTARBPROC sf_glad_glCreateProgramObjectARB = NULL; +PFNGLCREATESHADERPROC sf_glad_glCreateShader = NULL; +PFNGLCREATESHADEROBJECTARBPROC sf_glad_glCreateShaderObjectARB = NULL; +PFNGLCREATESHADERPROGRAMVPROC sf_glad_glCreateShaderProgramv = 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; +PFNGLDELETEPROGRAMPIPELINESPROC sf_glad_glDeleteProgramPipelines = NULL; +PFNGLDELETEPROGRAMSARBPROC sf_glad_glDeleteProgramsARB = NULL; +PFNGLDELETEPROGRAMSNVPROC sf_glad_glDeleteProgramsNV = NULL; +PFNGLDELETERENDERBUFFERSPROC sf_glad_glDeleteRenderbuffers = NULL; +PFNGLDELETERENDERBUFFERSEXTPROC sf_glad_glDeleteRenderbuffersEXT = NULL; +PFNGLDELETETEXTURESPROC sf_glad_glDeleteTextures = NULL; +PFNGLDELETETEXTURESEXTPROC sf_glad_glDeleteTexturesEXT = NULL; +PFNGLDEPTHFUNCPROC sf_glad_glDepthFunc = NULL; +PFNGLDEPTHMASKPROC sf_glad_glDepthMask = NULL; +PFNGLDEPTHRANGEPROC sf_glad_glDepthRange = NULL; +PFNGLDETACHOBJECTARBPROC sf_glad_glDetachObjectARB = NULL; +PFNGLDETACHSHADERPROC sf_glad_glDetachShader = NULL; +PFNGLDISABLEPROC sf_glad_glDisable = NULL; +PFNGLDISABLECLIENTSTATEPROC sf_glad_glDisableClientState = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYPROC sf_glad_glDisableVertexAttribArray = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYARBPROC sf_glad_glDisableVertexAttribArrayARB = NULL; +PFNGLDRAWARRAYSPROC sf_glad_glDrawArrays = NULL; +PFNGLDRAWARRAYSEXTPROC sf_glad_glDrawArraysEXT = NULL; +PFNGLDRAWBUFFERPROC sf_glad_glDrawBuffer = NULL; +PFNGLDRAWELEMENTSPROC sf_glad_glDrawElements = NULL; +PFNGLDRAWPIXELSPROC sf_glad_glDrawPixels = 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; +PFNGLENABLEVERTEXATTRIBARRAYPROC sf_glad_glEnableVertexAttribArray = NULL; +PFNGLENABLEVERTEXATTRIBARRAYARBPROC sf_glad_glEnableVertexAttribArrayARB = NULL; +PFNGLENDPROC sf_glad_glEnd = NULL; +PFNGLENDLISTPROC sf_glad_glEndList = 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; +PFNGLFINISHPROC sf_glad_glFinish = NULL; +PFNGLFLUSHPROC sf_glad_glFlush = NULL; +PFNGLFOGFPROC sf_glad_glFogf = NULL; +PFNGLFOGFVPROC sf_glad_glFogfv = NULL; +PFNGLFOGIPROC sf_glad_glFogi = NULL; +PFNGLFOGIVPROC sf_glad_glFogiv = 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; +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; +PFNGLGENRENDERBUFFERSPROC sf_glad_glGenRenderbuffers = NULL; +PFNGLGENRENDERBUFFERSEXTPROC sf_glad_glGenRenderbuffersEXT = NULL; +PFNGLGENTEXTURESPROC sf_glad_glGenTextures = NULL; +PFNGLGENTEXTURESEXTPROC sf_glad_glGenTexturesEXT = NULL; +PFNGLGENERATEMIPMAPPROC sf_glad_glGenerateMipmap = NULL; +PFNGLGENERATEMIPMAPEXTPROC sf_glad_glGenerateMipmapEXT = NULL; +PFNGLGETACTIVEATTRIBPROC sf_glad_glGetActiveAttrib = NULL; +PFNGLGETACTIVEATTRIBARBPROC sf_glad_glGetActiveAttribARB = NULL; +PFNGLGETACTIVEUNIFORMPROC sf_glad_glGetActiveUniform = NULL; +PFNGLGETACTIVEUNIFORMARBPROC sf_glad_glGetActiveUniformARB = NULL; +PFNGLGETATTACHEDOBJECTSARBPROC sf_glad_glGetAttachedObjectsARB = NULL; +PFNGLGETATTRIBLOCATIONPROC sf_glad_glGetAttribLocation = NULL; +PFNGLGETATTRIBLOCATIONARBPROC sf_glad_glGetAttribLocationARB = NULL; +PFNGLGETBOOLEANVPROC sf_glad_glGetBooleanv = 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; +PFNGLGETCOLORTABLEPROC sf_glad_glGetColorTable = NULL; +PFNGLGETCOLORTABLEPARAMETERFVPROC sf_glad_glGetColorTableParameterfv = NULL; +PFNGLGETCOLORTABLEPARAMETERIVPROC sf_glad_glGetColorTableParameteriv = NULL; +PFNGLGETCONVOLUTIONFILTERPROC sf_glad_glGetConvolutionFilter = NULL; +PFNGLGETCONVOLUTIONPARAMETERFVPROC sf_glad_glGetConvolutionParameterfv = NULL; +PFNGLGETCONVOLUTIONPARAMETERIVPROC sf_glad_glGetConvolutionParameteriv = NULL; +PFNGLGETDEBUGMESSAGELOGPROC sf_glad_glGetDebugMessageLog = NULL; +PFNGLGETDOUBLEVPROC sf_glad_glGetDoublev = NULL; +PFNGLGETERRORPROC sf_glad_glGetError = NULL; +PFNGLGETFLOATVPROC sf_glad_glGetFloatv = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC sf_glad_glGetFramebufferAttachmentParameteriv = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC sf_glad_glGetFramebufferAttachmentParameterivEXT = 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; +PFNGLGETINTEGERVPROC sf_glad_glGetIntegerv = 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; +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; +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; +PFNGLGETPROGRAMSTRINGARBPROC sf_glad_glGetProgramStringARB = NULL; +PFNGLGETPROGRAMSTRINGNVPROC sf_glad_glGetProgramStringNV = NULL; +PFNGLGETPROGRAMIVARBPROC sf_glad_glGetProgramivARB = NULL; +PFNGLGETPROGRAMIVNVPROC sf_glad_glGetProgramivNV = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVPROC sf_glad_glGetRenderbufferParameteriv = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC sf_glad_glGetRenderbufferParameterivEXT = NULL; +PFNGLGETSEPARABLEFILTERPROC sf_glad_glGetSeparableFilter = NULL; +PFNGLGETSHADERSOURCEPROC sf_glad_glGetShaderSource = NULL; +PFNGLGETSHADERSOURCEARBPROC sf_glad_glGetShaderSourceARB = NULL; +PFNGLGETSTRINGPROC sf_glad_glGetString = 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; +PFNGLGETTEXPARAMETERFVPROC sf_glad_glGetTexParameterfv = NULL; +PFNGLGETTEXPARAMETERIVPROC sf_glad_glGetTexParameteriv = NULL; +PFNGLGETTRACKMATRIXIVNVPROC sf_glad_glGetTrackMatrixivNV = NULL; +PFNGLGETUNIFORMLOCATIONPROC sf_glad_glGetUniformLocation = NULL; +PFNGLGETUNIFORMLOCATIONARBPROC sf_glad_glGetUniformLocationARB = NULL; +PFNGLGETUNIFORMFVPROC sf_glad_glGetUniformfv = NULL; +PFNGLGETUNIFORMFVARBPROC sf_glad_glGetUniformfvARB = NULL; +PFNGLGETUNIFORMIVPROC sf_glad_glGetUniformiv = NULL; +PFNGLGETUNIFORMIVARBPROC sf_glad_glGetUniformivARB = 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; +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; +PFNGLISBUFFERPROC sf_glad_glIsBuffer = NULL; +PFNGLISBUFFERARBPROC sf_glad_glIsBufferARB = NULL; +PFNGLISENABLEDPROC sf_glad_glIsEnabled = NULL; +PFNGLISFRAMEBUFFERPROC sf_glad_glIsFramebuffer = NULL; +PFNGLISFRAMEBUFFEREXTPROC sf_glad_glIsFramebufferEXT = NULL; +PFNGLISLISTPROC sf_glad_glIsList = NULL; +PFNGLISPROGRAMARBPROC sf_glad_glIsProgramARB = NULL; +PFNGLISPROGRAMNVPROC sf_glad_glIsProgramNV = NULL; +PFNGLISPROGRAMPIPELINEPROC sf_glad_glIsProgramPipeline = NULL; +PFNGLISRENDERBUFFERPROC sf_glad_glIsRenderbuffer = NULL; +PFNGLISRENDERBUFFEREXTPROC sf_glad_glIsRenderbufferEXT = NULL; +PFNGLISTEXTUREPROC sf_glad_glIsTexture = NULL; +PFNGLISTEXTUREEXTPROC sf_glad_glIsTextureEXT = 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; +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; +PFNGLMAPGRID1DPROC sf_glad_glMapGrid1d = NULL; +PFNGLMAPGRID1FPROC sf_glad_glMapGrid1f = NULL; +PFNGLMAPGRID2DPROC sf_glad_glMapGrid2d = NULL; +PFNGLMAPGRID2FPROC sf_glad_glMapGrid2f = 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; +PFNGLMINMAXPROC sf_glad_glMinmax = NULL; +PFNGLMULTMATRIXDPROC sf_glad_glMultMatrixd = NULL; +PFNGLMULTMATRIXFPROC sf_glad_glMultMatrixf = 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; +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; +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; +PFNGLPASSTHROUGHPROC sf_glad_glPassThrough = 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; +PFNGLPOINTSIZEPROC sf_glad_glPointSize = NULL; +PFNGLPOLYGONMODEPROC sf_glad_glPolygonMode = NULL; +PFNGLPOLYGONOFFSETPROC sf_glad_glPolygonOffset = 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; +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; +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; +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; +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; +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; +PFNGLROTATEDPROC sf_glad_glRotated = NULL; +PFNGLROTATEFPROC sf_glad_glRotatef = NULL; +PFNGLSCALEDPROC sf_glad_glScaled = NULL; +PFNGLSCALEFPROC sf_glad_glScalef = NULL; +PFNGLSCISSORPROC sf_glad_glScissor = NULL; +PFNGLSELECTBUFFERPROC sf_glad_glSelectBuffer = NULL; +PFNGLSEPARABLEFILTER2DPROC sf_glad_glSeparableFilter2D = NULL; +PFNGLSHADEMODELPROC sf_glad_glShadeModel = NULL; +PFNGLSHADERSOURCEPROC sf_glad_glShaderSource = NULL; +PFNGLSHADERSOURCEARBPROC sf_glad_glShaderSourceARB = NULL; +PFNGLSTENCILFUNCPROC sf_glad_glStencilFunc = NULL; +PFNGLSTENCILMASKPROC sf_glad_glStencilMask = NULL; +PFNGLSTENCILOPPROC sf_glad_glStencilOp = 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; +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; +PFNGLTEXPARAMETERFPROC sf_glad_glTexParameterf = NULL; +PFNGLTEXPARAMETERFVPROC sf_glad_glTexParameterfv = NULL; +PFNGLTEXPARAMETERIPROC sf_glad_glTexParameteri = NULL; +PFNGLTEXPARAMETERIVPROC sf_glad_glTexParameteriv = NULL; +PFNGLTEXSUBIMAGE1DPROC sf_glad_glTexSubImage1D = NULL; +PFNGLTEXSUBIMAGE1DEXTPROC sf_glad_glTexSubImage1DEXT = NULL; +PFNGLTEXSUBIMAGE2DPROC sf_glad_glTexSubImage2D = NULL; +PFNGLTEXSUBIMAGE2DEXTPROC sf_glad_glTexSubImage2DEXT = NULL; +PFNGLTRACKMATRIXNVPROC sf_glad_glTrackMatrixNV = NULL; +PFNGLTRANSLATEDPROC sf_glad_glTranslated = NULL; +PFNGLTRANSLATEFPROC sf_glad_glTranslatef = 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; +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; +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; +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; +PFNGLUNIFORMMATRIX2FVPROC sf_glad_glUniformMatrix2fv = NULL; +PFNGLUNIFORMMATRIX2FVARBPROC sf_glad_glUniformMatrix2fvARB = NULL; +PFNGLUNIFORMMATRIX3FVPROC sf_glad_glUniformMatrix3fv = NULL; +PFNGLUNIFORMMATRIX3FVARBPROC sf_glad_glUniformMatrix3fvARB = NULL; +PFNGLUNIFORMMATRIX4FVPROC sf_glad_glUniformMatrix4fv = NULL; +PFNGLUNIFORMMATRIX4FVARBPROC sf_glad_glUniformMatrix4fvARB = NULL; +PFNGLUNMAPBUFFERPROC sf_glad_glUnmapBuffer = NULL; +PFNGLUNMAPBUFFERARBPROC sf_glad_glUnmapBufferARB = 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; +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; +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; +PFNGLVERTEXPOINTERPROC sf_glad_glVertexPointer = NULL; +PFNGLVERTEXPOINTEREXTPROC sf_glad_glVertexPointerEXT = NULL; +PFNGLVIEWPORTPROC sf_glad_glViewport = 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; +PFNGLCLEARDEPTHFPROC sf_glad_glClearDepthf = NULL; +PFNGLCLEARDEPTHFOESPROC sf_glad_glClearDepthfOES = NULL; +PFNGLCLEARDEPTHXPROC sf_glad_glClearDepthx = NULL; +PFNGLCLIPPLANEFPROC sf_glad_glClipPlanef = NULL; +PFNGLCLIPPLANEFOESPROC sf_glad_glClipPlanefOES = NULL; +PFNGLCLIPPLANEXPROC sf_glad_glClipPlanex = NULL; +PFNGLCOLOR4XPROC sf_glad_glColor4x = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DPROC sf_glad_glCompressedTexImage2D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC sf_glad_glCompressedTexSubImage2D = NULL; +PFNGLDELETEFRAMEBUFFERSOESPROC sf_glad_glDeleteFramebuffersOES = NULL; +PFNGLDELETERENDERBUFFERSOESPROC sf_glad_glDeleteRenderbuffersOES = NULL; +PFNGLDEPTHRANGEFPROC sf_glad_glDepthRangef = NULL; +PFNGLDEPTHRANGEFOESPROC sf_glad_glDepthRangefOES = 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; +PFNGLFRUSTUMFOESPROC sf_glad_glFrustumfOES = 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; +PFNGLGETCLIPPLANEFOESPROC sf_glad_glGetClipPlanefOES = 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; +PFNGLORTHOFOESPROC sf_glad_glOrthofOES = NULL; +PFNGLORTHOXPROC sf_glad_glOrthox = NULL; +PFNGLPOINTPARAMETERFPROC sf_glad_glPointParameterf = NULL; +PFNGLPOINTPARAMETERFVPROC sf_glad_glPointParameterfv = 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; +PFNGLSAMPLECOVERAGEPROC sf_glad_glSampleCoverage = 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_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_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_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_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture"); + sf_glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC) load(userptr, "glFramebufferTextureARB"); + sf_glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB"); + sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); + sf_glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) load(userptr, "glFramebufferTextureLayerARB"); + sf_glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); + 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_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_multitexture( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_multitexture) return; + sf_glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); + sf_glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) load(userptr, "glActiveTextureARB"); + sf_glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture"); + sf_glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) load(userptr, "glClientActiveTextureARB"); + sf_glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC) load(userptr, "glMultiTexCoord1d"); + sf_glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC) load(userptr, "glMultiTexCoord1dARB"); + sf_glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC) load(userptr, "glMultiTexCoord1dv"); + sf_glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC) load(userptr, "glMultiTexCoord1dvARB"); + sf_glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC) load(userptr, "glMultiTexCoord1f"); + sf_glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC) load(userptr, "glMultiTexCoord1fARB"); + sf_glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC) load(userptr, "glMultiTexCoord1fv"); + sf_glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC) load(userptr, "glMultiTexCoord1fvARB"); + sf_glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC) load(userptr, "glMultiTexCoord1i"); + sf_glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC) load(userptr, "glMultiTexCoord1iARB"); + sf_glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC) load(userptr, "glMultiTexCoord1iv"); + sf_glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC) load(userptr, "glMultiTexCoord1ivARB"); + sf_glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC) load(userptr, "glMultiTexCoord1s"); + sf_glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC) load(userptr, "glMultiTexCoord1sARB"); + sf_glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC) load(userptr, "glMultiTexCoord1sv"); + sf_glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC) load(userptr, "glMultiTexCoord1svARB"); + sf_glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC) load(userptr, "glMultiTexCoord2d"); + sf_glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC) load(userptr, "glMultiTexCoord2dARB"); + sf_glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC) load(userptr, "glMultiTexCoord2dv"); + sf_glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC) load(userptr, "glMultiTexCoord2dvARB"); + sf_glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) load(userptr, "glMultiTexCoord2f"); + sf_glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) load(userptr, "glMultiTexCoord2fARB"); + sf_glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) load(userptr, "glMultiTexCoord2fv"); + sf_glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC) load(userptr, "glMultiTexCoord2fvARB"); + sf_glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC) load(userptr, "glMultiTexCoord2i"); + sf_glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC) load(userptr, "glMultiTexCoord2iARB"); + sf_glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC) load(userptr, "glMultiTexCoord2iv"); + sf_glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC) load(userptr, "glMultiTexCoord2ivARB"); + sf_glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC) load(userptr, "glMultiTexCoord2s"); + sf_glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC) load(userptr, "glMultiTexCoord2sARB"); + sf_glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC) load(userptr, "glMultiTexCoord2sv"); + sf_glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC) load(userptr, "glMultiTexCoord2svARB"); + sf_glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC) load(userptr, "glMultiTexCoord3d"); + sf_glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC) load(userptr, "glMultiTexCoord3dARB"); + sf_glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC) load(userptr, "glMultiTexCoord3dv"); + sf_glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC) load(userptr, "glMultiTexCoord3dvARB"); + sf_glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC) load(userptr, "glMultiTexCoord3f"); + sf_glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC) load(userptr, "glMultiTexCoord3fARB"); + sf_glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC) load(userptr, "glMultiTexCoord3fv"); + sf_glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC) load(userptr, "glMultiTexCoord3fvARB"); + sf_glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC) load(userptr, "glMultiTexCoord3i"); + sf_glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC) load(userptr, "glMultiTexCoord3iARB"); + sf_glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC) load(userptr, "glMultiTexCoord3iv"); + sf_glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC) load(userptr, "glMultiTexCoord3ivARB"); + sf_glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC) load(userptr, "glMultiTexCoord3s"); + sf_glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC) load(userptr, "glMultiTexCoord3sARB"); + sf_glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC) load(userptr, "glMultiTexCoord3sv"); + sf_glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC) load(userptr, "glMultiTexCoord3svARB"); + sf_glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC) load(userptr, "glMultiTexCoord4d"); + sf_glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC) load(userptr, "glMultiTexCoord4dARB"); + sf_glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC) load(userptr, "glMultiTexCoord4dv"); + sf_glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC) load(userptr, "glMultiTexCoord4dvARB"); + sf_glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f"); + sf_glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC) load(userptr, "glMultiTexCoord4fARB"); + sf_glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC) load(userptr, "glMultiTexCoord4fv"); + sf_glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC) load(userptr, "glMultiTexCoord4fvARB"); + sf_glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC) load(userptr, "glMultiTexCoord4i"); + sf_glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC) load(userptr, "glMultiTexCoord4iARB"); + sf_glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC) load(userptr, "glMultiTexCoord4iv"); + sf_glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC) load(userptr, "glMultiTexCoord4ivARB"); + sf_glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC) load(userptr, "glMultiTexCoord4s"); + sf_glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC) load(userptr, "glMultiTexCoord4sARB"); + sf_glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC) load(userptr, "glMultiTexCoord4sv"); + sf_glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC) load(userptr, "glMultiTexCoord4svARB"); +} +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_objects( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_shader_objects) return; + sf_glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) load(userptr, "glAttachObjectARB"); + sf_glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader"); + sf_glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader"); + sf_glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) load(userptr, "glCompileShaderARB"); + sf_glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram"); + sf_glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) load(userptr, "glCreateProgramObjectARB"); + sf_glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader"); + sf_glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) load(userptr, "glCreateShaderObjectARB"); + sf_glad_glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) load(userptr, "glDeleteObjectARB"); + sf_glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) load(userptr, "glDetachObjectARB"); + sf_glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader"); + sf_glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform"); + 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_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource"); + sf_glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) load(userptr, "glGetShaderSourceARB"); + sf_glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation"); + sf_glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) load(userptr, "glGetUniformLocationARB"); + sf_glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv"); + sf_glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) load(userptr, "glGetUniformfvARB"); + sf_glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv"); + sf_glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) load(userptr, "glGetUniformivARB"); + sf_glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram"); + sf_glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) load(userptr, "glLinkProgramARB"); + sf_glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource"); + sf_glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) load(userptr, "glShaderSourceARB"); + sf_glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f"); + sf_glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC) load(userptr, "glUniform1fARB"); + sf_glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv"); + sf_glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) load(userptr, "glUniform1fvARB"); + sf_glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i"); + sf_glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC) load(userptr, "glUniform1iARB"); + sf_glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv"); + sf_glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) load(userptr, "glUniform1ivARB"); + sf_glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f"); + sf_glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC) load(userptr, "glUniform2fARB"); + sf_glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv"); + sf_glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) load(userptr, "glUniform2fvARB"); + sf_glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i"); + sf_glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC) load(userptr, "glUniform2iARB"); + sf_glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv"); + sf_glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) load(userptr, "glUniform2ivARB"); + sf_glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f"); + sf_glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC) load(userptr, "glUniform3fARB"); + sf_glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv"); + sf_glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) load(userptr, "glUniform3fvARB"); + sf_glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i"); + sf_glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC) load(userptr, "glUniform3iARB"); + sf_glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv"); + sf_glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) load(userptr, "glUniform3ivARB"); + sf_glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f"); + sf_glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC) load(userptr, "glUniform4fARB"); + sf_glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv"); + sf_glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) load(userptr, "glUniform4fvARB"); + sf_glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i"); + sf_glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC) load(userptr, "glUniform4iARB"); + sf_glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv"); + sf_glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) load(userptr, "glUniform4ivARB"); + sf_glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv"); + sf_glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) load(userptr, "glUniformMatrix2fvARB"); + sf_glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv"); + sf_glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) load(userptr, "glUniformMatrix3fvARB"); + sf_glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv"); + sf_glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) load(userptr, "glUniformMatrix4fvARB"); + sf_glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram"); + sf_glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) load(userptr, "glUseProgramObjectARB"); + sf_glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram"); + sf_glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) load(userptr, "glValidateProgramARB"); +} +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_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); + sf_glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC) load(userptr, "glBindBufferARB"); + sf_glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); + sf_glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC) load(userptr, "glBufferDataARB"); + sf_glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); + sf_glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) load(userptr, "glBufferSubDataARB"); + sf_glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); + sf_glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) load(userptr, "glDeleteBuffersARB"); + sf_glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); + sf_glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) load(userptr, "glGenBuffersARB"); + sf_glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); + sf_glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) load(userptr, "glGetBufferParameterivARB"); + sf_glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv"); + sf_glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) load(userptr, "glGetBufferPointervARB"); + sf_glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData"); + sf_glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) load(userptr, "glGetBufferSubDataARB"); + sf_glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); + sf_glad_glIsBufferARB = (PFNGLISBUFFERARBPROC) load(userptr, "glIsBufferARB"); + sf_glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer"); + sf_glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) load(userptr, "glMapBufferARB"); + sf_glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer"); + 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_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); + sf_glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB"); + sf_glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); + 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_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); + sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB"); + sf_glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); + sf_glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB"); + sf_glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); + sf_glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB"); + sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); + 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_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); + sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB"); + sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); + sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB"); + sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); + sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB"); + sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); + sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB"); + sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); + sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB"); + sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); + sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB"); + sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); + sf_glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB"); + sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); + sf_glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB"); + sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); + sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB"); + sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); + sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB"); + sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); + sf_glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB"); + sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); + sf_glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB"); + sf_glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); + sf_glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB"); + sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); + sf_glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB"); + sf_glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); + sf_glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB"); + sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); + sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB"); + sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); + sf_glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB"); + sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); + sf_glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB"); + sf_glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv"); + sf_glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB"); + sf_glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv"); + sf_glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB"); + sf_glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv"); + sf_glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB"); + sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); + sf_glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB"); + sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); + sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB"); + sf_glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv"); + sf_glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB"); + sf_glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv"); + sf_glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB"); + sf_glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv"); + sf_glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB"); + sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); + sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB"); + sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); + sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB"); + sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); + sf_glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB"); + sf_glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); + sf_glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB"); + sf_glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv"); + sf_glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB"); + sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); + sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB"); + sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); + sf_glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB"); + sf_glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv"); + sf_glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB"); + sf_glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv"); + sf_glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB"); + sf_glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv"); + sf_glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB"); + sf_glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); + 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_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation"); + sf_glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) load(userptr, "glBindAttribLocationARB"); + sf_glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); + sf_glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB"); + sf_glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); + sf_glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB"); + sf_glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib"); + sf_glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) load(userptr, "glGetActiveAttribARB"); + sf_glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation"); + sf_glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) load(userptr, "glGetAttribLocationARB"); + sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); + sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB"); + sf_glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); + sf_glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB"); + sf_glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); + sf_glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB"); + sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); + sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB"); + sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); + sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB"); + sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); + sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB"); + sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); + sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB"); + sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); + sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB"); + sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); + sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB"); + sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); + sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB"); + sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); + sf_glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB"); + sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); + sf_glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB"); + sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); + sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB"); + sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); + sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB"); + sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); + sf_glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB"); + sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); + sf_glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB"); + sf_glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); + sf_glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB"); + sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); + sf_glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB"); + sf_glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); + sf_glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB"); + sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); + sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB"); + sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); + sf_glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB"); + sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); + sf_glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB"); + sf_glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv"); + sf_glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB"); + sf_glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv"); + sf_glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB"); + sf_glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv"); + sf_glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB"); + sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); + sf_glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB"); + sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); + sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB"); + sf_glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv"); + sf_glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB"); + sf_glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv"); + sf_glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB"); + sf_glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv"); + sf_glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB"); + sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); + sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB"); + sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); + sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB"); + sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); + sf_glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB"); + sf_glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); + sf_glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB"); + sf_glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv"); + sf_glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB"); + sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); + sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB"); + sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); + sf_glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB"); + sf_glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv"); + sf_glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB"); + sf_glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv"); + sf_glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB"); + sf_glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv"); + sf_glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB"); + sf_glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); + sf_glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB"); +} +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_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate"); + 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_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); + 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_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); + 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_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D"); + sf_glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC) load(userptr, "glCopyTexImage1DEXT"); + sf_glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); + sf_glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC) load(userptr, "glCopyTexImage2DEXT"); + sf_glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D"); + sf_glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC) load(userptr, "glCopyTexSubImage1DEXT"); + sf_glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); + sf_glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC) load(userptr, "glCopyTexSubImage2DEXT"); + sf_glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D"); + 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_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); + 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_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); + 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_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); + sf_glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) load(userptr, "glCheckFramebufferStatusEXT"); + sf_glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); + sf_glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) load(userptr, "glDeleteFramebuffersEXT"); + sf_glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); + sf_glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) load(userptr, "glDeleteRenderbuffersEXT"); + sf_glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); + sf_glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) load(userptr, "glFramebufferRenderbufferEXT"); + sf_glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D"); + sf_glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) load(userptr, "glFramebufferTexture1DEXT"); + sf_glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); + sf_glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) load(userptr, "glFramebufferTexture2DEXT"); + sf_glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D"); + sf_glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) load(userptr, "glFramebufferTexture3DEXT"); + sf_glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); + sf_glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) load(userptr, "glGenFramebuffersEXT"); + sf_glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); + sf_glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) load(userptr, "glGenRenderbuffersEXT"); + sf_glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); + sf_glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) load(userptr, "glGenerateMipmapEXT"); + sf_glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); + sf_glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) load(userptr, "glGetFramebufferAttachmentParameterivEXT"); + sf_glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); + sf_glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetRenderbufferParameterivEXT"); + sf_glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); + sf_glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) load(userptr, "glIsFramebufferEXT"); + sf_glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); + sf_glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) load(userptr, "glIsRenderbufferEXT"); + sf_glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); + 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_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); + 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_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D"); + sf_glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC) load(userptr, "glTexSubImage1DEXT"); + sf_glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D"); + 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_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); + 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_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); + 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_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(userptr, "glPrioritizeTextures"); + 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_glArrayElement = (PFNGLARRAYELEMENTPROC) load(userptr, "glArrayElement"); + sf_glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC) load(userptr, "glArrayElementEXT"); + sf_glad_glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC) load(userptr, "glColorPointerEXT"); + sf_glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); + sf_glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC) load(userptr, "glDrawArraysEXT"); + sf_glad_glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC) load(userptr, "glEdgeFlagPointerEXT"); + sf_glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + 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_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); + 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_NV_geometry_program4( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_NV_geometry_program4) return; + sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture"); + sf_glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC) load(userptr, "glFramebufferTextureEXT"); + sf_glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB"); + sf_glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) load(userptr, "glFramebufferTextureFaceEXT"); + sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); + 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_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB"); + sf_glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC) load(userptr, "glBindProgramNV"); + sf_glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB"); + sf_glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC) load(userptr, "glDeleteProgramsNV"); + sf_glad_glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC) load(userptr, "glExecuteProgramNV"); + sf_glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB"); + 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_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); + sf_glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC) load(userptr, "glGetVertexAttribPointervNV"); + sf_glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); + sf_glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) load(userptr, "glGetVertexAttribdvNV"); + sf_glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); + sf_glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) load(userptr, "glGetVertexAttribfvNV"); + sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); + sf_glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) load(userptr, "glGetVertexAttribivNV"); + sf_glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB"); + 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_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); + sf_glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC) load(userptr, "glVertexAttrib1dNV"); + sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); + sf_glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC) load(userptr, "glVertexAttrib1dvNV"); + sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); + sf_glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC) load(userptr, "glVertexAttrib1fNV"); + sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); + sf_glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC) load(userptr, "glVertexAttrib1fvNV"); + sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); + sf_glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC) load(userptr, "glVertexAttrib1sNV"); + sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); + sf_glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC) load(userptr, "glVertexAttrib1svNV"); + sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); + sf_glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC) load(userptr, "glVertexAttrib2dNV"); + sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); + sf_glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC) load(userptr, "glVertexAttrib2dvNV"); + sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); + sf_glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC) load(userptr, "glVertexAttrib2fNV"); + sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); + sf_glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC) load(userptr, "glVertexAttrib2fvNV"); + sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); + sf_glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC) load(userptr, "glVertexAttrib2sNV"); + sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); + sf_glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC) load(userptr, "glVertexAttrib2svNV"); + sf_glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); + sf_glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC) load(userptr, "glVertexAttrib3dNV"); + sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); + sf_glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC) load(userptr, "glVertexAttrib3dvNV"); + sf_glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); + sf_glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC) load(userptr, "glVertexAttrib3fNV"); + sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); + sf_glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC) load(userptr, "glVertexAttrib3fvNV"); + sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); + sf_glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC) load(userptr, "glVertexAttrib3sNV"); + sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); + sf_glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC) load(userptr, "glVertexAttrib3svNV"); + sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); + sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); + sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); + sf_glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC) load(userptr, "glVertexAttrib4dNV"); + sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); + sf_glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC) load(userptr, "glVertexAttrib4dvNV"); + sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); + sf_glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC) load(userptr, "glVertexAttrib4fNV"); + sf_glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); + sf_glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC) load(userptr, "glVertexAttrib4fvNV"); + sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); + sf_glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC) load(userptr, "glVertexAttrib4sNV"); + sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); + 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_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_load_GL_OES_single_precision( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_OES_single_precision) return; + sf_glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); + sf_glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC) load(userptr, "glClearDepthfOES"); + sf_glad_glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC) load(userptr, "glClipPlanefOES"); + sf_glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); + 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_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_glBlendFuncSeparateINGR != NULL) sf_glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)sf_glad_glBlendFuncSeparateINGR; + if (sf_glad_glBlendFuncSeparate == NULL && sf_glad_glBlendFuncSeparateEXT != NULL) sf_glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)sf_glad_glBlendFuncSeparateEXT; + 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_glFramebufferTextureEXT != NULL) sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)sf_glad_glFramebufferTextureEXT; + if (sf_glad_glFramebufferTexture == NULL && sf_glad_glFramebufferTextureARB != NULL) sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)sf_glad_glFramebufferTextureARB; + 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_glFramebufferTextureEXT != NULL) sf_glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)sf_glad_glFramebufferTextureEXT; + if (sf_glad_glFramebufferTextureARB == NULL && sf_glad_glFramebufferTexture != NULL) sf_glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)sf_glad_glFramebufferTexture; + 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_glFramebufferTextureLayerEXT != NULL) sf_glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)sf_glad_glFramebufferTextureLayerEXT; + if (sf_glad_glFramebufferTextureLayerARB == NULL && sf_glad_glFramebufferTextureLayer != NULL) sf_glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)sf_glad_glFramebufferTextureLayer; + if (sf_glad_glFramebufferTextureLayerEXT == NULL && sf_glad_glFramebufferTextureLayerARB != NULL) sf_glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)sf_glad_glFramebufferTextureLayerARB; + if (sf_glad_glFramebufferTextureLayerEXT == NULL && sf_glad_glFramebufferTextureLayer != NULL) sf_glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)sf_glad_glFramebufferTextureLayer; + 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_glGetVertexAttribfvARB != NULL) sf_glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)sf_glad_glGetVertexAttribfvARB; + if (sf_glad_glGetVertexAttribfvNV == NULL && sf_glad_glGetVertexAttribfv != NULL) sf_glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)sf_glad_glGetVertexAttribfv; + if (sf_glad_glGetVertexAttribiv == NULL && sf_glad_glGetVertexAttribivNV != NULL) sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)sf_glad_glGetVertexAttribivNV; + if (sf_glad_glGetVertexAttribiv == NULL && sf_glad_glGetVertexAttribivARB != NULL) sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)sf_glad_glGetVertexAttribivARB; + if (sf_glad_glGetVertexAttribivARB == NULL && sf_glad_glGetVertexAttribivNV != NULL) sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)sf_glad_glGetVertexAttribivNV; + if (sf_glad_glGetVertexAttribivARB == NULL && sf_glad_glGetVertexAttribiv != NULL) sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)sf_glad_glGetVertexAttribiv; + 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_glGetVertexAttribPointervNV != NULL) sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)sf_glad_glGetVertexAttribPointervNV; + if (sf_glad_glGetVertexAttribPointerv == NULL && sf_glad_glGetVertexAttribPointervARB != NULL) sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)sf_glad_glGetVertexAttribPointervARB; + if (sf_glad_glGetVertexAttribPointervARB == NULL && sf_glad_glGetVertexAttribPointervNV != NULL) sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)sf_glad_glGetVertexAttribPointervNV; + if (sf_glad_glGetVertexAttribPointervARB == NULL && sf_glad_glGetVertexAttribPointerv != NULL) sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)sf_glad_glGetVertexAttribPointerv; + 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_glProgramParameteriARB != NULL) sf_glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)sf_glad_glProgramParameteriARB; + if (sf_glad_glProgramParameteriEXT == NULL && sf_glad_glProgramParameteri != NULL) sf_glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)sf_glad_glProgramParameteri; + 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_glVertexAttrib1dNV != NULL) sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)sf_glad_glVertexAttrib1dNV; + if (sf_glad_glVertexAttrib1d == NULL && sf_glad_glVertexAttrib1dARB != NULL) sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)sf_glad_glVertexAttrib1dARB; + if (sf_glad_glVertexAttrib1dARB == NULL && sf_glad_glVertexAttrib1dNV != NULL) sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)sf_glad_glVertexAttrib1dNV; + if (sf_glad_glVertexAttrib1dARB == NULL && sf_glad_glVertexAttrib1d != NULL) sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)sf_glad_glVertexAttrib1d; + 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_glVertexAttrib1dvNV != NULL) sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)sf_glad_glVertexAttrib1dvNV; + if (sf_glad_glVertexAttrib1dvARB == NULL && sf_glad_glVertexAttrib1dv != NULL) sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)sf_glad_glVertexAttrib1dv; + if (sf_glad_glVertexAttrib1dvNV == NULL && sf_glad_glVertexAttrib1dvARB != NULL) sf_glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)sf_glad_glVertexAttrib1dvARB; + if (sf_glad_glVertexAttrib1dvNV == NULL && sf_glad_glVertexAttrib1dv != NULL) sf_glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)sf_glad_glVertexAttrib1dv; + if (sf_glad_glVertexAttrib1f == NULL && sf_glad_glVertexAttrib1fNV != NULL) sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)sf_glad_glVertexAttrib1fNV; + if (sf_glad_glVertexAttrib1f == NULL && sf_glad_glVertexAttrib1fARB != NULL) sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)sf_glad_glVertexAttrib1fARB; + if (sf_glad_glVertexAttrib1fARB == NULL && sf_glad_glVertexAttrib1fNV != NULL) sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)sf_glad_glVertexAttrib1fNV; + if (sf_glad_glVertexAttrib1fARB == NULL && sf_glad_glVertexAttrib1f != NULL) sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)sf_glad_glVertexAttrib1f; + if (sf_glad_glVertexAttrib1fNV == NULL && sf_glad_glVertexAttrib1fARB != NULL) sf_glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)sf_glad_glVertexAttrib1fARB; + if (sf_glad_glVertexAttrib1fNV == NULL && sf_glad_glVertexAttrib1f != NULL) sf_glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)sf_glad_glVertexAttrib1f; + 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_glVertexAttrib1fvNV != NULL) sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)sf_glad_glVertexAttrib1fvNV; + if (sf_glad_glVertexAttrib1fvARB == NULL && sf_glad_glVertexAttrib1fv != NULL) sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)sf_glad_glVertexAttrib1fv; + if (sf_glad_glVertexAttrib1fvNV == NULL && sf_glad_glVertexAttrib1fvARB != NULL) sf_glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)sf_glad_glVertexAttrib1fvARB; + if (sf_glad_glVertexAttrib1fvNV == NULL && sf_glad_glVertexAttrib1fv != NULL) sf_glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)sf_glad_glVertexAttrib1fv; + if (sf_glad_glVertexAttrib1s == NULL && sf_glad_glVertexAttrib1sNV != NULL) sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)sf_glad_glVertexAttrib1sNV; + if (sf_glad_glVertexAttrib1s == NULL && sf_glad_glVertexAttrib1sARB != NULL) sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)sf_glad_glVertexAttrib1sARB; + if (sf_glad_glVertexAttrib1sARB == NULL && sf_glad_glVertexAttrib1sNV != NULL) sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)sf_glad_glVertexAttrib1sNV; + if (sf_glad_glVertexAttrib1sARB == NULL && sf_glad_glVertexAttrib1s != NULL) sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)sf_glad_glVertexAttrib1s; + 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_glVertexAttrib1svNV != NULL) sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)sf_glad_glVertexAttrib1svNV; + if (sf_glad_glVertexAttrib1sv == NULL && sf_glad_glVertexAttrib1svARB != NULL) sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)sf_glad_glVertexAttrib1svARB; + if (sf_glad_glVertexAttrib1svARB == NULL && sf_glad_glVertexAttrib1svNV != NULL) sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)sf_glad_glVertexAttrib1svNV; + if (sf_glad_glVertexAttrib1svARB == NULL && sf_glad_glVertexAttrib1sv != NULL) sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)sf_glad_glVertexAttrib1sv; + if (sf_glad_glVertexAttrib1svNV == NULL && sf_glad_glVertexAttrib1svARB != NULL) sf_glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)sf_glad_glVertexAttrib1svARB; + if (sf_glad_glVertexAttrib1svNV == NULL && sf_glad_glVertexAttrib1sv != NULL) sf_glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)sf_glad_glVertexAttrib1sv; + 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_glVertexAttrib2dARB != NULL) sf_glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)sf_glad_glVertexAttrib2dARB; + if (sf_glad_glVertexAttrib2dNV == NULL && sf_glad_glVertexAttrib2d != NULL) sf_glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)sf_glad_glVertexAttrib2d; + 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_glVertexAttrib2fNV != NULL) sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)sf_glad_glVertexAttrib2fNV; + if (sf_glad_glVertexAttrib2fARB == NULL && sf_glad_glVertexAttrib2f != NULL) sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)sf_glad_glVertexAttrib2f; + if (sf_glad_glVertexAttrib2fNV == NULL && sf_glad_glVertexAttrib2fARB != NULL) sf_glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)sf_glad_glVertexAttrib2fARB; + if (sf_glad_glVertexAttrib2fNV == NULL && sf_glad_glVertexAttrib2f != NULL) sf_glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)sf_glad_glVertexAttrib2f; + if (sf_glad_glVertexAttrib2fv == NULL && sf_glad_glVertexAttrib2fvNV != NULL) sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)sf_glad_glVertexAttrib2fvNV; + if (sf_glad_glVertexAttrib2fv == NULL && sf_glad_glVertexAttrib2fvARB != NULL) sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)sf_glad_glVertexAttrib2fvARB; + if (sf_glad_glVertexAttrib2fvARB == NULL && sf_glad_glVertexAttrib2fvNV != NULL) sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)sf_glad_glVertexAttrib2fvNV; + if (sf_glad_glVertexAttrib2fvARB == NULL && sf_glad_glVertexAttrib2fv != NULL) sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)sf_glad_glVertexAttrib2fv; + if (sf_glad_glVertexAttrib2fvNV == NULL && sf_glad_glVertexAttrib2fvARB != NULL) sf_glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)sf_glad_glVertexAttrib2fvARB; + if (sf_glad_glVertexAttrib2fvNV == NULL && sf_glad_glVertexAttrib2fv != NULL) sf_glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)sf_glad_glVertexAttrib2fv; + 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_glVertexAttrib2sARB != NULL) sf_glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)sf_glad_glVertexAttrib2sARB; + if (sf_glad_glVertexAttrib2sNV == NULL && sf_glad_glVertexAttrib2s != NULL) sf_glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)sf_glad_glVertexAttrib2s; + 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_glVertexAttrib3dARB != NULL) sf_glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)sf_glad_glVertexAttrib3dARB; + if (sf_glad_glVertexAttrib3dNV == NULL && sf_glad_glVertexAttrib3d != NULL) sf_glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)sf_glad_glVertexAttrib3d; + 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_glVertexAttrib3fvNV != NULL) sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)sf_glad_glVertexAttrib3fvNV; + if (sf_glad_glVertexAttrib3fv == NULL && sf_glad_glVertexAttrib3fvARB != NULL) sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)sf_glad_glVertexAttrib3fvARB; + if (sf_glad_glVertexAttrib3fvARB == NULL && sf_glad_glVertexAttrib3fvNV != NULL) sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)sf_glad_glVertexAttrib3fvNV; + if (sf_glad_glVertexAttrib3fvARB == NULL && sf_glad_glVertexAttrib3fv != NULL) sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)sf_glad_glVertexAttrib3fv; + 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_glVertexAttrib3sARB != NULL) sf_glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)sf_glad_glVertexAttrib3sARB; + if (sf_glad_glVertexAttrib3sNV == NULL && sf_glad_glVertexAttrib3s != NULL) sf_glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)sf_glad_glVertexAttrib3s; + 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_glVertexAttrib4dNV != NULL) sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)sf_glad_glVertexAttrib4dNV; + if (sf_glad_glVertexAttrib4d == NULL && sf_glad_glVertexAttrib4dARB != NULL) sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)sf_glad_glVertexAttrib4dARB; + if (sf_glad_glVertexAttrib4dARB == NULL && sf_glad_glVertexAttrib4dNV != NULL) sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)sf_glad_glVertexAttrib4dNV; + if (sf_glad_glVertexAttrib4dARB == NULL && sf_glad_glVertexAttrib4d != NULL) sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)sf_glad_glVertexAttrib4d; + 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_glVertexAttrib4dvNV != NULL) sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)sf_glad_glVertexAttrib4dvNV; + if (sf_glad_glVertexAttrib4dv == NULL && sf_glad_glVertexAttrib4dvARB != NULL) sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)sf_glad_glVertexAttrib4dvARB; + if (sf_glad_glVertexAttrib4dvARB == NULL && sf_glad_glVertexAttrib4dvNV != NULL) sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)sf_glad_glVertexAttrib4dvNV; + if (sf_glad_glVertexAttrib4dvARB == NULL && sf_glad_glVertexAttrib4dv != NULL) sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)sf_glad_glVertexAttrib4dv; + if (sf_glad_glVertexAttrib4dvNV == NULL && sf_glad_glVertexAttrib4dvARB != NULL) sf_glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)sf_glad_glVertexAttrib4dvARB; + if (sf_glad_glVertexAttrib4dvNV == NULL && sf_glad_glVertexAttrib4dv != NULL) sf_glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)sf_glad_glVertexAttrib4dv; + if (sf_glad_glVertexAttrib4f == NULL && sf_glad_glVertexAttrib4fNV != NULL) sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)sf_glad_glVertexAttrib4fNV; + if (sf_glad_glVertexAttrib4f == NULL && sf_glad_glVertexAttrib4fARB != NULL) sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)sf_glad_glVertexAttrib4fARB; + 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_glVertexAttrib4ubNV != NULL) sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)sf_glad_glVertexAttrib4ubNV; + if (sf_glad_glVertexAttrib4Nub == NULL && sf_glad_glVertexAttrib4NubARB != NULL) sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)sf_glad_glVertexAttrib4NubARB; + 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_glVertexAttrib4ubvNV != NULL) sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)sf_glad_glVertexAttrib4ubvNV; + if (sf_glad_glVertexAttrib4Nubv == NULL && sf_glad_glVertexAttrib4NubvARB != NULL) sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)sf_glad_glVertexAttrib4NubvARB; + if (sf_glad_glVertexAttrib4NubvARB == NULL && sf_glad_glVertexAttrib4ubvNV != NULL) sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)sf_glad_glVertexAttrib4ubvNV; + if (sf_glad_glVertexAttrib4NubvARB == NULL && sf_glad_glVertexAttrib4Nubv != NULL) sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)sf_glad_glVertexAttrib4Nubv; + 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_glVertexAttrib4sNV != NULL) sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)sf_glad_glVertexAttrib4sNV; + if (sf_glad_glVertexAttrib4s == NULL && sf_glad_glVertexAttrib4sARB != NULL) sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)sf_glad_glVertexAttrib4sARB; + if (sf_glad_glVertexAttrib4sARB == NULL && sf_glad_glVertexAttrib4sNV != NULL) sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)sf_glad_glVertexAttrib4sNV; + if (sf_glad_glVertexAttrib4sARB == NULL && sf_glad_glVertexAttrib4s != NULL) sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)sf_glad_glVertexAttrib4s; + 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_glVertexAttrib4svARB != NULL) sf_glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)sf_glad_glVertexAttrib4svARB; + if (sf_glad_glVertexAttrib4svNV == NULL && sf_glad_glVertexAttrib4sv != NULL) sf_glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)sf_glad_glVertexAttrib4sv; + 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_copy_buffer = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_copy_buffer"); + 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_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_imaging = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_imaging"); + SF_GLAD_GL_ARB_multitexture = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_multitexture"); + 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_objects = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_objects"); + 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_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_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_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_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_SGIS_texture_edge_clamp = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_SGIS_texture_edge_clamp") | sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_edge_clamp"); + 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_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; + + 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); + + if (!sf_glad_gl_find_extensions_gl(version)) return 0; + sf_glad_gl_load_GL_ARB_copy_buffer(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_imaging(load, userptr); + sf_glad_gl_load_GL_ARB_multitexture(load, userptr); + sf_glad_gl_load_GL_ARB_separate_shader_objects(load, userptr); + sf_glad_gl_load_GL_ARB_shader_objects(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_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_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_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_single_precision = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision"); + 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_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_load_GL_OES_single_precision(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); +} + + + + + + +#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 00000000..e8bbf7e8 --- /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 00000000..1be9625e --- /dev/null +++ b/extlibs/headers/glad/include/glad/wgl.h @@ -0,0 +1,586 @@ +/** + * 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 void sf_glad_wgl_resolve_aliases(void) { +} + +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); +} + + +#ifdef SF_GLAD_WGL + +static int gladLoaderLoadWGL(HDC hdc) { + return gladLoadWGLUserPtr(hdc, sf_glad_wgl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) wglGetProcAddress); +} + + +#endif /* SF_GLAD_WGL */ + +#endif /* SF_GLAD_WGL_IMPLEMENTATION */ + diff --git a/src/SFML/Graphics/CMakeLists.txt b/src/SFML/Graphics/CMakeLists.txt index 9c0dcc3f..14c48ea9 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 @@ -99,6 +95,9 @@ target_link_libraries(sfml-graphics PUBLIC sfml-window) # stb_image sources target_include_directories(sfml-graphics PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/stb_image") +# glad sources +target_include_directories(sfml-graphics PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/glad/include") + # let CMake know about our additional graphics libraries paths if(SFML_OS_WINDOWS) set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "${PROJECT_SOURCE_DIR}/extlibs/headers/freetype2") @@ -112,26 +111,8 @@ 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() -endif() - if(SFML_OS_ANDROID) - target_link_libraries(sfml-graphics PRIVATE z EGL GLESv1_CM) + target_link_libraries(sfml-graphics PRIVATE z) elseif(SFML_OS_IOS) target_link_libraries(sfml-graphics PRIVATE z bz2) endif() diff --git a/src/SFML/Graphics/GLExtensions.cpp b/src/SFML/Graphics/GLExtensions.cpp index 898515bf..60d25847 100644 --- a/src/SFML/Graphics/GLExtensions.cpp +++ b/src/SFML/Graphics/GLExtensions.cpp @@ -25,6 +25,7 @@ //////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// +#define SF_GLAD_GL_IMPLEMENTATION #include <SFML/Graphics/GLExtensions.hpp> #include <SFML/Window/Context.hpp> #include <SFML/System/Err.hpp> @@ -45,13 +46,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 +89,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 f96ceb62..829155fa 100644 --- a/src/SFML/Graphics/GLExtensions.hpp +++ b/src/SFML/Graphics/GLExtensions.hpp @@ -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 @@ -73,7 +72,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 +81,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,30 +114,34 @@ #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 - #include <SFML/Graphics/GLLoader.hpp> - // SFML requires at a bare minimum OpenGL 1.1 capability // All functionality beyond that is optional // and has to be checked for prior to use @@ -163,35 +156,32 @@ // 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 // 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 +197,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 +234,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 +276,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,18 +288,18 @@ #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 diff --git a/src/SFML/Graphics/GLLoader.cpp b/src/SFML/Graphics/GLLoader.cpp deleted file mode 100644 index e0a9e80c..00000000 --- a/src/SFML/Graphics/GLLoader.cpp +++ /dev/null @@ -1,1019 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) -// -// This software is provided 'as-is', without 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 45b80da8..00000000 --- a/src/SFML/Graphics/GLLoader.hpp +++ /dev/null @@ -1,1706 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) -// -// This software is provided 'as-is', without 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/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index 7f4ccb46..4ae96a20 100644 --- a/src/SFML/Graphics/RenderTarget.cpp +++ b/src/SFML/Graphics/RenderTarget.cpp @@ -43,11 +43,11 @@ // 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 diff --git a/src/SFML/Graphics/Texture.cpp b/src/SFML/Graphics/Texture.cpp index 0d4c396f..a139115d 100644 --- a/src/SFML/Graphics/Texture.cpp +++ b/src/SFML/Graphics/Texture.cpp @@ -162,7 +162,7 @@ bool Texture::create(unsigned int width, unsigned int height) // 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) { @@ -655,7 +655,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) { diff --git a/src/SFML/Main/CMakeLists.txt b/src/SFML/Main/CMakeLists.txt index 6542e591..9344ada1 100644 --- a/src/SFML/Main/CMakeLists.txt +++ b/src/SFML/Main/CMakeLists.txt @@ -16,6 +16,11 @@ endif() # define the sfml-main target sfml_add_library(sfml-main STATIC SOURCES ${SRC}) +if(SFML_OS_ANDROID) + # glad sources + target_include_directories(sfml-main 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 0f9731d2..38fd99b8 100644 --- a/src/SFML/Main/MainAndroid.cpp +++ b/src/SFML/Main/MainAndroid.cpp @@ -47,6 +47,9 @@ #include <android/native_activity.h> #include <cstring> +#define SF_GLAD_EGL_IMPLEMENTATION +#include <glad/egl.h> + extern int main(int argc, char *argv[]); diff --git a/src/SFML/System/Android/Activity.hpp b/src/SFML/System/Android/Activity.hpp index bd6bbc9a..fd0c4240 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> diff --git a/src/SFML/System/CMakeLists.txt b/src/SFML/System/CMakeLists.txt index d1b712d8..1206968b 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/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index ecf35e14..f6ba3503 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -12,6 +12,10 @@ set(SRC ${SRCROOT}/Cursor.cpp ${INCROOT}/Cursor.hpp ${SRCROOT}/CursorImpl.hpp + ${SRCROOT}/EGLCheck.cpp + ${SRCROOT}/EGLCheck.hpp + ${SRCROOT}/EglContext.cpp + ${SRCROOT}/EglContext.hpp ${INCROOT}/Export.hpp ${SRCROOT}/GlContext.cpp ${SRCROOT}/GlContext.hpp @@ -48,12 +52,6 @@ set(SRC ${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 @@ -65,8 +63,6 @@ if(SFML_OS_WINDOWS) ${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 @@ -97,13 +93,11 @@ elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD) ${SRCROOT}/Unix/WindowImplX11.cpp ${SRCROOT}/Unix/WindowImplX11.hpp ) - if(NOT SFML_OPENGL_ES) + if(NOT SFML_OS_ANDROID) set(PLATFORM_SRC ${PLATFORM_SRC} ${SRCROOT}/Unix/GlxContext.cpp ${SRCROOT}/Unix/GlxContext.hpp - ${SRCROOT}/Unix/GlxExtensions.cpp - ${SRCROOT}/Unix/GlxExtensions.hpp ) endif() if(SFML_OS_LINUX) @@ -231,6 +225,9 @@ sfml_add_library(sfml-window SOURCES ${SRC} ${PLATFORM_SRC}) target_link_libraries(sfml-window PUBLIC sfml-system) +# glad sources +target_include_directories(sfml-window 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) @@ -249,16 +246,20 @@ 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) - sfml_add_external(OpenGL LINK "-framework OpenGLES") - elseif(SFML_OS_ANDROID) - sfml_add_external(OpenGL LINK "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_gl_LIBRARY") + target_link_libraries(sfml-window PRIVATE OpenGL) endif() -target_link_libraries(sfml-window PRIVATE OpenGL) if(SFML_OS_WINDOWS AND NOT SFML_COMPILER_MSVC) include(CheckIncludeFile) @@ -268,15 +269,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/EGLCheck.cpp b/src/SFML/Window/EGLCheck.cpp index dabf54e1..a5a4735f 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 317d9a8e..8eb6d0a2 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 90b58522..93b6949f 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> @@ -40,31 +39,50 @@ #include <X11/Xlib.h> #endif +#define SF_GLAD_EGL_IMPLEMENTATION +#include <glad/egl.h> + namespace { EGLDisplay getInitializedDisplay() { -#if defined(SFML_SYSTEM_LINUX) +#if defined(SFML_SYSTEM_ANDROID) + + // On Android, its native activity handles this for us + sf::priv::ActivityStates* states = sf::priv::getActivity(NULL); + sf::Lock lock(states->mutex); + + return states->display; + +#endif static EGLDisplay display = EGL_NO_DISPLAY; if (display == EGL_NO_DISPLAY) { - display = eglCheck(eglGetDisplay(EGL_DEFAULT_DISPLAY)); + eglCheck(display = eglGetDisplay(EGL_DEFAULT_DISPLAY)); eglCheck(eglInitialize(display, NULL, NULL)); } return display; + } -#elif defined(SFML_SYSTEM_ANDROID) - // On Android, its native activity handles this for us - sf::priv::ActivityStates* states = sf::priv::getActivity(NULL); - sf::Lock lock(states->mutex); + //////////////////////////////////////////////////////////// + void ensureInit() + { + static bool initialized = false; + if (!initialized) + { + initialized = true; - return states->display; + // We don't check the return value since the extension + // flags are cleared even if loading fails + gladLoaderLoadEGL(EGL_NO_DISPLAY); -#endif + // Continue loading with a display + gladLoaderLoadEGL(getInitializedDisplay()); + } } } @@ -80,6 +98,8 @@ m_context (EGL_NO_CONTEXT), m_surface (EGL_NO_SURFACE), m_config (NULL) { + ensureInit(); + // Get the initialized EGL display m_display = getInitializedDisplay(); @@ -95,7 +115,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,6 +129,8 @@ m_context (EGL_NO_CONTEXT), m_surface (EGL_NO_SURFACE), m_config (NULL) { + ensureInit(); + #ifdef SFML_SYSTEM_ANDROID // On Android, we must save the created context @@ -144,6 +166,7 @@ m_context (EGL_NO_CONTEXT), m_surface (EGL_NO_SURFACE), m_config (NULL) { + ensureInit(); } @@ -154,7 +177,8 @@ EglContext::~EglContext() cleanupUnsharedResources(); // Deactivate the current context - EGLContext currentContext = eglCheck(eglGetCurrentContext()); + EGLContext currentContext = EGL_NO_CONTEXT; + eglCheck(currentContext = eglGetCurrentContext()); if (currentContext == m_context) { @@ -175,13 +199,33 @@ EglContext::~EglContext() } +//////////////////////////////////////////////////////////// +GlFunctionPointer EglContext::getFunction(const char* name) +{ + ensureInit(); + + return reinterpret_cast<GlFunctionPointer>(eglGetProcAddress(name)); +} + + //////////////////////////////////////////////////////////// bool EglContext::makeCurrent(bool current) { - if (current) - return m_surface != EGL_NO_SURFACE && eglCheck(eglMakeCurrent(m_display, m_surface, m_surface, m_context)); + if (m_surface == EGL_NO_SURFACE) + return false; - return m_surface != EGL_NO_SURFACE && eglCheck(eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)); + EGLBoolean result = EGL_FALSE; + + if (current) + { + 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 (result != EGL_FALSE); } @@ -219,14 +263,14 @@ 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)); } @@ -244,6 +288,8 @@ void EglContext::destroySurface() //////////////////////////////////////////////////////////// EGLConfig EglContext::getBestConfig(EGLDisplay display, unsigned int bitsPerPixel, const ContextSettings& settings) { + ensureInit(); + // Set our video settings constraint const EGLint attributes[] = { EGL_BUFFER_SIZE, static_cast<EGLint>(bitsPerPixel), @@ -271,18 +317,31 @@ 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)); + 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 = tmp; - - eglCheck(eglGetConfigAttrib(m_display, m_config, EGL_STENCIL_SIZE, &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 = tmp; - - eglCheck(eglGetConfigAttrib(m_display, m_config, EGL_SAMPLES, &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 = tmp; - + m_settings.majorVersion = 1; m_settings.minorVersion = 1; m_settings.attributeFlags = ContextSettings::Default; @@ -293,6 +352,8 @@ void EglContext::updateSettings() //////////////////////////////////////////////////////////// XVisualInfo EglContext::selectBestVisual(::Display* XDisplay, unsigned int bitsPerPixel, const ContextSettings& settings) { + ensureInit(); + // Get the initialized EGL display EGLDisplay display = getInitializedDisplay(); diff --git a/src/SFML/Window/EglContext.hpp b/src/SFML/Window/EglContext.hpp index a889c3ac..d18e5643 100644 --- a/src/SFML/Window/EglContext.hpp +++ b/src/SFML/Window/EglContext.hpp @@ -32,8 +32,11 @@ #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> +#ifdef SFML_SYSTEM_LINUX + #include <X11/Xlib.h> +#endif namespace sf { @@ -79,6 +82,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 @@ -168,7 +181,7 @@ public: private: //////////////////////////////////////////////////////////// - /// \brief Helper to copy the picked EGL configuration + /// \brief Helper to copy the picked EGL configuration //////////////////////////////////////////////////////////// void updateSettings(); diff --git a/src/SFML/Window/GlContext.cpp b/src/SFML/Window/GlContext.cpp index fd3805d4..32ef89d3 100644 --- a/src/SFML/Window/GlContext.cpp +++ b/src/SFML/Window/GlContext.cpp @@ -27,11 +27,12 @@ //////////////////////////////////////////////////////////// #include <SFML/Window/GlContext.hpp> #include <SFML/Window/Context.hpp> +#include <SFML/Window/EglContext.hpp> #include <SFML/System/ThreadLocalPtr.hpp> #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 +43,66 @@ #include <cctype> #include <cassert> -#if !defined(SFML_OPENGL_ES) - #if defined(SFML_SYSTEM_WINDOWS) +#if defined(SFML_SYSTEM_WINDOWS) + + #if defined(SFML_OPENGL_ES) + + typedef sf::priv::EglContext ContextType; + + #else #include <SFML/Window/Win32/WglContext.hpp> typedef sf::priv::WglContext ContextType; - #elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) + #endif + +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) + + #if defined(SFML_OPENGL_ES) + + typedef sf::priv::EglContext ContextType; + + #else #include <SFML/Window/Unix/GlxContext.hpp> typedef sf::priv::GlxContext ContextType; - #elif defined(SFML_SYSTEM_MACOS) - - #include <SFML/Window/OSX/SFContext.hpp> - typedef sf::priv::SFContext ContextType; - #endif -#else +#elif defined(SFML_SYSTEM_MACOS) - #if defined(SFML_SYSTEM_IOS) + #include <SFML/Window/OSX/SFContext.hpp> + typedef sf::priv::SFContext ContextType; - #include <SFML/Window/iOS/EaglContext.hpp> - typedef sf::priv::EaglContext ContextType; +#elif defined(SFML_SYSTEM_IOS) - #else + #include <SFML/Window/iOS/EaglContext.hpp> + typedef sf::priv::EaglContext ContextType; - #include <SFML/Window/EglContext.hpp> - typedef sf::priv::EglContext ContextType; +#elif defined(SFML_SYSTEM_ANDROID) - #endif + 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 @@ -217,16 +236,23 @@ namespace { extensions.clear(); - // Check whether a >= 3.0 context is available - glGetStringiFuncType glGetStringiFunc = NULL; - glGetStringiFunc = reinterpret_cast<glGetStringiFuncType>(sf::priv::GlContext::getFunction("glGetStringi")); - int majorVersion = 0; - glGetIntegerv(GL_MAJOR_VERSION, &majorVersion); + 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")); - if (glGetError() == GL_INVALID_ENUM || !glGetStringiFunc) + if (!glGetErrorFunc || !glGetIntegervFunc || !glGetStringFunc) + return; + + // Check whether a >= 3.0 context is available + int majorVersion = 0; + glGetIntegervFunc(GL_MAJOR_VERSION, &majorVersion); + + glGetStringiFuncType glGetStringiFunc = reinterpret_cast<glGetStringiFuncType>(sf::priv::GlContext::getFunction("glGetStringi")); + + if (glGetErrorFunc() == GL_INVALID_ENUM || !glGetStringiFunc) { // Try to load the < 3.0 way - const char* extensionString = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)); + const char* extensionString = reinterpret_cast<const char*>(glGetStringFunc(GL_EXTENSIONS)); do { @@ -243,7 +269,7 @@ namespace { // Try to load the >= 3.0 way int numExtensions = 0; - glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions); + glGetIntegervFunc(GL_NUM_EXTENSIONS, &numExtensions); if (numExtensions) { @@ -517,17 +543,9 @@ bool GlContext::isExtensionAvailable(const char* name) //////////////////////////////////////////////////////////// GlFunctionPointer GlContext::getFunction(const char* name) { -#if !defined(SFML_OPENGL_ES) - Lock lock(mutex); return ContextType::getFunction(name); - -#else - - return 0; - -#endif } @@ -681,10 +699,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 (glGetError() != GL_INVALID_ENUM) + 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 (glGetErrorFunc() != GL_INVALID_ENUM) { m_settings.majorVersion = static_cast<unsigned int>(majorVersion); m_settings.minorVersion = static_cast<unsigned int>(minorVersion); @@ -697,7 +727,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" @@ -741,7 +771,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; @@ -755,7 +785,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) { @@ -773,7 +803,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; @@ -783,7 +813,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 { @@ -793,10 +823,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; @@ -814,9 +844,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) { diff --git a/src/SFML/Window/Unix/GlxContext.cpp b/src/SFML/Window/Unix/GlxContext.cpp index 73f42397..0cc1b953 100644 --- a/src/SFML/Window/Unix/GlxContext.cpp +++ b/src/SFML/Window/Unix/GlxContext.cpp @@ -25,6 +25,7 @@ //////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// +#define SF_GLAD_GLX_IMPLEMENTATION #include <SFML/Window/Unix/WindowImplX11.hpp> // important to be included first (conflict with None) #include <SFML/Window/Unix/GlxContext.hpp> #include <SFML/Window/Unix/Display.hpp> @@ -43,12 +44,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: @@ -79,21 +99,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), @@ -212,7 +217,7 @@ GlxContext::~GlxContext() //////////////////////////////////////////////////////////// GlFunctionPointer GlxContext::getFunction(const char* name) { - return reinterpret_cast<GlFunctionPointer>(glXGetProcAddressARB(reinterpret_cast<const GLubyte*>(name))); + return reinterpret_cast<GlFunctionPointer>(glXGetProcAddress(reinterpret_cast<const GLubyte*>(name))); } @@ -281,15 +286,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); } @@ -347,7 +352,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); @@ -358,7 +363,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); } @@ -405,7 +410,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); @@ -416,7 +421,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); } @@ -466,7 +471,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; @@ -626,7 +631,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) @@ -674,7 +679,7 @@ void GlxContext::createContext(GlxContext* shared) } // 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 c7628b7b..d8a80a0e 100644 --- a/src/SFML/Window/Unix/GlxContext.hpp +++ b/src/SFML/Window/Unix/GlxContext.hpp @@ -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 7e8450c1..00000000 --- a/src/SFML/Window/Unix/GlxExtensions.cpp +++ /dev/null @@ -1,218 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) -// -// This software is provided 'as-is', without 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 153e96f1..00000000 --- a/src/SFML/Window/Unix/GlxExtensions.hpp +++ /dev/null @@ -1,251 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) -// -// This software is provided 'as-is', without 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 9c8a6419..00000000 --- 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/Win32/WglContext.cpp b/src/SFML/Window/Win32/WglContext.cpp index 57516032..6252be02 100644 --- a/src/SFML/Window/Win32/WglContext.cpp +++ b/src/SFML/Window/Win32/WglContext.cpp @@ -25,8 +25,8 @@ //////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// +#define SF_GLAD_WGL_IMPLEMENTATION #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> @@ -41,6 +41,34 @@ 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); + + + //////////////////////////////////////////////////////////// + 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); + } + } } @@ -48,21 +76,6 @@ namespace sf { namespace priv { -//////////////////////////////////////////////////////////// -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 - sfwgl_LoadFunctions(deviceContext); - } -} - - //////////////////////////////////////////////////////////// String getErrorString(DWORD errorCode) { @@ -88,6 +101,8 @@ m_deviceContext(NULL), m_context (NULL), m_ownsWindow (false) { + ensureInit(); + // TODO: Delegate to the other constructor in C++11 // Save the creation settings @@ -109,6 +124,8 @@ m_deviceContext(NULL), m_context (NULL), m_ownsWindow (false) { + ensureInit(); + // Save the creation settings m_settings = settings; @@ -128,6 +145,8 @@ m_deviceContext(NULL), m_context (NULL), m_ownsWindow (false) { + ensureInit(); + // Save the creation settings m_settings = settings; @@ -235,7 +254,7 @@ void WglContext::setVerticalSyncEnabled(bool enabled) // Make sure that extensions are initialized 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; @@ -258,9 +277,11 @@ void WglContext::setVerticalSyncEnabled(bool enabled) //////////////////////////////////////////////////////////// int WglContext::selectBestPixelFormat(HDC deviceContext, unsigned int bitsPerPixel, const ContextSettings& settings, bool pbuffer) { + 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[] = @@ -306,7 +327,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[] = { @@ -322,7 +343,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; @@ -443,7 +464,7 @@ 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]; @@ -460,7 +481,7 @@ 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]; @@ -480,7 +501,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; @@ -513,7 +534,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); @@ -595,7 +616,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; @@ -609,7 +630,7 @@ void WglContext::createContext(WglContext* shared) } // 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; diff --git a/src/SFML/Window/Win32/WglContext.hpp b/src/SFML/Window/Win32/WglContext.hpp index c0e353a5..3dfe6a6d 100644 --- a/src/SFML/Window/Win32/WglContext.hpp +++ b/src/SFML/Window/Win32/WglContext.hpp @@ -29,7 +29,7 @@ // Headers //////////////////////////////////////////////////////////// #include <SFML/Window/GlContext.hpp> -#include <SFML/Window/Win32/WglExtensions.hpp> +#include <glad/wgl.h> namespace sf diff --git a/src/SFML/Window/Win32/WglExtensions.cpp b/src/SFML/Window/Win32/WglExtensions.cpp deleted file mode 100644 index d5042ded..00000000 --- a/src/SFML/Window/Win32/WglExtensions.cpp +++ /dev/null @@ -1,223 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) -// -// This software is provided 'as-is', without 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 7a863112..00000000 --- a/src/SFML/Window/Win32/WglExtensions.hpp +++ /dev/null @@ -1,236 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) -// -// This software is provided 'as-is', without 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 fa616752..00000000 --- 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 925c2bf4..e9d1c18b 100755 --- a/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -36,7 +36,6 @@ #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 diff --git a/src/SFML/Window/iOS/EaglContext.hpp b/src/SFML/Window/iOS/EaglContext.hpp index b67261b1..cef0c2ef 100644 --- a/src/SFML/Window/iOS/EaglContext.hpp +++ b/src/SFML/Window/iOS/EaglContext.hpp @@ -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); @@ -90,6 +90,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 /// diff --git a/src/SFML/Window/iOS/EaglContext.mm b/src/SFML/Window/iOS/EaglContext.mm index 3a3254a8..4d4da2d0 100644 --- a/src/SFML/Window/iOS/EaglContext.mm +++ b/src/SFML/Window/iOS/EaglContext.mm @@ -32,8 +32,44 @@ #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> + + +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 +85,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 +105,8 @@ m_depthbuffer (0), m_vsyncEnabled(false), m_clock () { + ensureInit(); + const WindowImplUIKit* window = static_cast<const WindowImplUIKit*>(owner); createContext(shared, window, bitsPerPixel, settings); @@ -83,6 +123,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 +144,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]; @@ -117,6 +159,21 @@ EaglContext::~EaglContext() } +//////////////////////////////////////////////////////////// +GlFunctionPointer EaglContext::getFunction(const char* name) +{ + static void* module = 0; + + if (!module) + module = dlopen("libGLESv1_CM.dylib", RTLD_LAZY | RTLD_LOCAL); + + if (module) + return reinterpret_cast<GlFunctionPointer>(dlsym(module, name)); + + return 0; +} + + //////////////////////////////////////////////////////////// void EaglContext::recreateRenderBuffers(SFView* glView) { @@ -125,20 +182,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); + 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 +207,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 +242,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 @@ -238,7 +295,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()); From 88861341563b13b1c5d6ffb959df48b7546b1346 Mon Sep 17 00:00:00 2001 From: Sztergbaum Roman <rmscastle@gmail.com> Date: Sat, 14 Sep 2019 15:41:57 +0200 Subject: [PATCH 178/211] fix(compilation): clang compilation on windows When using LLVM-clang on Windows which share the same ABI as `MSVC` (that means clang is able to use MSVC compiled DLL) the CMake library path was not updated resulting on not finding dependencies. Command line: `cmake -G "Visual Studio 16 2019" -A x64 -T "ClangCl" -DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe" -DCMAKE_C_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe" ../` Can be great to add it to CI on appveyor too. --- src/SFML/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/CMakeLists.txt b/src/SFML/CMakeLists.txt index 25a5bb1c..0014abff 100644 --- a/src/SFML/CMakeLists.txt +++ b/src/SFML/CMakeLists.txt @@ -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) if(SFML_MSVC_VERSION LESS 14) if(ARCH_32BITS) set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-msvc/x86") From 6272f853c1639311e25d2855f269de0e7c865ed4 Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sat, 15 Sep 2018 11:49:16 +0200 Subject: [PATCH 179/211] Add support for creating Vulkan window surfaces. --- examples/CMakeLists.txt | 1 + examples/vulkan/CMakeLists.txt | 11 + examples/vulkan/Vulkan.cpp | 2557 ++++++ examples/vulkan/resources/logo.png | Bin 0 -> 21279 bytes examples/vulkan/resources/shader.frag | 16 + examples/vulkan/resources/shader.frag.spv | Bin 0 -> 888 bytes examples/vulkan/resources/shader.vert | 25 + examples/vulkan/resources/shader.vert.spv | Bin 0 -> 1600 bytes examples/vulkan/vulkan.h | 3341 ++++++++ extlibs/headers/vulkan/vk_icd.h | 170 + extlibs/headers/vulkan/vk_layer.h | 195 + extlibs/headers/vulkan/vk_platform.h | 92 + extlibs/headers/vulkan/vk_sdk_platform.h | 69 + extlibs/headers/vulkan/vulkan.h | 79 + extlibs/headers/vulkan/vulkan_android.h | 126 + extlibs/headers/vulkan/vulkan_core.h | 7801 +++++++++++++++++++ extlibs/headers/vulkan/vulkan_ios.h | 58 + extlibs/headers/vulkan/vulkan_macos.h | 58 + extlibs/headers/vulkan/vulkan_mir.h | 65 + extlibs/headers/vulkan/vulkan_vi.h | 58 + extlibs/headers/vulkan/vulkan_wayland.h | 65 + extlibs/headers/vulkan/vulkan_win32.h | 276 + extlibs/headers/vulkan/vulkan_xcb.h | 66 + extlibs/headers/vulkan/vulkan_xlib.h | 66 + extlibs/headers/vulkan/vulkan_xlib_xrandr.h | 54 + include/SFML/Window/Vulkan.hpp | 114 + include/SFML/Window/WindowBase.hpp | 13 + src/SFML/Window/CMakeLists.txt | 9 + src/SFML/Window/Unix/VulkanImplX11.cpp | 225 + src/SFML/Window/Unix/VulkanImplX11.hpp | 103 + src/SFML/Window/Vulkan.cpp | 95 + src/SFML/Window/Win32/VulkanImplWin32.cpp | 219 + src/SFML/Window/Win32/VulkanImplWin32.hpp | 103 + src/SFML/Window/WindowBase.cpp | 7 + src/SFML/Window/WindowImpl.cpp | 27 + src/SFML/Window/WindowImpl.hpp | 12 + 36 files changed, 16176 insertions(+) create mode 100644 examples/vulkan/CMakeLists.txt create mode 100644 examples/vulkan/Vulkan.cpp create mode 100644 examples/vulkan/resources/logo.png create mode 100644 examples/vulkan/resources/shader.frag create mode 100644 examples/vulkan/resources/shader.frag.spv create mode 100644 examples/vulkan/resources/shader.vert create mode 100644 examples/vulkan/resources/shader.vert.spv create mode 100644 examples/vulkan/vulkan.h create mode 100644 extlibs/headers/vulkan/vk_icd.h create mode 100644 extlibs/headers/vulkan/vk_layer.h create mode 100644 extlibs/headers/vulkan/vk_platform.h create mode 100644 extlibs/headers/vulkan/vk_sdk_platform.h create mode 100644 extlibs/headers/vulkan/vulkan.h create mode 100644 extlibs/headers/vulkan/vulkan_android.h create mode 100644 extlibs/headers/vulkan/vulkan_core.h create mode 100644 extlibs/headers/vulkan/vulkan_ios.h create mode 100644 extlibs/headers/vulkan/vulkan_macos.h create mode 100644 extlibs/headers/vulkan/vulkan_mir.h create mode 100644 extlibs/headers/vulkan/vulkan_vi.h create mode 100644 extlibs/headers/vulkan/vulkan_wayland.h create mode 100644 extlibs/headers/vulkan/vulkan_win32.h create mode 100644 extlibs/headers/vulkan/vulkan_xcb.h create mode 100644 extlibs/headers/vulkan/vulkan_xlib.h create mode 100644 extlibs/headers/vulkan/vulkan_xlib_xrandr.h create mode 100644 include/SFML/Window/Vulkan.hpp create mode 100644 src/SFML/Window/Unix/VulkanImplX11.cpp create mode 100644 src/SFML/Window/Unix/VulkanImplX11.hpp create mode 100644 src/SFML/Window/Vulkan.cpp create mode 100644 src/SFML/Window/Win32/VulkanImplWin32.cpp create mode 100644 src/SFML/Window/Win32/VulkanImplWin32.hpp diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 3b64fcc7..a80d26c7 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -25,6 +25,7 @@ if(SFML_BUILD_GRAPHICS) add_subdirectory(joystick) add_subdirectory(shader) add_subdirectory(island) + add_subdirectory(vulkan) endif() if(SFML_OS_WINDOWS) diff --git a/examples/vulkan/CMakeLists.txt b/examples/vulkan/CMakeLists.txt new file mode 100644 index 00000000..368cb8f7 --- /dev/null +++ b/examples/vulkan/CMakeLists.txt @@ -0,0 +1,11 @@ + +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) diff --git a/examples/vulkan/Vulkan.cpp b/examples/vulkan/Vulkan.cpp new file mode 100644 index 00000000..01c58edd --- /dev/null +++ b/examples/vulkan/Vulkan.cpp @@ -0,0 +1,2557 @@ + +//////////////////////////////////////////////////////////// +// 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 reinterpret_cast<GLADapiproc>(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, 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 = validationLayers.size(); + instanceCreateInfo.ppEnabledLayerNames = &validationLayers[0]; + instanceCreateInfo.enabledExtensionCount = 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 = 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, i, surface, &surfaceSupported); + + if ((queueFamilyProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) && (surfaceSupported == VK_TRUE)) + { + queueFamilyIndex = 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 = 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, 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<char> buffer(static_cast<std::size_t>(file.getSize())); + + if (file.read(&buffer[0], file.getSize()) != file.getSize()) + { + vulkanAvailable = false; + return; + } + + shaderModuleCreateInfo.codeSize = buffer.size(); + shaderModuleCreateInfo.pCode = reinterpret_cast<const uint32_t*>(&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<char> buffer(static_cast<std::size_t>(file.getSize())); + + if (file.read(&buffer[0], file.getSize()) != file.getSize()) + { + vulkanAvailable = false; + return; + } + + shaderModuleCreateInfo.codeSize = buffer.size(); + shaderModuleCreateInfo.pCode = reinterpret_cast<const uint32_t*>(&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 = 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 & (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 & (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<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 (int 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 (int 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 (int 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 + float x = clamp( sf::Mouse::getPosition(window).x * 2.f / window.getSize().x - 1.f, -1.0f, 1.0f) * 2.0f; + float y = clamp(-sf::Mouse::getPosition(window).y * 2.f / window.getSize().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 int maxFramesInFlight; + 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 0000000000000000000000000000000000000000..10aa70b450f6768ab8c159a9dc38ada1d0736de6 GIT binary patch literal 21279 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 literal 0 HcmV?d00001 diff --git a/examples/vulkan/resources/shader.frag b/examples/vulkan/resources/shader.frag new file mode 100644 index 00000000..7273a05a --- /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 0000000000000000000000000000000000000000..00fd6f463b3573f0ed38d8d8157b8d8ec34caa8a GIT binary patch literal 888 zcmYk3%T5$g5Qa;J29*2#jx(?%AuiCE7%{+NHnS2Fmy?!hKms)BX%b$5cXI7ZX$&TQ zU)z&RCDm2`U;n97b-FRKHy-gK#$zJ(;=j$u2u#Fej8(DSIqMws%ih7^+czp^qEQLe z%yMp&sNbgF?<~B;C-EhG4y`pVA#2b%;wJ}3QMEhW<IgAEes-T0X_<BVS7|RRy7{;3 z?7ZwpB&de_CNTESAIj7GCND@~lIpIDBE1}ta&y$m?C~tUy}!v&ChX!o>b_);r+HrV zJm0P+iP#ZfVrL)5_S&_GSr@l(_ZQn&y?Bug-LX||8&$qSJ_gssSJC?xVs~ruogn(6 z@*isKo^sY-5$!#wi=9z!ofnxV+D|-e1H4J684Bv`H(QJ3yie>-n)59X?dKlq7m4<g zS1)#Fxn=Mgv59N@HC`tl%)e3R_Ox!?#<5RJ+~V84;}3bCZ=!kjH%vnO2<z@sxO<D8 zeI9piv9m4X&h?d3>Q`_z@=rClN^T!(N8I8&%N<j9&P`m-`R(hhTe$oWG|u|E=G@^I ZJz7NV4|;1&T+aE;pLr>BxxeJ^@qYohIoSXJ literal 0 HcmV?d00001 diff --git a/examples/vulkan/resources/shader.vert b/examples/vulkan/resources/shader.vert new file mode 100644 index 00000000..1f6b0091 --- /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 0000000000000000000000000000000000000000..9095b69436cf0def39639e148301f66e4d022acc GIT binary patch literal 1600 zcmZ9KNpBND5QQ7tlZ7QAge+{qj@bid5g;VQlH}kVED_eL<=}Rh$exMD4&<1>06&Re z#RZA?^-KjrTjj2LRj;P{b(c%^N#{<uNjK#lxqQvJk`U)kxrwkhTkl(q;i%hq{Nw=@ zGp-y8shL$3t0Eh8;spPsY(;iUc1PBbK`iT6(*9G#iko)LR(t*3MtkV@J6UJs+ruxN zuFu-(&Yu4~8afxLYP@fxd8WkQ?YFmm_Q_`>f2dGsj^mR{hw&&*6Y<Mo7Vt<XoYDR< ziF;`_*f{9*eD)@MN$e=(s2ikR-`8#!XZ#xbZ{!T)4EtHS2gWzfYCqUX<wxP%adJFD zz|f(Wb#^z?ewqbNCFl|-Il{Tnh?)=na5GJ_uEM}Yw>bHWZV5#LR<68rP0awtTw79% zbFv~C^%mCy`Y)!-5Az$3^N#a~;k}kwFR=f4e0!Wn4DU#0JTT)iGjoA8H8UEn%2*cH z@-W1_CyYfNO~+&288NewN6+yX9f|qgy#Cp1nt_*$zbJ1)dsVh1K64WD{#KMjU$Cl> zY3=a9o)<B19&AA|_fnNH%UThimd{#Nd`3IH^4|IVfSK`)S;fqSMtp-9jlituToF@$ zuJGw$`33pRz<Dlf=RC|v{T1!x!0AtHdcij>oI83&{SD>eGB@?a+=2DGEuVgtC+1G< z`*-Ejllkd)Pdi+2`Vn(y*6+T2xRxj84#A%4rO^ldSa5y`;r*@aA1&r(=!HfvREaL< zW#Cq`D4!a1vYI9N;6Ky{&aw<1xbZH?hsT{7@1lHg<6V*u7n~Y&zA8iGx9W`+wF1+2 zjI9<J=d`+dfpO+-DU8O~WbmmcUzL4VUvk%Fe4iR-=B{qac%#hxQi>5%$82!cWZV}y W?v<Dv`ahJRJvr`(__uE2nd}cbt!146 literal 0 HcmV?d00001 diff --git a/examples/vulkan/vulkan.h b/examples/vulkan/vulkan.h new file mode 100644 index 00000000..348e8396 --- /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/extlibs/headers/vulkan/vk_icd.h b/extlibs/headers/vulkan/vk_icd.h new file mode 100644 index 00000000..b935fa17 --- /dev/null +++ b/extlibs/headers/vulkan/vk_icd.h @@ -0,0 +1,170 @@ +// +// File: vk_icd.h +// +/* + * Copyright (c) 2015-2016 The Khronos Group Inc. + * Copyright (c) 2015-2016 Valve Corporation + * Copyright (c) 2015-2016 LunarG, 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 VKICD_H +#define VKICD_H + +#include "vulkan.h" +#include <stdbool.h> + +// Loader-ICD version negotiation API. Versions add the following features: +// Version 0 - Initial. Doesn't support vk_icdGetInstanceProcAddr +// or vk_icdNegotiateLoaderICDInterfaceVersion. +// Version 1 - Add support for vk_icdGetInstanceProcAddr. +// Version 2 - Add Loader/ICD Interface version negotiation +// via vk_icdNegotiateLoaderICDInterfaceVersion. +// Version 3 - Add ICD creation/destruction of KHR_surface objects. +// Version 4 - Add unknown physical device extension qyering via +// vk_icdGetPhysicalDeviceProcAddr. +// Version 5 - Tells ICDs that the loader is now paying attention to the +// application version of Vulkan passed into the ApplicationInfo +// structure during vkCreateInstance. This will tell the ICD +// that if the loader is older, it should automatically fail a +// call for any API version > 1.0. Otherwise, the loader will +// manually determine if it can support the expected version. +#define CURRENT_LOADER_ICD_INTERFACE_VERSION 5 +#define MIN_SUPPORTED_LOADER_ICD_INTERFACE_VERSION 0 +#define MIN_PHYS_DEV_EXTENSION_ICD_INTERFACE_VERSION 4 +typedef VkResult(VKAPI_PTR *PFN_vkNegotiateLoaderICDInterfaceVersion)(uint32_t *pVersion); + +// This is defined in vk_layer.h which will be found by the loader, but if an ICD is building against this +// file directly, it won't be found. +#ifndef PFN_GetPhysicalDeviceProcAddr +typedef PFN_vkVoidFunction(VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char *pName); +#endif + +/* + * The ICD must reserve space for a pointer for the loader's dispatch + * table, at the start of <each object>. + * The ICD must initialize this variable using the SET_LOADER_MAGIC_VALUE macro. + */ + +#define ICD_LOADER_MAGIC 0x01CDC0DE + +typedef union { + uintptr_t loaderMagic; + void *loaderData; +} VK_LOADER_DATA; + +static inline void set_loader_magic_value(void *pNewObject) { + VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject; + loader_info->loaderMagic = ICD_LOADER_MAGIC; +} + +static inline bool valid_loader_magic_value(void *pNewObject) { + const VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject; + return (loader_info->loaderMagic & 0xffffffff) == ICD_LOADER_MAGIC; +} + +/* + * Windows and Linux ICDs will treat VkSurfaceKHR as a pointer to a struct that + * contains the platform-specific connection and surface information. + */ +typedef enum { + VK_ICD_WSI_PLATFORM_MIR, + VK_ICD_WSI_PLATFORM_WAYLAND, + VK_ICD_WSI_PLATFORM_WIN32, + VK_ICD_WSI_PLATFORM_XCB, + VK_ICD_WSI_PLATFORM_XLIB, + VK_ICD_WSI_PLATFORM_ANDROID, + VK_ICD_WSI_PLATFORM_MACOS, + VK_ICD_WSI_PLATFORM_IOS, + VK_ICD_WSI_PLATFORM_DISPLAY +} VkIcdWsiPlatform; + +typedef struct { + VkIcdWsiPlatform platform; +} VkIcdSurfaceBase; + +#ifdef VK_USE_PLATFORM_MIR_KHR +typedef struct { + VkIcdSurfaceBase base; + MirConnection *connection; + MirSurface *mirSurface; +} VkIcdSurfaceMir; +#endif // VK_USE_PLATFORM_MIR_KHR + +#ifdef VK_USE_PLATFORM_WAYLAND_KHR +typedef struct { + VkIcdSurfaceBase base; + struct wl_display *display; + struct wl_surface *surface; +} VkIcdSurfaceWayland; +#endif // VK_USE_PLATFORM_WAYLAND_KHR + +#ifdef VK_USE_PLATFORM_WIN32_KHR +typedef struct { + VkIcdSurfaceBase base; + HINSTANCE hinstance; + HWND hwnd; +} VkIcdSurfaceWin32; +#endif // VK_USE_PLATFORM_WIN32_KHR + +#ifdef VK_USE_PLATFORM_XCB_KHR +typedef struct { + VkIcdSurfaceBase base; + xcb_connection_t *connection; + xcb_window_t window; +} VkIcdSurfaceXcb; +#endif // VK_USE_PLATFORM_XCB_KHR + +#ifdef VK_USE_PLATFORM_XLIB_KHR +typedef struct { + VkIcdSurfaceBase base; + Display *dpy; + Window window; +} VkIcdSurfaceXlib; +#endif // VK_USE_PLATFORM_XLIB_KHR + +#ifdef VK_USE_PLATFORM_ANDROID_KHR +typedef struct { + VkIcdSurfaceBase base; + struct ANativeWindow *window; +} VkIcdSurfaceAndroid; +#endif // VK_USE_PLATFORM_ANDROID_KHR + +#ifdef VK_USE_PLATFORM_MACOS_MVK +typedef struct { + VkIcdSurfaceBase base; + const void *pView; +} VkIcdSurfaceMacOS; +#endif // VK_USE_PLATFORM_MACOS_MVK + +#ifdef VK_USE_PLATFORM_IOS_MVK +typedef struct { + VkIcdSurfaceBase base; + const void *pView; +} VkIcdSurfaceIOS; +#endif // VK_USE_PLATFORM_IOS_MVK + +typedef struct { + VkIcdSurfaceBase base; + VkDisplayModeKHR displayMode; + uint32_t planeIndex; + uint32_t planeStackIndex; + VkSurfaceTransformFlagBitsKHR transform; + float globalAlpha; + VkDisplayPlaneAlphaFlagBitsKHR alphaMode; + VkExtent2D imageExtent; +} VkIcdSurfaceDisplay; + +#endif // VKICD_H diff --git a/extlibs/headers/vulkan/vk_layer.h b/extlibs/headers/vulkan/vk_layer.h new file mode 100644 index 00000000..823c88ab --- /dev/null +++ b/extlibs/headers/vulkan/vk_layer.h @@ -0,0 +1,195 @@ +// +// File: vk_layer.h +// +/* + * Copyright (c) 2015-2017 The Khronos Group Inc. + * Copyright (c) 2015-2017 Valve Corporation + * Copyright (c) 2015-2017 LunarG, 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. + * + */ + +/* Need to define dispatch table + * Core struct can then have ptr to dispatch table at the top + * Along with object ptrs for current and next OBJ + */ +#pragma once + +#include "vulkan.h" +#if defined(__GNUC__) && __GNUC__ >= 4 +#define VK_LAYER_EXPORT __attribute__((visibility("default"))) +#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) +#define VK_LAYER_EXPORT __attribute__((visibility("default"))) +#else +#define VK_LAYER_EXPORT +#endif + +#define MAX_NUM_UNKNOWN_EXTS 250 + + // Loader-Layer version negotiation API. Versions add the following features: + // Versions 0/1 - Initial. Doesn't support vk_layerGetPhysicalDeviceProcAddr + // or vk_icdNegotiateLoaderLayerInterfaceVersion. + // Version 2 - Add support for vk_layerGetPhysicalDeviceProcAddr and + // vk_icdNegotiateLoaderLayerInterfaceVersion. +#define CURRENT_LOADER_LAYER_INTERFACE_VERSION 2 +#define MIN_SUPPORTED_LOADER_LAYER_INTERFACE_VERSION 1 + +#define VK_CURRENT_CHAIN_VERSION 1 + +// Typedef for use in the interfaces below +typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName); + +// Version negotiation values +typedef enum VkNegotiateLayerStructType { + LAYER_NEGOTIATE_UNINTIALIZED = 0, + LAYER_NEGOTIATE_INTERFACE_STRUCT = 1, +} VkNegotiateLayerStructType; + +// Version negotiation structures +typedef struct VkNegotiateLayerInterface { + VkNegotiateLayerStructType sType; + void *pNext; + uint32_t loaderLayerInterfaceVersion; + PFN_vkGetInstanceProcAddr pfnGetInstanceProcAddr; + PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr; + PFN_GetPhysicalDeviceProcAddr pfnGetPhysicalDeviceProcAddr; +} VkNegotiateLayerInterface; + +// Version negotiation functions +typedef VkResult (VKAPI_PTR *PFN_vkNegotiateLoaderLayerInterfaceVersion)(VkNegotiateLayerInterface *pVersionStruct); + +// Function prototype for unknown physical device extension command +typedef VkResult(VKAPI_PTR *PFN_PhysDevExt)(VkPhysicalDevice phys_device); + +// ------------------------------------------------------------------------------------------------ +// CreateInstance and CreateDevice support structures + +/* Sub type of structure for instance and device loader ext of CreateInfo. + * When sType == VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO + * or sType == VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO + * then VkLayerFunction indicates struct type pointed to by pNext + */ +typedef enum VkLayerFunction_ { + VK_LAYER_LINK_INFO = 0, + VK_LOADER_DATA_CALLBACK = 1 +} VkLayerFunction; + +typedef struct VkLayerInstanceLink_ { + struct VkLayerInstanceLink_ *pNext; + PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; + PFN_GetPhysicalDeviceProcAddr pfnNextGetPhysicalDeviceProcAddr; +} VkLayerInstanceLink; + +/* + * When creating the device chain the loader needs to pass + * down information about it's device structure needed at + * the end of the chain. Passing the data via the + * VkLayerDeviceInfo avoids issues with finding the + * exact instance being used. + */ +typedef struct VkLayerDeviceInfo_ { + void *device_info; + PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; +} VkLayerDeviceInfo; + +typedef VkResult (VKAPI_PTR *PFN_vkSetInstanceLoaderData)(VkInstance instance, + void *object); +typedef VkResult (VKAPI_PTR *PFN_vkSetDeviceLoaderData)(VkDevice device, + void *object); + +typedef struct { + VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO + const void *pNext; + VkLayerFunction function; + union { + VkLayerInstanceLink *pLayerInfo; + PFN_vkSetInstanceLoaderData pfnSetInstanceLoaderData; + } u; +} VkLayerInstanceCreateInfo; + +typedef struct VkLayerDeviceLink_ { + struct VkLayerDeviceLink_ *pNext; + PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; + PFN_vkGetDeviceProcAddr pfnNextGetDeviceProcAddr; +} VkLayerDeviceLink; + +typedef struct { + VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO + const void *pNext; + VkLayerFunction function; + union { + VkLayerDeviceLink *pLayerInfo; + PFN_vkSetDeviceLoaderData pfnSetDeviceLoaderData; + } u; +} VkLayerDeviceCreateInfo; + +#ifdef __cplusplus +extern "C" { +#endif + +VKAPI_ATTR VkResult VKAPI_CALL vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface *pVersionStruct); + +typedef enum VkChainType { + VK_CHAIN_TYPE_UNKNOWN = 0, + VK_CHAIN_TYPE_ENUMERATE_INSTANCE_EXTENSION_PROPERTIES = 1, + VK_CHAIN_TYPE_ENUMERATE_INSTANCE_LAYER_PROPERTIES = 2, + VK_CHAIN_TYPE_ENUMERATE_INSTANCE_VERSION = 3, +} VkChainType; + +typedef struct VkChainHeader { + VkChainType type; + uint32_t version; + uint32_t size; +} VkChainHeader; + +typedef struct VkEnumerateInstanceExtensionPropertiesChain { + VkChainHeader header; + VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceExtensionPropertiesChain *, const char *, uint32_t *, + VkExtensionProperties *); + const struct VkEnumerateInstanceExtensionPropertiesChain *pNextLink; + +#if defined(__cplusplus) + inline VkResult CallDown(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties) const { + return pfnNextLayer(pNextLink, pLayerName, pPropertyCount, pProperties); + } +#endif +} VkEnumerateInstanceExtensionPropertiesChain; + +typedef struct VkEnumerateInstanceLayerPropertiesChain { + VkChainHeader header; + VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceLayerPropertiesChain *, uint32_t *, VkLayerProperties *); + const struct VkEnumerateInstanceLayerPropertiesChain *pNextLink; + +#if defined(__cplusplus) + inline VkResult CallDown(uint32_t *pPropertyCount, VkLayerProperties *pProperties) const { + return pfnNextLayer(pNextLink, pPropertyCount, pProperties); + } +#endif +} VkEnumerateInstanceLayerPropertiesChain; + +typedef struct VkEnumerateInstanceVersionChain { + VkChainHeader header; + VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceVersionChain *, uint32_t *); + const struct VkEnumerateInstanceVersionChain *pNextLink; + +#if defined(__cplusplus) + inline VkResult CallDown(uint32_t *pApiVersion) const { + return pfnNextLayer(pNextLink, pApiVersion); + } +#endif +} VkEnumerateInstanceVersionChain; + +#ifdef __cplusplus +} +#endif diff --git a/extlibs/headers/vulkan/vk_platform.h b/extlibs/headers/vulkan/vk_platform.h new file mode 100644 index 00000000..72892992 --- /dev/null +++ b/extlibs/headers/vulkan/vk_platform.h @@ -0,0 +1,92 @@ +// +// 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 diff --git a/extlibs/headers/vulkan/vk_sdk_platform.h b/extlibs/headers/vulkan/vk_sdk_platform.h new file mode 100644 index 00000000..96d86769 --- /dev/null +++ b/extlibs/headers/vulkan/vk_sdk_platform.h @@ -0,0 +1,69 @@ +// +// File: vk_sdk_platform.h +// +/* + * Copyright (c) 2015-2016 The Khronos Group Inc. + * Copyright (c) 2015-2016 Valve Corporation + * Copyright (c) 2015-2016 LunarG, 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_SDK_PLATFORM_H +#define VK_SDK_PLATFORM_H + +#if defined(_WIN32) +#define NOMINMAX +#ifndef __cplusplus +#undef inline +#define inline __inline +#endif // __cplusplus + +#if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/) +// C99: +// Microsoft didn't implement C99 in Visual Studio; but started adding it with +// VS2013. However, VS2013 still didn't have snprintf(). The following is a +// work-around (Note: The _CRT_SECURE_NO_WARNINGS macro must be set in the +// "CMakeLists.txt" file). +// NOTE: This is fixed in Visual Studio 2015. +#define snprintf _snprintf +#endif + +#define strdup _strdup + +#endif // _WIN32 + +// Check for noexcept support using clang, with fallback to Windows or GCC version numbers +#ifndef NOEXCEPT +#if defined(__clang__) +#if __has_feature(cxx_noexcept) +#define HAS_NOEXCEPT +#endif +#else +#if defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC__ * 10 + __GNUC_MINOR__ >= 46 +#define HAS_NOEXCEPT +#else +#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023026 && defined(_HAS_EXCEPTIONS) && _HAS_EXCEPTIONS +#define HAS_NOEXCEPT +#endif +#endif +#endif + +#ifdef HAS_NOEXCEPT +#define NOEXCEPT noexcept +#else +#define NOEXCEPT +#endif +#endif + +#endif // VK_SDK_PLATFORM_H diff --git a/extlibs/headers/vulkan/vulkan.h b/extlibs/headers/vulkan/vulkan.h new file mode 100644 index 00000000..d05c8490 --- /dev/null +++ b/extlibs/headers/vulkan/vulkan.h @@ -0,0 +1,79 @@ +#ifndef VULKAN_H_ +#define VULKAN_H_ 1 + +/* +** Copyright (c) 2015-2018 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. +*/ + +#include "vk_platform.h" +#include "vulkan_core.h" + +#ifdef VK_USE_PLATFORM_ANDROID_KHR +#include "vulkan_android.h" +#endif + + +#ifdef VK_USE_PLATFORM_IOS_MVK +#include "vulkan_ios.h" +#endif + + +#ifdef VK_USE_PLATFORM_MACOS_MVK +#include "vulkan_macos.h" +#endif + + +#ifdef VK_USE_PLATFORM_MIR_KHR +#include <mir_toolkit/client_types.h> +#include "vulkan_mir.h" +#endif + + +#ifdef VK_USE_PLATFORM_VI_NN +#include "vulkan_vi.h" +#endif + + +#ifdef VK_USE_PLATFORM_WAYLAND_KHR +#include <wayland-client.h> +#include "vulkan_wayland.h" +#endif + + +#ifdef VK_USE_PLATFORM_WIN32_KHR +#include <windows.h> +#include "vulkan_win32.h" +#endif + + +#ifdef VK_USE_PLATFORM_XCB_KHR +#include <xcb/xcb.h> +#include "vulkan_xcb.h" +#endif + + +#ifdef VK_USE_PLATFORM_XLIB_KHR +#include <X11/Xlib.h> +#include "vulkan_xlib.h" +#endif + + +#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT +#include <X11/Xlib.h> +#include <X11/extensions/Xrandr.h> +#include "vulkan_xlib_xrandr.h" +#endif + +#endif // VULKAN_H_ diff --git a/extlibs/headers/vulkan/vulkan_android.h b/extlibs/headers/vulkan/vulkan_android.h new file mode 100644 index 00000000..07aaeda2 --- /dev/null +++ b/extlibs/headers/vulkan/vulkan_android.h @@ -0,0 +1,126 @@ +#ifndef VULKAN_ANDROID_H_ +#define VULKAN_ANDROID_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2015-2018 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. +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#define VK_KHR_android_surface 1 +struct ANativeWindow; + +#define VK_KHR_ANDROID_SURFACE_SPEC_VERSION 6 +#define VK_KHR_ANDROID_SURFACE_EXTENSION_NAME "VK_KHR_android_surface" + +typedef VkFlags VkAndroidSurfaceCreateFlagsKHR; + +typedef struct VkAndroidSurfaceCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkAndroidSurfaceCreateFlagsKHR flags; + struct ANativeWindow* window; +} VkAndroidSurfaceCreateInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateAndroidSurfaceKHR)(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR( + VkInstance instance, + const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); +#endif + +#define VK_ANDROID_external_memory_android_hardware_buffer 1 +struct AHardwareBuffer; + +#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION 3 +#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME "VK_ANDROID_external_memory_android_hardware_buffer" + +typedef struct VkAndroidHardwareBufferUsageANDROID { + VkStructureType sType; + void* pNext; + uint64_t androidHardwareBufferUsage; +} VkAndroidHardwareBufferUsageANDROID; + +typedef struct VkAndroidHardwareBufferPropertiesANDROID { + VkStructureType sType; + void* pNext; + VkDeviceSize allocationSize; + uint32_t memoryTypeBits; +} VkAndroidHardwareBufferPropertiesANDROID; + +typedef struct VkAndroidHardwareBufferFormatPropertiesANDROID { + VkStructureType sType; + void* pNext; + VkFormat format; + uint64_t externalFormat; + VkFormatFeatureFlags formatFeatures; + VkComponentMapping samplerYcbcrConversionComponents; + VkSamplerYcbcrModelConversion suggestedYcbcrModel; + VkSamplerYcbcrRange suggestedYcbcrRange; + VkChromaLocation suggestedXChromaOffset; + VkChromaLocation suggestedYChromaOffset; +} VkAndroidHardwareBufferFormatPropertiesANDROID; + +typedef struct VkImportAndroidHardwareBufferInfoANDROID { + VkStructureType sType; + const void* pNext; + struct AHardwareBuffer* buffer; +} VkImportAndroidHardwareBufferInfoANDROID; + +typedef struct VkMemoryGetAndroidHardwareBufferInfoANDROID { + VkStructureType sType; + const void* pNext; + VkDeviceMemory memory; +} VkMemoryGetAndroidHardwareBufferInfoANDROID; + +typedef struct VkExternalFormatANDROID { + VkStructureType sType; + void* pNext; + uint64_t externalFormat; +} VkExternalFormatANDROID; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetAndroidHardwareBufferPropertiesANDROID)(VkDevice device, const struct AHardwareBuffer* buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryAndroidHardwareBufferANDROID)(VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct AHardwareBuffer** pBuffer); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetAndroidHardwareBufferPropertiesANDROID( + VkDevice device, + const struct AHardwareBuffer* buffer, + VkAndroidHardwareBufferPropertiesANDROID* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryAndroidHardwareBufferANDROID( + VkDevice device, + const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, + struct AHardwareBuffer** pBuffer); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extlibs/headers/vulkan/vulkan_core.h b/extlibs/headers/vulkan/vulkan_core.h new file mode 100644 index 00000000..8891ca46 --- /dev/null +++ b/extlibs/headers/vulkan/vulkan_core.h @@ -0,0 +1,7801 @@ +#ifndef VULKAN_CORE_H_ +#define VULKAN_CORE_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2015-2018 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. +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#define VK_VERSION_1_0 1 +#include "vk_platform.h" + +#define VK_MAKE_VERSION(major, minor, patch) \ + (((major) << 22) | ((minor) << 12) | (patch)) + +// 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 + +#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) +// Version of this file +#define VK_HEADER_VERSION 83 + + +#define VK_NULL_HANDLE 0 + + + +#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 + + + +typedef uint32_t VkFlags; +typedef uint32_t VkBool32; +typedef uint64_t VkDeviceSize; +typedef uint32_t VkSampleMask; + +VK_DEFINE_HANDLE(VkInstance) +VK_DEFINE_HANDLE(VkPhysicalDevice) +VK_DEFINE_HANDLE(VkDevice) +VK_DEFINE_HANDLE(VkQueue) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSemaphore) +VK_DEFINE_HANDLE(VkCommandBuffer) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFence) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDeviceMemory) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBuffer) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkEvent) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkQueryPool) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferView) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImageView) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShaderModule) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineCache) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineLayout) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkRenderPass) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipeline) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSetLayout) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSampler) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorPool) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSet) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool) + +#define VK_LOD_CLAMP_NONE 1000.0f +#define VK_REMAINING_MIP_LEVELS (~0U) +#define VK_REMAINING_ARRAY_LAYERS (~0U) +#define VK_WHOLE_SIZE (~0ULL) +#define VK_ATTACHMENT_UNUSED (~0U) +#define VK_TRUE 1 +#define VK_FALSE 0 +#define VK_QUEUE_FAMILY_IGNORED (~0U) +#define VK_SUBPASS_EXTERNAL (~0U) +#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 256 +#define VK_UUID_SIZE 16 +#define VK_MAX_MEMORY_TYPES 32 +#define VK_MAX_MEMORY_HEAPS 16 +#define VK_MAX_EXTENSION_NAME_SIZE 256 +#define VK_MAX_DESCRIPTION_SIZE 256 + + +typedef enum VkPipelineCacheHeaderVersion { + VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1, + VK_PIPELINE_CACHE_HEADER_VERSION_BEGIN_RANGE = VK_PIPELINE_CACHE_HEADER_VERSION_ONE, + VK_PIPELINE_CACHE_HEADER_VERSION_END_RANGE = VK_PIPELINE_CACHE_HEADER_VERSION_ONE, + VK_PIPELINE_CACHE_HEADER_VERSION_RANGE_SIZE = (VK_PIPELINE_CACHE_HEADER_VERSION_ONE - VK_PIPELINE_CACHE_HEADER_VERSION_ONE + 1), + VK_PIPELINE_CACHE_HEADER_VERSION_MAX_ENUM = 0x7FFFFFFF +} VkPipelineCacheHeaderVersion; + +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_OUT_OF_POOL_MEMORY = -1000069000, + VK_ERROR_INVALID_EXTERNAL_HANDLE = -1000072003, + 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_INCOMPATIBLE_DISPLAY_KHR = -1000003001, + VK_ERROR_VALIDATION_FAILED_EXT = -1000011001, + VK_ERROR_INVALID_SHADER_NV = -1000012000, + VK_ERROR_FRAGMENTATION_EXT = -1000161000, + VK_ERROR_NOT_PERMITTED_EXT = -1000174001, + VK_ERROR_OUT_OF_POOL_MEMORY_KHR = VK_ERROR_OUT_OF_POOL_MEMORY, + VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = VK_ERROR_INVALID_EXTERNAL_HANDLE, + VK_RESULT_BEGIN_RANGE = VK_ERROR_FRAGMENTED_POOL, + VK_RESULT_END_RANGE = VK_INCOMPLETE, + VK_RESULT_RANGE_SIZE = (VK_INCOMPLETE - VK_ERROR_FRAGMENTED_POOL + 1), + VK_RESULT_MAX_ENUM = 0x7FFFFFFF +} VkResult; + +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_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES = 1000094000, + VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO = 1000157000, + VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO = 1000157001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES = 1000083000, + VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS = 1000127000, + VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO = 1000127001, + VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO = 1000060000, + VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO = 1000060003, + VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO = 1000060004, + VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO = 1000060005, + VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO = 1000060006, + VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO = 1000060013, + VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO = 1000060014, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES = 1000070000, + VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO = 1000070001, + VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2 = 1000146000, + VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2 = 1000146001, + VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2 = 1000146002, + VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2 = 1000146003, + VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2 = 1000146004, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 = 1000059000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 = 1000059001, + VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2 = 1000059002, + VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2 = 1000059003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2 = 1000059004, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2 = 1000059005, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2 = 1000059006, + VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2 = 1000059007, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2 = 1000059008, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES = 1000117000, + VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO = 1000117001, + VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO = 1000117002, + VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO = 1000117003, + VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO = 1000053000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES = 1000053001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES = 1000053002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES = 1000120000, + VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO = 1000145000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES = 1000145001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES = 1000145002, + VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2 = 1000145003, + VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO = 1000156000, + VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO = 1000156001, + VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO = 1000156002, + VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO = 1000156003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES = 1000156004, + VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES = 1000156005, + VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO = 1000085000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO = 1000071000, + VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES = 1000071001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO = 1000071002, + VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES = 1000071003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES = 1000071004, + VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO = 1000072000, + VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO = 1000072001, + VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO = 1000072002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO = 1000112000, + VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES = 1000112001, + VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO = 1000113000, + VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO = 1000077000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO = 1000076000, + VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES = 1000076001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES = 1000168000, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT = 1000168001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES = 1000063000, + 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_DISPLAY_MODE_CREATE_INFO_KHR = 1000002000, + VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR = 1000002001, + VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR = 1000003000, + VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000, + VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR = 1000005000, + VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000, + VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR = 1000007000, + VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR = 1000008000, + VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000, + VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT = 1000011000, + VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD = 1000018000, + VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000, + VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001, + VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002, + VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000, + VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001, + VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002, + VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000, + VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV = 1000056000, + VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV = 1000056001, + VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057000, + VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057001, + VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000, + VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000, + VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000, + VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000, + VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001, + VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002, + VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR = 1000073003, + VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR = 1000074000, + VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR = 1000074001, + VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR = 1000074002, + VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR = 1000075000, + VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078000, + VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078001, + VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR = 1000078002, + VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR = 1000078003, + VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR = 1000079000, + VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR = 1000079001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR = 1000080000, + VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001, + VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002, + VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR = 1000084000, + VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX = 1000086000, + VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX = 1000086001, + VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX = 1000086002, + VK_STRUCTURE_TYPE_CMD_RESERVE_SPACE_FOR_COMMANDS_INFO_NVX = 1000086003, + VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_LIMITS_NVX = 1000086004, + VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_FEATURES_NVX = 1000086005, + VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV = 1000087000, + VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT = 1000090000, + VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT = 1000091000, + VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT = 1000091001, + VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT = 1000091002, + VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT = 1000091003, + VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE = 1000092000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX = 1000097000, + VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV = 1000098000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT = 1000099000, + VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT = 1000099001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT = 1000101000, + VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT = 1000101001, + VK_STRUCTURE_TYPE_HDR_METADATA_EXT = 1000105000, + VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR = 1000109000, + VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR = 1000109001, + VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR = 1000109002, + VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR = 1000109003, + VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR = 1000109004, + VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR = 1000109005, + VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR = 1000109006, + VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000, + VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000, + VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001, + VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR = 1000114002, + VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR = 1000115000, + VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR = 1000115001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR = 1000119000, + VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR = 1000119001, + VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR = 1000119002, + VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR = 1000121000, + VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR = 1000121001, + VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR = 1000121002, + VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR = 1000121003, + VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR = 1000121004, + VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK = 1000122000, + VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000, + VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT = 1000128000, + VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT = 1000128001, + VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT = 1000128002, + VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000128003, + VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000128004, + VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID = 1000129000, + VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID = 1000129001, + VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID = 1000129002, + VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129003, + VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004, + VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = 1000130000, + VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = 1000130001, + VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT = 1000143000, + VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT = 1000143001, + VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT = 1000143003, + VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT = 1000143004, + VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR = 1000147000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT = 1000148000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT = 1000148001, + VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT = 1000148002, + VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV = 1000149000, + VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV = 1000152000, + VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160000, + VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = 1000161000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = 1000161001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = 1000161002, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = 1000161003, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = 1000161004, + VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = 1000174000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = 1000177000, + VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000, + VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000, + VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001, + VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001, + VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, + VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, + VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, + VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2, + VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2, + VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, + VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO, + VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO, + VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO, + VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO, + VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHR = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO, + VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES, + VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO, + VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO, + VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES, + VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO, + VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, + VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO, + VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES, + VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, + VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO, + VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO, + VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES, + VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, + VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO, + VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES, + VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS, + VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, + VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2, + VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2, + VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2, + VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, + VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2, + VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO, + VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, + VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, + VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, + VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES, + VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO, + VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT, + VK_STRUCTURE_TYPE_BEGIN_RANGE = VK_STRUCTURE_TYPE_APPLICATION_INFO, + VK_STRUCTURE_TYPE_END_RANGE = VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO, + VK_STRUCTURE_TYPE_RANGE_SIZE = (VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO - VK_STRUCTURE_TYPE_APPLICATION_INFO + 1), + VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF +} 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, + VK_SYSTEM_ALLOCATION_SCOPE_BEGIN_RANGE = VK_SYSTEM_ALLOCATION_SCOPE_COMMAND, + VK_SYSTEM_ALLOCATION_SCOPE_END_RANGE = VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE, + VK_SYSTEM_ALLOCATION_SCOPE_RANGE_SIZE = (VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE - VK_SYSTEM_ALLOCATION_SCOPE_COMMAND + 1), + VK_SYSTEM_ALLOCATION_SCOPE_MAX_ENUM = 0x7FFFFFFF +} VkSystemAllocationScope; + +typedef enum VkInternalAllocationType { + VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE = 0, + VK_INTERNAL_ALLOCATION_TYPE_BEGIN_RANGE = VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE, + VK_INTERNAL_ALLOCATION_TYPE_END_RANGE = VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE, + VK_INTERNAL_ALLOCATION_TYPE_RANGE_SIZE = (VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE - VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE + 1), + VK_INTERNAL_ALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkInternalAllocationType; + +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, + VK_FORMAT_G8B8G8R8_422_UNORM = 1000156000, + VK_FORMAT_B8G8R8G8_422_UNORM = 1000156001, + VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM = 1000156002, + VK_FORMAT_G8_B8R8_2PLANE_420_UNORM = 1000156003, + VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM = 1000156004, + VK_FORMAT_G8_B8R8_2PLANE_422_UNORM = 1000156005, + VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM = 1000156006, + VK_FORMAT_R10X6_UNORM_PACK16 = 1000156007, + VK_FORMAT_R10X6G10X6_UNORM_2PACK16 = 1000156008, + VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 = 1000156009, + VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 = 1000156010, + VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 = 1000156011, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16 = 1000156012, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16 = 1000156013, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16 = 1000156014, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16 = 1000156015, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16 = 1000156016, + VK_FORMAT_R12X4_UNORM_PACK16 = 1000156017, + VK_FORMAT_R12X4G12X4_UNORM_2PACK16 = 1000156018, + VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 = 1000156019, + VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 = 1000156020, + VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 = 1000156021, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16 = 1000156022, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16 = 1000156023, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16 = 1000156024, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16 = 1000156025, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16 = 1000156026, + VK_FORMAT_G16B16G16R16_422_UNORM = 1000156027, + VK_FORMAT_B16G16R16G16_422_UNORM = 1000156028, + VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM = 1000156029, + VK_FORMAT_G16_B16R16_2PLANE_420_UNORM = 1000156030, + VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM = 1000156031, + VK_FORMAT_G16_B16R16_2PLANE_422_UNORM = 1000156032, + VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM = 1000156033, + VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000, + VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001, + VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002, + VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = 1000054003, + VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = 1000054004, + VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005, + VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006, + VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007, + VK_FORMAT_G8B8G8R8_422_UNORM_KHR = VK_FORMAT_G8B8G8R8_422_UNORM, + VK_FORMAT_B8G8R8G8_422_UNORM_KHR = VK_FORMAT_B8G8R8G8_422_UNORM, + VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, + VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, + VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM, + VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM, + VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR = VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM, + VK_FORMAT_R10X6_UNORM_PACK16_KHR = VK_FORMAT_R10X6_UNORM_PACK16, + VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR = VK_FORMAT_R10X6G10X6_UNORM_2PACK16, + VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR = VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, + VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR = VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16, + VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR = VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16, + VK_FORMAT_R12X4_UNORM_PACK16_KHR = VK_FORMAT_R12X4_UNORM_PACK16, + VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR = VK_FORMAT_R12X4G12X4_UNORM_2PACK16, + VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR = VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16, + VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR = VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16, + VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR = VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16, + VK_FORMAT_G16B16G16R16_422_UNORM_KHR = VK_FORMAT_G16B16G16R16_422_UNORM, + VK_FORMAT_B16G16R16G16_422_UNORM_KHR = VK_FORMAT_B16G16R16G16_422_UNORM, + VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR = VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, + VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR = VK_FORMAT_G16_B16R16_2PLANE_420_UNORM, + VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR = VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, + VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR = VK_FORMAT_G16_B16R16_2PLANE_422_UNORM, + VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR = VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, + VK_FORMAT_BEGIN_RANGE = VK_FORMAT_UNDEFINED, + VK_FORMAT_END_RANGE = VK_FORMAT_ASTC_12x12_SRGB_BLOCK, + VK_FORMAT_RANGE_SIZE = (VK_FORMAT_ASTC_12x12_SRGB_BLOCK - VK_FORMAT_UNDEFINED + 1), + VK_FORMAT_MAX_ENUM = 0x7FFFFFFF +} VkFormat; + +typedef enum VkImageType { + VK_IMAGE_TYPE_1D = 0, + VK_IMAGE_TYPE_2D = 1, + VK_IMAGE_TYPE_3D = 2, + VK_IMAGE_TYPE_BEGIN_RANGE = VK_IMAGE_TYPE_1D, + VK_IMAGE_TYPE_END_RANGE = VK_IMAGE_TYPE_3D, + VK_IMAGE_TYPE_RANGE_SIZE = (VK_IMAGE_TYPE_3D - VK_IMAGE_TYPE_1D + 1), + VK_IMAGE_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkImageType; + +typedef enum VkImageTiling { + VK_IMAGE_TILING_OPTIMAL = 0, + VK_IMAGE_TILING_LINEAR = 1, + VK_IMAGE_TILING_BEGIN_RANGE = VK_IMAGE_TILING_OPTIMAL, + VK_IMAGE_TILING_END_RANGE = VK_IMAGE_TILING_LINEAR, + VK_IMAGE_TILING_RANGE_SIZE = (VK_IMAGE_TILING_LINEAR - VK_IMAGE_TILING_OPTIMAL + 1), + VK_IMAGE_TILING_MAX_ENUM = 0x7FFFFFFF +} VkImageTiling; + +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, + VK_PHYSICAL_DEVICE_TYPE_BEGIN_RANGE = VK_PHYSICAL_DEVICE_TYPE_OTHER, + VK_PHYSICAL_DEVICE_TYPE_END_RANGE = VK_PHYSICAL_DEVICE_TYPE_CPU, + VK_PHYSICAL_DEVICE_TYPE_RANGE_SIZE = (VK_PHYSICAL_DEVICE_TYPE_CPU - VK_PHYSICAL_DEVICE_TYPE_OTHER + 1), + VK_PHYSICAL_DEVICE_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkPhysicalDeviceType; + +typedef enum VkQueryType { + VK_QUERY_TYPE_OCCLUSION = 0, + VK_QUERY_TYPE_PIPELINE_STATISTICS = 1, + VK_QUERY_TYPE_TIMESTAMP = 2, + VK_QUERY_TYPE_BEGIN_RANGE = VK_QUERY_TYPE_OCCLUSION, + VK_QUERY_TYPE_END_RANGE = VK_QUERY_TYPE_TIMESTAMP, + VK_QUERY_TYPE_RANGE_SIZE = (VK_QUERY_TYPE_TIMESTAMP - VK_QUERY_TYPE_OCCLUSION + 1), + VK_QUERY_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkQueryType; + +typedef enum VkSharingMode { + VK_SHARING_MODE_EXCLUSIVE = 0, + VK_SHARING_MODE_CONCURRENT = 1, + VK_SHARING_MODE_BEGIN_RANGE = VK_SHARING_MODE_EXCLUSIVE, + VK_SHARING_MODE_END_RANGE = VK_SHARING_MODE_CONCURRENT, + VK_SHARING_MODE_RANGE_SIZE = (VK_SHARING_MODE_CONCURRENT - VK_SHARING_MODE_EXCLUSIVE + 1), + VK_SHARING_MODE_MAX_ENUM = 0x7FFFFFFF +} VkSharingMode; + +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_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL = 1000117000, + VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL = 1000117001, + VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002, + VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000, + VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_BEGIN_RANGE = VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_END_RANGE = VK_IMAGE_LAYOUT_PREINITIALIZED, + VK_IMAGE_LAYOUT_RANGE_SIZE = (VK_IMAGE_LAYOUT_PREINITIALIZED - VK_IMAGE_LAYOUT_UNDEFINED + 1), + VK_IMAGE_LAYOUT_MAX_ENUM = 0x7FFFFFFF +} VkImageLayout; + +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, + VK_IMAGE_VIEW_TYPE_BEGIN_RANGE = VK_IMAGE_VIEW_TYPE_1D, + VK_IMAGE_VIEW_TYPE_END_RANGE = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, + VK_IMAGE_VIEW_TYPE_RANGE_SIZE = (VK_IMAGE_VIEW_TYPE_CUBE_ARRAY - VK_IMAGE_VIEW_TYPE_1D + 1), + VK_IMAGE_VIEW_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkImageViewType; + +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, + VK_COMPONENT_SWIZZLE_BEGIN_RANGE = VK_COMPONENT_SWIZZLE_IDENTITY, + VK_COMPONENT_SWIZZLE_END_RANGE = VK_COMPONENT_SWIZZLE_A, + VK_COMPONENT_SWIZZLE_RANGE_SIZE = (VK_COMPONENT_SWIZZLE_A - VK_COMPONENT_SWIZZLE_IDENTITY + 1), + VK_COMPONENT_SWIZZLE_MAX_ENUM = 0x7FFFFFFF +} VkComponentSwizzle; + +typedef enum VkVertexInputRate { + VK_VERTEX_INPUT_RATE_VERTEX = 0, + VK_VERTEX_INPUT_RATE_INSTANCE = 1, + VK_VERTEX_INPUT_RATE_BEGIN_RANGE = VK_VERTEX_INPUT_RATE_VERTEX, + VK_VERTEX_INPUT_RATE_END_RANGE = VK_VERTEX_INPUT_RATE_INSTANCE, + VK_VERTEX_INPUT_RATE_RANGE_SIZE = (VK_VERTEX_INPUT_RATE_INSTANCE - VK_VERTEX_INPUT_RATE_VERTEX + 1), + VK_VERTEX_INPUT_RATE_MAX_ENUM = 0x7FFFFFFF +} VkVertexInputRate; + +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, + VK_PRIMITIVE_TOPOLOGY_BEGIN_RANGE = VK_PRIMITIVE_TOPOLOGY_POINT_LIST, + VK_PRIMITIVE_TOPOLOGY_END_RANGE = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, + VK_PRIMITIVE_TOPOLOGY_RANGE_SIZE = (VK_PRIMITIVE_TOPOLOGY_PATCH_LIST - VK_PRIMITIVE_TOPOLOGY_POINT_LIST + 1), + VK_PRIMITIVE_TOPOLOGY_MAX_ENUM = 0x7FFFFFFF +} VkPrimitiveTopology; + +typedef enum VkPolygonMode { + VK_POLYGON_MODE_FILL = 0, + VK_POLYGON_MODE_LINE = 1, + VK_POLYGON_MODE_POINT = 2, + VK_POLYGON_MODE_FILL_RECTANGLE_NV = 1000153000, + VK_POLYGON_MODE_BEGIN_RANGE = VK_POLYGON_MODE_FILL, + VK_POLYGON_MODE_END_RANGE = VK_POLYGON_MODE_POINT, + VK_POLYGON_MODE_RANGE_SIZE = (VK_POLYGON_MODE_POINT - VK_POLYGON_MODE_FILL + 1), + VK_POLYGON_MODE_MAX_ENUM = 0x7FFFFFFF +} VkPolygonMode; + +typedef enum VkFrontFace { + VK_FRONT_FACE_COUNTER_CLOCKWISE = 0, + VK_FRONT_FACE_CLOCKWISE = 1, + VK_FRONT_FACE_BEGIN_RANGE = VK_FRONT_FACE_COUNTER_CLOCKWISE, + VK_FRONT_FACE_END_RANGE = VK_FRONT_FACE_CLOCKWISE, + VK_FRONT_FACE_RANGE_SIZE = (VK_FRONT_FACE_CLOCKWISE - VK_FRONT_FACE_COUNTER_CLOCKWISE + 1), + VK_FRONT_FACE_MAX_ENUM = 0x7FFFFFFF +} VkFrontFace; + +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, + VK_COMPARE_OP_BEGIN_RANGE = VK_COMPARE_OP_NEVER, + VK_COMPARE_OP_END_RANGE = VK_COMPARE_OP_ALWAYS, + VK_COMPARE_OP_RANGE_SIZE = (VK_COMPARE_OP_ALWAYS - VK_COMPARE_OP_NEVER + 1), + VK_COMPARE_OP_MAX_ENUM = 0x7FFFFFFF +} VkCompareOp; + +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, + VK_STENCIL_OP_BEGIN_RANGE = VK_STENCIL_OP_KEEP, + VK_STENCIL_OP_END_RANGE = VK_STENCIL_OP_DECREMENT_AND_WRAP, + VK_STENCIL_OP_RANGE_SIZE = (VK_STENCIL_OP_DECREMENT_AND_WRAP - VK_STENCIL_OP_KEEP + 1), + VK_STENCIL_OP_MAX_ENUM = 0x7FFFFFFF +} VkStencilOp; + +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, + VK_LOGIC_OP_BEGIN_RANGE = VK_LOGIC_OP_CLEAR, + VK_LOGIC_OP_END_RANGE = VK_LOGIC_OP_SET, + VK_LOGIC_OP_RANGE_SIZE = (VK_LOGIC_OP_SET - VK_LOGIC_OP_CLEAR + 1), + VK_LOGIC_OP_MAX_ENUM = 0x7FFFFFFF +} VkLogicOp; + +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, + VK_BLEND_FACTOR_BEGIN_RANGE = VK_BLEND_FACTOR_ZERO, + VK_BLEND_FACTOR_END_RANGE = VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, + VK_BLEND_FACTOR_RANGE_SIZE = (VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA - VK_BLEND_FACTOR_ZERO + 1), + VK_BLEND_FACTOR_MAX_ENUM = 0x7FFFFFFF +} 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, + VK_BLEND_OP_ZERO_EXT = 1000148000, + VK_BLEND_OP_SRC_EXT = 1000148001, + VK_BLEND_OP_DST_EXT = 1000148002, + VK_BLEND_OP_SRC_OVER_EXT = 1000148003, + VK_BLEND_OP_DST_OVER_EXT = 1000148004, + VK_BLEND_OP_SRC_IN_EXT = 1000148005, + VK_BLEND_OP_DST_IN_EXT = 1000148006, + VK_BLEND_OP_SRC_OUT_EXT = 1000148007, + VK_BLEND_OP_DST_OUT_EXT = 1000148008, + VK_BLEND_OP_SRC_ATOP_EXT = 1000148009, + VK_BLEND_OP_DST_ATOP_EXT = 1000148010, + VK_BLEND_OP_XOR_EXT = 1000148011, + VK_BLEND_OP_MULTIPLY_EXT = 1000148012, + VK_BLEND_OP_SCREEN_EXT = 1000148013, + VK_BLEND_OP_OVERLAY_EXT = 1000148014, + VK_BLEND_OP_DARKEN_EXT = 1000148015, + VK_BLEND_OP_LIGHTEN_EXT = 1000148016, + VK_BLEND_OP_COLORDODGE_EXT = 1000148017, + VK_BLEND_OP_COLORBURN_EXT = 1000148018, + VK_BLEND_OP_HARDLIGHT_EXT = 1000148019, + VK_BLEND_OP_SOFTLIGHT_EXT = 1000148020, + VK_BLEND_OP_DIFFERENCE_EXT = 1000148021, + VK_BLEND_OP_EXCLUSION_EXT = 1000148022, + VK_BLEND_OP_INVERT_EXT = 1000148023, + VK_BLEND_OP_INVERT_RGB_EXT = 1000148024, + VK_BLEND_OP_LINEARDODGE_EXT = 1000148025, + VK_BLEND_OP_LINEARBURN_EXT = 1000148026, + VK_BLEND_OP_VIVIDLIGHT_EXT = 1000148027, + VK_BLEND_OP_LINEARLIGHT_EXT = 1000148028, + VK_BLEND_OP_PINLIGHT_EXT = 1000148029, + VK_BLEND_OP_HARDMIX_EXT = 1000148030, + VK_BLEND_OP_HSL_HUE_EXT = 1000148031, + VK_BLEND_OP_HSL_SATURATION_EXT = 1000148032, + VK_BLEND_OP_HSL_COLOR_EXT = 1000148033, + VK_BLEND_OP_HSL_LUMINOSITY_EXT = 1000148034, + VK_BLEND_OP_PLUS_EXT = 1000148035, + VK_BLEND_OP_PLUS_CLAMPED_EXT = 1000148036, + VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT = 1000148037, + VK_BLEND_OP_PLUS_DARKER_EXT = 1000148038, + VK_BLEND_OP_MINUS_EXT = 1000148039, + VK_BLEND_OP_MINUS_CLAMPED_EXT = 1000148040, + VK_BLEND_OP_CONTRAST_EXT = 1000148041, + VK_BLEND_OP_INVERT_OVG_EXT = 1000148042, + VK_BLEND_OP_RED_EXT = 1000148043, + VK_BLEND_OP_GREEN_EXT = 1000148044, + VK_BLEND_OP_BLUE_EXT = 1000148045, + VK_BLEND_OP_BEGIN_RANGE = VK_BLEND_OP_ADD, + VK_BLEND_OP_END_RANGE = VK_BLEND_OP_MAX, + VK_BLEND_OP_RANGE_SIZE = (VK_BLEND_OP_MAX - VK_BLEND_OP_ADD + 1), + VK_BLEND_OP_MAX_ENUM = 0x7FFFFFFF +} VkBlendOp; + +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, + VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV = 1000087000, + VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT = 1000099000, + VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT = 1000143000, + VK_DYNAMIC_STATE_BEGIN_RANGE = VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_END_RANGE = VK_DYNAMIC_STATE_STENCIL_REFERENCE, + VK_DYNAMIC_STATE_RANGE_SIZE = (VK_DYNAMIC_STATE_STENCIL_REFERENCE - VK_DYNAMIC_STATE_VIEWPORT + 1), + VK_DYNAMIC_STATE_MAX_ENUM = 0x7FFFFFFF +} VkDynamicState; + +typedef enum VkFilter { + VK_FILTER_NEAREST = 0, + VK_FILTER_LINEAR = 1, + VK_FILTER_CUBIC_IMG = 1000015000, + VK_FILTER_BEGIN_RANGE = VK_FILTER_NEAREST, + VK_FILTER_END_RANGE = VK_FILTER_LINEAR, + VK_FILTER_RANGE_SIZE = (VK_FILTER_LINEAR - VK_FILTER_NEAREST + 1), + VK_FILTER_MAX_ENUM = 0x7FFFFFFF +} VkFilter; + +typedef enum VkSamplerMipmapMode { + VK_SAMPLER_MIPMAP_MODE_NEAREST = 0, + VK_SAMPLER_MIPMAP_MODE_LINEAR = 1, + VK_SAMPLER_MIPMAP_MODE_BEGIN_RANGE = VK_SAMPLER_MIPMAP_MODE_NEAREST, + VK_SAMPLER_MIPMAP_MODE_END_RANGE = VK_SAMPLER_MIPMAP_MODE_LINEAR, + VK_SAMPLER_MIPMAP_MODE_RANGE_SIZE = (VK_SAMPLER_MIPMAP_MODE_LINEAR - VK_SAMPLER_MIPMAP_MODE_NEAREST + 1), + VK_SAMPLER_MIPMAP_MODE_MAX_ENUM = 0x7FFFFFFF +} VkSamplerMipmapMode; + +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, + VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4, + VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE = VK_SAMPLER_ADDRESS_MODE_REPEAT, + VK_SAMPLER_ADDRESS_MODE_END_RANGE = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, + VK_SAMPLER_ADDRESS_MODE_RANGE_SIZE = (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER - VK_SAMPLER_ADDRESS_MODE_REPEAT + 1), + VK_SAMPLER_ADDRESS_MODE_MAX_ENUM = 0x7FFFFFFF +} VkSamplerAddressMode; + +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, + VK_BORDER_COLOR_BEGIN_RANGE = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, + VK_BORDER_COLOR_END_RANGE = VK_BORDER_COLOR_INT_OPAQUE_WHITE, + VK_BORDER_COLOR_RANGE_SIZE = (VK_BORDER_COLOR_INT_OPAQUE_WHITE - VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK + 1), + VK_BORDER_COLOR_MAX_ENUM = 0x7FFFFFFF +} VkBorderColor; + +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, + VK_DESCRIPTOR_TYPE_BEGIN_RANGE = VK_DESCRIPTOR_TYPE_SAMPLER, + VK_DESCRIPTOR_TYPE_END_RANGE = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, + VK_DESCRIPTOR_TYPE_RANGE_SIZE = (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT - VK_DESCRIPTOR_TYPE_SAMPLER + 1), + VK_DESCRIPTOR_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkDescriptorType; + +typedef enum VkAttachmentLoadOp { + VK_ATTACHMENT_LOAD_OP_LOAD = 0, + VK_ATTACHMENT_LOAD_OP_CLEAR = 1, + VK_ATTACHMENT_LOAD_OP_DONT_CARE = 2, + VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE = VK_ATTACHMENT_LOAD_OP_LOAD, + VK_ATTACHMENT_LOAD_OP_END_RANGE = VK_ATTACHMENT_LOAD_OP_DONT_CARE, + VK_ATTACHMENT_LOAD_OP_RANGE_SIZE = (VK_ATTACHMENT_LOAD_OP_DONT_CARE - VK_ATTACHMENT_LOAD_OP_LOAD + 1), + VK_ATTACHMENT_LOAD_OP_MAX_ENUM = 0x7FFFFFFF +} VkAttachmentLoadOp; + +typedef enum VkAttachmentStoreOp { + VK_ATTACHMENT_STORE_OP_STORE = 0, + VK_ATTACHMENT_STORE_OP_DONT_CARE = 1, + VK_ATTACHMENT_STORE_OP_BEGIN_RANGE = VK_ATTACHMENT_STORE_OP_STORE, + VK_ATTACHMENT_STORE_OP_END_RANGE = VK_ATTACHMENT_STORE_OP_DONT_CARE, + VK_ATTACHMENT_STORE_OP_RANGE_SIZE = (VK_ATTACHMENT_STORE_OP_DONT_CARE - VK_ATTACHMENT_STORE_OP_STORE + 1), + VK_ATTACHMENT_STORE_OP_MAX_ENUM = 0x7FFFFFFF +} VkAttachmentStoreOp; + +typedef enum VkPipelineBindPoint { + VK_PIPELINE_BIND_POINT_GRAPHICS = 0, + VK_PIPELINE_BIND_POINT_COMPUTE = 1, + VK_PIPELINE_BIND_POINT_BEGIN_RANGE = VK_PIPELINE_BIND_POINT_GRAPHICS, + VK_PIPELINE_BIND_POINT_END_RANGE = VK_PIPELINE_BIND_POINT_COMPUTE, + VK_PIPELINE_BIND_POINT_RANGE_SIZE = (VK_PIPELINE_BIND_POINT_COMPUTE - VK_PIPELINE_BIND_POINT_GRAPHICS + 1), + VK_PIPELINE_BIND_POINT_MAX_ENUM = 0x7FFFFFFF +} VkPipelineBindPoint; + +typedef enum VkCommandBufferLevel { + VK_COMMAND_BUFFER_LEVEL_PRIMARY = 0, + VK_COMMAND_BUFFER_LEVEL_SECONDARY = 1, + VK_COMMAND_BUFFER_LEVEL_BEGIN_RANGE = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + VK_COMMAND_BUFFER_LEVEL_END_RANGE = VK_COMMAND_BUFFER_LEVEL_SECONDARY, + VK_COMMAND_BUFFER_LEVEL_RANGE_SIZE = (VK_COMMAND_BUFFER_LEVEL_SECONDARY - VK_COMMAND_BUFFER_LEVEL_PRIMARY + 1), + VK_COMMAND_BUFFER_LEVEL_MAX_ENUM = 0x7FFFFFFF +} VkCommandBufferLevel; + +typedef enum VkIndexType { + VK_INDEX_TYPE_UINT16 = 0, + VK_INDEX_TYPE_UINT32 = 1, + VK_INDEX_TYPE_BEGIN_RANGE = VK_INDEX_TYPE_UINT16, + VK_INDEX_TYPE_END_RANGE = VK_INDEX_TYPE_UINT32, + VK_INDEX_TYPE_RANGE_SIZE = (VK_INDEX_TYPE_UINT32 - VK_INDEX_TYPE_UINT16 + 1), + VK_INDEX_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkIndexType; + +typedef enum VkSubpassContents { + VK_SUBPASS_CONTENTS_INLINE = 0, + VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS = 1, + VK_SUBPASS_CONTENTS_BEGIN_RANGE = VK_SUBPASS_CONTENTS_INLINE, + VK_SUBPASS_CONTENTS_END_RANGE = VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS, + VK_SUBPASS_CONTENTS_RANGE_SIZE = (VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS - VK_SUBPASS_CONTENTS_INLINE + 1), + VK_SUBPASS_CONTENTS_MAX_ENUM = 0x7FFFFFFF +} VkSubpassContents; + +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_SAMPLER_YCBCR_CONVERSION = 1000156000, + VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE = 1000085000, + VK_OBJECT_TYPE_SURFACE_KHR = 1000000000, + VK_OBJECT_TYPE_SWAPCHAIN_KHR = 1000001000, + VK_OBJECT_TYPE_DISPLAY_KHR = 1000002000, + VK_OBJECT_TYPE_DISPLAY_MODE_KHR = 1000002001, + VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT = 1000011000, + VK_OBJECT_TYPE_OBJECT_TABLE_NVX = 1000086000, + VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX = 1000086001, + VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000, + VK_OBJECT_TYPE_VALIDATION_CACHE_EXT = 1000160000, + VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE, + VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION, + VK_OBJECT_TYPE_BEGIN_RANGE = VK_OBJECT_TYPE_UNKNOWN, + VK_OBJECT_TYPE_END_RANGE = VK_OBJECT_TYPE_COMMAND_POOL, + VK_OBJECT_TYPE_RANGE_SIZE = (VK_OBJECT_TYPE_COMMAND_POOL - VK_OBJECT_TYPE_UNKNOWN + 1), + VK_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkObjectType; + +typedef enum VkVendorId { + VK_VENDOR_ID_VIV = 0x10001, + VK_VENDOR_ID_VSI = 0x10002, + VK_VENDOR_ID_KAZAN = 0x10003, + VK_VENDOR_ID_BEGIN_RANGE = VK_VENDOR_ID_VIV, + VK_VENDOR_ID_END_RANGE = VK_VENDOR_ID_KAZAN, + VK_VENDOR_ID_RANGE_SIZE = (VK_VENDOR_ID_KAZAN - VK_VENDOR_ID_VIV + 1), + VK_VENDOR_ID_MAX_ENUM = 0x7FFFFFFF +} VkVendorId; + +typedef VkFlags VkInstanceCreateFlags; + +typedef enum VkFormatFeatureFlagBits { + VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT = 0x00000001, + VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT = 0x00000002, + VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT = 0x00000004, + VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT = 0x00000008, + VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT = 0x00000010, + VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = 0x00000020, + VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT = 0x00000040, + VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT = 0x00000080, + VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT = 0x00000100, + VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000200, + VK_FORMAT_FEATURE_BLIT_SRC_BIT = 0x00000400, + VK_FORMAT_FEATURE_BLIT_DST_BIT = 0x00000800, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 0x00001000, + VK_FORMAT_FEATURE_TRANSFER_SRC_BIT = 0x00004000, + VK_FORMAT_FEATURE_TRANSFER_DST_BIT = 0x00008000, + VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT = 0x00020000, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT = 0x00040000, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT = 0x00080000, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT = 0x00100000, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT = 0x00200000, + VK_FORMAT_FEATURE_DISJOINT_BIT = 0x00400000, + VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT = 0x00800000, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG = 0x00002000, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT = 0x00010000, + VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, + VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_DST_BIT, + VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR = VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT, + VK_FORMAT_FEATURE_DISJOINT_BIT_KHR = VK_FORMAT_FEATURE_DISJOINT_BIT, + VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT_KHR = VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT, + VK_FORMAT_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkFormatFeatureFlagBits; +typedef VkFlags VkFormatFeatureFlags; + +typedef enum VkImageUsageFlagBits { + VK_IMAGE_USAGE_TRANSFER_SRC_BIT = 0x00000001, + VK_IMAGE_USAGE_TRANSFER_DST_BIT = 0x00000002, + VK_IMAGE_USAGE_SAMPLED_BIT = 0x00000004, + VK_IMAGE_USAGE_STORAGE_BIT = 0x00000008, + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000010, + VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020, + VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040, + VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080, + VK_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkImageUsageFlagBits; +typedef VkFlags VkImageUsageFlags; + +typedef enum VkImageCreateFlagBits { + VK_IMAGE_CREATE_SPARSE_BINDING_BIT = 0x00000001, + VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002, + VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0x00000004, + VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0x00000008, + VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0x00000010, + VK_IMAGE_CREATE_ALIAS_BIT = 0x00000400, + VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT = 0x00000040, + VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT = 0x00000020, + VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT = 0x00000080, + VK_IMAGE_CREATE_EXTENDED_USAGE_BIT = 0x00000100, + VK_IMAGE_CREATE_PROTECTED_BIT = 0x00000800, + VK_IMAGE_CREATE_DISJOINT_BIT = 0x00000200, + VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT = 0x00001000, + VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT, + VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR = VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT, + VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR = VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, + VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR = VK_IMAGE_CREATE_EXTENDED_USAGE_BIT, + VK_IMAGE_CREATE_DISJOINT_BIT_KHR = VK_IMAGE_CREATE_DISJOINT_BIT, + VK_IMAGE_CREATE_ALIAS_BIT_KHR = VK_IMAGE_CREATE_ALIAS_BIT, + VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkImageCreateFlagBits; +typedef VkFlags VkImageCreateFlags; + +typedef enum VkSampleCountFlagBits { + VK_SAMPLE_COUNT_1_BIT = 0x00000001, + VK_SAMPLE_COUNT_2_BIT = 0x00000002, + VK_SAMPLE_COUNT_4_BIT = 0x00000004, + VK_SAMPLE_COUNT_8_BIT = 0x00000008, + VK_SAMPLE_COUNT_16_BIT = 0x00000010, + VK_SAMPLE_COUNT_32_BIT = 0x00000020, + VK_SAMPLE_COUNT_64_BIT = 0x00000040, + VK_SAMPLE_COUNT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSampleCountFlagBits; +typedef VkFlags VkSampleCountFlags; + +typedef enum VkQueueFlagBits { + VK_QUEUE_GRAPHICS_BIT = 0x00000001, + VK_QUEUE_COMPUTE_BIT = 0x00000002, + VK_QUEUE_TRANSFER_BIT = 0x00000004, + VK_QUEUE_SPARSE_BINDING_BIT = 0x00000008, + VK_QUEUE_PROTECTED_BIT = 0x00000010, + VK_QUEUE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkQueueFlagBits; +typedef VkFlags VkQueueFlags; + +typedef enum VkMemoryPropertyFlagBits { + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT = 0x00000001, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT = 0x00000002, + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT = 0x00000004, + VK_MEMORY_PROPERTY_HOST_CACHED_BIT = 0x00000008, + VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 0x00000010, + VK_MEMORY_PROPERTY_PROTECTED_BIT = 0x00000020, + VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkMemoryPropertyFlagBits; +typedef VkFlags VkMemoryPropertyFlags; + +typedef enum VkMemoryHeapFlagBits { + VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = 0x00000001, + VK_MEMORY_HEAP_MULTI_INSTANCE_BIT = 0x00000002, + VK_MEMORY_HEAP_MULTI_INSTANCE_BIT_KHR = VK_MEMORY_HEAP_MULTI_INSTANCE_BIT, + VK_MEMORY_HEAP_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkMemoryHeapFlagBits; +typedef VkFlags VkMemoryHeapFlags; +typedef VkFlags VkDeviceCreateFlags; + +typedef enum VkDeviceQueueCreateFlagBits { + VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT = 0x00000001, + VK_DEVICE_QUEUE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkDeviceQueueCreateFlagBits; +typedef VkFlags VkDeviceQueueCreateFlags; + +typedef enum VkPipelineStageFlagBits { + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT = 0x00000001, + VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT = 0x00000002, + VK_PIPELINE_STAGE_VERTEX_INPUT_BIT = 0x00000004, + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT = 0x00000008, + VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT = 0x00000010, + VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT = 0x00000020, + VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT = 0x00000040, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT = 0x00000080, + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT = 0x00000100, + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT = 0x00000200, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = 0x00000400, + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT = 0x00000800, + VK_PIPELINE_STAGE_TRANSFER_BIT = 0x00001000, + VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT = 0x00002000, + VK_PIPELINE_STAGE_HOST_BIT = 0x00004000, + VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT = 0x00008000, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT = 0x00010000, + VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000, + VK_PIPELINE_STAGE_COMMAND_PROCESS_BIT_NVX = 0x00020000, + VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkPipelineStageFlagBits; +typedef VkFlags VkPipelineStageFlags; +typedef VkFlags VkMemoryMapFlags; + +typedef enum VkImageAspectFlagBits { + VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001, + VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002, + VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004, + VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008, + VK_IMAGE_ASPECT_PLANE_0_BIT = 0x00000010, + VK_IMAGE_ASPECT_PLANE_1_BIT = 0x00000020, + VK_IMAGE_ASPECT_PLANE_2_BIT = 0x00000040, + VK_IMAGE_ASPECT_PLANE_0_BIT_KHR = VK_IMAGE_ASPECT_PLANE_0_BIT, + VK_IMAGE_ASPECT_PLANE_1_BIT_KHR = VK_IMAGE_ASPECT_PLANE_1_BIT, + VK_IMAGE_ASPECT_PLANE_2_BIT_KHR = VK_IMAGE_ASPECT_PLANE_2_BIT, + VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkImageAspectFlagBits; +typedef VkFlags VkImageAspectFlags; + +typedef enum VkSparseImageFormatFlagBits { + VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT = 0x00000001, + VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT = 0x00000002, + VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT = 0x00000004, + VK_SPARSE_IMAGE_FORMAT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSparseImageFormatFlagBits; +typedef VkFlags VkSparseImageFormatFlags; + +typedef enum VkSparseMemoryBindFlagBits { + VK_SPARSE_MEMORY_BIND_METADATA_BIT = 0x00000001, + VK_SPARSE_MEMORY_BIND_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSparseMemoryBindFlagBits; +typedef VkFlags VkSparseMemoryBindFlags; + +typedef enum VkFenceCreateFlagBits { + VK_FENCE_CREATE_SIGNALED_BIT = 0x00000001, + VK_FENCE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkFenceCreateFlagBits; +typedef VkFlags VkFenceCreateFlags; +typedef VkFlags VkSemaphoreCreateFlags; +typedef VkFlags VkEventCreateFlags; +typedef VkFlags VkQueryPoolCreateFlags; + +typedef enum VkQueryPipelineStatisticFlagBits { + VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT = 0x00000001, + VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT = 0x00000002, + VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT = 0x00000004, + VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT = 0x00000008, + VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT = 0x00000010, + VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT = 0x00000020, + VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT = 0x00000040, + VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT = 0x00000080, + VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT = 0x00000100, + VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT = 0x00000200, + VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = 0x00000400, + VK_QUERY_PIPELINE_STATISTIC_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkQueryPipelineStatisticFlagBits; +typedef VkFlags VkQueryPipelineStatisticFlags; + +typedef enum VkQueryResultFlagBits { + VK_QUERY_RESULT_64_BIT = 0x00000001, + VK_QUERY_RESULT_WAIT_BIT = 0x00000002, + VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0x00000004, + VK_QUERY_RESULT_PARTIAL_BIT = 0x00000008, + VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkQueryResultFlagBits; +typedef VkFlags VkQueryResultFlags; + +typedef enum VkBufferCreateFlagBits { + VK_BUFFER_CREATE_SPARSE_BINDING_BIT = 0x00000001, + VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002, + VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0x00000004, + VK_BUFFER_CREATE_PROTECTED_BIT = 0x00000008, + VK_BUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkBufferCreateFlagBits; +typedef VkFlags VkBufferCreateFlags; + +typedef enum VkBufferUsageFlagBits { + VK_BUFFER_USAGE_TRANSFER_SRC_BIT = 0x00000001, + VK_BUFFER_USAGE_TRANSFER_DST_BIT = 0x00000002, + VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004, + VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = 0x00000008, + VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = 0x00000010, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = 0x00000020, + VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 0x00000040, + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080, + VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100, + VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200, + VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkBufferUsageFlagBits; +typedef VkFlags VkBufferUsageFlags; +typedef VkFlags VkBufferViewCreateFlags; +typedef VkFlags VkImageViewCreateFlags; +typedef VkFlags VkShaderModuleCreateFlags; +typedef VkFlags VkPipelineCacheCreateFlags; + +typedef enum VkPipelineCreateFlagBits { + VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0x00000001, + VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 0x00000002, + VK_PIPELINE_CREATE_DERIVATIVE_BIT = 0x00000004, + VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT = 0x00000008, + VK_PIPELINE_CREATE_DISPATCH_BASE = 0x00000010, + VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR = VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT, + VK_PIPELINE_CREATE_DISPATCH_BASE_KHR = VK_PIPELINE_CREATE_DISPATCH_BASE, + VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkPipelineCreateFlagBits; +typedef VkFlags VkPipelineCreateFlags; +typedef VkFlags VkPipelineShaderStageCreateFlags; + +typedef enum VkShaderStageFlagBits { + VK_SHADER_STAGE_VERTEX_BIT = 0x00000001, + VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = 0x00000002, + VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = 0x00000004, + VK_SHADER_STAGE_GEOMETRY_BIT = 0x00000008, + VK_SHADER_STAGE_FRAGMENT_BIT = 0x00000010, + VK_SHADER_STAGE_COMPUTE_BIT = 0x00000020, + VK_SHADER_STAGE_ALL_GRAPHICS = 0x0000001F, + VK_SHADER_STAGE_ALL = 0x7FFFFFFF, + VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkShaderStageFlagBits; +typedef VkFlags VkPipelineVertexInputStateCreateFlags; +typedef VkFlags VkPipelineInputAssemblyStateCreateFlags; +typedef VkFlags VkPipelineTessellationStateCreateFlags; +typedef VkFlags VkPipelineViewportStateCreateFlags; +typedef VkFlags VkPipelineRasterizationStateCreateFlags; + +typedef enum VkCullModeFlagBits { + VK_CULL_MODE_NONE = 0, + VK_CULL_MODE_FRONT_BIT = 0x00000001, + VK_CULL_MODE_BACK_BIT = 0x00000002, + VK_CULL_MODE_FRONT_AND_BACK = 0x00000003, + VK_CULL_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCullModeFlagBits; +typedef VkFlags VkCullModeFlags; +typedef VkFlags VkPipelineMultisampleStateCreateFlags; +typedef VkFlags VkPipelineDepthStencilStateCreateFlags; +typedef VkFlags VkPipelineColorBlendStateCreateFlags; + +typedef enum VkColorComponentFlagBits { + VK_COLOR_COMPONENT_R_BIT = 0x00000001, + VK_COLOR_COMPONENT_G_BIT = 0x00000002, + VK_COLOR_COMPONENT_B_BIT = 0x00000004, + VK_COLOR_COMPONENT_A_BIT = 0x00000008, + VK_COLOR_COMPONENT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkColorComponentFlagBits; +typedef VkFlags VkColorComponentFlags; +typedef VkFlags VkPipelineDynamicStateCreateFlags; +typedef VkFlags VkPipelineLayoutCreateFlags; +typedef VkFlags VkShaderStageFlags; +typedef VkFlags VkSamplerCreateFlags; + +typedef enum VkDescriptorSetLayoutCreateFlagBits { + VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR = 0x00000001, + VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT = 0x00000002, + VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkDescriptorSetLayoutCreateFlagBits; +typedef VkFlags VkDescriptorSetLayoutCreateFlags; + +typedef enum VkDescriptorPoolCreateFlagBits { + VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 0x00000001, + VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT = 0x00000002, + VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkDescriptorPoolCreateFlagBits; +typedef VkFlags VkDescriptorPoolCreateFlags; +typedef VkFlags VkDescriptorPoolResetFlags; +typedef VkFlags VkFramebufferCreateFlags; +typedef VkFlags VkRenderPassCreateFlags; + +typedef enum VkAttachmentDescriptionFlagBits { + VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = 0x00000001, + VK_ATTACHMENT_DESCRIPTION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkAttachmentDescriptionFlagBits; +typedef VkFlags VkAttachmentDescriptionFlags; + +typedef enum VkSubpassDescriptionFlagBits { + VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX = 0x00000001, + VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX = 0x00000002, + VK_SUBPASS_DESCRIPTION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSubpassDescriptionFlagBits; +typedef VkFlags VkSubpassDescriptionFlags; + +typedef enum VkAccessFlagBits { + VK_ACCESS_INDIRECT_COMMAND_READ_BIT = 0x00000001, + VK_ACCESS_INDEX_READ_BIT = 0x00000002, + VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT = 0x00000004, + VK_ACCESS_UNIFORM_READ_BIT = 0x00000008, + VK_ACCESS_INPUT_ATTACHMENT_READ_BIT = 0x00000010, + VK_ACCESS_SHADER_READ_BIT = 0x00000020, + VK_ACCESS_SHADER_WRITE_BIT = 0x00000040, + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = 0x00000080, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = 0x00000100, + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 0x00000200, + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 0x00000400, + VK_ACCESS_TRANSFER_READ_BIT = 0x00000800, + VK_ACCESS_TRANSFER_WRITE_BIT = 0x00001000, + VK_ACCESS_HOST_READ_BIT = 0x00002000, + VK_ACCESS_HOST_WRITE_BIT = 0x00004000, + VK_ACCESS_MEMORY_READ_BIT = 0x00008000, + VK_ACCESS_MEMORY_WRITE_BIT = 0x00010000, + VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000, + VK_ACCESS_COMMAND_PROCESS_READ_BIT_NVX = 0x00020000, + VK_ACCESS_COMMAND_PROCESS_WRITE_BIT_NVX = 0x00040000, + VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000, + VK_ACCESS_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkAccessFlagBits; +typedef VkFlags VkAccessFlags; + +typedef enum VkDependencyFlagBits { + VK_DEPENDENCY_BY_REGION_BIT = 0x00000001, + VK_DEPENDENCY_DEVICE_GROUP_BIT = 0x00000004, + VK_DEPENDENCY_VIEW_LOCAL_BIT = 0x00000002, + VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR = VK_DEPENDENCY_VIEW_LOCAL_BIT, + VK_DEPENDENCY_DEVICE_GROUP_BIT_KHR = VK_DEPENDENCY_DEVICE_GROUP_BIT, + VK_DEPENDENCY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkDependencyFlagBits; +typedef VkFlags VkDependencyFlags; + +typedef enum VkCommandPoolCreateFlagBits { + VK_COMMAND_POOL_CREATE_TRANSIENT_BIT = 0x00000001, + VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = 0x00000002, + VK_COMMAND_POOL_CREATE_PROTECTED_BIT = 0x00000004, + VK_COMMAND_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandPoolCreateFlagBits; +typedef VkFlags VkCommandPoolCreateFlags; + +typedef enum VkCommandPoolResetFlagBits { + VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT = 0x00000001, + VK_COMMAND_POOL_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandPoolResetFlagBits; +typedef VkFlags VkCommandPoolResetFlags; + +typedef enum VkCommandBufferUsageFlagBits { + VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT = 0x00000001, + VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT = 0x00000002, + VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT = 0x00000004, + VK_COMMAND_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandBufferUsageFlagBits; +typedef VkFlags VkCommandBufferUsageFlags; + +typedef enum VkQueryControlFlagBits { + VK_QUERY_CONTROL_PRECISE_BIT = 0x00000001, + VK_QUERY_CONTROL_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkQueryControlFlagBits; +typedef VkFlags VkQueryControlFlags; + +typedef enum VkCommandBufferResetFlagBits { + VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT = 0x00000001, + VK_COMMAND_BUFFER_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandBufferResetFlagBits; +typedef VkFlags VkCommandBufferResetFlags; + +typedef enum VkStencilFaceFlagBits { + VK_STENCIL_FACE_FRONT_BIT = 0x00000001, + VK_STENCIL_FACE_BACK_BIT = 0x00000002, + VK_STENCIL_FRONT_AND_BACK = 0x00000003, + VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkStencilFaceFlagBits; +typedef VkFlags VkStencilFaceFlags; + +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 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 void* (VKAPI_PTR *PFN_vkAllocationFunction)( + void* pUserData, + size_t size, + size_t alignment, + 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_vkFreeFunction)( + void* pUserData, + void* pMemory); + +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 struct VkAllocationCallbacks { + void* pUserData; + PFN_vkAllocationFunction pfnAllocation; + PFN_vkReallocationFunction pfnReallocation; + PFN_vkFreeFunction pfnFree; + PFN_vkInternalAllocationNotification pfnInternalAllocation; + PFN_vkInternalFreeNotification pfnInternalFree; +} VkAllocationCallbacks; + +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 VkFormatProperties { + VkFormatFeatureFlags linearTilingFeatures; + VkFormatFeatureFlags optimalTilingFeatures; + VkFormatFeatureFlags bufferFeatures; +} VkFormatProperties; + +typedef struct VkExtent3D { + uint32_t width; + uint32_t height; + uint32_t depth; +} VkExtent3D; + +typedef struct VkImageFormatProperties { + VkExtent3D maxExtent; + uint32_t maxMipLevels; + uint32_t maxArrayLayers; + VkSampleCountFlags sampleCounts; + VkDeviceSize maxResourceSize; +} VkImageFormatProperties; + +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 VkPhysicalDeviceSparseProperties { + VkBool32 residencyStandard2DBlockShape; + VkBool32 residencyStandard2DMultisampleBlockShape; + VkBool32 residencyStandard3DBlockShape; + VkBool32 residencyAlignedMipSize; + VkBool32 residencyNonResidentStrict; +} VkPhysicalDeviceSparseProperties; + +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 VkQueueFamilyProperties { + VkQueueFlags queueFlags; + uint32_t queueCount; + uint32_t timestampValidBits; + VkExtent3D minImageTransferGranularity; +} VkQueueFamilyProperties; + +typedef struct VkMemoryType { + VkMemoryPropertyFlags propertyFlags; + uint32_t heapIndex; +} VkMemoryType; + +typedef struct VkMemoryHeap { + VkDeviceSize size; + VkMemoryHeapFlags flags; +} VkMemoryHeap; + +typedef struct VkPhysicalDeviceMemoryProperties { + uint32_t memoryTypeCount; + VkMemoryType memoryTypes[VK_MAX_MEMORY_TYPES]; + uint32_t memoryHeapCount; + VkMemoryHeap memoryHeaps[VK_MAX_MEMORY_HEAPS]; +} VkPhysicalDeviceMemoryProperties; + +typedef void (VKAPI_PTR *PFN_vkVoidFunction)(void); +typedef struct VkDeviceQueueCreateInfo { + VkStructureType sType; + const void* pNext; + VkDeviceQueueCreateFlags flags; + uint32_t queueFamilyIndex; + uint32_t queueCount; + const float* pQueuePriorities; +} VkDeviceQueueCreateInfo; + +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 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 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 VkMemoryAllocateInfo { + VkStructureType sType; + const void* pNext; + VkDeviceSize allocationSize; + uint32_t memoryTypeIndex; +} VkMemoryAllocateInfo; + +typedef struct VkMappedMemoryRange { + VkStructureType sType; + const void* pNext; + VkDeviceMemory memory; + VkDeviceSize offset; + VkDeviceSize size; +} VkMappedMemoryRange; + +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 VkSparseMemoryBind { + VkDeviceSize resourceOffset; + VkDeviceSize size; + VkDeviceMemory memory; + VkDeviceSize memoryOffset; + VkSparseMemoryBindFlags flags; +} VkSparseMemoryBind; + +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 VkImageSubresource { + VkImageAspectFlags aspectMask; + uint32_t mipLevel; + uint32_t arrayLayer; +} VkImageSubresource; + +typedef struct VkOffset3D { + int32_t x; + int32_t y; + int32_t z; +} VkOffset3D; + +typedef struct VkSparseImageMemoryBind { + VkImageSubresource subresource; + VkOffset3D offset; + VkExtent3D extent; + VkDeviceMemory memory; + VkDeviceSize memoryOffset; + VkSparseMemoryBindFlags flags; +} VkSparseImageMemoryBind; + +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 VkFenceCreateInfo { + VkStructureType sType; + const void* pNext; + VkFenceCreateFlags flags; +} VkFenceCreateInfo; + +typedef struct VkSemaphoreCreateInfo { + VkStructureType sType; + const void* pNext; + VkSemaphoreCreateFlags flags; +} VkSemaphoreCreateInfo; + +typedef struct VkEventCreateInfo { + VkStructureType sType; + const void* pNext; + VkEventCreateFlags flags; +} VkEventCreateInfo; + +typedef struct VkQueryPoolCreateInfo { + VkStructureType sType; + const void* pNext; + VkQueryPoolCreateFlags flags; + VkQueryType queryType; + uint32_t queryCount; + VkQueryPipelineStatisticFlags pipelineStatistics; +} VkQueryPoolCreateInfo; + +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 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 VkComponentMapping { + VkComponentSwizzle r; + VkComponentSwizzle g; + VkComponentSwizzle b; + VkComponentSwizzle a; +} VkComponentMapping; + +typedef struct VkImageSubresourceRange { + VkImageAspectFlags aspectMask; + uint32_t baseMipLevel; + uint32_t levelCount; + uint32_t baseArrayLayer; + uint32_t layerCount; +} VkImageSubresourceRange; + +typedef struct VkImageViewCreateInfo { + VkStructureType sType; + const void* pNext; + VkImageViewCreateFlags flags; + VkImage image; + VkImageViewType viewType; + VkFormat format; + VkComponentMapping components; + VkImageSubresourceRange subresourceRange; +} VkImageViewCreateInfo; + +typedef struct VkShaderModuleCreateInfo { + VkStructureType sType; + const void* pNext; + VkShaderModuleCreateFlags flags; + size_t codeSize; + const uint32_t* pCode; +} VkShaderModuleCreateInfo; + +typedef struct VkPipelineCacheCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineCacheCreateFlags flags; + size_t initialDataSize; + const void* pInitialData; +} VkPipelineCacheCreateInfo; + +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 VkPipelineShaderStageCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineShaderStageCreateFlags flags; + VkShaderStageFlagBits stage; + VkShaderModule module; + const char* pName; + const VkSpecializationInfo* pSpecializationInfo; +} VkPipelineShaderStageCreateInfo; + +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 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 VkViewport { + float x; + float y; + float width; + float height; + float minDepth; + float maxDepth; +} VkViewport; + +typedef struct VkOffset2D { + int32_t x; + int32_t y; +} VkOffset2D; + +typedef struct VkExtent2D { + uint32_t width; + uint32_t height; +} VkExtent2D; + +typedef struct VkRect2D { + VkOffset2D offset; + VkExtent2D extent; +} VkRect2D; + +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 VkStencilOpState { + VkStencilOp failOp; + VkStencilOp passOp; + VkStencilOp depthFailOp; + VkCompareOp compareOp; + uint32_t compareMask; + uint32_t writeMask; + uint32_t reference; +} VkStencilOpState; + +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 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 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 VkComputePipelineCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineCreateFlags flags; + VkPipelineShaderStageCreateInfo stage; + VkPipelineLayout layout; + VkPipeline basePipelineHandle; + int32_t basePipelineIndex; +} VkComputePipelineCreateInfo; + +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 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 VkDescriptorPoolSize { + VkDescriptorType type; + uint32_t descriptorCount; +} VkDescriptorPoolSize; + +typedef struct VkDescriptorPoolCreateInfo { + VkStructureType sType; + const void* pNext; + VkDescriptorPoolCreateFlags flags; + uint32_t maxSets; + uint32_t poolSizeCount; + const VkDescriptorPoolSize* pPoolSizes; +} VkDescriptorPoolCreateInfo; + +typedef struct VkDescriptorSetAllocateInfo { + VkStructureType sType; + const void* pNext; + VkDescriptorPool descriptorPool; + uint32_t descriptorSetCount; + const VkDescriptorSetLayout* pSetLayouts; +} VkDescriptorSetAllocateInfo; + +typedef struct VkDescriptorImageInfo { + VkSampler sampler; + VkImageView imageView; + VkImageLayout imageLayout; +} VkDescriptorImageInfo; + +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 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 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 VkAttachmentDescription { + VkAttachmentDescriptionFlags flags; + VkFormat format; + VkSampleCountFlagBits samples; + VkAttachmentLoadOp loadOp; + VkAttachmentStoreOp storeOp; + VkAttachmentLoadOp stencilLoadOp; + VkAttachmentStoreOp stencilStoreOp; + VkImageLayout initialLayout; + VkImageLayout finalLayout; +} VkAttachmentDescription; + +typedef struct VkAttachmentReference { + uint32_t attachment; + VkImageLayout layout; +} VkAttachmentReference; + +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 VkCommandPoolCreateInfo { + VkStructureType sType; + const void* pNext; + VkCommandPoolCreateFlags flags; + uint32_t queueFamilyIndex; +} VkCommandPoolCreateInfo; + +typedef struct VkCommandBufferAllocateInfo { + VkStructureType sType; + const void* pNext; + VkCommandPool commandPool; + VkCommandBufferLevel level; + uint32_t commandBufferCount; +} VkCommandBufferAllocateInfo; + +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 VkBufferCopy { + VkDeviceSize srcOffset; + VkDeviceSize dstOffset; + VkDeviceSize size; +} VkBufferCopy; + +typedef struct VkImageSubresourceLayers { + VkImageAspectFlags aspectMask; + uint32_t mipLevel; + uint32_t baseArrayLayer; + uint32_t layerCount; +} VkImageSubresourceLayers; + +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 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 VkClearAttachment { + VkImageAspectFlags aspectMask; + uint32_t colorAttachment; + VkClearValue clearValue; +} VkClearAttachment; + +typedef struct VkClearRect { + VkRect2D rect; + uint32_t baseArrayLayer; + uint32_t layerCount; +} VkClearRect; + +typedef struct VkImageResolve { + VkImageSubresourceLayers srcSubresource; + VkOffset3D srcOffset; + VkImageSubresourceLayers dstSubresource; + VkOffset3D dstOffset; + VkExtent3D extent; +} VkImageResolve; + +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 VkRenderPassBeginInfo { + VkStructureType sType; + const void* pNext; + VkRenderPass renderPass; + VkFramebuffer framebuffer; + VkRect2D renderArea; + uint32_t clearValueCount; + const VkClearValue* pClearValues; +} VkRenderPassBeginInfo; + +typedef struct VkDispatchIndirectCommand { + uint32_t x; + uint32_t y; + uint32_t z; +} VkDispatchIndirectCommand; + +typedef struct VkDrawIndexedIndirectCommand { + uint32_t indexCount; + uint32_t instanceCount; + uint32_t firstIndex; + int32_t vertexOffset; + uint32_t firstInstance; +} VkDrawIndexedIndirectCommand; + +typedef struct VkDrawIndirectCommand { + uint32_t vertexCount; + uint32_t instanceCount; + uint32_t firstVertex; + uint32_t firstInstance; +} VkDrawIndirectCommand; + +typedef struct VkBaseOutStructure { + VkStructureType sType; + struct VkBaseOutStructure* pNext; +} VkBaseOutStructure; + +typedef struct VkBaseInStructure { + VkStructureType sType; + const struct VkBaseInStructure* pNext; +} VkBaseInStructure; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateInstance)(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance); +typedef void (VKAPI_PTR *PFN_vkDestroyInstance)(VkInstance instance, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDevices)(VkInstance instance, uint32_t* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyProperties)(VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties* pQueueFamilyProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMemoryProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties); +typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetInstanceProcAddr)(VkInstance instance, const char* pName); +typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetDeviceProcAddr)(VkDevice device, const char* pName); +typedef VkResult (VKAPI_PTR *PFN_vkCreateDevice)(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice); +typedef void (VKAPI_PTR *PFN_vkDestroyDevice)(VkDevice device, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkEnumerateInstanceExtensionProperties)(const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkEnumerateDeviceExtensionProperties)(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkEnumerateInstanceLayerProperties)(uint32_t* pPropertyCount, VkLayerProperties* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkEnumerateDeviceLayerProperties)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkLayerProperties* pProperties); +typedef void (VKAPI_PTR *PFN_vkGetDeviceQueue)(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue* pQueue); +typedef VkResult (VKAPI_PTR *PFN_vkQueueSubmit)(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence); +typedef VkResult (VKAPI_PTR *PFN_vkQueueWaitIdle)(VkQueue queue); +typedef VkResult (VKAPI_PTR *PFN_vkDeviceWaitIdle)(VkDevice device); +typedef VkResult (VKAPI_PTR *PFN_vkAllocateMemory)(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory); +typedef void (VKAPI_PTR *PFN_vkFreeMemory)(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkMapMemory)(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData); +typedef void (VKAPI_PTR *PFN_vkUnmapMemory)(VkDevice device, VkDeviceMemory memory); +typedef VkResult (VKAPI_PTR *PFN_vkFlushMappedMemoryRanges)(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges); +typedef VkResult (VKAPI_PTR *PFN_vkInvalidateMappedMemoryRanges)(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges); +typedef void (VKAPI_PTR *PFN_vkGetDeviceMemoryCommitment)(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes); +typedef VkResult (VKAPI_PTR *PFN_vkBindBufferMemory)(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset); +typedef VkResult (VKAPI_PTR *PFN_vkBindImageMemory)(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset); +typedef void (VKAPI_PTR *PFN_vkGetBufferMemoryRequirements)(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetImageMemoryRequirements)(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements)(VkDevice device, VkImage image, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements* pSparseMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, uint32_t* pPropertyCount, VkSparseImageFormatProperties* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkQueueBindSparse)(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence); +typedef VkResult (VKAPI_PTR *PFN_vkCreateFence)(VkDevice device, const VkFenceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence); +typedef void (VKAPI_PTR *PFN_vkDestroyFence)(VkDevice device, VkFence fence, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkResetFences)(VkDevice device, uint32_t fenceCount, const VkFence* pFences); +typedef VkResult (VKAPI_PTR *PFN_vkGetFenceStatus)(VkDevice device, VkFence fence); +typedef VkResult (VKAPI_PTR *PFN_vkWaitForFences)(VkDevice device, uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout); +typedef VkResult (VKAPI_PTR *PFN_vkCreateSemaphore)(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore); +typedef void (VKAPI_PTR *PFN_vkDestroySemaphore)(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateEvent)(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent); +typedef void (VKAPI_PTR *PFN_vkDestroyEvent)(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkGetEventStatus)(VkDevice device, VkEvent event); +typedef VkResult (VKAPI_PTR *PFN_vkSetEvent)(VkDevice device, VkEvent event); +typedef VkResult (VKAPI_PTR *PFN_vkResetEvent)(VkDevice device, VkEvent event); +typedef VkResult (VKAPI_PTR *PFN_vkCreateQueryPool)(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool); +typedef void (VKAPI_PTR *PFN_vkDestroyQueryPool)(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkGetQueryPoolResults)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, size_t dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags); +typedef VkResult (VKAPI_PTR *PFN_vkCreateBuffer)(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer); +typedef void (VKAPI_PTR *PFN_vkDestroyBuffer)(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateBufferView)(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView); +typedef void (VKAPI_PTR *PFN_vkDestroyBufferView)(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateImage)(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage); +typedef void (VKAPI_PTR *PFN_vkDestroyImage)(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout)(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout); +typedef VkResult (VKAPI_PTR *PFN_vkCreateImageView)(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView); +typedef void (VKAPI_PTR *PFN_vkDestroyImageView)(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateShaderModule)(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule); +typedef void (VKAPI_PTR *PFN_vkDestroyShaderModule)(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreatePipelineCache)(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache); +typedef void (VKAPI_PTR *PFN_vkDestroyPipelineCache)(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkGetPipelineCacheData)(VkDevice device, VkPipelineCache pipelineCache, size_t* pDataSize, void* pData); +typedef VkResult (VKAPI_PTR *PFN_vkMergePipelineCaches)(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache* pSrcCaches); +typedef VkResult (VKAPI_PTR *PFN_vkCreateGraphicsPipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); +typedef VkResult (VKAPI_PTR *PFN_vkCreateComputePipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); +typedef void (VKAPI_PTR *PFN_vkDestroyPipeline)(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreatePipelineLayout)(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout); +typedef void (VKAPI_PTR *PFN_vkDestroyPipelineLayout)(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateSampler)(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSampler* pSampler); +typedef void (VKAPI_PTR *PFN_vkDestroySampler)(VkDevice device, VkSampler sampler, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorSetLayout)(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorSetLayout* pSetLayout); +typedef void (VKAPI_PTR *PFN_vkDestroyDescriptorSetLayout)(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorPool)(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool); +typedef void (VKAPI_PTR *PFN_vkDestroyDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkResetDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags); +typedef VkResult (VKAPI_PTR *PFN_vkAllocateDescriptorSets)(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets); +typedef VkResult (VKAPI_PTR *PFN_vkFreeDescriptorSets)(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets); +typedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSets)(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies); +typedef VkResult (VKAPI_PTR *PFN_vkCreateFramebuffer)(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer); +typedef void (VKAPI_PTR *PFN_vkDestroyFramebuffer)(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass)(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass); +typedef void (VKAPI_PTR *PFN_vkDestroyRenderPass)(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkGetRenderAreaGranularity)(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity); +typedef VkResult (VKAPI_PTR *PFN_vkCreateCommandPool)(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool); +typedef void (VKAPI_PTR *PFN_vkDestroyCommandPool)(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkResetCommandPool)(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags); +typedef VkResult (VKAPI_PTR *PFN_vkAllocateCommandBuffers)(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers); +typedef void (VKAPI_PTR *PFN_vkFreeCommandBuffers)(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers); +typedef VkResult (VKAPI_PTR *PFN_vkBeginCommandBuffer)(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo); +typedef VkResult (VKAPI_PTR *PFN_vkEndCommandBuffer)(VkCommandBuffer commandBuffer); +typedef VkResult (VKAPI_PTR *PFN_vkResetCommandBuffer)(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags); +typedef void (VKAPI_PTR *PFN_vkCmdBindPipeline)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline); +typedef void (VKAPI_PTR *PFN_vkCmdSetViewport)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports); +typedef void (VKAPI_PTR *PFN_vkCmdSetScissor)(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors); +typedef void (VKAPI_PTR *PFN_vkCmdSetLineWidth)(VkCommandBuffer commandBuffer, float lineWidth); +typedef void (VKAPI_PTR *PFN_vkCmdSetDepthBias)(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor); +typedef void (VKAPI_PTR *PFN_vkCmdSetBlendConstants)(VkCommandBuffer commandBuffer, const float blendConstants[4]); +typedef void (VKAPI_PTR *PFN_vkCmdSetDepthBounds)(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds); +typedef void (VKAPI_PTR *PFN_vkCmdSetStencilCompareMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask); +typedef void (VKAPI_PTR *PFN_vkCmdSetStencilWriteMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask); +typedef void (VKAPI_PTR *PFN_vkCmdSetStencilReference)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference); +typedef void (VKAPI_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 (VKAPI_PTR *PFN_vkCmdBindIndexBuffer)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType); +typedef void (VKAPI_PTR *PFN_vkCmdBindVertexBuffers)(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets); +typedef void (VKAPI_PTR *PFN_vkCmdDraw)(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexed)(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride); +typedef void (VKAPI_PTR *PFN_vkCmdDispatch)(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); +typedef void (VKAPI_PTR *PFN_vkCmdDispatchIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset); +typedef void (VKAPI_PTR *PFN_vkCmdCopyBuffer)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions); +typedef void (VKAPI_PTR *PFN_vkCmdCopyImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy* pRegions); +typedef void (VKAPI_PTR *PFN_vkCmdBlitImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkFilter filter); +typedef void (VKAPI_PTR *PFN_vkCmdCopyBufferToImage)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions); +typedef void (VKAPI_PTR *PFN_vkCmdCopyImageToBuffer)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions); +typedef void (VKAPI_PTR *PFN_vkCmdUpdateBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData); +typedef void (VKAPI_PTR *PFN_vkCmdFillBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data); +typedef void (VKAPI_PTR *PFN_vkCmdClearColorImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges); +typedef void (VKAPI_PTR *PFN_vkCmdClearDepthStencilImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges); +typedef void (VKAPI_PTR *PFN_vkCmdClearAttachments)(VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkClearAttachment* pAttachments, uint32_t rectCount, const VkClearRect* pRects); +typedef void (VKAPI_PTR *PFN_vkCmdResolveImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve* pRegions); +typedef void (VKAPI_PTR *PFN_vkCmdSetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask); +typedef void (VKAPI_PTR *PFN_vkCmdResetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask); +typedef void (VKAPI_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 (VKAPI_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 (VKAPI_PTR *PFN_vkCmdBeginQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags); +typedef void (VKAPI_PTR *PFN_vkCmdEndQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query); +typedef void (VKAPI_PTR *PFN_vkCmdResetQueryPool)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount); +typedef void (VKAPI_PTR *PFN_vkCmdWriteTimestamp)(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t query); +typedef void (VKAPI_PTR *PFN_vkCmdCopyQueryPoolResults)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags); +typedef void (VKAPI_PTR *PFN_vkCmdPushConstants)(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, const void* pValues); +typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents); +typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass)(VkCommandBuffer commandBuffer, VkSubpassContents contents); +typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass)(VkCommandBuffer commandBuffer); +typedef void (VKAPI_PTR *PFN_vkCmdExecuteCommands)(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance( + const VkInstanceCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkInstance* pInstance); + +VKAPI_ATTR void VKAPI_CALL vkDestroyInstance( + VkInstance instance, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices( + VkInstance instance, + uint32_t* pPhysicalDeviceCount, + VkPhysicalDevice* pPhysicalDevices); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceFeatures* pFeatures); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties( + VkPhysicalDevice physicalDevice, + VkFormat format, + VkFormatProperties* pFormatProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties( + VkPhysicalDevice physicalDevice, + VkFormat format, + VkImageType type, + VkImageTiling tiling, + VkImageUsageFlags usage, + VkImageCreateFlags flags, + VkImageFormatProperties* pImageFormatProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceProperties* pProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties( + VkPhysicalDevice physicalDevice, + uint32_t* pQueueFamilyPropertyCount, + VkQueueFamilyProperties* pQueueFamilyProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceMemoryProperties* pMemoryProperties); + +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr( + VkInstance instance, + const char* pName); + +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr( + VkDevice device, + const char* pName); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice( + VkPhysicalDevice physicalDevice, + const VkDeviceCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDevice* pDevice); + +VKAPI_ATTR void VKAPI_CALL vkDestroyDevice( + VkDevice device, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties( + const char* pLayerName, + uint32_t* pPropertyCount, + VkExtensionProperties* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties( + VkPhysicalDevice physicalDevice, + const char* pLayerName, + uint32_t* pPropertyCount, + VkExtensionProperties* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties( + uint32_t* pPropertyCount, + VkLayerProperties* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties( + VkPhysicalDevice physicalDevice, + uint32_t* pPropertyCount, + VkLayerProperties* pProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue( + VkDevice device, + uint32_t queueFamilyIndex, + uint32_t queueIndex, + VkQueue* pQueue); + +VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit( + VkQueue queue, + uint32_t submitCount, + const VkSubmitInfo* pSubmits, + VkFence fence); + +VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle( + VkQueue queue); + +VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle( + VkDevice device); + +VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory( + VkDevice device, + const VkMemoryAllocateInfo* pAllocateInfo, + const VkAllocationCallbacks* pAllocator, + VkDeviceMemory* pMemory); + +VKAPI_ATTR void VKAPI_CALL vkFreeMemory( + VkDevice device, + VkDeviceMemory memory, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkMapMemory( + VkDevice device, + VkDeviceMemory memory, + VkDeviceSize offset, + VkDeviceSize size, + VkMemoryMapFlags flags, + void** ppData); + +VKAPI_ATTR void VKAPI_CALL vkUnmapMemory( + VkDevice device, + VkDeviceMemory memory); + +VKAPI_ATTR VkResult VKAPI_CALL vkFlushMappedMemoryRanges( + VkDevice device, + uint32_t memoryRangeCount, + const VkMappedMemoryRange* pMemoryRanges); + +VKAPI_ATTR VkResult VKAPI_CALL vkInvalidateMappedMemoryRanges( + VkDevice device, + uint32_t memoryRangeCount, + const VkMappedMemoryRange* pMemoryRanges); + +VKAPI_ATTR void VKAPI_CALL vkGetDeviceMemoryCommitment( + VkDevice device, + VkDeviceMemory memory, + VkDeviceSize* pCommittedMemoryInBytes); + +VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory( + VkDevice device, + VkBuffer buffer, + VkDeviceMemory memory, + VkDeviceSize memoryOffset); + +VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory( + VkDevice device, + VkImage image, + VkDeviceMemory memory, + VkDeviceSize memoryOffset); + +VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements( + VkDevice device, + VkBuffer buffer, + VkMemoryRequirements* pMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements( + VkDevice device, + VkImage image, + VkMemoryRequirements* pMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements( + VkDevice device, + VkImage image, + uint32_t* pSparseMemoryRequirementCount, + VkSparseImageMemoryRequirements* pSparseMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties( + VkPhysicalDevice physicalDevice, + VkFormat format, + VkImageType type, + VkSampleCountFlagBits samples, + VkImageUsageFlags usage, + VkImageTiling tiling, + uint32_t* pPropertyCount, + VkSparseImageFormatProperties* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkQueueBindSparse( + VkQueue queue, + uint32_t bindInfoCount, + const VkBindSparseInfo* pBindInfo, + VkFence fence); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateFence( + VkDevice device, + const VkFenceCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkFence* pFence); + +VKAPI_ATTR void VKAPI_CALL vkDestroyFence( + VkDevice device, + VkFence fence, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkResetFences( + VkDevice device, + uint32_t fenceCount, + const VkFence* pFences); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus( + VkDevice device, + VkFence fence); + +VKAPI_ATTR VkResult VKAPI_CALL vkWaitForFences( + VkDevice device, + uint32_t fenceCount, + const VkFence* pFences, + VkBool32 waitAll, + uint64_t timeout); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore( + VkDevice device, + const VkSemaphoreCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSemaphore* pSemaphore); + +VKAPI_ATTR void VKAPI_CALL vkDestroySemaphore( + VkDevice device, + VkSemaphore semaphore, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateEvent( + VkDevice device, + const VkEventCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkEvent* pEvent); + +VKAPI_ATTR void VKAPI_CALL vkDestroyEvent( + VkDevice device, + VkEvent event, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus( + VkDevice device, + VkEvent event); + +VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent( + VkDevice device, + VkEvent event); + +VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent( + VkDevice device, + VkEvent event); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool( + VkDevice device, + const VkQueryPoolCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkQueryPool* pQueryPool); + +VKAPI_ATTR void VKAPI_CALL vkDestroyQueryPool( + VkDevice device, + VkQueryPool queryPool, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults( + VkDevice device, + VkQueryPool queryPool, + uint32_t firstQuery, + uint32_t queryCount, + size_t dataSize, + void* pData, + VkDeviceSize stride, + VkQueryResultFlags flags); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateBuffer( + VkDevice device, + const VkBufferCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkBuffer* pBuffer); + +VKAPI_ATTR void VKAPI_CALL vkDestroyBuffer( + VkDevice device, + VkBuffer buffer, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView( + VkDevice device, + const VkBufferViewCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkBufferView* pView); + +VKAPI_ATTR void VKAPI_CALL vkDestroyBufferView( + VkDevice device, + VkBufferView bufferView, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage( + VkDevice device, + const VkImageCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkImage* pImage); + +VKAPI_ATTR void VKAPI_CALL vkDestroyImage( + VkDevice device, + VkImage image, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout( + VkDevice device, + VkImage image, + const VkImageSubresource* pSubresource, + VkSubresourceLayout* pLayout); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView( + VkDevice device, + const VkImageViewCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkImageView* pView); + +VKAPI_ATTR void VKAPI_CALL vkDestroyImageView( + VkDevice device, + VkImageView imageView, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule( + VkDevice device, + const VkShaderModuleCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkShaderModule* pShaderModule); + +VKAPI_ATTR void VKAPI_CALL vkDestroyShaderModule( + VkDevice device, + VkShaderModule shaderModule, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache( + VkDevice device, + const VkPipelineCacheCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkPipelineCache* pPipelineCache); + +VKAPI_ATTR void VKAPI_CALL vkDestroyPipelineCache( + VkDevice device, + VkPipelineCache pipelineCache, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineCacheData( + VkDevice device, + VkPipelineCache pipelineCache, + size_t* pDataSize, + void* pData); + +VKAPI_ATTR VkResult VKAPI_CALL vkMergePipelineCaches( + VkDevice device, + VkPipelineCache dstCache, + uint32_t srcCacheCount, + const VkPipelineCache* pSrcCaches); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateGraphicsPipelines( + VkDevice device, + VkPipelineCache pipelineCache, + uint32_t createInfoCount, + const VkGraphicsPipelineCreateInfo* pCreateInfos, + const VkAllocationCallbacks* pAllocator, + VkPipeline* pPipelines); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateComputePipelines( + VkDevice device, + VkPipelineCache pipelineCache, + uint32_t createInfoCount, + const VkComputePipelineCreateInfo* pCreateInfos, + const VkAllocationCallbacks* pAllocator, + VkPipeline* pPipelines); + +VKAPI_ATTR void VKAPI_CALL vkDestroyPipeline( + VkDevice device, + VkPipeline pipeline, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineLayout( + VkDevice device, + const VkPipelineLayoutCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkPipelineLayout* pPipelineLayout); + +VKAPI_ATTR void VKAPI_CALL vkDestroyPipelineLayout( + VkDevice device, + VkPipelineLayout pipelineLayout, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler( + VkDevice device, + const VkSamplerCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSampler* pSampler); + +VKAPI_ATTR void VKAPI_CALL vkDestroySampler( + VkDevice device, + VkSampler sampler, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout( + VkDevice device, + const VkDescriptorSetLayoutCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDescriptorSetLayout* pSetLayout); + +VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorSetLayout( + VkDevice device, + VkDescriptorSetLayout descriptorSetLayout, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorPool( + VkDevice device, + const VkDescriptorPoolCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDescriptorPool* pDescriptorPool); + +VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorPool( + VkDevice device, + VkDescriptorPool descriptorPool, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkResetDescriptorPool( + VkDevice device, + VkDescriptorPool descriptorPool, + VkDescriptorPoolResetFlags flags); + +VKAPI_ATTR VkResult VKAPI_CALL vkAllocateDescriptorSets( + VkDevice device, + const VkDescriptorSetAllocateInfo* pAllocateInfo, + VkDescriptorSet* pDescriptorSets); + +VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets( + VkDevice device, + VkDescriptorPool descriptorPool, + uint32_t descriptorSetCount, + const VkDescriptorSet* pDescriptorSets); + +VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSets( + VkDevice device, + uint32_t descriptorWriteCount, + const VkWriteDescriptorSet* pDescriptorWrites, + uint32_t descriptorCopyCount, + const VkCopyDescriptorSet* pDescriptorCopies); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer( + VkDevice device, + const VkFramebufferCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkFramebuffer* pFramebuffer); + +VKAPI_ATTR void VKAPI_CALL vkDestroyFramebuffer( + VkDevice device, + VkFramebuffer framebuffer, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass( + VkDevice device, + const VkRenderPassCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkRenderPass* pRenderPass); + +VKAPI_ATTR void VKAPI_CALL vkDestroyRenderPass( + VkDevice device, + VkRenderPass renderPass, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR void VKAPI_CALL vkGetRenderAreaGranularity( + VkDevice device, + VkRenderPass renderPass, + VkExtent2D* pGranularity); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool( + VkDevice device, + const VkCommandPoolCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkCommandPool* pCommandPool); + +VKAPI_ATTR void VKAPI_CALL vkDestroyCommandPool( + VkDevice device, + VkCommandPool commandPool, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool( + VkDevice device, + VkCommandPool commandPool, + VkCommandPoolResetFlags flags); + +VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers( + VkDevice device, + const VkCommandBufferAllocateInfo* pAllocateInfo, + VkCommandBuffer* pCommandBuffers); + +VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers( + VkDevice device, + VkCommandPool commandPool, + uint32_t commandBufferCount, + const VkCommandBuffer* pCommandBuffers); + +VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer( + VkCommandBuffer commandBuffer, + const VkCommandBufferBeginInfo* pBeginInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer( + VkCommandBuffer commandBuffer); + +VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer( + VkCommandBuffer commandBuffer, + VkCommandBufferResetFlags flags); + +VKAPI_ATTR void VKAPI_CALL vkCmdBindPipeline( + VkCommandBuffer commandBuffer, + VkPipelineBindPoint pipelineBindPoint, + VkPipeline pipeline); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetViewport( + VkCommandBuffer commandBuffer, + uint32_t firstViewport, + uint32_t viewportCount, + const VkViewport* pViewports); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetScissor( + VkCommandBuffer commandBuffer, + uint32_t firstScissor, + uint32_t scissorCount, + const VkRect2D* pScissors); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth( + VkCommandBuffer commandBuffer, + float lineWidth); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias( + VkCommandBuffer commandBuffer, + float depthBiasConstantFactor, + float depthBiasClamp, + float depthBiasSlopeFactor); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants( + VkCommandBuffer commandBuffer, + const float blendConstants[4]); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBounds( + VkCommandBuffer commandBuffer, + float minDepthBounds, + float maxDepthBounds); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilCompareMask( + VkCommandBuffer commandBuffer, + VkStencilFaceFlags faceMask, + uint32_t compareMask); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilWriteMask( + VkCommandBuffer commandBuffer, + VkStencilFaceFlags faceMask, + uint32_t writeMask); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilReference( + VkCommandBuffer commandBuffer, + VkStencilFaceFlags faceMask, + uint32_t reference); + +VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets( + VkCommandBuffer commandBuffer, + VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, + uint32_t firstSet, + uint32_t descriptorSetCount, + const VkDescriptorSet* pDescriptorSets, + uint32_t dynamicOffsetCount, + const uint32_t* pDynamicOffsets); + +VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkIndexType indexType); + +VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers( + VkCommandBuffer commandBuffer, + uint32_t firstBinding, + uint32_t bindingCount, + const VkBuffer* pBuffers, + const VkDeviceSize* pOffsets); + +VKAPI_ATTR void VKAPI_CALL vkCmdDraw( + VkCommandBuffer commandBuffer, + uint32_t vertexCount, + uint32_t instanceCount, + uint32_t firstVertex, + uint32_t firstInstance); + +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed( + VkCommandBuffer commandBuffer, + uint32_t indexCount, + uint32_t instanceCount, + uint32_t firstIndex, + int32_t vertexOffset, + uint32_t firstInstance); + +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirect( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + uint32_t drawCount, + uint32_t stride); + +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + uint32_t drawCount, + uint32_t stride); + +VKAPI_ATTR void VKAPI_CALL vkCmdDispatch( + VkCommandBuffer commandBuffer, + uint32_t groupCountX, + uint32_t groupCountY, + uint32_t groupCountZ); + +VKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset); + +VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer( + VkCommandBuffer commandBuffer, + VkBuffer srcBuffer, + VkBuffer dstBuffer, + uint32_t regionCount, + const VkBufferCopy* pRegions); + +VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage( + VkCommandBuffer commandBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkImage dstImage, + VkImageLayout dstImageLayout, + uint32_t regionCount, + const VkImageCopy* pRegions); + +VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage( + VkCommandBuffer commandBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkImage dstImage, + VkImageLayout dstImageLayout, + uint32_t regionCount, + const VkImageBlit* pRegions, + VkFilter filter); + +VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage( + VkCommandBuffer commandBuffer, + VkBuffer srcBuffer, + VkImage dstImage, + VkImageLayout dstImageLayout, + uint32_t regionCount, + const VkBufferImageCopy* pRegions); + +VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer( + VkCommandBuffer commandBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkBuffer dstBuffer, + uint32_t regionCount, + const VkBufferImageCopy* pRegions); + +VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer( + VkCommandBuffer commandBuffer, + VkBuffer dstBuffer, + VkDeviceSize dstOffset, + VkDeviceSize dataSize, + const void* pData); + +VKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer( + VkCommandBuffer commandBuffer, + VkBuffer dstBuffer, + VkDeviceSize dstOffset, + VkDeviceSize size, + uint32_t data); + +VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage( + VkCommandBuffer commandBuffer, + VkImage image, + VkImageLayout imageLayout, + const VkClearColorValue* pColor, + uint32_t rangeCount, + const VkImageSubresourceRange* pRanges); + +VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage( + VkCommandBuffer commandBuffer, + VkImage image, + VkImageLayout imageLayout, + const VkClearDepthStencilValue* pDepthStencil, + uint32_t rangeCount, + const VkImageSubresourceRange* pRanges); + +VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments( + VkCommandBuffer commandBuffer, + uint32_t attachmentCount, + const VkClearAttachment* pAttachments, + uint32_t rectCount, + const VkClearRect* pRects); + +VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage( + VkCommandBuffer commandBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkImage dstImage, + VkImageLayout dstImageLayout, + uint32_t regionCount, + const VkImageResolve* pRegions); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent( + VkCommandBuffer commandBuffer, + VkEvent event, + VkPipelineStageFlags stageMask); + +VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent( + VkCommandBuffer commandBuffer, + VkEvent event, + VkPipelineStageFlags stageMask); + +VKAPI_ATTR void VKAPI_CALL 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); + +VKAPI_ATTR void VKAPI_CALL 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); + +VKAPI_ATTR void VKAPI_CALL vkCmdBeginQuery( + VkCommandBuffer commandBuffer, + VkQueryPool queryPool, + uint32_t query, + VkQueryControlFlags flags); + +VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery( + VkCommandBuffer commandBuffer, + VkQueryPool queryPool, + uint32_t query); + +VKAPI_ATTR void VKAPI_CALL vkCmdResetQueryPool( + VkCommandBuffer commandBuffer, + VkQueryPool queryPool, + uint32_t firstQuery, + uint32_t queryCount); + +VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp( + VkCommandBuffer commandBuffer, + VkPipelineStageFlagBits pipelineStage, + VkQueryPool queryPool, + uint32_t query); + +VKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResults( + VkCommandBuffer commandBuffer, + VkQueryPool queryPool, + uint32_t firstQuery, + uint32_t queryCount, + VkBuffer dstBuffer, + VkDeviceSize dstOffset, + VkDeviceSize stride, + VkQueryResultFlags flags); + +VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants( + VkCommandBuffer commandBuffer, + VkPipelineLayout layout, + VkShaderStageFlags stageFlags, + uint32_t offset, + uint32_t size, + const void* pValues); + +VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass( + VkCommandBuffer commandBuffer, + const VkRenderPassBeginInfo* pRenderPassBegin, + VkSubpassContents contents); + +VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass( + VkCommandBuffer commandBuffer, + VkSubpassContents contents); + +VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass( + VkCommandBuffer commandBuffer); + +VKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands( + VkCommandBuffer commandBuffer, + uint32_t commandBufferCount, + const VkCommandBuffer* pCommandBuffers); +#endif + +#define VK_VERSION_1_1 1 +// Vulkan 1.1 version number +#define VK_API_VERSION_1_1 VK_MAKE_VERSION(1, 1, 0)// Patch version should always be set to 0 + + +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSamplerYcbcrConversion) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorUpdateTemplate) + +#define VK_MAX_DEVICE_GROUP_SIZE 32 +#define VK_LUID_SIZE 8 +#define VK_QUEUE_FAMILY_EXTERNAL (~0U-1) + + +typedef enum VkPointClippingBehavior { + VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES = 0, + VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY = 1, + VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES_KHR = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES, + VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY_KHR = VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY, + VK_POINT_CLIPPING_BEHAVIOR_BEGIN_RANGE = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES, + VK_POINT_CLIPPING_BEHAVIOR_END_RANGE = VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY, + VK_POINT_CLIPPING_BEHAVIOR_RANGE_SIZE = (VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY - VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES + 1), + VK_POINT_CLIPPING_BEHAVIOR_MAX_ENUM = 0x7FFFFFFF +} VkPointClippingBehavior; + +typedef enum VkTessellationDomainOrigin { + VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT = 0, + VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT = 1, + VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT_KHR = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT, + VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT_KHR = VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT, + VK_TESSELLATION_DOMAIN_ORIGIN_BEGIN_RANGE = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT, + VK_TESSELLATION_DOMAIN_ORIGIN_END_RANGE = VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT, + VK_TESSELLATION_DOMAIN_ORIGIN_RANGE_SIZE = (VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT - VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT + 1), + VK_TESSELLATION_DOMAIN_ORIGIN_MAX_ENUM = 0x7FFFFFFF +} VkTessellationDomainOrigin; + +typedef enum VkSamplerYcbcrModelConversion { + VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY = 0, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY = 1, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709 = 2, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601 = 3, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020 = 4, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_BEGIN_RANGE = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_END_RANGE = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_RANGE_SIZE = (VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020 - VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY + 1), + VK_SAMPLER_YCBCR_MODEL_CONVERSION_MAX_ENUM = 0x7FFFFFFF +} VkSamplerYcbcrModelConversion; + +typedef enum VkSamplerYcbcrRange { + VK_SAMPLER_YCBCR_RANGE_ITU_FULL = 0, + VK_SAMPLER_YCBCR_RANGE_ITU_NARROW = 1, + VK_SAMPLER_YCBCR_RANGE_ITU_FULL_KHR = VK_SAMPLER_YCBCR_RANGE_ITU_FULL, + VK_SAMPLER_YCBCR_RANGE_ITU_NARROW_KHR = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW, + VK_SAMPLER_YCBCR_RANGE_BEGIN_RANGE = VK_SAMPLER_YCBCR_RANGE_ITU_FULL, + VK_SAMPLER_YCBCR_RANGE_END_RANGE = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW, + VK_SAMPLER_YCBCR_RANGE_RANGE_SIZE = (VK_SAMPLER_YCBCR_RANGE_ITU_NARROW - VK_SAMPLER_YCBCR_RANGE_ITU_FULL + 1), + VK_SAMPLER_YCBCR_RANGE_MAX_ENUM = 0x7FFFFFFF +} VkSamplerYcbcrRange; + +typedef enum VkChromaLocation { + VK_CHROMA_LOCATION_COSITED_EVEN = 0, + VK_CHROMA_LOCATION_MIDPOINT = 1, + VK_CHROMA_LOCATION_COSITED_EVEN_KHR = VK_CHROMA_LOCATION_COSITED_EVEN, + VK_CHROMA_LOCATION_MIDPOINT_KHR = VK_CHROMA_LOCATION_MIDPOINT, + VK_CHROMA_LOCATION_BEGIN_RANGE = VK_CHROMA_LOCATION_COSITED_EVEN, + VK_CHROMA_LOCATION_END_RANGE = VK_CHROMA_LOCATION_MIDPOINT, + VK_CHROMA_LOCATION_RANGE_SIZE = (VK_CHROMA_LOCATION_MIDPOINT - VK_CHROMA_LOCATION_COSITED_EVEN + 1), + VK_CHROMA_LOCATION_MAX_ENUM = 0x7FFFFFFF +} VkChromaLocation; + +typedef enum VkDescriptorUpdateTemplateType { + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET = 0, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR = 1, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_BEGIN_RANGE = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_END_RANGE = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_RANGE_SIZE = (VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET - VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET + 1), + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkDescriptorUpdateTemplateType; + + +typedef enum VkSubgroupFeatureFlagBits { + VK_SUBGROUP_FEATURE_BASIC_BIT = 0x00000001, + VK_SUBGROUP_FEATURE_VOTE_BIT = 0x00000002, + VK_SUBGROUP_FEATURE_ARITHMETIC_BIT = 0x00000004, + VK_SUBGROUP_FEATURE_BALLOT_BIT = 0x00000008, + VK_SUBGROUP_FEATURE_SHUFFLE_BIT = 0x00000010, + VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT = 0x00000020, + VK_SUBGROUP_FEATURE_CLUSTERED_BIT = 0x00000040, + VK_SUBGROUP_FEATURE_QUAD_BIT = 0x00000080, + VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV = 0x00000100, + VK_SUBGROUP_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSubgroupFeatureFlagBits; +typedef VkFlags VkSubgroupFeatureFlags; + +typedef enum VkPeerMemoryFeatureFlagBits { + VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT = 0x00000001, + VK_PEER_MEMORY_FEATURE_COPY_DST_BIT = 0x00000002, + VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT = 0x00000004, + VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT = 0x00000008, + VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHR = VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT, + VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHR = VK_PEER_MEMORY_FEATURE_COPY_DST_BIT, + VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHR = VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT, + VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHR = VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT, + VK_PEER_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkPeerMemoryFeatureFlagBits; +typedef VkFlags VkPeerMemoryFeatureFlags; + +typedef enum VkMemoryAllocateFlagBits { + VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT = 0x00000001, + VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT, + VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkMemoryAllocateFlagBits; +typedef VkFlags VkMemoryAllocateFlags; +typedef VkFlags VkCommandPoolTrimFlags; +typedef VkFlags VkDescriptorUpdateTemplateCreateFlags; + +typedef enum VkExternalMemoryHandleTypeFlagBits { + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT = 0x00000001, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0x00000002, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT = 0x00000008, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT = 0x00000010, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT = 0x00000020, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT = 0x00000040, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT = 0x00000200, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID = 0x00000400, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT = 0x00000080, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT = 0x00000100, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkExternalMemoryHandleTypeFlagBits; +typedef VkFlags VkExternalMemoryHandleTypeFlags; + +typedef enum VkExternalMemoryFeatureFlagBits { + VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT = 0x00000001, + VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT = 0x00000002, + VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT = 0x00000004, + VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_KHR = VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT, + VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT, + VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT, + VK_EXTERNAL_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkExternalMemoryFeatureFlagBits; +typedef VkFlags VkExternalMemoryFeatureFlags; + +typedef enum VkExternalFenceHandleTypeFlagBits { + VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT = 0x00000001, + VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0x00000002, + VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004, + VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT = 0x00000008, + VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT, + VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT, + VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, + VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, + VK_EXTERNAL_FENCE_HANDLE_TYPE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkExternalFenceHandleTypeFlagBits; +typedef VkFlags VkExternalFenceHandleTypeFlags; + +typedef enum VkExternalFenceFeatureFlagBits { + VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT = 0x00000001, + VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT = 0x00000002, + VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR = VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT, + VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR = VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT, + VK_EXTERNAL_FENCE_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkExternalFenceFeatureFlagBits; +typedef VkFlags VkExternalFenceFeatureFlags; + +typedef enum VkFenceImportFlagBits { + VK_FENCE_IMPORT_TEMPORARY_BIT = 0x00000001, + VK_FENCE_IMPORT_TEMPORARY_BIT_KHR = VK_FENCE_IMPORT_TEMPORARY_BIT, + VK_FENCE_IMPORT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkFenceImportFlagBits; +typedef VkFlags VkFenceImportFlags; + +typedef enum VkSemaphoreImportFlagBits { + VK_SEMAPHORE_IMPORT_TEMPORARY_BIT = 0x00000001, + VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT, + VK_SEMAPHORE_IMPORT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSemaphoreImportFlagBits; +typedef VkFlags VkSemaphoreImportFlags; + +typedef enum VkExternalSemaphoreHandleTypeFlagBits { + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT = 0x00000001, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0x00000002, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT = 0x00000008, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT = 0x00000010, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT, + VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkExternalSemaphoreHandleTypeFlagBits; +typedef VkFlags VkExternalSemaphoreHandleTypeFlags; + +typedef enum VkExternalSemaphoreFeatureFlagBits { + VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT = 0x00000001, + VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT = 0x00000002, + VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT_KHR = VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT, + VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT_KHR = VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT, + VK_EXTERNAL_SEMAPHORE_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkExternalSemaphoreFeatureFlagBits; +typedef VkFlags VkExternalSemaphoreFeatureFlags; + +typedef struct VkPhysicalDeviceSubgroupProperties { + VkStructureType sType; + void* pNext; + uint32_t subgroupSize; + VkShaderStageFlags supportedStages; + VkSubgroupFeatureFlags supportedOperations; + VkBool32 quadOperationsInAllStages; +} VkPhysicalDeviceSubgroupProperties; + +typedef struct VkBindBufferMemoryInfo { + VkStructureType sType; + const void* pNext; + VkBuffer buffer; + VkDeviceMemory memory; + VkDeviceSize memoryOffset; +} VkBindBufferMemoryInfo; + +typedef struct VkBindImageMemoryInfo { + VkStructureType sType; + const void* pNext; + VkImage image; + VkDeviceMemory memory; + VkDeviceSize memoryOffset; +} VkBindImageMemoryInfo; + +typedef struct VkPhysicalDevice16BitStorageFeatures { + VkStructureType sType; + void* pNext; + VkBool32 storageBuffer16BitAccess; + VkBool32 uniformAndStorageBuffer16BitAccess; + VkBool32 storagePushConstant16; + VkBool32 storageInputOutput16; +} VkPhysicalDevice16BitStorageFeatures; + +typedef struct VkMemoryDedicatedRequirements { + VkStructureType sType; + void* pNext; + VkBool32 prefersDedicatedAllocation; + VkBool32 requiresDedicatedAllocation; +} VkMemoryDedicatedRequirements; + +typedef struct VkMemoryDedicatedAllocateInfo { + VkStructureType sType; + const void* pNext; + VkImage image; + VkBuffer buffer; +} VkMemoryDedicatedAllocateInfo; + +typedef struct VkMemoryAllocateFlagsInfo { + VkStructureType sType; + const void* pNext; + VkMemoryAllocateFlags flags; + uint32_t deviceMask; +} VkMemoryAllocateFlagsInfo; + +typedef struct VkDeviceGroupRenderPassBeginInfo { + VkStructureType sType; + const void* pNext; + uint32_t deviceMask; + uint32_t deviceRenderAreaCount; + const VkRect2D* pDeviceRenderAreas; +} VkDeviceGroupRenderPassBeginInfo; + +typedef struct VkDeviceGroupCommandBufferBeginInfo { + VkStructureType sType; + const void* pNext; + uint32_t deviceMask; +} VkDeviceGroupCommandBufferBeginInfo; + +typedef struct VkDeviceGroupSubmitInfo { + VkStructureType sType; + const void* pNext; + uint32_t waitSemaphoreCount; + const uint32_t* pWaitSemaphoreDeviceIndices; + uint32_t commandBufferCount; + const uint32_t* pCommandBufferDeviceMasks; + uint32_t signalSemaphoreCount; + const uint32_t* pSignalSemaphoreDeviceIndices; +} VkDeviceGroupSubmitInfo; + +typedef struct VkDeviceGroupBindSparseInfo { + VkStructureType sType; + const void* pNext; + uint32_t resourceDeviceIndex; + uint32_t memoryDeviceIndex; +} VkDeviceGroupBindSparseInfo; + +typedef struct VkBindBufferMemoryDeviceGroupInfo { + VkStructureType sType; + const void* pNext; + uint32_t deviceIndexCount; + const uint32_t* pDeviceIndices; +} VkBindBufferMemoryDeviceGroupInfo; + +typedef struct VkBindImageMemoryDeviceGroupInfo { + VkStructureType sType; + const void* pNext; + uint32_t deviceIndexCount; + const uint32_t* pDeviceIndices; + uint32_t splitInstanceBindRegionCount; + const VkRect2D* pSplitInstanceBindRegions; +} VkBindImageMemoryDeviceGroupInfo; + +typedef struct VkPhysicalDeviceGroupProperties { + VkStructureType sType; + void* pNext; + uint32_t physicalDeviceCount; + VkPhysicalDevice physicalDevices[VK_MAX_DEVICE_GROUP_SIZE]; + VkBool32 subsetAllocation; +} VkPhysicalDeviceGroupProperties; + +typedef struct VkDeviceGroupDeviceCreateInfo { + VkStructureType sType; + const void* pNext; + uint32_t physicalDeviceCount; + const VkPhysicalDevice* pPhysicalDevices; +} VkDeviceGroupDeviceCreateInfo; + +typedef struct VkBufferMemoryRequirementsInfo2 { + VkStructureType sType; + const void* pNext; + VkBuffer buffer; +} VkBufferMemoryRequirementsInfo2; + +typedef struct VkImageMemoryRequirementsInfo2 { + VkStructureType sType; + const void* pNext; + VkImage image; +} VkImageMemoryRequirementsInfo2; + +typedef struct VkImageSparseMemoryRequirementsInfo2 { + VkStructureType sType; + const void* pNext; + VkImage image; +} VkImageSparseMemoryRequirementsInfo2; + +typedef struct VkMemoryRequirements2 { + VkStructureType sType; + void* pNext; + VkMemoryRequirements memoryRequirements; +} VkMemoryRequirements2; + +typedef struct VkSparseImageMemoryRequirements2 { + VkStructureType sType; + void* pNext; + VkSparseImageMemoryRequirements memoryRequirements; +} VkSparseImageMemoryRequirements2; + +typedef struct VkPhysicalDeviceFeatures2 { + VkStructureType sType; + void* pNext; + VkPhysicalDeviceFeatures features; +} VkPhysicalDeviceFeatures2; + +typedef struct VkPhysicalDeviceProperties2 { + VkStructureType sType; + void* pNext; + VkPhysicalDeviceProperties properties; +} VkPhysicalDeviceProperties2; + +typedef struct VkFormatProperties2 { + VkStructureType sType; + void* pNext; + VkFormatProperties formatProperties; +} VkFormatProperties2; + +typedef struct VkImageFormatProperties2 { + VkStructureType sType; + void* pNext; + VkImageFormatProperties imageFormatProperties; +} VkImageFormatProperties2; + +typedef struct VkPhysicalDeviceImageFormatInfo2 { + VkStructureType sType; + const void* pNext; + VkFormat format; + VkImageType type; + VkImageTiling tiling; + VkImageUsageFlags usage; + VkImageCreateFlags flags; +} VkPhysicalDeviceImageFormatInfo2; + +typedef struct VkQueueFamilyProperties2 { + VkStructureType sType; + void* pNext; + VkQueueFamilyProperties queueFamilyProperties; +} VkQueueFamilyProperties2; + +typedef struct VkPhysicalDeviceMemoryProperties2 { + VkStructureType sType; + void* pNext; + VkPhysicalDeviceMemoryProperties memoryProperties; +} VkPhysicalDeviceMemoryProperties2; + +typedef struct VkSparseImageFormatProperties2 { + VkStructureType sType; + void* pNext; + VkSparseImageFormatProperties properties; +} VkSparseImageFormatProperties2; + +typedef struct VkPhysicalDeviceSparseImageFormatInfo2 { + VkStructureType sType; + const void* pNext; + VkFormat format; + VkImageType type; + VkSampleCountFlagBits samples; + VkImageUsageFlags usage; + VkImageTiling tiling; +} VkPhysicalDeviceSparseImageFormatInfo2; + +typedef struct VkPhysicalDevicePointClippingProperties { + VkStructureType sType; + void* pNext; + VkPointClippingBehavior pointClippingBehavior; +} VkPhysicalDevicePointClippingProperties; + +typedef struct VkInputAttachmentAspectReference { + uint32_t subpass; + uint32_t inputAttachmentIndex; + VkImageAspectFlags aspectMask; +} VkInputAttachmentAspectReference; + +typedef struct VkRenderPassInputAttachmentAspectCreateInfo { + VkStructureType sType; + const void* pNext; + uint32_t aspectReferenceCount; + const VkInputAttachmentAspectReference* pAspectReferences; +} VkRenderPassInputAttachmentAspectCreateInfo; + +typedef struct VkImageViewUsageCreateInfo { + VkStructureType sType; + const void* pNext; + VkImageUsageFlags usage; +} VkImageViewUsageCreateInfo; + +typedef struct VkPipelineTessellationDomainOriginStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkTessellationDomainOrigin domainOrigin; +} VkPipelineTessellationDomainOriginStateCreateInfo; + +typedef struct VkRenderPassMultiviewCreateInfo { + VkStructureType sType; + const void* pNext; + uint32_t subpassCount; + const uint32_t* pViewMasks; + uint32_t dependencyCount; + const int32_t* pViewOffsets; + uint32_t correlationMaskCount; + const uint32_t* pCorrelationMasks; +} VkRenderPassMultiviewCreateInfo; + +typedef struct VkPhysicalDeviceMultiviewFeatures { + VkStructureType sType; + void* pNext; + VkBool32 multiview; + VkBool32 multiviewGeometryShader; + VkBool32 multiviewTessellationShader; +} VkPhysicalDeviceMultiviewFeatures; + +typedef struct VkPhysicalDeviceMultiviewProperties { + VkStructureType sType; + void* pNext; + uint32_t maxMultiviewViewCount; + uint32_t maxMultiviewInstanceIndex; +} VkPhysicalDeviceMultiviewProperties; + +typedef struct VkPhysicalDeviceVariablePointerFeatures { + VkStructureType sType; + void* pNext; + VkBool32 variablePointersStorageBuffer; + VkBool32 variablePointers; +} VkPhysicalDeviceVariablePointerFeatures; + +typedef struct VkPhysicalDeviceProtectedMemoryFeatures { + VkStructureType sType; + void* pNext; + VkBool32 protectedMemory; +} VkPhysicalDeviceProtectedMemoryFeatures; + +typedef struct VkPhysicalDeviceProtectedMemoryProperties { + VkStructureType sType; + void* pNext; + VkBool32 protectedNoFault; +} VkPhysicalDeviceProtectedMemoryProperties; + +typedef struct VkDeviceQueueInfo2 { + VkStructureType sType; + const void* pNext; + VkDeviceQueueCreateFlags flags; + uint32_t queueFamilyIndex; + uint32_t queueIndex; +} VkDeviceQueueInfo2; + +typedef struct VkProtectedSubmitInfo { + VkStructureType sType; + const void* pNext; + VkBool32 protectedSubmit; +} VkProtectedSubmitInfo; + +typedef struct VkSamplerYcbcrConversionCreateInfo { + VkStructureType sType; + const void* pNext; + VkFormat format; + VkSamplerYcbcrModelConversion ycbcrModel; + VkSamplerYcbcrRange ycbcrRange; + VkComponentMapping components; + VkChromaLocation xChromaOffset; + VkChromaLocation yChromaOffset; + VkFilter chromaFilter; + VkBool32 forceExplicitReconstruction; +} VkSamplerYcbcrConversionCreateInfo; + +typedef struct VkSamplerYcbcrConversionInfo { + VkStructureType sType; + const void* pNext; + VkSamplerYcbcrConversion conversion; +} VkSamplerYcbcrConversionInfo; + +typedef struct VkBindImagePlaneMemoryInfo { + VkStructureType sType; + const void* pNext; + VkImageAspectFlagBits planeAspect; +} VkBindImagePlaneMemoryInfo; + +typedef struct VkImagePlaneMemoryRequirementsInfo { + VkStructureType sType; + const void* pNext; + VkImageAspectFlagBits planeAspect; +} VkImagePlaneMemoryRequirementsInfo; + +typedef struct VkPhysicalDeviceSamplerYcbcrConversionFeatures { + VkStructureType sType; + void* pNext; + VkBool32 samplerYcbcrConversion; +} VkPhysicalDeviceSamplerYcbcrConversionFeatures; + +typedef struct VkSamplerYcbcrConversionImageFormatProperties { + VkStructureType sType; + void* pNext; + uint32_t combinedImageSamplerDescriptorCount; +} VkSamplerYcbcrConversionImageFormatProperties; + +typedef struct VkDescriptorUpdateTemplateEntry { + uint32_t dstBinding; + uint32_t dstArrayElement; + uint32_t descriptorCount; + VkDescriptorType descriptorType; + size_t offset; + size_t stride; +} VkDescriptorUpdateTemplateEntry; + +typedef struct VkDescriptorUpdateTemplateCreateInfo { + VkStructureType sType; + void* pNext; + VkDescriptorUpdateTemplateCreateFlags flags; + uint32_t descriptorUpdateEntryCount; + const VkDescriptorUpdateTemplateEntry* pDescriptorUpdateEntries; + VkDescriptorUpdateTemplateType templateType; + VkDescriptorSetLayout descriptorSetLayout; + VkPipelineBindPoint pipelineBindPoint; + VkPipelineLayout pipelineLayout; + uint32_t set; +} VkDescriptorUpdateTemplateCreateInfo; + +typedef struct VkExternalMemoryProperties { + VkExternalMemoryFeatureFlags externalMemoryFeatures; + VkExternalMemoryHandleTypeFlags exportFromImportedHandleTypes; + VkExternalMemoryHandleTypeFlags compatibleHandleTypes; +} VkExternalMemoryProperties; + +typedef struct VkPhysicalDeviceExternalImageFormatInfo { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagBits handleType; +} VkPhysicalDeviceExternalImageFormatInfo; + +typedef struct VkExternalImageFormatProperties { + VkStructureType sType; + void* pNext; + VkExternalMemoryProperties externalMemoryProperties; +} VkExternalImageFormatProperties; + +typedef struct VkPhysicalDeviceExternalBufferInfo { + VkStructureType sType; + const void* pNext; + VkBufferCreateFlags flags; + VkBufferUsageFlags usage; + VkExternalMemoryHandleTypeFlagBits handleType; +} VkPhysicalDeviceExternalBufferInfo; + +typedef struct VkExternalBufferProperties { + VkStructureType sType; + void* pNext; + VkExternalMemoryProperties externalMemoryProperties; +} VkExternalBufferProperties; + +typedef struct VkPhysicalDeviceIDProperties { + VkStructureType sType; + void* pNext; + uint8_t deviceUUID[VK_UUID_SIZE]; + uint8_t driverUUID[VK_UUID_SIZE]; + uint8_t deviceLUID[VK_LUID_SIZE]; + uint32_t deviceNodeMask; + VkBool32 deviceLUIDValid; +} VkPhysicalDeviceIDProperties; + +typedef struct VkExternalMemoryImageCreateInfo { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlags handleTypes; +} VkExternalMemoryImageCreateInfo; + +typedef struct VkExternalMemoryBufferCreateInfo { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlags handleTypes; +} VkExternalMemoryBufferCreateInfo; + +typedef struct VkExportMemoryAllocateInfo { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlags handleTypes; +} VkExportMemoryAllocateInfo; + +typedef struct VkPhysicalDeviceExternalFenceInfo { + VkStructureType sType; + const void* pNext; + VkExternalFenceHandleTypeFlagBits handleType; +} VkPhysicalDeviceExternalFenceInfo; + +typedef struct VkExternalFenceProperties { + VkStructureType sType; + void* pNext; + VkExternalFenceHandleTypeFlags exportFromImportedHandleTypes; + VkExternalFenceHandleTypeFlags compatibleHandleTypes; + VkExternalFenceFeatureFlags externalFenceFeatures; +} VkExternalFenceProperties; + +typedef struct VkExportFenceCreateInfo { + VkStructureType sType; + const void* pNext; + VkExternalFenceHandleTypeFlags handleTypes; +} VkExportFenceCreateInfo; + +typedef struct VkExportSemaphoreCreateInfo { + VkStructureType sType; + const void* pNext; + VkExternalSemaphoreHandleTypeFlags handleTypes; +} VkExportSemaphoreCreateInfo; + +typedef struct VkPhysicalDeviceExternalSemaphoreInfo { + VkStructureType sType; + const void* pNext; + VkExternalSemaphoreHandleTypeFlagBits handleType; +} VkPhysicalDeviceExternalSemaphoreInfo; + +typedef struct VkExternalSemaphoreProperties { + VkStructureType sType; + void* pNext; + VkExternalSemaphoreHandleTypeFlags exportFromImportedHandleTypes; + VkExternalSemaphoreHandleTypeFlags compatibleHandleTypes; + VkExternalSemaphoreFeatureFlags externalSemaphoreFeatures; +} VkExternalSemaphoreProperties; + +typedef struct VkPhysicalDeviceMaintenance3Properties { + VkStructureType sType; + void* pNext; + uint32_t maxPerSetDescriptors; + VkDeviceSize maxMemoryAllocationSize; +} VkPhysicalDeviceMaintenance3Properties; + +typedef struct VkDescriptorSetLayoutSupport { + VkStructureType sType; + void* pNext; + VkBool32 supported; +} VkDescriptorSetLayoutSupport; + +typedef struct VkPhysicalDeviceShaderDrawParameterFeatures { + VkStructureType sType; + void* pNext; + VkBool32 shaderDrawParameters; +} VkPhysicalDeviceShaderDrawParameterFeatures; + + +typedef VkResult (VKAPI_PTR *PFN_vkEnumerateInstanceVersion)(uint32_t* pApiVersion); +typedef VkResult (VKAPI_PTR *PFN_vkBindBufferMemory2)(VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo* pBindInfos); +typedef VkResult (VKAPI_PTR *PFN_vkBindImageMemory2)(VkDevice device, uint32_t bindInfoCount, const VkBindImageMemoryInfo* pBindInfos); +typedef void (VKAPI_PTR *PFN_vkGetDeviceGroupPeerMemoryFeatures)(VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex, VkPeerMemoryFeatureFlags* pPeerMemoryFeatures); +typedef void (VKAPI_PTR *PFN_vkCmdSetDeviceMask)(VkCommandBuffer commandBuffer, uint32_t deviceMask); +typedef void (VKAPI_PTR *PFN_vkCmdDispatchBase)(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); +typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceGroups)(VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties); +typedef void (VKAPI_PTR *PFN_vkGetImageMemoryRequirements2)(VkDevice device, const VkImageMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetBufferMemoryRequirements2)(VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements2)(VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures2)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2* pFeatures); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceProperties2)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2* pProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFormatProperties2)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties2* pFormatProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceImageFormatProperties2)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo, VkImageFormatProperties2* pImageFormatProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyProperties2)(VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties2* pQueueFamilyProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMemoryProperties2)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo, uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties); +typedef void (VKAPI_PTR *PFN_vkTrimCommandPool)(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlags flags); +typedef void (VKAPI_PTR *PFN_vkGetDeviceQueue2)(VkDevice device, const VkDeviceQueueInfo2* pQueueInfo, VkQueue* pQueue); +typedef VkResult (VKAPI_PTR *PFN_vkCreateSamplerYcbcrConversion)(VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversion* pYcbcrConversion); +typedef void (VKAPI_PTR *PFN_vkDestroySamplerYcbcrConversion)(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorUpdateTemplate)(VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate); +typedef void (VKAPI_PTR *PFN_vkDestroyDescriptorUpdateTemplate)(VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSetWithTemplate)(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalBufferProperties)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, VkExternalBufferProperties* pExternalBufferProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalFenceProperties)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, VkExternalFenceProperties* pExternalFenceProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, VkExternalSemaphoreProperties* pExternalSemaphoreProperties); +typedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutSupport)(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceVersion( + uint32_t* pApiVersion); + +VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory2( + VkDevice device, + uint32_t bindInfoCount, + const VkBindBufferMemoryInfo* pBindInfos); + +VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory2( + VkDevice device, + uint32_t bindInfoCount, + const VkBindImageMemoryInfo* pBindInfos); + +VKAPI_ATTR void VKAPI_CALL vkGetDeviceGroupPeerMemoryFeatures( + VkDevice device, + uint32_t heapIndex, + uint32_t localDeviceIndex, + uint32_t remoteDeviceIndex, + VkPeerMemoryFeatureFlags* pPeerMemoryFeatures); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMask( + VkCommandBuffer commandBuffer, + uint32_t deviceMask); + +VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBase( + VkCommandBuffer commandBuffer, + uint32_t baseGroupX, + uint32_t baseGroupY, + uint32_t baseGroupZ, + uint32_t groupCountX, + uint32_t groupCountY, + uint32_t groupCountZ); + +VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroups( + VkInstance instance, + uint32_t* pPhysicalDeviceGroupCount, + VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements2( + VkDevice device, + const VkImageMemoryRequirementsInfo2* pInfo, + VkMemoryRequirements2* pMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements2( + VkDevice device, + const VkBufferMemoryRequirementsInfo2* pInfo, + VkMemoryRequirements2* pMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements2( + VkDevice device, + const VkImageSparseMemoryRequirementsInfo2* pInfo, + uint32_t* pSparseMemoryRequirementCount, + VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures2( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceFeatures2* pFeatures); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties2( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceProperties2* pProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties2( + VkPhysicalDevice physicalDevice, + VkFormat format, + VkFormatProperties2* pFormatProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties2( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo, + VkImageFormatProperties2* pImageFormatProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties2( + VkPhysicalDevice physicalDevice, + uint32_t* pQueueFamilyPropertyCount, + VkQueueFamilyProperties2* pQueueFamilyProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties2( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceMemoryProperties2* pMemoryProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties2( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo, + uint32_t* pPropertyCount, + VkSparseImageFormatProperties2* pProperties); + +VKAPI_ATTR void VKAPI_CALL vkTrimCommandPool( + VkDevice device, + VkCommandPool commandPool, + VkCommandPoolTrimFlags flags); + +VKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue2( + VkDevice device, + const VkDeviceQueueInfo2* pQueueInfo, + VkQueue* pQueue); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateSamplerYcbcrConversion( + VkDevice device, + const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSamplerYcbcrConversion* pYcbcrConversion); + +VKAPI_ATTR void VKAPI_CALL vkDestroySamplerYcbcrConversion( + VkDevice device, + VkSamplerYcbcrConversion ycbcrConversion, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorUpdateTemplate( + VkDevice device, + const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate); + +VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorUpdateTemplate( + VkDevice device, + VkDescriptorUpdateTemplate descriptorUpdateTemplate, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSetWithTemplate( + VkDevice device, + VkDescriptorSet descriptorSet, + VkDescriptorUpdateTemplate descriptorUpdateTemplate, + const void* pData); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalBufferProperties( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, + VkExternalBufferProperties* pExternalBufferProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalFenceProperties( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, + VkExternalFenceProperties* pExternalFenceProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalSemaphoreProperties( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, + VkExternalSemaphoreProperties* pExternalSemaphoreProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutSupport( + VkDevice device, + const VkDescriptorSetLayoutCreateInfo* pCreateInfo, + VkDescriptorSetLayoutSupport* pSupport); +#endif + +#define VK_KHR_surface 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR) + +#define VK_KHR_SURFACE_SPEC_VERSION 25 +#define VK_KHR_SURFACE_EXTENSION_NAME "VK_KHR_surface" + + +typedef enum VkColorSpaceKHR { + VK_COLOR_SPACE_SRGB_NONLINEAR_KHR = 0, + VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT = 1000104001, + VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT = 1000104002, + VK_COLOR_SPACE_DCI_P3_LINEAR_EXT = 1000104003, + VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT = 1000104004, + VK_COLOR_SPACE_BT709_LINEAR_EXT = 1000104005, + VK_COLOR_SPACE_BT709_NONLINEAR_EXT = 1000104006, + VK_COLOR_SPACE_BT2020_LINEAR_EXT = 1000104007, + VK_COLOR_SPACE_HDR10_ST2084_EXT = 1000104008, + VK_COLOR_SPACE_DOLBYVISION_EXT = 1000104009, + VK_COLOR_SPACE_HDR10_HLG_EXT = 1000104010, + VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT = 1000104011, + VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT = 1000104012, + VK_COLOR_SPACE_PASS_THROUGH_EXT = 1000104013, + VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT = 1000104014, + VK_COLORSPACE_SRGB_NONLINEAR_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, + VK_COLOR_SPACE_BEGIN_RANGE_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, + VK_COLOR_SPACE_END_RANGE_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, + VK_COLOR_SPACE_RANGE_SIZE_KHR = (VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - VK_COLOR_SPACE_SRGB_NONLINEAR_KHR + 1), + VK_COLOR_SPACE_MAX_ENUM_KHR = 0x7FFFFFFF +} VkColorSpaceKHR; + +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, + VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR = 1000111000, + VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR = 1000111001, + VK_PRESENT_MODE_BEGIN_RANGE_KHR = VK_PRESENT_MODE_IMMEDIATE_KHR, + VK_PRESENT_MODE_END_RANGE_KHR = VK_PRESENT_MODE_FIFO_RELAXED_KHR, + VK_PRESENT_MODE_RANGE_SIZE_KHR = (VK_PRESENT_MODE_FIFO_RELAXED_KHR - VK_PRESENT_MODE_IMMEDIATE_KHR + 1), + VK_PRESENT_MODE_MAX_ENUM_KHR = 0x7FFFFFFF +} VkPresentModeKHR; + + +typedef enum VkSurfaceTransformFlagBitsKHR { + VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR = 0x00000001, + VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR = 0x00000002, + VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR = 0x00000004, + VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR = 0x00000008, + VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR = 0x00000010, + VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR = 0x00000020, + VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR = 0x00000040, + VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR = 0x00000080, + VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR = 0x00000100, + VK_SURFACE_TRANSFORM_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkSurfaceTransformFlagBitsKHR; +typedef VkFlags VkSurfaceTransformFlagsKHR; + +typedef enum VkCompositeAlphaFlagBitsKHR { + VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR = 0x00000001, + VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR = 0x00000002, + VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR = 0x00000004, + VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR = 0x00000008, + VK_COMPOSITE_ALPHA_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkCompositeAlphaFlagBitsKHR; +typedef VkFlags VkCompositeAlphaFlagsKHR; + +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 VkSurfaceFormatKHR { + VkFormat format; + VkColorSpaceKHR colorSpace; +} VkSurfaceFormatKHR; + + +typedef void (VKAPI_PTR *PFN_vkDestroySurfaceKHR)(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR( + VkInstance instance, + VkSurfaceKHR surface, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceSupportKHR( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + VkSurfaceKHR surface, + VkBool32* pSupported); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR( + VkPhysicalDevice physicalDevice, + VkSurfaceKHR surface, + VkSurfaceCapabilitiesKHR* pSurfaceCapabilities); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR( + VkPhysicalDevice physicalDevice, + VkSurfaceKHR surface, + uint32_t* pSurfaceFormatCount, + VkSurfaceFormatKHR* pSurfaceFormats); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModesKHR( + VkPhysicalDevice physicalDevice, + VkSurfaceKHR surface, + uint32_t* pPresentModeCount, + VkPresentModeKHR* pPresentModes); +#endif + +#define VK_KHR_swapchain 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSwapchainKHR) + +#define VK_KHR_SWAPCHAIN_SPEC_VERSION 70 +#define VK_KHR_SWAPCHAIN_EXTENSION_NAME "VK_KHR_swapchain" + + +typedef enum VkSwapchainCreateFlagBitsKHR { + VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = 0x00000001, + VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR = 0x00000002, + VK_SWAPCHAIN_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkSwapchainCreateFlagBitsKHR; +typedef VkFlags VkSwapchainCreateFlagsKHR; + +typedef enum VkDeviceGroupPresentModeFlagBitsKHR { + VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR = 0x00000001, + VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR = 0x00000002, + VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR = 0x00000004, + VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR = 0x00000008, + VK_DEVICE_GROUP_PRESENT_MODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkDeviceGroupPresentModeFlagBitsKHR; +typedef VkFlags VkDeviceGroupPresentModeFlagsKHR; + +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 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 VkDeviceGroupPresentCapabilitiesKHR { + VkStructureType sType; + const void* pNext; + uint32_t presentMask[VK_MAX_DEVICE_GROUP_SIZE]; + VkDeviceGroupPresentModeFlagsKHR modes; +} VkDeviceGroupPresentCapabilitiesKHR; + +typedef struct VkDeviceGroupPresentInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t swapchainCount; + const uint32_t* pDeviceMasks; + VkDeviceGroupPresentModeFlagBitsKHR mode; +} VkDeviceGroupPresentInfoKHR; + +typedef struct VkDeviceGroupSwapchainCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkDeviceGroupPresentModeFlagsKHR modes; +} VkDeviceGroupSwapchainCreateInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateSwapchainKHR)(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain); +typedef void (VKAPI_PTR *PFN_vkDestroySwapchainKHR)(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainImagesKHR)(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages); +typedef VkResult (VKAPI_PTR *PFN_vkAcquireNextImageKHR)(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t* pImageIndex); +typedef VkResult (VKAPI_PTR *PFN_vkQueuePresentKHR)(VkQueue queue, const VkPresentInfoKHR* pPresentInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupPresentCapabilitiesKHR)(VkDevice device, VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities); +typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupSurfacePresentModesKHR)(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHR* pModes); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pRectCount, VkRect2D* pRects); +typedef VkResult (VKAPI_PTR *PFN_vkAcquireNextImage2KHR)(VkDevice device, const VkAcquireNextImageInfoKHR* pAcquireInfo, uint32_t* pImageIndex); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR( + VkDevice device, + const VkSwapchainCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSwapchainKHR* pSwapchain); + +VKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR( + VkDevice device, + VkSwapchainKHR swapchain, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR( + VkDevice device, + VkSwapchainKHR swapchain, + uint32_t* pSwapchainImageCount, + VkImage* pSwapchainImages); + +VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR( + VkDevice device, + VkSwapchainKHR swapchain, + uint64_t timeout, + VkSemaphore semaphore, + VkFence fence, + uint32_t* pImageIndex); + +VKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR( + VkQueue queue, + const VkPresentInfoKHR* pPresentInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupPresentCapabilitiesKHR( + VkDevice device, + VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModesKHR( + VkDevice device, + VkSurfaceKHR surface, + VkDeviceGroupPresentModeFlagsKHR* pModes); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDevicePresentRectanglesKHR( + VkPhysicalDevice physicalDevice, + VkSurfaceKHR surface, + uint32_t* pRectCount, + VkRect2D* pRects); + +VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImage2KHR( + VkDevice device, + const VkAcquireNextImageInfoKHR* pAcquireInfo, + uint32_t* pImageIndex); +#endif + +#define VK_KHR_display 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayKHR) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayModeKHR) + +#define VK_KHR_DISPLAY_SPEC_VERSION 21 +#define VK_KHR_DISPLAY_EXTENSION_NAME "VK_KHR_display" + + +typedef enum VkDisplayPlaneAlphaFlagBitsKHR { + VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR = 0x00000001, + VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR = 0x00000002, + VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR = 0x00000004, + VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR = 0x00000008, + VK_DISPLAY_PLANE_ALPHA_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkDisplayPlaneAlphaFlagBitsKHR; +typedef VkFlags VkDisplayPlaneAlphaFlagsKHR; +typedef VkFlags VkDisplayModeCreateFlagsKHR; +typedef VkFlags VkDisplaySurfaceCreateFlagsKHR; + +typedef struct VkDisplayPropertiesKHR { + VkDisplayKHR display; + const char* displayName; + VkExtent2D physicalDimensions; + VkExtent2D physicalResolution; + VkSurfaceTransformFlagsKHR supportedTransforms; + VkBool32 planeReorderPossible; + VkBool32 persistentContent; +} VkDisplayPropertiesKHR; + +typedef struct VkDisplayModeParametersKHR { + VkExtent2D visibleRegion; + uint32_t refreshRate; +} VkDisplayModeParametersKHR; + +typedef struct VkDisplayModePropertiesKHR { + VkDisplayModeKHR displayMode; + VkDisplayModeParametersKHR parameters; +} VkDisplayModePropertiesKHR; + +typedef struct VkDisplayModeCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkDisplayModeCreateFlagsKHR flags; + VkDisplayModeParametersKHR parameters; +} VkDisplayModeCreateInfoKHR; + +typedef struct VkDisplayPlaneCapabilitiesKHR { + VkDisplayPlaneAlphaFlagsKHR supportedAlpha; + VkOffset2D minSrcPosition; + VkOffset2D maxSrcPosition; + VkExtent2D minSrcExtent; + VkExtent2D maxSrcExtent; + VkOffset2D minDstPosition; + VkOffset2D maxDstPosition; + VkExtent2D minDstExtent; + VkExtent2D maxDstExtent; +} VkDisplayPlaneCapabilitiesKHR; + +typedef struct VkDisplayPlanePropertiesKHR { + VkDisplayKHR currentDisplay; + uint32_t currentStackIndex; +} VkDisplayPlanePropertiesKHR; + +typedef struct VkDisplaySurfaceCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkDisplaySurfaceCreateFlagsKHR flags; + VkDisplayModeKHR displayMode; + uint32_t planeIndex; + uint32_t planeStackIndex; + VkSurfaceTransformFlagBitsKHR transform; + float globalAlpha; + VkDisplayPlaneAlphaFlagBitsKHR alphaMode; + VkExtent2D imageExtent; +} VkDisplaySurfaceCreateInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPropertiesKHR* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPlanePropertiesKHR* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetDisplayPlaneSupportedDisplaysKHR)(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t* pDisplayCount, VkDisplayKHR* pDisplays); +typedef VkResult (VKAPI_PTR *PFN_vkGetDisplayModePropertiesKHR)(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModePropertiesKHR* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkCreateDisplayModeKHR)(VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode); +typedef VkResult (VKAPI_PTR *PFN_vkGetDisplayPlaneCapabilitiesKHR)(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities); +typedef VkResult (VKAPI_PTR *PFN_vkCreateDisplayPlaneSurfaceKHR)(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPropertiesKHR( + VkPhysicalDevice physicalDevice, + uint32_t* pPropertyCount, + VkDisplayPropertiesKHR* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlanePropertiesKHR( + VkPhysicalDevice physicalDevice, + uint32_t* pPropertyCount, + VkDisplayPlanePropertiesKHR* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneSupportedDisplaysKHR( + VkPhysicalDevice physicalDevice, + uint32_t planeIndex, + uint32_t* pDisplayCount, + VkDisplayKHR* pDisplays); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModePropertiesKHR( + VkPhysicalDevice physicalDevice, + VkDisplayKHR display, + uint32_t* pPropertyCount, + VkDisplayModePropertiesKHR* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayModeKHR( + VkPhysicalDevice physicalDevice, + VkDisplayKHR display, + const VkDisplayModeCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDisplayModeKHR* pMode); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilitiesKHR( + VkPhysicalDevice physicalDevice, + VkDisplayModeKHR mode, + uint32_t planeIndex, + VkDisplayPlaneCapabilitiesKHR* pCapabilities); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayPlaneSurfaceKHR( + VkInstance instance, + const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); +#endif + +#define VK_KHR_display_swapchain 1 +#define VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION 9 +#define VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME "VK_KHR_display_swapchain" + +typedef struct VkDisplayPresentInfoKHR { + VkStructureType sType; + const void* pNext; + VkRect2D srcRect; + VkRect2D dstRect; + VkBool32 persistent; +} VkDisplayPresentInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateSharedSwapchainsKHR)(VkDevice device, uint32_t swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateSharedSwapchainsKHR( + VkDevice device, + uint32_t swapchainCount, + const VkSwapchainCreateInfoKHR* pCreateInfos, + const VkAllocationCallbacks* pAllocator, + VkSwapchainKHR* pSwapchains); +#endif + +#define VK_KHR_sampler_mirror_clamp_to_edge 1 +#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_SPEC_VERSION 1 +#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME "VK_KHR_sampler_mirror_clamp_to_edge" + + +#define VK_KHR_multiview 1 +#define VK_KHR_MULTIVIEW_SPEC_VERSION 1 +#define VK_KHR_MULTIVIEW_EXTENSION_NAME "VK_KHR_multiview" + +typedef VkRenderPassMultiviewCreateInfo VkRenderPassMultiviewCreateInfoKHR; + +typedef VkPhysicalDeviceMultiviewFeatures VkPhysicalDeviceMultiviewFeaturesKHR; + +typedef VkPhysicalDeviceMultiviewProperties VkPhysicalDeviceMultiviewPropertiesKHR; + + + +#define VK_KHR_get_physical_device_properties2 1 +#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION 1 +#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME "VK_KHR_get_physical_device_properties2" + +typedef VkPhysicalDeviceFeatures2 VkPhysicalDeviceFeatures2KHR; + +typedef VkPhysicalDeviceProperties2 VkPhysicalDeviceProperties2KHR; + +typedef VkFormatProperties2 VkFormatProperties2KHR; + +typedef VkImageFormatProperties2 VkImageFormatProperties2KHR; + +typedef VkPhysicalDeviceImageFormatInfo2 VkPhysicalDeviceImageFormatInfo2KHR; + +typedef VkQueueFamilyProperties2 VkQueueFamilyProperties2KHR; + +typedef VkPhysicalDeviceMemoryProperties2 VkPhysicalDeviceMemoryProperties2KHR; + +typedef VkSparseImageFormatProperties2 VkSparseImageFormatProperties2KHR; + +typedef VkPhysicalDeviceSparseImageFormatInfo2 VkPhysicalDeviceSparseImageFormatInfo2KHR; + + +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2* pFeatures); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceProperties2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2* pProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFormatProperties2KHR)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties2* pFormatProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo, VkImageFormatProperties2* pImageFormatProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)(VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties2* pQueueFamilyProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMemoryProperties2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo, uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures2KHR( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceFeatures2* pFeatures); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties2KHR( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceProperties2* pProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties2KHR( + VkPhysicalDevice physicalDevice, + VkFormat format, + VkFormatProperties2* pFormatProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties2KHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo, + VkImageFormatProperties2* pImageFormatProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties2KHR( + VkPhysicalDevice physicalDevice, + uint32_t* pQueueFamilyPropertyCount, + VkQueueFamilyProperties2* pQueueFamilyProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties2KHR( + VkPhysicalDevice physicalDevice, + VkPhysicalDeviceMemoryProperties2* pMemoryProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties2KHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo, + uint32_t* pPropertyCount, + VkSparseImageFormatProperties2* pProperties); +#endif + +#define VK_KHR_device_group 1 +#define VK_KHR_DEVICE_GROUP_SPEC_VERSION 3 +#define VK_KHR_DEVICE_GROUP_EXTENSION_NAME "VK_KHR_device_group" + +typedef VkPeerMemoryFeatureFlags VkPeerMemoryFeatureFlagsKHR; + +typedef VkPeerMemoryFeatureFlagBits VkPeerMemoryFeatureFlagBitsKHR; + +typedef VkMemoryAllocateFlags VkMemoryAllocateFlagsKHR; + +typedef VkMemoryAllocateFlagBits VkMemoryAllocateFlagBitsKHR; + + +typedef VkMemoryAllocateFlagsInfo VkMemoryAllocateFlagsInfoKHR; + +typedef VkDeviceGroupRenderPassBeginInfo VkDeviceGroupRenderPassBeginInfoKHR; + +typedef VkDeviceGroupCommandBufferBeginInfo VkDeviceGroupCommandBufferBeginInfoKHR; + +typedef VkDeviceGroupSubmitInfo VkDeviceGroupSubmitInfoKHR; + +typedef VkDeviceGroupBindSparseInfo VkDeviceGroupBindSparseInfoKHR; + +typedef VkBindBufferMemoryDeviceGroupInfo VkBindBufferMemoryDeviceGroupInfoKHR; + +typedef VkBindImageMemoryDeviceGroupInfo VkBindImageMemoryDeviceGroupInfoKHR; + + +typedef void (VKAPI_PTR *PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)(VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex, VkPeerMemoryFeatureFlags* pPeerMemoryFeatures); +typedef void (VKAPI_PTR *PFN_vkCmdSetDeviceMaskKHR)(VkCommandBuffer commandBuffer, uint32_t deviceMask); +typedef void (VKAPI_PTR *PFN_vkCmdDispatchBaseKHR)(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetDeviceGroupPeerMemoryFeaturesKHR( + VkDevice device, + uint32_t heapIndex, + uint32_t localDeviceIndex, + uint32_t remoteDeviceIndex, + VkPeerMemoryFeatureFlags* pPeerMemoryFeatures); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMaskKHR( + VkCommandBuffer commandBuffer, + uint32_t deviceMask); + +VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBaseKHR( + VkCommandBuffer commandBuffer, + uint32_t baseGroupX, + uint32_t baseGroupY, + uint32_t baseGroupZ, + uint32_t groupCountX, + uint32_t groupCountY, + uint32_t groupCountZ); +#endif + +#define VK_KHR_shader_draw_parameters 1 +#define VK_KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION 1 +#define VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME "VK_KHR_shader_draw_parameters" + + +#define VK_KHR_maintenance1 1 +#define VK_KHR_MAINTENANCE1_SPEC_VERSION 2 +#define VK_KHR_MAINTENANCE1_EXTENSION_NAME "VK_KHR_maintenance1" + +typedef VkCommandPoolTrimFlags VkCommandPoolTrimFlagsKHR; + + +typedef void (VKAPI_PTR *PFN_vkTrimCommandPoolKHR)(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlags flags); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkTrimCommandPoolKHR( + VkDevice device, + VkCommandPool commandPool, + VkCommandPoolTrimFlags flags); +#endif + +#define VK_KHR_device_group_creation 1 +#define VK_KHR_DEVICE_GROUP_CREATION_SPEC_VERSION 1 +#define VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME "VK_KHR_device_group_creation" +#define VK_MAX_DEVICE_GROUP_SIZE_KHR VK_MAX_DEVICE_GROUP_SIZE + +typedef VkPhysicalDeviceGroupProperties VkPhysicalDeviceGroupPropertiesKHR; + +typedef VkDeviceGroupDeviceCreateInfo VkDeviceGroupDeviceCreateInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceGroupsKHR)(VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroupsKHR( + VkInstance instance, + uint32_t* pPhysicalDeviceGroupCount, + VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties); +#endif + +#define VK_KHR_external_memory_capabilities 1 +#define VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME "VK_KHR_external_memory_capabilities" +#define VK_LUID_SIZE_KHR VK_LUID_SIZE + +typedef VkExternalMemoryHandleTypeFlags VkExternalMemoryHandleTypeFlagsKHR; + +typedef VkExternalMemoryHandleTypeFlagBits VkExternalMemoryHandleTypeFlagBitsKHR; + +typedef VkExternalMemoryFeatureFlags VkExternalMemoryFeatureFlagsKHR; + +typedef VkExternalMemoryFeatureFlagBits VkExternalMemoryFeatureFlagBitsKHR; + + +typedef VkExternalMemoryProperties VkExternalMemoryPropertiesKHR; + +typedef VkPhysicalDeviceExternalImageFormatInfo VkPhysicalDeviceExternalImageFormatInfoKHR; + +typedef VkExternalImageFormatProperties VkExternalImageFormatPropertiesKHR; + +typedef VkPhysicalDeviceExternalBufferInfo VkPhysicalDeviceExternalBufferInfoKHR; + +typedef VkExternalBufferProperties VkExternalBufferPropertiesKHR; + +typedef VkPhysicalDeviceIDProperties VkPhysicalDeviceIDPropertiesKHR; + + +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, VkExternalBufferProperties* pExternalBufferProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalBufferPropertiesKHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, + VkExternalBufferProperties* pExternalBufferProperties); +#endif + +#define VK_KHR_external_memory 1 +#define VK_KHR_EXTERNAL_MEMORY_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME "VK_KHR_external_memory" +#define VK_QUEUE_FAMILY_EXTERNAL_KHR VK_QUEUE_FAMILY_EXTERNAL + +typedef VkExternalMemoryImageCreateInfo VkExternalMemoryImageCreateInfoKHR; + +typedef VkExternalMemoryBufferCreateInfo VkExternalMemoryBufferCreateInfoKHR; + +typedef VkExportMemoryAllocateInfo VkExportMemoryAllocateInfoKHR; + + + +#define VK_KHR_external_memory_fd 1 +#define VK_KHR_EXTERNAL_MEMORY_FD_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME "VK_KHR_external_memory_fd" + +typedef struct VkImportMemoryFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagBits handleType; + int fd; +} VkImportMemoryFdInfoKHR; + +typedef struct VkMemoryFdPropertiesKHR { + VkStructureType sType; + void* pNext; + uint32_t memoryTypeBits; +} VkMemoryFdPropertiesKHR; + +typedef struct VkMemoryGetFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkDeviceMemory memory; + VkExternalMemoryHandleTypeFlagBits handleType; +} VkMemoryGetFdInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryFdKHR)(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd); +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryFdPropertiesKHR)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryFdKHR( + VkDevice device, + const VkMemoryGetFdInfoKHR* pGetFdInfo, + int* pFd); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryFdPropertiesKHR( + VkDevice device, + VkExternalMemoryHandleTypeFlagBits handleType, + int fd, + VkMemoryFdPropertiesKHR* pMemoryFdProperties); +#endif + +#define VK_KHR_external_semaphore_capabilities 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME "VK_KHR_external_semaphore_capabilities" + +typedef VkExternalSemaphoreHandleTypeFlags VkExternalSemaphoreHandleTypeFlagsKHR; + +typedef VkExternalSemaphoreHandleTypeFlagBits VkExternalSemaphoreHandleTypeFlagBitsKHR; + +typedef VkExternalSemaphoreFeatureFlags VkExternalSemaphoreFeatureFlagsKHR; + +typedef VkExternalSemaphoreFeatureFlagBits VkExternalSemaphoreFeatureFlagBitsKHR; + + +typedef VkPhysicalDeviceExternalSemaphoreInfo VkPhysicalDeviceExternalSemaphoreInfoKHR; + +typedef VkExternalSemaphoreProperties VkExternalSemaphorePropertiesKHR; + + +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, VkExternalSemaphoreProperties* pExternalSemaphoreProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalSemaphorePropertiesKHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, + VkExternalSemaphoreProperties* pExternalSemaphoreProperties); +#endif + +#define VK_KHR_external_semaphore 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME "VK_KHR_external_semaphore" + +typedef VkSemaphoreImportFlags VkSemaphoreImportFlagsKHR; + +typedef VkSemaphoreImportFlagBits VkSemaphoreImportFlagBitsKHR; + + +typedef VkExportSemaphoreCreateInfo VkExportSemaphoreCreateInfoKHR; + + + +#define VK_KHR_external_semaphore_fd 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_FD_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME "VK_KHR_external_semaphore_fd" + +typedef struct VkImportSemaphoreFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkSemaphore semaphore; + VkSemaphoreImportFlags flags; + VkExternalSemaphoreHandleTypeFlagBits handleType; + int fd; +} VkImportSemaphoreFdInfoKHR; + +typedef struct VkSemaphoreGetFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkSemaphore semaphore; + VkExternalSemaphoreHandleTypeFlagBits handleType; +} VkSemaphoreGetFdInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreFdKHR)(VkDevice device, const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreFdKHR)(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreFdKHR( + VkDevice device, + const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreFdKHR( + VkDevice device, + const VkSemaphoreGetFdInfoKHR* pGetFdInfo, + int* pFd); +#endif + +#define VK_KHR_push_descriptor 1 +#define VK_KHR_PUSH_DESCRIPTOR_SPEC_VERSION 2 +#define VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME "VK_KHR_push_descriptor" + +typedef struct VkPhysicalDevicePushDescriptorPropertiesKHR { + VkStructureType sType; + void* pNext; + uint32_t maxPushDescriptors; +} VkPhysicalDevicePushDescriptorPropertiesKHR; + + +typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetKHR)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites); +typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplateKHR)(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate, VkPipelineLayout layout, uint32_t set, const void* pData); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetKHR( + VkCommandBuffer commandBuffer, + VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, + uint32_t set, + uint32_t descriptorWriteCount, + const VkWriteDescriptorSet* pDescriptorWrites); + +VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplateKHR( + VkCommandBuffer commandBuffer, + VkDescriptorUpdateTemplate descriptorUpdateTemplate, + VkPipelineLayout layout, + uint32_t set, + const void* pData); +#endif + +#define VK_KHR_16bit_storage 1 +#define VK_KHR_16BIT_STORAGE_SPEC_VERSION 1 +#define VK_KHR_16BIT_STORAGE_EXTENSION_NAME "VK_KHR_16bit_storage" + +typedef VkPhysicalDevice16BitStorageFeatures VkPhysicalDevice16BitStorageFeaturesKHR; + + + +#define VK_KHR_incremental_present 1 +#define VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION 1 +#define VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME "VK_KHR_incremental_present" + +typedef struct VkRectLayerKHR { + VkOffset2D offset; + VkExtent2D extent; + uint32_t layer; +} VkRectLayerKHR; + +typedef struct VkPresentRegionKHR { + uint32_t rectangleCount; + const VkRectLayerKHR* pRectangles; +} VkPresentRegionKHR; + +typedef struct VkPresentRegionsKHR { + VkStructureType sType; + const void* pNext; + uint32_t swapchainCount; + const VkPresentRegionKHR* pRegions; +} VkPresentRegionsKHR; + + + +#define VK_KHR_descriptor_update_template 1 +typedef VkDescriptorUpdateTemplate VkDescriptorUpdateTemplateKHR; + + +#define VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_SPEC_VERSION 1 +#define VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME "VK_KHR_descriptor_update_template" + +typedef VkDescriptorUpdateTemplateType VkDescriptorUpdateTemplateTypeKHR; + + +typedef VkDescriptorUpdateTemplateCreateFlags VkDescriptorUpdateTemplateCreateFlagsKHR; + + +typedef VkDescriptorUpdateTemplateEntry VkDescriptorUpdateTemplateEntryKHR; + +typedef VkDescriptorUpdateTemplateCreateInfo VkDescriptorUpdateTemplateCreateInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorUpdateTemplateKHR)(VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate); +typedef void (VKAPI_PTR *PFN_vkDestroyDescriptorUpdateTemplateKHR)(VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSetWithTemplateKHR)(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorUpdateTemplateKHR( + VkDevice device, + const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate); + +VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorUpdateTemplateKHR( + VkDevice device, + VkDescriptorUpdateTemplate descriptorUpdateTemplate, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSetWithTemplateKHR( + VkDevice device, + VkDescriptorSet descriptorSet, + VkDescriptorUpdateTemplate descriptorUpdateTemplate, + const void* pData); +#endif + +#define VK_KHR_create_renderpass2 1 +#define VK_KHR_CREATE_RENDERPASS_2_SPEC_VERSION 1 +#define VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME "VK_KHR_create_renderpass2" + +typedef struct VkAttachmentDescription2KHR { + VkStructureType sType; + const void* pNext; + VkAttachmentDescriptionFlags flags; + VkFormat format; + VkSampleCountFlagBits samples; + VkAttachmentLoadOp loadOp; + VkAttachmentStoreOp storeOp; + VkAttachmentLoadOp stencilLoadOp; + VkAttachmentStoreOp stencilStoreOp; + VkImageLayout initialLayout; + VkImageLayout finalLayout; +} VkAttachmentDescription2KHR; + +typedef struct VkAttachmentReference2KHR { + VkStructureType sType; + const void* pNext; + uint32_t attachment; + VkImageLayout layout; + VkImageAspectFlags aspectMask; +} VkAttachmentReference2KHR; + +typedef struct VkSubpassDescription2KHR { + VkStructureType sType; + const void* pNext; + VkSubpassDescriptionFlags flags; + VkPipelineBindPoint pipelineBindPoint; + uint32_t viewMask; + uint32_t inputAttachmentCount; + const VkAttachmentReference2KHR* pInputAttachments; + uint32_t colorAttachmentCount; + const VkAttachmentReference2KHR* pColorAttachments; + const VkAttachmentReference2KHR* pResolveAttachments; + const VkAttachmentReference2KHR* pDepthStencilAttachment; + uint32_t preserveAttachmentCount; + const uint32_t* pPreserveAttachments; +} VkSubpassDescription2KHR; + +typedef struct VkSubpassDependency2KHR { + VkStructureType sType; + const void* pNext; + uint32_t srcSubpass; + uint32_t dstSubpass; + VkPipelineStageFlags srcStageMask; + VkPipelineStageFlags dstStageMask; + VkAccessFlags srcAccessMask; + VkAccessFlags dstAccessMask; + VkDependencyFlags dependencyFlags; + int32_t viewOffset; +} VkSubpassDependency2KHR; + +typedef struct VkRenderPassCreateInfo2KHR { + VkStructureType sType; + const void* pNext; + VkRenderPassCreateFlags flags; + uint32_t attachmentCount; + const VkAttachmentDescription2KHR* pAttachments; + uint32_t subpassCount; + const VkSubpassDescription2KHR* pSubpasses; + uint32_t dependencyCount; + const VkSubpassDependency2KHR* pDependencies; + uint32_t correlatedViewMaskCount; + const uint32_t* pCorrelatedViewMasks; +} VkRenderPassCreateInfo2KHR; + +typedef struct VkSubpassBeginInfoKHR { + VkStructureType sType; + const void* pNext; + VkSubpassContents contents; +} VkSubpassBeginInfoKHR; + +typedef struct VkSubpassEndInfoKHR { + VkStructureType sType; + const void* pNext; +} VkSubpassEndInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass2KHR)(VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass); +typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfoKHR* pSubpassBeginInfo); +typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR* pSubpassBeginInfo, const VkSubpassEndInfoKHR* pSubpassEndInfo); +typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR* pSubpassEndInfo); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass2KHR( + VkDevice device, + const VkRenderPassCreateInfo2KHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkRenderPass* pRenderPass); + +VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass2KHR( + VkCommandBuffer commandBuffer, + const VkRenderPassBeginInfo* pRenderPassBegin, + const VkSubpassBeginInfoKHR* pSubpassBeginInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass2KHR( + VkCommandBuffer commandBuffer, + const VkSubpassBeginInfoKHR* pSubpassBeginInfo, + const VkSubpassEndInfoKHR* pSubpassEndInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass2KHR( + VkCommandBuffer commandBuffer, + const VkSubpassEndInfoKHR* pSubpassEndInfo); +#endif + +#define VK_KHR_shared_presentable_image 1 +#define VK_KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION 1 +#define VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME "VK_KHR_shared_presentable_image" + +typedef struct VkSharedPresentSurfaceCapabilitiesKHR { + VkStructureType sType; + void* pNext; + VkImageUsageFlags sharedPresentSupportedUsageFlags; +} VkSharedPresentSurfaceCapabilitiesKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainStatusKHR)(VkDevice device, VkSwapchainKHR swapchain); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainStatusKHR( + VkDevice device, + VkSwapchainKHR swapchain); +#endif + +#define VK_KHR_external_fence_capabilities 1 +#define VK_KHR_EXTERNAL_FENCE_CAPABILITIES_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME "VK_KHR_external_fence_capabilities" + +typedef VkExternalFenceHandleTypeFlags VkExternalFenceHandleTypeFlagsKHR; + +typedef VkExternalFenceHandleTypeFlagBits VkExternalFenceHandleTypeFlagBitsKHR; + +typedef VkExternalFenceFeatureFlags VkExternalFenceFeatureFlagsKHR; + +typedef VkExternalFenceFeatureFlagBits VkExternalFenceFeatureFlagBitsKHR; + + +typedef VkPhysicalDeviceExternalFenceInfo VkPhysicalDeviceExternalFenceInfoKHR; + +typedef VkExternalFenceProperties VkExternalFencePropertiesKHR; + + +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, VkExternalFenceProperties* pExternalFenceProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalFencePropertiesKHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, + VkExternalFenceProperties* pExternalFenceProperties); +#endif + +#define VK_KHR_external_fence 1 +#define VK_KHR_EXTERNAL_FENCE_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME "VK_KHR_external_fence" + +typedef VkFenceImportFlags VkFenceImportFlagsKHR; + +typedef VkFenceImportFlagBits VkFenceImportFlagBitsKHR; + + +typedef VkExportFenceCreateInfo VkExportFenceCreateInfoKHR; + + + +#define VK_KHR_external_fence_fd 1 +#define VK_KHR_EXTERNAL_FENCE_FD_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME "VK_KHR_external_fence_fd" + +typedef struct VkImportFenceFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkFence fence; + VkFenceImportFlags flags; + VkExternalFenceHandleTypeFlagBits handleType; + int fd; +} VkImportFenceFdInfoKHR; + +typedef struct VkFenceGetFdInfoKHR { + VkStructureType sType; + const void* pNext; + VkFence fence; + VkExternalFenceHandleTypeFlagBits handleType; +} VkFenceGetFdInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkImportFenceFdKHR)(VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetFenceFdKHR)(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkImportFenceFdKHR( + VkDevice device, + const VkImportFenceFdInfoKHR* pImportFenceFdInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceFdKHR( + VkDevice device, + const VkFenceGetFdInfoKHR* pGetFdInfo, + int* pFd); +#endif + +#define VK_KHR_maintenance2 1 +#define VK_KHR_MAINTENANCE2_SPEC_VERSION 1 +#define VK_KHR_MAINTENANCE2_EXTENSION_NAME "VK_KHR_maintenance2" + +typedef VkPointClippingBehavior VkPointClippingBehaviorKHR; + +typedef VkTessellationDomainOrigin VkTessellationDomainOriginKHR; + + +typedef VkPhysicalDevicePointClippingProperties VkPhysicalDevicePointClippingPropertiesKHR; + +typedef VkRenderPassInputAttachmentAspectCreateInfo VkRenderPassInputAttachmentAspectCreateInfoKHR; + +typedef VkInputAttachmentAspectReference VkInputAttachmentAspectReferenceKHR; + +typedef VkImageViewUsageCreateInfo VkImageViewUsageCreateInfoKHR; + +typedef VkPipelineTessellationDomainOriginStateCreateInfo VkPipelineTessellationDomainOriginStateCreateInfoKHR; + + + +#define VK_KHR_get_surface_capabilities2 1 +#define VK_KHR_GET_SURFACE_CAPABILITIES_2_SPEC_VERSION 1 +#define VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME "VK_KHR_get_surface_capabilities2" + +typedef struct VkPhysicalDeviceSurfaceInfo2KHR { + VkStructureType sType; + const void* pNext; + VkSurfaceKHR surface; +} VkPhysicalDeviceSurfaceInfo2KHR; + +typedef struct VkSurfaceCapabilities2KHR { + VkStructureType sType; + void* pNext; + VkSurfaceCapabilitiesKHR surfaceCapabilities; +} VkSurfaceCapabilities2KHR; + +typedef struct VkSurfaceFormat2KHR { + VkStructureType sType; + void* pNext; + VkSurfaceFormatKHR surfaceFormat; +} VkSurfaceFormat2KHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilities2KHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, + VkSurfaceCapabilities2KHR* pSurfaceCapabilities); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormats2KHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, + uint32_t* pSurfaceFormatCount, + VkSurfaceFormat2KHR* pSurfaceFormats); +#endif + +#define VK_KHR_variable_pointers 1 +#define VK_KHR_VARIABLE_POINTERS_SPEC_VERSION 1 +#define VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME "VK_KHR_variable_pointers" + +typedef VkPhysicalDeviceVariablePointerFeatures VkPhysicalDeviceVariablePointerFeaturesKHR; + + + +#define VK_KHR_get_display_properties2 1 +#define VK_KHR_GET_DISPLAY_PROPERTIES_2_SPEC_VERSION 1 +#define VK_KHR_GET_DISPLAY_PROPERTIES_2_EXTENSION_NAME "VK_KHR_get_display_properties2" + +typedef struct VkDisplayProperties2KHR { + VkStructureType sType; + void* pNext; + VkDisplayPropertiesKHR displayProperties; +} VkDisplayProperties2KHR; + +typedef struct VkDisplayPlaneProperties2KHR { + VkStructureType sType; + void* pNext; + VkDisplayPlanePropertiesKHR displayPlaneProperties; +} VkDisplayPlaneProperties2KHR; + +typedef struct VkDisplayModeProperties2KHR { + VkStructureType sType; + void* pNext; + VkDisplayModePropertiesKHR displayModeProperties; +} VkDisplayModeProperties2KHR; + +typedef struct VkDisplayPlaneInfo2KHR { + VkStructureType sType; + const void* pNext; + VkDisplayModeKHR mode; + uint32_t planeIndex; +} VkDisplayPlaneInfo2KHR; + +typedef struct VkDisplayPlaneCapabilities2KHR { + VkStructureType sType; + void* pNext; + VkDisplayPlaneCapabilitiesKHR capabilities; +} VkDisplayPlaneCapabilities2KHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceDisplayProperties2KHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayProperties2KHR* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPlaneProperties2KHR* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetDisplayModeProperties2KHR)(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModeProperties2KHR* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetDisplayPlaneCapabilities2KHR)(VkPhysicalDevice physicalDevice, const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo, VkDisplayPlaneCapabilities2KHR* pCapabilities); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayProperties2KHR( + VkPhysicalDevice physicalDevice, + uint32_t* pPropertyCount, + VkDisplayProperties2KHR* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlaneProperties2KHR( + VkPhysicalDevice physicalDevice, + uint32_t* pPropertyCount, + VkDisplayPlaneProperties2KHR* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModeProperties2KHR( + VkPhysicalDevice physicalDevice, + VkDisplayKHR display, + uint32_t* pPropertyCount, + VkDisplayModeProperties2KHR* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilities2KHR( + VkPhysicalDevice physicalDevice, + const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo, + VkDisplayPlaneCapabilities2KHR* pCapabilities); +#endif + +#define VK_KHR_dedicated_allocation 1 +#define VK_KHR_DEDICATED_ALLOCATION_SPEC_VERSION 3 +#define VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME "VK_KHR_dedicated_allocation" + +typedef VkMemoryDedicatedRequirements VkMemoryDedicatedRequirementsKHR; + +typedef VkMemoryDedicatedAllocateInfo VkMemoryDedicatedAllocateInfoKHR; + + + +#define VK_KHR_storage_buffer_storage_class 1 +#define VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION 1 +#define VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME "VK_KHR_storage_buffer_storage_class" + + +#define VK_KHR_relaxed_block_layout 1 +#define VK_KHR_RELAXED_BLOCK_LAYOUT_SPEC_VERSION 1 +#define VK_KHR_RELAXED_BLOCK_LAYOUT_EXTENSION_NAME "VK_KHR_relaxed_block_layout" + + +#define VK_KHR_get_memory_requirements2 1 +#define VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION 1 +#define VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME "VK_KHR_get_memory_requirements2" + +typedef VkBufferMemoryRequirementsInfo2 VkBufferMemoryRequirementsInfo2KHR; + +typedef VkImageMemoryRequirementsInfo2 VkImageMemoryRequirementsInfo2KHR; + +typedef VkImageSparseMemoryRequirementsInfo2 VkImageSparseMemoryRequirementsInfo2KHR; + +typedef VkMemoryRequirements2 VkMemoryRequirements2KHR; + +typedef VkSparseImageMemoryRequirements2 VkSparseImageMemoryRequirements2KHR; + + +typedef void (VKAPI_PTR *PFN_vkGetImageMemoryRequirements2KHR)(VkDevice device, const VkImageMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetBufferMemoryRequirements2KHR)(VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements2KHR)(VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements2KHR( + VkDevice device, + const VkImageMemoryRequirementsInfo2* pInfo, + VkMemoryRequirements2* pMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements2KHR( + VkDevice device, + const VkBufferMemoryRequirementsInfo2* pInfo, + VkMemoryRequirements2* pMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements2KHR( + VkDevice device, + const VkImageSparseMemoryRequirementsInfo2* pInfo, + uint32_t* pSparseMemoryRequirementCount, + VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); +#endif + +#define VK_KHR_image_format_list 1 +#define VK_KHR_IMAGE_FORMAT_LIST_SPEC_VERSION 1 +#define VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME "VK_KHR_image_format_list" + +typedef struct VkImageFormatListCreateInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t viewFormatCount; + const VkFormat* pViewFormats; +} VkImageFormatListCreateInfoKHR; + + + +#define VK_KHR_sampler_ycbcr_conversion 1 +typedef VkSamplerYcbcrConversion VkSamplerYcbcrConversionKHR; + + +#define VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION 1 +#define VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME "VK_KHR_sampler_ycbcr_conversion" + +typedef VkSamplerYcbcrModelConversion VkSamplerYcbcrModelConversionKHR; + +typedef VkSamplerYcbcrRange VkSamplerYcbcrRangeKHR; + +typedef VkChromaLocation VkChromaLocationKHR; + + +typedef VkSamplerYcbcrConversionCreateInfo VkSamplerYcbcrConversionCreateInfoKHR; + +typedef VkSamplerYcbcrConversionInfo VkSamplerYcbcrConversionInfoKHR; + +typedef VkBindImagePlaneMemoryInfo VkBindImagePlaneMemoryInfoKHR; + +typedef VkImagePlaneMemoryRequirementsInfo VkImagePlaneMemoryRequirementsInfoKHR; + +typedef VkPhysicalDeviceSamplerYcbcrConversionFeatures VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR; + +typedef VkSamplerYcbcrConversionImageFormatProperties VkSamplerYcbcrConversionImageFormatPropertiesKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateSamplerYcbcrConversionKHR)(VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversion* pYcbcrConversion); +typedef void (VKAPI_PTR *PFN_vkDestroySamplerYcbcrConversionKHR)(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion, const VkAllocationCallbacks* pAllocator); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateSamplerYcbcrConversionKHR( + VkDevice device, + const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSamplerYcbcrConversion* pYcbcrConversion); + +VKAPI_ATTR void VKAPI_CALL vkDestroySamplerYcbcrConversionKHR( + VkDevice device, + VkSamplerYcbcrConversion ycbcrConversion, + const VkAllocationCallbacks* pAllocator); +#endif + +#define VK_KHR_bind_memory2 1 +#define VK_KHR_BIND_MEMORY_2_SPEC_VERSION 1 +#define VK_KHR_BIND_MEMORY_2_EXTENSION_NAME "VK_KHR_bind_memory2" + +typedef VkBindBufferMemoryInfo VkBindBufferMemoryInfoKHR; + +typedef VkBindImageMemoryInfo VkBindImageMemoryInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkBindBufferMemory2KHR)(VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo* pBindInfos); +typedef VkResult (VKAPI_PTR *PFN_vkBindImageMemory2KHR)(VkDevice device, uint32_t bindInfoCount, const VkBindImageMemoryInfo* pBindInfos); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory2KHR( + VkDevice device, + uint32_t bindInfoCount, + const VkBindBufferMemoryInfo* pBindInfos); + +VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory2KHR( + VkDevice device, + uint32_t bindInfoCount, + const VkBindImageMemoryInfo* pBindInfos); +#endif + +#define VK_KHR_maintenance3 1 +#define VK_KHR_MAINTENANCE3_SPEC_VERSION 1 +#define VK_KHR_MAINTENANCE3_EXTENSION_NAME "VK_KHR_maintenance3" + +typedef VkPhysicalDeviceMaintenance3Properties VkPhysicalDeviceMaintenance3PropertiesKHR; + +typedef VkDescriptorSetLayoutSupport VkDescriptorSetLayoutSupportKHR; + + +typedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutSupportKHR)(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutSupportKHR( + VkDevice device, + const VkDescriptorSetLayoutCreateInfo* pCreateInfo, + VkDescriptorSetLayoutSupport* pSupport); +#endif + +#define VK_KHR_draw_indirect_count 1 +#define VK_KHR_DRAW_INDIRECT_COUNT_SPEC_VERSION 1 +#define VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME "VK_KHR_draw_indirect_count" + +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCountKHR)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCountKHR)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountKHR( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkBuffer countBuffer, + VkDeviceSize countBufferOffset, + uint32_t maxDrawCount, + uint32_t stride); + +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountKHR( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkBuffer countBuffer, + VkDeviceSize countBufferOffset, + uint32_t maxDrawCount, + uint32_t stride); +#endif + +#define VK_KHR_8bit_storage 1 +#define VK_KHR_8BIT_STORAGE_SPEC_VERSION 1 +#define VK_KHR_8BIT_STORAGE_EXTENSION_NAME "VK_KHR_8bit_storage" + +typedef struct VkPhysicalDevice8BitStorageFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 storageBuffer8BitAccess; + VkBool32 uniformAndStorageBuffer8BitAccess; + VkBool32 storagePushConstant8; +} VkPhysicalDevice8BitStorageFeaturesKHR; + + + +#define VK_EXT_debug_report 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT) + +#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 9 +#define VK_EXT_DEBUG_REPORT_EXTENSION_NAME "VK_EXT_debug_report" + + +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_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_SAMPLER_YCBCR_CONVERSION_EXT = 1000156000, + VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT = 1000085000, + VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_BEGIN_RANGE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_END_RANGE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_RANGE_SIZE_EXT = (VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT + 1), + VK_DEBUG_REPORT_OBJECT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDebugReportObjectTypeEXT; + + +typedef enum VkDebugReportFlagBitsEXT { + VK_DEBUG_REPORT_INFORMATION_BIT_EXT = 0x00000001, + VK_DEBUG_REPORT_WARNING_BIT_EXT = 0x00000002, + VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT = 0x00000004, + VK_DEBUG_REPORT_ERROR_BIT_EXT = 0x00000008, + VK_DEBUG_REPORT_DEBUG_BIT_EXT = 0x00000010, + VK_DEBUG_REPORT_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDebugReportFlagBitsEXT; +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 VkDebugReportCallbackCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkDebugReportFlagsEXT flags; + PFN_vkDebugReportCallbackEXT pfnCallback; + void* pUserData; +} VkDebugReportCallbackCreateInfoEXT; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateDebugReportCallbackEXT)(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback); +typedef void (VKAPI_PTR *PFN_vkDestroyDebugReportCallbackEXT)(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkDebugReportMessageEXT)(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT( + VkInstance instance, + const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDebugReportCallbackEXT* pCallback); + +VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT( + VkInstance instance, + VkDebugReportCallbackEXT callback, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT( + VkInstance instance, + VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT objectType, + uint64_t object, + size_t location, + int32_t messageCode, + const char* pLayerPrefix, + const char* pMessage); +#endif + +#define VK_NV_glsl_shader 1 +#define VK_NV_GLSL_SHADER_SPEC_VERSION 1 +#define VK_NV_GLSL_SHADER_EXTENSION_NAME "VK_NV_glsl_shader" + + +#define VK_EXT_depth_range_unrestricted 1 +#define VK_EXT_DEPTH_RANGE_UNRESTRICTED_SPEC_VERSION 1 +#define VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME "VK_EXT_depth_range_unrestricted" + + +#define VK_IMG_filter_cubic 1 +#define VK_IMG_FILTER_CUBIC_SPEC_VERSION 1 +#define VK_IMG_FILTER_CUBIC_EXTENSION_NAME "VK_IMG_filter_cubic" + + +#define VK_AMD_rasterization_order 1 +#define VK_AMD_RASTERIZATION_ORDER_SPEC_VERSION 1 +#define VK_AMD_RASTERIZATION_ORDER_EXTENSION_NAME "VK_AMD_rasterization_order" + + +typedef enum VkRasterizationOrderAMD { + VK_RASTERIZATION_ORDER_STRICT_AMD = 0, + VK_RASTERIZATION_ORDER_RELAXED_AMD = 1, + VK_RASTERIZATION_ORDER_BEGIN_RANGE_AMD = VK_RASTERIZATION_ORDER_STRICT_AMD, + VK_RASTERIZATION_ORDER_END_RANGE_AMD = VK_RASTERIZATION_ORDER_RELAXED_AMD, + VK_RASTERIZATION_ORDER_RANGE_SIZE_AMD = (VK_RASTERIZATION_ORDER_RELAXED_AMD - VK_RASTERIZATION_ORDER_STRICT_AMD + 1), + VK_RASTERIZATION_ORDER_MAX_ENUM_AMD = 0x7FFFFFFF +} VkRasterizationOrderAMD; + +typedef struct VkPipelineRasterizationStateRasterizationOrderAMD { + VkStructureType sType; + const void* pNext; + VkRasterizationOrderAMD rasterizationOrder; +} VkPipelineRasterizationStateRasterizationOrderAMD; + + + +#define VK_AMD_shader_trinary_minmax 1 +#define VK_AMD_SHADER_TRINARY_MINMAX_SPEC_VERSION 1 +#define VK_AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME "VK_AMD_shader_trinary_minmax" + + +#define VK_AMD_shader_explicit_vertex_parameter 1 +#define VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_SPEC_VERSION 1 +#define VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME "VK_AMD_shader_explicit_vertex_parameter" + + +#define VK_EXT_debug_marker 1 +#define VK_EXT_DEBUG_MARKER_SPEC_VERSION 4 +#define VK_EXT_DEBUG_MARKER_EXTENSION_NAME "VK_EXT_debug_marker" + +typedef struct VkDebugMarkerObjectNameInfoEXT { + VkStructureType sType; + const void* pNext; + VkDebugReportObjectTypeEXT objectType; + uint64_t object; + const char* pObjectName; +} VkDebugMarkerObjectNameInfoEXT; + +typedef struct VkDebugMarkerObjectTagInfoEXT { + VkStructureType sType; + const void* pNext; + VkDebugReportObjectTypeEXT objectType; + uint64_t object; + uint64_t tagName; + size_t tagSize; + const void* pTag; +} VkDebugMarkerObjectTagInfoEXT; + +typedef struct VkDebugMarkerMarkerInfoEXT { + VkStructureType sType; + const void* pNext; + const char* pMarkerName; + float color[4]; +} VkDebugMarkerMarkerInfoEXT; + + +typedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectTagEXT)(VkDevice device, const VkDebugMarkerObjectTagInfoEXT* pTagInfo); +typedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectNameEXT)(VkDevice device, const VkDebugMarkerObjectNameInfoEXT* pNameInfo); +typedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerBeginEXT)(VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); +typedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerEndEXT)(VkCommandBuffer commandBuffer); +typedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerInsertEXT)(VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkDebugMarkerSetObjectTagEXT( + VkDevice device, + const VkDebugMarkerObjectTagInfoEXT* pTagInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkDebugMarkerSetObjectNameEXT( + VkDevice device, + const VkDebugMarkerObjectNameInfoEXT* pNameInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerBeginEXT( + VkCommandBuffer commandBuffer, + const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerEndEXT( + VkCommandBuffer commandBuffer); + +VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerInsertEXT( + VkCommandBuffer commandBuffer, + const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); +#endif + +#define VK_AMD_gcn_shader 1 +#define VK_AMD_GCN_SHADER_SPEC_VERSION 1 +#define VK_AMD_GCN_SHADER_EXTENSION_NAME "VK_AMD_gcn_shader" + + +#define VK_NV_dedicated_allocation 1 +#define VK_NV_DEDICATED_ALLOCATION_SPEC_VERSION 1 +#define VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME "VK_NV_dedicated_allocation" + +typedef struct VkDedicatedAllocationImageCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkBool32 dedicatedAllocation; +} VkDedicatedAllocationImageCreateInfoNV; + +typedef struct VkDedicatedAllocationBufferCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkBool32 dedicatedAllocation; +} VkDedicatedAllocationBufferCreateInfoNV; + +typedef struct VkDedicatedAllocationMemoryAllocateInfoNV { + VkStructureType sType; + const void* pNext; + VkImage image; + VkBuffer buffer; +} VkDedicatedAllocationMemoryAllocateInfoNV; + + + +#define VK_AMD_draw_indirect_count 1 +#define VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION 1 +#define VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME "VK_AMD_draw_indirect_count" + +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountAMD( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkBuffer countBuffer, + VkDeviceSize countBufferOffset, + uint32_t maxDrawCount, + uint32_t stride); + +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountAMD( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkBuffer countBuffer, + VkDeviceSize countBufferOffset, + uint32_t maxDrawCount, + uint32_t stride); +#endif + +#define VK_AMD_negative_viewport_height 1 +#define VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_SPEC_VERSION 1 +#define VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME "VK_AMD_negative_viewport_height" + + +#define VK_AMD_gpu_shader_half_float 1 +#define VK_AMD_GPU_SHADER_HALF_FLOAT_SPEC_VERSION 1 +#define VK_AMD_GPU_SHADER_HALF_FLOAT_EXTENSION_NAME "VK_AMD_gpu_shader_half_float" + + +#define VK_AMD_shader_ballot 1 +#define VK_AMD_SHADER_BALLOT_SPEC_VERSION 1 +#define VK_AMD_SHADER_BALLOT_EXTENSION_NAME "VK_AMD_shader_ballot" + + +#define VK_AMD_texture_gather_bias_lod 1 +#define VK_AMD_TEXTURE_GATHER_BIAS_LOD_SPEC_VERSION 1 +#define VK_AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME "VK_AMD_texture_gather_bias_lod" + +typedef struct VkTextureLODGatherFormatPropertiesAMD { + VkStructureType sType; + void* pNext; + VkBool32 supportsTextureGatherLODBiasAMD; +} VkTextureLODGatherFormatPropertiesAMD; + + + +#define VK_AMD_shader_info 1 +#define VK_AMD_SHADER_INFO_SPEC_VERSION 1 +#define VK_AMD_SHADER_INFO_EXTENSION_NAME "VK_AMD_shader_info" + + +typedef enum VkShaderInfoTypeAMD { + VK_SHADER_INFO_TYPE_STATISTICS_AMD = 0, + VK_SHADER_INFO_TYPE_BINARY_AMD = 1, + VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD = 2, + VK_SHADER_INFO_TYPE_BEGIN_RANGE_AMD = VK_SHADER_INFO_TYPE_STATISTICS_AMD, + VK_SHADER_INFO_TYPE_END_RANGE_AMD = VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD, + VK_SHADER_INFO_TYPE_RANGE_SIZE_AMD = (VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD - VK_SHADER_INFO_TYPE_STATISTICS_AMD + 1), + VK_SHADER_INFO_TYPE_MAX_ENUM_AMD = 0x7FFFFFFF +} VkShaderInfoTypeAMD; + +typedef struct VkShaderResourceUsageAMD { + uint32_t numUsedVgprs; + uint32_t numUsedSgprs; + uint32_t ldsSizePerLocalWorkGroup; + size_t ldsUsageSizeInBytes; + size_t scratchMemUsageInBytes; +} VkShaderResourceUsageAMD; + +typedef struct VkShaderStatisticsInfoAMD { + VkShaderStageFlags shaderStageMask; + VkShaderResourceUsageAMD resourceUsage; + uint32_t numPhysicalVgprs; + uint32_t numPhysicalSgprs; + uint32_t numAvailableVgprs; + uint32_t numAvailableSgprs; + uint32_t computeWorkGroupSize[3]; +} VkShaderStatisticsInfoAMD; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetShaderInfoAMD)(VkDevice device, VkPipeline pipeline, VkShaderStageFlagBits shaderStage, VkShaderInfoTypeAMD infoType, size_t* pInfoSize, void* pInfo); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetShaderInfoAMD( + VkDevice device, + VkPipeline pipeline, + VkShaderStageFlagBits shaderStage, + VkShaderInfoTypeAMD infoType, + size_t* pInfoSize, + void* pInfo); +#endif + +#define VK_AMD_shader_image_load_store_lod 1 +#define VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_SPEC_VERSION 1 +#define VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME "VK_AMD_shader_image_load_store_lod" + + +#define VK_IMG_format_pvrtc 1 +#define VK_IMG_FORMAT_PVRTC_SPEC_VERSION 1 +#define VK_IMG_FORMAT_PVRTC_EXTENSION_NAME "VK_IMG_format_pvrtc" + + +#define VK_NV_external_memory_capabilities 1 +#define VK_NV_EXTERNAL_MEMORY_CAPABILITIES_SPEC_VERSION 1 +#define VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME "VK_NV_external_memory_capabilities" + + +typedef enum VkExternalMemoryHandleTypeFlagBitsNV { + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV = 0x00000001, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV = 0x00000002, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV = 0x00000004, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_KMT_BIT_NV = 0x00000008, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF +} VkExternalMemoryHandleTypeFlagBitsNV; +typedef VkFlags VkExternalMemoryHandleTypeFlagsNV; + +typedef enum VkExternalMemoryFeatureFlagBitsNV { + VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV = 0x00000001, + VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV = 0x00000002, + VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV = 0x00000004, + VK_EXTERNAL_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF +} VkExternalMemoryFeatureFlagBitsNV; +typedef VkFlags VkExternalMemoryFeatureFlagsNV; + +typedef struct VkExternalImageFormatPropertiesNV { + VkImageFormatProperties imageFormatProperties; + VkExternalMemoryFeatureFlagsNV externalMemoryFeatures; + VkExternalMemoryHandleTypeFlagsNV exportFromImportedHandleTypes; + VkExternalMemoryHandleTypeFlagsNV compatibleHandleTypes; +} VkExternalImageFormatPropertiesNV; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceExternalImageFormatPropertiesNV( + VkPhysicalDevice physicalDevice, + VkFormat format, + VkImageType type, + VkImageTiling tiling, + VkImageUsageFlags usage, + VkImageCreateFlags flags, + VkExternalMemoryHandleTypeFlagsNV externalHandleType, + VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties); +#endif + +#define VK_NV_external_memory 1 +#define VK_NV_EXTERNAL_MEMORY_SPEC_VERSION 1 +#define VK_NV_EXTERNAL_MEMORY_EXTENSION_NAME "VK_NV_external_memory" + +typedef struct VkExternalMemoryImageCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagsNV handleTypes; +} VkExternalMemoryImageCreateInfoNV; + +typedef struct VkExportMemoryAllocateInfoNV { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagsNV handleTypes; +} VkExportMemoryAllocateInfoNV; + + + +#define VK_EXT_validation_flags 1 +#define VK_EXT_VALIDATION_FLAGS_SPEC_VERSION 1 +#define VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME "VK_EXT_validation_flags" + + +typedef enum VkValidationCheckEXT { + VK_VALIDATION_CHECK_ALL_EXT = 0, + VK_VALIDATION_CHECK_SHADERS_EXT = 1, + VK_VALIDATION_CHECK_BEGIN_RANGE_EXT = VK_VALIDATION_CHECK_ALL_EXT, + VK_VALIDATION_CHECK_END_RANGE_EXT = VK_VALIDATION_CHECK_SHADERS_EXT, + VK_VALIDATION_CHECK_RANGE_SIZE_EXT = (VK_VALIDATION_CHECK_SHADERS_EXT - VK_VALIDATION_CHECK_ALL_EXT + 1), + VK_VALIDATION_CHECK_MAX_ENUM_EXT = 0x7FFFFFFF +} VkValidationCheckEXT; + +typedef struct VkValidationFlagsEXT { + VkStructureType sType; + const void* pNext; + uint32_t disabledValidationCheckCount; + const VkValidationCheckEXT* pDisabledValidationChecks; +} VkValidationFlagsEXT; + + + +#define VK_EXT_shader_subgroup_ballot 1 +#define VK_EXT_SHADER_SUBGROUP_BALLOT_SPEC_VERSION 1 +#define VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME "VK_EXT_shader_subgroup_ballot" + + +#define VK_EXT_shader_subgroup_vote 1 +#define VK_EXT_SHADER_SUBGROUP_VOTE_SPEC_VERSION 1 +#define VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME "VK_EXT_shader_subgroup_vote" + + +#define VK_EXT_conditional_rendering 1 +#define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 1 +#define VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME "VK_EXT_conditional_rendering" + + +typedef enum VkConditionalRenderingFlagBitsEXT { + VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT = 0x00000001, + VK_CONDITIONAL_RENDERING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkConditionalRenderingFlagBitsEXT; +typedef VkFlags VkConditionalRenderingFlagsEXT; + +typedef struct VkConditionalRenderingBeginInfoEXT { + VkStructureType sType; + const void* pNext; + VkBuffer buffer; + VkDeviceSize offset; + VkConditionalRenderingFlagsEXT flags; +} VkConditionalRenderingBeginInfoEXT; + +typedef struct VkPhysicalDeviceConditionalRenderingFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 conditionalRendering; + VkBool32 inheritedConditionalRendering; +} VkPhysicalDeviceConditionalRenderingFeaturesEXT; + +typedef struct VkCommandBufferInheritanceConditionalRenderingInfoEXT { + VkStructureType sType; + const void* pNext; + VkBool32 conditionalRenderingEnable; +} VkCommandBufferInheritanceConditionalRenderingInfoEXT; + + +typedef void (VKAPI_PTR *PFN_vkCmdBeginConditionalRenderingEXT)(VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin); +typedef void (VKAPI_PTR *PFN_vkCmdEndConditionalRenderingEXT)(VkCommandBuffer commandBuffer); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBeginConditionalRenderingEXT( + VkCommandBuffer commandBuffer, + const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin); + +VKAPI_ATTR void VKAPI_CALL vkCmdEndConditionalRenderingEXT( + VkCommandBuffer commandBuffer); +#endif + +#define VK_NVX_device_generated_commands 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkObjectTableNVX) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkIndirectCommandsLayoutNVX) + +#define VK_NVX_DEVICE_GENERATED_COMMANDS_SPEC_VERSION 3 +#define VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME "VK_NVX_device_generated_commands" + + +typedef enum VkIndirectCommandsTokenTypeNVX { + VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NVX = 0, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_DESCRIPTOR_SET_NVX = 1, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NVX = 2, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NVX = 3, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NVX = 4, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NVX = 5, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NVX = 6, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NVX = 7, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_BEGIN_RANGE_NVX = VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NVX, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_END_RANGE_NVX = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NVX, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_RANGE_SIZE_NVX = (VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NVX - VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NVX + 1), + VK_INDIRECT_COMMANDS_TOKEN_TYPE_MAX_ENUM_NVX = 0x7FFFFFFF +} VkIndirectCommandsTokenTypeNVX; + +typedef enum VkObjectEntryTypeNVX { + VK_OBJECT_ENTRY_TYPE_DESCRIPTOR_SET_NVX = 0, + VK_OBJECT_ENTRY_TYPE_PIPELINE_NVX = 1, + VK_OBJECT_ENTRY_TYPE_INDEX_BUFFER_NVX = 2, + VK_OBJECT_ENTRY_TYPE_VERTEX_BUFFER_NVX = 3, + VK_OBJECT_ENTRY_TYPE_PUSH_CONSTANT_NVX = 4, + VK_OBJECT_ENTRY_TYPE_BEGIN_RANGE_NVX = VK_OBJECT_ENTRY_TYPE_DESCRIPTOR_SET_NVX, + VK_OBJECT_ENTRY_TYPE_END_RANGE_NVX = VK_OBJECT_ENTRY_TYPE_PUSH_CONSTANT_NVX, + VK_OBJECT_ENTRY_TYPE_RANGE_SIZE_NVX = (VK_OBJECT_ENTRY_TYPE_PUSH_CONSTANT_NVX - VK_OBJECT_ENTRY_TYPE_DESCRIPTOR_SET_NVX + 1), + VK_OBJECT_ENTRY_TYPE_MAX_ENUM_NVX = 0x7FFFFFFF +} VkObjectEntryTypeNVX; + + +typedef enum VkIndirectCommandsLayoutUsageFlagBitsNVX { + VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NVX = 0x00000001, + VK_INDIRECT_COMMANDS_LAYOUT_USAGE_SPARSE_SEQUENCES_BIT_NVX = 0x00000002, + VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EMPTY_EXECUTIONS_BIT_NVX = 0x00000004, + VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NVX = 0x00000008, + VK_INDIRECT_COMMANDS_LAYOUT_USAGE_FLAG_BITS_MAX_ENUM_NVX = 0x7FFFFFFF +} VkIndirectCommandsLayoutUsageFlagBitsNVX; +typedef VkFlags VkIndirectCommandsLayoutUsageFlagsNVX; + +typedef enum VkObjectEntryUsageFlagBitsNVX { + VK_OBJECT_ENTRY_USAGE_GRAPHICS_BIT_NVX = 0x00000001, + VK_OBJECT_ENTRY_USAGE_COMPUTE_BIT_NVX = 0x00000002, + VK_OBJECT_ENTRY_USAGE_FLAG_BITS_MAX_ENUM_NVX = 0x7FFFFFFF +} VkObjectEntryUsageFlagBitsNVX; +typedef VkFlags VkObjectEntryUsageFlagsNVX; + +typedef struct VkDeviceGeneratedCommandsFeaturesNVX { + VkStructureType sType; + const void* pNext; + VkBool32 computeBindingPointSupport; +} VkDeviceGeneratedCommandsFeaturesNVX; + +typedef struct VkDeviceGeneratedCommandsLimitsNVX { + VkStructureType sType; + const void* pNext; + uint32_t maxIndirectCommandsLayoutTokenCount; + uint32_t maxObjectEntryCounts; + uint32_t minSequenceCountBufferOffsetAlignment; + uint32_t minSequenceIndexBufferOffsetAlignment; + uint32_t minCommandsTokenBufferOffsetAlignment; +} VkDeviceGeneratedCommandsLimitsNVX; + +typedef struct VkIndirectCommandsTokenNVX { + VkIndirectCommandsTokenTypeNVX tokenType; + VkBuffer buffer; + VkDeviceSize offset; +} VkIndirectCommandsTokenNVX; + +typedef struct VkIndirectCommandsLayoutTokenNVX { + VkIndirectCommandsTokenTypeNVX tokenType; + uint32_t bindingUnit; + uint32_t dynamicCount; + uint32_t divisor; +} VkIndirectCommandsLayoutTokenNVX; + +typedef struct VkIndirectCommandsLayoutCreateInfoNVX { + VkStructureType sType; + const void* pNext; + VkPipelineBindPoint pipelineBindPoint; + VkIndirectCommandsLayoutUsageFlagsNVX flags; + uint32_t tokenCount; + const VkIndirectCommandsLayoutTokenNVX* pTokens; +} VkIndirectCommandsLayoutCreateInfoNVX; + +typedef struct VkCmdProcessCommandsInfoNVX { + VkStructureType sType; + const void* pNext; + VkObjectTableNVX objectTable; + VkIndirectCommandsLayoutNVX indirectCommandsLayout; + uint32_t indirectCommandsTokenCount; + const VkIndirectCommandsTokenNVX* pIndirectCommandsTokens; + uint32_t maxSequencesCount; + VkCommandBuffer targetCommandBuffer; + VkBuffer sequencesCountBuffer; + VkDeviceSize sequencesCountOffset; + VkBuffer sequencesIndexBuffer; + VkDeviceSize sequencesIndexOffset; +} VkCmdProcessCommandsInfoNVX; + +typedef struct VkCmdReserveSpaceForCommandsInfoNVX { + VkStructureType sType; + const void* pNext; + VkObjectTableNVX objectTable; + VkIndirectCommandsLayoutNVX indirectCommandsLayout; + uint32_t maxSequencesCount; +} VkCmdReserveSpaceForCommandsInfoNVX; + +typedef struct VkObjectTableCreateInfoNVX { + VkStructureType sType; + const void* pNext; + uint32_t objectCount; + const VkObjectEntryTypeNVX* pObjectEntryTypes; + const uint32_t* pObjectEntryCounts; + const VkObjectEntryUsageFlagsNVX* pObjectEntryUsageFlags; + uint32_t maxUniformBuffersPerDescriptor; + uint32_t maxStorageBuffersPerDescriptor; + uint32_t maxStorageImagesPerDescriptor; + uint32_t maxSampledImagesPerDescriptor; + uint32_t maxPipelineLayouts; +} VkObjectTableCreateInfoNVX; + +typedef struct VkObjectTableEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; +} VkObjectTableEntryNVX; + +typedef struct VkObjectTablePipelineEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; + VkPipeline pipeline; +} VkObjectTablePipelineEntryNVX; + +typedef struct VkObjectTableDescriptorSetEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; + VkPipelineLayout pipelineLayout; + VkDescriptorSet descriptorSet; +} VkObjectTableDescriptorSetEntryNVX; + +typedef struct VkObjectTableVertexBufferEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; + VkBuffer buffer; +} VkObjectTableVertexBufferEntryNVX; + +typedef struct VkObjectTableIndexBufferEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; + VkBuffer buffer; + VkIndexType indexType; +} VkObjectTableIndexBufferEntryNVX; + +typedef struct VkObjectTablePushConstantEntryNVX { + VkObjectEntryTypeNVX type; + VkObjectEntryUsageFlagsNVX flags; + VkPipelineLayout pipelineLayout; + VkShaderStageFlags stageFlags; +} VkObjectTablePushConstantEntryNVX; + + +typedef void (VKAPI_PTR *PFN_vkCmdProcessCommandsNVX)(VkCommandBuffer commandBuffer, const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo); +typedef void (VKAPI_PTR *PFN_vkCmdReserveSpaceForCommandsNVX)(VkCommandBuffer commandBuffer, const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo); +typedef VkResult (VKAPI_PTR *PFN_vkCreateIndirectCommandsLayoutNVX)(VkDevice device, const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout); +typedef void (VKAPI_PTR *PFN_vkDestroyIndirectCommandsLayoutNVX)(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateObjectTableNVX)(VkDevice device, const VkObjectTableCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkObjectTableNVX* pObjectTable); +typedef void (VKAPI_PTR *PFN_vkDestroyObjectTableNVX)(VkDevice device, VkObjectTableNVX objectTable, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkRegisterObjectsNVX)(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount, const VkObjectTableEntryNVX* const* ppObjectTableEntries, const uint32_t* pObjectIndices); +typedef VkResult (VKAPI_PTR *PFN_vkUnregisterObjectsNVX)(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount, const VkObjectEntryTypeNVX* pObjectEntryTypes, const uint32_t* pObjectIndices); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX)(VkPhysicalDevice physicalDevice, VkDeviceGeneratedCommandsFeaturesNVX* pFeatures, VkDeviceGeneratedCommandsLimitsNVX* pLimits); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdProcessCommandsNVX( + VkCommandBuffer commandBuffer, + const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdReserveSpaceForCommandsNVX( + VkCommandBuffer commandBuffer, + const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateIndirectCommandsLayoutNVX( + VkDevice device, + const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout); + +VKAPI_ATTR void VKAPI_CALL vkDestroyIndirectCommandsLayoutNVX( + VkDevice device, + VkIndirectCommandsLayoutNVX indirectCommandsLayout, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateObjectTableNVX( + VkDevice device, + const VkObjectTableCreateInfoNVX* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkObjectTableNVX* pObjectTable); + +VKAPI_ATTR void VKAPI_CALL vkDestroyObjectTableNVX( + VkDevice device, + VkObjectTableNVX objectTable, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkRegisterObjectsNVX( + VkDevice device, + VkObjectTableNVX objectTable, + uint32_t objectCount, + const VkObjectTableEntryNVX* const* ppObjectTableEntries, + const uint32_t* pObjectIndices); + +VKAPI_ATTR VkResult VKAPI_CALL vkUnregisterObjectsNVX( + VkDevice device, + VkObjectTableNVX objectTable, + uint32_t objectCount, + const VkObjectEntryTypeNVX* pObjectEntryTypes, + const uint32_t* pObjectIndices); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX( + VkPhysicalDevice physicalDevice, + VkDeviceGeneratedCommandsFeaturesNVX* pFeatures, + VkDeviceGeneratedCommandsLimitsNVX* pLimits); +#endif + +#define VK_NV_clip_space_w_scaling 1 +#define VK_NV_CLIP_SPACE_W_SCALING_SPEC_VERSION 1 +#define VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME "VK_NV_clip_space_w_scaling" + +typedef struct VkViewportWScalingNV { + float xcoeff; + float ycoeff; +} VkViewportWScalingNV; + +typedef struct VkPipelineViewportWScalingStateCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkBool32 viewportWScalingEnable; + uint32_t viewportCount; + const VkViewportWScalingNV* pViewportWScalings; +} VkPipelineViewportWScalingStateCreateInfoNV; + + +typedef void (VKAPI_PTR *PFN_vkCmdSetViewportWScalingNV)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewportWScalingNV* pViewportWScalings); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdSetViewportWScalingNV( + VkCommandBuffer commandBuffer, + uint32_t firstViewport, + uint32_t viewportCount, + const VkViewportWScalingNV* pViewportWScalings); +#endif + +#define VK_EXT_direct_mode_display 1 +#define VK_EXT_DIRECT_MODE_DISPLAY_SPEC_VERSION 1 +#define VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME "VK_EXT_direct_mode_display" + +typedef VkResult (VKAPI_PTR *PFN_vkReleaseDisplayEXT)(VkPhysicalDevice physicalDevice, VkDisplayKHR display); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkReleaseDisplayEXT( + VkPhysicalDevice physicalDevice, + VkDisplayKHR display); +#endif + +#define VK_EXT_display_surface_counter 1 +#define VK_EXT_DISPLAY_SURFACE_COUNTER_SPEC_VERSION 1 +#define VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME "VK_EXT_display_surface_counter" + + +typedef enum VkSurfaceCounterFlagBitsEXT { + VK_SURFACE_COUNTER_VBLANK_EXT = 0x00000001, + VK_SURFACE_COUNTER_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkSurfaceCounterFlagBitsEXT; +typedef VkFlags VkSurfaceCounterFlagsEXT; + +typedef struct VkSurfaceCapabilities2EXT { + VkStructureType sType; + void* pNext; + uint32_t minImageCount; + uint32_t maxImageCount; + VkExtent2D currentExtent; + VkExtent2D minImageExtent; + VkExtent2D maxImageExtent; + uint32_t maxImageArrayLayers; + VkSurfaceTransformFlagsKHR supportedTransforms; + VkSurfaceTransformFlagBitsKHR currentTransform; + VkCompositeAlphaFlagsKHR supportedCompositeAlpha; + VkImageUsageFlags supportedUsageFlags; + VkSurfaceCounterFlagsEXT supportedSurfaceCounters; +} VkSurfaceCapabilities2EXT; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilities2EXT* pSurfaceCapabilities); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilities2EXT( + VkPhysicalDevice physicalDevice, + VkSurfaceKHR surface, + VkSurfaceCapabilities2EXT* pSurfaceCapabilities); +#endif + +#define VK_EXT_display_control 1 +#define VK_EXT_DISPLAY_CONTROL_SPEC_VERSION 1 +#define VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME "VK_EXT_display_control" + + +typedef enum VkDisplayPowerStateEXT { + VK_DISPLAY_POWER_STATE_OFF_EXT = 0, + VK_DISPLAY_POWER_STATE_SUSPEND_EXT = 1, + VK_DISPLAY_POWER_STATE_ON_EXT = 2, + VK_DISPLAY_POWER_STATE_BEGIN_RANGE_EXT = VK_DISPLAY_POWER_STATE_OFF_EXT, + VK_DISPLAY_POWER_STATE_END_RANGE_EXT = VK_DISPLAY_POWER_STATE_ON_EXT, + VK_DISPLAY_POWER_STATE_RANGE_SIZE_EXT = (VK_DISPLAY_POWER_STATE_ON_EXT - VK_DISPLAY_POWER_STATE_OFF_EXT + 1), + VK_DISPLAY_POWER_STATE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDisplayPowerStateEXT; + +typedef enum VkDeviceEventTypeEXT { + VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT = 0, + VK_DEVICE_EVENT_TYPE_BEGIN_RANGE_EXT = VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT, + VK_DEVICE_EVENT_TYPE_END_RANGE_EXT = VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT, + VK_DEVICE_EVENT_TYPE_RANGE_SIZE_EXT = (VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT - VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT + 1), + VK_DEVICE_EVENT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDeviceEventTypeEXT; + +typedef enum VkDisplayEventTypeEXT { + VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT = 0, + VK_DISPLAY_EVENT_TYPE_BEGIN_RANGE_EXT = VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT, + VK_DISPLAY_EVENT_TYPE_END_RANGE_EXT = VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT, + VK_DISPLAY_EVENT_TYPE_RANGE_SIZE_EXT = (VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT - VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT + 1), + VK_DISPLAY_EVENT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDisplayEventTypeEXT; + +typedef struct VkDisplayPowerInfoEXT { + VkStructureType sType; + const void* pNext; + VkDisplayPowerStateEXT powerState; +} VkDisplayPowerInfoEXT; + +typedef struct VkDeviceEventInfoEXT { + VkStructureType sType; + const void* pNext; + VkDeviceEventTypeEXT deviceEvent; +} VkDeviceEventInfoEXT; + +typedef struct VkDisplayEventInfoEXT { + VkStructureType sType; + const void* pNext; + VkDisplayEventTypeEXT displayEvent; +} VkDisplayEventInfoEXT; + +typedef struct VkSwapchainCounterCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkSurfaceCounterFlagsEXT surfaceCounters; +} VkSwapchainCounterCreateInfoEXT; + + +typedef VkResult (VKAPI_PTR *PFN_vkDisplayPowerControlEXT)(VkDevice device, VkDisplayKHR display, const VkDisplayPowerInfoEXT* pDisplayPowerInfo); +typedef VkResult (VKAPI_PTR *PFN_vkRegisterDeviceEventEXT)(VkDevice device, const VkDeviceEventInfoEXT* pDeviceEventInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence); +typedef VkResult (VKAPI_PTR *PFN_vkRegisterDisplayEventEXT)(VkDevice device, VkDisplayKHR display, const VkDisplayEventInfoEXT* pDisplayEventInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence); +typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainCounterEXT)(VkDevice device, VkSwapchainKHR swapchain, VkSurfaceCounterFlagBitsEXT counter, uint64_t* pCounterValue); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkDisplayPowerControlEXT( + VkDevice device, + VkDisplayKHR display, + const VkDisplayPowerInfoEXT* pDisplayPowerInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkRegisterDeviceEventEXT( + VkDevice device, + const VkDeviceEventInfoEXT* pDeviceEventInfo, + const VkAllocationCallbacks* pAllocator, + VkFence* pFence); + +VKAPI_ATTR VkResult VKAPI_CALL vkRegisterDisplayEventEXT( + VkDevice device, + VkDisplayKHR display, + const VkDisplayEventInfoEXT* pDisplayEventInfo, + const VkAllocationCallbacks* pAllocator, + VkFence* pFence); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainCounterEXT( + VkDevice device, + VkSwapchainKHR swapchain, + VkSurfaceCounterFlagBitsEXT counter, + uint64_t* pCounterValue); +#endif + +#define VK_GOOGLE_display_timing 1 +#define VK_GOOGLE_DISPLAY_TIMING_SPEC_VERSION 1 +#define VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME "VK_GOOGLE_display_timing" + +typedef struct VkRefreshCycleDurationGOOGLE { + uint64_t refreshDuration; +} VkRefreshCycleDurationGOOGLE; + +typedef struct VkPastPresentationTimingGOOGLE { + uint32_t presentID; + uint64_t desiredPresentTime; + uint64_t actualPresentTime; + uint64_t earliestPresentTime; + uint64_t presentMargin; +} VkPastPresentationTimingGOOGLE; + +typedef struct VkPresentTimeGOOGLE { + uint32_t presentID; + uint64_t desiredPresentTime; +} VkPresentTimeGOOGLE; + +typedef struct VkPresentTimesInfoGOOGLE { + VkStructureType sType; + const void* pNext; + uint32_t swapchainCount; + const VkPresentTimeGOOGLE* pTimes; +} VkPresentTimesInfoGOOGLE; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetRefreshCycleDurationGOOGLE)(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetPastPresentationTimingGOOGLE)(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetRefreshCycleDurationGOOGLE( + VkDevice device, + VkSwapchainKHR swapchain, + VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPastPresentationTimingGOOGLE( + VkDevice device, + VkSwapchainKHR swapchain, + uint32_t* pPresentationTimingCount, + VkPastPresentationTimingGOOGLE* pPresentationTimings); +#endif + +#define VK_NV_sample_mask_override_coverage 1 +#define VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_SPEC_VERSION 1 +#define VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME "VK_NV_sample_mask_override_coverage" + + +#define VK_NV_geometry_shader_passthrough 1 +#define VK_NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION 1 +#define VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME "VK_NV_geometry_shader_passthrough" + + +#define VK_NV_viewport_array2 1 +#define VK_NV_VIEWPORT_ARRAY2_SPEC_VERSION 1 +#define VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME "VK_NV_viewport_array2" + + +#define VK_NVX_multiview_per_view_attributes 1 +#define VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_SPEC_VERSION 1 +#define VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME "VK_NVX_multiview_per_view_attributes" + +typedef struct VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX { + VkStructureType sType; + void* pNext; + VkBool32 perViewPositionAllComponents; +} VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX; + + + +#define VK_NV_viewport_swizzle 1 +#define VK_NV_VIEWPORT_SWIZZLE_SPEC_VERSION 1 +#define VK_NV_VIEWPORT_SWIZZLE_EXTENSION_NAME "VK_NV_viewport_swizzle" + + +typedef enum VkViewportCoordinateSwizzleNV { + VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV = 0, + VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_X_NV = 1, + VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Y_NV = 2, + VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Y_NV = 3, + VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Z_NV = 4, + VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Z_NV = 5, + VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_W_NV = 6, + VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_W_NV = 7, + VK_VIEWPORT_COORDINATE_SWIZZLE_BEGIN_RANGE_NV = VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV, + VK_VIEWPORT_COORDINATE_SWIZZLE_END_RANGE_NV = VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_W_NV, + VK_VIEWPORT_COORDINATE_SWIZZLE_RANGE_SIZE_NV = (VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_W_NV - VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV + 1), + VK_VIEWPORT_COORDINATE_SWIZZLE_MAX_ENUM_NV = 0x7FFFFFFF +} VkViewportCoordinateSwizzleNV; + +typedef VkFlags VkPipelineViewportSwizzleStateCreateFlagsNV; + +typedef struct VkViewportSwizzleNV { + VkViewportCoordinateSwizzleNV x; + VkViewportCoordinateSwizzleNV y; + VkViewportCoordinateSwizzleNV z; + VkViewportCoordinateSwizzleNV w; +} VkViewportSwizzleNV; + +typedef struct VkPipelineViewportSwizzleStateCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkPipelineViewportSwizzleStateCreateFlagsNV flags; + uint32_t viewportCount; + const VkViewportSwizzleNV* pViewportSwizzles; +} VkPipelineViewportSwizzleStateCreateInfoNV; + + + +#define VK_EXT_discard_rectangles 1 +#define VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION 1 +#define VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME "VK_EXT_discard_rectangles" + + +typedef enum VkDiscardRectangleModeEXT { + VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT = 0, + VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT = 1, + VK_DISCARD_RECTANGLE_MODE_BEGIN_RANGE_EXT = VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT, + VK_DISCARD_RECTANGLE_MODE_END_RANGE_EXT = VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT, + VK_DISCARD_RECTANGLE_MODE_RANGE_SIZE_EXT = (VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT - VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT + 1), + VK_DISCARD_RECTANGLE_MODE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDiscardRectangleModeEXT; + +typedef VkFlags VkPipelineDiscardRectangleStateCreateFlagsEXT; + +typedef struct VkPhysicalDeviceDiscardRectanglePropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t maxDiscardRectangles; +} VkPhysicalDeviceDiscardRectanglePropertiesEXT; + +typedef struct VkPipelineDiscardRectangleStateCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkPipelineDiscardRectangleStateCreateFlagsEXT flags; + VkDiscardRectangleModeEXT discardRectangleMode; + uint32_t discardRectangleCount; + const VkRect2D* pDiscardRectangles; +} VkPipelineDiscardRectangleStateCreateInfoEXT; + + +typedef void (VKAPI_PTR *PFN_vkCmdSetDiscardRectangleEXT)(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle, uint32_t discardRectangleCount, const VkRect2D* pDiscardRectangles); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdSetDiscardRectangleEXT( + VkCommandBuffer commandBuffer, + uint32_t firstDiscardRectangle, + uint32_t discardRectangleCount, + const VkRect2D* pDiscardRectangles); +#endif + +#define VK_EXT_conservative_rasterization 1 +#define VK_EXT_CONSERVATIVE_RASTERIZATION_SPEC_VERSION 1 +#define VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME "VK_EXT_conservative_rasterization" + + +typedef enum VkConservativeRasterizationModeEXT { + VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT = 0, + VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT = 1, + VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT = 2, + VK_CONSERVATIVE_RASTERIZATION_MODE_BEGIN_RANGE_EXT = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT, + VK_CONSERVATIVE_RASTERIZATION_MODE_END_RANGE_EXT = VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT, + VK_CONSERVATIVE_RASTERIZATION_MODE_RANGE_SIZE_EXT = (VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT - VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT + 1), + VK_CONSERVATIVE_RASTERIZATION_MODE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkConservativeRasterizationModeEXT; + +typedef VkFlags VkPipelineRasterizationConservativeStateCreateFlagsEXT; + +typedef struct VkPhysicalDeviceConservativeRasterizationPropertiesEXT { + VkStructureType sType; + void* pNext; + float primitiveOverestimationSize; + float maxExtraPrimitiveOverestimationSize; + float extraPrimitiveOverestimationSizeGranularity; + VkBool32 primitiveUnderestimation; + VkBool32 conservativePointAndLineRasterization; + VkBool32 degenerateTrianglesRasterized; + VkBool32 degenerateLinesRasterized; + VkBool32 fullyCoveredFragmentShaderInputVariable; + VkBool32 conservativeRasterizationPostDepthCoverage; +} VkPhysicalDeviceConservativeRasterizationPropertiesEXT; + +typedef struct VkPipelineRasterizationConservativeStateCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkPipelineRasterizationConservativeStateCreateFlagsEXT flags; + VkConservativeRasterizationModeEXT conservativeRasterizationMode; + float extraPrimitiveOverestimationSize; +} VkPipelineRasterizationConservativeStateCreateInfoEXT; + + + +#define VK_EXT_swapchain_colorspace 1 +#define VK_EXT_SWAPCHAIN_COLOR_SPACE_SPEC_VERSION 3 +#define VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME "VK_EXT_swapchain_colorspace" + + +#define VK_EXT_hdr_metadata 1 +#define VK_EXT_HDR_METADATA_SPEC_VERSION 1 +#define VK_EXT_HDR_METADATA_EXTENSION_NAME "VK_EXT_hdr_metadata" + +typedef struct VkXYColorEXT { + float x; + float y; +} VkXYColorEXT; + +typedef struct VkHdrMetadataEXT { + VkStructureType sType; + const void* pNext; + VkXYColorEXT displayPrimaryRed; + VkXYColorEXT displayPrimaryGreen; + VkXYColorEXT displayPrimaryBlue; + VkXYColorEXT whitePoint; + float maxLuminance; + float minLuminance; + float maxContentLightLevel; + float maxFrameAverageLightLevel; +} VkHdrMetadataEXT; + + +typedef void (VKAPI_PTR *PFN_vkSetHdrMetadataEXT)(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains, const VkHdrMetadataEXT* pMetadata); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkSetHdrMetadataEXT( + VkDevice device, + uint32_t swapchainCount, + const VkSwapchainKHR* pSwapchains, + const VkHdrMetadataEXT* pMetadata); +#endif + +#define VK_EXT_external_memory_dma_buf 1 +#define VK_EXT_EXTERNAL_MEMORY_DMA_BUF_SPEC_VERSION 1 +#define VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME "VK_EXT_external_memory_dma_buf" + + +#define VK_EXT_queue_family_foreign 1 +#define VK_EXT_QUEUE_FAMILY_FOREIGN_SPEC_VERSION 1 +#define VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME "VK_EXT_queue_family_foreign" +#define VK_QUEUE_FAMILY_FOREIGN_EXT (~0U-2) + + +#define VK_EXT_debug_utils 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugUtilsMessengerEXT) + +#define VK_EXT_DEBUG_UTILS_SPEC_VERSION 1 +#define VK_EXT_DEBUG_UTILS_EXTENSION_NAME "VK_EXT_debug_utils" + +typedef VkFlags VkDebugUtilsMessengerCallbackDataFlagsEXT; +typedef VkFlags VkDebugUtilsMessengerCreateFlagsEXT; + +typedef enum VkDebugUtilsMessageSeverityFlagBitsEXT { + VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT = 0x00000001, + VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT = 0x00000010, + VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT = 0x00000100, + VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT = 0x00001000, + VK_DEBUG_UTILS_MESSAGE_SEVERITY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDebugUtilsMessageSeverityFlagBitsEXT; +typedef VkFlags VkDebugUtilsMessageSeverityFlagsEXT; + +typedef enum VkDebugUtilsMessageTypeFlagBitsEXT { + VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT = 0x00000001, + VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT = 0x00000002, + VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT = 0x00000004, + VK_DEBUG_UTILS_MESSAGE_TYPE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDebugUtilsMessageTypeFlagBitsEXT; +typedef VkFlags VkDebugUtilsMessageTypeFlagsEXT; + +typedef struct VkDebugUtilsObjectNameInfoEXT { + VkStructureType sType; + const void* pNext; + VkObjectType objectType; + uint64_t objectHandle; + const char* pObjectName; +} VkDebugUtilsObjectNameInfoEXT; + +typedef struct VkDebugUtilsObjectTagInfoEXT { + VkStructureType sType; + const void* pNext; + VkObjectType objectType; + uint64_t objectHandle; + uint64_t tagName; + size_t tagSize; + const void* pTag; +} VkDebugUtilsObjectTagInfoEXT; + +typedef struct VkDebugUtilsLabelEXT { + VkStructureType sType; + const void* pNext; + const char* pLabelName; + float color[4]; +} VkDebugUtilsLabelEXT; + +typedef struct VkDebugUtilsMessengerCallbackDataEXT { + VkStructureType sType; + const void* pNext; + VkDebugUtilsMessengerCallbackDataFlagsEXT flags; + const char* pMessageIdName; + int32_t messageIdNumber; + const char* pMessage; + uint32_t queueLabelCount; + VkDebugUtilsLabelEXT* pQueueLabels; + uint32_t cmdBufLabelCount; + VkDebugUtilsLabelEXT* pCmdBufLabels; + uint32_t objectCount; + VkDebugUtilsObjectNameInfoEXT* pObjects; +} VkDebugUtilsMessengerCallbackDataEXT; + +typedef VkBool32 (VKAPI_PTR *PFN_vkDebugUtilsMessengerCallbackEXT)( + VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageType, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, + void* pUserData); + +typedef struct VkDebugUtilsMessengerCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkDebugUtilsMessengerCreateFlagsEXT flags; + VkDebugUtilsMessageSeverityFlagsEXT messageSeverity; + VkDebugUtilsMessageTypeFlagsEXT messageType; + PFN_vkDebugUtilsMessengerCallbackEXT pfnUserCallback; + void* pUserData; +} VkDebugUtilsMessengerCreateInfoEXT; + + +typedef VkResult (VKAPI_PTR *PFN_vkSetDebugUtilsObjectNameEXT)(VkDevice device, const VkDebugUtilsObjectNameInfoEXT* pNameInfo); +typedef VkResult (VKAPI_PTR *PFN_vkSetDebugUtilsObjectTagEXT)(VkDevice device, const VkDebugUtilsObjectTagInfoEXT* pTagInfo); +typedef void (VKAPI_PTR *PFN_vkQueueBeginDebugUtilsLabelEXT)(VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo); +typedef void (VKAPI_PTR *PFN_vkQueueEndDebugUtilsLabelEXT)(VkQueue queue); +typedef void (VKAPI_PTR *PFN_vkQueueInsertDebugUtilsLabelEXT)(VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo); +typedef void (VKAPI_PTR *PFN_vkCmdBeginDebugUtilsLabelEXT)(VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT* pLabelInfo); +typedef void (VKAPI_PTR *PFN_vkCmdEndDebugUtilsLabelEXT)(VkCommandBuffer commandBuffer); +typedef void (VKAPI_PTR *PFN_vkCmdInsertDebugUtilsLabelEXT)(VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT* pLabelInfo); +typedef VkResult (VKAPI_PTR *PFN_vkCreateDebugUtilsMessengerEXT)(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pMessenger); +typedef void (VKAPI_PTR *PFN_vkDestroyDebugUtilsMessengerEXT)(VkInstance instance, VkDebugUtilsMessengerEXT messenger, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkSubmitDebugUtilsMessageEXT)(VkInstance instance, VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkSetDebugUtilsObjectNameEXT( + VkDevice device, + const VkDebugUtilsObjectNameInfoEXT* pNameInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkSetDebugUtilsObjectTagEXT( + VkDevice device, + const VkDebugUtilsObjectTagInfoEXT* pTagInfo); + +VKAPI_ATTR void VKAPI_CALL vkQueueBeginDebugUtilsLabelEXT( + VkQueue queue, + const VkDebugUtilsLabelEXT* pLabelInfo); + +VKAPI_ATTR void VKAPI_CALL vkQueueEndDebugUtilsLabelEXT( + VkQueue queue); + +VKAPI_ATTR void VKAPI_CALL vkQueueInsertDebugUtilsLabelEXT( + VkQueue queue, + const VkDebugUtilsLabelEXT* pLabelInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdBeginDebugUtilsLabelEXT( + VkCommandBuffer commandBuffer, + const VkDebugUtilsLabelEXT* pLabelInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdEndDebugUtilsLabelEXT( + VkCommandBuffer commandBuffer); + +VKAPI_ATTR void VKAPI_CALL vkCmdInsertDebugUtilsLabelEXT( + VkCommandBuffer commandBuffer, + const VkDebugUtilsLabelEXT* pLabelInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugUtilsMessengerEXT( + VkInstance instance, + const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDebugUtilsMessengerEXT* pMessenger); + +VKAPI_ATTR void VKAPI_CALL vkDestroyDebugUtilsMessengerEXT( + VkInstance instance, + VkDebugUtilsMessengerEXT messenger, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR void VKAPI_CALL vkSubmitDebugUtilsMessageEXT( + VkInstance instance, + VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageTypes, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData); +#endif + +#define VK_EXT_sampler_filter_minmax 1 +#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 1 +#define VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME "VK_EXT_sampler_filter_minmax" + + +typedef enum VkSamplerReductionModeEXT { + VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT = 0, + VK_SAMPLER_REDUCTION_MODE_MIN_EXT = 1, + VK_SAMPLER_REDUCTION_MODE_MAX_EXT = 2, + VK_SAMPLER_REDUCTION_MODE_BEGIN_RANGE_EXT = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT, + VK_SAMPLER_REDUCTION_MODE_END_RANGE_EXT = VK_SAMPLER_REDUCTION_MODE_MAX_EXT, + VK_SAMPLER_REDUCTION_MODE_RANGE_SIZE_EXT = (VK_SAMPLER_REDUCTION_MODE_MAX_EXT - VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT + 1), + VK_SAMPLER_REDUCTION_MODE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkSamplerReductionModeEXT; + +typedef struct VkSamplerReductionModeCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkSamplerReductionModeEXT reductionMode; +} VkSamplerReductionModeCreateInfoEXT; + +typedef struct VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT { + VkStructureType sType; + void* pNext; + VkBool32 filterMinmaxSingleComponentFormats; + VkBool32 filterMinmaxImageComponentMapping; +} VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT; + + + +#define VK_AMD_gpu_shader_int16 1 +#define VK_AMD_GPU_SHADER_INT16_SPEC_VERSION 1 +#define VK_AMD_GPU_SHADER_INT16_EXTENSION_NAME "VK_AMD_gpu_shader_int16" + + +#define VK_AMD_mixed_attachment_samples 1 +#define VK_AMD_MIXED_ATTACHMENT_SAMPLES_SPEC_VERSION 1 +#define VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME "VK_AMD_mixed_attachment_samples" + + +#define VK_AMD_shader_fragment_mask 1 +#define VK_AMD_SHADER_FRAGMENT_MASK_SPEC_VERSION 1 +#define VK_AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME "VK_AMD_shader_fragment_mask" + + +#define VK_EXT_shader_stencil_export 1 +#define VK_EXT_SHADER_STENCIL_EXPORT_SPEC_VERSION 1 +#define VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME "VK_EXT_shader_stencil_export" + + +#define VK_EXT_sample_locations 1 +#define VK_EXT_SAMPLE_LOCATIONS_SPEC_VERSION 1 +#define VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME "VK_EXT_sample_locations" + +typedef struct VkSampleLocationEXT { + float x; + float y; +} VkSampleLocationEXT; + +typedef struct VkSampleLocationsInfoEXT { + VkStructureType sType; + const void* pNext; + VkSampleCountFlagBits sampleLocationsPerPixel; + VkExtent2D sampleLocationGridSize; + uint32_t sampleLocationsCount; + const VkSampleLocationEXT* pSampleLocations; +} VkSampleLocationsInfoEXT; + +typedef struct VkAttachmentSampleLocationsEXT { + uint32_t attachmentIndex; + VkSampleLocationsInfoEXT sampleLocationsInfo; +} VkAttachmentSampleLocationsEXT; + +typedef struct VkSubpassSampleLocationsEXT { + uint32_t subpassIndex; + VkSampleLocationsInfoEXT sampleLocationsInfo; +} VkSubpassSampleLocationsEXT; + +typedef struct VkRenderPassSampleLocationsBeginInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t attachmentInitialSampleLocationsCount; + const VkAttachmentSampleLocationsEXT* pAttachmentInitialSampleLocations; + uint32_t postSubpassSampleLocationsCount; + const VkSubpassSampleLocationsEXT* pPostSubpassSampleLocations; +} VkRenderPassSampleLocationsBeginInfoEXT; + +typedef struct VkPipelineSampleLocationsStateCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkBool32 sampleLocationsEnable; + VkSampleLocationsInfoEXT sampleLocationsInfo; +} VkPipelineSampleLocationsStateCreateInfoEXT; + +typedef struct VkPhysicalDeviceSampleLocationsPropertiesEXT { + VkStructureType sType; + void* pNext; + VkSampleCountFlags sampleLocationSampleCounts; + VkExtent2D maxSampleLocationGridSize; + float sampleLocationCoordinateRange[2]; + uint32_t sampleLocationSubPixelBits; + VkBool32 variableSampleLocations; +} VkPhysicalDeviceSampleLocationsPropertiesEXT; + +typedef struct VkMultisamplePropertiesEXT { + VkStructureType sType; + void* pNext; + VkExtent2D maxSampleLocationGridSize; +} VkMultisamplePropertiesEXT; + + +typedef void (VKAPI_PTR *PFN_vkCmdSetSampleLocationsEXT)(VkCommandBuffer commandBuffer, const VkSampleLocationsInfoEXT* pSampleLocationsInfo); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)(VkPhysicalDevice physicalDevice, VkSampleCountFlagBits samples, VkMultisamplePropertiesEXT* pMultisampleProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdSetSampleLocationsEXT( + VkCommandBuffer commandBuffer, + const VkSampleLocationsInfoEXT* pSampleLocationsInfo); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMultisamplePropertiesEXT( + VkPhysicalDevice physicalDevice, + VkSampleCountFlagBits samples, + VkMultisamplePropertiesEXT* pMultisampleProperties); +#endif + +#define VK_EXT_blend_operation_advanced 1 +#define VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION 2 +#define VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME "VK_EXT_blend_operation_advanced" + + +typedef enum VkBlendOverlapEXT { + VK_BLEND_OVERLAP_UNCORRELATED_EXT = 0, + VK_BLEND_OVERLAP_DISJOINT_EXT = 1, + VK_BLEND_OVERLAP_CONJOINT_EXT = 2, + VK_BLEND_OVERLAP_BEGIN_RANGE_EXT = VK_BLEND_OVERLAP_UNCORRELATED_EXT, + VK_BLEND_OVERLAP_END_RANGE_EXT = VK_BLEND_OVERLAP_CONJOINT_EXT, + VK_BLEND_OVERLAP_RANGE_SIZE_EXT = (VK_BLEND_OVERLAP_CONJOINT_EXT - VK_BLEND_OVERLAP_UNCORRELATED_EXT + 1), + VK_BLEND_OVERLAP_MAX_ENUM_EXT = 0x7FFFFFFF +} VkBlendOverlapEXT; + +typedef struct VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 advancedBlendCoherentOperations; +} VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT; + +typedef struct VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t advancedBlendMaxColorAttachments; + VkBool32 advancedBlendIndependentBlend; + VkBool32 advancedBlendNonPremultipliedSrcColor; + VkBool32 advancedBlendNonPremultipliedDstColor; + VkBool32 advancedBlendCorrelatedOverlap; + VkBool32 advancedBlendAllOperations; +} VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT; + +typedef struct VkPipelineColorBlendAdvancedStateCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkBool32 srcPremultiplied; + VkBool32 dstPremultiplied; + VkBlendOverlapEXT blendOverlap; +} VkPipelineColorBlendAdvancedStateCreateInfoEXT; + + + +#define VK_NV_fragment_coverage_to_color 1 +#define VK_NV_FRAGMENT_COVERAGE_TO_COLOR_SPEC_VERSION 1 +#define VK_NV_FRAGMENT_COVERAGE_TO_COLOR_EXTENSION_NAME "VK_NV_fragment_coverage_to_color" + +typedef VkFlags VkPipelineCoverageToColorStateCreateFlagsNV; + +typedef struct VkPipelineCoverageToColorStateCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkPipelineCoverageToColorStateCreateFlagsNV flags; + VkBool32 coverageToColorEnable; + uint32_t coverageToColorLocation; +} VkPipelineCoverageToColorStateCreateInfoNV; + + + +#define VK_NV_framebuffer_mixed_samples 1 +#define VK_NV_FRAMEBUFFER_MIXED_SAMPLES_SPEC_VERSION 1 +#define VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME "VK_NV_framebuffer_mixed_samples" + + +typedef enum VkCoverageModulationModeNV { + VK_COVERAGE_MODULATION_MODE_NONE_NV = 0, + VK_COVERAGE_MODULATION_MODE_RGB_NV = 1, + VK_COVERAGE_MODULATION_MODE_ALPHA_NV = 2, + VK_COVERAGE_MODULATION_MODE_RGBA_NV = 3, + VK_COVERAGE_MODULATION_MODE_BEGIN_RANGE_NV = VK_COVERAGE_MODULATION_MODE_NONE_NV, + VK_COVERAGE_MODULATION_MODE_END_RANGE_NV = VK_COVERAGE_MODULATION_MODE_RGBA_NV, + VK_COVERAGE_MODULATION_MODE_RANGE_SIZE_NV = (VK_COVERAGE_MODULATION_MODE_RGBA_NV - VK_COVERAGE_MODULATION_MODE_NONE_NV + 1), + VK_COVERAGE_MODULATION_MODE_MAX_ENUM_NV = 0x7FFFFFFF +} VkCoverageModulationModeNV; + +typedef VkFlags VkPipelineCoverageModulationStateCreateFlagsNV; + +typedef struct VkPipelineCoverageModulationStateCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkPipelineCoverageModulationStateCreateFlagsNV flags; + VkCoverageModulationModeNV coverageModulationMode; + VkBool32 coverageModulationTableEnable; + uint32_t coverageModulationTableCount; + const float* pCoverageModulationTable; +} VkPipelineCoverageModulationStateCreateInfoNV; + + + +#define VK_NV_fill_rectangle 1 +#define VK_NV_FILL_RECTANGLE_SPEC_VERSION 1 +#define VK_NV_FILL_RECTANGLE_EXTENSION_NAME "VK_NV_fill_rectangle" + + +#define VK_EXT_post_depth_coverage 1 +#define VK_EXT_POST_DEPTH_COVERAGE_SPEC_VERSION 1 +#define VK_EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME "VK_EXT_post_depth_coverage" + + +#define VK_EXT_validation_cache 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkValidationCacheEXT) + +#define VK_EXT_VALIDATION_CACHE_SPEC_VERSION 1 +#define VK_EXT_VALIDATION_CACHE_EXTENSION_NAME "VK_EXT_validation_cache" + + +typedef enum VkValidationCacheHeaderVersionEXT { + VK_VALIDATION_CACHE_HEADER_VERSION_ONE_EXT = 1, + VK_VALIDATION_CACHE_HEADER_VERSION_BEGIN_RANGE_EXT = VK_VALIDATION_CACHE_HEADER_VERSION_ONE_EXT, + VK_VALIDATION_CACHE_HEADER_VERSION_END_RANGE_EXT = VK_VALIDATION_CACHE_HEADER_VERSION_ONE_EXT, + VK_VALIDATION_CACHE_HEADER_VERSION_RANGE_SIZE_EXT = (VK_VALIDATION_CACHE_HEADER_VERSION_ONE_EXT - VK_VALIDATION_CACHE_HEADER_VERSION_ONE_EXT + 1), + VK_VALIDATION_CACHE_HEADER_VERSION_MAX_ENUM_EXT = 0x7FFFFFFF +} VkValidationCacheHeaderVersionEXT; + +typedef VkFlags VkValidationCacheCreateFlagsEXT; + +typedef struct VkValidationCacheCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkValidationCacheCreateFlagsEXT flags; + size_t initialDataSize; + const void* pInitialData; +} VkValidationCacheCreateInfoEXT; + +typedef struct VkShaderModuleValidationCacheCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkValidationCacheEXT validationCache; +} VkShaderModuleValidationCacheCreateInfoEXT; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateValidationCacheEXT)(VkDevice device, const VkValidationCacheCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkValidationCacheEXT* pValidationCache); +typedef void (VKAPI_PTR *PFN_vkDestroyValidationCacheEXT)(VkDevice device, VkValidationCacheEXT validationCache, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkMergeValidationCachesEXT)(VkDevice device, VkValidationCacheEXT dstCache, uint32_t srcCacheCount, const VkValidationCacheEXT* pSrcCaches); +typedef VkResult (VKAPI_PTR *PFN_vkGetValidationCacheDataEXT)(VkDevice device, VkValidationCacheEXT validationCache, size_t* pDataSize, void* pData); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateValidationCacheEXT( + VkDevice device, + const VkValidationCacheCreateInfoEXT* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkValidationCacheEXT* pValidationCache); + +VKAPI_ATTR void VKAPI_CALL vkDestroyValidationCacheEXT( + VkDevice device, + VkValidationCacheEXT validationCache, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkMergeValidationCachesEXT( + VkDevice device, + VkValidationCacheEXT dstCache, + uint32_t srcCacheCount, + const VkValidationCacheEXT* pSrcCaches); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetValidationCacheDataEXT( + VkDevice device, + VkValidationCacheEXT validationCache, + size_t* pDataSize, + void* pData); +#endif + +#define VK_EXT_descriptor_indexing 1 +#define VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION 2 +#define VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME "VK_EXT_descriptor_indexing" + + +typedef enum VkDescriptorBindingFlagBitsEXT { + VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT = 0x00000001, + VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT = 0x00000002, + VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT = 0x00000004, + VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT = 0x00000008, + VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDescriptorBindingFlagBitsEXT; +typedef VkFlags VkDescriptorBindingFlagsEXT; + +typedef struct VkDescriptorSetLayoutBindingFlagsCreateInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t bindingCount; + const VkDescriptorBindingFlagsEXT* pBindingFlags; +} VkDescriptorSetLayoutBindingFlagsCreateInfoEXT; + +typedef struct VkPhysicalDeviceDescriptorIndexingFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 shaderInputAttachmentArrayDynamicIndexing; + VkBool32 shaderUniformTexelBufferArrayDynamicIndexing; + VkBool32 shaderStorageTexelBufferArrayDynamicIndexing; + VkBool32 shaderUniformBufferArrayNonUniformIndexing; + VkBool32 shaderSampledImageArrayNonUniformIndexing; + VkBool32 shaderStorageBufferArrayNonUniformIndexing; + VkBool32 shaderStorageImageArrayNonUniformIndexing; + VkBool32 shaderInputAttachmentArrayNonUniformIndexing; + VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing; + VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing; + VkBool32 descriptorBindingUniformBufferUpdateAfterBind; + VkBool32 descriptorBindingSampledImageUpdateAfterBind; + VkBool32 descriptorBindingStorageImageUpdateAfterBind; + VkBool32 descriptorBindingStorageBufferUpdateAfterBind; + VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind; + VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind; + VkBool32 descriptorBindingUpdateUnusedWhilePending; + VkBool32 descriptorBindingPartiallyBound; + VkBool32 descriptorBindingVariableDescriptorCount; + VkBool32 runtimeDescriptorArray; +} VkPhysicalDeviceDescriptorIndexingFeaturesEXT; + +typedef struct VkPhysicalDeviceDescriptorIndexingPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t maxUpdateAfterBindDescriptorsInAllPools; + VkBool32 shaderUniformBufferArrayNonUniformIndexingNative; + VkBool32 shaderSampledImageArrayNonUniformIndexingNative; + VkBool32 shaderStorageBufferArrayNonUniformIndexingNative; + VkBool32 shaderStorageImageArrayNonUniformIndexingNative; + VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative; + VkBool32 robustBufferAccessUpdateAfterBind; + VkBool32 quadDivergentImplicitLod; + uint32_t maxPerStageDescriptorUpdateAfterBindSamplers; + uint32_t maxPerStageDescriptorUpdateAfterBindUniformBuffers; + uint32_t maxPerStageDescriptorUpdateAfterBindStorageBuffers; + uint32_t maxPerStageDescriptorUpdateAfterBindSampledImages; + uint32_t maxPerStageDescriptorUpdateAfterBindStorageImages; + uint32_t maxPerStageDescriptorUpdateAfterBindInputAttachments; + uint32_t maxPerStageUpdateAfterBindResources; + uint32_t maxDescriptorSetUpdateAfterBindSamplers; + uint32_t maxDescriptorSetUpdateAfterBindUniformBuffers; + uint32_t maxDescriptorSetUpdateAfterBindUniformBuffersDynamic; + uint32_t maxDescriptorSetUpdateAfterBindStorageBuffers; + uint32_t maxDescriptorSetUpdateAfterBindStorageBuffersDynamic; + uint32_t maxDescriptorSetUpdateAfterBindSampledImages; + uint32_t maxDescriptorSetUpdateAfterBindStorageImages; + uint32_t maxDescriptorSetUpdateAfterBindInputAttachments; +} VkPhysicalDeviceDescriptorIndexingPropertiesEXT; + +typedef struct VkDescriptorSetVariableDescriptorCountAllocateInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t descriptorSetCount; + const uint32_t* pDescriptorCounts; +} VkDescriptorSetVariableDescriptorCountAllocateInfoEXT; + +typedef struct VkDescriptorSetVariableDescriptorCountLayoutSupportEXT { + VkStructureType sType; + void* pNext; + uint32_t maxVariableDescriptorCount; +} VkDescriptorSetVariableDescriptorCountLayoutSupportEXT; + + + +#define VK_EXT_shader_viewport_index_layer 1 +#define VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_SPEC_VERSION 1 +#define VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME "VK_EXT_shader_viewport_index_layer" + + +#define VK_EXT_global_priority 1 +#define VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION 2 +#define VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME "VK_EXT_global_priority" + + +typedef enum VkQueueGlobalPriorityEXT { + VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT = 128, + VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT = 256, + VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT = 512, + VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT = 1024, + VK_QUEUE_GLOBAL_PRIORITY_BEGIN_RANGE_EXT = VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT, + VK_QUEUE_GLOBAL_PRIORITY_END_RANGE_EXT = VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT, + VK_QUEUE_GLOBAL_PRIORITY_RANGE_SIZE_EXT = (VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT - VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT + 1), + VK_QUEUE_GLOBAL_PRIORITY_MAX_ENUM_EXT = 0x7FFFFFFF +} VkQueueGlobalPriorityEXT; + +typedef struct VkDeviceQueueGlobalPriorityCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkQueueGlobalPriorityEXT globalPriority; +} VkDeviceQueueGlobalPriorityCreateInfoEXT; + + + +#define VK_EXT_external_memory_host 1 +#define VK_EXT_EXTERNAL_MEMORY_HOST_SPEC_VERSION 1 +#define VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME "VK_EXT_external_memory_host" + +typedef struct VkImportMemoryHostPointerInfoEXT { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagBits handleType; + void* pHostPointer; +} VkImportMemoryHostPointerInfoEXT; + +typedef struct VkMemoryHostPointerPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t memoryTypeBits; +} VkMemoryHostPointerPropertiesEXT; + +typedef struct VkPhysicalDeviceExternalMemoryHostPropertiesEXT { + VkStructureType sType; + void* pNext; + VkDeviceSize minImportedHostPointerAlignment; +} VkPhysicalDeviceExternalMemoryHostPropertiesEXT; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryHostPointerPropertiesEXT)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, const void* pHostPointer, VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryHostPointerPropertiesEXT( + VkDevice device, + VkExternalMemoryHandleTypeFlagBits handleType, + const void* pHostPointer, + VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties); +#endif + +#define VK_AMD_buffer_marker 1 +#define VK_AMD_BUFFER_MARKER_SPEC_VERSION 1 +#define VK_AMD_BUFFER_MARKER_EXTENSION_NAME "VK_AMD_buffer_marker" + +typedef void (VKAPI_PTR *PFN_vkCmdWriteBufferMarkerAMD)(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdWriteBufferMarkerAMD( + VkCommandBuffer commandBuffer, + VkPipelineStageFlagBits pipelineStage, + VkBuffer dstBuffer, + VkDeviceSize dstOffset, + uint32_t marker); +#endif + +#define VK_AMD_shader_core_properties 1 +#define VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 1 +#define VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME "VK_AMD_shader_core_properties" + +typedef struct VkPhysicalDeviceShaderCorePropertiesAMD { + VkStructureType sType; + void* pNext; + uint32_t shaderEngineCount; + uint32_t shaderArraysPerEngineCount; + uint32_t computeUnitsPerShaderArray; + uint32_t simdPerComputeUnit; + uint32_t wavefrontsPerSimd; + uint32_t wavefrontSize; + uint32_t sgprsPerSimd; + uint32_t minSgprAllocation; + uint32_t maxSgprAllocation; + uint32_t sgprAllocationGranularity; + uint32_t vgprsPerSimd; + uint32_t minVgprAllocation; + uint32_t maxVgprAllocation; + uint32_t vgprAllocationGranularity; +} VkPhysicalDeviceShaderCorePropertiesAMD; + + + +#define VK_EXT_vertex_attribute_divisor 1 +#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 2 +#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor" + +typedef struct VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t maxVertexAttribDivisor; +} VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT; + +typedef struct VkVertexInputBindingDivisorDescriptionEXT { + uint32_t binding; + uint32_t divisor; +} VkVertexInputBindingDivisorDescriptionEXT; + +typedef struct VkPipelineVertexInputDivisorStateCreateInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t vertexBindingDivisorCount; + const VkVertexInputBindingDivisorDescriptionEXT* pVertexBindingDivisors; +} VkPipelineVertexInputDivisorStateCreateInfoEXT; + + + +#define VK_NV_shader_subgroup_partitioned 1 +#define VK_NV_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION 1 +#define VK_NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME "VK_NV_shader_subgroup_partitioned" + + +#define VK_NV_device_diagnostic_checkpoints 1 +#define VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_SPEC_VERSION 2 +#define VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME "VK_NV_device_diagnostic_checkpoints" + +typedef struct VkQueueFamilyCheckpointPropertiesNV { + VkStructureType sType; + void* pNext; + VkPipelineStageFlags checkpointExecutionStageMask; +} VkQueueFamilyCheckpointPropertiesNV; + +typedef struct VkCheckpointDataNV { + VkStructureType sType; + void* pNext; + VkPipelineStageFlagBits stage; + void* pCheckpointMarker; +} VkCheckpointDataNV; + + +typedef void (VKAPI_PTR *PFN_vkCmdSetCheckpointNV)(VkCommandBuffer commandBuffer, const void* pCheckpointMarker); +typedef void (VKAPI_PTR *PFN_vkGetQueueCheckpointDataNV)(VkQueue queue, uint32_t* pCheckpointDataCount, VkCheckpointDataNV* pCheckpointData); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdSetCheckpointNV( + VkCommandBuffer commandBuffer, + const void* pCheckpointMarker); + +VKAPI_ATTR void VKAPI_CALL vkGetQueueCheckpointDataNV( + VkQueue queue, + uint32_t* pCheckpointDataCount, + VkCheckpointDataNV* pCheckpointData); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extlibs/headers/vulkan/vulkan_ios.h b/extlibs/headers/vulkan/vulkan_ios.h new file mode 100644 index 00000000..a0924816 --- /dev/null +++ b/extlibs/headers/vulkan/vulkan_ios.h @@ -0,0 +1,58 @@ +#ifndef VULKAN_IOS_H_ +#define VULKAN_IOS_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2015-2018 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. +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#define VK_MVK_ios_surface 1 +#define VK_MVK_IOS_SURFACE_SPEC_VERSION 2 +#define VK_MVK_IOS_SURFACE_EXTENSION_NAME "VK_MVK_ios_surface" + +typedef VkFlags VkIOSSurfaceCreateFlagsMVK; + +typedef struct VkIOSSurfaceCreateInfoMVK { + VkStructureType sType; + const void* pNext; + VkIOSSurfaceCreateFlagsMVK flags; + const void* pView; +} VkIOSSurfaceCreateInfoMVK; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateIOSSurfaceMVK)(VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateIOSSurfaceMVK( + VkInstance instance, + const VkIOSSurfaceCreateInfoMVK* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extlibs/headers/vulkan/vulkan_macos.h b/extlibs/headers/vulkan/vulkan_macos.h new file mode 100644 index 00000000..ff0b7018 --- /dev/null +++ b/extlibs/headers/vulkan/vulkan_macos.h @@ -0,0 +1,58 @@ +#ifndef VULKAN_MACOS_H_ +#define VULKAN_MACOS_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2015-2018 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. +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#define VK_MVK_macos_surface 1 +#define VK_MVK_MACOS_SURFACE_SPEC_VERSION 2 +#define VK_MVK_MACOS_SURFACE_EXTENSION_NAME "VK_MVK_macos_surface" + +typedef VkFlags VkMacOSSurfaceCreateFlagsMVK; + +typedef struct VkMacOSSurfaceCreateInfoMVK { + VkStructureType sType; + const void* pNext; + VkMacOSSurfaceCreateFlagsMVK flags; + const void* pView; +} VkMacOSSurfaceCreateInfoMVK; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateMacOSSurfaceMVK)(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK( + VkInstance instance, + const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extlibs/headers/vulkan/vulkan_mir.h b/extlibs/headers/vulkan/vulkan_mir.h new file mode 100644 index 00000000..7d24ed27 --- /dev/null +++ b/extlibs/headers/vulkan/vulkan_mir.h @@ -0,0 +1,65 @@ +#ifndef VULKAN_MIR_H_ +#define VULKAN_MIR_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2015-2018 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. +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#define VK_KHR_mir_surface 1 +#define VK_KHR_MIR_SURFACE_SPEC_VERSION 4 +#define VK_KHR_MIR_SURFACE_EXTENSION_NAME "VK_KHR_mir_surface" + +typedef VkFlags VkMirSurfaceCreateFlagsKHR; + +typedef struct VkMirSurfaceCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkMirSurfaceCreateFlagsKHR flags; + MirConnection* connection; + MirSurface* mirSurface; +} VkMirSurfaceCreateInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateMirSurfaceKHR)(VkInstance instance, const VkMirSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); +typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, MirConnection* connection); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateMirSurfaceKHR( + VkInstance instance, + const VkMirSurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); + +VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceMirPresentationSupportKHR( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + MirConnection* connection); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extlibs/headers/vulkan/vulkan_vi.h b/extlibs/headers/vulkan/vulkan_vi.h new file mode 100644 index 00000000..015166bf --- /dev/null +++ b/extlibs/headers/vulkan/vulkan_vi.h @@ -0,0 +1,58 @@ +#ifndef VULKAN_VI_H_ +#define VULKAN_VI_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2015-2018 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. +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#define VK_NN_vi_surface 1 +#define VK_NN_VI_SURFACE_SPEC_VERSION 1 +#define VK_NN_VI_SURFACE_EXTENSION_NAME "VK_NN_vi_surface" + +typedef VkFlags VkViSurfaceCreateFlagsNN; + +typedef struct VkViSurfaceCreateInfoNN { + VkStructureType sType; + const void* pNext; + VkViSurfaceCreateFlagsNN flags; + void* window; +} VkViSurfaceCreateInfoNN; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateViSurfaceNN)(VkInstance instance, const VkViSurfaceCreateInfoNN* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateViSurfaceNN( + VkInstance instance, + const VkViSurfaceCreateInfoNN* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extlibs/headers/vulkan/vulkan_wayland.h b/extlibs/headers/vulkan/vulkan_wayland.h new file mode 100644 index 00000000..5ba0827a --- /dev/null +++ b/extlibs/headers/vulkan/vulkan_wayland.h @@ -0,0 +1,65 @@ +#ifndef VULKAN_WAYLAND_H_ +#define VULKAN_WAYLAND_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2015-2018 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. +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#define VK_KHR_wayland_surface 1 +#define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 6 +#define VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME "VK_KHR_wayland_surface" + +typedef VkFlags VkWaylandSurfaceCreateFlagsKHR; + +typedef struct VkWaylandSurfaceCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkWaylandSurfaceCreateFlagsKHR flags; + struct wl_display* display; + struct wl_surface* surface; +} VkWaylandSurfaceCreateInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateWaylandSurfaceKHR)(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); +typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, struct wl_display* display); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR( + VkInstance instance, + const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); + +VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + struct wl_display* display); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extlibs/headers/vulkan/vulkan_win32.h b/extlibs/headers/vulkan/vulkan_win32.h new file mode 100644 index 00000000..6a85409e --- /dev/null +++ b/extlibs/headers/vulkan/vulkan_win32.h @@ -0,0 +1,276 @@ +#ifndef VULKAN_WIN32_H_ +#define VULKAN_WIN32_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2015-2018 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. +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#define VK_KHR_win32_surface 1 +#define VK_KHR_WIN32_SURFACE_SPEC_VERSION 6 +#define VK_KHR_WIN32_SURFACE_EXTENSION_NAME "VK_KHR_win32_surface" + +typedef VkFlags VkWin32SurfaceCreateFlagsKHR; + +typedef struct VkWin32SurfaceCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkWin32SurfaceCreateFlagsKHR flags; + HINSTANCE hinstance; + HWND hwnd; +} VkWin32SurfaceCreateInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateWin32SurfaceKHR)(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); +typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR( + VkInstance instance, + const VkWin32SurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); + +VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex); +#endif + +#define VK_KHR_external_memory_win32 1 +#define VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME "VK_KHR_external_memory_win32" + +typedef struct VkImportMemoryWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagBits handleType; + HANDLE handle; + LPCWSTR name; +} VkImportMemoryWin32HandleInfoKHR; + +typedef struct VkExportMemoryWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + const SECURITY_ATTRIBUTES* pAttributes; + DWORD dwAccess; + LPCWSTR name; +} VkExportMemoryWin32HandleInfoKHR; + +typedef struct VkMemoryWin32HandlePropertiesKHR { + VkStructureType sType; + void* pNext; + uint32_t memoryTypeBits; +} VkMemoryWin32HandlePropertiesKHR; + +typedef struct VkMemoryGetWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkDeviceMemory memory; + VkExternalMemoryHandleTypeFlagBits handleType; +} VkMemoryGetWin32HandleInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleKHR)(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandlePropertiesKHR)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, HANDLE handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleKHR( + VkDevice device, + const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, + HANDLE* pHandle); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandlePropertiesKHR( + VkDevice device, + VkExternalMemoryHandleTypeFlagBits handleType, + HANDLE handle, + VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties); +#endif + +#define VK_KHR_win32_keyed_mutex 1 +#define VK_KHR_WIN32_KEYED_MUTEX_SPEC_VERSION 1 +#define VK_KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_KHR_win32_keyed_mutex" + +typedef struct VkWin32KeyedMutexAcquireReleaseInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t acquireCount; + const VkDeviceMemory* pAcquireSyncs; + const uint64_t* pAcquireKeys; + const uint32_t* pAcquireTimeouts; + uint32_t releaseCount; + const VkDeviceMemory* pReleaseSyncs; + const uint64_t* pReleaseKeys; +} VkWin32KeyedMutexAcquireReleaseInfoKHR; + + + +#define VK_KHR_external_semaphore_win32 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME "VK_KHR_external_semaphore_win32" + +typedef struct VkImportSemaphoreWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkSemaphore semaphore; + VkSemaphoreImportFlags flags; + VkExternalSemaphoreHandleTypeFlagBits handleType; + HANDLE handle; + LPCWSTR name; +} VkImportSemaphoreWin32HandleInfoKHR; + +typedef struct VkExportSemaphoreWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + const SECURITY_ATTRIBUTES* pAttributes; + DWORD dwAccess; + LPCWSTR name; +} VkExportSemaphoreWin32HandleInfoKHR; + +typedef struct VkD3D12FenceSubmitInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t waitSemaphoreValuesCount; + const uint64_t* pWaitSemaphoreValues; + uint32_t signalSemaphoreValuesCount; + const uint64_t* pSignalSemaphoreValues; +} VkD3D12FenceSubmitInfoKHR; + +typedef struct VkSemaphoreGetWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkSemaphore semaphore; + VkExternalSemaphoreHandleTypeFlagBits handleType; +} VkSemaphoreGetWin32HandleInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreWin32HandleKHR)(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreWin32HandleKHR)(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreWin32HandleKHR( + VkDevice device, + const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreWin32HandleKHR( + VkDevice device, + const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, + HANDLE* pHandle); +#endif + +#define VK_KHR_external_fence_win32 1 +#define VK_KHR_EXTERNAL_FENCE_WIN32_SPEC_VERSION 1 +#define VK_KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME "VK_KHR_external_fence_win32" + +typedef struct VkImportFenceWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkFence fence; + VkFenceImportFlags flags; + VkExternalFenceHandleTypeFlagBits handleType; + HANDLE handle; + LPCWSTR name; +} VkImportFenceWin32HandleInfoKHR; + +typedef struct VkExportFenceWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + const SECURITY_ATTRIBUTES* pAttributes; + DWORD dwAccess; + LPCWSTR name; +} VkExportFenceWin32HandleInfoKHR; + +typedef struct VkFenceGetWin32HandleInfoKHR { + VkStructureType sType; + const void* pNext; + VkFence fence; + VkExternalFenceHandleTypeFlagBits handleType; +} VkFenceGetWin32HandleInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkImportFenceWin32HandleKHR)(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetFenceWin32HandleKHR)(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkImportFenceWin32HandleKHR( + VkDevice device, + const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceWin32HandleKHR( + VkDevice device, + const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, + HANDLE* pHandle); +#endif + +#define VK_NV_external_memory_win32 1 +#define VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1 +#define VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME "VK_NV_external_memory_win32" + +typedef struct VkImportMemoryWin32HandleInfoNV { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagsNV handleType; + HANDLE handle; +} VkImportMemoryWin32HandleInfoNV; + +typedef struct VkExportMemoryWin32HandleInfoNV { + VkStructureType sType; + const void* pNext; + const SECURITY_ATTRIBUTES* pAttributes; + DWORD dwAccess; +} VkExportMemoryWin32HandleInfoNV; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleNV)(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleNV( + VkDevice device, + VkDeviceMemory memory, + VkExternalMemoryHandleTypeFlagsNV handleType, + HANDLE* pHandle); +#endif + +#define VK_NV_win32_keyed_mutex 1 +#define VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION 1 +#define VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_NV_win32_keyed_mutex" + +typedef struct VkWin32KeyedMutexAcquireReleaseInfoNV { + VkStructureType sType; + const void* pNext; + uint32_t acquireCount; + const VkDeviceMemory* pAcquireSyncs; + const uint64_t* pAcquireKeys; + const uint32_t* pAcquireTimeoutMilliseconds; + uint32_t releaseCount; + const VkDeviceMemory* pReleaseSyncs; + const uint64_t* pReleaseKeys; +} VkWin32KeyedMutexAcquireReleaseInfoNV; + + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extlibs/headers/vulkan/vulkan_xcb.h b/extlibs/headers/vulkan/vulkan_xcb.h new file mode 100644 index 00000000..ba036006 --- /dev/null +++ b/extlibs/headers/vulkan/vulkan_xcb.h @@ -0,0 +1,66 @@ +#ifndef VULKAN_XCB_H_ +#define VULKAN_XCB_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2015-2018 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. +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#define VK_KHR_xcb_surface 1 +#define VK_KHR_XCB_SURFACE_SPEC_VERSION 6 +#define VK_KHR_XCB_SURFACE_EXTENSION_NAME "VK_KHR_xcb_surface" + +typedef VkFlags VkXcbSurfaceCreateFlagsKHR; + +typedef struct VkXcbSurfaceCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkXcbSurfaceCreateFlagsKHR flags; + xcb_connection_t* connection; + xcb_window_t window; +} VkXcbSurfaceCreateInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateXcbSurfaceKHR)(VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); +typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, xcb_connection_t* connection, xcb_visualid_t visual_id); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR( + VkInstance instance, + const VkXcbSurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); + +VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + xcb_connection_t* connection, + xcb_visualid_t visual_id); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extlibs/headers/vulkan/vulkan_xlib.h b/extlibs/headers/vulkan/vulkan_xlib.h new file mode 100644 index 00000000..e1d967e0 --- /dev/null +++ b/extlibs/headers/vulkan/vulkan_xlib.h @@ -0,0 +1,66 @@ +#ifndef VULKAN_XLIB_H_ +#define VULKAN_XLIB_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2015-2018 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. +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#define VK_KHR_xlib_surface 1 +#define VK_KHR_XLIB_SURFACE_SPEC_VERSION 6 +#define VK_KHR_XLIB_SURFACE_EXTENSION_NAME "VK_KHR_xlib_surface" + +typedef VkFlags VkXlibSurfaceCreateFlagsKHR; + +typedef struct VkXlibSurfaceCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkXlibSurfaceCreateFlagsKHR flags; + Display* dpy; + Window window; +} VkXlibSurfaceCreateInfoKHR; + + +typedef VkResult (VKAPI_PTR *PFN_vkCreateXlibSurfaceKHR)(VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); +typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display* dpy, VisualID visualID); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR( + VkInstance instance, + const VkXlibSurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); + +VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + Display* dpy, + VisualID visualID); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extlibs/headers/vulkan/vulkan_xlib_xrandr.h b/extlibs/headers/vulkan/vulkan_xlib_xrandr.h new file mode 100644 index 00000000..117d0179 --- /dev/null +++ b/extlibs/headers/vulkan/vulkan_xlib_xrandr.h @@ -0,0 +1,54 @@ +#ifndef VULKAN_XLIB_XRANDR_H_ +#define VULKAN_XLIB_XRANDR_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2015-2018 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. +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#define VK_EXT_acquire_xlib_display 1 +#define VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION 1 +#define VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME "VK_EXT_acquire_xlib_display" + +typedef VkResult (VKAPI_PTR *PFN_vkAcquireXlibDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, VkDisplayKHR display); +typedef VkResult (VKAPI_PTR *PFN_vkGetRandROutputDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, RROutput rrOutput, VkDisplayKHR* pDisplay); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkAcquireXlibDisplayEXT( + VkPhysicalDevice physicalDevice, + Display* dpy, + VkDisplayKHR display); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetRandROutputDisplayEXT( + VkPhysicalDevice physicalDevice, + Display* dpy, + RROutput rrOutput, + VkDisplayKHR* pDisplay); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/SFML/Window/Vulkan.hpp b/include/SFML/Window/Vulkan.hpp new file mode 100644 index 00000000..cd501a12 --- /dev/null +++ b/include/SFML/Window/Vulkan.hpp @@ -0,0 +1,114 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without 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 <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/WindowBase.hpp b/include/SFML/Window/WindowBase.hpp index f1856f73..747b9058 100644 --- a/include/SFML/Window/WindowBase.hpp +++ b/include/SFML/Window/WindowBase.hpp @@ -31,6 +31,7 @@ #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> @@ -393,6 +394,18 @@ public: //////////////////////////////////////////////////////////// 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: //////////////////////////////////////////////////////////// diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index f6ba3503..bd9571b4 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -43,6 +43,8 @@ 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 @@ -70,6 +72,8 @@ 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 ) @@ -90,6 +94,8 @@ elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD) ${SRCROOT}/Unix/SensorImpl.cpp ${SRCROOT}/Unix/SensorImpl.hpp ${SRCROOT}/Unix/VideoModeImpl.cpp + ${SRCROOT}/Unix/VulkanImplX11.cpp + ${SRCROOT}/Unix/VulkanImplX11.hpp ${SRCROOT}/Unix/WindowImplX11.cpp ${SRCROOT}/Unix/WindowImplX11.hpp ) @@ -233,6 +239,9 @@ if ((NOT BUILD_SHARED_LIBS) AND SFML_OS_MACOSX) target_link_libraries(sfml-window PRIVATE -ObjC) endif() +# Vulkan headers +target_include_directories(sfml-window PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/vulkan") + # 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") diff --git a/src/SFML/Window/Unix/VulkanImplX11.cpp b/src/SFML/Window/Unix/VulkanImplX11.cpp new file mode 100644 index 00000000..5b57e298 --- /dev/null +++ b/src/SFML/Window/Unix/VulkanImplX11.cpp @@ -0,0 +1,225 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without 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.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 00000000..1c86c76d --- /dev/null +++ b/src/SFML/Window/Unix/VulkanImplX11.hpp @@ -0,0 +1,103 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without 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/Vulkan.cpp b/src/SFML/Window/Vulkan.cpp new file mode 100644 index 00000000..f7b2be15 --- /dev/null +++ b/src/SFML/Window/Vulkan.cpp @@ -0,0 +1,95 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without 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) + +#include <SFML/Window/Unix/VulkanImplX11.hpp> +typedef sf::priv::VulkanImplX11 VulkanImplType; + +#else + +#define SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE + +#endif + + +namespace sf +{ +//////////////////////////////////////////////////////////// +bool Vulkan::isAvailable(bool requireGraphics) +{ +#if defined(SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE) + + return false; + +#else + + return VulkanImplType::isAvailable(requireGraphics); + +#endif +} + + +//////////////////////////////////////////////////////////// +VulkanFunctionPointer Vulkan::getFunction(const char* name) +{ +#if defined(SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE) + + 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/VulkanImplWin32.cpp b/src/SFML/Window/Win32/VulkanImplWin32.cpp new file mode 100644 index 00000000..6b68e9d2 --- /dev/null +++ b/src/SFML/Window/Win32/VulkanImplWin32.cpp @@ -0,0 +1,219 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without 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> +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#define VK_USE_PLATFORM_WIN32_KHR +#define VK_NO_PROTOTYPES +#include <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>(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 00000000..11bf9a37 --- /dev/null +++ b/src/SFML/Window/Win32/VulkanImplWin32.hpp @@ -0,0 +1,103 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without 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/WindowBase.cpp b/src/SFML/Window/WindowBase.cpp index 58935cad..cfb6446e 100644 --- a/src/SFML/Window/WindowBase.cpp +++ b/src/SFML/Window/WindowBase.cpp @@ -308,6 +308,13 @@ WindowHandle WindowBase::getSystemHandle() const } +//////////////////////////////////////////////////////////// +bool WindowBase::createVulkanSurface(const VkInstance& instance, VkSurfaceKHR& surface, const VkAllocationCallbacks* allocator) +{ + return m_impl ? m_impl->createVulkanSurface(instance, surface, allocator) : false; +} + + //////////////////////////////////////////////////////////// void WindowBase::onCreate() { diff --git a/src/SFML/Window/WindowImpl.cpp b/src/SFML/Window/WindowImpl.cpp index 928493f5..cb5d026b 100644 --- a/src/SFML/Window/WindowImpl.cpp +++ b/src/SFML/Window/WindowImpl.cpp @@ -38,26 +38,38 @@ #include <SFML/Window/Win32/WindowImplWin32.hpp> typedef sf::priv::WindowImplWin32 WindowImplType; + #include <SFML/Window/Win32/VulkanImplWin32.hpp> + typedef sf::priv::VulkanImplWin32 VulkanImplType; + #elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) #include <SFML/Window/Unix/WindowImplX11.hpp> typedef sf::priv::WindowImplX11 WindowImplType; + #include <SFML/Window/Unix/VulkanImplX11.hpp> + typedef sf::priv::VulkanImplX11 VulkanImplType; + #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 @@ -261,6 +273,21 @@ void WindowImpl::processSensorEvents() } } + +//////////////////////////////////////////////////////////// +bool WindowImpl::createVulkanSurface(const VkInstance& instance, VkSurfaceKHR& surface, const VkAllocationCallbacks* allocator) +{ +#if defined(SFML_VULKAN_IMPLEMENTATION_NOT_AVAILABLE) + + 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 abcafbb0..b4823d8c 100644 --- a/src/SFML/Window/WindowImpl.hpp +++ b/src/SFML/Window/WindowImpl.hpp @@ -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: //////////////////////////////////////////////////////////// From 689f468e368adb7ab378570b26051d4658c2585b Mon Sep 17 00:00:00 2001 From: Radek Dutkiewicz <radicdotkey@gmail.com> Date: Sat, 9 Mar 2019 03:54:45 +0000 Subject: [PATCH 180/211] Fixed text rendering artifacts on Radeon cards. Padding set to 1.0 was causing adjacent glyphs leaking on Radeon cards. The initial padding value for glyphs was too high anyway, the proper value should be 0.5 on each side. --- src/SFML/Graphics/Text.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 7cb4f889..45172c87 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -50,7 +50,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) { - float padding = 1.0; + float padding = 0.5; float left = glyph.bounds.left - padding; float top = glyph.bounds.top - padding; From 6a79ebf1b3cc001159ea90066a3a1e73b9de10f0 Mon Sep 17 00:00:00 2001 From: Radek Dutkiewicz <radicdotkey@gmail.com> Date: Wed, 23 Oct 2019 00:53:34 +0100 Subject: [PATCH 181/211] Fixed text rendering artifacts on Radeon cards, revised. Reverted the padding used for drawing to 1.0 and increased the padding during glyph generation instead. --- src/SFML/Graphics/Font.cpp | 2 +- src/SFML/Graphics/Text.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SFML/Graphics/Font.cpp b/src/SFML/Graphics/Font.cpp index dbe4de9f..4576987c 100644 --- a/src/SFML/Graphics/Font.cpp +++ b/src/SFML/Graphics/Font.cpp @@ -601,7 +601,7 @@ Glyph Font::loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, f { // 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; diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 45172c87..7cb4f889 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -50,7 +50,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) { - float padding = 0.5; + float padding = 1.0; float left = glyph.bounds.left - padding; float top = glyph.bounds.top - padding; From 80c3bdc23c1874494196bbf8a481a859712ece88 Mon Sep 17 00:00:00 2001 From: kimci86 <kimci86@hotmail.fr> Date: Thu, 14 Nov 2019 20:45:09 +0100 Subject: [PATCH 182/211] Fix CMake scripts to install and find doxygen's generated SFML.tag file --- cmake/SFMLConfig.cmake.in | 2 +- doc/CMakeLists.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/cmake/SFMLConfig.cmake.in b/cmake/SFMLConfig.cmake.in index ce819534..86527b73 100644 --- a/cmake/SFMLConfig.cmake.in +++ b/cmake/SFMLConfig.cmake.in @@ -77,7 +77,7 @@ set(FIND_SFML_PATHS /opt) find_path(SFML_DOC_DIR SFML.tag - PATH_SUFFIXES SFML/doc share/SFML/doc + PATH_SUFFIXES SFML/doc share/doc/SFML PATHS ${FIND_SFML_PATHS}) diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 175fa733..d67f9062 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -52,6 +52,9 @@ add_custom_target(doc ALL 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 ${CMAKE_INSTALL_DOCDIR} COMPONENT doc) From a1d4bc80c2146962aca962aa98b785c95d965ab9 Mon Sep 17 00:00:00 2001 From: Mario Liebisch <mario.liebisch@gmail.com> Date: Thu, 14 Nov 2019 13:57:48 +0100 Subject: [PATCH 183/211] Changed Doxygen single-line comment format Single line comments starting with `///` are interpreted by Microsoft Visual Studio as documentation containing XML code. Therefore single line comments starting with `///<` unfortunately cause a parsing error, as IntelliSense will assume the `<` is the start of an XML tag. This is not the case, but unfortunately, IntelliSense will still complain about the following space character rather than displaying the raw string. This commit alters all such comments to start with `//!<` instead, which prevents the issue. This fixes issue #1622. --- include/SFML/Audio/InputSoundFile.hpp | 14 +- include/SFML/Audio/Music.hpp | 12 +- include/SFML/Audio/OutputSoundFile.hpp | 2 +- include/SFML/Audio/Sound.hpp | 2 +- include/SFML/Audio/SoundBuffer.hpp | 10 +- include/SFML/Audio/SoundBufferRecorder.hpp | 4 +- include/SFML/Audio/SoundFileFactory.hpp | 4 +- include/SFML/Audio/SoundFileReader.hpp | 6 +- include/SFML/Audio/SoundRecorder.hpp | 14 +- include/SFML/Audio/SoundSource.hpp | 8 +- include/SFML/Audio/SoundStream.hpp | 32 +-- include/SFML/Graphics/BlendMode.hpp | 46 ++-- include/SFML/Graphics/CircleShape.hpp | 4 +- include/SFML/Graphics/Color.hpp | 26 +-- include/SFML/Graphics/ConvexShape.hpp | 2 +- include/SFML/Graphics/Font.hpp | 38 +-- include/SFML/Graphics/Glsl.inl | 10 +- include/SFML/Graphics/Glyph.hpp | 6 +- include/SFML/Graphics/Image.hpp | 4 +- include/SFML/Graphics/PrimitiveType.hpp | 20 +- include/SFML/Graphics/Rect.hpp | 8 +- include/SFML/Graphics/RectangleShape.hpp | 2 +- include/SFML/Graphics/RenderStates.hpp | 10 +- include/SFML/Graphics/RenderTarget.hpp | 24 +- include/SFML/Graphics/RenderTexture.hpp | 4 +- include/SFML/Graphics/RenderWindow.hpp | 2 +- include/SFML/Graphics/Shader.hpp | 14 +- include/SFML/Graphics/Shape.hpp | 18 +- include/SFML/Graphics/Sprite.hpp | 6 +- include/SFML/Graphics/Text.hpp | 38 +-- include/SFML/Graphics/Texture.hpp | 24 +- include/SFML/Graphics/Transform.hpp | 4 +- include/SFML/Graphics/Transformable.hpp | 16 +- include/SFML/Graphics/Vertex.hpp | 6 +- include/SFML/Graphics/VertexArray.hpp | 4 +- include/SFML/Graphics/VertexBuffer.hpp | 14 +- include/SFML/Graphics/View.hpp | 16 +- include/SFML/Network/Ftp.hpp | 104 ++++----- include/SFML/Network/Http.hpp | 86 +++---- include/SFML/Network/IpAddress.hpp | 12 +- include/SFML/Network/Packet.hpp | 8 +- include/SFML/Network/Socket.hpp | 22 +- include/SFML/Network/SocketSelector.hpp | 2 +- include/SFML/Network/TcpSocket.hpp | 8 +- include/SFML/Network/UdpSocket.hpp | 4 +- include/SFML/System/Clock.hpp | 2 +- include/SFML/System/FileInputStream.hpp | 2 +- include/SFML/System/Lock.hpp | 2 +- include/SFML/System/MemoryInputStream.hpp | 6 +- include/SFML/System/Mutex.hpp | 2 +- include/SFML/System/String.hpp | 8 +- include/SFML/System/Thread.hpp | 4 +- include/SFML/System/ThreadLocal.hpp | 2 +- include/SFML/System/Time.hpp | 4 +- include/SFML/System/Vector2.hpp | 4 +- include/SFML/System/Vector3.hpp | 6 +- include/SFML/Window/Context.hpp | 2 +- include/SFML/Window/ContextSettings.hpp | 20 +- include/SFML/Window/Cursor.hpp | 28 +-- include/SFML/Window/Event.hpp | 140 ++++++------ include/SFML/Window/Joystick.hpp | 28 +-- include/SFML/Window/Keyboard.hpp | 216 +++++++++--------- include/SFML/Window/Mouse.hpp | 16 +- include/SFML/Window/Sensor.hpp | 14 +- include/SFML/Window/VideoMode.hpp | 6 +- include/SFML/Window/Window.hpp | 6 +- include/SFML/Window/WindowBase.hpp | 4 +- include/SFML/Window/WindowStyle.hpp | 12 +- src/SFML/Audio/SoundFileReaderFlac.hpp | 4 +- src/SFML/Audio/SoundFileReaderWav.hpp | 8 +- src/SFML/Audio/SoundFileWriterFlac.hpp | 6 +- src/SFML/Audio/SoundFileWriterWav.hpp | 2 +- .../Graphics/RenderTextureImplDefault.hpp | 6 +- src/SFML/Graphics/RenderTextureImplFBO.hpp | 20 +- src/SFML/Graphics/Shader.cpp | 8 +- src/SFML/Graphics/TextureSaver.hpp | 2 +- src/SFML/Network/Ftp.cpp | 4 +- src/SFML/Network/SocketSelector.cpp | 8 +- src/SFML/System/Win32/MutexImpl.hpp | 2 +- src/SFML/System/Win32/ThreadImpl.hpp | 4 +- src/SFML/System/Win32/ThreadLocalImpl.hpp | 2 +- src/SFML/Window/EglContext.hpp | 8 +- src/SFML/Window/GlContext.hpp | 4 +- src/SFML/Window/JoystickImpl.hpp | 10 +- src/SFML/Window/JoystickManager.hpp | 10 +- src/SFML/Window/SensorManager.hpp | 10 +- src/SFML/Window/Win32/JoystickImpl.hpp | 14 +- src/SFML/Window/Win32/WglContext.hpp | 10 +- src/SFML/Window/Win32/WindowImplWin32.hpp | 24 +- src/SFML/Window/WindowImpl.hpp | 10 +- 90 files changed, 715 insertions(+), 715 deletions(-) diff --git a/include/SFML/Audio/InputSoundFile.hpp b/include/SFML/Audio/InputSoundFile.hpp index 30354bde..f4000d4c 100644 --- a/include/SFML/Audio/InputSoundFile.hpp +++ b/include/SFML/Audio/InputSoundFile.hpp @@ -206,13 +206,13 @@ 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/Music.hpp b/include/SFML/Audio/Music.hpp index 44428acd..732eb42b 100644 --- a/include/SFML/Audio/Music.hpp +++ b/include/SFML/Audio/Music.hpp @@ -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 @@ -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 25c9ccd1..c8f06260 100644 --- a/include/SFML/Audio/OutputSoundFile.hpp +++ b/include/SFML/Audio/OutputSoundFile.hpp @@ -93,7 +93,7 @@ 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 5a001045..a4a49835 100644 --- a/include/SFML/Audio/Sound.hpp +++ b/include/SFML/Audio/Sound.hpp @@ -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 ca506ef4..8b965b6d 100644 --- a/include/SFML/Audio/SoundBuffer.hpp +++ b/include/SFML/Audio/SoundBuffer.hpp @@ -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 f7d147e4..e14c4880 100644 --- a/include/SFML/Audio/SoundBufferRecorder.hpp +++ b/include/SFML/Audio/SoundBufferRecorder.hpp @@ -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 a00d6dcd..b7d7c877 100644 --- a/include/SFML/Audio/SoundFileFactory.hpp +++ b/include/SFML/Audio/SoundFileFactory.hpp @@ -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/SoundFileReader.hpp b/include/SFML/Audio/SoundFileReader.hpp index e6ef7a41..04fd5ff6 100644 --- a/include/SFML/Audio/SoundFileReader.hpp +++ b/include/SFML/Audio/SoundFileReader.hpp @@ -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/SoundRecorder.hpp b/include/SFML/Audio/SoundRecorder.hpp index 4a6fec25..ccbdca12 100644 --- a/include/SFML/Audio/SoundRecorder.hpp +++ b/include/SFML/Audio/SoundRecorder.hpp @@ -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 diff --git a/include/SFML/Audio/SoundSource.hpp b/include/SFML/Audio/SoundSource.hpp index ac9d17a1..02a3f5d5 100644 --- a/include/SFML/Audio/SoundSource.hpp +++ b/include/SFML/Audio/SoundSource.hpp @@ -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 1659d7d2..f1c7f1f5 100644 --- a/include/SFML/Audio/SoundStream.hpp +++ b/include/SFML/Audio/SoundStream.hpp @@ -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 }; //////////////////////////////////////////////////////////// @@ -299,24 +299,24 @@ 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) + 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. }; } // namespace sf diff --git a/include/SFML/Graphics/BlendMode.hpp b/include/SFML/Graphics/BlendMode.hpp index f3ec906f..c2613cba 100644 --- a/include/SFML/Graphics/BlendMode.hpp +++ b/include/SFML/Graphics/BlendMode.hpp @@ -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,9 @@ 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 }; //////////////////////////////////////////////////////////// @@ -112,12 +112,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 +147,10 @@ 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 BlendNone; //!< Overwrite dest with source } // namespace sf diff --git a/include/SFML/Graphics/CircleShape.hpp b/include/SFML/Graphics/CircleShape.hpp index aa139c8e..eba29c58 100644 --- a/include/SFML/Graphics/CircleShape.hpp +++ b/include/SFML/Graphics/CircleShape.hpp @@ -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 92931f11..6771da13 100644 --- a/include/SFML/Graphics/Color.hpp +++ b/include/SFML/Graphics/Color.hpp @@ -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 7b1bfd0c..28b6f22b 100644 --- a/include/SFML/Graphics/ConvexShape.hpp +++ b/include/SFML/Graphics/ConvexShape.hpp @@ -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/Font.hpp b/include/SFML/Graphics/Font.hpp index 7316d430..49a9f863 100644 --- a/include/SFML/Graphics/Font.hpp +++ b/include/SFML/Graphics/Font.hpp @@ -57,7 +57,7 @@ public: //////////////////////////////////////////////////////////// struct Info { - std::string family; ///< The font family + std::string family; //!< The font family }; public: @@ -273,15 +273,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 @@ -291,10 +291,10 @@ private: { Page(); - 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 }; //////////////////////////////////////////////////////////// @@ -341,21 +341,21 @@ 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 + 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.inl b/include/SFML/Graphics/Glsl.inl index 1fd2816a..610b41b0 100644 --- a/include/SFML/Graphics/Glsl.inl +++ b/include/SFML/Graphics/Glsl.inl @@ -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 ce2fb158..f0b4deb1 100644 --- a/include/SFML/Graphics/Glyph.hpp +++ b/include/SFML/Graphics/Glyph.hpp @@ -51,9 +51,9 @@ 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 + 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 a58b3bc8..570d4f11 100644 --- a/include/SFML/Graphics/Image.hpp +++ b/include/SFML/Graphics/Image.hpp @@ -263,8 +263,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 6e4a3949..74e3c416 100644 --- a/include/SFML/Graphics/PrimitiveType.hpp +++ b/include/SFML/Graphics/PrimitiveType.hpp @@ -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 466db4d0..0342e5f3 100644 --- a/include/SFML/Graphics/Rect.hpp +++ b/include/SFML/Graphics/Rect.hpp @@ -174,10 +174,10 @@ public: //////////////////////////////////////////////////////////// // 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/RectangleShape.hpp b/include/SFML/Graphics/RectangleShape.hpp index b4f2ff07..f2151768 100644 --- a/include/SFML/Graphics/RectangleShape.hpp +++ b/include/SFML/Graphics/RectangleShape.hpp @@ -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 a04e977a..08ff6324 100644 --- a/include/SFML/Graphics/RenderStates.hpp +++ b/include/SFML/Graphics/RenderStates.hpp @@ -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 c35a99ea..29f411c3 100644 --- a/include/SFML/Graphics/RenderTarget.hpp +++ b/include/SFML/Graphics/RenderTarget.hpp @@ -458,23 +458,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 ebb39127..7d5f612f 100644 --- a/include/SFML/Graphics/RenderTexture.hpp +++ b/include/SFML/Graphics/RenderTexture.hpp @@ -238,8 +238,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 b8478197..969cbf12 100644 --- a/include/SFML/Graphics/RenderWindow.hpp +++ b/include/SFML/Graphics/RenderWindow.hpp @@ -183,7 +183,7 @@ private: //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - unsigned int m_defaultFrameBuffer; ///< Framebuffer to bind when targeting this window + 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 6b0026e8..60fb7777 100644 --- a/include/SFML/Graphics/Shader.hpp +++ b/include/SFML/Graphics/Shader.hpp @@ -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 94990f29..087ef94e 100644 --- a/include/SFML/Graphics/Shape.hpp +++ b/include/SFML/Graphics/Shape.hpp @@ -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 b44584be..56bea3e5 100644 --- a/include/SFML/Graphics/Sprite.hpp +++ b/include/SFML/Graphics/Sprite.hpp @@ -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 158e149a..25c6b462 100644 --- a/include/SFML/Graphics/Text.hpp +++ b/include/SFML/Graphics/Text.hpp @@ -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 a07b5d70..66035b45 100644 --- a/include/SFML/Graphics/Texture.hpp +++ b/include/SFML/Graphics/Texture.hpp @@ -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 1ee2c86a..690cebe9 100644 --- a/include/SFML/Graphics/Transform.hpp +++ b/include/SFML/Graphics/Transform.hpp @@ -351,14 +351,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 b5fe42f3..7d653f1e 100644 --- a/include/SFML/Graphics/Transformable.hpp +++ b/include/SFML/Graphics/Transformable.hpp @@ -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 f3284492..16d0512b 100644 --- a/include/SFML/Graphics/Vertex.hpp +++ b/include/SFML/Graphics/Vertex.hpp @@ -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 0f121be3..1cf8e7f9 100644 --- a/include/SFML/Graphics/VertexArray.hpp +++ b/include/SFML/Graphics/VertexArray.hpp @@ -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 cffbd09d..76dfe761 100644 --- a/include/SFML/Graphics/VertexBuffer.hpp +++ b/include/SFML/Graphics/VertexBuffer.hpp @@ -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 b85d8817..0c1691a7 100644 --- a/include/SFML/Graphics/View.hpp +++ b/include/SFML/Graphics/View.hpp @@ -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/Network/Ftp.hpp b/include/SFML/Network/Ftp.hpp index ebdf27bb..3cac70f9 100644 --- a/include/SFML/Network/Ftp.hpp +++ b/include/SFML/Network/Ftp.hpp @@ -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 c2008153..067f2f4a 100644 --- a/include/SFML/Network/Http.hpp +++ b/include/SFML/Network/Http.hpp @@ -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 5065cd7c..4ed5ea0d 100644 --- a/include/SFML/Network/IpAddress.hpp +++ b/include/SFML/Network/IpAddress.hpp @@ -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 c3cf945e..6d48e520 100644 --- a/include/SFML/Network/Packet.hpp +++ b/include/SFML/Network/Packet.hpp @@ -400,10 +400,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 9f09c0d5..d5f7319e 100644 --- a/include/SFML/Network/Socket.hpp +++ b/include/SFML/Network/Socket.hpp @@ -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/SocketSelector.hpp b/include/SFML/Network/SocketSelector.hpp index 3017d08a..d8e2b965 100644 --- a/include/SFML/Network/SocketSelector.hpp +++ b/include/SFML/Network/SocketSelector.hpp @@ -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/TcpSocket.hpp b/include/SFML/Network/TcpSocket.hpp index 7ab0bff1..52b84e1c 100644 --- a/include/SFML/Network/TcpSocket.hpp +++ b/include/SFML/Network/TcpSocket.hpp @@ -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 8e395886..826a156d 100644 --- a/include/SFML/Network/UdpSocket.hpp +++ b/include/SFML/Network/UdpSocket.hpp @@ -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 }; //////////////////////////////////////////////////////////// @@ -193,7 +193,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/System/Clock.hpp b/include/SFML/System/Clock.hpp index 5475123e..6e40c001 100644 --- a/include/SFML/System/Clock.hpp +++ b/include/SFML/System/Clock.hpp @@ -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/FileInputStream.hpp b/include/SFML/System/FileInputStream.hpp index 2c816b8f..bc051c44 100644 --- a/include/SFML/System/FileInputStream.hpp +++ b/include/SFML/System/FileInputStream.hpp @@ -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/Lock.hpp b/include/SFML/System/Lock.hpp index 9dc643ee..e4d33a88 100644 --- a/include/SFML/System/Lock.hpp +++ b/include/SFML/System/Lock.hpp @@ -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 195d13a5..e97df71f 100644 --- a/include/SFML/System/MemoryInputStream.hpp +++ b/include/SFML/System/MemoryInputStream.hpp @@ -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 ceeea82d..c7b1f9e3 100644 --- a/include/SFML/System/Mutex.hpp +++ b/include/SFML/System/Mutex.hpp @@ -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/String.hpp b/include/SFML/System/String.hpp index 0ecf9399..46a87e42 100644 --- a/include/SFML/System/String.hpp +++ b/include/SFML/System/String.hpp @@ -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/Thread.hpp b/include/SFML/System/Thread.hpp index 59e3c662..16701b7b 100644 --- a/include/SFML/System/Thread.hpp +++ b/include/SFML/System/Thread.hpp @@ -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/ThreadLocal.hpp b/include/SFML/System/ThreadLocal.hpp index d79a0575..1eb442b5 100644 --- a/include/SFML/System/ThreadLocal.hpp +++ b/include/SFML/System/ThreadLocal.hpp @@ -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/Time.hpp b/include/SFML/System/Time.hpp index 98968a91..4541afbc 100644 --- a/include/SFML/System/Time.hpp +++ b/include/SFML/System/Time.hpp @@ -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/Vector2.hpp b/include/SFML/System/Vector2.hpp index 1eca0270..3335944c 100644 --- a/include/SFML/System/Vector2.hpp +++ b/include/SFML/System/Vector2.hpp @@ -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/Vector3.hpp b/include/SFML/System/Vector3.hpp index cac24c24..4aced322 100644 --- a/include/SFML/System/Vector3.hpp +++ b/include/SFML/System/Vector3.hpp @@ -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/Window/Context.hpp b/include/SFML/Window/Context.hpp index 00418e5e..01590834 100644 --- a/include/SFML/Window/Context.hpp +++ b/include/SFML/Window/Context.hpp @@ -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 91c0f7cd..1acd60e9 100644 --- a/include/SFML/Window/ContextSettings.hpp +++ b/include/SFML/Window/ContextSettings.hpp @@ -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 da6b15b3..f13840f6 100644 --- a/include/SFML/Window/Cursor.hpp +++ b/include/SFML/Window/Cursor.hpp @@ -75,19 +75,19 @@ public: //////////////////////////////////////////////////////////// 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 + SizeAll, //!< Combination of SizeHorizontal and SizeVertical + Cross, //!< Crosshair cursor + Help, //!< Help cursor + NotAllowed //!< Action not allowed cursor }; public: @@ -179,7 +179,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 955b1073..53b37d95 100644 --- a/include/SFML/Window/Event.hpp +++ b/include/SFML/Window/Event.hpp @@ -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,11 @@ 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 + 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 +74,7 @@ public: //////////////////////////////////////////////////////////// struct TextEvent { - Uint32 unicode; ///< UTF-32 Unicode value of the character + Uint32 unicode; //!< UTF-32 Unicode value of the character }; //////////////////////////////////////////////////////////// @@ -83,8 +83,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 +94,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 +108,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 +119,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 +132,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 +141,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 +153,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 +163,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 +174,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 +186,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/Joystick.hpp b/include/SFML/Window/Joystick.hpp index 25ac8b6a..ad61587e 100644 --- a/include/SFML/Window/Joystick.hpp +++ b/include/SFML/Window/Joystick.hpp @@ -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 3d882542..92ea8df8 100644 --- a/include/SFML/Window/Keyboard.hpp +++ b/include/SFML/Window/Keyboard.hpp @@ -47,118 +47,118 @@ public: //////////////////////////////////////////////////////////// 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 + 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 + 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 + 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 }; //////////////////////////////////////////////////////////// diff --git a/include/SFML/Window/Mouse.hpp b/include/SFML/Window/Mouse.hpp index e5df9fbd..7506282d 100644 --- a/include/SFML/Window/Mouse.hpp +++ b/include/SFML/Window/Mouse.hpp @@ -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,8 +65,8 @@ public: //////////////////////////////////////////////////////////// enum Wheel { - VerticalWheel, ///< The vertical mouse wheel - HorizontalWheel ///< The horizontal mouse wheel + VerticalWheel, //!< The vertical mouse wheel + HorizontalWheel //!< The horizontal mouse wheel }; //////////////////////////////////////////////////////////// diff --git a/include/SFML/Window/Sensor.hpp b/include/SFML/Window/Sensor.hpp index 4f40e627..2bce8676 100644 --- a/include/SFML/Window/Sensor.hpp +++ b/include/SFML/Window/Sensor.hpp @@ -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/VideoMode.hpp b/include/SFML/Window/VideoMode.hpp index 03b1ee6a..24c4ec61 100644 --- a/include/SFML/Window/VideoMode.hpp +++ b/include/SFML/Window/VideoMode.hpp @@ -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/Window.hpp b/include/SFML/Window/Window.hpp index 77728696..f89fc353 100644 --- a/include/SFML/Window/Window.hpp +++ b/include/SFML/Window/Window.hpp @@ -276,9 +276,9 @@ private: //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - 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 + 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 index 747b9058..b3073cbf 100644 --- a/include/SFML/Window/WindowBase.hpp +++ b/include/SFML/Window/WindowBase.hpp @@ -470,8 +470,8 @@ private: //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - priv::WindowImpl* m_impl; ///< Platform-specific implementation of the window - Vector2u m_size; ///< Current size of the window + priv::WindowImpl* m_impl; //!< Platform-specific implementation of the window + Vector2u m_size; //!< Current size of the window }; } // namespace sf diff --git a/include/SFML/Window/WindowStyle.hpp b/include/SFML/Window/WindowStyle.hpp index 5a0b7e85..5edf76ce 100644 --- a/include/SFML/Window/WindowStyle.hpp +++ b/include/SFML/Window/WindowStyle.hpp @@ -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/src/SFML/Audio/SoundFileReaderFlac.hpp b/src/SFML/Audio/SoundFileReaderFlac.hpp index ac974ea1..23ec12db 100644 --- a/src/SFML/Audio/SoundFileReaderFlac.hpp +++ b/src/SFML/Audio/SoundFileReaderFlac.hpp @@ -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/SoundFileReaderWav.hpp b/src/SFML/Audio/SoundFileReaderWav.hpp index cc92aa9a..f2f89479 100644 --- a/src/SFML/Audio/SoundFileReaderWav.hpp +++ b/src/SFML/Audio/SoundFileReaderWav.hpp @@ -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.hpp b/src/SFML/Audio/SoundFileWriterFlac.hpp index 40b710f1..7eef2e4a 100644 --- a/src/SFML/Audio/SoundFileWriterFlac.hpp +++ b/src/SFML/Audio/SoundFileWriterFlac.hpp @@ -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/SoundFileWriterWav.hpp b/src/SFML/Audio/SoundFileWriterWav.hpp index 0de16787..f1b07e7e 100644 --- a/src/SFML/Audio/SoundFileWriterWav.hpp +++ b/src/SFML/Audio/SoundFileWriterWav.hpp @@ -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/Graphics/RenderTextureImplDefault.hpp b/src/SFML/Graphics/RenderTextureImplDefault.hpp index d3e9ef5e..f7ab219e 100644 --- a/src/SFML/Graphics/RenderTextureImplDefault.hpp +++ b/src/SFML/Graphics/RenderTextureImplDefault.hpp @@ -102,9 +102,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.hpp b/src/SFML/Graphics/RenderTextureImplFBO.hpp index 4a783965..8cddd109 100644 --- a/src/SFML/Graphics/RenderTextureImplFBO.hpp +++ b/src/SFML/Graphics/RenderTextureImplFBO.hpp @@ -125,16 +125,16 @@ 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 }; } // namespace priv diff --git a/src/SFML/Graphics/Shader.cpp b/src/SFML/Graphics/Shader.cpp index b7aed77a..9d0cfba4 100644 --- a/src/SFML/Graphics/Shader.cpp +++ b/src/SFML/Graphics/Shader.cpp @@ -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 }; diff --git a/src/SFML/Graphics/TextureSaver.hpp b/src/SFML/Graphics/TextureSaver.hpp index 5ee9f000..68109456 100644 --- a/src/SFML/Graphics/TextureSaver.hpp +++ b/src/SFML/Graphics/TextureSaver.hpp @@ -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/Network/Ftp.cpp b/src/SFML/Network/Ftp.cpp index a4cd12e7..4eb13bcb 100644 --- a/src/SFML/Network/Ftp.cpp +++ b/src/SFML/Network/Ftp.cpp @@ -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 }; diff --git a/src/SFML/Network/SocketSelector.cpp b/src/SFML/Network/SocketSelector.cpp index 37dda021..c180736a 100644 --- a/src/SFML/Network/SocketSelector.cpp +++ b/src/SFML/Network/SocketSelector.cpp @@ -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 }; diff --git a/src/SFML/System/Win32/MutexImpl.hpp b/src/SFML/System/Win32/MutexImpl.hpp index 2af0d91e..1a36a6d5 100644 --- a/src/SFML/System/Win32/MutexImpl.hpp +++ b/src/SFML/System/Win32/MutexImpl.hpp @@ -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/ThreadImpl.hpp b/src/SFML/System/Win32/ThreadImpl.hpp index d0c87b5d..f4dc9534 100644 --- a/src/SFML/System/Win32/ThreadImpl.hpp +++ b/src/SFML/System/Win32/ThreadImpl.hpp @@ -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.hpp b/src/SFML/System/Win32/ThreadLocalImpl.hpp index ef29b683..d87db142 100644 --- a/src/SFML/System/Win32/ThreadLocalImpl.hpp +++ b/src/SFML/System/Win32/ThreadLocalImpl.hpp @@ -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/EglContext.hpp b/src/SFML/Window/EglContext.hpp index d18e5643..6ff6a4af 100644 --- a/src/SFML/Window/EglContext.hpp +++ b/src/SFML/Window/EglContext.hpp @@ -188,10 +188,10 @@ private: //////////////////////////////////////////////////////////// // 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/GlContext.hpp b/src/SFML/Window/GlContext.hpp index 182eb733..fb76a029 100644 --- a/src/SFML/Window/GlContext.hpp +++ b/src/SFML/Window/GlContext.hpp @@ -273,7 +273,7 @@ protected: //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - ContextSettings m_settings; ///< Creation settings of the context + ContextSettings m_settings; //!< Creation settings of the context private: @@ -294,7 +294,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/JoystickImpl.hpp b/src/SFML/Window/JoystickImpl.hpp index 6323fd70..d469ff0c 100644 --- a/src/SFML/Window/JoystickImpl.hpp +++ b/src/SFML/Window/JoystickImpl.hpp @@ -50,8 +50,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 +68,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 diff --git a/src/SFML/Window/JoystickManager.hpp b/src/SFML/Window/JoystickManager.hpp index f6425172..10ba6a20 100644 --- a/src/SFML/Window/JoystickManager.hpp +++ b/src/SFML/Window/JoystickManager.hpp @@ -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/SensorManager.hpp b/src/SFML/Window/SensorManager.hpp index e7bba30f..85c433a7 100644 --- a/src/SFML/Window/SensorManager.hpp +++ b/src/SFML/Window/SensorManager.hpp @@ -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/Win32/JoystickImpl.hpp b/src/SFML/Window/Win32/JoystickImpl.hpp index c259df15..66175058 100644 --- a/src/SFML/Window/Win32/JoystickImpl.hpp +++ b/src/SFML/Window/Win32/JoystickImpl.hpp @@ -220,13 +220,13 @@ 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 }; } // namespace priv diff --git a/src/SFML/Window/Win32/WglContext.hpp b/src/SFML/Window/Win32/WglContext.hpp index 3dfe6a6d..47fb9328 100644 --- a/src/SFML/Window/Win32/WglContext.hpp +++ b/src/SFML/Window/Win32/WglContext.hpp @@ -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/WindowImplWin32.hpp b/src/SFML/Window/Win32/WindowImplWin32.hpp index a569c381..ba2f662d 100755 --- a/src/SFML/Window/Win32/WindowImplWin32.hpp +++ b/src/SFML/Window/Win32/WindowImplWin32.hpp @@ -272,18 +272,18 @@ private: //////////////////////////////////////////////////////////// // 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/WindowImpl.hpp b/src/SFML/Window/WindowImpl.hpp index b4823d8c..abcf8ba6 100644 --- a/src/SFML/Window/WindowImpl.hpp +++ b/src/SFML/Window/WindowImpl.hpp @@ -282,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 From bf98acc61f56fcc927cb340170010ddd0ed4c03f Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Mon, 9 Dec 2019 00:57:15 +0100 Subject: [PATCH 184/211] Force OpenGL states to be reset when RenderTarget detects that a new context has to be tracked. In the case a context is re-created, FBO RenderTextures would not trigger resetting of the OpenGL states if they were drawn to first since re-initialization of the RenderTarget only happens when a context owner such as a RenderWindow is re-created. Fixes #1625. --- src/SFML/Graphics/RenderTarget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index 4ae96a20..a9c0ecac 100644 --- a/src/SFML/Graphics/RenderTarget.cpp +++ b/src/SFML/Graphics/RenderTarget.cpp @@ -405,6 +405,7 @@ bool RenderTarget::setActive(bool active) { contextRenderTargetMap[contextId] = m_id; + m_cache.glStatesSet = false; m_cache.enable = false; } else if (iter->second != m_id) From 519e1f95727b353124fe5c891bc3d1743289463a Mon Sep 17 00:00:00 2001 From: Jan Haller <bromeon@gmail.com> Date: Sat, 7 Dec 2019 20:03:13 +0100 Subject: [PATCH 185/211] Improve sf::Transform documentation Clarifies order of combine() and equivalence of operations. Closes #1608. --- include/SFML/Graphics/Transform.hpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/include/SFML/Graphics/Transform.hpp b/include/SFML/Graphics/Transform.hpp index 690cebe9..e26c01cd 100644 --- a/include/SFML/Graphics/Transform.hpp +++ b/include/SFML/Graphics/Transform.hpp @@ -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 /// From 110fb75513301af5400df0b9c499510a90684dc6 Mon Sep 17 00:00:00 2001 From: Jan Haller <bromeon@gmail.com> Date: Sun, 8 Dec 2019 10:27:09 +0100 Subject: [PATCH 186/211] Rename FindVorbis -> FindVORBIS, for consistency with exported variables (e.g. VORBIS_FOUND) Fixes #1626 --- cmake/Modules/{FindVorbis.cmake => FindVORBIS.cmake} | 0 src/SFML/Audio/CMakeLists.txt | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename cmake/Modules/{FindVorbis.cmake => FindVORBIS.cmake} (100%) diff --git a/cmake/Modules/FindVorbis.cmake b/cmake/Modules/FindVORBIS.cmake similarity index 100% rename from cmake/Modules/FindVorbis.cmake rename to cmake/Modules/FindVORBIS.cmake diff --git a/src/SFML/Audio/CMakeLists.txt b/src/SFML/Audio/CMakeLists.txt index 420e13b5..ab97a37c 100644 --- a/src/SFML/Audio/CMakeLists.txt +++ b/src/SFML/Audio/CMakeLists.txt @@ -67,11 +67,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 @@ -87,4 +87,4 @@ endif() target_link_libraries(sfml-audio PUBLIC sfml-system - PRIVATE Vorbis FLAC) + PRIVATE VORBIS FLAC) From 1d20edebc7b8608bc7feeae6580d03655cc2aa8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Hahlgan=C3=9F?= <jan.hahlganss@gmail.com> Date: Wed, 22 Jan 2020 20:26:25 +0100 Subject: [PATCH 187/211] SFMLConfigDependencies.cmake.in: Vorbis uppercase --- cmake/SFMLConfigDependencies.cmake.in | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/SFMLConfigDependencies.cmake.in b/cmake/SFMLConfigDependencies.cmake.in index 1028110f..459577cb 100644 --- a/cmake/SFMLConfigDependencies.cmake.in +++ b/cmake/SFMLConfigDependencies.cmake.in @@ -71,11 +71,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() From 632a015663487181ea817731779c2b225937eaa0 Mon Sep 17 00:00:00 2001 From: Michal Marszalek <1aam2am1@gmail.com> Date: Sat, 10 Mar 2018 19:20:04 +0100 Subject: [PATCH 188/211] Added readCurrentReadPosition in sf::Packet --- include/SFML/Network/Packet.hpp | 11 +++++++++++ src/SFML/Network/Packet.cpp | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/include/SFML/Network/Packet.hpp b/include/SFML/Network/Packet.hpp index 6d48e520..b4cf5d2e 100644 --- a/include/SFML/Network/Packet.hpp +++ b/include/SFML/Network/Packet.hpp @@ -72,10 +72,21 @@ public: /// \param sizeInBytes Number of bytes to append /// /// \see clear + /// \see readCurrentReadPosition /// //////////////////////////////////////////////////////////// void append(const void* data, std::size_t sizeInBytes); + //////////////////////////////////////////////////////////// + /// \brief Get a current reading position + /// + /// \return Current position + /// + /// \see append + /// + //////////////////////////////////////////////////////////// + std::size_t getReadPosition() const; + //////////////////////////////////////////////////////////// /// \brief Clear the packet /// diff --git a/src/SFML/Network/Packet.cpp b/src/SFML/Network/Packet.cpp index ac039412..2cb85bdb 100644 --- a/src/SFML/Network/Packet.cpp +++ b/src/SFML/Network/Packet.cpp @@ -63,6 +63,13 @@ void Packet::append(const void* data, std::size_t sizeInBytes) } +//////////////////////////////////////////////////////////// +std::size_t Packet::getReadPosition() const +{ + return m_readPos; +} + + //////////////////////////////////////////////////////////// void Packet::clear() { From 50e173e403ef8912e3d8ac3c7ab3e27e32243339 Mon Sep 17 00:00:00 2001 From: Jonny <jonathan.r.paton@googlemail.com> Date: Tue, 4 Feb 2020 23:37:28 +0000 Subject: [PATCH 189/211] Update documentation --- include/SFML/Network/Packet.hpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/include/SFML/Network/Packet.hpp b/include/SFML/Network/Packet.hpp index b4cf5d2e..9728276c 100644 --- a/include/SFML/Network/Packet.hpp +++ b/include/SFML/Network/Packet.hpp @@ -72,15 +72,17 @@ public: /// \param sizeInBytes Number of bytes to append /// /// \see clear - /// \see readCurrentReadPosition + /// \see getReadPosition /// //////////////////////////////////////////////////////////// void append(const void* data, std::size_t sizeInBytes); //////////////////////////////////////////////////////////// - /// \brief Get a current reading position + /// \brief Get the current reading position in the packet /// - /// \return Current position + /// The next read operation will read data from this position + /// + /// \return The byte offset of the current read position /// /// \see append /// From f57d4620abf5cc02a0ce8a7f93e88bb5aa66a745 Mon Sep 17 00:00:00 2001 From: Jonny <jonathan.r.paton@googlemail.com> Date: Thu, 14 May 2020 10:39:18 +0100 Subject: [PATCH 190/211] Update travis config for android SDK changes --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ebefd2c0..4ae82936 100644 --- a/.travis.yml +++ b/.travis.yml @@ -96,7 +96,6 @@ matrix: install: &androidInstall - echo y | sdkmanager "cmake;3.10.2.4988404" - - echo y | sdkmanager "lldb;3.1" - sudo ln -sf /usr/local/android-sdk/cmake/3.10.2.4988404/bin/cmake /usr/bin/cmake - wget https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip - unzip -qq android-ndk-r18b-linux-x86_64.zip From f93372f98af72d68b7da1349bd3588a6e95c4bd0 Mon Sep 17 00:00:00 2001 From: Quentin Bazin <quent42340@gmail.com> Date: Mon, 11 May 2020 15:01:26 +0200 Subject: [PATCH 191/211] Added missing documentation about TcpListener::listen and Socket::AnyPort. --- include/SFML/Network/TcpListener.hpp | 4 ++++ include/SFML/Network/UdpSocket.hpp | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/include/SFML/Network/TcpListener.hpp b/include/SFML/Network/TcpListener.hpp index 1f99f6d1..3cc4d2c7 100644 --- a/include/SFML/Network/TcpListener.hpp +++ b/include/SFML/Network/TcpListener.hpp @@ -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/UdpSocket.hpp b/include/SFML/Network/UdpSocket.hpp index 826a156d..01645410 100644 --- a/include/SFML/Network/UdpSocket.hpp +++ b/include/SFML/Network/UdpSocket.hpp @@ -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 From 43187455e407258cc4c304064777c59ceb0d13ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=B1=E9=A2=A8=E8=B0=B7=E6=97=A9=E8=8B=97=20=28?= =?UTF-8?q?=E3=81=93=E3=81=A1=E3=82=84=E3=81=95=E3=81=AA=E3=81=88=29?= <sjs333@outlook.com> Date: Wed, 26 Feb 2020 18:55:09 +0800 Subject: [PATCH 192/211] Added Font::hasGlyph() --- include/SFML/Graphics/Font.hpp | 22 ++++++++++++++++++++++ src/SFML/Graphics/Font.cpp | 7 +++++++ 2 files changed, 29 insertions(+) diff --git a/include/SFML/Graphics/Font.hpp b/include/SFML/Graphics/Font.hpp index 49a9f863..2e57c9b7 100644 --- a/include/SFML/Graphics/Font.hpp +++ b/include/SFML/Graphics/Font.hpp @@ -166,6 +166,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. /// @@ -179,6 +183,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 /// diff --git a/src/SFML/Graphics/Font.cpp b/src/SFML/Graphics/Font.cpp index 4576987c..e5616ffe 100644 --- a/src/SFML/Graphics/Font.cpp +++ b/src/SFML/Graphics/Font.cpp @@ -365,6 +365,13 @@ const Glyph& Font::getGlyph(Uint32 codePoint, unsigned int characterSize, bool b } +//////////////////////////////////////////////////////////// +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) const { From 0337568846584fffcee38036880f9f48888c8b7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@sfml-dev.org> Date: Tue, 26 May 2020 23:37:00 +0200 Subject: [PATCH 193/211] Remove link in documentation main page For locally generated documentation the link should not point to a PHP page. The easiest solution is to remove it, given that the same link is available in the navigation. --- doc/mainpage.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mainpage.hpp b/doc/mainpage.hpp index 16f2c43a..8f85f0cd 100644 --- a/doc/mainpage.hpp +++ b/doc/mainpage.hpp @@ -3,7 +3,7 @@ /// /// \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>. /// From 95c98093e9e4924f7978cc83c0126e5bc0b5e7f2 Mon Sep 17 00:00:00 2001 From: scotth <scott.hutchinson@solinnov.com.au> Date: Thu, 28 May 2020 21:06:18 +0930 Subject: [PATCH 194/211] Adjustable processing interval in SoundStream #1517 Resurrection of previous PR with updated documentation. Added setter to adjust processing interval in SoundStream for low-latency streams. --- include/SFML/Audio/SoundStream.hpp | 17 ++++++++++++++++- src/SFML/Audio/SoundStream.cpp | 10 ++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/include/SFML/Audio/SoundStream.hpp b/include/SFML/Audio/SoundStream.hpp index f1c7f1f5..6fbaea4d 100644 --- a/include/SFML/Audio/SoundStream.hpp +++ b/include/SFML/Audio/SoundStream.hpp @@ -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: //////////////////////////////////////////////////////////// @@ -315,8 +329,9 @@ private: 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 + 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 diff --git a/src/SFML/Audio/SoundStream.cpp b/src/SFML/Audio/SoundStream.cpp index 5b6fff02..d8f5f785 100644 --- a/src/SFML/Audio/SoundStream.cpp +++ b/src/SFML/Audio/SoundStream.cpp @@ -51,7 +51,8 @@ m_sampleRate (0), m_format (0), m_loop (false), m_samplesProcessed(0), -m_bufferSeeks () +m_bufferSeeks (), +m_processingInterval(milliseconds(10)) { } @@ -264,6 +265,11 @@ Int64 SoundStream::onLoop() return 0; } +//////////////////////////////////////////////////////////// +void SoundStream::setProcessingInterval(Time interval) +{ + m_processingInterval = interval; +} //////////////////////////////////////////////////////////// void SoundStream::streamData() @@ -384,7 +390,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 From 3557c46ae65a32ac6fc49d81ec026d6a0787564d Mon Sep 17 00:00:00 2001 From: binary1248 <binary1248@hotmail.com> Date: Sat, 4 Jan 2020 02:51:18 +0100 Subject: [PATCH 195/211] Add support for buffered DirectInput data to reduce polling load when it is supported. Only attempt setting a DirectInput device's axis mode if the device reports having axes and its axis mode is not already set to absolute. If the axis mode still can't be set to absolute, blacklist the device so that any future attempts will abort early. This should help when dealing with broken device drivers that report being game controllers and not fully supporting game controller functionality. --- src/SFML/Window/Win32/JoystickImpl.cpp | 417 ++++++++++++++++++++----- src/SFML/Window/Win32/JoystickImpl.hpp | 14 +- 2 files changed, 349 insertions(+), 82 deletions(-) diff --git a/src/SFML/Window/Win32/JoystickImpl.cpp b/src/SFML/Window/Win32/JoystickImpl.cpp index 2e925a57..9f8339d5 100644 --- a/src/SFML/Window/Win32/JoystickImpl.cpp +++ b/src/SFML/Window/Win32/JoystickImpl.cpp @@ -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; } @@ -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; @@ -391,7 +411,7 @@ void JoystickImpl::initializeDInput() // 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,6 +519,8 @@ 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) @@ -508,13 +530,54 @@ bool JoystickImpl::openDInput(unsigned int index) // Create device HRESULT result = directInput->CreateDevice(i->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]; + static DIOBJECTDATAFORMAT data[8 * 4 + 4 + sf::Joystick::ButtonCount]; - data[0].pguid = &guids::GUID_XAxis; - data[0].dwOfs = DIJOFS_X; + 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; + } - data[1].pguid = &guids::GUID_YAxis; - data[1].dwOfs = DIJOFS_Y; + 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]); - 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; - - 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 < 8; ++i) + 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(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,30 +692,10 @@ 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); - - if (result) - { - err() << "Failed to set DirectInput device axis mode: " << result << std::endl; - - m_device->Release(); - m_device = NULL; - - return false; - } - // 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 enumerate DirectInput device objects: " << result << std::endl; @@ -641,29 +705,116 @@ bool JoystickImpl::openDInput(unsigned int index) 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 (!m_device->GetProperty(DIPROP_PRODUCTNAME, &stringProperty.diph)) + // Set device's axis mode to absolute if the device reports having at least one axis + for (int i = 0; i < Joystick::AxisCount; ++i) { - m_identification.name = stringProperty.wsz; + 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; + + result = m_device->GetProperty(DIPROP_AXISMODE, &property.diph); + + if (FAILED(result)) + { + err() << "Failed to get 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 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; - if (!m_device->GetProperty(DIPROP_VIDPID, &property.diph)) + result = m_device->SetProperty(DIPROP_BUFFERSIZE, &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,113 @@ 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] == events[i].dwOfs) + { + if (j == Joystick::PovX) + { + 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[j] = std::sin(angle) * 100.f; + } + else + { + m_state.axes[j] = 0; + } + } + else if (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[j] = std::cos(angle) * 100.f; + } + else + { + m_state.axes[j] = 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] == 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 +975,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 +997,7 @@ JoystickState JoystickImpl::updateDInput() return state; } - if (result) + if (FAILED(result)) { err() << "Failed to get DirectInput device state: " << result << std::endl; @@ -878,7 +1135,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 66175058..ffff8c33 100644 --- a/src/SFML/Window/Win32/JoystickImpl.hpp +++ b/src/SFML/Window/Win32/JoystickImpl.hpp @@ -186,12 +186,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: @@ -227,6 +235,8 @@ private: 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 From 241b542ca30751e9283230288b4d704fe3e80981 Mon Sep 17 00:00:00 2001 From: Bruno Van de Velde <vdv_b@tgui.eu> Date: Sat, 18 Jul 2020 10:13:49 +0200 Subject: [PATCH 196/211] Added XFlush call to WindowImplX11::setMouseCursor --- src/SFML/Window/Unix/WindowImplX11.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SFML/Window/Unix/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index fa0cfc43..1b2e78b9 100644 --- a/src/SFML/Window/Unix/WindowImplX11.cpp +++ b/src/SFML/Window/Unix/WindowImplX11.cpp @@ -1112,6 +1112,7 @@ void WindowImplX11::setMouseCursor(const CursorImpl& cursor) { m_lastCursor = cursor.m_cursor; XDefineCursor(m_display, m_window, m_lastCursor); + XFlush(m_display); } From 5eea8032dbc0d7f6030a3104e886975bf96f6c9e Mon Sep 17 00:00:00 2001 From: mcz <57645227+czateusz@users.noreply.github.com> Date: Mon, 31 Aug 2020 20:48:35 +0200 Subject: [PATCH 197/211] replace dead link in Config.hpp file replace dead link with working link containing information about predefined macros --- include/SFML/Config.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/SFML/Config.hpp b/include/SFML/Config.hpp index 70b4a92d..c4e2f497 100644 --- a/include/SFML/Config.hpp +++ b/include/SFML/Config.hpp @@ -36,7 +36,7 @@ //////////////////////////////////////////////////////////// // 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) From d4ebba3aafa00e74a39872325281799637413825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@my-gate.net> Date: Sat, 12 Sep 2020 13:24:18 +0200 Subject: [PATCH 198/211] Add Visual Studio 2019 builds to Travis --- .travis.yml | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4ae82936..5d6d646b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ addons: before_script: - mkdir build && cd build -- cmake .. $CMAKE_FLAGS -DCMAKE_INSTALL_PREFIX=../install -DSFML_BUILD_EXAMPLES=TRUE +- cmake .. $CMAKE_FLAGS -DCMAKE_INSTALL_PREFIX=../install -DSFML_BUILD_EXAMPLES=TRUE -DCMAKE_VERBOSE_MAKEFILE=ON script: - cmake --build . --target install @@ -74,16 +74,38 @@ matrix: env: - CMAKE_FLAGS="-GXcode -DSFML_BUILD_TEST_SUITE=TRUE -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/iOS.toolchain.cmake -DIOS_PLATFORM=SIMULATOR" - - name: "Visual studio 15 2017 Dynamic" + - name: "Visual Studio 15 2017 Dynamic" os: windows env: - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=FALSE" - - name: "Visual studio 15 2017 Static" + - name: "Visual Studio 15 2017 Static" os: windows env: - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE -DSFML_BUILD_TEST_SUITE=TRUE" + - name: "Visual Studio 16 2019 Dynamic" + os: windows + env: + - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=FALSE" + - MSBUILD_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin" + - VS160COMNTOOLS="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools" + - PATH=$MSBUILD_PATH:$PATH + install: + - choco install visualstudio2019buildtools --package-parameters "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64" + - choco install visualstudio2019-workload-nativedesktop + + - name: "Visual Studio 16 2019 Static" + os: windows + env: + - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE -DSFML_BUILD_TEST_SUITE=TRUE" + - MSBUILD_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin" + - VS160COMNTOOLS="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools" + - PATH=$MSBUILD_PATH:$PATH + install: + - choco install visualstudio2019buildtools --package-parameters "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64" + - choco install visualstudio2019-workload-nativedesktop + - name: "Android armeabi-v7a" language: android android: &androidComponents From 9b596cc8d9240b240c391abb8c784fddbec4e0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= <eXpl0it3r@my-gate.net> Date: Sat, 12 Sep 2020 15:27:45 +0200 Subject: [PATCH 199/211] Update the copyright year to 2020 --- examples/cocoa/CocoaAppDelegate.h | 2 +- examples/cocoa/CocoaAppDelegate.mm | 2 +- examples/cocoa/NSString+stdstring.h | 2 +- examples/cocoa/NSString+stdstring.mm | 2 +- examples/cocoa/main.m | 2 +- examples/cocoa/resources/Cocoa-Info.plist | 2 +- include/SFML/Audio.hpp | 2 +- include/SFML/Audio/AlResource.hpp | 2 +- include/SFML/Audio/Export.hpp | 2 +- include/SFML/Audio/InputSoundFile.hpp | 2 +- include/SFML/Audio/Listener.hpp | 2 +- include/SFML/Audio/Music.hpp | 2 +- include/SFML/Audio/OutputSoundFile.hpp | 2 +- include/SFML/Audio/Sound.hpp | 2 +- include/SFML/Audio/SoundBuffer.hpp | 2 +- include/SFML/Audio/SoundBufferRecorder.hpp | 2 +- include/SFML/Audio/SoundFileFactory.hpp | 2 +- include/SFML/Audio/SoundFileFactory.inl | 2 +- include/SFML/Audio/SoundFileReader.hpp | 2 +- include/SFML/Audio/SoundFileWriter.hpp | 2 +- include/SFML/Audio/SoundRecorder.hpp | 2 +- include/SFML/Audio/SoundSource.hpp | 2 +- include/SFML/Audio/SoundStream.hpp | 2 +- include/SFML/Config.hpp | 2 +- include/SFML/GpuPreference.hpp | 2 +- include/SFML/Graphics.hpp | 2 +- include/SFML/Graphics/BlendMode.hpp | 2 +- include/SFML/Graphics/CircleShape.hpp | 2 +- include/SFML/Graphics/Color.hpp | 2 +- include/SFML/Graphics/ConvexShape.hpp | 2 +- include/SFML/Graphics/Drawable.hpp | 2 +- include/SFML/Graphics/Export.hpp | 2 +- include/SFML/Graphics/Font.hpp | 2 +- include/SFML/Graphics/Glsl.hpp | 2 +- include/SFML/Graphics/Glsl.inl | 2 +- include/SFML/Graphics/Glyph.hpp | 2 +- include/SFML/Graphics/Image.hpp | 2 +- include/SFML/Graphics/PrimitiveType.hpp | 2 +- include/SFML/Graphics/Rect.hpp | 2 +- include/SFML/Graphics/Rect.inl | 2 +- include/SFML/Graphics/RectangleShape.hpp | 2 +- include/SFML/Graphics/RenderStates.hpp | 2 +- include/SFML/Graphics/RenderTarget.hpp | 2 +- include/SFML/Graphics/RenderTexture.hpp | 2 +- include/SFML/Graphics/RenderWindow.hpp | 2 +- include/SFML/Graphics/Shader.hpp | 2 +- include/SFML/Graphics/Shape.hpp | 2 +- include/SFML/Graphics/Sprite.hpp | 2 +- include/SFML/Graphics/Text.hpp | 2 +- include/SFML/Graphics/Texture.hpp | 2 +- include/SFML/Graphics/Transform.hpp | 2 +- include/SFML/Graphics/Transformable.hpp | 2 +- include/SFML/Graphics/Vertex.hpp | 2 +- include/SFML/Graphics/VertexArray.hpp | 2 +- include/SFML/Graphics/VertexBuffer.hpp | 2 +- include/SFML/Graphics/View.hpp | 2 +- include/SFML/Main.hpp | 2 +- include/SFML/Network.hpp | 2 +- include/SFML/Network/Export.hpp | 2 +- include/SFML/Network/Ftp.hpp | 2 +- include/SFML/Network/Http.hpp | 2 +- include/SFML/Network/IpAddress.hpp | 2 +- include/SFML/Network/Packet.hpp | 2 +- include/SFML/Network/Socket.hpp | 2 +- include/SFML/Network/SocketHandle.hpp | 2 +- include/SFML/Network/SocketSelector.hpp | 2 +- include/SFML/Network/TcpListener.hpp | 2 +- include/SFML/Network/TcpSocket.hpp | 2 +- include/SFML/Network/UdpSocket.hpp | 2 +- include/SFML/OpenGL.hpp | 2 +- include/SFML/System.hpp | 2 +- include/SFML/System/Clock.hpp | 2 +- include/SFML/System/Err.hpp | 2 +- include/SFML/System/Export.hpp | 2 +- include/SFML/System/FileInputStream.hpp | 2 +- include/SFML/System/InputStream.hpp | 2 +- include/SFML/System/Lock.hpp | 2 +- include/SFML/System/MemoryInputStream.hpp | 2 +- include/SFML/System/Mutex.hpp | 2 +- include/SFML/System/NativeActivity.hpp | 2 +- include/SFML/System/NonCopyable.hpp | 2 +- include/SFML/System/Sleep.hpp | 2 +- include/SFML/System/String.hpp | 2 +- include/SFML/System/String.inl | 2 +- include/SFML/System/Thread.hpp | 2 +- include/SFML/System/Thread.inl | 2 +- include/SFML/System/ThreadLocal.hpp | 2 +- include/SFML/System/ThreadLocalPtr.hpp | 2 +- include/SFML/System/ThreadLocalPtr.inl | 2 +- include/SFML/System/Time.hpp | 2 +- include/SFML/System/Utf.hpp | 2 +- include/SFML/System/Utf.inl | 2 +- include/SFML/System/Vector2.hpp | 2 +- include/SFML/System/Vector2.inl | 2 +- include/SFML/System/Vector3.hpp | 2 +- include/SFML/System/Vector3.inl | 2 +- include/SFML/Window.hpp | 2 +- include/SFML/Window/Clipboard.hpp | 2 +- include/SFML/Window/Context.hpp | 2 +- include/SFML/Window/ContextSettings.hpp | 2 +- include/SFML/Window/Cursor.hpp | 2 +- include/SFML/Window/Event.hpp | 2 +- include/SFML/Window/Export.hpp | 2 +- include/SFML/Window/GlResource.hpp | 2 +- include/SFML/Window/Joystick.hpp | 2 +- include/SFML/Window/Keyboard.hpp | 2 +- include/SFML/Window/Mouse.hpp | 2 +- include/SFML/Window/Sensor.hpp | 2 +- include/SFML/Window/Touch.hpp | 2 +- include/SFML/Window/VideoMode.hpp | 2 +- include/SFML/Window/Vulkan.hpp | 2 +- include/SFML/Window/Window.hpp | 2 +- include/SFML/Window/WindowBase.hpp | 2 +- include/SFML/Window/WindowHandle.hpp | 2 +- include/SFML/Window/WindowStyle.hpp | 2 +- license.md | 2 +- src/SFML/Audio/ALCheck.cpp | 2 +- src/SFML/Audio/ALCheck.hpp | 2 +- src/SFML/Audio/AlResource.cpp | 2 +- src/SFML/Audio/AudioDevice.cpp | 2 +- src/SFML/Audio/AudioDevice.hpp | 2 +- src/SFML/Audio/InputSoundFile.cpp | 2 +- src/SFML/Audio/Listener.cpp | 2 +- src/SFML/Audio/Music.cpp | 2 +- src/SFML/Audio/OutputSoundFile.cpp | 2 +- src/SFML/Audio/Sound.cpp | 2 +- src/SFML/Audio/SoundBuffer.cpp | 2 +- src/SFML/Audio/SoundBufferRecorder.cpp | 2 +- src/SFML/Audio/SoundFileFactory.cpp | 2 +- src/SFML/Audio/SoundFileReaderFlac.cpp | 2 +- src/SFML/Audio/SoundFileReaderFlac.hpp | 2 +- src/SFML/Audio/SoundFileReaderOgg.cpp | 2 +- src/SFML/Audio/SoundFileReaderOgg.hpp | 2 +- src/SFML/Audio/SoundFileReaderWav.cpp | 2 +- src/SFML/Audio/SoundFileReaderWav.hpp | 2 +- src/SFML/Audio/SoundFileWriterFlac.cpp | 2 +- src/SFML/Audio/SoundFileWriterFlac.hpp | 2 +- src/SFML/Audio/SoundFileWriterOgg.cpp | 2 +- src/SFML/Audio/SoundFileWriterOgg.hpp | 2 +- src/SFML/Audio/SoundFileWriterWav.cpp | 2 +- src/SFML/Audio/SoundFileWriterWav.hpp | 2 +- src/SFML/Audio/SoundRecorder.cpp | 2 +- src/SFML/Audio/SoundSource.cpp | 2 +- src/SFML/Audio/SoundStream.cpp | 2 +- src/SFML/Graphics/BlendMode.cpp | 2 +- src/SFML/Graphics/CircleShape.cpp | 2 +- src/SFML/Graphics/Color.cpp | 2 +- src/SFML/Graphics/ConvexShape.cpp | 2 +- src/SFML/Graphics/Font.cpp | 2 +- src/SFML/Graphics/GLCheck.cpp | 2 +- src/SFML/Graphics/GLCheck.hpp | 2 +- src/SFML/Graphics/GLExtensions.cpp | 2 +- src/SFML/Graphics/GLExtensions.hpp | 2 +- src/SFML/Graphics/Glsl.cpp | 2 +- src/SFML/Graphics/Image.cpp | 2 +- src/SFML/Graphics/ImageLoader.cpp | 2 +- src/SFML/Graphics/ImageLoader.hpp | 2 +- src/SFML/Graphics/RectangleShape.cpp | 2 +- src/SFML/Graphics/RenderStates.cpp | 2 +- src/SFML/Graphics/RenderTarget.cpp | 2 +- src/SFML/Graphics/RenderTexture.cpp | 2 +- src/SFML/Graphics/RenderTextureImpl.cpp | 2 +- src/SFML/Graphics/RenderTextureImpl.hpp | 2 +- src/SFML/Graphics/RenderTextureImplDefault.cpp | 2 +- src/SFML/Graphics/RenderTextureImplDefault.hpp | 2 +- src/SFML/Graphics/RenderTextureImplFBO.cpp | 2 +- src/SFML/Graphics/RenderTextureImplFBO.hpp | 2 +- src/SFML/Graphics/RenderWindow.cpp | 2 +- src/SFML/Graphics/Shader.cpp | 2 +- src/SFML/Graphics/Shape.cpp | 2 +- src/SFML/Graphics/Sprite.cpp | 2 +- src/SFML/Graphics/Text.cpp | 2 +- src/SFML/Graphics/Texture.cpp | 2 +- src/SFML/Graphics/TextureSaver.cpp | 2 +- src/SFML/Graphics/TextureSaver.hpp | 2 +- src/SFML/Graphics/Transform.cpp | 2 +- src/SFML/Graphics/Transformable.cpp | 2 +- src/SFML/Graphics/Vertex.cpp | 2 +- src/SFML/Graphics/VertexArray.cpp | 2 +- src/SFML/Graphics/VertexBuffer.cpp | 2 +- src/SFML/Graphics/View.cpp | 2 +- src/SFML/Main/MainAndroid.cpp | 2 +- src/SFML/Main/MainWin32.cpp | 2 +- src/SFML/Main/MainiOS.mm | 2 +- src/SFML/Network/Ftp.cpp | 2 +- src/SFML/Network/Http.cpp | 2 +- src/SFML/Network/IpAddress.cpp | 2 +- src/SFML/Network/Packet.cpp | 2 +- src/SFML/Network/Socket.cpp | 2 +- src/SFML/Network/SocketImpl.hpp | 2 +- src/SFML/Network/SocketSelector.cpp | 2 +- src/SFML/Network/TcpListener.cpp | 2 +- src/SFML/Network/TcpSocket.cpp | 2 +- src/SFML/Network/UdpSocket.cpp | 2 +- src/SFML/Network/Unix/SocketImpl.cpp | 2 +- src/SFML/Network/Unix/SocketImpl.hpp | 2 +- src/SFML/Network/Win32/SocketImpl.cpp | 2 +- src/SFML/Network/Win32/SocketImpl.hpp | 2 +- src/SFML/System/Android/Activity.cpp | 2 +- src/SFML/System/Android/NativeActivity.cpp | 2 +- src/SFML/System/Clock.cpp | 2 +- src/SFML/System/Err.cpp | 2 +- src/SFML/System/FileInputStream.cpp | 2 +- src/SFML/System/Lock.cpp | 2 +- src/SFML/System/MemoryInputStream.cpp | 2 +- src/SFML/System/Mutex.cpp | 2 +- src/SFML/System/Sleep.cpp | 2 +- src/SFML/System/String.cpp | 2 +- src/SFML/System/Thread.cpp | 2 +- src/SFML/System/ThreadLocal.cpp | 2 +- src/SFML/System/Time.cpp | 2 +- src/SFML/System/Unix/ClockImpl.cpp | 2 +- src/SFML/System/Unix/ClockImpl.hpp | 2 +- src/SFML/System/Unix/MutexImpl.cpp | 2 +- src/SFML/System/Unix/MutexImpl.hpp | 2 +- src/SFML/System/Unix/SleepImpl.cpp | 2 +- src/SFML/System/Unix/SleepImpl.hpp | 2 +- src/SFML/System/Unix/ThreadImpl.cpp | 2 +- src/SFML/System/Unix/ThreadImpl.hpp | 2 +- src/SFML/System/Unix/ThreadLocalImpl.cpp | 2 +- src/SFML/System/Unix/ThreadLocalImpl.hpp | 2 +- src/SFML/System/Win32/ClockImpl.cpp | 2 +- src/SFML/System/Win32/ClockImpl.hpp | 2 +- src/SFML/System/Win32/MutexImpl.cpp | 2 +- src/SFML/System/Win32/MutexImpl.hpp | 2 +- src/SFML/System/Win32/SleepImpl.cpp | 2 +- src/SFML/System/Win32/SleepImpl.hpp | 2 +- src/SFML/System/Win32/ThreadImpl.cpp | 2 +- src/SFML/System/Win32/ThreadImpl.hpp | 2 +- src/SFML/System/Win32/ThreadLocalImpl.cpp | 2 +- src/SFML/System/Win32/ThreadLocalImpl.hpp | 2 +- src/SFML/Window/Android/ClipboardImpl.cpp | 2 +- src/SFML/Window/Android/ClipboardImpl.hpp | 2 +- src/SFML/Window/Android/CursorImpl.cpp | 2 +- src/SFML/Window/Android/CursorImpl.hpp | 2 +- src/SFML/Window/Android/SensorImpl.cpp | 2 +- src/SFML/Window/Android/SensorImpl.hpp | 2 +- src/SFML/Window/Clipboard.cpp | 2 +- src/SFML/Window/ClipboardImpl.hpp | 2 +- src/SFML/Window/Context.cpp | 2 +- src/SFML/Window/Cursor.cpp | 2 +- src/SFML/Window/CursorImpl.hpp | 2 +- src/SFML/Window/FreeBSD/JoystickImpl.cpp | 2 +- src/SFML/Window/FreeBSD/JoystickImpl.hpp | 2 +- src/SFML/Window/GlContext.cpp | 2 +- src/SFML/Window/GlContext.hpp | 2 +- src/SFML/Window/GlResource.cpp | 2 +- src/SFML/Window/InputImpl.hpp | 2 +- src/SFML/Window/Joystick.cpp | 2 +- src/SFML/Window/JoystickImpl.hpp | 2 +- src/SFML/Window/JoystickManager.cpp | 2 +- src/SFML/Window/JoystickManager.hpp | 2 +- src/SFML/Window/Keyboard.cpp | 2 +- src/SFML/Window/Mouse.cpp | 2 +- src/SFML/Window/OSX/AutoreleasePoolWrapper.h | 2 +- src/SFML/Window/OSX/AutoreleasePoolWrapper.mm | 2 +- src/SFML/Window/OSX/ClipboardImpl.hpp | 2 +- src/SFML/Window/OSX/ClipboardImpl.mm | 2 +- src/SFML/Window/OSX/CursorImpl.hpp | 2 +- src/SFML/Window/OSX/CursorImpl.mm | 2 +- src/SFML/Window/OSX/HIDInputManager.hpp | 2 +- src/SFML/Window/OSX/HIDInputManager.mm | 2 +- src/SFML/Window/OSX/HIDJoystickManager.cpp | 2 +- src/SFML/Window/OSX/HIDJoystickManager.hpp | 2 +- src/SFML/Window/OSX/InputImpl.hpp | 2 +- src/SFML/Window/OSX/InputImpl.mm | 2 +- src/SFML/Window/OSX/JoystickImpl.cpp | 2 +- src/SFML/Window/OSX/JoystickImpl.hpp | 2 +- src/SFML/Window/OSX/NSImage+raw.h | 2 +- src/SFML/Window/OSX/NSImage+raw.mm | 2 +- src/SFML/Window/OSX/SFApplication.h | 2 +- src/SFML/Window/OSX/SFApplication.m | 2 +- src/SFML/Window/OSX/SFApplicationDelegate.h | 2 +- src/SFML/Window/OSX/SFApplicationDelegate.m | 2 +- src/SFML/Window/OSX/SFContext.hpp | 2 +- src/SFML/Window/OSX/SFContext.mm | 2 +- src/SFML/Window/OSX/SFKeyboardModifiersHelper.h | 2 +- src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm | 2 +- src/SFML/Window/OSX/SFOpenGLView+keyboard.mm | 2 +- src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h | 2 +- src/SFML/Window/OSX/SFOpenGLView+mouse.mm | 2 +- src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h | 2 +- src/SFML/Window/OSX/SFOpenGLView.h | 2 +- src/SFML/Window/OSX/SFOpenGLView.mm | 2 +- src/SFML/Window/OSX/SFSilentResponder.h | 2 +- src/SFML/Window/OSX/SFSilentResponder.m | 2 +- src/SFML/Window/OSX/SFViewController.h | 2 +- src/SFML/Window/OSX/SFViewController.mm | 2 +- src/SFML/Window/OSX/SFWindow.h | 2 +- src/SFML/Window/OSX/SFWindow.m | 2 +- src/SFML/Window/OSX/SFWindowController.h | 2 +- src/SFML/Window/OSX/SFWindowController.mm | 2 +- src/SFML/Window/OSX/Scaling.h | 2 +- src/SFML/Window/OSX/SensorImpl.cpp | 2 +- src/SFML/Window/OSX/SensorImpl.hpp | 2 +- src/SFML/Window/OSX/VideoModeImpl.cpp | 2 +- src/SFML/Window/OSX/WindowImplCocoa.hpp | 2 +- src/SFML/Window/OSX/WindowImplCocoa.mm | 2 +- src/SFML/Window/OSX/WindowImplDelegateProtocol.h | 2 +- src/SFML/Window/OSX/cg_sf_conversion.hpp | 2 +- src/SFML/Window/OSX/cg_sf_conversion.mm | 2 +- src/SFML/Window/OSX/cpp_objc_conversion.h | 2 +- src/SFML/Window/OSX/cpp_objc_conversion.mm | 2 +- src/SFML/Window/Sensor.cpp | 2 +- src/SFML/Window/SensorImpl.hpp | 2 +- src/SFML/Window/SensorManager.cpp | 2 +- src/SFML/Window/SensorManager.hpp | 2 +- src/SFML/Window/Touch.cpp | 2 +- src/SFML/Window/Unix/ClipboardImpl.cpp | 2 +- src/SFML/Window/Unix/ClipboardImpl.hpp | 2 +- src/SFML/Window/Unix/CursorImpl.cpp | 2 +- src/SFML/Window/Unix/CursorImpl.hpp | 2 +- src/SFML/Window/Unix/Display.cpp | 2 +- src/SFML/Window/Unix/Display.hpp | 2 +- src/SFML/Window/Unix/GlxContext.cpp | 2 +- src/SFML/Window/Unix/GlxContext.hpp | 2 +- src/SFML/Window/Unix/InputImpl.cpp | 2 +- src/SFML/Window/Unix/InputImpl.hpp | 2 +- src/SFML/Window/Unix/JoystickImpl.cpp | 2 +- src/SFML/Window/Unix/JoystickImpl.hpp | 2 +- src/SFML/Window/Unix/SensorImpl.cpp | 2 +- src/SFML/Window/Unix/SensorImpl.hpp | 2 +- src/SFML/Window/Unix/VideoModeImpl.cpp | 2 +- src/SFML/Window/Unix/VulkanImplX11.cpp | 2 +- src/SFML/Window/Unix/VulkanImplX11.hpp | 2 +- src/SFML/Window/Unix/WindowImplX11.cpp | 2 +- src/SFML/Window/Unix/WindowImplX11.hpp | 2 +- src/SFML/Window/VideoMode.cpp | 2 +- src/SFML/Window/VideoModeImpl.hpp | 2 +- src/SFML/Window/Vulkan.cpp | 2 +- src/SFML/Window/Win32/ClipboardImpl.cpp | 2 +- src/SFML/Window/Win32/ClipboardImpl.hpp | 2 +- src/SFML/Window/Win32/CursorImpl.cpp | 2 +- src/SFML/Window/Win32/CursorImpl.hpp | 2 +- src/SFML/Window/Win32/InputImpl.cpp | 2 +- src/SFML/Window/Win32/InputImpl.hpp | 2 +- src/SFML/Window/Win32/JoystickImpl.cpp | 2 +- src/SFML/Window/Win32/JoystickImpl.hpp | 2 +- src/SFML/Window/Win32/SensorImpl.cpp | 2 +- src/SFML/Window/Win32/SensorImpl.hpp | 2 +- src/SFML/Window/Win32/VideoModeImpl.cpp | 2 +- src/SFML/Window/Win32/VulkanImplWin32.cpp | 2 +- src/SFML/Window/Win32/VulkanImplWin32.hpp | 2 +- src/SFML/Window/Win32/WglContext.cpp | 2 +- src/SFML/Window/Win32/WglContext.hpp | 2 +- src/SFML/Window/Win32/WindowImplWin32.cpp | 2 +- src/SFML/Window/Win32/WindowImplWin32.hpp | 2 +- src/SFML/Window/Window.cpp | 2 +- src/SFML/Window/WindowBase.cpp | 2 +- src/SFML/Window/WindowImpl.cpp | 2 +- src/SFML/Window/WindowImpl.hpp | 2 +- src/SFML/Window/iOS/ClipboardImpl.hpp | 2 +- src/SFML/Window/iOS/ClipboardImpl.mm | 2 +- src/SFML/Window/iOS/CursorImpl.cpp | 2 +- src/SFML/Window/iOS/CursorImpl.hpp | 2 +- src/SFML/Window/iOS/EaglContext.hpp | 2 +- src/SFML/Window/iOS/EaglContext.mm | 2 +- src/SFML/Window/iOS/InputImpl.hpp | 2 +- src/SFML/Window/iOS/InputImpl.mm | 2 +- src/SFML/Window/iOS/JoystickImpl.hpp | 2 +- src/SFML/Window/iOS/JoystickImpl.mm | 2 +- src/SFML/Window/iOS/ObjCType.hpp | 2 +- src/SFML/Window/iOS/SFAppDelegate.hpp | 2 +- src/SFML/Window/iOS/SFAppDelegate.mm | 2 +- src/SFML/Window/iOS/SFMain.hpp | 2 +- src/SFML/Window/iOS/SFMain.mm | 2 +- src/SFML/Window/iOS/SFView.hpp | 2 +- src/SFML/Window/iOS/SFView.mm | 2 +- src/SFML/Window/iOS/SFViewController.hpp | 2 +- src/SFML/Window/iOS/SFViewController.mm | 2 +- src/SFML/Window/iOS/SensorImpl.hpp | 2 +- src/SFML/Window/iOS/SensorImpl.mm | 2 +- src/SFML/Window/iOS/VideoModeImpl.mm | 2 +- src/SFML/Window/iOS/WindowImplUIKit.hpp | 2 +- src/SFML/Window/iOS/WindowImplUIKit.mm | 2 +- tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp | 2 +- tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm | 2 +- .../templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in | 2 +- .../templates/SFML/SFML Base.xctemplate/TemplateInfo.plist | 2 +- .../templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist | 2 +- .../xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist | 2 +- .../SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in | 2 +- .../templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist | 2 +- 383 files changed, 383 insertions(+), 383 deletions(-) diff --git a/examples/cocoa/CocoaAppDelegate.h b/examples/cocoa/CocoaAppDelegate.h index 1a21572f..389e94b7 100644 --- a/examples/cocoa/CocoaAppDelegate.h +++ b/examples/cocoa/CocoaAppDelegate.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 d264000c..bfb0dff1 100644 --- a/examples/cocoa/CocoaAppDelegate.mm +++ b/examples/cocoa/CocoaAppDelegate.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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.h b/examples/cocoa/NSString+stdstring.h index fa3df095..4d1d2f5a 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 4958ae7d..59d147d0 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/main.m b/examples/cocoa/main.m index 209a86bf..03da8ce5 100644 --- a/examples/cocoa/main.m +++ b/examples/cocoa/main.m @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 7a7da9b9..1a937c30 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-2019 Marco Antognini and Laurent Gomila. Shared under zlib/libpng License.</string> + <string>Copyright © 2007-2020 Marco Antognini and Laurent Gomila. Shared under zlib/libpng License.</string> <key>NSMainNibFile</key> <string>MainMenu</string> <key>NSPrincipalClass</key> diff --git a/include/SFML/Audio.hpp b/include/SFML/Audio.hpp index f0b5b30a..68fe1a69 100644 --- a/include/SFML/Audio.hpp +++ b/include/SFML/Audio.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 9f0f4dcd..f670c139 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 bba990d9..c21ffb6e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 f4000d4c..4c9eb951 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Listener.hpp b/include/SFML/Audio/Listener.hpp index f14beda2..569eb912 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 732eb42b..bbe84c89 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/OutputSoundFile.hpp b/include/SFML/Audio/OutputSoundFile.hpp index c8f06260..6247ef0e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Sound.hpp b/include/SFML/Audio/Sound.hpp index a4a49835..909f4c16 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundBuffer.hpp b/include/SFML/Audio/SoundBuffer.hpp index 8b965b6d..8b8391a5 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundBufferRecorder.hpp b/include/SFML/Audio/SoundBufferRecorder.hpp index e14c4880..9e100d15 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileFactory.hpp b/include/SFML/Audio/SoundFileFactory.hpp index b7d7c877..cae1f692 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileFactory.inl b/include/SFML/Audio/SoundFileFactory.inl index e9794153..bbfa91f1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 04fd5ff6..61dd998f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileWriter.hpp b/include/SFML/Audio/SoundFileWriter.hpp index 5e7ae016..ff90bab2 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 ccbdca12..53cf73ad 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundSource.hpp b/include/SFML/Audio/SoundSource.hpp index 02a3f5d5..ce795d67 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundStream.hpp b/include/SFML/Audio/SoundStream.hpp index 6fbaea4d..31c6b9f3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Config.hpp b/include/SFML/Config.hpp index c4e2f497..3f282f2a 100644 --- a/include/SFML/Config.hpp +++ b/include/SFML/Config.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GpuPreference.hpp b/include/SFML/GpuPreference.hpp index a05c5a1d..d0cd9adf 100644 --- a/include/SFML/GpuPreference.hpp +++ b/include/SFML/GpuPreference.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d0e0c8ff..191c83fc 100644 --- a/include/SFML/Graphics.hpp +++ b/include/SFML/Graphics.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 c2613cba..4f8462b8 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/CircleShape.hpp b/include/SFML/Graphics/CircleShape.hpp index eba29c58..6f01c8d1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Color.hpp b/include/SFML/Graphics/Color.hpp index 6771da13..6152b8c4 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ConvexShape.hpp b/include/SFML/Graphics/ConvexShape.hpp index 28b6f22b..45925651 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Drawable.hpp b/include/SFML/Graphics/Drawable.hpp index f03e5e0e..612a8203 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1d9d6083..88e4358b 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 2e57c9b7..11ed5d87 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/include/SFML/Graphics/Glsl.hpp index c395344e..6ea8694f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 610b41b0..4a839fdc 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Glyph.hpp b/include/SFML/Graphics/Glyph.hpp index f0b4deb1..9ee00175 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Image.hpp b/include/SFML/Graphics/Image.hpp index 570d4f11..f2a7518b 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/PrimitiveType.hpp b/include/SFML/Graphics/PrimitiveType.hpp index 74e3c416..08b675e3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Rect.hpp b/include/SFML/Graphics/Rect.hpp index 0342e5f3..d6cba3dd 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Rect.inl b/include/SFML/Graphics/Rect.inl index 1aa073dc..d996c604 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RectangleShape.hpp b/include/SFML/Graphics/RectangleShape.hpp index f2151768..b3375794 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderStates.hpp b/include/SFML/Graphics/RenderStates.hpp index 08ff6324..ed6c9131 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTarget.hpp b/include/SFML/Graphics/RenderTarget.hpp index 29f411c3..58bb8c33 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTexture.hpp b/include/SFML/Graphics/RenderTexture.hpp index 7d5f612f..0931ee7b 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderWindow.hpp b/include/SFML/Graphics/RenderWindow.hpp index 969cbf12..bf32e356 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Shader.hpp b/include/SFML/Graphics/Shader.hpp index 60fb7777..9ac485a4 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Shape.hpp b/include/SFML/Graphics/Shape.hpp index 087ef94e..44893cb5 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Sprite.hpp b/include/SFML/Graphics/Sprite.hpp index 56bea3e5..9581192e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Text.hpp b/include/SFML/Graphics/Text.hpp index 25c6b462..8b1a093f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Texture.hpp b/include/SFML/Graphics/Texture.hpp index 66035b45..0fbb0f9c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Transform.hpp b/include/SFML/Graphics/Transform.hpp index e26c01cd..d46aeebb 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Transformable.hpp b/include/SFML/Graphics/Transformable.hpp index 7d653f1e..c1560e2a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Vertex.hpp b/include/SFML/Graphics/Vertex.hpp index 16d0512b..6755479e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VertexArray.hpp b/include/SFML/Graphics/VertexArray.hpp index 1cf8e7f9..1645f65f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VertexBuffer.hpp b/include/SFML/Graphics/VertexBuffer.hpp index 76dfe761..7daaf014 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/View.hpp b/include/SFML/Graphics/View.hpp index 0c1691a7..6712c944 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Main.hpp b/include/SFML/Main.hpp index 9cc93623..27e3296e 100644 --- a/include/SFML/Main.hpp +++ b/include/SFML/Main.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 fc2c626b..f3f98c30 100644 --- a/include/SFML/Network.hpp +++ b/include/SFML/Network.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 b3c52218..516a9d08 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 3cac70f9..ddc3a9c8 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Http.hpp b/include/SFML/Network/Http.hpp index 067f2f4a..61754729 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/IpAddress.hpp b/include/SFML/Network/IpAddress.hpp index 4ed5ea0d..b497b245 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Packet.hpp b/include/SFML/Network/Packet.hpp index 9728276c..db9a797e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Socket.hpp b/include/SFML/Network/Socket.hpp index d5f7319e..9ebb930b 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SocketHandle.hpp b/include/SFML/Network/SocketHandle.hpp index 1dd13095..688ea0bf 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d8e2b965..332f0724 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/TcpListener.hpp b/include/SFML/Network/TcpListener.hpp index 3cc4d2c7..d0bdad40 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/TcpSocket.hpp b/include/SFML/Network/TcpSocket.hpp index 52b84e1c..5778068a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/UdpSocket.hpp b/include/SFML/Network/UdpSocket.hpp index 01645410..14176f8e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/OpenGL.hpp b/include/SFML/OpenGL.hpp index cc48a483..45a3ac3d 100644 --- a/include/SFML/OpenGL.hpp +++ b/include/SFML/OpenGL.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/include/SFML/System.hpp index 37dff6bb..3c82226b 100644 --- a/include/SFML/System.hpp +++ b/include/SFML/System.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 6e40c001..21503477 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Err.hpp b/include/SFML/System/Err.hpp index 37bf1388..9ad1b29c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 39dfd20b..b9691eec 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 bc051c44..d46be628 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputStream.hpp b/include/SFML/System/InputStream.hpp index a4cb52ee..28022eca 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e4d33a88..8667d144 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/MemoryInputStream.hpp b/include/SFML/System/MemoryInputStream.hpp index e97df71f..15cf38d9 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Mutex.hpp b/include/SFML/System/Mutex.hpp index c7b1f9e3..34610c30 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/NativeActivity.hpp b/include/SFML/System/NativeActivity.hpp index 6f5437eb..25609b5c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1115ce2c..c5b42c8c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 aa3bc3a7..98668651 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 46a87e42..970105dc 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.inl b/include/SFML/System/String.inl index 85915d82..0f3a890b 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 16701b7b..ead09e84 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.inl b/include/SFML/System/Thread.inl index 1d40c54d..55976e86 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1eb442b5..065f29c2 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/include/SFML/System/ThreadLocalPtr.hpp index 549ffb0d..a6ecd9de 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 14e453e9..f76c77f8 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 4541afbc..1478730c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/include/SFML/System/Utf.hpp index 1452d3d5..af567531 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1fed3a00..d1ea73de 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Vector2.hpp b/include/SFML/System/Vector2.hpp index 3335944c..429e649f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Vector2.inl b/include/SFML/System/Vector2.inl index 2faee862..848395b3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 4aced322..08220c9f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.inl b/include/SFML/System/Vector3.inl index f139dcde..852c6dbb 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 da70c3ce..e3667b01 100644 --- a/include/SFML/Window.hpp +++ b/include/SFML/Window.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 b7c1cd06..68a37973 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 01590834..7ef9b9a1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ContextSettings.hpp b/include/SFML/Window/ContextSettings.hpp index 1acd60e9..d2d84385 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Cursor.hpp b/include/SFML/Window/Cursor.hpp index f13840f6..c5d90d95 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Event.hpp b/include/SFML/Window/Event.hpp index 53b37d95..2b7c8dcb 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Export.hpp b/include/SFML/Window/Export.hpp index 5b198410..11f27b36 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 3d007fc5..223707e8 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 ad61587e..dd5454c3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Keyboard.hpp b/include/SFML/Window/Keyboard.hpp index 92ea8df8..0bbcd8ab 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Mouse.hpp b/include/SFML/Window/Mouse.hpp index 7506282d..d2b7fefa 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Sensor.hpp b/include/SFML/Window/Sensor.hpp index 2bce8676..337bc7f4 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Touch.hpp b/include/SFML/Window/Touch.hpp index fa64f390..bc9f72e1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VideoMode.hpp b/include/SFML/Window/VideoMode.hpp index 24c4ec61..d95ea49a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Vulkan.hpp b/include/SFML/Window/Vulkan.hpp index cd501a12..00ee911a 100644 --- a/include/SFML/Window/Vulkan.hpp +++ b/include/SFML/Window/Vulkan.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Window.hpp b/include/SFML/Window/Window.hpp index f89fc353..bcbe8725 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowBase.hpp b/include/SFML/Window/WindowBase.hpp index b3073cbf..d1d4ff98 100644 --- a/include/SFML/Window/WindowBase.hpp +++ b/include/SFML/Window/WindowBase.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowHandle.hpp b/include/SFML/Window/WindowHandle.hpp index c05d50be..624ca737 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowStyle.hpp b/include/SFML/Window/WindowStyle.hpp index 5edf76ce..ab611d29 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/license.md b/license.md index 9f6db1a9..1ae961a7 100644 --- a/license.md +++ b/license.md @@ -1,6 +1,6 @@ # SFML -SFML - Copyright (C) 2007-2019 Laurent Gomila - laurent@sfml-dev.org +SFML - Copyright (C) 2007-2020 Laurent Gomila - laurent@sfml-dev.org This software is provided 'as-is', without 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/ALCheck.cpp b/src/SFML/Audio/ALCheck.cpp index 8514cc98..a7873a0a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ALCheck.hpp b/src/SFML/Audio/ALCheck.hpp index 963d271a..95259fb7 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/AlResource.cpp b/src/SFML/Audio/AlResource.cpp index f59d36b4..42a4945f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e4ebc4b9..b9246dfd 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Audio/AudioDevice.hpp index af940217..a8bac26e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputSoundFile.cpp b/src/SFML/Audio/InputSoundFile.cpp index 6d9da57c..cb8bed04 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Listener.cpp b/src/SFML/Audio/Listener.cpp index bbbece5e..477f0931 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 b8829d02..d711eff1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/OutputSoundFile.cpp b/src/SFML/Audio/OutputSoundFile.cpp index c6584352..ddaafcf0 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 36e65849..505e9588 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundBuffer.cpp b/src/SFML/Audio/SoundBuffer.cpp index dfd137ff..3c23920e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundBufferRecorder.cpp b/src/SFML/Audio/SoundBufferRecorder.cpp index 12694354..2d8b63c7 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 a0caf7a1..2f7ddfc2 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileReaderFlac.cpp b/src/SFML/Audio/SoundFileReaderFlac.cpp index c9a8cb97..88600e30 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileReaderFlac.hpp b/src/SFML/Audio/SoundFileReaderFlac.hpp index 23ec12db..53cf0c4f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileReaderOgg.cpp b/src/SFML/Audio/SoundFileReaderOgg.cpp index 0621cad0..5585ab38 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileReaderOgg.hpp b/src/SFML/Audio/SoundFileReaderOgg.hpp index 67b03f47..7942bec6 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e498dd55..df9dab94 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Audio/SoundFileReaderWav.hpp index f2f89479..04e3a10d 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileWriterFlac.cpp b/src/SFML/Audio/SoundFileWriterFlac.cpp index f30c2fec..ddd3c20a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileWriterFlac.hpp b/src/SFML/Audio/SoundFileWriterFlac.hpp index 7eef2e4a..d54975e9 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileWriterOgg.cpp b/src/SFML/Audio/SoundFileWriterOgg.cpp index 9791ef36..c56847e5 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundFileWriterOgg.hpp b/src/SFML/Audio/SoundFileWriterOgg.hpp index 19bb6cca..7a482d1c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 3353d236..4f82d5ef 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Audio/SoundFileWriterWav.hpp index f1b07e7e..58d16845 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundRecorder.cpp b/src/SFML/Audio/SoundRecorder.cpp index 8b0b6901..1066b452 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundSource.cpp b/src/SFML/Audio/SoundSource.cpp index f4bc4b20..7bc6b3a0 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SoundStream.cpp b/src/SFML/Audio/SoundStream.cpp index d8f5f785..b4172a2b 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/BlendMode.cpp b/src/SFML/Graphics/BlendMode.cpp index 7f0901af..7897247f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/CircleShape.cpp b/src/SFML/Graphics/CircleShape.cpp index 730353fc..8c70f626 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Color.cpp b/src/SFML/Graphics/Color.cpp index 02b8581f..b0bb6876 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ConvexShape.cpp b/src/SFML/Graphics/ConvexShape.cpp index 9346e3d9..fa5da832 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e5616ffe..76c4d2e3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Graphics/GLCheck.cpp index 5bb140c1..e908eaae 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 19ab3b1e..c1bcaea3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 60d25847..109fe3a9 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Graphics/GLExtensions.hpp index 829155fa..ec0391d4 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Glsl.cpp b/src/SFML/Graphics/Glsl.cpp index 3a1e5593..557dc9bd 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1ef43269..bb791d66 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ImageLoader.cpp b/src/SFML/Graphics/ImageLoader.cpp index 3c26e49c..d0e7ac9e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ImageLoader.hpp b/src/SFML/Graphics/ImageLoader.hpp index ce437b43..c178cb7a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RectangleShape.cpp b/src/SFML/Graphics/RectangleShape.cpp index 58777fd5..66569ba8 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 adaceb34..fff6f08e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 a9c0ecac..5b0dbd3a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTexture.cpp b/src/SFML/Graphics/RenderTexture.cpp index bd0566a0..9daad7af 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Graphics/RenderTextureImpl.cpp index 63d55f0b..e766dd9f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 5ed3733c..22b1c54e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTextureImplDefault.cpp b/src/SFML/Graphics/RenderTextureImplDefault.cpp index dabc938e..a0cac97f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTextureImplDefault.hpp b/src/SFML/Graphics/RenderTextureImplDefault.hpp index f7ab219e..97e3b299 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTextureImplFBO.cpp b/src/SFML/Graphics/RenderTextureImplFBO.cpp index c2afc8b0..45eb2a9c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderTextureImplFBO.hpp b/src/SFML/Graphics/RenderTextureImplFBO.hpp index 8cddd109..7fcf6eff 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/RenderWindow.cpp b/src/SFML/Graphics/RenderWindow.cpp index 38ec2a7c..d26a5f37 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Shader.cpp b/src/SFML/Graphics/Shader.cpp index 9d0cfba4..cbfc4d20 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Shape.cpp b/src/SFML/Graphics/Shape.cpp index d0245d5d..57670307 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Sprite.cpp b/src/SFML/Graphics/Sprite.cpp index 1fdfc5d5..f32dc486 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Text.cpp b/src/SFML/Graphics/Text.cpp index 7cb4f889..2ba7d466 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Texture.cpp b/src/SFML/Graphics/Texture.cpp index a139115d..ef731a65 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/TextureSaver.cpp b/src/SFML/Graphics/TextureSaver.cpp index 1a71c089..7ffbc0bb 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/TextureSaver.hpp b/src/SFML/Graphics/TextureSaver.hpp index 68109456..560c2fce 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Transform.cpp b/src/SFML/Graphics/Transform.cpp index 68d3e3be..9a6706ce 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 a47b2ee0..6a8f0735 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Vertex.cpp b/src/SFML/Graphics/Vertex.cpp index e389b68a..801af444 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 accf7e79..9be9d7d9 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 4d5497c8..2b3166a2 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/View.cpp b/src/SFML/Graphics/View.cpp index 4d1fb2f3..048f3136 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Main/MainAndroid.cpp b/src/SFML/Main/MainAndroid.cpp index 38fd99b8..daf6dac1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Main/MainWin32.cpp b/src/SFML/Main/MainWin32.cpp index a8aa19d4..6a382024 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 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. diff --git a/src/SFML/Main/MainiOS.mm b/src/SFML/Main/MainiOS.mm index 901248a1..534db334 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-2019 Laurent Gomila (laurent@sfml-dev.prg) +// Copyright (C) 2007-2020 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/Network/Ftp.cpp b/src/SFML/Network/Ftp.cpp index 4eb13bcb..6b5ebce8 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Http.cpp b/src/SFML/Network/Http.cpp index 251b8125..40a5167f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/IpAddress.cpp b/src/SFML/Network/IpAddress.cpp index 8cc145f6..067c7ae5 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Packet.cpp b/src/SFML/Network/Packet.cpp index 2cb85bdb..951c4bdb 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Socket.cpp b/src/SFML/Network/Socket.cpp index 7a92a473..622f9d4b 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1f6803da..c958099c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 c180736a..465e0a72 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/TcpListener.cpp b/src/SFML/Network/TcpListener.cpp index 8a79b99b..38749d56 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 7a8e9183..8333b952 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/UdpSocket.cpp b/src/SFML/Network/UdpSocket.cpp index 373b6842..3e193914 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Network/Unix/SocketImpl.cpp index e565a482..5f59171b 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 9b816baa..3de92334 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Win32/SocketImpl.cpp b/src/SFML/Network/Win32/SocketImpl.cpp index 9bff3d7a..b369e182 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Win32/SocketImpl.hpp b/src/SFML/Network/Win32/SocketImpl.hpp index 7fdfa52e..82557546 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Android/Activity.cpp b/src/SFML/System/Android/Activity.cpp index b52921aa..11dfaeb1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 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. diff --git a/src/SFML/System/Android/NativeActivity.cpp b/src/SFML/System/Android/NativeActivity.cpp index 39a2fbce..ee01eedc 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Clock.cpp b/src/SFML/System/Clock.cpp index dc3a2544..8e4aca01 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 0a593e3a..1e8a8465 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/FileInputStream.cpp b/src/SFML/System/FileInputStream.cpp index 41c91176..bab93f52 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Lock.cpp b/src/SFML/System/Lock.cpp index 0fbb404d..b4084b00 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d6334acd..6b849a97 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Mutex.cpp b/src/SFML/System/Mutex.cpp index 2f6726f3..21a86e45 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 fc036c48..3d1beca3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 c33cb948..92d8ec21 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 bd250a90..6576f104 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 812a99b7..5917cf33 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 09abf45f..b7963e7c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClockImpl.cpp b/src/SFML/System/Unix/ClockImpl.cpp index 2a70fbd7..5a6e4682 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClockImpl.hpp b/src/SFML/System/Unix/ClockImpl.hpp index 942ee9c4..c966b3e8 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 b9c46749..8c000598 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 dead79d0..83c4f42c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1da9b8db..6aabaf41 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/System/Unix/SleepImpl.hpp index 0fb634e9..57843cc1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d8d4d9ad..aaf906e1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e538514d..4906326d 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 45d08fb4..33c6889e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 db71e0b9..a1d5e713 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 603426d8..37ecc9ca 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/System/Win32/ClockImpl.hpp index cbca5c24..0af60834 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 7d562a38..3c3452ea 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1a36a6d5..2947e3b1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SleepImpl.cpp b/src/SFML/System/Win32/SleepImpl.cpp index 172a8a88..f61353e4 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SleepImpl.hpp b/src/SFML/System/Win32/SleepImpl.hpp index 37005ab7..5c356414 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 e1c84993..94bc7f8a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 f4dc9534..afdfc9f3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/System/Win32/ThreadLocalImpl.cpp index eef6106a..49d95e00 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d87db142..3a2b0238 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClipboardImpl.cpp b/src/SFML/Window/Android/ClipboardImpl.cpp index c7d3728e..ef9af6c4 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClipboardImpl.hpp b/src/SFML/Window/Android/ClipboardImpl.hpp index c243999c..22dda649 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 faf0b631..3913b295 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/Android/CursorImpl.hpp index 096902d5..57cffbd4 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SensorImpl.cpp b/src/SFML/Window/Android/SensorImpl.cpp index 9497d9d6..ed89e4d7 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/SensorImpl.hpp b/src/SFML/Window/Android/SensorImpl.hpp index ce6865ee..bdfdfcc3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Clipboard.cpp b/src/SFML/Window/Clipboard.cpp index 230789e3..78284446 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 7efd448f..d0d2c324 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Context.cpp b/src/SFML/Window/Context.cpp index 2b174aa0..76cd0c59 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Cursor.cpp b/src/SFML/Window/Cursor.cpp index 91b08686..b7be0acd 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 afb22ddb..bf507b2c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/FreeBSD/JoystickImpl.cpp b/src/SFML/Window/FreeBSD/JoystickImpl.cpp index 9e5677b6..472ae2af 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 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. diff --git a/src/SFML/Window/FreeBSD/JoystickImpl.hpp b/src/SFML/Window/FreeBSD/JoystickImpl.hpp index f16672cd..3a24df78 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 32ef89d3..00d4a200 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/GlContext.hpp index fb76a029..1f447622 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GlResource.cpp b/src/SFML/Window/GlResource.cpp index 64c7f602..538fa3bf 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 61982965..4294bdb4 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Joystick.cpp b/src/SFML/Window/Joystick.cpp index 13faa2cd..29fb4dd2 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d469ff0c..e6835526 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickManager.cpp b/src/SFML/Window/JoystickManager.cpp index 0741fdf7..12eaa590 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickManager.hpp b/src/SFML/Window/JoystickManager.hpp index 10ba6a20..7289af76 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Keyboard.cpp b/src/SFML/Window/Keyboard.cpp index d37e3f87..4cf43202 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Mouse.cpp b/src/SFML/Window/Mouse.cpp index a64bb9a7..2009413e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/AutoreleasePoolWrapper.h b/src/SFML/Window/OSX/AutoreleasePoolWrapper.h index bf3125eb..04097fe8 100644 --- a/src/SFML/Window/OSX/AutoreleasePoolWrapper.h +++ b/src/SFML/Window/OSX/AutoreleasePoolWrapper.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/AutoreleasePoolWrapper.mm b/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm index b8f5c1a4..3ec0a09f 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/ClipboardImpl.hpp b/src/SFML/Window/OSX/ClipboardImpl.hpp index a59de40d..28adae1a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 6f051b5b..5a8438c7 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/CursorImpl.hpp b/src/SFML/Window/OSX/CursorImpl.hpp index f12b94b0..f0bd1850 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 1ca93607..a3539137 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/HIDInputManager.hpp b/src/SFML/Window/OSX/HIDInputManager.hpp index 3e143c8a..e6f8c493 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/HIDInputManager.mm b/src/SFML/Window/OSX/HIDInputManager.mm index 7fd40ecb..3c44eab6 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/HIDJoystickManager.cpp b/src/SFML/Window/OSX/HIDJoystickManager.cpp index 0a7cb7c8..d1727bf0 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/HIDJoystickManager.hpp b/src/SFML/Window/OSX/HIDJoystickManager.hpp index 32e79c80..f87c7a32 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 30943407..202b2a73 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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.mm b/src/SFML/Window/OSX/InputImpl.mm index 0397237a..b3c7d11c 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/JoystickImpl.cpp b/src/SFML/Window/OSX/JoystickImpl.cpp index 333cf462..4f4ee114 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/JoystickImpl.hpp b/src/SFML/Window/OSX/JoystickImpl.hpp index cdcd741d..96304094 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 4530c136..f65363d9 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 03bd6d9e..ac0e7771 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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.h b/src/SFML/Window/OSX/SFApplication.h index b2a97531..3ee0e8fe 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 a438c7a1..311ec24b 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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.h b/src/SFML/Window/OSX/SFApplicationDelegate.h index 9f39e923..9ebbedcc 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 a6fff904..381e4126 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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.hpp b/src/SFML/Window/OSX/SFContext.hpp index 87473a58..2fedc803 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 4bd3c3eb..02ffe36d 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/SFKeyboardModifiersHelper.h b/src/SFML/Window/OSX/SFKeyboardModifiersHelper.h index ea2d5a17..b2cf0b1c 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/SFKeyboardModifiersHelper.mm b/src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm index 105e9110..fd6dfe37 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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+keyboard.mm b/src/SFML/Window/OSX/SFOpenGLView+keyboard.mm index eb3e1231..e9a6fac6 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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+keyboard_priv.h b/src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h index 8496affa..31e6a659 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 99acef0b..b812dd2f 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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_priv.h b/src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h index fb64368a..05eba4df 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 b2a66896..641eab28 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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.mm b/src/SFML/Window/OSX/SFOpenGLView.mm index 85d5cd8d..b6eb0d2f 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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.h b/src/SFML/Window/OSX/SFSilentResponder.h index de0471c7..da94d129 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 55c0fb84..8aa63ab1 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 f0e59f47..cc5108a9 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 c8266be0..8d5cb34a 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/SFWindow.h b/src/SFML/Window/OSX/SFWindow.h index 9e9a9e38..58875a6e 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/SFWindow.m b/src/SFML/Window/OSX/SFWindow.m index 77bc637f..ae348dce 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/SFWindowController.h b/src/SFML/Window/OSX/SFWindowController.h index 62e346a4..cba2b304 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/SFWindowController.mm b/src/SFML/Window/OSX/SFWindowController.mm index 190af4df..bc368c73 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/Scaling.h b/src/SFML/Window/OSX/Scaling.h index a71f62d9..f44c77e0 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/SensorImpl.cpp b/src/SFML/Window/OSX/SensorImpl.cpp index a0c83977..e91d5cdf 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 3da61189..c7555279 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 4370926e..741c4bd2 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/WindowImplCocoa.hpp b/src/SFML/Window/OSX/WindowImplCocoa.hpp index 0035fe94..efa0f667 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/WindowImplCocoa.mm b/src/SFML/Window/OSX/WindowImplCocoa.mm index eaa67bfe..e68f42e6 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/WindowImplDelegateProtocol.h b/src/SFML/Window/OSX/WindowImplDelegateProtocol.h index 29d8410c..925c9e51 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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.hpp b/src/SFML/Window/OSX/cg_sf_conversion.hpp index 099e0c5a..41c3835c 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 dfc8f394..06d0fe51 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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.h b/src/SFML/Window/OSX/cpp_objc_conversion.h index 572829f6..9ecd9df0 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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 d3534069..d9422701 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-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/Sensor.cpp b/src/SFML/Window/Sensor.cpp index 3caf78fc..316b8d5f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 bc42532a..cd50911a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Window/SensorManager.cpp index 1c14e0e7..73304bee 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 85c433a7..41b31729 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Touch.cpp b/src/SFML/Window/Touch.cpp index bac6a93e..67c60da1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClipboardImpl.cpp b/src/SFML/Window/Unix/ClipboardImpl.cpp index a01ca932..32ea47e8 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ClipboardImpl.hpp b/src/SFML/Window/Unix/ClipboardImpl.hpp index ab9e1548..a61593bc 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 2b566b7f..d088e482 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/Unix/CursorImpl.hpp index 6740f220..ca39b782 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Display.cpp b/src/SFML/Window/Unix/Display.cpp index f9157e97..3ebbf365 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Display.hpp b/src/SFML/Window/Unix/Display.hpp index c8a6687c..3a7c4035 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GlxContext.cpp b/src/SFML/Window/Unix/GlxContext.cpp index 0cc1b953..d6525eb5 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/GlxContext.hpp b/src/SFML/Window/Unix/GlxContext.hpp index d8a80a0e..f5e4b879 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.cpp b/src/SFML/Window/Unix/InputImpl.cpp index 3818805e..3f3b6d72 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.hpp b/src/SFML/Window/Unix/InputImpl.hpp index 741a92e5..99d1c718 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickImpl.cpp b/src/SFML/Window/Unix/JoystickImpl.cpp index a6fe1afc..483a0545 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickImpl.hpp b/src/SFML/Window/Unix/JoystickImpl.hpp index 946b9fd3..7f905271 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Window/Unix/SensorImpl.cpp index a0c83977..e91d5cdf 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 67a9277b..4ef84573 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 9107e9c5..6cc04657 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VulkanImplX11.cpp b/src/SFML/Window/Unix/VulkanImplX11.cpp index 5b57e298..1ec6e341 100644 --- a/src/SFML/Window/Unix/VulkanImplX11.cpp +++ b/src/SFML/Window/Unix/VulkanImplX11.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VulkanImplX11.hpp b/src/SFML/Window/Unix/VulkanImplX11.hpp index 1c86c76d..ded47e92 100644 --- a/src/SFML/Window/Unix/VulkanImplX11.hpp +++ b/src/SFML/Window/Unix/VulkanImplX11.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index 1b2e78b9..726eef4f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImplX11.hpp b/src/SFML/Window/Unix/WindowImplX11.hpp index 2a107ab7..0237dd36 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VideoMode.cpp b/src/SFML/Window/VideoMode.cpp index d1f9e46e..a8ca72cc 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d5dbed2a..3be196d6 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 index f7b2be15..1a13beeb 100644 --- a/src/SFML/Window/Vulkan.cpp +++ b/src/SFML/Window/Vulkan.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Window/Win32/ClipboardImpl.cpp index 17c02f13..8b88e1f3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 6d627509..43b1202a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 9d275b7a..cfe36f59 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/Win32/CursorImpl.hpp index 18dd3952..945a2680 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.cpp b/src/SFML/Window/Win32/InputImpl.cpp index 5f4e993c..4ad03682 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.hpp b/src/SFML/Window/Win32/InputImpl.hpp index 87e21209..483062a0 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickImpl.cpp b/src/SFML/Window/Win32/JoystickImpl.cpp index 9f8339d5..49f85da3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/JoystickImpl.hpp b/src/SFML/Window/Win32/JoystickImpl.hpp index ffff8c33..0ed1d819 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.cpp b/src/SFML/Window/Win32/SensorImpl.cpp index a0c83977..e91d5cdf 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1c50fa63..91265745 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 1f77be3f..3e305d01 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VulkanImplWin32.cpp b/src/SFML/Window/Win32/VulkanImplWin32.cpp index 6b68e9d2..a843b0b3 100644 --- a/src/SFML/Window/Win32/VulkanImplWin32.cpp +++ b/src/SFML/Window/Win32/VulkanImplWin32.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VulkanImplWin32.hpp b/src/SFML/Window/Win32/VulkanImplWin32.hpp index 11bf9a37..f3de5e66 100644 --- a/src/SFML/Window/Win32/VulkanImplWin32.hpp +++ b/src/SFML/Window/Win32/VulkanImplWin32.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WglContext.cpp b/src/SFML/Window/Win32/WglContext.cpp index 6252be02..62ca37fe 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WglContext.hpp b/src/SFML/Window/Win32/WglContext.hpp index 47fb9328..184e06df 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index e9d1c18b..ed56f026 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImplWin32.hpp b/src/SFML/Window/Win32/WindowImplWin32.hpp index ba2f662d..c58d77d7 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/Window.cpp b/src/SFML/Window/Window.cpp index 2ece6701..415b136c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowBase.cpp b/src/SFML/Window/WindowBase.cpp index cfb6446e..5c18eefe 100644 --- a/src/SFML/Window/WindowBase.cpp +++ b/src/SFML/Window/WindowBase.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImpl.cpp b/src/SFML/Window/WindowImpl.cpp index cb5d026b..afbfddf8 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/WindowImpl.hpp b/src/SFML/Window/WindowImpl.hpp index abcf8ba6..f8d079c0 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/ClipboardImpl.hpp index 2e26069d..ff555ac5 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d241b508..48d95df5 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 d83fb64a..8a511a6c 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/CursorImpl.hpp index f64191dd..c7cb02dd 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 cef0c2ef..9c01c909 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.mm b/src/SFML/Window/iOS/EaglContext.mm index 4d4da2d0..71514248 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.hpp b/src/SFML/Window/iOS/InputImpl.hpp index 6bde166a..c17c40b3 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/InputImpl.mm b/src/SFML/Window/iOS/InputImpl.mm index 6d14f313..c254eb3f 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/JoystickImpl.hpp index f09429a9..78047162 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 dea4b043..6f4ab141 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/ObjCType.hpp b/src/SFML/Window/iOS/ObjCType.hpp index 736b3ab9..5d90ed78 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 da8e059c..d651d0c8 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 a57b7aa4..4618199a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/SFMain.hpp index dbb8e6a5..815c3ccd 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 4a3aec30..f51cdac4 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 470760c6..ef11530a 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 a832f933..1cb06061 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/SFViewController.hpp index a2ff188d..3db3ea29 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 79451258..2a00cd42 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 14f3fca2..8bd1bd60 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 9c6f2ea2..60d65b33 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/VideoModeImpl.mm b/src/SFML/Window/iOS/VideoModeImpl.mm index 8f9dce0b..2887a42e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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.hpp b/src/SFML/Window/iOS/WindowImplUIKit.hpp index 9b340f64..c590c7c1 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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 7caeb063..d53ac89e 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-2019 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without 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/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp index f6b2550d..e3c15e69 100644 --- a/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp +++ b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm index d16426a4..f4be3508 100644 --- a/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm +++ b/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2020 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/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in index f7cc802c..51858431 100644 --- a/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in +++ b/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2020 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/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist index 66b623c3..96e09a64 100644 --- a/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2020 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/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist index 3d5e163f..ceb02973 100644 --- a/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML Bundle.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2020 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/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist index 466bfffb..d0aedfac 100644 --- a/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML CLT.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2020 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/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in b/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in index 2bd30082..24f278b8 100644 --- a/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in +++ b/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2020 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/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist b/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist index a71b8fc8..0c7b6cde 100644 --- a/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist +++ b/tools/xcode/templates/SFML/SFML Linker.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ <!-- SFML - Simple and Fast Multimedia Library -Copyright (C) 2007-2019 Marco Antognini (antognini.marco@gmail.com), +Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), Laurent Gomila (laurent@sfml-dev.org) This software is provided 'as-is', without any express or implied warranty. From fc573bc5841c3fb1fd44013d572ceaf39439f74a Mon Sep 17 00:00:00 2001 From: Corentin Schreiber <cschreib@orange.fr> Date: Thu, 20 Aug 2020 21:19:59 +0100 Subject: [PATCH 200/211] Added Xcursor to linux dependencies --- .travis.yml | 1 + src/SFML/Window/CMakeLists.txt | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d6d646b..953ae090 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ addons: apt_packages: - cmake - libxrandr-dev + - libxcursor-dev - libudev-dev - libopenal-dev - libflac-dev diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index bd9571b4..f564d3aa 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -244,8 +244,8 @@ target_include_directories(sfml-window PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/he # 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) + 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 Xcursor) endif() # CMake 3.11 and later prefer to choose GLVND, but we choose legacy OpenGL for backward compability From 54ac286a672658bd93d82be335eb8f3e160f47c9 Mon Sep 17 00:00:00 2001 From: Corentin Schreiber <cschreib@orange.fr> Date: Thu, 20 Aug 2020 21:20:28 +0100 Subject: [PATCH 201/211] Added support for colored cursors in Unix implementation --- src/SFML/Window/Unix/CursorImpl.cpp | 47 +++++++++++++++++++++++++++++ src/SFML/Window/Unix/CursorImpl.hpp | 22 ++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/src/SFML/Window/Unix/CursorImpl.cpp b/src/SFML/Window/Unix/CursorImpl.cpp index d088e482..0a3f1a39 100644 --- a/src/SFML/Window/Unix/CursorImpl.cpp +++ b/src/SFML/Window/Unix/CursorImpl.cpp @@ -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,6 +62,45 @@ 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(size.x, size.y); + cursorImage->xhot = hotspot.x; + cursorImage->yhot = hotspot.y; + + const std::size_t numPixels = size.x * size.y; + for (std::size_t i = 0; i < numPixels; ++i) + { + cursorImage->pixels[i] = pixels[4*i+2] + (pixels[4*i+1] << 8) + (pixels[4*i+0] << 16) + (pixels[4*i+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. @@ -139,6 +179,13 @@ bool CursorImpl::loadFromSystem(Cursor::Type type) } +//////////////////////////////////////////////////////////// +bool CursorImpl::isColorCursorSupported() +{ + return XcursorSupportsARGB(m_display); +} + + //////////////////////////////////////////////////////////// void CursorImpl::release() { diff --git a/src/SFML/Window/Unix/CursorImpl.hpp b/src/SFML/Window/Unix/CursorImpl.hpp index ca39b782..cfd3c305 100644 --- a/src/SFML/Window/Unix/CursorImpl.hpp +++ b/src/SFML/Window/Unix/CursorImpl.hpp @@ -83,6 +83,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. /// From aaf8ef1c89ecda2052630b1b3c71b215cf4de6dc Mon Sep 17 00:00:00 2001 From: Corentin Schreiber <cschreib@orange.fr> Date: Thu, 20 Aug 2020 21:43:13 +0100 Subject: [PATCH 202/211] Updated Cursor documentation for colored cursors on Unix --- include/SFML/Window/Cursor.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/SFML/Window/Cursor.hpp b/include/SFML/Window/Cursor.hpp index c5d90d95..ea29c504 100644 --- a/include/SFML/Window/Cursor.hpp +++ b/include/SFML/Window/Cursor.hpp @@ -129,7 +129,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. From 603bc9ee413a707e5c7ab6ebe8eaa4220fe4eca2 Mon Sep 17 00:00:00 2001 From: Corentin Schreiber <cschreib@orange.fr> Date: Fri, 21 Aug 2020 09:22:59 +0100 Subject: [PATCH 203/211] Changed code formatting to follow SFML guidelines --- src/SFML/Window/Unix/CursorImpl.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/SFML/Window/Unix/CursorImpl.cpp b/src/SFML/Window/Unix/CursorImpl.cpp index 0a3f1a39..42f77e46 100644 --- a/src/SFML/Window/Unix/CursorImpl.cpp +++ b/src/SFML/Window/Unix/CursorImpl.cpp @@ -63,13 +63,9 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot release(); if (isColorCursorSupported()) - { return loadFromPixelsARGB(pixels, size, hotspot); - } else - { return loadFromPixelsMonochrome(pixels, size, hotspot); - } } @@ -82,9 +78,12 @@ bool CursorImpl::loadFromPixelsARGB(const Uint8* pixels, Vector2u size, Vector2u cursorImage->yhot = hotspot.y; const std::size_t numPixels = size.x * size.y; - for (std::size_t i = 0; i < numPixels; ++i) + for (std::size_t pixelIndex = 0; pixelIndex < numPixels; ++pixelIndex) { - cursorImage->pixels[i] = pixels[4*i+2] + (pixels[4*i+1] << 8) + (pixels[4*i+0] << 16) + (pixels[4*i+3] << 24); + cursorImage->pixels[pixelIndex] = pixels[pixelIndex * 4 + 2] + + (pixels[pixelIndex * 4 + 1] << 8) + + (pixels[pixelIndex * 4 + 0] << 16) + + (pixels[pixelIndex * 4 + 3] << 24); } // Create the cursor. From d93cd6dd307a7e9014dcb18ef16cdecac6a1c81a Mon Sep 17 00:00:00 2001 From: Corentin Schreiber <cschreib@orange.fr> Date: Fri, 21 Aug 2020 09:57:59 +0100 Subject: [PATCH 204/211] Fixed Unix monochrome cursor implementation with non-power-of-two images --- src/SFML/Window/Unix/CursorImpl.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/SFML/Window/Unix/CursorImpl.cpp b/src/SFML/Window/Unix/CursorImpl.cpp index 42f77e46..fe28917a 100644 --- a/src/SFML/Window/Unix/CursorImpl.cpp +++ b/src/SFML/Window/Unix/CursorImpl.cpp @@ -101,6 +101,9 @@ bool CursorImpl::loadFromPixelsARGB(const Uint8* pixels, Vector2u size, Vector2u bool CursorImpl::loadFromPixelsMonochrome(const Uint8* pixels, Vector2u size, Vector2u hotspot) { // Convert the image into a bitmap (monochrome!). + // 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 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. @@ -110,8 +113,9 @@ bool CursorImpl::loadFromPixelsMonochrome(const Uint8* pixels, Vector2u size, Ve 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 bitIndex = i % 8; + std::size_t pixelIndexMask = i + j * (size.x + 7); + std::size_t byteIndex = pixelIndexMask / 8; + std::size_t bitIndex = pixelIndexMask % 8; // Turn on pixel that are not transparent Uint8 opacity = pixels[pixelIndex * 4 + 3] > 0 ? 1 : 0; From 9cb67520c7cefabff2e1f138c1bae39bd0564efe Mon Sep 17 00:00:00 2001 From: Corentin Schreiber <cschreib@orange.fr> Date: Fri, 21 Aug 2020 09:58:20 +0100 Subject: [PATCH 205/211] Fixed black/white threshold computation for Unix monochrome cursors --- src/SFML/Window/Unix/CursorImpl.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SFML/Window/Unix/CursorImpl.cpp b/src/SFML/Window/Unix/CursorImpl.cpp index fe28917a..0fc1e20e 100644 --- a/src/SFML/Window/Unix/CursorImpl.cpp +++ b/src/SFML/Window/Unix/CursorImpl.cpp @@ -123,9 +123,9 @@ bool CursorImpl::loadFromPixelsMonochrome(const Uint8* pixels, Vector2u size, Ve // 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; + // 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] |= bit << bitIndex; } } From a2fde6511384372e2fda335a343bd7a032bddee2 Mon Sep 17 00:00:00 2001 From: Corentin Schreiber <cschreib@orange.fr> Date: Fri, 21 Aug 2020 19:43:45 +0100 Subject: [PATCH 206/211] Simplified and clarified code for monochrome bit/byte computations --- src/SFML/Window/Unix/CursorImpl.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/SFML/Window/Unix/CursorImpl.cpp b/src/SFML/Window/Unix/CursorImpl.cpp index 0fc1e20e..5678c449 100644 --- a/src/SFML/Window/Unix/CursorImpl.cpp +++ b/src/SFML/Window/Unix/CursorImpl.cpp @@ -104,18 +104,18 @@ bool CursorImpl::loadFromPixelsMonochrome(const Uint8* pixels, Vector2u size, Ve // 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 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. + 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, 1); // 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 pixelIndexMask = i + j * (size.x + 7); - std::size_t byteIndex = pixelIndexMask / 8; - std::size_t bitIndex = pixelIndexMask % 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; From 77145c130fde8144c6184e354751f06b83adade3 Mon Sep 17 00:00:00 2001 From: Corentin Schreiber <cschreib@orange.fr> Date: Fri, 21 Aug 2020 19:44:24 +0100 Subject: [PATCH 207/211] Fixed bug of spurious vertical white lines with monochrome cursor --- src/SFML/Window/Unix/CursorImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Window/Unix/CursorImpl.cpp b/src/SFML/Window/Unix/CursorImpl.cpp index 5678c449..4aabffa0 100644 --- a/src/SFML/Window/Unix/CursorImpl.cpp +++ b/src/SFML/Window/Unix/CursorImpl.cpp @@ -107,7 +107,7 @@ bool CursorImpl::loadFromPixelsMonochrome(const Uint8* pixels, Vector2u size, Ve 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, 1); // Defines which pixel is white (1) or black (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) { From 0d82b99c7de0fab6313c92f12713929872149cdd Mon Sep 17 00:00:00 2001 From: Corentin Schreiber <cschreib@orange.fr> Date: Thu, 27 Aug 2020 08:12:18 +0100 Subject: [PATCH 208/211] Added missing dependency on Xcursor in SFMLConfigDependencies.cmake.in --- cmake/SFMLConfigDependencies.cmake.in | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/SFMLConfigDependencies.cmake.in b/cmake/SFMLConfigDependencies.cmake.in index 459577cb..c5813bd6 100644 --- a/cmake/SFMLConfigDependencies.cmake.in +++ b/cmake/SFMLConfigDependencies.cmake.in @@ -47,6 +47,7 @@ if(SFML_STATIC_LIBRARIES) if(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) From a96057866db0b5544a9e0e9f534c22884985abe9 Mon Sep 17 00:00:00 2001 From: Corentin Schreiber <cschreib@orange.fr> Date: Fri, 28 Aug 2020 08:27:20 +0100 Subject: [PATCH 209/211] Removed explicit link to Xcursor and rely on X11 interface target Co-authored-by: binary1248 <binary1248@hotmail.com> --- src/SFML/Window/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index f564d3aa..982f4c40 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -245,7 +245,7 @@ target_include_directories(sfml-window PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/he # 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" "X11_Xcursor_LIB") - target_link_libraries(sfml-window PRIVATE X11 Xcursor) + target_link_libraries(sfml-window PRIVATE X11) endif() # CMake 3.11 and later prefer to choose GLVND, but we choose legacy OpenGL for backward compability From 59df9d0d887f11724679f2c99dec0f05d6caeaf4 Mon Sep 17 00:00:00 2001 From: Jonny Paton <jonathan.r.paton@googlemail.com> Date: Sat, 19 Sep 2020 21:48:14 +0100 Subject: [PATCH 210/211] Implement smoothing for fonts --- include/SFML/Graphics/Font.hpp | 27 +++++++++++++++++++++++++++ src/SFML/Graphics/Font.cpp | 27 +++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/include/SFML/Graphics/Font.hpp b/include/SFML/Graphics/Font.hpp index 11ed5d87..b8e5d925 100644 --- a/include/SFML/Graphics/Font.hpp +++ b/include/SFML/Graphics/Font.hpp @@ -275,6 +275,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 /// @@ -373,6 +399,7 @@ private: 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 diff --git a/src/SFML/Graphics/Font.cpp b/src/SFML/Graphics/Font.cpp index 76c4d2e3..ddc9d361 100644 --- a/src/SFML/Graphics/Font.cpp +++ b/src/SFML/Graphics/Font.cpp @@ -88,6 +88,7 @@ m_face (NULL), m_streamRec(NULL), m_stroker (NULL), m_refCount (NULL), +m_isSmooth (true), m_info () { #ifdef SFML_SYSTEM_ANDROID @@ -105,7 +106,8 @@ m_stroker (copy.m_stroker), m_refCount (copy.m_refCount), m_info (copy.m_info), m_pages (copy.m_pages), -m_pixelBuffer(copy.m_pixelBuffer) +m_pixelBuffer(copy.m_pixelBuffer), +m_isSmooth (copy.m_isSmooth) { #ifdef SFML_SYSTEM_ANDROID m_stream = NULL; @@ -468,6 +470,26 @@ const Texture& Font::getTexture(unsigned int characterSize) const return m_pages[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; +} + //////////////////////////////////////////////////////////// Font& Font::operator =(const Font& right) @@ -482,6 +504,7 @@ Font& Font::operator =(const Font& right) std::swap(m_info, temp.m_info); std::swap(m_pages, temp.m_pages); std::swap(m_pixelBuffer, temp.m_pixelBuffer); + std::swap(m_isSmooth, temp.m_isSmooth); #ifdef SFML_SYSTEM_ANDROID std::swap(m_stream, temp.m_stream); @@ -734,7 +757,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); } From c10c458169128e001ff886a18b3963894fb5052f Mon Sep 17 00:00:00 2001 From: MrZeusTheCoder <github.mrzeusthecoder@gmail.com> Date: Fri, 6 Nov 2020 15:09:46 -0500 Subject: [PATCH 211/211] Add Github Actions. --- .github/workflows/ci.yml | 55 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..cd0ee3d0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,55 @@ +name: CI + +on: [push, pull_request] + +jobs: + build: + name: ${{ matrix.platform.name }} ${{ matrix.config.name }} + runs-on: ${{ matrix.platform.os }} + + strategy: + matrix: + platform: + - { name: Windows VS2017, os: windows-2016 } + - { name: Windows VS2019, os: windows-latest } + - { name: Linux GCC, os: ubuntu-latest } + - { name: Linux Clang, os: ubuntu-latest, flags: -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ } + - { name: MacOS XCode, os: macos-latest } + config: + - { name: Shared, flags: -DBUILD_SHARED_LIBS=TRUE } + - { name: Static, flags: -DBUILD_SHARED_LIBS=FALSE } + + include: + - platform: { name: MacOS XCode, os: macos-latest } + config: { name: Frameworks, flags: -DSFML_BUILD_FRAMEWORKS=TRUE } + - platform: { name: MacOS XCode, os: macos-latest } + config: { name: iOS, flags: -DCMAKE_TOOLCHAIN_FILE=$GITHUB_WORKSPACE/cmake/toolchains/iOS.toolchain.cmake -DIOS_PLATFORM=SIMULATOR } + - platform: { name: Android, os: ubuntu-latest } + 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-latest } + 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 } + steps: + - name: Checkout Code + uses: actions/checkout@v2 + + - name: Install Linux Dependencies + if: runner.os == 'Linux' + run: sudo apt-get install libxrandr-dev libxcursor-dev libudev-dev libopenal-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-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 ${{matrix.platform.flags}} ${{matrix.config.flags}} + + - name: Build + shell: bash + run: cmake --build $GITHUB_WORKSPACE/build --config Release --target install